Как устроен игровой OLED-монитор и как с ним можно играть

В этой статье я рассказываю о том как исследую устройство своего монитора. Знаете ли вы, сколько RAM в вашем мониторе? А сколько процессорных ядер? Сколько разных прошивок установлено внутри вашего монитора?
После прочтения вы не сможете поставить новую прошивку в свой монитор. Но сможете больше: сможете начать исследовать свой монитор или какое-то другое устройство. А может быть начнете разрабатывать свою прошивку?

Введение
Мне всегда было интересно знать как устроены вещи. В то же время я хочу, чтобы мои вещи работали так как я хочу. Последние годы я наблюдаю какую-то деградацию новых устройств. Те же самые устройства уже были придуманы и были придуманы удобно, но их новые версии как будто специально портят. Или авторы просто не знают, что всё уже было изобретено и пытаются придумать вещи заново.
Нытье о том, что раньше было лучше
Например, уже много лет назад у меня была микроволновка с простым алгоритмом работы: Открыть дверцу, положить продукты, закрыть дверцу, нажать кнопку и разогрев начался. Сейчас же у меня микроволновка с которой я чувствую себя оператором микроволновой печи. Сначала ее надо включить отдельной кнопкой On/Off, причем включается она не сразу. Вначале она загружается и показывает логотип на экране. Потом можно нажать кнопку открытия дверцы, которая также открывается с задержкой. Потом уже можно положить продукт, закрыть дверцу и нажать кнопку разогрева. Вроде бы и несложно, но почему у старой микроволновки это происходило заметно быстрее и проще?
Я понимаю, что большинство неудобств можно решить исправлением софта, который работает внутри этих вещей. Но производители не позволяют этого. Не потому, что они такие вредные, но выпускать микроволновую печку с Open Source прошивкой заметно сложнее и дороже, чем с закрытым софтом. Нужно согласовать лицензии на весь софт который вы используете в своей прошивке, нужно обеспечить проект документацией, которая также может включать в себя чужую интеллектуальную собственность. Да в конце концов, производителю может быть стыдно показывать внутренности своего железа и софта, т.к. разработаны они не лучшим образом. Все это требует дополнительных расходов. Потому нас окружает куча устройств невысокого качества, с закрытым софтом и без документации.
Я всегда мечтал, что у меня будет достаточно времени, сил и квалификации, чтобы взять прошивку микроволновки, WiFi точки, телефона и доработать ее так, чтобы мне начала нравиться их работа. Возможно вас тоже посещали такие мысли.
Но раньше это было очень сложным процессом. Нужно быть специалистом во многих областях сразу: и в программировании и в разработке устройств, разбираться в спецификации всех электронных компонентов из которых состоит устройство.
Так было раньше. Но не сейчас! Теперь появился AI. И вот теперь процесс, о котором я мечтал много лет, становится гораздо доступнее.
У меня есть не только микроволновка. Есть монитор от компании MSI: MPG 341CQPX QD-OLED. Это очень хороший, широкоформатный, игровой OLED монитор. 1.5 года назад его очень хвалили в различных обзорах за качество картинки и совокупность функций. Мне очень нравится его изображение, частота 240Гц, 4 видеовхода. Нравится почти все. Но есть нюансы.
Самый понятный: при включении монитора он всегда показывает логотип от MSI. Вполне красивый логотип, цвета фуксии.

Показывает его 3 секунды. Один или два раза его можно посмотреть. Но когда у тебя монитор 1.5 года, ты уже знаешь, что это монитор от MSI и его логотип известен. И если во время экспериментов с разными источниками сигналов бывает нужно включать и выключать монитор несколько раз за вечер, обязательный просмотр логотипа начинает раздражать. Хотелось бы его отключить и ускорить включение монитора. Но в настройках такой возможности нет. Кажется, что можно было бы это сделать. Спойлер: такая возможность в прошивке есть, только производитель не позволил ей управлять.
Иногда мне приходится подключать к монитору несколько источников сигнала. И переключение между ними - это ужасный ад очень неудобный процесс. Если у источника нет сигнала, то монитор засыпает и перестает реагировать на кнопки. Процесс просыпания - это опять несколько секунд. Если я ошибся с выбором входа, процесс повторяется: уснул, несколько секунд ожидания, проснулся и если сигнал есть и он монитору нравится, то картинка появляется и монитор начинает реагировать на кнопки. Если не повезло и я ошибся со входом или сигнал неподходящий, то монитор опять засыпает. Может написать перед выключением “Out of sync”, причем на очень короткое время и отключить экран.
Я бы хотел гораздо большей прозрачности в работе. Хочу чтобы монитор давал мне информацию о сигнале, который он принимает и писал почему же ему не нравится этот сигнал. И выключался тогда когда этого захочу я, а не он.
Последней каплей, которая заставила меня заняться монитором всерьез, было появление у меня MacBook Pro. До этого я пользовался MacBook Air, который подключал к этому монитору, закрывал крышку и все работало отлично - картинка на мониторе была. С MacBook Pro все стало по другому: подключаю открытый ноут - картинка на мониторе есть. Закрываю ноут - монитор пишет “Out of sync” или “No signal” или вообще начинает чередовать RGB цвета на максимальной яркости. Наверняка это можно решить погрузившись в исследование настроек в MacOS, правда с закрытой крышкой ноута и без картинки это делать сложновато. Мой монитор мог бы мне помочь, но нет. Не может. Или его производитель не очень хочет, чтобы монитор был удобным инструментом.
У меня уже был позитивный опыт использования AI для реверс инжиниринга не очень сложных устройств Пульт управления светом на кухне, Радар на 60GHz, а также было желание разобраться в том как вообще работает современный монитор и это стало началом очень интересной (с моей точки зрения) истории.
Начало исследования
Я предполагаю, что все алгоритмы работы монитора находятся в его софте (прошивке). Компания MSI выпустила несколько версий прошивки для моего монитора. Последняя версия на сегодняшний день и на момент начала исследований это FW.037, а в моем мониторе стояла предыдущая - FW.034. Это важно, т.к. обновление - это процесс который может показать детали взаимодействия с монитором, а повторить его без свежей прошивки может быть невозможно.
Я уже знал, что главная микросхема монитора называется “скалер” и именно она принимает сигналы с видеовходов монитора и обеспечивает изображение на экране.
Для начала я взял прошивку, которую предоставляет MSI и дал AI агенту такой промпт:
Это проект по реверс инжинирингу прошивки (Scaler Firmware) монитора MSI MPG 341CQPX QD-OLED https://www.msi.com/Monitor/MPG-341CQPX-QD-OLED/support. Цель: узнать алгоритмы работы монитора с OLED панелью и возможно улучшить их. Проверить возможность увеличения кадровой частоты. Понять как можно собрать свою прошивку для монитора. Проверить есть-ли в этой прошивке управление кнопками монитора и алгоритмы взаимодействия с HDMI и Display Port входами. Прошивка лежит в файле MSI_MPG_341CQPX_QD-OLED_FW.037_0225.bin . Можно использовать различные внешние тулы типа Ghidra. Проведи начальный анализ задачи и прошивки и напиши план.
Через час работы агента я уже знал: “Скалер — Novatek NT68503, панель SDC QMC340CA01_D01” причем доступной документации нет по обоим компонентам. Внутри микросхемы скалера есть 4 процессорных ядра на разных архитектурах: 1 x STBC (STandBy Controller) 8051, 2 x Leon2 Sparc, 1 x Tensilica Xtensa и прошивки для их работы находятся внутри этого файла. Было очень удобно, что прошивка не зашифрована, за это огромное спасибо компании MSI. AI подчеркнул, что в прошивках оставлено много отладочной информации, присутствуют UART консоли с наборами команд, что должно помочь с пониманием того как же работают прошивки.
Стало примерно понятно как устроен монитор:
STBC контроллер 8051 - обслуживает старт монитора, загрузку остальных ядер и взаимодействие с внешними устройствами (кнопки, джойстик, USB).
Leon2 Main - основное ядро монитора с самой большой прошивкой 1.4Мб. Управляет OLED панелью, настраивает режимы, рисует OSD меню.
Leon2 Sub - отдельное ядро, которое взаимодействует с видеовходами, т.к. протоколы взаимодействия по HDMI и Display Port очень завязаны на точные временные промежутки, которые надо правильно обрабатывать, что основное ядро может пропустить.
Tensilica Xtensa - какой-то DSP процессор, который вроде как анализирует яркость картинки и дает информацию как регулировать яркость панели. На момент написания статьи это наименее исследованный компонент.
Еще через час агент нашел в прошивке сервисное меню монитора о котором я не знал и алгоритм как активировать это меню (нажать на джойстик и включить питание). Я это проделал и правда, появилось сервисное меню.

