LINUX.ORG.RU

Разобрался и чуть доработал скрипт прошивки HDMI EDID

 , , ,


2

1

Краткое содержание: допилил и форкнул утилиту прошивки edid в edid-checked-writer чтоб прошить сквозной HDMI-эмулятор монитора.

Предистория: имеется 1440p монитор Samsung S27A850D, в котором есть DP и DVI-dual-link. Но нет HDMI (видимо к моменту выхода монитора HDMI не умел в 1440p).

Хотелка: чтоб был способ его по-простому подключить к любому hdmi-источнику и работал бы в 1440p.

Изначально был взят просто пассивный провод-переходник HDMI->DVI-single-link, но с ним не достигалось нужное разрешение, так как монитор в своём EDID не выдавал совместимости с HDMI, в результате чего источник сигнала понимал что используется переходник и не выдаёт битрейта HDMI для 1440p. Однако по предварительным тестам с этим переходником + программным подсовыванием EDID от HDMI-1440p-монитора https://github.com/linuxhw/EDID/blob/master/Digital/Samsung/SAM0E0C/38CD24A55A35 стало ясно что сам монитор более высокий битрейт поддерживает. Оставалось только научить его выдавать этот EDID по кабелю.

Была взята утилита edid-rw, сделал бэкап существующего EDID, дал команду на запись нового - утилита молча вышла с кодом 0 ничего не написав. Оказалось что, во-первых, утилита не проверяет успешность записи, а во-вторых что EEPROM внутри монитора в режиме только чтения (а физически находится под большой впаянной пластиной, когда-то разбирал его ранее).

Поэтому вместо выпаивания и прошивки был выбран более простой и повторяемый путь. Куплен «адаптер HDMI для KVM» - отличается от обычного эмулятора монитора тем, что имеет и выход на который идёт сквозное прохождение сигнала. Маленький металлический с надписями Source и Sink. Добавлен на конец провода-переходника, и внутри этого адаптера оказался уже вполне прошиваемый EEPROM, который всегда представляется источнику сигнала вместо того что передаёт моник.

По этому поводу доработал прошивальщик EDID проверкой на успешность записи и внятным отображением этого резульатата, потестил в разных сценариях и выложил форк на который ссылка вначале. Автор оригинального скрипта edid-rw ещё 4 года назад написал что «не заинтересован в развитии, форкайте если хотите»

Теперь окирпичить монитор из-под линукса стало чуть-чуть удобнее! (или можно случайно окирпичить оперативку, если указать при прошивке не ту шину и прошить EEPROM памяти; я добавил одну проверку призванную это предотвратить, но она ненадёжная; в оригинале вообще не было)

★★

Изначально был взят просто пассивный провод-переходник HDMI->DVI-single-link

Вот жеж. Как раз 2 недели назад мучался с такой проблемой. Нашёл в продаже даже переходник HDMI -> DVI-dual-link, но всё равно после подключения видел 1280x800 вместо 2k.

Dimez ★★★★★
()
Ответ на: комментарий от u5er

А там флешка с edid’ом матрицы соединена по i2c прямо с разъёмом кабеля напрямую или через контроллер в мониторе?

В большинстве относительно простых мониторов - EEPROM-флешка просто на i2c-линиях разъёма кабеля. Технически её можно перепаять или даже просто убрать ей резистор на пине WriteProtect, но я имел опыт разбора своего моника и знаю что до неё добраться неожиданно сложно.

К слову помимо флешки на адресе 0x50 на этой линии со стороны монитора могут быть ещё устройства, для какого-то продвинутого фуункционала, деталей к сожалению не знаю. Список устройств в мониторе на шине i2c можно увидеть через сканирование командой вида i2cdetect -y X где X - номер i2с-шины вида i2c-X. На старом самсунге - у меня 0x37, 0x3a, 0x3b, 0x39, 0x59. Возможно что сама флешка отвечает по нескольким из этих адресов, потому что в адаптере где кроме флешки на линии ничего нет - при скане обнаруживается ещё адрес 0x58.

То есть обычно компьютер-источник сигнала ничего не знает о том, есть ли вообще в мониторе контроллер и смог ли контроллер декодировать TDMS-сигнал, так как никакой обратной связи от контроллера нет.

