🍔

KR260でKRS1.0のSDカードブートをする(2)

2022/11/05に公開

前回の記事で、SDカードからのブートが出来ない問題に遭遇しました。この記事では、ブートできない原因分析を行い、回避手順について説明したいと思います。
https://zenn.dev/ohkawatks/articles/ab0cfa0bebb8a1

現状:bootパーティションの調査

まず、前回の記事で作ったSDカードのbootパーティションの中身を見てみました。
Windows10マシンでSDカードリーダーに読ませると、bootドライブ(を含む2つのドライブ)が見えますので、その中身を見てみましょう。


図1 KRS1.0のSDカードのbootパーティションの中身

これはPetalinuxのブート用の物なので、AMD-Xilinx公式のUbuntuイメージとはちょっと違うことが分かります。(下記の記事を参照)
https://zenn.dev/ohkawatks/articles/3f945fae4a4e36

前提:Firmwareのアップデート

KR260に関して、Firmwareをアップデートするように指示がありますので、それは済ませておいてください(ブート時に不具合があるらしい)。
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/1641152513/Kria+K26+SOM#Boot-FW-Update-Process

回避手順

まずは結論からということで、回避手順を説明します。

  1. bootパーティションのsystem.dtbをKR260用に上書きする
  2. uEnv.txtを追加して、ブート用の設定(起動cmd)を上書きする

です。

system.dtbの上書き

現状のsystem.dtb(デバイスツリー)はKV260用です。そのため、KR260用のsystem.dtbを用意して、上書きします。
KR260用のsystem.dtbは、Petalinux2022.1のKR260用BSPの中に入っていますので、この記事の下の方にある手順(PetalinuxインストールおよびKR260用プロジェクト作成)で取得します。

uEnv.txtの追加

この記事の下の方にある手順(uEnv.txtの作成)のuEnv.txtをテキストファイルとして保存し、SDカードのbootパーティションに追加します(図2)。eEnv.txtは、SDカードからのブート時に存在する場合に追加で読み込まれる設定ファイルです。(boot.scr内に記載があります)


図2 system.dtbを上書きし、uEnv.txtを追加したbootパーティション

再度ブートに挑戦

ブート時のメッセージに、以下のような内容があり、無事Petalinuxのブートに成功します。

Found U-Boot script /boot.scr
2777 bytes read in 10 ms (270.5 KiB/s)
## Executing script at 20000000
Trying to load boot images from usb0
536 bytes read in 10 ms (51.8 KiB/s)
Importing environment(uEnv.txt) from usb0...
Running uenvcmd ...
28121600 bytes read in 1864 ms (14.4 MiB/s)
46945 bytes read in 14 ms (3.2 MiB/s)
## Flattened Device Tree blob at 00100000
   Booting using the fdt blob at 0x100000
   Loading Device Tree to 000000000fff1000, end 000000000ffff760 ... OK

Starting kernel ...

[    0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd034]
[    0.000000] Linux version 5.15.19-xilinx-v2022.1 (oe-user@oe-host) (aarch64-xilinx-linux-gcc (GCC) 11.2.0, GNU ld (GNU Binutils) 2.37.20210721) #1 SMP Mon Apr 11 17:52:14 UTC 2022
[    0.000000] Machine model: ZynqMP SMK-K26 Rev1/B/A
中略
[    6.275228] Waiting for root device /dev/sda2...
中略
[    8.592058] systemd[1]: Detected architecture arm64.

Welcome to PetaLinux 2022.1_release_S04190222 (honister)!

[    8.634544] systemd[1]: Hostname set to <xilinx-k26-som-20221>.


図3 Petalinuxのブートに成功したの図

初期状態では、ユーザ名:petalinuxでログイン可能です。
https://xilinx.github.io/KRS/sphinx/build/html/docs/examples/0_ros2_publisher.html

以下、分析と考察

以上の手順を得るまでに行った分析と考察を説明します。
長くなりますので、必要なところだけ参照してください。

第1部デバイスツリー

第1部はデバイスツリーです。

さて、起動時のシリアル出力の冒頭はこんな感じでした。(基板上のリセットボタンを押した)

U-Boot 2022.01 (Mar 21 2022 - 14:42:10 +0000)

