Мультиконтроллер что это такое
Что из себя представляет мультиконтроллер ноутбука?
С данным словом большинство пользователей впервые сталкиваются после того, как их ноутбук перестает включаться или с ним наблюдаются какие – либо проблемы, вынуждающие обратиться в сервисный центр. Вердикт – замена мультиконтроллера, является достаточно распространенной поломкой материнской платы ноутбука. Вот только далеко не каждый представляет что это такое и как он выглядит.
В данной статье мы подробно разберем понятие мультиконтроллера на материнской плате ноутбука, его предназначение и причины выхода из строя.
Как выглядит?
Мультиконтроллер на плате ноутбука представлен в виде небольшой квадратной микросхемы, на каждой стороне которой можно наблюдать расположенные подряд контактные ножки.
Вид мультиконтроллера на плате ноутбука
Функциональное назначение
Основной задачей первых мультиконтроллеров был контроль и управление сигналами с клавиатуры. Несмотря на то, что на схемах до сих пор он обозначается как KBC (расшифровывается keyboard controller), перечень его обязанностей давно значительно расширился.
Теперь он играет важную роль при включении ноутбука, так как именно мультиконтроллер принимает сигнал от кнопки включения и передает управляющий сигнал на дальнейший запуск материнской платы.
В зависимости от модели и производителя мультиконтроллера его некоторые остальные функции могут различаться. Среди них могут быть:
Симптомы неисправности
Стоит учесть, что данные симптомы не гарантируют 100% – ой поломки мультиконтроллера, а лишь включают его в список потенциальных подозреваемых компонентов ноутбука.
Причины выхода из строя
Среди самых распространенных можно отметить:
Диагностика и неисправности мультиконтроллера в ноутбуке
В этой статье пойдет речь о микросхеме, которая управляет работой всего ноутбука, в том числе, его включением. Её неисправности приводят к значительным последствиям для пользователя и чаще всего требуют ремонта материнской платы в сервисе.
Задачи мультиконтроллера
Мультиконтроллером, или, по-английски Super I/O (SIO) или Multi I/O (MIO), на сленге «мультик» (еще в документации встречается EC-контроллер), называется микросхема, обеспечивающая мониторинг напряжений и температур, работу с периферийными устройствами. Такими устройствами могут быть клавиатура, мышь, кнопка включения, датчик закрытия крышки и тп. Основным его предназначением является управление клавиатурой (даже в схемах он обозначается как KBC-контроллер), однако со временем производители начали нагружать его множеством дополнительных функций, таких, например, как индикация работы жесткого диска (светодиод на передней панели ноутбука) или управление частотой работы кулера. Именно на эту микросхему «приходят» все контактные дорожки шлейфа клавиатуры ноутбука. На самом деле на ножки мультиконтроллера приходят сигналы практически со всех устройств и микросхем ноутбука. Уровень сигнала может быть постоянный 3.3V (высокий логический уровень), либо изменяющийся в случае обмена данными (измеряется осциллографом).
В запуске ноутбука он вообще играет первостепенную роль, так как именно на него приходит сигнал с кнопки включения, и именно он запускает все источники напряжений и затем отдает сигнал южному мосту для начала инициализации.
Мультиконтроллер управляет включением ШИМ-контроллеров, вырабатывающих необходимые для работы узлов ноутбука напряжения, ключами, коммутирующими эти напряжения. Через мультиконтроллер по протоколу Firmware HUB или SPI подключена микросхема Flash c программным обеспечением (которую иногда приходятся прошивать). В состав мультиконтроллера могут входить контроллеры часов реального времени, жестких дисков, USB, интегрированный аудиоинтерфейс, интерфейс LPC.
Разновидности мультиконтроллеров
Мультиконтроллеры выпускают следующие фирмы: ENE; Winbond; Nuvoton; SMCS; ITE; Ricoh.
Сильно отличаются только последние, хотя бы методом пайки, они BGA.
На современных мультиконтроллерах имеется по 128 ножек, но их назначение сильно отличатся в зависимости от модели мультиконтроллера и даже от его ревизии. К примеру, KB926QF-D2 и KB926QF-C0. — два совершенно разных мультиконтроллера.
Неисправности мультиконтроллеров и их симптомы
Мультиконтроллер часто выходит из строя при залитии ноутбука жидкостью или вследствие выгорания ключей, формирующих 3.3В. Второе случается при скачках питания в сети.
К основным симптомам неисправности мультиконтроллера можно отнести некорректную работу клавиатуры и тачпада и отсутствие запуска как такого. Также, следствием неправильной работы «мультика» являются и глюки периферии — неправильная работа датчиков, кулера. Также по вине SIO может не определяться жесткий диск и другие накопители (работа USB при этом завязана на южный мост).
В диагностике и ремонте ноутбуков мультиконтроллер имеет ключевое значение, поскольку отсутствие на мультиконтроллере важных сигналов, приходящих с микросхем ноутбука, позволяет выявить неисправные микросхемы и произвести их замену. На мультиконтроллер приходит LPC шина, по который идет обмен с южным мостом, и с которой можно считать всем известные POST-коды. Для этого, кстати, в ремонте часто подпаиваются на прямую к ножкам мультиконтроллера тоненькими проводками и выводят коды на индикаторы.
Также иногда во время самостоятельной замены матрицы ноутбука забывают отключить аккумулятор. Это тоже может привести к выгоранию мультиконтроллера. Но, к счастью, микросхемы эти не очень дорогие и ремонт такой неисправности обходится дешевле, чем, например, замена южного моста или видео. Многие микросхемы взаимозаменяемы, а перепайка их — 15 минут (если не потребуется прошивать флэш память).
Диагностика запуска (или отсутствия старта) ноутбука
Для правильной диагностики старта ноутбука необходимо понимать его последовательность и участие в нем мультиконтроллера.
Последовательность включения ноутбука
При включении ноутбука дежурное напряжение через кнопку подается на мультиконтроллер, который запускает все ШИМ-контроллеры, вырабатывающие все напряжения (их много), и, при нормальном исходе, вырабатывают сигнал PowerGood. По этому сигналу снимается сигнал RESET с процессора и он начинает выполнять программный код, записанный в BIOS с адресом FFFF 0000.
Затем BIOS запускает POST (Power-On Self Test), который выполняет обнаружение и самотестирование системы. Во время самотестирования обнаруживается и инициализируется видеочип, включается подсветка, определяется тип процессора. Из данных BIOS определяется его тактовая частота, множитель, настройки. Затем определяется тип памяти, ее объем, проводится ее тестирование. После этого происходит обнаружение, инициализация и проверка подключенных накопителей – привода, жесткого диска, карт-ридера, флоппи дисковода и др., а после проверка и тестирование дополнительных устройств.
После завершения POST управление передается загрузчику операционной системы на жестком диске, который и загружает ее ядро.
Из описания выше видно, что мультиконтроллер вступает в работу на самой ранней стадии, и без его нормального запуска не сформируются управляющие напряжения. Вот условия, необходимые для того, чтобы мультиконтроллер дал команду на старт:
Для инициализации мультиконтроллера необходима микропрограмма, которая хранится либо в той же микросхеме флеш-памяти, что и прошивка BIOS (UEFI), либо в отдельной микросхеме меньшего объема, либо внутри самого мультиконтроллера. В первых двух случаях восстановить прошивку не представляется сложным. А вот прошить непосредственно мультиконтроллер пока могут не любые программаторы. Да и подключиться к нужным его выводам не всегда просто. Прошиваемые мультиконтроллеры — NPCE288N/388N, KB9010/9012/9016/9022, IT8585/8586/8587/8985/8987.
Лучше всего найти документацию и описание сигналов по мультикам IT, которые используются во многих бюджетных ноутбуках, в том числе ASUS и Dell. Благодаря схемам можно понять и отследить, где находятся выше указанные сигналы. Например, в случае IT8752 и аналогичных (используется, например, в семействе ASUS K40 и K50) для диагностики вас должны интересовать, помимо выше указанных, следующие сигналы на мультике:
Питание на IT85xx мульты поступает следующее: +3VA_EC, +3VPLL, +3VACC, без них микросхема не запустится.
Последовательность диагностики мультиконтроллера
Рассмотрим схему последовательности включения ноутбука:
Процедура включения материнской платы
Для диагностики в целом, вам нужно рассмотреть две ситуации:
1. Питание не появляется, светодиод питания не горит.
2. Питание есть, светодиод питания горит, но ноутбук не включается, экран темный. Индикатор жесткого диска сначала включается и гаснет, затем не горит.
Очевидно, мультик работает, управляющие сигналы формируются, однако, дальнейший запуска не происходит или он обрывается. Чаще всего виноваты в этом микросхемы чипсета, сам процессор или тактирующие генераторы, которые срывают генерацию сигналов. Для быстрой диагностики прогреваем микросхемы чипсета по-очереди. После каждого прогрева пробуем на включение. Если ноутбук включается, то виноват конкретный чип. Очень важна предыстория поломки — например, если до поломки перестали работать USB порты, то скорее всего вышел из строя южный мост. Если были артефакты на встроенном видео, то виноват северный мост.
Если же мы видим, что питающие напряжения присутствие, а сигналы с мультика нет (например, не снимается сигналы RESET), то изучаем все сигналы более подробно.
Вот обобщенный порядок следования сигналов при запуске EC:
2в или ACIN_OC#=0в
вычитка прошивки SPI ROM
-> сигнал включения силовых дежурок VSUS_ON=3в
-> снятие ресета с юга PM_RSMRST#=3в (юг узнает, что первичные источники питания ок)
-> сигнал PM_PWRBTN#=0в транслируется в юг
-> SUSB_EC#, SUSC_EC# = 3в включение вторичных источников и открытие коммут. мосфетов
-> CPU_VRON=3в поднятие питания CPU_VCORE процессора
-> EC_CLK_EN (CLK_EN#) на юг или на тактовый генератор приходит с мульта или ШИМ проца
-> VRM_PWRGD_CLKEN приходит на юг
-> CLK_PWRGD с юга приходит на тактовый генератор
-> сигнал PWROK на юг
-> юг отдает процу сигнал H_PWRGD (HardWare PWRGD, все питания в порядке, следующий этап инициализации)
-> юг снимает ресет с севера PLT_RST#
-> юг снимает ресет с PCI шины PCI_RST#
-> север снимает ресет с процессора HCPU_RST#
Вот алгоритм проверки популярного мульта KB3926, его можно применить и к аналогам:
Вот дополнительные контрольные значения напряжения:
DPWROK_R — 3,3V
PM_RSMRST#PCH — 3,3V
PM_RSMRST#- 3,3V
SUS_PWRGD — 3,3V
5VSUS_PWRGD — 3,3V
ME_SUSPWRDNACK_R — 3.3V
Как видно из алгоритма, в самом начале EC контроллер должен вычитать прошивку из Flash памяти через SPI интерфейс. Если этого не происходит, то дальше никаких сигналов питания ШИМов не формируется. Часто, в случае серии IT85xx и аналогичных это отдельня 8-контактная микросхема (напримерб SST25VF080B) с питанием по линии +3VA_SPI. Обмен данными происходит по линия SO и SI, тактирование по линии SCK. Поэтому, когда это возможно, флэшку перешивают. В некоторых сервисах имеется специальный программатор от Сергея Вертьянова, который позволяет прошивать почти любые флэшки:
Программатор от Сергея Вертьянова
Был ли наш пост полезен?
Нажмите на звезду, чтобы оценить мои труды!
Встроенный контроллер одного ноутбука и его наследство
В этом материале я хочу немного рассказать о том, что происходит во встроенном контроллере (Embedded Controller, EC) моего ноутбука. Речь идёт о мультиконтроллере IT8586E, основанном на Intel 8051. Он встроен в ноутбук Lenovo Ideapad 310-15IKB. Но, прежде чем переходить к деталям, полагаю, нелишним будет поговорить о том, что это вообще такое — встроенные контроллеры.
Краткая история встроенных контроллеров на платформах x86
Сначала был создан компьютер IBM PC. Многих это возмутило, данный шаг компании IBM был широко признан неразумным.
В материнскую плату этого компьютера было встроено множество периферийных устройств, вроде Intel 8259 (программируемый контроллер прерываний) или Intel 8253 (программируемый таймер). Обращаться к этим контроллерам можно было, пользуясь инструкциями in/out ядра x86 (и, на самом деле, к контроллерам 8259 и 8253 всё ещё можно обращаться на современных x86-процессоров, но теперь они входят в состав кристалла CPU). Один из контроллеров IBM PC, Intel 8255 (программируемый контроллер интерфейса периферийных устройств), отвечал за взаимодействие с клавиатурой.
Где-то в конце 1980-х периферийные устройства всё чаще и чаще объединяли, включая в состав одной микросхемы несколько таких устройств. Например — это чипы северного моста и южного моста. Один из таких чипов, Super I/O-контроллер, отвечал за взаимодействие с низкоскоростными устройствами, вроде последовательных портов, параллельных портов и контроллеров дисководов гибких дисков. В состав этого чипа часто входил и контроллер клавиатуры.
Ноутбукам, кроме прочего, требовалась особая система управления питанием. Производители портативных компьютеров взглянули на контроллер клавиатуры, на то, что он способен перезагружать компьютер, и сказали: «На самом деле — это замечательно. Давайте сделаем то, что нам нужно, по похожей схеме». В результате к контроллеру клавиатуры были добавлены два порта с похожим интерфейсом, позволяющим отправлять на устройства команды и получать от них данные. И, фактически, во многих платформах эта возможность реализована в том же самом контроллере, который входит в состав Super I/O-чипа.
В середине 1990-х заметным явлением стал стандарт ACPI (Advanced Configuration and Power Interface, усовершенствованный интерфейс управления конфигурацией и питанием). Он определял стандартизированный интерфейс для EC. А именно, через его командный интерфейс можно было обращаться к 8-битному адресному пространству переменных, определяемых производителями оборудования. Эти переменные можно было описывать с помощью языка AML (ACPI Machine Language), средствами AML можно было описывать и код, позволяющий воздействовать на эти переменные.
В конце 2000-х годов микросхемы южного и северного мостов были объединены с CPU. Правда, надо отметить, что интеграция южного моста (PCH, Platform Controller Hub) в CPU, по всей видимости, имеет место лишь на мобильных платформах. Но в ноутбуках EC всё ещё представлен отдельным чипом, который, кроме того, реализует функционал Super I/O-контроллера и контроллера клавиатуры. Он, например, решает следующие задачи:
Схема материнской платы моего ноутбука
Так как EC интенсивно взаимодействует с разными устройствами — неплохо было бы знать о том, что это за устройства. Мне в решении этой задачи повезло — кто-то выложил в интернет так называемые boardview-файлы к интересующей меня плате. В таких файлах содержатся схемы печатных плат, в частности, сведения о компонентах, расположенных на плате, и о том, как они связаны. Между компонентами материнских плат имеется так много соединений, что анализ схемы их связей может оказаться весьма сложной задачей. Я попытался представить связи между компонентами платы в упрощённой форме, результат моих трудов показан на следующей схеме (тут нет большинства линий, имеющих отношение к питанию).
Схема связей компонентов платы (оригинал)
CPU соединён с EC с использованием шины LPC (Low Pin Count), которая, по сути, представляет собой замену шины ISA, применявшейся в более старых компьютерах, в физической реализации которой используется меньше линий связи. Процессор и контроллер взаимодействуют, в основном, по LPC. Но между EC и CPU имеется множество соединений (показанных синими линиями без стрелок), используемых в особых целях. Например — это линия SCI, предназначенная для вызова прерывания от EC в CPU.
Прошивка EC
Раздобыть прошивку контроллера несложно. Я уже извлекал образ BIOS раньше, для других нужд. После его обработки с помощью утилиты cpu_rec в моём распоряжении оказалось примерно 160 Кб 8051-кода из самого начала образа, расположенного до кода, имеющего отношения к UEFI. Контроллер 8051 имеет 16-битное адресное пространство, а значит 160 Кб кода ему не соответствуют. Получается, что речь идёт о так называемой banked-прошивке. То есть — одни части («блоки» или «банки») прошивки в адресном пространстве подвергаются динамической замене на другие части путём воздействия на некие регистры.
Размеры блоков прошивки обычно, в большинстве контроллеров 8051, составляют либо 32, либо 64 Кб. Выяснить их размер при работе с конкретным контроллером можно, поискав повторяющиеся фрагменты кода. Дело в том, что в разных блоках прошивки обычно имеются одинаковые фрагменты, представляющие код общего назначения (быстро найти такие фрагменты можно попробовать, прибегнув к автокорреляции). Оказалось, что в моём случае речь идёт о блоках кода размером 32 Кб.
После того, как я всё это выяснил, меня посетила блестящая идея, которая заключалась в том, чтобы посмотреть даташит исследуемого компонента. Даташит на мой контроллер найти не удалось, но мне попались документы на IT8502E, описывающие устройство достаточно близкое к тому, которое было у меня. В нём, что было очень кстати, подробно описывалось большинство I/O-механизмов и, похоже, описание функционирования прошивки, в основном, соответствовало той прошивке, что была у меня.
При просмотре даташита я наткнулся на упоминание отладочного интерфейса I2C, но он, правда, не был документирован. После некоторых изысканий я нашёл проект ECSpy, который представляет собой Rust-реализацию отладчика для EC, созданную силами компании System76, которая работает над собственной прошивкой для EC.
Отладчик даёт доступ на чтение и запись к оперативной памяти и регистрам ввода/вывода EC. Доступ к регистрам отличается дополнительным ограничением, которое заключается в том, что операция записи чётко определена лишь для триггерных регистров (в результате, например, операция, вызывающая изменение состояния конечного автомата, не сработает).
Ещё в даташите сказано, что возможность отладки нужно включать с помощью регистра, но она и так включена. Доступ к ней осуществляется посредством I/O-портов x86 через Super I/O-чип, поэтому ей можно пользоваться из пользовательского пространства, без необходимости писать драйвер.
Для реверс-инжиниринга тех частей прошивки, которые отвечают за взаимодействие с различными устройствами, могут пригодиться спецификации этих устройств. Я, работая над этим проектом, прочитал часть спецификаций ACPI, SMBus и Smart Battery. В процессе исследования кода прошивки используются следующие ресурсы и инструменты: boardview-файлы, даташиты, спецификации компонентов, отладчик Ghidra, обычный браузер, применяемый для поиска дополнительных сведений вроде скан-кодов, исходный код Linux-драйвера для EC, дизассемблированный машинный ACPI-код, отладчик для EC и его исходный код. В таких делах весьма кстати могут оказаться несколько мониторов, использование которых позволяет ускорить сопоставление информации, полученной из разных источников.
Большой объём работы выполняется в коде главного цикла, ответственном за обработку событий таймера. Таймер в EC запрограммирован так, что он выдаёт прерывание раз в одну миллисекунду. Потом, на основе прерываний таймера, формируются события, которые происходят, например, каждые 10, 50, 100 мс. Обновление ACPI-переменных выполняется, в основном, в этом контексте.
POST-карты в современных ноутбуках
Затем, вместе с тактовыми импульсами, осуществляется последовательный вывод результирующего значения на GPIO-пины.
Вышеприведённая поисковая таблица может показаться вам знакомой. Дело в том, что она позволяет преобразовывать полубайты в шестнадцатеричные числа для их вывода на 7-сегментном дисплее. Если взглянуть на схему материнской платы, там можно увидеть две линии — EC_TX и EC_RX (эти названия, вероятно, не очень удачны, так как одна из них — это линия данных, а другая — тактовая линия, обе они используются лишь для отправки данных). Они ведут к Wi-Fi-чипу, который подключён к плате через разъём M.2. Но эти линии, на самом деле, ни к чему на Wi-Fi-карте не присоединены.
Это наводит на мысль о том, что существуют некие POST-платы, которые можно подключать к разъёму M.2 для решения проблем, возникающих в ходе загрузки ноутбуков. Так как я знаком с протоколом обмена данными, используемым в M.2-картах, я попытался сделать собственный вариант такой платы (она, в целом, представляет собой два последовательно соединённых сдвиговых регистра, подключённых к 7-сегментным дисплеям). Посмотрите — какая симпатичная у меня получилась штука.
Самодельная POST-плата для разъёма M.2
Но я, к сожалению, видимо что-то напутал, так как эта плата, в итоге, так и не заработала, а мне не очень-то хотелось тратить время на поиск и исправление ошибок, допущенных при её создании.
Клавиатурные механизмы
Можно подумать, что вышеописанная задача решается очень легко, что заключается она в просмотре некоей поисковой таблицы и в отправке хосту результатов. Но, увы, скан-коды PS/2 — это настоящий бардак.
Существует три различных набора скан-кодов, между которыми нет ничего общего. EC использует набор №2. Одиночное нажатие и отпускание клавиши не всегда приводит к генерированию одного байта скан-кода.
Если промежуточное значение меньше 0x80, это значит, что оно просто соответствует обычному однобайтовому PS/2 скан-коду. А если говорить о других значениях, то они, по уже рассмотренной нами схеме, используются в роли индексов в поисковой таблице. Результирующее значение определяет функцию, которая используется для обработки скан-кода. Полученные скан-коды затем помещают в 16-байтовый кольцевой буфер, байты, содержащиеся в котором, если это возможно, потом отправляют хосту.
Таинственный фрагмент кода
Зачем встроенному контроллеру SHA-1? Если посмотреть на то, что именно вызывает SHA1-код, то окажется, что он используется при взаимодействии с батареей по SMBus:
Где хранится код?
Во многих прошивках для 8051 обычно имеется код, реализующий возможности отладки, и мой — не исключение. Перед функциями, имеющими отношение к контроллеру клавиатуры и к EC, имеется множество функций, которые явно реализуют отладочные возможности. Одна из них — это команда контроллера клавиатуры, предназначенная для чтения из EC данных с адресов флеш-памяти с применением регистра.
Если сделать оттуда дамп прошивки, то получится образ, который отличается от оригинала. Изначально я предполагал, что EC использует образ из флеш-памяти BIOS, так как он хранится в этой памяти, и EC к этой памяти подключён. Но оказалось, что это, на самом деле, не так. К этой памяти напрямую подключены и CPU, и EC. В результате, в том случае, если и тот и другой одновременно попытаются прочесть из неё данные, на шине неизбежно возникнет конфликт. Прошивка, на самом деле, хранится в самом EC. В IT8502 этой возможности не было (это запутало меня ещё сильнее, так как я пользовался даташитом именно для такого контроллера).
Запуск моего собственного кода в EC
Вероятно, стоит сказать о том, что у 8051 имеется некоторое количество различных адресных пространств:
Я этого делать не собирался, так как подобные действия несут в себе риск «окирпичивания» устройства. EC можно перепрограммировать, используя входы/выходы клавиатурной матрицы в роли параллельного порта, но я не собирался заниматься и этим.
Ещё одна проблема, связанная с записью данных во флеш-память, заключается в том, что её содержимое проверяется с использованием контрольной суммы. В прошивке имеется сигнатура, которая указывает на то, где начинается контрольная сумма, и в ней имеются два байта, которые различаются в разных редакциях прошивки. Подобное характерно для контрольных сумм. Если дело обстоит именно так — то неясно, где именно начинается и заканчивается контрольная сумма, и то, как именно она вычисляется.
Правда, для выполнения собственного кода нет нужды выполнять запись данных во флеш-память. В EC для этого имеется другой механизм. А именно — адреса 0x0000-0x1000 в адресном пространстве XDATA — это обычная оперативная память, которую можно отобразить на произвольную область адресного пространства CODE, изменив содержимое кое-каких регистров.
Схема из даташита, на которой показано 5 областей, пронумерованных от 0 до 4, которые могут быть отображены на адресное пространство кода. А именно, речь идёт об областях 0x0000-0x0800, 0x0800-0x0c00, 0x0c00-0x0e00, 0x0e00-0x0f00 и 0x0f00-0x1000
В результате для выполнения собственного кода достаточно лишь выполнить отображение одного из этих фрагментов на память с кодом. Оперативная память в диапазоне 0x0000-0x0e00 используется самой прошивкой, в результате остаются блоки 3 и 4, размер каждого из которых составляет 256 байт.
Правда, чтобы осуществить отображение этой памяти на память с кодом, нужно выполнить запись в регистры и в оперативную память из пространства XDATA. Есть одна отладочная функция, позволяющая писать данные в XDATA, но она содержит ошибки и может писать данные только по адресам, где байт из верхней части адреса является таким же, как и байт из его нижней части. Тут имеется ещё и интерфейс I2C, который достаточно хорошо подходит для решения задачи записи данных в SRAM.
Я сомневался по поводу записи данных в порты ввода/вывода, так как было сказано, что это подходит лишь для триггерных регистров. Но в регистрах, используемых для отображения памяти, имеется ещё и бит для запуска DMA-транзакции (так как этот чип, конечно, поддерживает DMA). В любом случае, не было способа проверить то, что отображение памяти осуществляется именно так, как мне нужно, так как нет отладочной функции, позволяющей читать данные из адресного пространства CODE.
К счастью, был и другой путь: функционал отображения памяти используется для перезаписи флеш-памяти (так как никто не заинтересован в том, чтобы работа программы завершилась бы с ошибкой, когда будет достигнута область с кодом, выполняющим запись данных). Используя I2C можно отредактировать содержимое SRAM в адресном пространстве XDATA, поместив туда отладочный код, и подстроить механизм записи данных во флеш-память так, чтобы он обращался бы к этому отладочному коду.
В любом случае, эту проблему легко обойти, так как между адресами, всё равно, имеется взаимно однозначное соответствие, а значит — код можно просто записать в те места пространства XDATA, которые будут соответствовать нужным местам памяти. Оказалось, что I2C-запись в регистры, отвечающие за отображение памяти, тоже работает. В результате для выполнения отладочного кода с его последующей записью мне не нужно было бы прибегать к режиму перезаписи флеш-памяти.
Итоги
На сегодня это всё, а в следующий раз я расскажу об исследовании прошивки ноутбучного Wi-Fi-модуля (RTL8821AE) и о разработке небольшого кейлоггера, основанного исключительно на возможностях Intel 8051.
Занимались ли вы разработкой прошивок для контроллеров, основанных на Intel 8051?