LINUX.ORG.RU

Как происходит загрузка u-boot'ом с NAND?

 ,


1

2

Есть одна телеприставка на ARM. Недавно обнаружил, что она использует только половину ОЗУ. Стал разбираться, оказалось, что объём ОЗУ ядру сообщает загрузчик, но не через параметры, а как-то хитрее, с использованием бинарного файла script.bin, который собирается под каждую железку индивидуально. Прошивка которую я использовал собиралась для более слабой версии этой железки с 512 мегабайтами ОЗУ, а не с 1024 мегабайтами как у меня. Пересобрал script.bin, записал на SD'шку, система загрузилась с 1024 мегабайтами ОЗУ. Попытался перенести это дело на внутреннюю флешку, облом. Помогите разобраться как происходит процесс загрузки и в каком месте нужно вмешаться и добавить правильные параметры.

Как происходит загрузка с SD:

  • Что-то происходит после включения
  • Управление передаётся файлу script.bin который
  • загружает linux c параметрами из boot.scr

У меня такое чувство, что в пункте «что-то происходит» что-то происходит на устройстве /dev/nanda (первый раздел внутренней флешки), потому что там есть файл u-boot.bin. Однако замена файлов boot.scr и script.bin на /dev/nanda не влияет на результат, то есть файл script.bin на SD'шке влияет на процесс загрузки с SD'шки, а файл script.bin на внутренней флешке не влияет на процесс загрузки с внутренней флешки. Что же происходит?

★★★★★

ХЗ про телевизоры, но приличные встроенные системы тащат конфиг железа в dtb-файле, который лежит где-то во флеше (в зависимости от фантазии разработчика, может быть в отдельном разделе или в ФС).

tailgunner ★★★★★
()

подключи TTL и посмотри на чем затыкается. делов то?

ktk ★★★★
()
Ответ на: комментарий от sergej

Не помогло

Такое чувство, что u-boot в sunxi сконфигурирован грузить с SD'шки, а я хочу чтобы он грузил с NAND'а. Сканпелял u-boot.bin, положил в /linux/u-boot.bin, в консоли такой выхлоп:

HELLO! BOOT0 is starting!
boot0 version : 1.4.0
dram size =1024
Succeed in opening nand flash.
Succeed in reading Boot1 file head.
The size of Boot1 is 0x00036000.
The file stored in 0X00000000 of block 2 is perfect.
Check is correct.
Ready to disable icache.
Succeed in loading Boot1.
Jump to Boot1.
[       0.141] boot1 version : 1.4.0
[       0.141] pmu type = 3
[       0.142] bat vol = 0
[       0.169] axi:ahb:apb=3:2:2
[       0.169] set dcdc2=1400, clock=1008 successed
[       0.171] key
[       0.183] no key found
[       0.183] flash init start
[       0.205] flash init finish
[       0.206] fs init ok
[       0.207] fattype FAT16
[       0.207] fs mount ok
[       0.213] script finish
[       0.214] power finish
[       0.220] BootMain start
[       0.220] 0
[       0.335] key value = 0
[       0.335] recovery key high 6, low 4
[       0.336] unable to find fastboot_key key_max value
[       0.344] test for multi os boot with display
[       0.346] logo name is invalid or dont need show logo
[       0.351] load kernel start
[       0.367] load kernel successed
[       0.367] start address = 0x4a000000
[       0.369] jump to


U-Boot 2014.04-10677-g44910e9 (Nov 27 2014 - 22:57:02) Allwinner Technology

CPU:   Allwinner A10 (SUN4I)
Board: Mele_A1000G
I2C:   ready
DRAM:  1 GiB
MMC:   SUNXI SD/MMC: 0
MMC init failed
Using default environment

In:    serial
Out:   serial
Err:   serial
Net:   emac
Hit any key to stop autoboot:  0 
** Bad device mmc 0 **
** Bad device mmc 0 **
** Bad device mmc 0 **
** Bad device mmc 0 **
** Bad device mmc 0 **
** Bad device mmc 0 **
** Bad device mmc 0 **
** Bad device mmc 0 **
** Bad device mmc 0 **
sun4i# 

Если вставить SD'шку, то нормально грузит с SD'шки.

Как заставить u-boot.bin грузить с /dev/nanda?

Camel ★★★★★
() автор топика
Ответ на: Не помогло от Camel

Как заставить u-boot.bin грузить с /dev/nanda?

читать документацию. там разжевано все очень плотно.

что говорит printenv из убута?

ktk ★★★★
()
Ответ на: Не помогло от Camel

А из командной строки uboot-а nand вообще виден?

По умолчанию uboot просто выполняет команды из переменной окружения bootcmd. А в ней обычно пишут mmc load, sf read или что-то в таком духе.

sergej ★★★★★
()
Ответ на: Не помогло от Camel

printenv делаете и смотрите. скорее всего у вас там только команды для загрузки с флешки есть.

Вот допустим для моей OMAP железки там что-то типа такого:

"nandboot=echo Booting from nand ...; " \
		"run nandargs; " \
		"nand read ${loadaddr} 280000 400000; " \
		"bootm ${loadaddr}\0" \

