Uboot
TODO : привести в человеческий вид
Особенности
Сразу опишу некоторые нюансы, т.к. многие не дочитывают до конца или пропускают нюансы.
1. Загрузочный скрипт должен быть запакован командой mkimage
2. initrd/initramfs образ должен быть запакован командой mkimage
Как работает 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).
Установка ОС
См. https://paz00.ru/index.php/Uboot_installation_ru установка ОС с u-boot'ом (https://paz00.ru/index.php/Uboot_installation en)
Собранные версии
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'а/ядра не заливая его на внутренний накопитель. Загрузить uboot в тошибу не меняя ничего на накопителе можно командой
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 --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 Муромца не работает из за какой то банальщины вроде неправильного импортирования модулей. (Муромцу подзатыльник за то что все сломал.)
Сборка:
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
Тестовая сборка: 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
Скрипты от nvidia
https://github.com/NVIDIA/tegra-uboot-flasher-scripts https://github.com/NVIDIA/tegra-uboot-scripts
Mainline
http://patchwork.ozlabs.org/project/uboot/list/?submitter=Andrey+Danin&state=*&archive=both