🍖

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

2022/11/04に公開

本記事では、KR260上にて、KRS1.0のPetalinuxのSDブートに挑戦した経過を共有したいと思います。(1)ではSDカードイメージの作成まで、(2)でSDカードのブートについて書きます。(なお現時点でブートは成功済みです)

KRSとは?

KRS (Kria Robotics Stack)は、VitisフローのFPGA回路(xclbin)を含むROS2ノードをKria SOM(KV260やKR260)で動くようにするところまでパッケージになっているものです。KRS1.0には、Ubuntu22.04でROS2のワークスペースをコピーしてそのまま動かす方法、Ubuntu22.04上でクロスコンパイルしてPetalinuxがブートするSDカードを作る方法、QEmuで動かす方法、等があります。

https://xilinx.github.io/KRS/

KRSの特徴

先日のAMD-Xilinxのウェビナーで、KRSの特徴を以下のように整理して説明しました。手前味噌ですが、我々のグループで研究開発しているforestと比較しています。
https://pages.xilinx.com/JP-WB-2022-10-13-KR260ROS2webinar_LP-Registration.html

forestはVivado HLSの回路記述を元にして入出力ROS2メッセージを自動生成し、Ubuntu-PYNQ上で動くROS2ノードを生成します(bitファイル、hwhファイル使用)。

一方、KRSはOpenCLの開発フロー(Vitis)で作成した回路を含むROS2ノードを開発するプラットフォームです。ROS2ノードを、Ubuntuの他、Petalinux上で動かすことが出来ます(xclbinファイルを使用)。Petalinuxで動かせるのでイメージサイズが比較的小さくブート時間が短いのがうれしいです。


図1 KRSの特徴(forestと比較)

ちなみにforestのレポジトリはこちら。
https://github.com/ros2-forest/forest

クロスコンパイルの失敗への対処たち

Ubuntu22.04の環境で手順(下記URLのUbuntu 22.04 Cross-compilation development)に従ってクロスコンパイルを行います。
https://xilinx.github.io/KRS/sphinx/build/html/docs/install.html#ubuntu-22-04

下記のところで、

###################################################
# 5. build the workspace and deploy firmware for hardware acceleration
###################################################
...
colcon build --merge-install  # about 18 mins in an AMD Ryzen 5 PRO 4650G

ここのcolcon build --merge-installでエラーで止まるかもしれません。
(私の環境の場合とまりました)

対処:qemuのインストール

同じように困っている人がいて、

https://github.com/Xilinx/KRS/issues/59

sudo apt install qemu-user-static 

で、qemuを入れてやったら、私の場合は上手くビルドできるようになりました。(それだけではうまくいかない場合もあるらしい)

対処:動かないパッケージを削除する

KRSのインストールを行う際に、githubのレポジトリからソースコードをcloneしてビルドしていきます。そのため、その時点でのソースコードの状況によって、エラーが出てしまうことがあります。(KRSが依然活発に開発中という事なのですが、、、昨日はビルドできたのに・・・今日は出来ない、ということも、現状では結構ある。バージョンを固定するようにした方が良いですよね・・・Issueに上げないと。。。)

例えば、今日記事を作成しながらcolcon build --merge-installしたら、以前は見たことのないエラーが出てきました。

--- stderr: accelerated_vadd
/home/ohkawa/krs_ws/src/acceleration/acceleration_examples/nodes/accelerated_vadd/src/host.cpp:24:10: fatal error: vitis_common/common/ros_opencl_120.hpp: No such file or directory
   24 | #include <vitis_common/common/ros_opencl_120.hpp>
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
gmake[2]: *** [CMakeFiles/accelerated_vadd.dir/build.make:76: CMakeFiles/accelerated_vadd.dir/src/host.cpp.o] Error 1
gmake[1]: *** [CMakeFiles/Makefile2:137: CMakeFiles/accelerated_vadd.dir/all] Error 2
gmake: *** [Makefile:146: all] Error 2
---
Failed   <<< accelerated_vadd [0.42s, exited with code 2]

恐らくINCLUDEパスの設定だとは思うのですが、よくわからないので、とりあえずパッケージごと削除して、先に進むというのも一案です。

ohkawa@host:~/krs_ws$ rm -rf src/acceleration/acceleration_examples/nodes/accelerated_vadd

これで、上記のエラーは出なくなりました・・・が同じようなエラーが別のパッケージで出ますので、それも削除すればとりあえずは先に進めます。

対処:KR260のファームウェアに関するWorkaround

KR260に関しては、まだfirmwareが準備中ということで、以下のWorkaroundの指示があります。
https://github.com/Xilinx/KRS/issues/62#issue-1292007180

###################################################
# 6.B workaround for KR260 additional firmware elements
#   see https://github.com/Xilinx/KRS/issues/62#issue-1292007180
#
# TODO: remove this once these artifacts are added to KR260
#   firmware ROS package (acceleration_firmware_kr260)
###################################################
# fetch KV260 firmware
cd ~/krs_ws
wget https://www.xilinx.com/bin/public/openDownload?filename=acceleration_firmware_kv260.zip -P src/firmware/acceleration_firmware_kv260
unzip src/firmware/acceleration_firmware_kv260/openDownload\?filename\=acceleration_firmware_kv260.zip -d src/firmware/acceleration_firmware_kv260/

つまり、KV260のファームウェアを持ってきて使うという事のようです。
(githubのissueで書いていますが、firmwareに関しては未だKR260の対応は不完全のようです)

対策:やはりクロスコンパイルがうまくいかない・・・