"nandargs=setenv bootargs console=${console} " \
		"${optargs} " \
		"mpurate=${mpurate} " \
		"eth=${ethmac} "\
		"vram=${vram} " \
		"omapfb.mode=dvi:${dvimode} " \
		"omapdss.def_disp=${defaultdisplay} " \
		"root=${nandroot} " \
		"rootfstype=${nandrootfstype}\0" \

Если что - bootargs - это всякие аргументы, которые передаются в ядро загрузчиком. bootm - команда, которая передает управление (и аргументы bootargs) чему-либо находящемуся по указанному адресу.

Если ваше устройство грузится с карточки, то у вас вместо чего-то типа «nand read ${loadaddr} 280000 400000; » \ будет что-то типа «fatload mmc 0 ${loadaddr} uImage 400000».

RiseOfDeath ★★★★
()
Ответ на: комментарий от sergej

По умолчанию uboot просто выполняет команды из переменной окружения bootcmd.

На моей железке такого переменной окружения вообще нет.

Зато в исходнике есть это

#define CONFIG_BOOTCOMMAND \
	"if mmc rescan ${mmcdev}; then " \
		"if userbutton; then " \
			"setenv bootenv user.txt;" \
		"fi;" \
		"echo SD/MMC found on device ${mmcdev};" \
		"if run loadbootenv; then " \
			"echo Loaded environment from ${bootenv};" \
			"run importbootenv;" \
		"fi;" \
		"if test -n $uenvcmd; then " \
			"echo Running uenvcmd ...;" \
			"run uenvcmd;" \
		"fi;" \
		"if run loaduimage; then " \
			"run mmcboot;" \
		"fi;" \
	"fi;" \
	"run nandboot;" \

т.е. грубо говоря, с нанды грузимся если больше не с чего грузиться.

Вообще будет лучше, если автор выложит исходник для своей железки (%u-boot-src%/include/configs/%devicename%.h)

RiseOfDeath ★★★★
()
Последнее исправление: RiseOfDeath (всего исправлений: 2)
Ответ на: комментарий от ktk

man что?

читать документацию. там разжевано все очень плотно.

Можно ссылку? Я, видимо, пока не ту документацию читал.

to sergej:

А из командной строки uboot-а nand вообще виден?

Как это проверить? Где найти документацию по командной строке u-boot'а?

По умолчанию uboot просто выполняет команды из переменной окружения bootcmd. А в ней обычно пишут mmc load, sf read или что-то в таком духе.

А кто устанавливает bootcmd? У меня при загрузке с NAND явно выполняется не то что прописано в boot.cmd. По идее bootcmd берётся из boot.scr, который собирается из boot.cmd. Какую роль в этом процессе играет script.bin и script0.bin? Почему u-boot.bit на /dev/nanda кладётся в директорию linux, а boot.scr и script.bin в корень?

Чтобы 2 раза не вставать спрошу здесь. Как дела с Linux'ом у плат на чипах RockChip? Особенно волнует RK3288, потому что на нём скоро выйдет Tronsmart Draco Telos (4 ядра, 4 Гб ОЗУ). Спрашиваю потому что уже вышел Tronsmart AW80 (4+4 ядра, 4 Гб ОЗУ), но там AllWinner A80. Про AllWinner в вики linux-sunxi пишут:

Allwinner does not actively participate in or support this community. In fact, it is violating the GPLv2 license in several ways and has so far not shown willingness to resolve this.

Подобной фразы про RockChip не наблюдаю.

Camel ★★★★★
() автор топика
Ответ на: man что? от Camel

Есть команда nand, setenv, и даже saveenv. У меня по умолчанию u-boot ищет на mmc uImage, если нет, то zImage.

Попробуй взять https://github.com/linux-sunxi/u-boot-sunxi и посмотреть что там и как. Можно посмотреть как его собирают https://github.com/archlinuxarm/PKGBUILDs/tree/master/alarm/uboot-sunxi

У рокчипа вроде хуже чем у allwinner, сам не пробовал. На А20 у меня хотя бы 3.18-rc3 из sunxi-next кое как работает.

sergej ★★★★★
()
Ответ на: комментарий от ktk

printenv