Я дал фото сервисного меню агенту, он нашел соответствующие ему функции в прошивке и сделал выводы о том, что в памяти монитора есть уникальные для моего монитора данные, типа серийного номера, часов работы OLED панели и ее калибровка. Агент ведет себя довольно осторожно, т.к. после этого он сам записал себе правило запрета любых попыток записи во флеш монитора до тех пор пока не будет найдено место хранения этих уникальных данных и не будет сделана копия. Он даже нашел как сама прошивка называет эту область памяти: FE2P (Flash-emulated EEPROM). В дальнейшем это оказалось неверным, конкретно для этой модели монитора, но это уже спойлеры. :-)
Затем я сделал фото уже обычного OSD меню монитора с его различными настройками, отдал агенту и он сопоставил данные из сервисного меню, данные из обычного меню и пункты из этих меню. После чего выдал мне таблицу команд OLED панели, которые прошивка отправляет этой панели.

В этот момент стало понятно, что к примеру алгоритм обслуживания OLED матрицы из этой прошивки будет не узнать, т.к. всё обслуживание заключается в отправке команды в панель и ожидание пока панель откалибрует свои LED точки. А жаль, т.к. мне были интересны детали как же это происходит. Также это означает, что у OLED панели есть своя прошивка и свой процессор. Постарайтесь по ходу рассказа посчитать количество процессоров и прошивок внутри монитора, потом сверим.
Теперь я решил, что хорошо бы понять как монитор обрабатывает нажатия кнопок. Вот таким промптом поручаем агенту эту работу. В тексте есть опечатки, это потому, что я использую реальный лог из сессии с агентом:
Попробуй найти в коде обработку нажатий кнопок на мониторе, возможно там есть скрытые комбинации, типа вызова сервисного меню. У монитора 2 конопки, одна из них - это включение монитора и отправка его в сон, а вторая - функциональная с назначаемой функцией. Еще есть джойстик с 4-мя направлениями и возможностью на него нажимать.
10 минут работы агента и я получаю кучу новой информации. Оказывается джойстик монитора читается не отдельными кнопками, а с помощью аналогового входа. Т.е. один вход микросхемы скалера читает все 5 кнопок джойстика, причем в аналоговом виде. Разный уровень напряжения показывает разные направления джойстика. Вот примерная схема, как это может быть устроено внутри монитора. Тут побольше информации, чем я получил в первый день, но читатель меня простит.

Еще из кода стало понятно, что есть возможность программно эмулировать нажатия кнопок монитора отправляя команды ядру Main. Зачем это нужно - непонятно.
На этом завершилась моя первая сессия по исследованию монитора, т.к. закончились лимиты на Claude Code. Все это заняло примерно 4 часа чистого времени, включая мои размышления и беседы с агентом. Что же я узнал за это время?
AI построил мне карту прошивки, которую дает MSI:
0x000000-0x001900 8051 STBC bootloader (reset vector: LJMP 0x13F7)
0x004000-0x004200 Таблица JEDEC ID SPI-флеша, 57 записей по 6 байт
(SST, Macronix, Winbond, GigaDevice, EON, AMIC, ESMT, ISSI, Fudan)
0x006000-0x006048 Таблица разделов, 9 записей по 8 байт
0x010000-0x02E600 8051: основной код, MailBox, ADC-кнопки, отладочная консоль
0x030000-0x03D900 Tensilica Xtensa LE: контур LDC/ABL, своя отладочная консоль
0x050000-0x0A5600 Leon2 Sub, SPARC BE (85 % валидных опкодов)
0x0A6000-0x0A8800 Таблица указателей 0xA00xxxxx (символы/векторы Sub)
0x0B0000-0x0CF500 SPARC BE (81 %)
0x0D0000-0x0D8100 service runtime Leon2 Main @0xA0028000: traps, HAL, mailbox
0x0EC000-0x0F1B00 Инициализированные данные Leon2 Main → RAM 0xA8024000:
VERSION=37 @0x0EC020, дескрипторы и указатели на OSD-ресурсы
0x118000-0x11F800 60 EDID (база + CTA-861 + DisplayID), MSI 0x4DD0 "MPG341CX OLED"
0x11A000-0x128000 Данные (низкая энтропия, H=2.40)
0x128100-0x26A100 Leon2 Main, SPARC BE (73 %) + OSD-ресурсы и языковые строки
У монитора есть 4 ядра с разной архитектурой.
У каждого ядра есть последовательный порт (UART) через который они выводят диагностические сообщения и можно им отправлять какие-то команды.
У OLED панели есть своя прошивка (недоступная нам) и панель программируется отдельными командами.
Где-то в мониторе хранятся уникальные данные, формат которых неизвестен и которые нужно прочитать и сохранить до того, как ставить более рискованные эксперименты с монитором, типа изменения настроек в сервисном меню.
И я понимаю, чтобы ставить дальнейшие эксперименты с монитором без риска превратить его в нерабочий, нужно монитор открыть и постараться прочитать микросхему флеша с прошивкой и данными. Если это получится, то при любых дальнейших экспериментах (например “инициализировать монитор”), при которых монитор перестанет работать, я смогу записать данные из бекапа обратно во флеш и монитор станет таким же как и до начала экспериментов. По крайней мере лучше иметь бекап этих данных, чем его не иметь. Также эти данные помогут в дальнейшем исследовании, чтобы понять как же прошивку из файла копируют в микросхемы флеша. Ведь совсем не факт, что в микросхеме эти данные записаны также, как в файле.
Открытие (монитора)
Теперь главной задачей стало получить физический доступ внутрь монитора, чтобы можно было подключиться к UART процессорных ядер и почитать, что же они пишут, а также чтобы прочитать содержимое флеша с прошивкой.
У меня уже был опыт разборки ноутбуков (PC, Mac) и телефонов, а также опыт чтения и записи микросхем флеша с помощью специальной прищепки Pomona. В большинстве ноутов, которые мне встречались, BIOS записан в достаточно крупной (по современным меркам) микросхеме SOIC8, у которой 8 ножек, которые торчат по бокам. Индустрия выпускает специальные прищепки, которые можно прицепить на микросхему сверху и прочитать или записать ее содержимое, даже не включая само устройство.


