ESP8266 Формат данных прошивки, протокол обмена

Формат данных файла прошивки

ESP8266 изнутри

ESP8266 изнутри. Фото zeptobars.ru

Образ прошивки состоит из 3 секций: заголовка, сегмента данных переменной длины и завершающий сегмент. Мультибайтовые поля в little-endian кодировке.

Заголовок

Byte Description
0 Always 0xE9
1 Number of segments
2-3 Padding/unused
4-7 Entry point
8-n Segments

Сегмент данных

Byte Description
0-3 Memory offset
4-7 Segment size
8…n Data

Завершающий сегмент

Файл заполняется 0xFF до тех пор, пока его размер не будет меньше на один байт размеру, кратному 16 байт. Последний, 16 байт, является контрольной суммой данных всех сегментов. Контрольная сумма определяется как исключающее или (XOR) суммы всех байт и байта 0xEF.

Адресное пространство

  • 0x00000 flash
  • 0x3E000 master_device_key 8k
  • 0x40000 irom0text
  • 0x7C000 esp init data default
  • 0x7E000 конфигурация WiFi (при прошивке заполнен 0xFF, размер 4096 байт)

Для прошивок с обновлением из облака (начиная с AT_v0.18 ):

  • 0x00000 boot 1712 байт
  • 0x01000 flash1 (user1)
  • 0x11000 irom0text1
  • 0x3E000 master_device_key 8k
  • 0x41000 flash2 (user2)
  • 0x51000 irom0text2
  • 0x7C000 esp init data default
  • 0x7E000 конфигурация WiFi (при прошивке заполнен 0xFF, размер 4096 байт)

 

MEMORY
{
dport0_0_seg : org = 0x3FF00000, len = 0x10
dram0_0_seg : org = 0x3FFE8000, len = 0x14000
iram1_0_seg : org = 0x40100000, len = 0x8000
irom0_0_seg : org = 0x40240000, len = 0x32000
}

32KB SRAM
80KB DRAM
200KB ROM

Boot log

Во время прошивки, загрузчик пишет лог в UART. Скорость обмена довольно необычна: 75 000 (по информации из других источников — 76 800) бод.

[/crayon]

Протокол обмена

Для прошивки GPIO0 и GPIO15 (если есть на Вашем модуле) подтянуть к земле а GPIO2 подтянуть к питанию. Бутлоадер, после подачи питания, переводит модуль в режим прошивки (UART download mode).

В последних версиях модуля прошивка осуществляется на скорости 115200 8N1. На старых модулях возможны другие варианты скорости: 9600 и 57600.

Загрузчик использует SLIP протокол. Начала данные разбивается на байты. Границей SLIP-кадра является уникальный флаг END (0xC0). Уникальность этого флага поддерживается байт-стаффингом (byte stuffing) внутри кадра с ESC-последовательностью 0xDB, причём байт END (0xС0) заменяется последовательностью (0xDB, 0xDC), а байт ESC (0xDB) — последовательностью (0xDB, 0xDD).

Внутри кадра пакет состоит из заголовка и тела переменной длины. Все мультибайтовые данные передаются в little-endian кодировке.

Запрос

Byte Name Comment
0 Direction Always 0x00 for requests
1 Command Requested operation, according to separate table
2-3 Size Size of body
4-7 Checksum XOR checksum of payload, only used in block transfer packets
8..n Body Depends on operation

Ответ

Byte Name Comment
0 Direction Always 0x01 for responses
1 Command Same value as in the request packet that trigged the response
2-3 Size Size of body
4-7 Value Response data for some operations
8..n Body Depends on operation

Opcodes

Byte Name Input Output
0x02 Flash Download Start total size, 0x200, block size, offset
0x03 Flash Download Data size, sequence number, data. checksum in dedicated field.
0x04 Flash Download Finish reboot flag?
0x05 RAM Download Start total size, packet size, number of packets, memory offset
0x06 RAM Download Finish execute flag, entry point
0x07 RAM Download Data size, sequence numer, data. checksum in dedicated field.
0x08 Sync Frame 0x07 0x07 0x12 0x20, 0x55 32 times
0x09 Write register Four 32-bit words: address, value, mask and delay (in microseconds) Body is 0x00 0x00 if successful
0x0a Read register Address as 32-bit word Read data as 32-bit word in value field

Контрольная сумма

Каждый байт ксорится (XOR) c магическим числом 0xEF. Результат сохраняется с лидирующими нулями в 32-разрядном поле контрольной суммы заголовка.