下記のステップも現在うまくいかず・・・

###################################################
# 7.A cross-compile and generate ONLY CPU binaries
###################################################
colcon build --build-base=build-kr260-ubuntu --install-base=install-kr260-ubuntu --merge-install --mixin kr260 --cmake-args -DNOKERNELS=true

###################################################
# 7.B cross-compile and generate CPU binaries and accelerators
###################################################
colcon build --build-base=build-kr260-ubuntu --install-base=install-kr260-ubuntu --merge-install --mixin kr260

仕方がないので、下記の手順で必要なパッケージのみのビルド(--packages-select)を行ってPetalinuxのSDカードイメージを生成しました。

https://xilinx.github.io/KRS/sphinx/build/html/docs/examples/0_ros2_publisher.html#building-creating-the-raw-image-and-running-in-hardware

ohkawa@host:~/krs_ws$ colcon acceleration select kv260
ohkawa@host:~/krs_ws$ colcon acceleration list
kr260
kv260*
ohkawa@host:~/krs_ws$ colcon build --build-base=build-kv260 --install-base=install-kv260 --merge-install --mixin kv260 --packages-select ament_acceleration ament_vitis vadd_publisher
Starting >>> ament_acceleration
Finished <<< ament_acceleration [0.63s]                  
Starting >>> ament_vitis
Finished <<< ament_vitis [0.64s]                  
Starting >>> vadd_publisher
Finished <<< vadd_publisher [8.08s]                     

Summary: 3 packages finished [9.53s]
ohkawa@host:~/krs_ws$ colcon acceleration linux vanilla --install-dir install-kv260
SECURITY WARNING: This class invokes explicitly a shell via the shell=True argument of the Python subprocess library, and uses admin privileges to manage raw disk images. It is the user's responsibility to ensure that all whitespace and metacharacters passed are quoted appropriately to avoid shell injection vulnerabilities.
- Creating a new base image using /home/ohkawa/krs_ws/acceleration/firmware/select/rootfs.cpio.gz ...
[sudo] password for ohkawa: 
- Image successfully created
- Confirmed availability of raw image file at: /home/ohkawa/krs_ws/acceleration/firmware/select/sd_card.img
- Finished inspecting raw image, obtained UNITS and STARTSECTOR for partition: 1.
- Image mounted successfully at: /tmp/sdcard_img_p1
- Found kernel file /home/ohkawa/krs_ws/acceleration/firmware/select/kernel/Image
- Kernel deployed successfully (/home/ohkawa/krs_ws/acceleration/firmware/select/kernel/Image).
- Found boot script file: /home/ohkawa/krs_ws/acceleration/firmware/select/boot_scripts/boot.scr.default
- Boot script deployed successfully (/home/ohkawa/krs_ws/acceleration/firmware/select/boot_scripts/boot.scr.default).
- Found file: /home/ohkawa/krs_ws/acceleration/firmware/select/ramdisk.cpio.gz.u-boot
- File added successfully (/home/ohkawa/krs_ws/acceleration/firmware/select/ramdisk.cpio.gz.u-boot).
- Found device tree file: /home/ohkawa/krs_ws/acceleration/firmware/select/device_tree/system.dtb.default
- Device tree deployed successfully (/home/ohkawa/krs_ws/acceleration/firmware/select/device_tree/system.dtb.default).
- Found device BOOT.BIN file: /home/ohkawa/krs_ws/acceleration/firmware/select/bootbin/BOOT.BIN.default
- Device BOOT.BIN deployed successfully (/home/ohkawa/krs_ws/acceleration/firmware/select/bootbin/BOOT.BIN.default).
- Umounted the raw image.
- Verified that install/ is available in the current colcon workspace
- Confirmed availability of raw image file at: /home/ohkawa/krs_ws/acceleration/firmware/select/sd_card.img
- Finished inspecting raw image, obtained UNITS and STARTSECTOR P1/P2
- Image mounted successfully at: /tmp/sdcard_img_p2
No prior overlay colcon workspace found at: /tmp/sdcard_img_p2/krs_ws, creating it.
- Copied 'install-kv260' directory as a colcon overlay workspace in the raw image  at location /krs_ws
- Created and copied in rootfs /opt/ros/humble/setup.bash.
- Umounted the raw image.
- Confirmed availability of raw image file at: /home/ohkawa/krs_ws/acceleration/firmware/select/sd_card.img
- Finished inspecting raw image, obtained UNITS and STARTSECTOR for partition: 2.
- Image mounted successfully at: /tmp/sdcard_img_p2
- Umounted the raw image.
ohkawa@host:~/krs_ws$

それで、SDカードイメージを書き込みました。

ohkawa@host:~/krs_ws$ ls -la acceleration/firmware/select/sd_card.img 
-rw-r--r-- 1 ohkawa ohkawa 4548722688 Nov  4 18:57 acceleration/firmware/select/sd_card.img

SDカードからのブートに挑戦

無事PetalinuxのSDカードを作成しおえて、ブートしてみると図2の画面になります。


図2 KRS1.0のSDカードで最初にブートしたら失敗しているの図

Device /dev/mmcblk1p2 not found
udhcpc: SIOCGIFINDEX: No such device
ERROR: There's no '/dev' on rootfs.

と言っており、/devが見えない様子。。。
この問題は、
https://github.com/Xilinx/KRS/issues/73
にて報告され対策が検討されています。

問題の解決は、次の記事にて。。。
https://zenn.dev/ohkawatks/articles/3f8bf8be3260c7

Discussion