CPU:   ZynqMP
Silicon: v3
Detected name: zynqmp-smk-k26-xcl2g-revA-sck-kr-g-revA
Model: ZynqMP SMK-K26 Rev1/B/A
Board: Xilinx ZynqMP
DRAM:  4 GiB
PMUFW:  v1.1
Xilinx I2C FRU format at nvmem0:
 Manufacturer Name: XILINX
 Product Name: SMK-K26-XCL2G
 Serial No: XFL1RL1MHGVO
 Part Number: 5057-04
 File ID: 0x0
 Revision Number: A
Xilinx I2C FRU format at nvmem1:
 Manufacturer Name: XILINX
 Product Name: SCK-KR-G
 Serial No: XFL1R2C2VXAM
 Part Number: 5100-01
 File ID: 0x0
 Revision Number: A
EL Level:       EL2
Chip ID:        xck26
NAND:  0 MiB
MMC:
Loading Environment from nowhere... OK
In:    serial
Out:   serial
Err:   serial
Bootmode: QSPI_MODE
Reset reason:   SOFT

少し中略しますが、その続きは、

Hit any key to stop autoboot:  0
model=SMK-K26-XCL2G

Device 0: Vendor: Generic  Rev: 1.98 Prod: Ultra HS-COMBO
            Type: Removable Hard Disk
            Capacity: 29796.0 MB = 29.0 GB (61022208 x 512)
... is now current device
Scanning usb 0:1...
Found U-Boot script /boot.scr
2777 bytes read in 10 ms (270.5 KiB/s)
## Executing script at 20000000
Trying to load boot images from usb0
28121600 bytes read in 1864 ms (14.4 MiB/s)
41817 bytes read in 13 ms (3.1 MiB/s)
5220025 bytes read in 356 ms (14 MiB/s)
## Loading init Ramdisk from Legacy Image at 04000000 ...
   Image Name:   petalinux-initramfs-image-xilinx
   Created:      2011-04-05  23:00:00 UTC
   Image Type:   AArch64 Linux RAMDisk Image (uncompressed)
   Data Size:    5219961 Bytes = 5 MiB
   Load Address: 00000000
   Entry Point:  00000000
   Verifying Checksum ... OK
## Flattened Device Tree blob at 00100000
   Booting using the fdt blob at 0x100000
   Loading Ramdisk to 78b05000, end 78fff679 ... OK
   Loading Device Tree to 000000000fff2000, end 000000000ffff358 ... OK

Starting kernel ...

[    0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd034]
[    0.000000] Linux version 5.15.19-xilinx-v2022.1 (oe-user@oe-host) (aarch64-xilinx-linux-gcc (GCC) 11.2.0, GNU ld (GNU Binutils) 2.37.20210721) #1 SMP Mon Apr 11 17:52:14 UTC 2022
[    0.000000] Machine model: ZynqMP SMK-K26 Rev1/B/A
[    0.000000] earlycon: cdns0 at MMIO 0x00000000ff010000 (options '115200n8')
[    0.000000] printk: bootconsole [cdns0] enabled

そして最後が、

[    4.777292] Run /init as init process
Waiting for /dev/mmcblk1p2 to pop up (attempt 1)
Waiting for /dev/mmcblk1p2 to pop up (attempt 2)
Waiting for /dev/mmcblk1p2 to pop up (attempt 3)
Waiting for /dev/mmcblk1p2 to pop up (attempt 4)
Waiting for /dev/mmcblk1p2 to pop up (attempt 5)
Waiting for /dev/mmcblk1p2 to pop up (attempt 6)
Waiting for /dev/mmcblk1p2 to pop up (attempt 7)
Waiting for /dev/mmcblk1p2 to pop up (attempt 8)
Waiting for /dev/mmcblk1p2 to pop up (attempt 9)
Waiting for /dev/mmcblk1p2 to pop up (attempt 10)
Waiting for /dev/mmcblk1p2 to pop up (attempt 11)
Waiting for /dev/mmcblk1p2 to pop up (attempt 12)
Waiting for /dev/mmcblk1p2 to pop up (attempt 13)
Waiting for /dev/mmcblk1p2 to pop up (attempt 14)
Waiting for /dev/mmcblk1p2 to pop up (attempt 15)
Waiting for /dev/mmcblk1p2 to pop up (attempt 16)
Waiting for /dev/mmcblk1p2 to pop up (attempt 17)
Waiting for /dev/mmcblk1p2 to pop up (attempt 18)
Waiting for /dev/mmcblk1p2 to pop up (attempt 19)
Waiting for /dev/mmcblk1p2 to pop up (attempt 20)
Waiting for /dev/mmcblk1p2 to pop up (attempt 21)
Waiting for /dev/mmcblk1p2 to pop up (attempt 22)
Waiting for /dev/mmcblk1p2 to pop up (attempt 23)
Waiting for /dev/mmcblk1p2 to pop up (attempt 24)
Waiting for /dev/mmcblk1p2 to pop up (attempt 25)
Waiting for /dev/mmcblk1p2 to pop up (attempt 26)
Waiting for /dev/mmcblk1p2 to pop up (attempt 27)
Waiting for /dev/mmcblk1p2 to pop up (attempt 28)
Waiting for /dev/mmcblk1p2 to pop up (attempt 29)
Waiting for /dev/mmcblk1p2 to pop up (attempt 30)
Device /dev/mmcblk1p2 not found
udhcpc: SIOCGIFINDEX: No such device
ERROR: There's no '/dev' on rootfs.