В исследованной части прошивки были упоминания работы с SPI Flash памятью из чего я делаю вывод, что наверняка прошивка записана в отдельной микросхеме монитора и наверняка к ней можно прицепиться моей прищепкой, чтобы считать содержимое. А в случае весьма вероятных проблем из-за экспериментов, то и записать содержимое обратно. Вот пример как это можно сделать: https://github.com/SergeyZh/hlk-ld6002-adt6101p-internals/blob/main/docs/how-to-read-flash-hlk-ld6002.ru.md
Есть только одна проблема - нужно открыть монитор.
Весь мой предыдущий опыт разборки электроники говорит о том, что ключом к успеху является документация по разборке. Лучше всего от самого производителя, в крайнем случае от энтузиастов или от iFixit. Самостоятельные попытки разобрать устройство, без знания как устроен корпус и защелки, почти всегда приводят к повреждению корпуса и/или самого устройства.
А я не хотел ломать свой монитор. Напомню, что он очень хорошо работает, картинка прекрасная, битых пикселей и царапин нет.
В Интернете я не смог ничего найти про открытие моего монитора. Нашел инструкцию от Dell про открытие похожего на мой монитор Alienware AW3423DWF. Он также изогнут на 1800R и у него такая же OLED панель. Там сказано, что Dell предоставляет сервисам специальную подушку, на которую нужно положить монитор, чтобы не сломать панель при открытии, а также достаточно подробно рассказано в каком порядке нужно отцеплять защелки монитора, чтобы открыть заднюю крышку. Характерно, что на всех фотографиях от Dell, внутренние части монитора закрыты цветными квадратами. Что же это за секретность такая?
Подкрепленный уверенностью, что мануал по разборке монитора в природе есть, я начал с обращения в саппорт MSI, сославшись на европейский документ о том, что производитель должен помогать утилизировать монитор и инструкция по разборке мне помогла бы это сделать. Подсказал мне это разумеется AI. :-) Ну и вы наверное догадываетесь, что саппорт отказал мне в таком документе, ответив, что для моей же безопасности они мне не дадут такой документ, т.к. в мониторе есть высокое напряжение. Ну Ок.
Тут я хочу сказать, что я достаточно увлекающийся человек. Прямо-таки очень. Поэтому стараюсь не играть в компьютерные игры, т.к. иначе можно просидеть несколько ночей подряд. Подобные исследования увлекают не меньше чем прохождение какой-то компьютерной игры. Ты видишь огромную неизвестную карту (размер которой также неизвестен), пытаешься ее открыть и исследовать. Это очень интересно. На пути постоянно возникают преграды, которые нужно решать.
Очередной вызов: открыть монитор, на который нет документации. Причем ломать монитор очень не хочется, т.к. он хороший. Даже царапать или оставлять следы открытия очень не хочется. Хочу сохранить товарный вид. А у меня нет даже специальной подушки, как для мониторов Dell, чтобы не повредить панель с OLED матрицей. Но открыть надо, вот прямо не могу как надо открыть монитор. :-)
Специальную подушку оказалось можно заменить обычной подушкой, положив ее на мягкую кровать. И сверху можно положить монитор экраном вниз. Вроде как панель не страдает. И вот я вижу крышку без единого винтика. Нога монитора уже снята, это были единственные 4 винта. Дальше только защелки, расположение которых неизвестно.

Вначале я пытался использовать традиционные медиаторы от iFixit и маленькие лопаточки для разборки ноутбуков. Все было напрасно. Пластик монитора - это мое почтение: крепкий и жесткий. Защелки держутся намертво.
Пример тупикового пути разборки. Слишком тонкие медиаторы и слишком маленькое усилие.

И главное, я постоянно помнил, что надо монитор не поломать, иначе весь смысл исследования пропадет. Т.е. и открыть очень нужно и сломать не хочу. Постоянно вспоминал вот этот фрагмент из весьма известного фильма:

Кажется, что нужно где-то нажать, чтобы крышка “Пум!” и отскочила.
Ключом к успешному открытию стало использование лопаток для разборки автомобильного интерьера. Это крепкие пластиковые лопатки с наполнением из стекловолокна.

Идея в том, что надо тянуть края крышки наружу, чтобы защелки отцеплялись от корпуса. В процессе открывания требуются очень крепкие … нервы, т.к. зацепки отщелкиваются с громким треском и грохотом. Но я ничего не поломал. В репозитории, где я выкладываю информацию о мониторе, теперь есть полная карта зацепок, чтобы знать где их надо отцеплять.
А вот и результат:

Что же внутри?
После 2-х дней проведенных в попытке открыть монитор и после успешного открытия, есть ложное ощущение, что большинство проблем уже решено. Но нет, игра только начинается. Посмотрим внимательно на плату. Вы же поняли, что справа плата скалера, а слева - только блок питания?

