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


   1       2       3       4         5         6       7       8       9       10   

5. Старт записи прошивки в eMMC

Загрузка переменных окружения из раздела ENV_A на прошивочной SD-карте

 Loading Environment from SUNXI_FLASH... OK

Проверка режима записи по USB:

[05.222]try to burn key
[05.224]out of usb burn from boot: not boot mode

Фрагменты исходного кода:


#ifdef CONFIG_SUNXI_BURN
    pr_msg("try to burn key
");
    sunxi_keydata_burn_by_usb();
#endif
    return 0;

int sunxi_keydata_burn_by_usb(void) { //...... int workmode = uboot_spare_head.boot_data.work_mode; int if_need_burn_key = 0; ret = script_parser_fetch("/soc/target", "burn_key", &if_need_burn_key, 1); if (if_need_burn_key != 1) { pr_err("out of usb burn from boot: not need burn key "); return 0; } if (workmode != WORK_MODE_BOOT) { pr_err("out of usb burn from boot: not boot mode "); return 0; }

Проверка нажатия на клавиатуру терминала, подключенного через UART. Если в переменных окружения ENV значение переменной boot_delay !=0 и нажата с удержанием клавиша 'Пробел', то происходит переход в командную оболочку U-Boot. И процесс записи прошивки будет прерван (или совсем прекращен, если не найдется команда для продолжения).

В исходных текстах U-Boot процедура записи прошивки в eMMC назывется "спрайт" (sprite), такое имя имеет папка Исходные тексты в папке Sprite , содежащая исходные тексты, относящиеся к записи прошивки.
Таким образом, "спрайт" (sprite) - это термин для обозначения процесса записи прошивки в eMMC c SD-карты или по USB (или обновления прошивки).

Sprite - это эльф, т.е. дух ("Ох, я встречу того духа, ох, отмечу его в ухо ! Дух, он тоже — духу рознь"©)

Фрагмент исходного текста:

int do_sprite_test(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{  printf("sunxi work mode=0x%x", get_boot_work_mode());
   if(get_boot_work_mode() == WORK_MODE_USB_PRODUCT)
   { printf("run usb efex");
	 if(sunxi_usb_dev_register(2))
	 printf("invalid usb device");
	 sunxi_usb_main_loop(2500);
   }
   else if (get_boot_work_mode() == WORK_MODE_CARD_PRODUCT)
   { printf("run card sprite");
	 sprite_led_init();
	 ret = sunxi_card_sprite_main(0, NULL);  // !!!!!!!!!!
	 sprite_led_exit(ret);
	 return ret;
   }
 // ..................
   else
	  printf("others");
   return 0;
}


ВНИМАНИЕ !

Полностью процедуру sprite (запись прошивки) можно проследить по исходному тексту: Исходный текст Sunxi_card_sprite_main ,
Предопределенные константы - см. Заголовочный файл констант spare_head.h


В оболочке (командном интерфейсе) U-Boot даже присутствует команда sprite_test, которая показывает - в каком режиме должен работать запущенный U-Boot, читая и делая вывод значения байта work mode из заголовка U-Boot, например для обычного загрузочного режима:

=> sprite_test
sunxi work mode=0x0
others
Здесь others означает, что режим работы (work mode) не относится ни к одному из вариантов спрайта.

ВНИМАНИЕ !
Если при загрузке U-Boot с карты Product войти в его командную оболочку ( нажатием пробела на клавиатуре терминала ), то процесс записи прошивки в eMMC прекратится (точнее, приостановится), поэтому для его продолжения достаточно ввести с терминала команду sprite_test, по которой будет прочитано значение work_mode = 17 и будет запущена функция Sprite (sunxi_card_sprite_main), т.е. процесс записи прошивки будет продолжаться.

Cartoon (мультик) - это анимация отображения прогресс-бара (зеленой полоски)

Анимация выглядит как полоска прогресс-бара, отображаемая на экране монитора.
Задаются координаты окна анимации (красного прямоугольника):

  • 320,320 - верхний левый угол
  • 960,400 - нижний правый угол
    Т.е размеры прямоугольника: ширина = 640 пикселей, высота = 120 пикселей

    В оболочке U-Boot есть команда screen_char для тестирования отображения прогресс-бара (без анимации), по которой на экране отображаются координаты углов и красный прямоугольник с этими координатами, наполовину закрашенный зеленым. Четыре варианта для этой команды: Тест screen_char .

    Настройка и запуск мигания светодиода на приставке:

    try sprite_led_gpio config
    sprite_led_gpio start
    
  • При нормальной работе частота мигания индикатора определяется значением delay = 500 (т.е. два Гц),
  • При возникновении ошибки светодиод мигает быстрее delay = 100 (т.е. 10 Гц),

    Старт спрайта:

  • устанавливаются размеры и начальное положение прогресс-бара (x1,y1,x2,y2)
  • 357443 bytes read - загружается шрифт из файла font32.sft с диска Volume (раздел bootloader_a).
    [05.242]sunxi sprite begin
    bar x1: 320 y1: 320
    bar x2: 960 y2: 400
    357443 bytes read in 24 ms (14.2 MiB/s)
    [SFTE_Set_Pixel_Sizes_i] 394 buf_size is 2304
    cur_pixel_size 32 pixel_size 32
    

    Выполняется проверка чтения с SD-карты образа прошивки со смещением 98304 (0x18000) от начала карты.

    firmware name 
    img start = 0x18000
    try to read mmc start 98304
    read mmc ok
    [05.305]firmware probe ok
    

    В исходном тексте:

    if (sprite_card_firmware_probe(name))
     { printf("sunxi sprite firmware probe fail\n");
       return -1;
     }
     sprite_cartoon_upgrade(5);
     tick_printf("firmware probe ok");
    

    Таким образом, с этого момента всё готово для распаковки образа и записи данных в eMMC




    Лог: Старт записи прошивки в eMMC


    
    [05.218]Loading Environment from SUNXI_FLASH... OK
    [05.222]try to burn key
    [05.224]out of usb burn from boot: not boot mode
    Hit any key to stop autoboot:  0
    sunxi work mode=0x11
    run card sprite
    [05.236]try sprite_led_gpio config
    [05.239]sprite_led_gpio start
    [05.242]sunxi sprite begin
    bar x1: 320 y1: 320
    bar x2: 960 y2: 400
    357443 bytes read in 24 ms (14.2 MiB/s)
    [SFTE_Set_Pixel_Sizes_i] 394 buf_size is 2304
    cur_pixel_size 32 pixel_size 32
    
    firmware name 
    img start = 0x18000
    try to read mmc start 98304
    read mmc ok
    [05.305]firmware probe ok
    
    



  •    1       2       3       4         5         6       7       8       9       10