sh: can't access tty; job control turned off
/ #

こんな感じです。

失敗したブートのコマンドプロンプトで調べる

まず、ブートは失敗していますが、コマンドプロンプトが出ていますので、様子を調査します。

/ # ls
bin      etc      init.d   root     sbin     usr
boot     home     lib      rootfs   scripts  var
dev      init     proc     run      sys
/ #

ということで、ファイルシステムが見えました。
ERRORで、/devがないと言っているのですが、/devはありますね・・・

/ # cd /dev/
/dev # ls
autofs         ptye2          ptywd          ttyS0          ttys7
(省略)

中身を見ると、こんな感じでした。
ただ、/dev/mmcblk1p2 は見つかりません。
また通常ストレージデバイスとしてよく使われる/dev/sda もありません。
SDカードの第2パーティションを読んでルートファイルシステムとしてマウント出来れば、起動できるはずなのですが、、、という状況です。

ということで、device_treeが違うためにSDカードのデバイスが見えないのではないかと考えました。(以下、参考記事)
https://qiita.com/koara-local/items/ed99a7b96a0ca252fc4e

KRS1.0のacceleration_firmware

KRS1.0のSDカードイメージを作る際に使われるリソースは、src/firmware/acceleration_firmware_kr260 以下にあるようです。

ohkawa@host:~/krs_ws/src/firmware/acceleration_firmware_kr260/acceleration_firmware_kr260$ ls
CHANGELOG.rst  CMakeLists.txt  LICENSE      patches    scripts
cmake          firmware        package.xml  README.md
ohkawa@host:~/krs_ws/src/firmware/acceleration_firmware_kr260/acceleration_firmware_kr260$ ls firmware/
iot-limerick-kria-classic-desktop-2204-x06-20220614-78-sysroot.tar.xz

ただし、前回の記事で説明したように、現状ではKV260のファームウェアを使っていますので、以下の場所のリソースが使われるようです。

ohkawa@host:~/krs_ws/src/firmware/acceleration_firmware_kv260/acceleration_firmware_kv260/firmware$ ls
bl31.bin      lib                     system.bit
bl31.elf      platform                u-boot.bin
BOARD         platform.cfg            u-boot-dtb.bin
bootbin       pmufw.elf               u-boot-dtb.elf
boot_scripts  pmu_rom_qemu_sha3.elf   u-boot.elf
data          pxelinux.cfg            xen
device_tree   ramdisk.cpio.gz.u-boot  zynqmp_fsbl.elf
emulation     rootfs.cpio.gz          zynqmp-qemu-arm.dtb
imagebuilder  sdk.sh                  zynqmp-qemu-multiarch-arm.dtb
initrd.cpio   setup.sh                zynqmp-qemu-multiarch-pmu.dtb
ipxe          shell.json
kernel        SOC

u-boot, rootfs.cpio.gz, fsblといった文字が見えますので、このあたりが怪しいという事になります。

さて、SDカードのデバイスが見えない問題については、device_treeが怪しそうですので見てみると、以下のように、kv260用のdtbファイルのみあるようです。