После осмотра, я вижу:
Неподключенный разъем CN4008 неизвестного конструктива на 14 контактов
Разъем CN4002 - к которому подключена плата с кнопками и джойстиком монитора
Разъем CN7003 с неподключенными пинами
Кнопка SW4101 неизвестного назначения
Несколько посадочных мест под разъемы, но разъемы там не припаяны Очень хочется верить, что где-то на этих контактах и есть UART консоли от 4-х ядер монитора.
Также не забудем, что я же хотел найти микросхему SPI Flash в которой должна быть прошивка. Я уже вижу на этой плате 2 или 3 микросхемы формата SOIC8 и уже готовлю прищепку, чтобы прочитать данные из этих микросхем. В последний момент я вспоминаю, что залогом успеха является чтение документации если она есть и проверяю маркировку этих SOIC8. Документация на эти микросхемы есть, но к сожалению оказывается, что все видимые микросхемы на этой стороне платы не являются микросхемами памяти и читать из них нечего. :-(
Ок, задача немного усложняется и надо поискать такие микросхемы на обратной стороне. Нужно открутить несколько винтиков (включая те, что на видеовходах, которые не видны на фото), отключить разъемы, которые легко отключаются (широкие разъемы сверху я пока трогать не хочу), отклеить металлизированный скотч и готово, я перевернул плату.

Ура, тут есть еще 3 x SOIC8. Я опять готовлю прищепку, чтобы прочитать данные и опять читаю спецификации на микросхемы. Как же хорошо, что хотя бы эти микросхемы не являются секретными. Из трех микросхем две являются микросхемами памяти, но только одна - U1508 это SPI Flash. Вторая - U4003 это EEPROM с доступом по I2C и у меня пока нет опыта чтения таких микросхем.
Прицепляю прищепку + Raspberry PI и программой flashrom читаю содержимое U1508. Это 256KB флеша, явно не прошивка монитора, возможно какая-то его часть. Отдаю файл AI агенту для анализа и получаю результат U1508 Это прошивка USB хаба VL211, причем там 2 разные прошивки. В общем пока это можно отложить.
Вторая микросхема U4003 - это ST M24256 EEPROM на 32KB. Прошу агента подготовить все что нужно:
В проекте есть микросхема U4003 типа 24256FP. Ее описание в файле docs/eeprom-u4003.md , а спецификация в datasheets/m24256e-f.pdf. Напиши инструкцию как прочитать данные из этой микросхемы не снимая ее с платы с помощью Raspberry Pi. В файле с описанием уже есть подобная инструкция, но она мне кажется не совсем верной, т.к. ее писали без даташита.
Агент сделал все что нужно: какой контакт Raspberry PI к какому контакту прищепки подключать и написал Python скрипт для чтения. В результате я получил файл на 32KB с содержимым U4003 и сразу отдал его агенту для анализа. Правда я и сам заглянул внутрь файла и заметил, что там данных от силы всего 1KB, остальное байты 0xFF, т.е. пусто.
После анализа файла AI сделал вывод - это и есть уникальные данные для моего монитора. Он даже нашел соответствие данных из сервисного меню и содержимого U4003. Там есть часы работы OLED панели, несколько RGB данных, возможно это калибровка панели.
Это хорошо, значит я уже сохранил уникальные данные своего монитора и смогу вернуть его на состояние сегодняшнего дня. Но я до сих пор не понимаю где же хранится прошивка для скалера. Следующий подозреваемый - это металлический экран, который припаян с лицевой стороны платы и тут я задумываюсь. Пока я не сделал ничего, что могло бы лишить меня гарантии на монитор. Открывал монитор аккуратно, винтики откручивал аккуратно. Но отпайка экрана с платы - это мне кажется может являться нарушением гарантии. Однако если этого не сделать, то я не смогу прочитать флеш с прошивкой и даже если я смогу обойтись без его чтения, то в случае его повреждения из-за экспериментов, я не смогу восстановить его содержимое. В общем похоже надо набраться смелости и аккуратно отпаять экран.
Под экраном
При должном терпении и аккуратности отпаять экран оказалось не очень сложно. Всего 6 точек пайки по кругу и в несколько итераций я снял экран.

Под экраном - очередной сюрприз: огромный радиатор, который закрывает наверное микросхему скалера. Еще я вижу 4 микросхемы RAM - это DDR3, всего 1Гб памяти. И главное: U4002 - микросхема SPI Flash объемом 32MB. Ну точно там находится прошивка монитора. Но есть нюанс…
Микросхема флеша в корпусе WSON8. У нее ножки почти под корпусом и моя прищепка к нему не подходит. Вот как выглядит подобная микросхема. Размер 8x6 mm.

Что же делать… Индустрия выпускает инструменты и для таких корпусов.

Но во-первых они очень ненадежны, т.к. дают плохой контакт, а во-вторых у меня такой штуки нет. Еще одна сложность в том, что микросхема флеша находится почти вплотную к большому радиатору. Расстояние примерно 3 мм, поэтому трудно подлезть к ножкам флеша со стороны радиатора.
Еще было бы интересно снять радиатор и посмотреть на микросхему скалера, т.к. в Интернете нет ее изображений, да и маркировку полезно проверить. Но радиатор не прикручен винтами, как обычно, а припаян. И я пока не готов просто ради любопытства его отпаивать.
Вернемся к флешу. Мне нужно присоединиться как минимум к 6-ти из 8-ми его ножек. Но кажется, что это сделать очень трудно. Микросхема размером 8x6 мм, ножки расположены на коротких сторонах и представляют собой только маленькие шарики припоя, которые чуть-чуть вылезают из под корпуса. Многие специалисты по ремонту рекомендуют отпаивать микросхему с прошивкой прежде чем ее читать. Я этого никогда не делал, но теоретические знания у меня есть. :-)
И вот я опять погружаюсь в размышления. Отпаивать микросхему на 8 контактов - это не очень сложное дело. В теории. Но это мой монитор, который все еще прекрасно работает. Если я перегрею микросхему флеша и сожгу ее ДО того как прочитаю содержимое, то даже новая микросхема мне не поможет. Я не знаю в каком формате записать в нее данные. В этом проблема закрытых устройств без документации, проблема которую я хочу решить подобными исследованиями.
Думаю… Если я сейчас отказываюсь от отпаивания микросхемы (очень разумно), то надо обратно собирать монитор и когда я смогу вернуться к очередной попытке - непонятно. А я очень увлекающийся человек (см. выше) и очень хочу узнать формат хранения данных. И фен для отпаивания у меня есть… В общем, зачем мне фен, если им не пользоваться?
Пока монитор разобран и лежит на столе (с подушкой конечно), я вооружаюсь феном, флюсом, пинцетом, защитными пластинами (нужно закрыть соседние разъемы и детали) и начинаю греть микросхему флеша. Грею и жду, пока ее можно сдвинуть в сторону. Самое плохое, что можно сделать - это начать отрывать микросхему, пока она недостаточно нагрета. При этом еще и плата будет повреждена и монитор точно пойдет в мусор. 3-4 минуты прогрева и никакого результата. Радиатор скалера уже начал обжигать мне руки, но флешка не отпаивается. Я дал остыть плате, сделал вторую попытку, грел достаточно долго, но никаких признаков отпаивания нет. Я понимаю, что все-таки не хочу ломать монитор, поэтому прекращаю эти попытки, отмываю плату от флюса и решаю еще подумать и заняться анализом прошивки дальше.
В поисках UART
Пока у меня нет свежих идей по подключению к флешу, я начинаю исследовать доступные разъемы на плате. Есть несколько нераспаянных разъемов, почему бы им не быть UART разъемами? Также есть CN4008 на 14 контактов. Вдруг это сервисный разъем с помощью которого можно программировать флеш? Я обсудил эти варианты с AI агентом, он написал план прозвонки разъемов и микросхемы флеша. Я это проделал, но увы, всё оказалось бесполезным. Связи доступных разъемов и микросхемы флеша я не нашел. Зато стало понятно назначение разъема CN7003 - это отладочный ICP/SWD порт микроконтроллера Nuvoton NUC1261 (U7005), который стоит рядом. Через этот разъем можно программировать контроллер U7005 у которого внутри своя собственная прошивка. В тот момент я еще не знал, но тут могу сказать - это оказался USB-мост для связи монитора с компьютером. Именно он является устройством “MSI Gaming Controller”, когда монитор подключен по USB. Вы не забываете считать количество прошивок и программных ядер монитора?
Тем временем, я подключил логический анализатор Saleae (спасибо, Иван (@MErocle)) к разъему CN4008 и нашел на нем 4 UART консоли! Т.е. стали понятны назначения 10 контактов из 14. 4 пары контактов для 4-х UART и 2 контакта - GND. Конечно для этого понадобилась серия экспериментов: я подключал анализатор к разным контактам разъема, включал питание монитора и смотрел на графики в поисках активности. После этого записал полную сессию активности на всех контактах при включении монитора и отдал ее AI агенту. Он уже сам определил скорости UART и вытащил оттуда текст, откуда стало понятно назначение каждой из консолей. Вот тут есть много деталей: docs/uart-console.md, а это пример вывода консоли STBC при включении монитора и его засыпании без картинки:
------STBC Boot Loader -----
Set Flash to Quad mode!!
Re-booting STBC code...0x4570[5] toggle ==> warm Reset!!
------NT68500 MCU Test program -----
Leon2 vs AHB clk is 3:1
Leon2 (Main) RUN...
Leon2 (Sub) RUN...
FE2P_SetLeon2BaseAddress 00108000
[пауза 17,43 с]
FillKeyDetectList (0000) 3500 ff00 1200 100 00 00 00 00 00 00 00 00 00 00 00 00
FillKeyDetectList (0010) 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
FillKeyDetectList (0020) 20 20 20 20 1520 20 20 20 20 20 20 20 20 20 20 20
FillKeyDetectList (0030) 1530 1630 1530 1730 1630 130 1630 30 30 30 30 30
FillTypeCInfo : F6, 60, FF, 80, 00
Enable I2C 7
CMD_SYS_POWERSAVING
Leon2 (Main) STOP...
Leon2 (Sub) STOP...
DP_EnableMRX (0)
Результат отличный, минус только один: очень неудобно подключать провода к контактам разъема CN4008 - разъем довольно маленький. Я бы хотел удобного подключения.
Как определить неизвестный разъем CN4008
Ответ на сегодняшний день понятен - спросить у AI. Но отмечу, что результат я получил не с первого раза. AI делал разные предположения, я их проверял и пытался понять это мой разъем или нет. Однако после того как я измерил физические размеры разъема и сделал хорошее фото, AI почти без колебаний сказал: Hirose DF11-14DS-2C. Ну штош, раньше я о таких разъемах не слышал. Заказываю на Aliexpress готовый кабель с таким разъемом длиной 1 м. Когда кабель приехал, я разрезал его пополам и поставил на второй конец кабеля Dupont разъемы, чтобы легко подключаться к контактам. Это очень облегчило исследования.