А на сложных мониторах наблюдаю эффект что отдаваемый EDID меняется в зависимости от состояния/настроек монитора. Типа вначале один EDID, а потом, после того как на вопрос в меню монитора «что за источник HDMI-сигнала» - ответить «ПК» - EDID меняется на чуть-чуть другой. Тут контроллер явно тем или иным образом участвует, то есть и такое бывает. Дополнительные активные адреса на шине при этом тоже есть, на «умном» самсунге - 0x30, 0x3a, 0x54.

GPFault ★★
() автор топика
Ответ на: комментарий от t184256

Я брал самый дешёвый, с надписями Source и Sink Вот такой а брал на али

В описании товара написано что он «запомниает EDID подключенного через него монитора», но это к счастью враньё, иначе б нельзя было его прошить по своему желанию. Там просто флешка, к i2c-линии в сторону монитора никакого подключения вообще нет.

Но всплыл и другой нюанс - я ради интереса протестил пройдёт ли через проходник 4k@60 - и получил отрицательный результат. Записал в переходник EDID того монитора, который к ему подключаю, казалось бы всё должно быть идентично… В результате 4k@30 работает, 2560x1440@60 работает, а на 4k@60 монитор сигнализирует что не может распознать сигнал. Примсомтрелся - а в переходнике у разных диф.пар проводников разная длина. Кажется это плохая идея для выскочастотного сигнала)

Но для задач патчинга Dual-link DVI - подходит нормально, так как там как раз макимальный битрейт как у 2560x1600@60

GPFault ★★
() автор топика
Последнее исправление: GPFault (всего исправлений: 1)
Ответ на: комментарий от Dimez

Вообще такой хак прокатит только в том случае, если монитор готов воспринять сигнал на частоте нужной для hdmi 2560x1440@60, чего он вовсе не обязан делать, если на нём с завода HDMI нет)

На моём прокатило, но не факт что на всех так.

Но! симптомы того что видеокарта действительно попыталась, а монитор не cмог - будут «нет изображения», а не «выбралось меньшее разрешение». Потому что насколько я понимаю от подавляющего большинства мониторов НЕТ обратной связи к компу что контроллер не смог распарсить TDMS-сигнал (на каких-то может быть в виде эмуляции отключения пина hotplug, но это крайняя редкость).

Команды-примеры на странице документации как раз содержат ссылку на тот EDID, с которым у меня получилось

К слову, какой монитор? Мне вцелом интересно знать на каких 2k-моделях ситуация «есть Dual-link DVI, но нет hdmi» актуальна.

GPFault ★★
() автор топика

А ведь мог бы взять простой переходник DVI на HDMI и воткнуть HDMI провод нормальный. И вообще возня с EDID нужна лишь под вейланд, так как xrandr нормально все делает и вручную пытается выставить разрешение и выше 60 герц если монитор его держит. Вот такого переходника должно было хватить.

https://www.ozon.ru/product/hdmi-dvi-perehodnik-perehodnik-adapter-hdmi-f-dvi-d-m-dual-link-dvi-974649567/

anonymous
()
Ответ на: комментарий от Dimez

А ты EDID менял или просто тестил разные кабели-переходники?
Ведь на Xorg можно в настройках вместо чтения EDID по i2с из монитора (или переходника в вашем случае) выставить чтение EDID из указанного файла.
Например, https://www.altlinux.org/EDID

sigurd ★★★★★
()
Последнее исправление: sigurd (всего исправлений: 2)
Ответ на: комментарий от sigurd

А ты EDID менял или просто тестил разные кабели-переходники?

Второе.

выставить чтение EDID из указанного файла

Там винда, неохота было софтовые костыли делать.

Dimez ★★★★★
()
Ответ на: комментарий от GPFault

в сторону монитора никакого подключения вообще нет.

А в отзывах этого товара https://aliexpress.ru/item/1005003156723457.html (Roman P. 16 июля 2022) написано, что там по флешке в каждую сторону. Получается, они в одно корпусе разные могут быть.

Примсомтрелся

Как переходник разбирали, без нагрева?

mky ★★★★★
()
Ответ на: комментарий от mky