ohkawa@host:~/krs_ws/src/firmware/acceleration_firmware_kv260/acceleration_firmware_kv260/firmware/device_tree$ ls
kernel_default.dtbo       zynqmp-sck-kv-g-dp.dtbo
kernel_default.dtbo.dtsi  zynqmp-sck-kv-g-qemu.dtbo
kernel_default.dtsi       zynqmp-sck-kv-g-rev1.dtbo
mmc-enable.dtbo           zynqmp-sck-kv-g-revA.dtbo
mmc-enable.dts            zynqmp-sck-kv-g-revB.dtbo
system.dtb.default        zynqmp-sck-kv-g-revQEMU.dtbo
system.dtb.xen            zynqmp-sck-kv-g-revY.dtbo
system.dts.default.new    zynqmp-sck-kv-g-revZ.dtbo
u-boot.dtb

そのため、kr260のデバイスがうまく見えないのでしょう。

PetalinuxインストールおよびKR260用プロジェクト作成

kr260用のdtbファイルがどこにあるかというと、、、Xilinxが配布しているPetalinuxのKR260用BSP (Board Support Package)に入っています。

この記事を参考にして、kr260用のPetalinuxのプロジェクトを作成してみました。
https://www.hackster.io/whitney-knitter/getting-started-with-the-kria-kr260-in-petalinux-2022-1-daec16

ohkawa@host:~$ petalinux-create --type project -s xilinx-kr260-starterkit-v2022.1-05140151.bsp --name kr260_linux
INFO: Create project: kr260_linux
INFO: New project successfully created in /home/ohkawa/kr260_linux
ohkawa@host:~$ ls kr260_linux/
components  config.project  hardware  pre-built  project-spec  README

すると、pre-built/linux/imagesの中に、dtbファイル達を発見。

ohkawa@host:~/kr260_linux/pre-built/linux/images$ ls
bl31.bin       petalinux-sdimage.wic.xz  som-eeprom.bin
bl31.elf       pmufw.elf                 system.bit
BOOT.BIN       pmu_rom_qemu_sha3.elf     system.dtb
bootgen.bif    pxelinux.cfg              system-zynqmp-sck-kr-g-revB.dtb
boot.scr       ramdisk.cpio.gz           u-boot.bin
config         ramdisk.cpio.gz.u-boot    u-boot-dtb.bin
dtbos          ramdisk.manifest          u-boot-dtb.elf
Image          ramdisk.tar.gz            u-boot.elf
Image.gz       rootfs.cpio.gz            vmlinux
image.ub       rootfs.cpio.gz.u-boot     zynqmp_fsbl.elf
imgsel.bin     rootfs.ext4               zynqmp-qemu-arm.dtb
imgsel.elf     rootfs.jffs2              zynqmp-qemu-multiarch-arm.dtb
kr-eeprom.bin  rootfs.manifest           zynqmp-qemu-multiarch-pmu.dtb
kv-eeprom.bin  rootfs.tar.gz
openamp.dtb    som_build_info.txt

ここにある、system-zynqmp-sck-kr-g-revB.dtb というファイルがそれっぽいので、手元のWindows10マシンにコピーしてきて、名前をsystem.dtbにしてSDカードのbootパーティションに上書きしました。


図3 system.dtbをKR260用のやつで上書きした後(タイムスタンプに注目)

Xilinx Zynq MP First Stage Boot Loader
Release 2022.1   Mar 22 2022  -  19:51:22
MultiBootOffset: 0x40
Reset Mode      :       System Reset
Platform: Silicon (4.0), Running on A53-0 (64-bit) Processor, Device Name: XCZUUNKNEG
QSPI 32 bit Boot Mode
FlashID=0x20 0xBB 0x20
・OTICE:  BL31: v2.6(release):v1.1-9205-gec5dccc32
NOTICE:  BL31: Built : 06:15:49, Mar 22 2022


U-Boot 2022.01 (Mar 21 2022 - 14:42:10 +0000)

CPU:   ZynqMP
Silicon: v3
Detected name: zynqmp-smk-k26-xcl2g-revA-sck-kr-g-revA
Model: ZynqMP SMK-K26 Rev1/B/A
Board: Xilinx ZynqMP
DRAM:  4 GiB
PMUFW:  v1.1
Xilinx I2C FRU format at nvmem0:
 Manufacturer Name: XILINX
 Product Name: SMK-K26-XCL2G
 Serial No: XFL1RL1MHGVO
 Part Number: 5057-04
 File ID: 0x0
 Revision Number: A