Теперь для работы с UART консолью любого ядра, достаточно подключить Flipper Zero в режиме UART консоли к соответствующей паре разъема CN4008 + третий провод для соединения GND. Спасибо команде Flipper и Павлу Жовнеру за этот полезный девайс, я его использую постоянно!
Чтение флеша, вторая серия
Перед очередной попыткой отпаять микросхему флеша, я проконсультировался с человеком, который профессионально занимается ремонтом ноутов и он точно знает как это делать (привет, Максим!). Он дал массу полезных советов, главный из которых: WSON8 отпаять не так просто как SOIC8 и нужен подогрев платы снизу. Все дело в том, что эта микросхема припаяна не только 8-ю ножками, но и всем своим брюхом к медной площадке на плате. Поэтому тепло уходит быстрее чем фен ее нагревает.
Я конечно немного огорчился. Подогрев платы означает, что надо ее полностью снимать с монитора, убирать с нее все лишнее, наклейки, пластмассовые детали и потом греть на специальной печке… Не то, чтобы я слаб духом для этого, но как-то слишком сложно.
Под конец Максим дал мне отличный совет: вместо танцев с отпайкой микросхемы попробовать припаять проводки к ножкам микросхемы флеша. Всего 6 проводов. Да, мелко, но попробовать стоит. Я попробовал, было непросто, но все получилось. Напомню, микросхема 8 x 6 мм.


Итак, я получил содержимое флеша моего монитора! Дальше он идет под названием U4002 - это номер микросхемы флеша на плате.
Теперь как обычно: даю этот файл агенту и получаю массу полезной информации:
Во флеше есть 2 версии прошивки монитора: текущая и предыдущая
Уникальных данных моего монитора там нет
Формат хранения прошивки во флеше почти совпадает с форматом файла от MSI
Во флеше действительно много свободного места, из 32МБ занято меньше 6МБ
В образе прошивки, да и в самом файле обновления есть таблица разделов, которая содержит и описывает разные части прошивки. Например раздел номер 0x01 - это прошивка STBC для 8051, 0x10 - прошивка Leon2 Main для Sparc и т.п. Полный список по ссылке выше.
А в самом начале образа есть загрузчик (bootloader), который загружается при включении питания и который уже из таблицы разделов начинает загрузку ядер монитора.
И вот теперь, имея в руках копии всех прошивок (я так думал), можно начинать эксперименты с монитором.
Как происходит штатное обновление прошивки
Производитель монитора выпускает новые версии прошивки и дает программу “Gaming Intelligence” под Windows для обновления прошивки по USB. Причем любопытно - программа обновления требует, чтобы картинка на монитор во время обновления шла только через Display Port. Хорошо бы научиться обновлять прошивку из-под других OS.
Вначале я хотел понять как происходит обновление с помощью анализа прошивки. AI здесь опять неплохо поработал. Он нашел процедуры стирания и записи SPI Flash в двух образах прошивки для контроллера 8051. Это разделы 0x01 и 0x02. В первом из них есть процедуры работы с SPI Flash, но их никто не вызывает. Во втором эти процедуры также есть, но они вызываются из процедуры обновления с USB флешки, которая должна быть подключена к монитору. Это загадочная процедура, которая не описана производителем и которую я никогда не делал. Пока отложим.
Процедуру обновления по USB в прошивке найти не удалось. Попробуем с другой стороны. Сделаем анализ живого обновления монитора и попытаемся понять, что же нужно отправлять в монитор по USB, чтобы он принял в себя прошивку.
Для этого на Windows, где установлен MSI Gaming Intelligence, ставим Wireshark + USBPcap. Запускаю Wireshark, выбираю в качестве источника пакетов USBPcap, включаю запись и делаю процедуру обновления монитора на ту же версию прошивки, которая уже установлена в мониторе. Довольно удобно, что была возможность прошить ту же версию, что стоит в мониторе, чтобы не обновить его на более свежую. Файл записи обмена по USB получился размером 100Мб.
Если вы думаете, что я спец по записи подобного USB обмена - не стоит преувеличивать. Я делал это первый раз, все по инструкции от AI агента, который не смог найти код обновления в прошивке, сам предложил пойти этим путем и дал мне детальные инструкции, что нужно сделать для записи обмена по USB. Слушаюсь и повинуюсь. Файл размером в 100Мб я опять отдал агенту на анализ.
Результаты анализа агент записал в файл usb-isp-protocol.md и в процессе ему очень помогло наличие предварительно снятого образа флеш U4002. Если коротко описать протокол обновления:
По USB отправляется команда
580040:в ответ на которую скалер переключает свой внутренний UART (да, там есть еще и внутренний UART, по которому общаются скалер и USB-мост) в режим I2C и переводит себя в режим ISP (In-System Programming) - режим прямого программирования скалера по I2C.Следующей командой
01 e0 01уже USB-мост переводят в режим I2C.
Теперь отправляя команды по USB с компьютера, мы посылаем команды I2C напрямую микросхеме скалера. Детали протокола описаны по ссылке выше, но оцените сложность взаимодействия в этом режиме:
По USB мы отправляем пакеты типа 0x04 (я не знаю, что это значит) у которых внутри записана команда с параметрами для USB-моста монитора.
USB-мост, приняв эту команду, превращает ее в I2C команду с адресом и данными - “посылкой”.
В “посылке” находится команда для микросхемы скалера с параметрами. Это и есть протокол взаимодействия со скалером в режиме ISP.
В протоколе есть команды для записи-чтения любых регистров скалера, программирование SPI контроллера для флеш памяти и “другие команды”. Вот кусочек таблицы с командами скалера в этом режиме. В файле по ссылке есть полная таблица команд, которые были пойманы и частично расшифрованы в режиме обновления прошивки.

