Как происходит запись прошивки Android с карты Product


   1         2         3       4       5       6       7       8       9       10   

2. Старт основного загрузчика U-Boot

Как уже было экспериментально показано раньше (см. ), значение байта workmode = 17 (или 0x11) - означает переход к режиму Product, в котором происходит запись прошивки в память eMMC из IMAGEWTY-образа, имеющегося на данной SD-карте.

Байт workmode читается по адресу 0xe0 в заголовке загруженного U-Boot, куда значение 17 было установлено при записи прошивочной карты программой PhornixCard как результат установки параметра "Тип карты" в положение Product

Ниже приведены фрагменты исходных текстов, из которых видно (это подтверждение экспериментов), что режим работы устанавливается значением 0x11 байта со смещением 0xe0 в заголовке U-Boot


if (get_boot_work_mode() == WORK_MODE_CARD_PRODUCT)   // 0x11    = 17
   current_flash = &sunxi_sdmmc_desc;
//-----------
int get_boot_work_mode(void)
{
    return uboot_spare_head.boot_data.work_mode;
}

//---------------- typedef struct spare_boot_head_t { struct spare_boot_ctrl_head boot_head; struct spare_boot_data_head boot_data; struct spare_boot_ext_head boot_ext[15]; char hash[64]; }uboot_head_t;
//-------- Управляющая информация, сохраненная в заголовке файла----- #define MAGIC_SIZE 8 struct spare_boot_ctrl_head { unsigned int jump_instruction; // одна инструкция перехода к реальному коду unsigned char magic[MAGIC_SIZE]; // ="u-boot" unsigned int check_sum; // генерируется ПК unsigned int align_size; // выравнивание размера в байтах unsigned int length; // размер всего файла unsigned int uboot_length; // размер uboot unsigned char version[8]; // версия uboot unsigned char platform[8]; // информация о платформе int reserved[1]; // пространство для штампа, выравнивание по 16 байтам };
//---------- Данные, сохраненные в заголовке файла------------- struct spare_boot_data_head { unsigned int dram_para[32]; int run_clock; // МГц int run_core_vol; // мВ int uart_port; // номер управления UART normal_gpio_cfg uart_gpio[2]; // Информация UART GPIO int twi_port; // Номер управления TWI normal_gpio_cfg twi_gpio[2]; // Информация о TWI GPIO int work_mode; // = 0xe0 (11) // загрузка, запись USB, запись карты int storage_type; // 0:nand 1:sdcard 2:spinor normal_gpio_cfg nand_gpio[32]; // информация о nand GPIO char nand_spare_data[256]; // информация о NAND normal_gpio_cfg sdcard_gpio[32]; // информация о GPIO SD-карты char sdcard_spare_data[256]; // информация о SD-карте signed char secureos_exist; unsigned char monitor_exist; unsigned char func_mask; см. enum UBOOT_FUNC_MASK_EN unsigned char res[1]; unsigned int uboot_start_sector_in_mmc; // используем в ОТА-обновлении int dtb_offset; // дерево устройств в uboot int boot_package_size;// размер boot_package, boot0 передает это значение unsigned int dram_scan_size; // реальный размер dram int reserved[1]; // зарезервировано, выравнивание по 256 байт }; typedef struct _normal_gpio_cfg { char port; // номер порта char port_num; // номер порта; char mul_sel; // номер функции char pull; // статус сопротивления char drv_level; // уровень драйвера char data; // уровень вывода char reserved[2]; // зарезервированные биты для выравнивания }

Лог: Старт U-Boot

Начало работы запущенного U-Boot в режиме Product не отличается от режима StartUp (обычная занрузка Android), поэтому прокомментируем лишь некоторые строки лога:

U-Boot 2018.05-g496bde0 (Aug 16 2022 - 12:17:00 +0000) Allwinner Technology
Это сообщение о версии U-Boot, свидетельствующее о его нормальном старте.

Дальше проверяется размер памяти, тип контроллера питания, настройка напряжений питания и частот. Затем проверяется режим работы и тип хранилища прошивки:

 workmode = 17,storage type = 1




Лог: Старт основного загрузчика U-Boot


NOTICE:  BL3-1: v1.0(debug):54937d5
NOTICE:  BL3-1: Built : 17:44:59, 2021-12-13
NOTICE:  BL3-1 commit: 8
NOTICE:  cpuidle init version V2.0
NOTICE:  secure os exist
MESSAGE: [0x0] TEE-CORE: OP-TEE version: 81ab7a47 #1 2020? 05? 06? ??? 02:40:04 UTC arm
NOTICE:  BL3-1: Preparing for EL3 exit to normal world
NOTICE:  BL3-1: Next image address = 0x4a000000
NOTICE:  BL3-1: Next image spsr = 0x1d3

U-Boot 2018.05-g496bde0 (Aug 16 2022 - 12:17:00 +0000) Allwinner Technology

[00.570]CPU:   Allwinner Family
[00.573]Model: sun50iw9
I2C:   ready
[00.581]optee version: major:2 minor:5
[00.585]DRAM:  2 GiB
[00.589]Relocation Offset is: 75ed4000
[00.623]secure enable bit: 0
[00.626]smc_tee_inform_fdt failed with: ffffffff
[00.630]pmu_axp152_probe pmic_bus_read fail
[00.634]PMU: AXP1530
[00.636]PMU: pmu_axp1530 found
FDT ERROR:fdt_get_regulator_name:get property handle twi-supply error:FDT_ERR_INTERNAL
[00.647]gpio_bias, pc_bias:   -1, pc_supply: not set
[00.652]gpio_bias, pl_bias:   -1, pl_supply: not set
[00.657]dcdc1_vol = 960, onoff=1
[00.661]dcdc2_vol = 1150, onoff=1
[00.664]aldo1_vol = 1800, onoff=1
[00.668]dldo1_vol = 3300, onoff=1
[00.672]CPU=1416 MHz,PLL6=600 Mhz,AHB=200 Mhz, APB1=100Mhz  MBus=400Mhz
[00.678]gic: sec monitor mode
[00.681]sunxi flash type@1 not support fast burn key
[00.685]flash init start
[00.687]workmode = 17,storage type = 1



   1         2         3       4       5       6       7       8       9       10