Образ Android


  Образ       Файлы       GPT     Разделы     RAW  

  super.fex     boot-resource.fex     boot_package.fex       boot0_sdcard.fex       cardscript.fex     cardtool.fex     split_xxxx.fex     fes1.fex  

Файл boot0_sdcard.fex

В образе прошивки содержится два варианта загрузчика Boot0:

  • boot0_nand.fex - загрузчик встроенной nand-памяти (в OpiZero2 и ТВ-боксах не используется)
  • boot0_sdcard.fex - загрузчик внешней SD-карты и/или встроенной eMMC-памяти

    Сигнатура загрузчика 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.

  • Драйвер SD очень похож на драйвер sunxi-mmc от u-boot. Так что весьма вероятно, что они идентичны
  • Выбирается SD-карта и проверяется, является ли она допустимым слотом для карты.
  • SD/MMC-ридер инициализирован
  • Прочитать 2 сектора (1 КБ), начиная с сектора 38192 на SD-карте, и сравнить это с магическим значением «eGON.BT1»
  • Прочитать длину, хранящуюся в заголовке, и проверьте, соответствует ли она размеру (выравнивается блоками по 512).
  • Прочитать boot1 с SD-карты, используя найденную длину
  • Проверить контрольную сумму boot1
  • Установить eGON_VSN (даже если он не прошел контрольную сумму)
  • Закрыть SD-карту