KR260でKRS1.0のSDカードブートをする(2)
前回の記事で、SDカードからのブートが出来ない問題に遭遇しました。この記事では、ブートできない原因分析を行い、回避手順について説明したいと思います。
現状:bootパーティションの調査
まず、前回の記事で作ったSDカードのbootパーティションの中身を見てみました。
Windows10マシンでSDカードリーダーに読ませると、bootドライブ(を含む2つのドライブ)が見えますので、その中身を見てみましょう。
図1 KRS1.0のSDカードのbootパーティションの中身
これはPetalinuxのブート用の物なので、AMD-Xilinx公式のUbuntuイメージとはちょっと違うことが分かります。(下記の記事を参照)
前提:Firmwareのアップデート
KR260に関して、Firmwareをアップデートするように指示がありますので、それは済ませておいてください(ブート時に不具合があるらしい)。
回避手順
まずは結論からということで、回避手順を説明します。
- bootパーティションのsystem.dtbをKR260用に上書きする
- 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でログイン可能です。
以下、分析と考察
以上の手順を得るまでに行った分析と考察を説明します。
長くなりますので、必要なところだけ参照してください。
第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カードのデバイスが見えないのではないかと考えました。(以下、参考記事)
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のプロジェクトを作成してみました。
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を作成しました。
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にコメントはしてみました。
また、KR260のBoot FirmwareについてはLinux以外のOSを起動することも想定して、A/Bを切り替えられるような設計になっているようですので、この解決策がAMD-Xilinxの方針に合っているかどうかは不明です。この辺は今後の課題かと思います。
参考情報
この調査分析をするにあたっての参考情報をまとめておきます。ありがとうございました!
参考情報:ブートシーケンスの解説
ブートにおいては、@ikwzm さんの記事が大変よく解説していますので参考にして進めました。
参考情報:KV260とKR260のブート時の挙動の違い
KV260でブートするなら、KR260でもブートするんじゃないの? とふつう思いますが・・・調査したところ、どうやらKV260とKR260のブート時の挙動には違いがあるようです。
なにやらKR260では矢印がカクっと曲がっているのですが・・・何が違うのかは不明です。
Discussion