Тут я заострю ваше внимание: это не просто режим обновления прошивки монитора. Это режим универсального доступа к микросхеме скалера + полный доступ к флешу. Можно прочитать, стереть и записать любой сектор флеша, можно отправить вообще любую команду протокола SPI Flash, включая довольно деструктивные.
Теперь понятно почему в прошивке монитора нет процедуры обновления прошивки по USB. Она просто не нужна. При наличии такого режима, вся процедура обновления полностью контролируется компьютером по USB. Т.е. теперь понятно как можно залить в монитор любую новую прошивку используя любую OS, а не только Windows.
Конечно есть и нюанс такого режима. Если в результате заливки новой прошивки что-то пойдет не так, например новая прошивка не заработает, то вернуться в этот режим будет нельзя. Монитор превратится в кирпич и восстановить его можно будет только проделав все то, что я написал в статье выше: открыть монитор, отпаять экран, припаять проводки к микросхеме флеша и с помощью Raspberry PI залить во флеш хороший образ U4002.
Это кажется весьма сложной процедурой восстановления монитора в случае ошибки даже для меня, хотя мой монитор уже разобран и нужно всего лишь снова припаять проводки к флешу. Могу ли я рассчитывать на участие в разработке еще каких-то энтузиастов с таким же монитором? Уверен, что пока нет.
Ведь должен же быть способ начальной прошивки монитора на заводе, когда флеш еще пустой. Было бы классно найти как перевести монитор в режим ISP, но без участия прошивки самого флеша.
Ищем вход в режим ISP
Формулировка задачи довольно проста: нужно найти способ перевести монитор в сервисный режим (ISP) не полагаясь на работу его прошивки.
Этот режим обычно есть во всех электронных устройствах, т.к. именно с его помощью в устройство записывают самую первую прошивку.
Работает это так: при включении питания, в микросхеме скалера должна запускаться программа (ROM Loader), которая зашита производителем микросхемы. Эта программа должна начать читать прошивку монитора из микросхемы флеша и потом запустить ее. Это дает возможность относительно легко заменять прошивку монитора. Заменили содержимое флешки и монитор уже работает на новой версии программы. А ROM Loader остается прежним.
Обычно производители микросхем закладывают в ROM Loader развилку:
Если устройство в обычном режиме, то загружаем прошивку из флеша и запускаем ее
Если же устройство в сервисном режиме, то предоставляем возможность записать данные во флеш с каких-то внешних входов, например с USB. Режим ISP описанный выше - это как раз пример такого режима.
Условием же перехода по этой развилке может быть какой-то внешний сигнал, который ROM Loader читает и принимает решение по какой ветке ему нужно идти. Нужно всего лишь найти откуда он читает этот сигнал. Я напомню, что документации по скалеру у нас нет.
В индустрии электроники известны разные способы перехода в этот режим:
Нажать кнопку или специальную комбинацию кнопок
Замкнуть специальные контакты или дорожки на плате
Отправить какую-то последовательность сигналов подключившись к разъемам на плате
<наверняка еще какие-то есть>
Какой-то из этих способов может оказаться переводом монитора в ISP режим. Возможно, что и ни один из них, но о скучном мы пока говорить не будем.

Кнопки для ISP
У нас прямо-таки есть главный кандидат: это кнопка SW4101, которая недоступна до тех пор пока монитор не будет открыт. Почему бы ей не оказаться кнопкой перевода монитора в ISP? AI агент мне написал хороший план проверок. Если вкратце, то нужно подключить все возможные UART консоли, включить запись и понажимать на кнопку в разных вариантах: короткое нажатие, долгое нажатие, очень долгое нажатие и комбинации с нажатием и подачей питания монитора.
Я все это проделал, агент проанализировал и вывод такой: это просто кнопка Reset для монитора. После любого нажатия на нее и в любой комбинации, монитор просто загружается в свою обычную прошивку. Никаких новых надписей в UART консолях не появилось.
Почему не надо пытаться искать подобную роль у обычных кнопок монитора? Кнопки снаружи - это всегда схемотехника производителя монитора (MSI). Вы могли видеть схему этих кнопок в начале статьи. Микросхема скалера не знает как считать с них данные и поэтому не может анализировать нажаты они или нет.
Т.е. вариант с кнопками - отпал.
Контакты или дорожки на плате
На плате есть 2 разъема, которые не используются в обычной работе: CN4008 (14 pin) и CN7003 (6 pin).
Было бы логично предположить, что на заводе после сборки платы, к разъемам подключают кабели и заливают начальные прошивки в монитор. Затем тестируют монитор, что-то читая с UART консолей и нажимая кнопку Reset время от времени.
О назначении разъема CN7003 я уже рассказывал выше - это отладочный разъем для USB моста. Он подключен только к контроллеру моста и на скалер влиять не может.
Значит остается CN4008. Мне уже известно назначение 10 контактов из 14 - это UART консоли. Можно попробовать отправлять туда какие-то последовательности типа Enter или “пробел” на самом старте монитора. Правда для этого ROM Loader должен заранее запрограммировать UART в нужный режим (неизвестно какой), чтобы читать эти последовательности. Я предположил, что если скалер и слушает что-то на UART, то это скорее всего UART ядра STBC, т.к. именно это ядро стартует первым и управляет железом монитора.
Я даже попробовал отправлять в этот порт при включении монитора разные последовательности на скорости 4800 бод - это скорость работы этого UART в обычном режиме, но увы - никакого отклика. Да и шансов на это было маловато. После отпускания кнопки Reset и до появления первых сообщений загрузчика проходит 0.1 сек. Маловероятно, что за эти 0.1 сек можно отправить что-то разумное через UART. А через 0.1 секунду уже понятно, что началась загрузка прошивки.
Т.е. вариант с UART - отпал.
Остались еще 4 неизвестных контакта на CN4008. Наверняка в них есть какой-то смысл. Но увы, я не смог его обнаружить. В обычном режиме работы монитора на них нет каких-то осмысленных сигналов. Использовать их как входы я также попробовал, но без особого успеха. Я подавал на них импульсы с разной частотой, но единственное чего мне удавалось добиться - это неожиданные перезапуски монитора при высокой частоте импульсов. Но никакой зависимости перезапусков от импульсов мне установить не удалось.
Итого, я потратил несколько вечеров на эти эксперименты, но мне не удалось перевести монитор в сервисный режим с помощью каких-то внешних воздействий. Т.е. в случае повреждения прошивки во флеше, единственный способ вернуть монитор к жизни - это припаять проводки к флешу и записать туда рабочий образ, например тот, который я прочитал ранее.
Или же есть еще какие-то варианты, чтобы делать эксперименты с прошивкой было проще?
Компромисс
Нужно сделать процесс восстановления прошивки монитора достаточно простым, чтобы не превращать каждый эксперимент в хождение по лезвию ножа. Найти такую кнопку или процедуру у монитора не удалось. Значит надо научиться легко перепрограммировать флеш с помощью наружного программатора.
Прошлые тонкие проводки держались очень плохо и я их снял почти сразу после начального чтения флеша. Теперь, я купил самые тонкие (30 AWG), многожильные провода в силиконовой изоляции, т.е. очень мягкие, нарезал их кусками по 15 см и припаял к ножкам U4002.

