Uboot

Материал из Toshiba AC100 wiki
Перейти к навигации Перейти к поиску

TODO : привести в человеческий вид

Особенности

Сразу опишу некоторые нюансы, т.к. многие не дочитывают до конца или пропускают нюансы.
1. Загрузочный скрипт должен быть запакован командой mkimage
2. initrd/initramfs образ должен быть запакован командой mkimage

Версии

  • mainline

Отсутствует поддержка клавиатуры. В 2016-11 не работает экран (патч ушел в мейллист, но не приянт)

  • Старая версия (2013 год)

Добавлена поддержка клавиатуры, экран работает. Отсутствует поддержка многих вещей, которые появились за последние несколько лет (extlinux, например)

  • 2016-11-nvec-v1-dev

Портирован патч с поддержкой клавиатуры. Добавлен фикс экрана

  • Особо не тестировалась*

Собранные версии

uboot.bin с работающим экраном (исходники на gitorious).

  • пока не работает встроенная клавиатура
  • некоторые модели usb клавиатур должны работать, но на #ac100 никто этого не смог добиться (видимо зависит от модели)

uboot-w-kbd.bin с экспериментальной поддержкой клавиатуры (исходники).

u-boot-2014-07-android.bin Binary from this branch https://github.com/ac100-ru/u-boot-ac100-exp/tree/v2014.07-android

Как работает u-boot

При использовании fastboot (загрузчик, с которым тошка шла по-умолчанию) ядро, инитрд, cmdline нужно было упаковать в boot образ и записать в 5 или 6 партицию. Бут образ из 6-й грузился по-умолчанию, из 5-й - по домику. При использовании u-boot'а бут образы не используются. Ядро и initrd должны лежать на файловой системе партиции. Cmdline задается в загрузочном скрипте. Загрузка происходит следующим образом: u-boot перебирает sd, emmc, usb и ищет там файл загрузочного скрипта (boot.scr). Если он его не находит, вываливается в командную строку (u-boot'а, линукса там никакого нет). Если скрипт находится, то выполняется этот скрипт. В скрипте задается cmdline, считывается в память ядро, инитрд, device tree (для ядер 3.8 и новее) и зовется команда загрузки (bootz или bootm).

Другими словами

U-Boot ставится в спец. разделы (boot0 и boot1) внутреннего накопителя и не занимает места на части накопителя, где расположена ОС. Устанавливается U-Boot в эти разделы сценарием switch-to-uboot (на AC100 нужно запустить sosboot, а затем выполнить сценарий switch-to-uboot). Для загрузки, U-Boot ищет сценарий с именем boot.scr (на самом деле есть еще имя, но это не так важно). Ищет он его в корне раздела и в каталоге /boot. Проверяются все разделы всех накопителей. Если сценарий не найден, будет выведена консоль U-Boot'а. boot.scr — текстовый файл с небольшим заголовком. В сценарии указаны команды для загрузки ядра, initramfs (опционально), dtb и сама команда запуска. Чтобы ядро бралось из другого места, нужно править сценарий.

Установка ОС

См. https://paz00.ru/index.php/Uboot_installation_ru установка ОС с u-boot'ом (https://paz00.ru/index.php/Uboot_installation en)

Загрузка в память

Иногда удобно проверять работу u-boot'а/ядра не заливая его на внутренний накопитель. Загрузить uboot в тошибу не меняя ничего на накопителе можно командой

nvflash

nvflash --bl ./u-boot-dtb-tegra.bin --go

В этом случае нужно иметь рабочий скрипт загрузки для u-boot'а. Можно сделать полноценный образ, содержащий в себе u-boot, ядро и другие нужные компоненты:

  • получаем create_image.pl
git clone git://gitorious.org/uboot-ac100/create_bootimage.git
  • формируем uboot.cmd
setenv bootargs 'cma=64M'
bootz @KERNEL @INITRD @FDT
  • создаем boot-image.ram
create_image.pl uboot.bin zImage initrd.img tegra20-paz00.dtb uboot.cmd boot-image.ram
  • заливаем boot-image.ram в память