Xilinx I2C FRU format at nvmem1:
 Manufacturer Name: XILINX
 Product Name: SCK-KR-G
 Serial No: XFL1R2C2VXAM
 Part Number: 5100-01
 File ID: 0x0
 Revision Number: A
EL Level:       EL2
Chip ID:        xck26
NAND:  0 MiB
MMC:
Loading Environment from nowhere... OK
[    7.962379] scsi 0:0:0:0: Direct-Access     Generic  Ultra HS-COMBO   1.98 PQ: 0 ANSI: 0
[    7.971536] sd 0:0:0:0: [sda] 61022208 512-byte logical blocks: (31.2 GB/29.1 GiB)
[    7.979694] sd 0:0:0:0: [sda] Write Protect is off
[    7.985027] sd 0:0:0:0: [sda] No Caching mode page found
[    7.990336] sd 0:0:0:0: [sda] Assuming drive cache: write through
[    7.999857]  sda: sda1 sda2
[    8.004399] sd 0:0:0:0: [sda] Attached SCSI removable disk
[    9.497909] macb ff0b0000.ethernet eth0: unable to generate target frequency: 125000000 Hz
[    9.507254] macb ff0b0000.ethernet eth0: Link is Up - 1Gbps/Full - flow control off
[    9.514921] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
udhcpc: broadcasting discover
udhcpc: broadcasting select for 192.168.0.113, server 192.168.0.1
udhcpc: lease of 192.168.0.113 obtained from 192.168.0.1, lease time 7200
/etc/udhcpc.d/50default: Adding DNS 192.168.0.1
/etc/udhcpc.d/50default: Adding DNS 192.168.0.1
ERROR: There's no '/dev' on rootfs.

sh: can't access tty; job control turned off
/ #

やはり、以下のメッセージがあってブートが中断してしまうのですが・・・

ERROR: There's no '/dev' on rootfs.

今度は、/dev/sdaデバイスが見えるようになりました!

/ # ls /dev/sd*
/dev/sda   /dev/sda1  /dev/sda2

ということで、これをrootfsとしてマウントしてしまえば起動すると考えられます。

第2部ブートコマンド

第1部で、/dev/sdaが見えるようになりましたので、これを指定してブートすればよいという事になります。

現状のカーネルコマンドライン

現状のカーネルコマンドラインを見てみると、/dev/mmcblk1p2をルートファイルシステムにマウントしようとしています。これを/dev/sda2に変更できれば良いのですが・・・

[    0.000000] Kernel command line: earlycon console=ttyPS1,115200 clk_ignore_unused ext4=/dev/mmcblk1p2:/rootfs init_fatal_sh=1 cma=1000M
[    0.000000] Unknown kernel command line parameters "ext4=/dev/mmcblk1p2:/rootfs init_fatal_sh=1", will be passed to user space.

U-Bootコマンドプロンプトでの調査

ブート時に、

Hit any key to stop autoboot:  2

と2秒だけキーボード入力を待つ時間があります。
ここで何かキーを押すと

ZynqMP>

とプロンプトが出て、コマンドを打てるようになります。(helpで一覧)
printenvコマンドで、環境変数の設定一覧を見ることが出来ます。

ZynqMP> printenv
autoload=no
baudrate=115200
board_manufacturer=XILINX
board_name=SMK-K26-XCL2G
board_rev=A
board_serial=XFL1RL1MHGVO
(中略)
bootcmd=setenv model $board_name && if setexpr model gsub .*$starter* $starter; then run som_cc_boot; else run som_mmc_boot; run som_cc_boot; fi

また、SDカードの中身を見ることもできました。

ZynqMP> fatls usb 0:1 /
 28121600   Image
    41817   system.dtb
     2777   boot.scr
  1409400   BOOT.BIN
  5220025   ramdisk.cpio.gz.u-boot
            System Volume Information/

5 file(s), 1 dir(s)

boot.scrを調べる

ブート時のシリアル出力には、

Found U-Boot script /boot.scr

