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

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


==Сборка:==
==Сборка==
Для v2016.11-nvec-v1-dev
Для v2016.11-nvec-v1-dev
<pre>
<pre>

Версия от 13:55, 19 декабря 2016

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

Особенности

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

Версии

  • mainline

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

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

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

  • 2016-11-nvec-v1-dev

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

Как работает 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)

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

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

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. Для выбора dtb файла при загрузке используются переменные окружения soc и board.

Разное

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