Оптический удлинитель HDMI. 300 метров
Доброго времени суток, Хабр!
Разработка волоконно-оптического HDMI удлинителя на 300 метров. Отказ от обратного канала (передача данных по одному волоконно-оптическому кабелю). Клонирование EDID с монитора.
Стандарт HDMI широко применяется во многих сферах, где требуется вывод изображения на экран. Лично мне удавалось передавать сигнал по HDMI кабелю на расстояние до 10 метров (больше просто не требовалось). Думаю, что без потери качества, можно передать картинку на расстояние до 30–40 м. Основные минусы в случае протяжки такого кабеля — это его диаметр и размер, непосредственно, разъемов. Самый простой способ исключить кабель — это использовать беспроводной удлинитель, думаю получится достигнуть 100–150 метров, но точно не скажу. К сожалению, не все объекты, по тем или иным причинам, разрешают использование беспроводных сетей. А если нужно еще дальше?
Рис. 1. Разъем HDMI кабеля и оптики
Конечно, оптика, наверное, не лучший вариант для передачи видео, но при использовании стационарных ПК и мониторов — очень даже ничего. Первый тезис — это диаметр оптического кабеля (в моем случае, это 2–3 мм) и диаметр коннектора волоконно-оптического кабеля. Второе — это, безусловно, расстояние. Забегая вперед, скажу, что тесты проводились на кабеле 300 м, диаметр (внешний) — 3 мм.
Элементная база
При проработке элементной базы, выбор, неожиданно, пал на китайскую компанию SiFotonics, которая специализируется на такого рода оборудовании. Для начала мы изучили их продукцию и получили две отладки, которые соединили трехсотметровым оптическим кабелем и убедились, что все работает без нареканий. В их ассортименте есть и SFP оптические приемники/передатчики (ROSA/TOSA), сериалайзеры/десериалайзеры, драйверы и т.д.
Принцип работы
Для соединения и работы устройств необходимо подключать два оптических кабеля и подать питания (кабель microUSB). Если приводить аналогию с обычным кабелем HDMI, в котором для обмена таблицей EDID есть I2C, то тут все тоже самое — один канал для передачи данных, второй — для передачи EDID от монитора к видеокарте. Данные передаются со скоростью 10Gbps. Отрывая кабель обратного канала, картинка неизменно пропадает. В этот момент закрались некоторые сомнения, а не передаются ли какие-нибудь служебные данные или метки синхронизации в обратном канале, или может устройства мониторят подключения друг к другу…
Рис. 2. Состав модулей
Первая итерация платы, она же макет, получилась размерами 20×45 мм. С разъемом питания «вбок», чтобы было удобнее разводить шины питания в полигонах. Итого получилось 4 слоя. Чем плоха данная конфигурация печатной платы, я напишу позже. Хитрые разработчики на отладке использовали пассив размерами 0201, что мне делать категорически не хотелось, поэтому я использовал 0402 и под чипом каша из конденсаторов.
Рис. 3. 3D модель макета платы модуля источника
Как я писал выше, моей задачей было не только сделать пару с рабочим расстоянием 300 метров, но еще и убрать обратный канал оптики. Еще на этапе проработки мы решили не ввязываться в доработку китайского софта (хотя, нам любезно были предоставлены все исходники), так как, во-первых, это куча строк непонятного кода в непонятном компиляторе, во-вторых, SiFotonics может поставлять прошитые чипы, что очень удобно, так как прошивать устройства в рамках производства весьма не просто. Чтобы читатель не подумал, что я преувеличиваю, говоря о сложностях, я приведу фото стенда для программирования.
Рис. 4. Стенд для программирования и диагностики
Да-да, как вы уже, наверное, догадались, контакты JTAG для программирования выведены на контакты microUSB, и на некоторые контакты HDMI, которые раньше были GND. Сразу оговорюсь, что на качество работы это не повлияло. Итак, стенд. Чтобы запрограммировать чип, нужно сначала собрать одну схему стенда и перевести микросхему в режим программирования с помощью специализированного ПО. Далее необходимо собрать другую схему и с помощью другого ПО прошить плату. После этого она автоматически переходит в рабочий режим.
В общем, как мне кажется, это не целесообразно даже на 1000 штуках.
Вернемся к обратному каналу. Для хранения EDID таблиц нам необходима EEPROM, и понадобиться налету менять ее адрес. Взял N24C02UDTG в миниатюрном корпусе US-8. Для ее программирования использую микроконтроллер STM32F031G4U6, тоже в самом маленьком корпусе, который можно найти в свободном доступе — UFQFPN-28. Также я взял свитч питания TPS27081ADDCR. И вот что у меня получилось:
Рис. 5. Схема реализации клонирования EDID
Идея в следующем. Эта схема реализуется на передающем модуле (тот, что подключается к ПК). Для клонирования EDID монитора устройство подключается к монитору. По умолчанию адрес EEPROM на нашем модуле не должен совпадать с адресом EEPROM в мониторе (во время чтения), то есть он может быть любым другим, я, например, сделал ножку A0 управляемой. В момент подключения к монитору питание на EEPROM подается, а нога А0 подтянута к логическому »0» резистором. На шине i2c висят два EEPROM с одинаковыми адресами, но это не критично, так как мы с ними еще не работаем. В моей схеме есть еще кнопка и светодиод индикации питания/прошивки EDID/ошибок. Кратковременное нажатие кнопки приводит к смене адреса и разрешению микроконтроллеру начинать чтение/запись EDID. Ресетим EEPROM питанием (на всякий случай) когда получили сигнал от кнопки, читаем EDID монитора и сразу пишем его в нашу микросхему. Мигаем 3 раза светодиодом и отключаем питание EEPROM. Чтение/запись происходит мгновенно, поэтому для мигания сделана принудительная задержка, чтобы пользователь понимал, что что-то происходит. То есть мигать начинаем тогда, когда уже можно отпускать. Если что-то не так, то не зажигаем светодиод.
Далее подключаем модуль к ПК и сразу видим новый монитор в настройках. Задача решена.
Для программирования микроконтроллера вывел SWD шину.
Рис. 6. Обратная сторона платы модуля
Особенности
После всей проделанной работы с клонированием EDID я убрал обратный оптический канал и все работало без нареканий. При данных опытах питание происходило от USB ПК. Во время загрузки компьютер (во всяком случае мой) на мгновение выключает питание USB и картинка с BIOS мигает на мониторе — это не критично. Затем я выпаял модули обратного канала с устройств и после этого мигания картинка перестала восстанавливаться. И происходило это именно из-за отсутствия модуля TOSA на мониторном устройстве. Я попытался эмулировать наличие лазера, но все безуспешно. Я почти уверен, что эту проблему можно решить прошивкой, но мы решили в нее не лезть. Чудо произошло, когда я подключил оба устройства (приемник и передатчик) к блокам питания (как, кстати, было указано в ТЗ). Картинка перестала моргать, а соответственно и пропадать. Если во время работы передергивать питания устройств, то картинка восстанавливается без проблем.
Рис. 7. Схема включения передающего модуля (лазера)
Теперь вернемся к конфигурации печатной платы и разъему питания «вбок». Эта реализация была изначально неудобна и подходила только для макета. В релизном устройстве я уменьшил ширину платы до 16,3 мм и вынес разъем питания на место оптического модуля обратного канала — это позволит включить несколько устройств в одну видеокарту. В противном случае мне мешал разъем питания и плата была очень широкой.
Рис. 8. Узкие платы приемника и передатчика
Тут, конечно, было много переразводки и перестановок компонентов. Полигоны питания были переделаны полностью для оптимизации под эти размеры и переноса разъема microUSB. Как можно догадаться, корпуса для обоих устройств идентичны, поэтому конфигурация платы, разъемы и оптический модуль расположены одинаково. Корпус фрезеруется из алюминия и является теплоотводом, для процессора и драйвера. На внутренней стороне фрезеруются выступы под эти компоненты, поэтому они тоже располагаются одинаково.
Заключение
На данный момент спаяно четыре пары устройств, проводятся тесты на длинном кабеле на разных мониторах и ТВ. Нареканий па работе нет никаких. Проверяем только на fullHD и ниже.
Спасибо за внимание и до скорых встреч!