nvflash --bl boot-image.ram --go

tegrarcm

можно использовать tegrarcm:

tegrarcm --bct=ac100.bct --bootloader=boot-image.ram --loadaddr=0x108000

Загрузка с USB флешки

for-next загружается, 3.1 в процессе

% cat boot.cmd 
echo === boot.scr: boot from USB flash ===
setenv setargs
setenv bootargs 'console=ttyS0,115200 cma=64M'
usb dev 0
ext2load usb 0 0x1000000 /boot/zImage
ext2load usb 0 0x2000000 /boot/tegra20-paz00.dtb
ext2load usb 0 0x2200000 /boot/initrd-uboot
bootz 0x1000000 0x2200000 0x2000000

Запаковываем команды загрузки в образ

% ../u-boot/tools/mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "myscript" -d boot.cmd boot.scr
Image Name:   myscript
Created:      Sat Nov 24 23:57:51 2012
Image Type:   ARM Linux Script (uncompressed)
Data Size:    38 Bytes = 0.04 kB = 0.00 MB
Load Address: 00000000
Entry Point:  00000000
Contents:
   Image 0: 30 Bytes = 0.03 kB = 0.00 MB
% ls -la ./boot.scr
-rw-r--r-- 1 stuw users 102 Nov 24 23:57 ./boot.scr

И обязательно перепаковываем initrd.

% ../u-boot/tools/mkimage -n MyRamDisk -A arm -O linux -T ramdisk -C gzip -d initrd.img initrd-uboot
Image Name:   MyRamDisk
Created:      Sun Jan 20 20:23:04 2013
Image Type:   ARM Linux RAMDisk Image (gzip compressed)
Data Size:    1217437 Bytes = 1188.90 kB = 1.16 MB
Load Address: 00000000
Entry Point:  00000000

boot.scr нужно положить в /boot на sd карте. Если ядро не использует fdt - его не грузим и убираем последний параметр в команде bootz.

Запись uboot'а на место загрузчика

Не все описание точное, u-boot "подрос" :) U-Boot (by Stephen Warren) <range type="comment" id="438689">PaulFertser сообщил, что u-boot из main ветки у него работает!</range id="438689"> См. также t30-port-v2011.03-public (LCD Display driver commit, tegra keyboard support commit)

savalik не осилил заливку uboot на тошибу. Как он понял u-boot.bin (fastboot.stock.bin) составляет какую то часть от раздела EBT(4го). При запуске nvflash --bl u-boot.bin --go он загоняется в память устройства. Но для его зашивки надо использовать --updatebct (??? какие то ключи)

socketa4techx7 осилил заливку uboot на тошибу. На всякий случай: 1) Надо достать partitiontable и оригинальный bct.

nvflash --bl fastboot.bin --getpartitiontable ac100-pt.txt
nvflash -r --rawdeviceread 0 5000 00.bin
dd if=00.bin of=ac100.bct bs=4080 count=1

2) теперь запихнем оригинальный bct куда подальше и создадим пустой bct-образный файл:

cp ac100.bct ac100.bct.orig
dd if=/dev/zero of=ac100.bct seek=2704 bs=1 count=48 conv=notrunc

3) Зальём в тошку u-boot.

nvflash --bl fastboot.bin --bct ac100.bct --odmdata 0x800c0085 --download 4 u-boot.bin

