super.fex boot-resource.fex boot_package.fex boot0_sdcard.fex cardscript.fex cardtool.fex split_xxxx.fex fes1.fex Файл boot0_sdcard.fex
В образе прошивки содержится два варианта загрузчика Boot0: Сигнатура загрузчика eGON означает "the Embedded GO-ON Bootloader System" Примечание. В связи с тем, что в текущей версии Android 10 для Allwinner H616 в процессе загрузки используется три загрузчика (BROM, Boot0 и U-Boot), возникает некоторая путаница с определениями "первичный-вторичный". Первичным (или начальным ) загрузчиком в SoC Allwinner, считается встроенный в чип загрузчик BROM. В более ранних версиях для обозначения программного (системного) загрузчика использовался термин SPL (Second Programm Loader). Поэтому загрузчик, разделенный на две части (Boot0 и U-Boot), также можно считать вторичным, т.е. Boot0 - это первая часть вторичного загрузчика, хотя цифра 0 намекает на его первичность. Описание структуры загрузчика Boot0: Ссылка на формат заголовков Boot0 на linux-sunxi.org: linux-sunxi EGON Загрузчик BROM, извлеченный из чипа SoC, находится в репозитории GITHUB:
HNO.
BROM начинается с 0x4000 (Сигнатура eGON.BRM). Если BROM идентифицировал boot0 в NAND, загружает и выполняет его. Header u32, Jump to address 8 * u8, Magic "eGON.BRM" (no \n) u32, length 4 * u8, Boot_vsn 4 * u8, eGON_vsn 8 * u8, platform information #define BOOT0_MAGIC "eGON.BT0" public header u32, Jump to address 8 * u8, Magic "eGON.BT0" (no \n) 32u, checksum for boot0 32u, length for boot0 32u, header size of boot0 4 * u8, header version 4 * u8, Boot_vsn 4 * u8, eGON_vsn 8 * u8, platform information private header
u32, header size 4 * u8, header version boot_dram_para_t, DRAM parameters s32, uart port 2 * normal_gpio_cfg, s32, enable_jtag (0 off, 1 on) 5 * normal_gpio_cfg, jtag_gpio 32 * normal_gpio_cfg, storage_gpio u8 * 512 - (32 * sizeof(normal_gpio_cfg)), storage_data Источник: bootinfo.c typedef struct boot_file_head { u32 jump_instruction; // one intruction jumping to real code u8 magic[8]; // ="eGON.BT0\ or "eGON.BT1", not C-style string. u32 check_sum; // generated by PC u32 length; // generated by PC u32 pub_head_size; // the size of boot_file_head_t u8 pub_head_vsn[4]; // the version of boot_file_head_t u8 file_head_vsn[4]; // the version of boot0_file_head_t or boot1_file_head_t u8 Boot_vsn[4]; // Boot version u8 eGON_vsn[4]; // eGON version u8 platform[8]; // platform information } boot_file_head_t; typedef struct _boot0_private_head_t { __u32 prvt_head_size; char prvt_head_vsn[4]; boot_dram_para_t dram_para; __s32 uart_port; normal_gpio_cfg uart_ctrl[2]; __s32 enable_jtag; normal_gpio_cfg jtag_gpio[5]; normal_gpio_cfg storage_gpio[32]; __u8 storage_data[256]; } boot0_private_head_t; typedef struct _boot0_file_head_t { boot_file_head_t boot_head; boot0_private_head_t prvt_head; } boot0_file_head_t; Алгоритм загрузки с ММС(перевод)BROM загружает boot0 из nand или mmc, а затем загружает boot1 из mmc. |