sun4i# printenv
autoboot=run loadkernel && run setargs && true && bootm 0x48000000
baudrate=115200
boot_ram=saved_stdout=$stdout;setenv stdout nc;if iminfo 0x41000000; then true; setenv stdout $saved_stdout; source 0x41000000;else setenv stdout $saved_stdout;fi
bootcmd=if run loadbootenv; then echo Loaded environment from ${bootenv};env import -t ${scriptaddr} ${filesize};fi;if test -n "${uenvcmd}"; then echo Running uenvcmd ...;run uenvcmd;fi;if run loadbootscr; then echo Jumping to ${bootscr};source ${scriptaddr};fi;run autoboot;
bootdelay=2
bootenv=uEnv.txt
bootm_size=0x10000000
bootscr=boot.scr
console=ttyS0,115200
device=mmc
ethact=emac
kernel=uImage
loadbootenv=fatload $device $partition $scriptaddr ${bootenv} || ext2load $device $partition $scriptaddr boot/${bootenv} || ext2load $device $partition $scriptaddr ${bootenv}
loadbootscr=fatload $device $partition $scriptaddr ${bootscr} || ext2load $device $partition $scriptaddr boot/${bootscr} ||ext2load $device $partition $scriptaddr ${bootscr}
loadkernel=if bootpath=/boot/ && ext2load $device $partition 0x43000000 ${bootpath}${script} && ext2load $device $partition 0x48000000 ${bootpath}${kernel};then true; elif bootpath=/ && fatload $device $partition 0x43000000 ${script} && fatload $device $partition 0x48000000 ${kernel};then true; elif bootpath=/ && ext2load $device $partition 0x43000000 ${bootpath}${script} && ext2load $device $partition 0x48000000 ${bootpath}${kernel};then true; else false;fi
loglevel=8
panicarg=panic=10
partition=0:1
script=script.bin
scriptaddr=0x44000000
setargs=if test -z \\"$root\\"; then if test \\"$bootpath\\" = "/boot/"; then root="/dev/mmcblk0p1 rootwait"; else root="/dev/mmcblk0p2 rootwait"; fi; fi; setenv bootargs console=${console} root=${root} loglevel=${loglevel} ${panicarg} ${extraargs}
stderr=serial
stdin=serial
stdout=serial

Environment size: 1882/131068 bytes

То же самое нашлось в u-boot-sunxi/include/autoconf.mk:

CONFIG_EXTRA_ENV_SETTINGS="bootm_size=0x10000000\0console=ttyS0,115200\0panicarg=panic=10\0extraargs=\0loglevel=8\0scriptaddr=0x44000000\0device=mmc\0partition=0:1\0setargs=if test -z \\\\\"$root\\\\\"; then if test \\\\\"$bootpath\\\\\" = \"/boot/\"; then root=\"/dev/mmcblk0p1 rootwait\"; else root=\"/dev/mmcblk0p2 rootwait\"; fi; fi; setenv bootargs console=${console} root=${root} loglevel=${loglevel} ${panicarg} ${extraargs}\0kernel=uImage\0bootenv=uEnv.txt\0bootscr=boot.scr\0script=script.bin\0loadbootscr=fatload $device $partition $scriptaddr ${bootscr} || ext2load $device $partition $scriptaddr boot/${bootscr} ||ext2load $device $partition $scriptaddr ${bootscr}\0loadbootenv=fatload $device $partition $scriptaddr ${bootenv} || ext2load $device $partition $scriptaddr boot/${bootenv} || ext2load $device $partition $scriptaddr ${bootenv}\0loadkernel=if bootpath=/boot/ && ext2load $device $partition 0x43000000 ${bootpath}${script} && ext2load $device $partition 0x48000000 ${bootpath}${kernel};then true; elif bootpath=/ && fatload $device $partition 0x43000000 ${script} && fatload $device $partition 0x48000000 ${kernel};then true; elif bootpath=/ && ext2load $device $partition 0x43000000 ${bootpath}${script} && ext2load $device $partition 0x48000000 ${bootpath}${kernel};then true; else false;fi\0autoboot=run loadkernel && run setargs && " RESET_WATCHDOG " && bootm 0x48000000\0boot_ram=saved_stdout=$stdout;setenv stdout nc;if iminfo 0x41000000; then " RESET_WATCHDOG "; setenv stdout $saved_stdout; source 0x41000000;else setenv stdout $saved_stdout;fi\0"

Простите за неровный почерк.

Я конечно могу прописать нужные мне опции в autoconf.mk, но как бы сделать так чтобы работало всё через boot.cmd/boot.scr?

Уважаемый, sergej, позвольте возвать вас, чтобы услышать ваше мнение.

Camel ★★★★★
() автор топика
Последнее исправление: Camel (всего исправлений: 1)
Ответ на: printenv от Camel

В u-boot нет царских путей

Прочитал ещё раз руководство по u-boot'у на NAND'е, внимательнее. u-boot.bin надо собирать из отдельной ветки, потому что в основной ветке нет поддержки NAND. Ну и всё прочее тоже надо выполнять, с хитрым разбиением, nand-part'ом.

Camel ★★★★★
() автор топика
Ответ на: printenv от Camel

если бы ты читал документацию ты бы знал про uEnv.txt

ktk ★★★★
()

у sunxi загрузчик в разделе лежит который цепляется из пзу в биосе и потом подрубив NAND грузит u-boot.

и лучше сделать загрузочную флешку и ничего не трогать.

Slackware_user ★★★★★
()
Ответ на: man что? от Camel

Чтобы 2 раза не вставать спрошу здесь. Как дела с Linux'ом у плат на чипах RockChip? Особенно волнует RK3288, потому что на нём скоро выйдет Tronsmart Draco Telos (4 ядра, 4 Гб ОЗУ). Спрашиваю потому что уже вышел Tronsmart AW80 (4+4 ядра, 4 Гб ОЗУ), но там AllWinner A80.

рокчип делают содомиты :) там очень много ада в исходниках и очень много проблем с переносом на новые борды. _ОЧЕНЬ_

я сильно много крови потерял на rk3066.

ktk ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.