Формат данных файла прошивки
Образ прошивки состоит из 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) бод.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[crayon-673eb9ec15805121476386 inline="true" ]ets Jan 8 2014,rst cause 1, boot mode:(3,7) load 0x40100000, len 24236, room 16 tail 12 chksum 0xb7 ho 0 tail 12 room 4 load 0x3ffe8000, len 3008, room 12 tail 4 chksum 0x2c load 0x3ffe8bc0, len 4816, room 4 tail 12 chksum 0x46 csum 0x46 |
[/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-разрядном поле контрольной суммы заголовка.