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

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

ESP8266 изнутри

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

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

Заголовок

ByteDescription
0Always 0xE9
1Number of segments
2-3Padding/unused
4-7Entry point
8-nSegments

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

ByteDescription
0-3Memory offset
4-7Segment size
8…nData

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

Файл заполняется 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 кодировке.

Запрос

ByteNameComment
0DirectionAlways 0x00 for requests
1CommandRequested operation, according to separate table
2-3SizeSize of body
4-7ChecksumXOR checksum of payload, only used in block transfer packets
8..nBodyDepends on operation

Ответ

ByteNameComment
0DirectionAlways 0x01 for responses
1CommandSame value as in the request packet that trigged the response
2-3SizeSize of body
4-7ValueResponse data for some operations
8..nBodyDepends on operation

Opcodes

ByteNameInputOutput
0x02Flash Download Starttotal size, 0x200, block size, offset
0x03Flash Download Datasize, sequence number, data. checksum in dedicated field.
0x04Flash Download Finishreboot flag?
0x05RAM Download Starttotal size, packet size, number of packets, memory offset
0x06RAM Download Finishexecute flag, entry point
0x07RAM Download Datasize, sequence numer, data. checksum in dedicated field.
0x08Sync Frame 0x07 0x07 0x12 0x20, 0x55 32 times
0x09Write registerFour 32-bit words: address, value, mask and delay (in microseconds)Body is 0x00 0x00 if successful
0x0aRead registerAddress as 32-bit wordRead data as 32-bit word in value field

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

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