ESP8266 Урок 3. Читаем прошивку ESP-01. Часть 2



В предыдущей части нашего урока мы подготовили инструменты для работы с прошивками ESP8266, а также считали всю FLASH-память модуля ESP-01.

 

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

Прежде, чем разделить наш файл на «куски», мы должны немного знать формат файла прошивки. Но, в принципе, нам даже не обязательно забивать этим голову. За нас разберётся с файлами утилита esptool. Только мы должны ей немного в этом помочь. Так как у нас с адреса 0x00000 прошивается загрузчик (как правило имя boot_vX.X.bin) — где X — версия загрузчика, то мы как раз сейчас и узнаем его длину и ещё некоторую информацию из нашего дампа. для этого дадим следующую команду

 

 

Утилите не важна физическая длина всего дампа, она берёт длину из заголовка файла, а заголовок относится только к загрузчику.

Мы видим здесь, что файл наш содержит 3 сегмента, известна их длина и смещение. Отсюда мы узнаем физическую длину нашей прошивки.

Нам важен последний сегмент. Так как он располагается с адреса 0xa60, а длина его 0x228, то найдём адрес его окончания в файле, а это 0xa60 + 0x228 = 0xC88.

Откроем наш дамп в HEX-редакторе (я пользуюсь WinHex, вы можете использовать другой по своему усмотрению)

 

 

Переместимся на адрес окончания сегмента и увидим там примерно такую картину

 

 

Мы видим, что на адресе 0xc88 дело не заканчивается, так как существует правило заполнения до адреса, кратного 16 минус один, нулями и заканчивается контрольной суммой, также по окончанию сегмента, есть ещё какая-то информация. Реальное окончание файла мы видим по двум «приметам». Это байт контрольной суммы — 79, который мы видели, когда читали с помощью утилиты esptool информацию о файле, а также то, что после данного байта память стёрта (так как у нас FLASH-память типа NAND, то стёртые участки заполнены единицами). Но второй случай бывает не всегда. У меня привычка стирать память полностью, прежде чем писать туда новую прошивку, но не у всех есть такая привычка. Поэтому пользуемся первым правилом — перемещаемся к вычисленному адресу окончания файла в дампе, и после него ищем файл контрольной суммы, тем более он всегда будет в конце строки.

 

 

В нашем случае мы теперь встаём на адрес 0xca0, следующий за байтом с контрольной суммой, и после него выделяем всю область памяти до конца дампа (в WinHex можно это сделать с помощью горячих клавиш Ctrl+Shift+End)

 

 

Теперь, когда у нас выделен ненужный блок памяти, жмём Delete на клавиатуре и соглашаемся с предупреждением

 

 

Теперь у нас в файле только загрузчик сохраняем его, например, под именем boot.bin.

У нас есть сохранённый загрузчик

 

 

Далее нам требуется вырезать из нашего дампа и сохранить основной файл прошивки. В официальных версиях он имеет имя типа userX.1024.new.2.bin.

Ещё раз откроем наш дамп в HEX-редакторе и удалим теперь участок до адреса 0x01000, так как по нашей схеме распределения файлов во FLASH-памяти файл userX.bin располагается именно с данного адреса. Выделяем участок от начала до адреса, предыдущего 0x01000, поэтому встаём на байт, расположенный по адресу 0xFFF и выделяем пространство от него назад до нулевого адреса (до начала). Нам может в этом помочь волшебная комбинация клавиш Ctrl+Shift+Home

 

 

Также удаляем выделенный фрагмент с помощью клавиши Delete и сохраняем наш обрезанный дамп, например, с именем temp.bin.

 

 

Теперь файл temp.bin является дампом прошивки, начинающимся с файла user. Поэтому исследуем теперь данный файл

 

 

Аналогичным образом мы также узнаём примерное окончание файла, сложив начало последнего сегмента с его длиной (0ч6936С), перемещаемся в HEX-редакторе на данный адрес

 

 

Сохраним наш отредактированный файл теперь под именем user.bin.

Осталось нам теперь найти и вырезать файл esp_init_data_default_vXX.bin. Файл blank.bin нам вырезать не требуется, так как он всегда одинаковый, а именно состоящий весь из байтов 0xFF, и также мы будем перед прошиванием файлов очищать полностью FLASH-память, вследствие чего у нас и так будет по всем адресам 0xFF.

Открываем опять в HEX-редакторе файл flash_esp01_full.bin и перемещаемся к адресу 0xFC000, по которому расположен данный файл, и аналогичным способом стираем всё до данного адреса

 

 

Теперь встаём на адрес 0x80 (в десятичном эквиваленте — 128) и удаляем всё с данного адреса до конца файла, так как именно такой размер всегда имеет файл esp_init_data_default, в котором хранятся все настройки по умолчанию. Останется у нас лишь вот это

 

 

Если вы не хотите, чтобы какая-то конфеденциальная информация (пароли точек доступа и прочее) сохранялись в этом файле, то перед тем, как считывать дамп из FLASH-памяти модуля, удалите сохранённые настройки с помощью соответствующих AT-команд.

Теперь сохраним наш файл под именем, например, esp_init_data_default.bin.

Зайдём в нашу папку, и, если нам все наши временные файлы не нужны, то удалим их, оставив только нужные

 

 

Теперь у нас есть сохранённая прошивка и мы её всегда можем вернуть в наш модуль.

Таким образом, на данном уроке мы начали работу с утилитой esptool, которая помогла нам сохранить программное обеспечение из модуля ESP, что может нам очень пригодиться в будущем для возврата модуля полностью в заводское первоначальное состояние. Также мы узнали, по каким адресам и какие файлы хранятся во FLASH-памяти модуля ESP.

Всем спасибо за внимание!

 

 

Предыдущая часть Программирование МК ESP8266 Следующий урок

 

 

Различные модули ЕSP8266 можно приобрести здесь Модули ЕSP8266

Переходник USB to TTL можно приобрести здесь ftdi ft232rl

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

ESP8266 Читаем прошивку

3 комментария на “ESP8266 Урок 3. Читаем прошивку ESP-01. Часть 2
  1. Пытаюсь повторить описанное на wemos d1 mini. Стоит 4 мбайта памяти в нем, т.е 32 мбита… В даташите, где прописана организация памяти, есть два варианта 512+512 и 1024+1024. О чем речь, в чем разница и как понять какая схема используется?

    • анатолий:

      У вас организация 512+512 ЕСЛИ 32. Если 32-С1, то будет 1024+1024.

    • Сергей СПБ:

      Берём за основу 32mbit (512+512). Это в логе будет, который при подсоединении к модулю на скорости 74880 выдаст при старте. Скорость задавать руками в настройках, выбрать Custom и написать 74880.
      См. первый урок, там есть кусок этого лога, но ничего про него не сказано, как его увидеть, я в других уроках подсмотрел.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*