Uboot: различия между версиями

Материал из Toshiba AC100 wiki
Перейти к навигации Перейти к поиску
м (fix layout)
 
(не показаны 22 промежуточные версии 3 участников)
Строка 1: Строка 1:
'''TODO''' : привести в человеческий вид
'''TODO''' : привести в человеческий вид


===Особенности===
==Особенности==
Сразу опишу некоторые нюансы, т.к. многие не дочитывают до конца или пропускают нюансы. <br/>
Сразу опишу некоторые нюансы, т.к. многие не дочитывают до конца или пропускают нюансы. <br/>
<span style="color: #ff0000;">1. Загрузочный скрипт должен быть запакован командой mkimage</span> <br/>
<span style="color: #ff0000;">1. Загрузочный скрипт должен быть запакован командой mkimage</span> <br/>
<span style="color: #ff0000;">2. initrd/initramfs образ должен быть запакован командой mkimage</span> <br/>
<span style="color: #ff0000;">2. initrd/initramfs образ должен быть запакован командой mkimage</span> <br/>


===Как работает u-boot===
==Версии==
При использовании fastboot (загрузчик, с которым тошка шла по-умолчанию) ядро, инитрд, cmdline нужно было упаковать в boot образ и записать в 5 или 6 партицию. Бут образ из 6-й грузился по-умолчанию, из 5-й - по домику.
* mainline
При использовании u-boot'а бут образы не используются. Ядро и initrd должны лежать на файловой системе партиции. Cmdline задается в загрузочном скрипте. Загрузка происходит следующим образом:
Отсутствует поддержка клавиатуры. В 2016-11 не работает экран (патч ушел в мейллист, но не приянт)
u-boot перебирает sd, emmc, usb и ищет там файл загрузочного скрипта (boot.scr). Если он его не находит, вываливается в командную строку (u-boot'а, линукса там никакого нет). Если скрипт находится, то выполняется этот скрипт. В скрипте задается cmdline, считывается в память ядро, инитрд, device tree (для ядер 3.8 и новее) и зовется команда загрузки (bootz или bootm).
* Старая версия (2013 год)
 
Добавлена поддержка клавиатуры, экран работает. Отсутствует поддержка многих вещей, которые появились за последние несколько лет (extlinux, например)
===Установка ОС===
* 2016-11-nvec-v1-dev
См. https://paz00.ru/index.php/Uboot_installation_ru установка ОС с u-boot'ом (https://paz00.ru/index.php/Uboot_installation en)
Портирован патч с поддержкой клавиатуры.
Добавлен фикс экрана
*Особо не тестировалась*


===Собранные версии===
==Собранные версии==
[http://tinyurl.com/cukvzlp uboot.bin] с работающим экраном ([https://gitorious.org/uboot-ac100/uboot-ac100/commits/uboot-next-ac100 исходники] на gitorious).
[http://tinyurl.com/cukvzlp uboot.bin] с работающим экраном ([https://gitorious.org/uboot-ac100/uboot-ac100/commits/uboot-next-ac100 исходники] на gitorious).
* пока не работает встроенная клавиатура
* пока не работает встроенная клавиатура
Строка 22: Строка 24:
[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
[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==
При использовании 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'а/ядра не заливая его на внутренний накопитель.
Иногда удобно проверять работу u-boot'а/ядра не заливая его на внутренний накопитель.
Загрузить uboot в тошибу не меняя ничего на накопителе можно командой
Загрузить uboot в тошибу не меняя ничего на накопителе можно командой
===nvflash===
<pre>
<pre>
nvflash --bl ./u-boot-dtb-tegra.bin --go
nvflash --bl ./u-boot-dtb-tegra.bin --go
Строка 47: Строка 62:
nvflash --bl boot-image.ram --go
nvflash --bl boot-image.ram --go
</pre>
</pre>
===tegrarcm===
можно использовать tegrarcm:
можно использовать tegrarcm:
<pre>
<pre>
Строка 52: Строка 68:
</pre>
</pre>


=== Загрузка с USB флешки ===
==Загрузка с USB флешки==
'''for-next загружается, 3.1 в процессе'''
'''for-next загружается, 3.1 в процессе'''
<pre>
<pre>
Строка 93: Строка 109:
Если ядро не использует fdt - его не грузим и убираем последний параметр в команде bootz.
Если ядро не использует fdt - его не грузим и убираем последний параметр в команде bootz.


=== Запись uboot'а на место загрузчика ===
==Запись uboot'а на место загрузчика==
'''Не все описание точное, u-boot "подрос" :)'''
'''Не все описание точное, u-boot "подрос" :)'''
[http://ac100.grandou.net/swarren_brain_dump U-Boot] (by Stephen Warren)
[http://ac100.grandou.net/swarren_brain_dump U-Boot] (by Stephen Warren)
Строка 126: Строка 142:
Так же советуемая Паулом putusb Муромца не работает из за какой то банальщины вроде неправильного импортирования модулей. (Муромцу подзатыльник за то что все сломал.)
Так же советуемая Паулом putusb Муромца не работает из за какой то банальщины вроде неправильного импортирования модулей. (Муромцу подзатыльник за то что все сломал.)


===Сборка:===
==Сборка==
Для v2016.11-nvec-v1-dev
<pre>
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 <количество потоков>
</pre>
Для старых версий
<pre>
<pre>
git clone git://git.denx.de/u-boot-tegra.git
git clone git://git.denx.de/u-boot-tegra.git
Строка 161: Строка 186:
mmc read 0x1000000 0x3404 0x1804
mmc read 0x1000000 0x3404 0x1804


==[[#Bootmenu]][[#bootmenu]]Bootmenu==
==Варианты меню загрузки==
===Устаревший вариант: Bootmenu===
Тестовая сборка: [https://dl.dropboxusercontent.com/u/40761340/Test/sos-uboot-r5-2013-09-23.bin Test/sos-uboot-r5-2013-09-23.bin]
Тестовая сборка: [https://dl.dropboxusercontent.com/u/40761340/Test/sos-uboot-r5-2013-09-23.bin Test/sos-uboot-r5-2013-09-23.bin]
Для записи uboot'а на место постоянного загрузчика: загрузить образ в память, выполнить ./switch_to_uboot
Для записи uboot'а на место постоянного загрузчика: загрузить образ в память, выполнить ./switch_to_uboot


'''НЕПРОВЕРЕННЫЙ ВАРИАНТ'''
'''НЕПРОВЕРЕННЫЙ ВАРИАНТ'''
Должен выдать меню из следующих пунктов:
Должен выдать меню из следующих пунктов:
Boot kernel
Boot kernel
Boot recovery
Boot recovery
Boot from SD
Boot from SD
Boot from USB
Boot from USB
Uboot
Uboot


Строка 236: Строка 269:
</pre>
</pre>


==Скрипты от nvidia==
===Новый вариант: Extlinux===
В новых версиях u-boot появилась поддержка syslinux скриптов для создания меню загрузки. <br/>
[http://git.denx.de/?p=u-boot.git;a=blob;f=doc/README.distro;h=9e4722a86ee562fdc80b675f5be9d30e30e61597;hb=HEAD README в исходниках U-Boot] <br/>
 
Пример конфигурации:
<pre>
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
</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.
 
==Разное==
===Bootable флаг в U-Boot===
[http://lists.denx.de/pipermail/u-boot/2012-October/136724.html Описание как в U-Boot считывается bootable флаг] <br/>
 
===Скрипты от nvidia для прошивки U-Boot===
https://github.com/NVIDIA/tegra-uboot-flasher-scripts
https://github.com/NVIDIA/tegra-uboot-flasher-scripts
https://github.com/NVIDIA/tegra-uboot-scripts
https://github.com/NVIDIA/tegra-uboot-scripts




==Mainline==
===Патчи Нвек в Mainline U-Boot===
http://patchwork.ozlabs.org/project/uboot/list/?submitter=Andrey+Danin&state=*&archive=both
http://patchwork.ozlabs.org/project/uboot/list/?submitter=Andrey+Danin&state=*&archive=both
===Persistent enviroment location===
This settings live in ''include/configs/paz00.h''
<pre>
/* 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
</pre>
<pre>
<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
</pre>
===Factory kernel 2.6.32-9 with U-Boot===
<pre>
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.
</pre>
====how to override this machine ID?====
'''0x00000c38''' is 3128 decimal, defined in arch/arm/include/asm/mach-types.h
in U-Boot.
<pre>
#define MACH_TYPE_PAZ00                3128
</pre>
===load U-Boot default enviroment settings===
<pre>
env default -a
</pre>
----

Текущая версия от 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

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

Устаревший вариант: 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