В предыдущей части нашего урока мы подготовили инструменты для работы с прошивками 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 Следующий урок
Модуль ESP NodeMCU можно купить здесь: Модуль ESP NodeMCU
Различные модули ЕSP8266 можно приобрести здесь Модули ЕSP8266
Переходник USB to TTL можно приобрести здесь ftdi ft232rl
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
Пытаюсь повторить описанное на wemos d1 mini. Стоит 4 мбайта памяти в нем, т.е 32 мбита… В даташите, где прописана организация памяти, есть два варианта 512+512 и 1024+1024. О чем речь, в чем разница и как понять какая схема используется?
У вас организация 512+512 ЕСЛИ 32. Если 32-С1, то будет 1024+1024.
Берём за основу 32mbit (512+512). Это в логе будет, который при подсоединении к модулю на скорости 74880 выдаст при старте. Скорость задавать руками в настройках, выбрать Custom и написать 74880.
См. первый урок, там есть кусок этого лога, но ничего про него не сказано, как его увидеть, я в других уроках подсмотрел.