とありますので、U-Bootが動いて、boot.scrが読み込まれて実行されていることはわかります。

@ikwzm さんの記事や、@pojiro3さんによるとboot.scrが大事なようなので、適当なテキストエディタ(私の場合はTerapad)で開いてみます。

警告っぽいダイアログWindowが出ていますが、書き換えは行わないのでNoを押してひるまずに進みます。

boot.scrには、こんなことが書いてありました。
(冒頭のテキストではない部分(バイナリデータ)は省略)

# This is a boot script for U-Boot
# Generate boot.scr:
# mkimage -c none -A arm -T script -d boot.cmd.default boot.scr
#
################
fitimage_name=image.ub
kernel_name=Image
ramdisk_name=ramdisk.cpio.gz.u-boot
rootfs_name=rootfs.cpio.gz.u-boot


for boot_target in ${boot_targets};
do
	echo "Trying to load boot images from ${boot_target}"
	if test "${boot_target}" = "jtag" ; then
		booti 0x00200000 0x04000000 0x00100000
	fi
	if test "${boot_target}" = "mmc0" || test "${boot_target}" = "mmc1" || test "${boot_target}" = "usb0" || test "${boot_target}" = "usb1"; then
		if test -e ${devtype} ${devnum}:${distro_bootpart} /uEnv.txt; then
			fatload ${devtype} ${devnum}:${distro_bootpart} 0x00200000 uEnv.txt;
			echo "Importing environment(uEnv.txt) from ${boot_target}..."
			env import -t 0x00200000 $filesize
			if test -n $uenvcmd; then
				echo "Running uenvcmd ...";
				run uenvcmd;
			fi
		fi
		if test -e ${devtype} ${devnum}:${distro_bootpart} /${fitimage_name}; then
			fatload ${devtype} ${devnum}:${distro_bootpart} 0x10000000 ${fitimage_name};
			bootm 0x10000000;
                fi
		if test -e ${devtype} ${devnum}:${distro_bootpart} /${kernel_name}; then
			fatload ${devtype} ${devnum}:${distro_bootpart} 0x00200000 ${kernel_name};
		fi
		if test -e ${devtype} ${devnum}:${distro_bootpart} /system.dtb; then
			fatload ${devtype} ${devnum}:${distro_bootpart} 0x00100000 system.dtb;
		fi
		if test -e ${devtype} ${devnum}:${distro_bootpart} /${ramdisk_name} && test "${skip_tinyramdisk}" != "yes"; then
			fatload ${devtype} ${devnum}:${distro_bootpart} 0x04000000 ${ramdisk_name};
			booti 0x00200000 0x04000000 0x00100000
		fi
		if test -e ${devtype} ${devnum}:${distro_bootpart} /${rootfs_name} && test "${skip_ramdisk}" != "yes"; then
			fatload ${devtype} ${devnum}:${distro_bootpart} 0x04000000 ${rootfs_name};
			booti 0x00200000 0x04000000 0x00100000
		fi
		booti 0x00200000 - 0x00100000
	fi
	if test "${boot_target}" = "xspi0" || test "${boot_target}" = "qspi" || test "${boot_target}" = "qspi0"; then
		sf probe 0 0 0;
		sf read 0x10000000 0xF40000 0x6400000
		bootm 0x10000000;
		echo "Booting using Fit image failed"

		sf read 0x00200000 0xF00000 0x1D00000
		sf read 0x04000000 0x4000000 0x4000000
		booti 0x00200000 0x04000000 0x00100000;
		echo "Booting using Separate images failed"
	fi
	if test "${boot_target}" = "nand" || test "${boot_target}" = "nand0"; then
		nand info;
		nand read 0x10000000 0x4180000 0x6400000
		bootm 0x10000000;
		echo "Booting using Fit image failed"

		nand read 0x00200000 0x4100000 0x3200000
		nand read 0x04000000 0x7800000 0x3200000
		booti 0x00200000 0x04000000 0x00100000;
		echo "Booting using Separate images failed"
	fi
done

ここにブート時にやることが全部書いてあるとのことです。
ブート時のメッセージを見るとSDカードの中身を読むところまでは出来ているので、下記のあたりのスクリプトが動いているのだろうなと推測できます。