Бинго! (по мотивам http://ac100.grandou.net/swarren_brain_dump) Траблы: разрешение экрана кривовато, шрифт мелковат. Зы. бинарник, который я заливал, я взял из последнего L4T.(по непонятным причинам сработало 1 раз). <range type="comment" id="521845">Вообще говоря, толку от u-boot сейчас мало - он не поддерживает дисплей и клавиатуру. Так что пока рассматриваем другие варианты.</range id="521845">

Так же советуемая Паулом putusb Муромца не работает из за какой то банальщины вроде неправильного импортирования модулей. (Муромцу подзатыльник за то что все сломал.)

Сборка

Для v2016.11-nvec-v1-dev

git clone https://github.com/ac100-ru/u-boot-ac100-exp.git
cd u-boot-ac100-exp
git checkout -b v2016.11-nvec-v1-dev origin/v2016.11-nvec-v1-dev
make ARCH=arm CROSS_COMPILTE=arm-linux-gnueabi- paz00_config
make ARCH=arm CROSS_COMPILTE=arm-linux-gnueabi- # опционально добавить -j <количество потоков>

Для старых версий

git clone git://git.denx.de/u-boot-tegra.git
cd u-boot-tegra
make paz00_config
CROSS_COMPILE=arm-linux-gnueabi- make

http://pastebin.com/Ff5ydM1p -- печальный выхлоп в виде сегфолта в конце. http://dl.dropbox.com/u/32472722/ac100_stuff/u-boot.bin bootloader failed NvError 0x0

nvflash\nvflash\nvflash.exe --bl nvflash\nvflash\fastboot.stock.bin --bct ac100.bct --odmdata 0x800c0085 --download 4 u-boot.bin <range type="comment" id="636874">делает кирпич. </range id="636874">да и в целом odmdata 0x800c0085 кажется нам не идет.

Загрузка ядра из boot образа

Буду расписывать на основе http://ac100.grandou.net/abootimg#output_examples Видно, что: page size = 2048 bytes kernel size = 3146584 bytes ramdisk size = 2310081 bytes

В нулевом секторе находится заголовок. Начиная с первого сектора идет ядро. Потом initrd. Ядро занимает (3146584 + 2048 - 1) / 2048 байт = 1537 секторов. Ramdisk: (2310081 + 2048 - 1) / 2048 байт = 1128 секторов.

6-я партиция начинается с сектора 5376 и ее размер 4096 секторов (сектор - 2048 байт, какой размер блока у убута - не знаю). Ядро: начало 5376+1=5377, размер 1537 секторов Как вытащить cmdline - пока не знаю. надо руками вбивать :(

U-boot работает с секторами по 512 байт и не видит скрытые области на ностеле тошибы. Поэтому нужно сделать дополнительные корректировки (на примере 116-й модели, бут партиции по 2 МБ). Т.к. скрытые области на 116-й модели по 2 МБ, то скрытыми будут 2048 секторов. Пересчитаем смещение ядра: 5377-2048=3329 Т.е. u-boot использует сектора по 512 байт, а мы считали все для секторов в 2048 байт, нужно пересчитать значения для скармливания u-boot'у: Ядро: начало 3329*4=13316 (0x3404), размер 1537*4=6148 (0x1804)

Команда для считывания ядра из 6-й партиции будет такая: mmc read 0x1000000 0x3404 0x1804

Варианты меню загрузки

Устаревший вариант: Bootmenu

Тестовая сборка: Test/sos-uboot-r5-2013-09-23.bin

Для записи uboot'а на место постоянного загрузчика: загрузить образ в память, выполнить ./switch_to_uboot

НЕПРОВЕРЕННЫЙ ВАРИАНТ

Должен выдать меню из следующих пунктов:

Boot kernel

Boot recovery

Boot from SD

Boot from USB

Uboot

setenv bootmenu_0 "Boot kernel  =setenv bootargs console=tty0 console=ttyS0,115200n8 CMA=64M quiet splash;\
mmc dev 0;\
ext2load mmc 0 0x1000000 /boot/zImage;\
ext2load mmc 0 0x2000000 /boot/tegra20-paz00.dtb;\
ext2load mmc 0 0x2200000 /boot/initrd-uboot;\
bootz 0x1000000 0x2200000 0x2000000;"

setenv bootmenu_1 "Boot recovery=setenv bootargs console=tty0 console=ttyS0,115200n8 CMA=64M quiet splash;
mmc dev 0;\
ext2load mmc 0 0x1000000 /boot/zImage-recovery;\
ext2load mmc 0 0x2000000 /boot/tegra20-paz00.dtb;\
ext2load mmc 0 0x2200000 /boot/initrd-recovery-uboot;\
bootz 0x1000000 0x2200000 0x2000000;"

setenv bootmenu_2 "Boot from SD =setenv bootargs console=tty0 console=ttyS0,115200n8 CMA=64M quiet splash;\
mmc dev 1;\
ext2load mmc 1 0x1000000 /boot/zImage;\
ext2load mmc 1 0x2000000 /boot/tegra20-paz00.dtb;\
ext2load mmc 1 0x2200000 /boot/initrd-uboot;\
bootz 0x1000000 0x2200000 0x2000000;"

setenv bootmenu_3 "Boot from USB=setenv bootargs console=tty0 console=ttyS0,115200n8 CMA=64M quiet splash;\
usb dev 0;\
ext2load usb 0 0x1000000 /boot/zImage;\
ext2load usb 0 0x2000000 /boot/tegra20-paz00.dtb;\
ext2load usb 0 0x2200000 /boot/initrd-uboot;\
bootz 0x1000000 0x2200000 0x2000000;"

bootmenu 20


Меню для Андроида

echo === AC100 Android Bootmenu ===
setenv bootmenu_0 "Boot LNX  =mmc dev 0; ext2load mmc 0:2 0x1000000 /boot/zImage;\
                                         ext2load mmc 0:2 0x2200000 /boot/initrd.gz;\
                                         bootz 0x1000000 0x2200000;"
setenv bootmenu_1 "Boot SOS  =mmc dev 0; ext2load mmc 0:1 0x1000000 /boot/zImage;\
                                         ext2load mmc 0:1 0x2200000 /boot/initrd.gz;\
                                         bootz 0x1000000 0x2200000;"
setenv bootmenu_2 "Boot from SD =setenv bootargs console=tty0; mmc dev 1;\
                                         ext2load mmc 1 0x1000000 /boot/zImage;\
                                         ext2load mmc 1 0x2200000 /boot/initrd.gz;\
                                         bootz 0x1000000 0x2200000;"
setenv bootmenu_3 "Boot from USB=setenv bootargs $cmdline; usb dev 0;\
                                         ext2load usb 0 0x1000000 /boot/zImage;\
                                         ext2load usb 0 0x2200000 /boot/initrd.gz;\
                                         bootz 0x1000000 0x2200000 0x2000000;"
bootmenu 20
echo === Toshiba AC100 Bootmenu ===
setenv bootmenu_0 "Boot LNX CM-10.1 =ext2load mmc 0:2 0x1000000 /boot/zImage-boot-cm-10-1; ext2load mmc 0:2 0x2200000 /boot/initrd-boot-cm-10-1.gz; bootz 0x1000000 0x2200000;"
setenv bootmenu_1 "Boot SOS CM-10.1 =ext2load mmc 0:1 0x1000000 /boot/zImage-recovery-cm-10-1; ext2load mmc 0:1 0x2200000 /boot/initrd-recovery-cm-10-1.gz; bootz 0x1000000 0x2200000;"
setenv bootmenu_2 "Boot LNX UBUNTU-12.10 =ext2load mmc 0:2 0x1000000 /boot/zImage-lubuntu-12-10; ext2load mmc 0:2 0x2200000 /boot/initrd-lubuntu-12-10; bootz 0x1000000 0x2200000;"
setenv bootmenu_3 "Boot from SD fat=fatload mmc 1:1 0x1000000 /boot/zImage; fatload mmc 1:1 0x2200000 /boot/initrd.gz; bootz 0x1000000 0x2200000;"
setenv bootmenu_4 "Boot from USB ext2=ext2load usb 0:1 0x1000000 /boot/zImage; ext2load usb 0:1 0x2200000 /boot/initrd.gz; bootz 0x1000000 0x2200000 0x2000000;"
bootmenu 5

Новый вариант: Extlinux

В новых версиях u-boot появилась поддержка syslinux скриптов для создания меню загрузки.
README в исходниках U-Boot

Пример конфигурации:

TIMEOUT 1000
DEFAULT default
ONTIMEOUT exit
MENU TITLE Boot menu

LABEL default
        MENU LABEL Default
        LINUX /boot/zImage
        FDTDIR /boot/
        APPEND root=/dev/mmcblk0p1 plymouth.enable=0 console=ttyS0,115200n8

LABEL failsafe
        MENU LABEL Failsafe
        LINUX /boot/zImage-failsafe
        FDT /boot/tegra20-paz00.dtb
	INITRD /boot/initrd-uboot
        APPEND root=/dev/mmcblk0p1 plymouth.enable=0 console=ttyS0,115200n8 console=tty

LABEL exit
	MENU LABEL Local boot script (boot.scr)
	LOCALBOOT 1
  1. При использовании FDTDIR для выбора dtb файла при загрузке используются переменные окружения SYS_SOC и SYS_BOARD.

EFI вариант с помощью GRUB

Пример вывода из последних сборок openSUSE где включена только EFI загрузка:

U-Boot SPL 2016.11 (Dec 22 2016 - 23:44:52)linux-4.18.12-1-default.gz 
Trying to boot from RAMt 
grub> 
grub> 
U-Boot 2016.11 (Dec 22 2016 - 23:44:52 +0300)
grub> 
TEGRA20
Model: Toshiba AC100 / Dynabook AZ
Board: Compal Paz00
DRAM:  512 MiB
MMC:   Tegra SD/MMC: 0, Tegra SD/MMC: 1
*** Warning - bad CRC, using default environment

nvec: nvec_probe
NVEC initialization...
request-gpios flags: 0xa
nvec: nvec_set_bus_speed
tegra_nvec_kbd_probe
tegra kbc is initialized
tegra_nvec_kbd_start: Tegra nvec keyboard ready
In:    tegra-nvec-kbc
Out:   vidconsole
Err:   vidconsole
Net:   No ethernet found.
Hit any key to stop autoboot:  0 
switch to partitions #0, OK
mmc1 is current device
Scanning mmc 1:1...
Found EFI removable media binary efi/boot/bootarm.efi
reading efi/boot/bootarm.efi
813056 bytes read in 59 ms (13.1 MiB/s)
libfdt fdt_check_header(): FDT_ERR_BADMAGIC
## Starting EFI application at 0x01000000 ...
Scanning disks on usb...
Scanning disks on mmc...
MMC Device 2 not found
MMC Device 3 not found
Found 6 disks
Welcome to GRUB!

EFI партиция - hd1,gpt1 BOOT партиция - hd1,gpt2

Надо понять какой нужен grub'у конфиг. Чтобы откатиться на boot.scr достаточно написать exit.

Разное

Bootable флаг в U-Boot

Описание как в U-Boot считывается bootable флаг

Скрипты от nvidia для прошивки U-Boot

https://github.com/NVIDIA/tegra-uboot-flasher-scripts https://github.com/NVIDIA/tegra-uboot-scripts


Патчи Нвек в Mainline U-Boot

http://patchwork.ozlabs.org/project/uboot/list/?submitter=Andrey+Danin&state=*&archive=both

Persistent enviroment location

This settings live in include/configs/paz00.h

/* Environment in eMMC, at the end of 2nd "boot sector" */
#define CONFIG_ENV_IS_IN_MMC
#define CONFIG_ENV_OFFSET (-CONFIG_ENV_SIZE)
#define CONFIG_SYS_MMC_ENV_DEV 0
#define CONFIG_SYS_MMC_ENV_PART 2
<srwarren> Typically it's at the end of /dev/mmcblk0boot1 for devices that boot from eMMC
<srwarren> IIRC, 0==main data, 1==boot0, 2==boot1

Factory kernel 2.6.32-9 with U-Boot

Uncompressing Linux.................................................................................................................................................................................. done, booting the kernel.

Error: unrecognized/unsupported machine ID (r1 = 0x00000c38).

Available machine support:

ID (hex)        NAME
00000d05        Tegra 2 Development System
00000aab        NVIDIA Harmony Development System
00000b6f        NVIDIA Ventana Development System

Please check your kernel config and/or bootloader.

how to override this machine ID?

0x00000c38 is 3128 decimal, defined in arch/arm/include/asm/mach-types.h in U-Boot.

#define MACH_TYPE_PAZ00                3128

load U-Boot default enviroment settings

env default -a