LINUX.ORG.RU

Загрузка RK3568 из памяти

 , , ,


0

1

Добрый день. Пытаюсь на существующей железяке, построенной на RK3568, запустить ядро, дерево устройств и корневую ФС из памяти (чтобы не тереть и не сносить существующую систему на SPI NOR флеш). Собрал при помощи buildroot новую rootfs, новое ядро. Дерево устройств взял от старой системы (вытянул бинарник из FIT). Пытаюсь загрузиться, но возникает ошибка:

=> bootm $kernel_addr $rootfs_addr $fdt_addr_r

No misc partition

## Booting kernel from Legacy Image at 002a0000 ...

   Image Name:   

   Image Type:   AArch64 Linux Kernel Image (uncompressed)

   Data Size:    10218103 Bytes = 9.7 MiB

   Load Address: 002a0000

   Entry Point:  002a0000

   Verifying Checksum ... OK

## Loading init Ramdisk from Legacy Image at 00ca0000 ...

   Image Name:   

   Image Type:   AArch64 Linux RAMDisk Image (uncompressed)

   Data Size:    14050216 Bytes = 13.4 MiB

   Load Address: 00000000

   Entry Point:  00000000

   Verifying Checksum ... OK

ERROR: Did not find a cmdline Flattened Device Tree

Could not find a valid device tree

Я загрузил файлы по указанным адресам по tftp. Вывод printenv

=> printenv

arch=arm

autoload=no

baudrate=115200

bootaddr=0x04080000

bootargs=console=ttyFIQ0,115200n8 storagemedia=mtd earlycon=uart8250,mmio32,0xfe660000 root=/dev/mtdblock4 rootfstype=squashfs

bootcmd=run spi_bootcmd 

bootdelay=3

console=ttyFIQ0

cpu=armv8

devnum=2

devtype=mtd

eth1addr=92:6f:83:fe:c2:a3

ethact=ethernet@fe010000

ethaddr=00:00:01:00:00:01

ethprime=eth1

fdt_addr_r=0x08300000

fdtcontroladdr=0x3b9e5d80

fileaddr=0xca0000

filesize=0xd663e8

gatewayip=10.5.5.1

ipaddr=10.5.5.30

kernel_addr=0x002a0000

kernel_addr_r=0x00280000

kernel_name="kernel"

kernel_size=0x00a00000

loadaddr=0x00c00800

netmask=255.255.255.0

rkloader_addr=0x00000000

rkloader_name="rkloader"

rootfs_addr=0x00ca0000

rootfs_name="rootfs"

serverip=10.5.5.1

soc=rockchip

spi_bootcmd=echo Trying load from spi..;sf probe && sf read $bootaddr $kernel_addr $kernel_size; bootm $bootaddr"

tftpkernel=tftp $loadaddr $serverip:$kernel_name

tftploader=tftp $loadaddr $serverip:$rkloader_name

tftprootfs=tftp $loadaddr $serverip:$rootfs_name

tftpuboot=tftp $loadaddr $serverip:$uboot_name

uboot_addr=0x00080000

uboot_name="uboot"

uboot_version="U-Boot " "2017.09-svn489" " (" "Jun 02 2023" " - " "17:38:35" " " "+0800" ")" "uboot_20230602.173820"

upkernel=run tftpkernel;sf probe;sf erase $kernel_addr +$filesize;sf write $fileaddr $kernel_addr $filesize

uploader=run tftploader;sf probe;sf erase $rkloader_addr +$filesize;sf write $fileaddr $rkloader_addr $filesize

uprootfs=run tftprootfs;sf probe;sf erase $rootfs_addr +$filesize;sf write $fileaddr $rootfs_addr $filesize

upuboot=run tftpuboot;sf probe;sf erase $uboot_addr +$filesize;sf write $fileaddr $uboot_addr $filesize

vendor=rockchip

ver=U-Boot 2017.09-svn489 (Jun 02 2023 - 17:38:35 +0800)uboot_20230602.173820

version="uboot_20230602.173820"

Я не сосвем понимаю, как происходит загрузка в существующей системе. вроде бы, bootm должны передаваться три адреса: ядро, rootfs и dtb. Но в команде spi_bootcmd чтение из флеш только образа ядра.

Ответ на: комментарий от kriptonus

понял, невнимательно прочитал.

тем не менее FDT надо в память подложить. без нее ядро не конфигурится, там же обычно есть такая секция:

chosen {
   bootargs = "earlycon console=ttyS2,115200 root=/dev/ram ramdisk_size=262144 loglevel=6";
   stdout-path = &uart3;
}
yax123 ★★★★★
()
Ответ на: комментарий от yax123

Да, я пытаюсь ее подкладывать, по tftp все загружается, но вот найти при запуске не может. Возможно ли, что от версии ядра зависит? Я попытался старый файл устройств декомпилировать и заново полученный dts скомпилировать, получилось то же самое, по крайней мере, по размеру