if test "${boot_target}" = "mmc0" || test "${boot_target}" = "mmc1" || test "${boot_target}" = "usb0" || test "${boot_target}" = "usb1"; then
		if test -e ${devtype} ${devnum}:${distro_bootpart} /uEnv.txt; then
			fatload ${devtype} ${devnum}:${distro_bootpart} 0x00200000 uEnv.txt;
			echo "Importing environment(uEnv.txt) from ${boot_target}..."
			env import -t 0x00200000 $filesize
			if test -n $uenvcmd; then
				echo "Running uenvcmd ...";
				run uenvcmd;
			fi
		fi

ここでuEnv.txtを読み込んでenv import...していますので、uEnv.txtに必要な設定を書き込んでしまえばよさそうです。

uEnv.txtの作成

ということで、Linux起動時のコマンドライン(bootargs)に適切な設定を行いブートするためのuEnv.txtを作成しました。

uEnv.txt
linux_img_load_cmd=fatload usb 0:1 0x00200000 Image
linux_fdt_load_cmd=fatload usb 0:1 0x00100000 system.dtb
linux_ramdisk_load_cmd=fatload usb 0:1 0x04000000 ramdisk.cpio.gz.u-boot

linux_boot_cmd=booti 0x00200000 - 0x00100000
linux_load_cmd=env run linux_img_load_cmd && env run linux_fdt_load_cmd
linux_args_cmd=setenv bootargs earlycon root=/dev/sda2 rootwait console=ttyPS1,115200 clk_ignore_unused xilinx_tsn_ep.st_pcp=4 init_fatal_sh=1 cma=900M

uenvcmd=env run linux_args_cmd && env run linux_load_cmd && env run linux_boot_cmd

(Thanks to @pojiro3

内容は、bootパーティションのImage, system.dtb, ramdisk.cpio.gz.u-bootファイルをそれぞれ指定のメモリアドレス上に読み込み、ブートコマンドを指定して、実行するということです。

もともとはramdisk.cpio.gz.u-bootをrootfsとしてマウントしてから、SDカードの第2パーティション(/dev/mmcblk1p2)をrootfsとしてマウントする、2段階構成のブートシーケンスでした。

しかし、このuEnv.txtでは、ramdisk.cpio.gz.u-bootを読み込んではいますが、それを使わずに/dev/sda2を直接マウントして起動しています。(linux_boot_cmd=booti 0x00200000 - 0x00100000 がその意味)

SDカードからのPetalinuxのブートに成功

下記の様に無事Petalinuxのブートに成功しました。

xilinx-k26-som-20221 login: petalinux
You are required to change your password immediately (administrator enforced).
New password:
Retype new password:
xilinx-k26-som-20221:~$

また、KRS1.0のROS2動作についても、下記の様にうまくいきました。


図3 ROS2のtopic listコマンドの実行


図4 ROS2のvadd_publisherノードの実行とros topic echoによるPub/Sub通信内容表示

今後の方針

とりあえずsystem.dtbとuEnv.txtの上書き・追加で動くようになりましたが、これをKRSのsrc/firmware/acceleration_firmware_kr260にどうやって埋め込んでいくか、については今後の課題です。とりあえずKRSのGithubにIssueにコメントはしてみました。
https://github.com/Xilinx/KRS/issues/73#issuecomment-1304436096

また、KR260のBoot FirmwareについてはLinux以外のOSを起動することも想定して、A/Bを切り替えられるような設計になっているようですので、この解決策がAMD-Xilinxの方針に合っているかどうかは不明です。この辺は今後の課題かと思います。

参考情報

この調査分析をするにあたっての参考情報をまとめておきます。ありがとうございました!

参考情報:ブートシーケンスの解説

ブートにおいては、@ikwzm さんの記事が大変よく解説していますので参考にして進めました。
https://qiita.com/ikwzm/items/aca938c98b636c0048bc

参考情報:KV260とKR260のブート時の挙動の違い

KV260でブートするなら、KR260でもブートするんじゃないの? とふつう思いますが・・・調査したところ、どうやらKV260とKR260のブート時の挙動には違いがあるようです。
https://xilinx.github.io/kria-apps-docs/bootfw/build/html/docs/bootfw_overview.html

なにやらKR260では矢印がカクっと曲がっているのですが・・・何が違うのかは不明です。

Discussion