Идея была в том, чтобы вывести эти провода наружу монитора, поставить на них разъем, закрыть крышку монитора и таким образом навсегда решить вопрос с восстановлением содержимого флеша. В любой момент я смогу выключить монитор, подключить к этому разъему программатор и залить в монитор прошивку по моему выбору. Классно? Конечно. Получилось ли?
Первое, что я сделал после припайки этих проводов - сделал полную запись сигналов с SPI Flash в процессе загрузки монитора. Подключаем входы анализатора Saleae к ножкам флеша и одновременно к UART всех ядер. После этого подключаем питание монитора и смотрим на сигналы. Смотрим и видим, что монитор только начинает загружаться, а потом - перезапускается. Я сделал несколько попыток и сумел поймать сессию, когда монитор сумел загрузиться до появления картинки на экране.
Верхние 4 графика - это сигналы SPI Flash, а последний график - UART STBC.

На картинке видно: подключение питания к монитору, он загружается в дежурный режим и ждет нажатия кнопки Power. Через 5 сек я нажал кнопку Power, монитор загрузил все остальные ядра и показал картинку. И в конце я опять нажал кнопку Power, чтобы монитор выключился.
Отдаю файл записи от Saleae агенту (а там вообще-то 75Мб) и пока он занимается анализом, я могу подумать почему же монитор теперь работает нестабильно. Должно быть все дело в припаянных проводках, догадался Штирлиц. Это означает, что надо их или укорачивать или отпаивать.
Тем временем агент принес много полезной информации.
В момент включения, когда работает ROM Loader, скалер читает 64Кб данных из SPI Flash на скорости 12МГц. Это - загружается bootloader. Потом ROM Loader запускает этот код ядром 8051. Теперь мы можем смотреть на код bootloader 8051 и одновременно наблюдать за шиной SPI Flash.
Дальше bootloader определяет тип микросхемы флеша и если она поддерживает, то переключает ее в другой режим работы, с более высокой скоростью. А именно: частота 48 МГц и передача данных по 4 ножкам вместо 1 как в стандартном SPI. Я даже не знал о существовании такого режима SPI. У меня было припаяно только 6 проводков, а не 8, поэтому я не записал половину обмена данными по SPI шине (2 сигнала просто не были подключены). Агент это понял, учел и ориентировался только на 2 доступных сигнала вместо 4-х во время анализа.
Bootloader начинает процедуру загрузки кода STBC 8051 уже на высокой скорости флеша и затем передает ему управление. STBC уже загружает прошивки остальных ядер и запускает их.
При анализе SPI обмена видно, что все ядра, кроме Leon2 Main, загружаются внутрь встроенной памяти скалера и работают оттуда. Но прошивка Leon2 Main занимает больше всего места - 1.4Мб и она работает напрямую из флеша. Т.е. каждую команду прежде чем выполнить, надо прочитать из микросхемы флеша по протоколу SPI. Теперь становится понятно, почему прошивка Leon2 Main занимает 3 сегмента в таблице разделов: 1 часть - это исполняемый код напрямую из флеша (медленно), 2 часть - небольшой кусочек кода, который должен всегда выполняться быстро (например обработчики прерываний) и 3 часть - блок переменных этой прошивки, которые надо изменять в процессе работы.
В файле spi-boot-trace.md написано больше интересных деталей, но я постарался кратко описать суть. Главное: загрузка начинается с загрузки bootloader, размером 64Кб.
И второе: пока я не отпаяю проводки от флеша, я не смогу пользоваться монитором, т.к. он постоянно перезапускается из-за наводок, которые ловят мои припаянные провода и которые мешают читать данные на частоте 48 МГц.
Идея: сделать bootloader таким, чтобы он не только умел загружать STBC, но и умел переводить монитор в ISP режим, где можно будет записывать содержимое в любое место флеша.
Пишем свой bootloader
Для начала надо сделать свой bootloader, который будет работать не хуже штатного. Раньше это означало бы огромный кусок работы, а теперь отдаем все агенту:
Я считаю, что в репозитории собрано достаточно материала, чтобы написать свой собственный bootloader на C, например на SDCC. Это позволит легко добавлять в него необходимые для дальнейшего исследования функции. Он должен быть полностью совместим с вендорским bootloader, чтобы монитор не потерял свои текущие функции. Софт для разработки должен быть Open Source и доступен широкому кругу разработчиков. Разработку нужно вести в отдельном подкаталоге с именем bootloader-<какая-то добавка, которая означает, что это open source bootloader>. Напиши такой bootloader сохраняя текущий функционал, без дополнительных функций, но не повторяй строки вендора при печати в UART, чтобы не возникло конфликта с вендором по поводу прав.
Я даже не стал изобретать название своему bootloader, отдав это на откуп AI.
Через 25 минут у меня была первая версия бутлоадера написанная с нуля и повторяющая работу штатного бутлоадера. Затем агент с помощью USB подключения перевел монитор в режим ISP и записал мою версию бутлоадера в самое начало флеша. Теперь, если монитор не загрузится, единственным способом восстановления останется программирование флеша внешним программатором по припаянным проводкам.
Смотрю на UART ядра STBC и перезапускаю монитор…
Причем можно на UART даже не смотреть. Если светодиод монитора загорелся, значит начала работать какая-то прошивка после бутлоадера и это означает, что бутлоадер точно заработал.
Бутлоадер заработал, монитор загрузился!
Почему-то нет сообщений от бутлоадера на UART консоли, но это не так уж и страшно.
Итого всего через 1 час после задания “напиши бутлоадер”, мой монитор уже загружается новым бутлоадером!
Дальше агент нашел ошибку из-за которой не работал UART и исправил ее. Подобные мелочи я упоминать дальше не буду.
Нужно больше бутлоадера!
Дальше - больше. В документации уже есть информация о том, как прочитать положение джойстика. Почему бы не добавить чтение положения джойстика в бутлоадер?
Я командую, агент выполняет, готово. Теперь при запуске бутлоадера, он определяет в какую сторону отклонен джойстик и пишет это в UART.
Вот как это выглядит при отклонении джойстика вверх:
bootloader-libre: start
libre: joystick direction 4 adc CA
libre: quad read verified
Нужно еще больше. Во флеше записано 2 версии прошивки, так работает штатная процедура обновления. Но возможности загрузить предыдущую версию нет. Давайте ее добавим. Пусть при отклонении джойстика вверх, будет загружаться прошивка из верхней половины флеша, а если вниз, то из нижней. Если джойстик не трогать - пусть монитор загружается из половины флеша, которая выбрана по умолчанию.
Раз-два 🪄, 4 минуты времени работы агента и готово! Теперь я могу выбирать из какой половины флеша загружать монитор. Уже очень неплохо. Можно держать монитор загруженным в штатную прошивку, записывать экспериментальные версии в неактивную половину флеша и потом при перезапуске выбирать джойстиком откуда загружать прошивку. Если новая прошивка не работает, простой перезапуск вернет монитор в штатную прошивку. Главное во время экспериментов не повредить активную половину флеша со штатной прошивкой.
Вот тут я загружаю неактивную половину флеша:
bootloader-libre: start
libre: joystick direction 4 adc CA
libre: quad read verified
libre: flash bank 01
libre: starting stbc-main from table 7000
А ведь можно сделать и еще больше. Почему бы не добавить в bootloader возможность перевода монитора в ISP режим? Код для этого известен, т.е. понятно в какие регистры и что нужно отправлять. Но есть нюанс. Для общения с монитором в режиме ISP нужно USB подключение. В обычном режиме работы оно уже есть, т.к. процедуры инициализации монитора уже выполнены. В режиме bootloader-a эти процедуры еще не выполнены и USB отключен. Нужно найти как включается USB мост и включить его прямо в коде bootloader-а.
Поиски USB заняли некоторое время. Дело в том, что в мониторе есть еще и USB Hub. USB кабель подключается в USB Hub. USB мост также подключается в USB Hub. Оба эти устройства имеют свои собственные сигналы включения внутри монитора, а документации по прежнему нет. Поэтому AI агент ищет подходящие места в коде, где есть что-то похожее на включение USB Hub и моста, добавляет такой же код в bootloader, компилирует, прошивает в монитор, а я перезапускаю монитор, отклоняю джойстик вправо, чтобы вызвать эту ветку bootloader-a и смотрю появились ли эти USB устройства в моей MacOS, которая подключена к монитору по USB кабелю. Дело не очень сложное, но времени занимает. Не буду растягивать процесс, в итоге я нашел все что нужно.
Более того, вот так я теперь читаю документацию. Здесь ответ на вопрос “как включить хаб и мост”.