Вот папка с фотками того что у меня внутри: https://github.com/galkinvv/edid-checked-writer/tree/doc/source-sink-2024-06

Нагрев чтоб сдвинуть внешний металлический корпус, дальше там резина - её аккуратно срезал, и осталось что что на фото. Подключать другой стороной не пробовал, на вид ничего нет, то попробую, интересная идея, вдруг что прям в разъёме там.

Ещё вариант что в другую сторону писавший отзыв словил какой-то фиктивный EDID по умолчанию от драйвера/винды (предплагаю что он тестил на винде)

GPFault ★★
() автор топика
Ответ на: комментарий от GPFault

Ну там отзыв 2022 года, за 2 года не одно поколение али-устройств может смениться. Надо будет свой переходник разобрать, посмотреть, что я купил...

mky ★★★★★
()
Ответ на: комментарий от mky

Попробовал свой переходник в другую сторону - Sink в сторону компа, а Source в сторону монитора. Сторона Sink ничего по i2c не отвечает (было ожидаемо, но перепроверил).

Из неожиданного при такой коммутации монитор писал что источник hdmi не подключен, хотя в норме такой надписи нет даже при полностью выключенном компьютере.

Причина в том, что в сторону Source у переходника нет контакта 17 DDC_Ground на общую землю. А монитор - по крайней мере тот с которым я проводил эксперимент - детектирует наличие источника по этому соеднению (без соединения на линии DDC_Ground со стороны монитора идёт слабая подтяжка к 5V).

В сторону Sink такая подтяжка контакта 17 к общей земле есть, иначе бы переходник не работал.

GPFault ★★
() автор топика
Ответ на: комментарий от GPFault

Кое как разобрал свой переходник, в последний момент потянул за плату и плата вышла с контактами, а корпус HDMI-папа остался с резиной в корпусе переходника, но, как-то всё собрал припаял обратно. Плата такая же, как у вас, получается, сейчас они там все такие, односторонние.

детектирует наличие источника по этому соеднению

Да, про такое гуглится, но как-то это на хак похоже. Вроде, как, линия 19 (Hot Plug Detect Signal) для этого предназначена. И в сторону Source переходник подятгивает её через 1к к +5, а в сторону Sink HPD висит в воздухе. Получается, этот переходник дважды односторонний :) Если воткнуть в обратном направлении, то и HPD в сторону видеокарты будет в воздухе и DDC Ground в сторону монитора будет в воздухе.

mky ★★★★★
()
Ответ на: комментарий от mky

HPD используется только для детектирования источником наличия получателя, но не в другую сторону. Получатель должен притянуть её к 5V. Со стороны источника при этом есть более слабая (на пракике 100КОм) подтяжка к GND. Она по сути просто предотвращает неопределнённость уровня при отсутствии получателя сигнала. При подключении получателя - он однозначно «перетягивает» уровень линии к 5V; таким образом сам получатель не сможет понять по HPD, подключен источник или нет, поскольку сам и задал уровень.

В теории монитор-получатель мог бы отслеживать 18-ю линию - источник 5V, но это работает только при включенном источнике. Вот и использует монитор другой хак-метод с линией 17.

GPFault ★★
() автор топика
Ответ на: комментарий от GPFault

Ну 100кОм вполне можно отследить, хотя, конечно, лучше 20кОм. :)

Просмотрел ещё раз стандарт, да, там нет ни номинала этого pull-down резистора (хотя советуют его ставить), ни процедуры определения Sink'ом, что он подключен к Source. То есть, с одной стороны HDMI не позволяет монитору определить отключение/подклюние к компу, а с другой стороны есть ENERGY STAR Program Requirements for Displays:

Monitors shall automatically enter Sleep Mode or Off Mode within 5 minutes of being disconnected from a host computer.

Вот разработчики мониторов и выкручиваются простыми хаками. Хотя:

В теории монитор-получатель мог бы отслеживать 18-ю линию - источник 5V

А когда там нет 5В как-то измерять сопротивление между SCL (контакт 15) и 5V, там со стороны видеокарты стандарт требует 1,5кОм. Можно каким-нибудь крошечным напряжением, типа 0,4В отслеживать... Но схема сложнее получается.

mky ★★★★★
()