Любители реверс-инжиниринга просто не могли обойти стороной столь популярный стимулятор ET-312. Всестороннему исследованию со стороны американских инженеров подверглась не только схема прибора, но и микропрограмма контроллера. Благодаря им, например для целей ремонта ET-312, можно взять чистый ATmega16A и залить в него рабочую прошивку.
Прошивка микроконтроллера ET-312 разделена на две части: основную программу и загрузчик (Bootloader). Загрузчик занимает последние 512 байт (256 слов) памяти и служит для самостоятельного обновления пользователем основной программы через кабель сопряжения ET-312 с компьютером (см. кабель ErosLink для ET-312B под лупой).
Про штатное обновление прошивки, в том случае, когда есть рабочий прибор, читайте в статье «Обновление прошивки в ET-312».
Примечание
Возможность самостоятельного обновления прошивок стала доступна в приборах ET-312 с установленной прошивкой не ниже 1.4. Последняя актуальна версия прошивки 1.6.
Для защиты от реверс-инжиниринга, производитель распространяет файлы обновления (расширение .upg) в закодированном виде. Bootloader налету декодирует прошивку, проверяет контрольную сумму, заменяет новой прошивкой старую в памяти микроконтроллера.
В архиве, который можно скачать внизу статьи, лежит файл дампа только бутлоадера и дамп бутлоадера вместе с прошивкой версии 1.6. Если ваша среда разработки требует HEX-формат, то пригодится утилита перевода BIN в HEX (скачать IHEX_Convertor).
Перед заливкой бутлоадера в микроконтроллер, в обязательном порядке следует поправить байт 0x3fff. Назначение этого байта – хранение калибровочного значения внутреннего RC-генератора для работы на частоте 8 МГц.

Значения будут отличаться для разных микроконтроллеров даже в пределах одной партии. Бутлоадер при запуске считывает байт 0x3fff и копирует его в регистр OSCCAL. Если значение неточно, могут возникнуть различные сбои, связанные с синхронизацией, прерываниями и последовательной связью.

Заводское калибровочное значение для частоты 8 МГц хранится в четвертом байте строки сигнатуры ATmega16A. Значение этого байта следует скопировать в 0x3fff дампа прошивки и после этого можно залить дамп в микроконтроллер.

Микроконтроллер ATmega16A в ET-312 прошит на заводе с установленными фьюзами блокировки доступа к считыванию памяти и запрета отладки. Сделано это для защиты от «воровства» прошивки.
Скриншот ниже показывает, какие фьюзы установлены на заводе.

Примечание
На физическом уровне «прожжённая» перемычка, т.е. ноль, соответствует установленному фьюзу. В интерфейсах различных программ для прошивки установленная галочка может означать как включенный, так и выключенный фьюз. Логику интерфейса обязательно следует уточнить. На скриншотах выше, установленная галочка означает – 0, а снятая – 1.
Справочная информация по фьюзам
BODLEVEL = 0 | Порог монитора питания = 4.0 В. |
BODEN = 0 | Монитор питания включен. |
SUT1 = 1 SUT0 = 0 |
Время старта после подачи питания или сброса 64 мс. |
CKSEL3 = 0 CKSEL2 = 1 CKSEL1 = 0 CKSEL0 = 0 |
Работа от встроенного RC генератора на 8 МГц. |
OCDEN = 1 | Работа схемы внутреннего отладчика запрещена. |
JTAGEN = 1 | Работа интерфейса программирования-отладки JTAG запрещена. |
SPIEN = 0 | Работа интерфейса внутрисхемного программирования по SPI разрешена. |
CKOPT = 1 | Определяет режим работы встроенного генератора тактовой частоты для работы с кварцевыми резонаторами. В схеме ET-312 кварцевый резонатор отсутствует. |
EESAVE = 1 | При стирании памяти микроконтроллера программатором, содержимое EEPROM будет также стираться. |
BOOTSZ1 = 1 BOOTSZ0 = 0 |
Размер загрузчика 256 слов. |
BOOTRST = 0 | Переход к загрузчику после сброса. |
BLB12 = 1 BLB11 = 0 |
Уровень доступа из секции прикладной программы к коду в секции загрузчика. Команда SPM не может писать по адресам, находящимся в пределах секции загрузчика. |
BLB02 = 1 BLB01 = 1 |
Уровень доступа из секции загрузчика к коду в секции прикладной программы. Нет никаких ограничений по доступу к коду, расположенному в секции прикладной программы. |
LB2 = 0 LB1 = 0 |
Запрещены запись и чтение FLASH и EEPROM программатором. Также запрещено изменение конфигурационных ячеек. |
Скачать загрузчик и микропрограмму 1.6
В дальнейшем планируются статьи:
- Прошивка ET-312. Декодирование
- Прошивка ET-312. Модификация