Даем команду агенту “добавить переход в режим ISP при нажатии на джойстик вправо”.
И вот теперь, моя версия бутлоадера при включении монитора делает то, что мне нужно:
Нажали вправо - монитор попал в ISP. Можно с компа перепрограммировать флеш. Только надо не трогать первые 2 сектора или 8 кб. Там находится мой бутлоадер. Правда монитор в этом режиме выглядит совсем мертвым. Ничего не светится. Возможно нужно это доработать, но нужны идеи как же это реализовать.
Нажали вверх или вниз - загрузилась одна из двух прошивок. Сейчас у меня по дефолту, из нижнего банка, загружается штатная от MSI, а при нажатии вверх - загружается моя - экспериментальная. Учитывая размер флеша, там можно разместить до 10 прошивок одновременно, но зачем? Нужны идеи.
Теперь можно отпаять проводки, чтобы вернуть монитору стабильность в работе и продолжить эксперименты с остальными прошивками монитора. Как вы думаете, сколько раз мне понадобилось восстанавливать монитор с помощью внешнего программатора? Ни разу. Все прошивки, которые написал AI агент были работоспособными с первого раза. Были мелкие огрехи, типа отсутствия вывода через UART, но это было не существенно.
Еще не заключение
Статья получается большой и пора подводить промежуточный итог.
Исследовать устройство современного монитора - это очень интересно. Благодаря AI агентам это перестало требовать невероятного количества усилий и времени. Если вам интересна эта тема - попробуйте. Я специально приводил примеры своих промптов, чтобы дать идей для начала исследований.
Моя цель - замена всех прошивок моего монитора на открытые, чтобы можно было изменить или добавить какую-то функцию монитора.
У меня уже написаны прошивки для bootloader и USB моста. Они полностью рабочие и их можно собрать из опубликованного репозитория SergeyZh/mpg-341cqpx-qd-oled-re. В USB мосте есть дополнительная функция, которая позволяет прочитать содержимое флеша без открывания монитора. Подробности я собираюсь написать позже.
Также у меня есть уже написанные прошивки для STBC и Leon2 Main. Как раз вы можете видеть фото монитора с этими прошивками и самодельным OSD меню в заголовке статьи. Эти прошивки требуют доработки перед публикацией, т.к. в них пока сильно видны следы оригинальных прошивок. Это нужно не замаскировать, а переписать.
Ответы на вопросы
Зачем все это
Это очень интересно. За время исследования монитора я узнал много новых технических вещей. Например:
SPI Flash может отдавать данные не по одному контакту, а по 4-ем - в 4 раза быстрее.
Стандартная адресация SPI Flash - это 24 бита, т.е. 16Мб. Чтобы обращаться к большему объему, придумали расширение протокола и дополнительный регистр, при записи в который 1, флеш отдает вторую половину памяти вместо первой. Именно так построена схема с двумя прошивками у этого монитора и поэтому флеш здесь размером 32Мб, хотя хватило бы 8Мб.
В контроллере USB моста есть 2 прошивки: APROM и LDROM. Первая - это приложение самого USB моста, а LDROM - это загрузчик, который умеет обновлять APROM. Я могу заменить обе эти части, но пока написана только APROM.
В мониторе есть 1Гб RAM и можно программно прочитать содержимое экрана, который показывает монитор.
В процессе исследования я научился ловить обмен по USB.
<Многое другое>
Сколько же процессоров внутри монитора
Вопрос непростой, точного ответа у меня пока нет, но давайте посчитаем те, которые были упомянуты в статье:
4 ядра внутри скалера на которых работает сам монитор
USB-мост U7005 на контроллере Nuvoton NUC1261
USB-хаб VL211 от VIA Labs - у него точно есть своя прошивка в SPI Flash U1508
Итого 6 шт.
Однако еще, совершенно точно есть собственный процессор у OLED-панели Samsung. Он принимает команды по каналу I2C. Возможно он находится под толстой железной крышкой по центру монитора. Я уверен, что это потянет на отдельный проект по реверс инжинирингу.
Также я еще не написал, но в процессе исследования обновления прошивки стало понятно, что раздел прошивки 0x02 выполняется на отдельном ядре 8051. В него загружается прошивка и он запускается, но основной процессор никаких команд ему не отправляет. Т.е. похоже, что процессор есть, но не используется. И внутри скалера, скорее всего находится 5 ядер, а не 4.
Какие функции монитора я бы хотел добавить
Самое главное, что я хотел бы принести пользователям этого монитора - простота внесения изменений в функции монитора. Не один раз что-то поменять, а превратить процесс замены в простую игру доступную любому юзеру.
Идеи:
Поставить свою картинку вместо логотипа (несмотря на мое желание отключить логотип)
Сделать собственный дизайн меню и поставить свой шрифт. Вернем времена скинов для Winamp!
Сделать локализацию меню модулем.
Возможность записывать содержимое экрана в файл
Добавить встроенные игры (Тетрис, Doom, …)
Сделать функцию символьного терминала. Только текст. У монитора есть целых 2 OSD плана с размером знакоместа 12x18 px
Возможность добавлять модули написанные на языке Lua к прошивке. Или другой язык, интерпретатор которого можно
легкодобавить на процессор SPARCВыводить технические подробности видеосигнала, который подключен к монитору
Сделать прошивку с минимальным функционалом, но с возможностью загружать дополнительные модули по USB, в которых будет все остальное: цветовые профили, шрифты, языки и внешний вид меню, форма прицелов и многое другое. Пользователи смогут сами разрабатывать модули и добавлять их в монитор
<Ваши идеи?>
Я понимаю, что я могу оказаться единственным пользователем всех этих функций монитора, но это не требует много сил и см. выше - это интересно. :-)
Я планирую продолжить писать заметки об исследовании монитора, у меня сейчас уже материала больше чем я рассказал тут, но я хочу, чтобы читатели могли добраться до конца статьи.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.