kriptonus
() автор топика
Ответ на: комментарий от kriptonus

Теоретически такое может быть. Практически с таким не сталкивался. обычно если юбут работает, то его уже не трогают играются с ядром и DT.

Ищи ошибку в адресах и размерах. Чудес не бывает

yax123 ★★★★★
()

Пишут, что поддержка этого варианта загрузки (3 аргумента: ядро, rootfsramdisk и dtb) зависит от того, как u-boot скомпилирован (была ли включена опция CONFIG_LEGACY_IMAGE_FORMAT): https://docs.u-boot.org/en/latest/usage/cmd/bootm.html#legacy-boot

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

В общем случае зависят, драйверы переписывают и DTS для них меняется. Я DTS от 4 версии переписывал, чтобы на 6 загрузилось, например, там много чего у меня поменялось.

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

Да, я уже пытаюсь загрузить FIT. Начально так и сделано. Уже есть некоторый прогресс, но теперь другая проблема. Я взял старый FIT, вытащил из него fdt. (При этом, dumpimage показывает в FIT образы, и этот образ определяется как fdt, binwalk тоже так же определяет,но стоит его вытащить, то dumpimage показываеи, что отсутствует какое-то поле или ещё что-то «@».- уже ушел с работы, не могу точно сказать). Размер такой же, как указан в оригинальном образе. При попытке его вкомпилить в новый FIT, размер увеличивается килобайт на 30. При попытке загрузки выдает, что это не образ дерева, пытается взять блоб с другого адреса и выводит, что FDT. ATAGS не вкомпилены. Reset. Более точные сообщения смогу только в понедельник

kriptonus
() автор топика
Ответ на: комментарий от kriptonus

Такое сообщение при попытке загрузить. Уже попытался заменить dtb в FIT на другой, из репозитория ядра Rockchip

=> bootm

Fdt Ramdisk skip relocation

No misc partition

## Loading kernel from FIT Image at 04080000 ...

   Using 'standard' configuration

optee api revision: 2.0

TEEC: Waring: Could not find security partition

## Verified-boot: 0

   Trying 'kernel' kernel subimage

     Description:  Kernel

     Type:         Kernel Image

     Compression:  uncompressed

     Data Start:   0x040800b4

     Data Size:    25319936 Bytes = 24.1 MiB

     Architecture: AArch64

     OS:           Linux

     Load Address: 0x00280000

     Entry Point:  0x00280000

     Hash algo:    sha1

     Hash value:   16e1ada82ffe1b60e03e2626a337177b15b26811

   Verifying Hash Integrity ... sha1+ OK

## Loading fdt from FIT Image at 04080000 ...

   Using 'standard' configuration

   Trying 'fdt' fdt subimage

     Description:  DTB

     Type:         Flat Device Tree

     Compression:  uncompressed

     Data Start:   0x058a5b90

     Data Size:    163840 Bytes = 160 KiB

     Architecture: AArch64

     Load Address: 0x08300000

     Hash algo:    sha1

     Hash value:   b03b01366645d9144ad5737e5c79282ec7396b3d

   Verifying Hash Integrity ... sha1+ OK

Subimage data is not a FDT   Booting using the fdt blob at 0x3de76d68

   Loading Kernel Image from 0x040800b4 to 0x00280000 ... OK

   kernel loaded at 0x00280000, end = 0x01aa5a00

FDT and ATAGS support not compiled in - hanging

### ERROR ### Please RESET the board ###
kriptonus
() автор топика
Ответ на: комментарий от kriptonus

Мне кажется, причина в этом:

Subimage data is not a FDT

Почему эта часть образа НЕ распознана как FDT - у меня догадок нет, да я вообще и не пользовался ни разу FIT-образами, не знаю, как их правильно создавать.


Кстати, для отладки можно:

  1. взять заведомо рабочий FIT-образ из SPI NOR флеш
  2. попытаться загрузиться с ним по TFTP
  3. сравнить с построенным вручную образом (распаковать, если это возможно)
PeleWin
()
Последнее исправление: PeleWin (всего исправлений: 1)
Ответ на: комментарий от kriptonus

Кстати, аноним может быть прав. Если сообщение «FDT and ATAGS support not compiled in» пишет уже ядро, а не u-boot, то, может быть, в ядре не включена поддержка FDT. Тогда надо ядро пересобирать или другое искать.
Но вроде (не уверен) должна быть строка «Starting kernel …» до того как управление от u-boot перейдёт к ядру. Тогда сообщение про FDT написано u-boot-ом и смысла в сообщении нет - ведь этот же u-boot нормально загружает образ из SPI NOR флеш.

PeleWin
()
Ответ на: комментарий от anonymous

Спасибо. Похоже, разобрался. Не знаю, что повлияло, но заметил, что в оригинале стоял хеш по sha256, у меня по sha1. Ну и еще раз пересобрал, вроде все заработало.

Господа, всем огромное спасибо! Как обычно, нужно чуть больше внимательности.

kriptonus
() автор топика