Для чего нужны файлы boot_app0.bin и bootloader_dio_80m.bin? (ESP32 - IDE Arduino)

Команда ESP32 flash, выполняемая IDE Arduino, по-видимому, запускает два файла загрузчика: по смещению и по смещению. Интересно, что на самом деле делают эти два файла загрузчика и почему их два. Ниже я привожу дополнительную информацию.

1. Контекст

Я часть команды, разрабатывающей новую бесплатную среду IDE для микроконтроллеров: Embeetle IDE. В ближайшем будущем мы планируем поддержать семейство микроконтроллеров ESP32. Поэтому сейчас я изучаю систему сборки ESP32 - как ESP-IDF инструмент и подход Arduino IDE к проектам ESP32.

2. Процедура прошивки Arduino IDE для проектов ESP32.

После создания .elf файла, IDE Arduino запускает команду для преобразования его в двоичный файл:

      python esptool.py --chip esp32 elf2image
                  --flash_mode dio
                  --flash_freq 80m
                  --flash_size 4MB
                  -o /tmp/arduino_build_852524/WiFiScan.ino.bin
                  /tmp/arduino_build_852524/WiFiScan.ino.elf

Наконец, это WiFiScan.ino.bin файл записывается на плату вместе с двумя файлами загрузчика и таблицей разделов:

      python esptool.py --chip esp32
                  --port /dev/ttyUSB0
                  --baud 921600
                  --before default_reset
                  --after hard_reset write_flash
                  -z
                  --flash_mode dio
                  --flash_freq 80m
                  --flash_size detect
                  0xe000  ~/.arduino15/packages/esp32/hardware/esp32/1.0.6/tools/partitions/boot_app0.bin
                  0x1000  ~/.arduino15/packages/esp32/hardware/esp32/1.0.6/tools/sdk/bin/bootloader_dio_80m.bin
                  0x10000 /tmp/arduino_build_852524/WiFiScan.ino.bin
                  0x8000  /tmp/arduino_build_852524/WiFiScan.ino.partitions.bin

Таблица разделов по умолчанию, используемая Arduino IDE, выглядит следующим образом (в формате csv):

      # Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x5000,
otadata,  data, ota,     0xe000,  0x2000,
app0,     app,  ota_0,   0x10000, 0x140000,
app1,     app,  ota_1,   0x150000,0x140000,
spiffs,   data, spiffs,  0x290000,0x170000,

Двоичный эквивалент этого csv-файла мигает по адресу 0x8000. Также есть два файла загрузчика, которые прошиваются по адресам. 0xe000 и соответственно (см. следующий абзац).

3. Файлы загрузчика

Прошиваются два файла загрузчика:

      # flashed at 0xe000
~/.arduino15/packages/esp32/hardware/esp32/1.0.6/tools/partitions/boot_app0.bin

а также:

      # flashed at 0x1000
~/.arduino15/packages/esp32/hardware/esp32/1.0.6/tools/sdk/bin/bootloader_dio_80m.bin

Вопрос 1: что делают эти два файла загрузчика?

Также интересно наблюдать за их местонахождением. Первый, boot_app0.bin находится в папке с именем 'partitions'. Он находится рядом с несколькими перегородками. .csvфайлы. Почему? Но, может быть, это станет ясно, когда ответят на вопрос 1.

Другой, bootloader_dio_80m.bin находится в папке с именем 'sdk/bin/' и находится рядом с другими файлами, имена которых начинаются с 'bootloader_' приставка:

Вопрос 2: Насчет прошитого файла загрузчика по адресу 0x1000, Я думаю '_40m' а также '_80m'суффиксы обозначают скорость вспышки в МГц. Но я понятия не имею, что за '_dio', '_dout' а также '_qout' суффиксы обозначают.

Пожалуйста, просветите меня ^_^

1 ответ

Бинарный файл по адресу 0x1000 является загрузчиком. Arduino ESP32 имеет двоичные файлы загрузчика, соответствующие параметрам плат в меню «Инструменты» в Arduino IDE (построены из файлаboards.txt).

Функции загрузчика описаны здесь .

Загрузчик программного обеспечения ESP-IDF выполняет следующие функции:

  • Минимальная начальная конфигурация внутренних модулей;
  • Инициализировать функции Flash Encryption и / или Secure, если они настроены;
  • Выберите раздел приложения для загрузки на основе таблицы разделов и ota_data (если есть);
  • Загрузите этот образ в RAM (IRAM и DRAM) и передайте ему управление.

Boot_app0.bin - это исходное содержимое раздела данных OTA. Это задокументировано здесь .

Раздел данных OTA представляет собой два флеш-сектора (0x2000 байт) размером, чтобы предотвратить проблемы в случае сбоя питания во время записи. Секторы независимо стираются и записываются с совпадающими данными, и если они не совпадают, используется поле счетчика, чтобы определить, какой сектор был записан позже.

DIO, QIO, DOUT, QOUT - это режимы SPI для флэш-памяти. Разные модули esp32 имеют разные микросхемы флеш-памяти и способы их подключения. (D - двойной, Q - четверной)

Другие вопросы по тегам