Uboot: различия между версиями
Stuw (обсуждение | вклад) |
Zombah (обсуждение | вклад) м (→Варианты меню загрузки: add efi grub) |
||
(не показано 5 промежуточных версий 2 участников) | |||
Строка 14: | Строка 14: | ||
Портирован патч с поддержкой клавиатуры. | Портирован патч с поддержкой клавиатуры. | ||
Добавлен фикс экрана | Добавлен фикс экрана | ||
*Особо не тестировалась* | |||
==Собранные версии== | |||
[http://tinyurl.com/cukvzlp uboot.bin] с работающим экраном ([https://gitorious.org/uboot-ac100/uboot-ac100/commits/uboot-next-ac100 исходники] на gitorious). | |||
* пока не работает встроенная клавиатура | |||
* некоторые модели usb клавиатур должны работать, но на #ac100 никто этого не смог добиться (видимо зависит от модели) | |||
[https://paz00.ru/index.php/%D0%A4%D0%B0%D0%B9%D0%BB:Uboot-w-kbd.bin uboot-w-kbd.bin] с экспериментальной поддержкой клавиатуры ([https://gitorious.org/u-boot-ac100-exp/u-boot-ac100-exp/commits/master исходники]). | |||
[http://ac100.wikispaces.com/file/view/u-boot-2014-07-android.bin/516688186/u-boot-2014-07-android.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== | ==Как работает u-boot== | ||
Строка 26: | Строка 35: | ||
==Установка ОС== | ==Установка ОС== | ||
См. https://paz00.ru/index.php/Uboot_installation_ru установка ОС с u-boot'ом (https://paz00.ru/index.php/Uboot_installation en) | См. https://paz00.ru/index.php/Uboot_installation_ru установка ОС с u-boot'ом (https://paz00.ru/index.php/Uboot_installation en) | ||
==Загрузка в память== | ==Загрузка в память== | ||
Строка 141: | Строка 142: | ||
Так же советуемая Паулом putusb Муромца не работает из за какой то банальщины вроде неправильного импортирования модулей. (Муромцу подзатыльник за то что все сломал.) | Так же советуемая Паулом putusb Муромца не работает из за какой то банальщины вроде неправильного импортирования модулей. (Муромцу подзатыльник за то что все сломал.) | ||
==Сборка | ==Сборка== | ||
Для v2016.11-nvec-v1-dev | Для v2016.11-nvec-v1-dev | ||
<pre> | <pre> | ||
Строка 297: | Строка 298: | ||
</pre> | </pre> | ||
# | #При использовании '''FDTDIR''' для выбора '''dtb''' файла при загрузке используются переменные окружения ''SYS_SOC'' и ''SYS_BOARD''. <br/> | ||
===EFI вариант с помощью GRUB=== | |||
Пример вывода из последних сборок openSUSE где включена только EFI загрузка: <br/> | |||
<pre> | |||
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! | |||
</pre> | |||
EFI партиция - hd1,gpt1 | |||
BOOT партиция - hd1,gpt2 | |||
Надо понять какой нужен grub'у конфиг. Чтобы откатиться на boot.scr достаточно написать exit. | |||
==Разное== | ==Разное== |
Текущая версия от 17:08, 21 октября 2018
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
Варианты меню загрузки
Тестовая сборка: 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
- При использовании 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