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; Проверка нажатия на клавиатуру терминала, подключенного через UART. Если в переменных окружения ENV значение переменной boot_delay !=0 и нажата с удержанием клавиша 'Пробел', то происходит переход в командную оболочку U-Boot. И процесс записи прошивки будет прерван (или совсем прекращен, если не найдется команда для продолжения). В исходных текстах U-Boot процедура записи прошивки в eMMC назывется "спрайт" (sprite),
такое имя имеет папка Исходные тексты в папке Sprite , содежащая исходные тексты, относящиеся к записи прошивки. 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 , В оболочке (командном интерфейсе) U-Boot даже присутствует команда sprite_test, которая показывает - в каком режиме должен работать запущенный U-Boot, читая и делая вывод значения байта work mode из заголовка U-Boot, например для обычного загрузочного режима: => sprite_test sunxi work mode=0x0 othersЗдесь others означает, что режим работы (work mode) не относится ни к одному из вариантов спрайта. ВНИМАНИЕ ! Cartoon (мультик) - это анимация отображения прогресс-бара (зеленой полоски) Анимация выглядит как полоска прогресс-бара, отображаемая на экране монитора. Т.е размеры прямоугольника: ширина = 640 пикселей, высота = 120 пикселей В оболочке U-Boot есть команда screen_char для тестирования отображения прогресс-бара (без анимации), по которой на экране отображаются координаты углов и красный прямоугольник с этими координатами, наполовину закрашенный зеленым. Четыре варианта для этой команды: Тест screen_char . Настройка и запуск мигания светодиода на приставке: try sprite_led_gpio config 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 Выполняется проверка чтения с SD-карты образа прошивки со смещением 98304 (0x18000) от начала карты. firmware name В исходном тексте: 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 |