KRSの合成レポートを確認してみる の続き。 2022年9月時点の最新のacceleration_firmware_kv260 ではROS2からLTTngを使用することができない。 ということでLTTngを使用できる環境を構築する。 せっかくなので、自前でビルドしたPetaLinuxのデータからKRS用のファームウェアを用意して、KRSをビルドにできるようにする。
動作環境
- OS : Ubuntu 20.04.3 LTS(64 bit)
- Vivado : 2022.1
- Vitis : 2022.1
- Vitis_HLS : 2022.1
- ROS2 : Humble
- ボード : Kria KV260
KRSのパッケージのバージョン
KRSに含まれているパッケージのバージョン、タグ、commit idの情報を残しておく。
- https://www.xilinx.com/bin/public/openDownload?filename=acceleration_firmware_kv260.zip : v1.0.0
- https://github.com/ros-acceleration/image_pipeline : ros2 (cb5be11)
- https://github.com/ros-acceleration/tracetools_acceleration : humble (9d6542a)
- https://github.com/ros-acceleration/adaptive_component : humble (31c9491)
- https://github.com/ros-acceleration/ament_acceleration : humble (f1568b1)
- https://github.com/ros-acceleration/ament_vitis : humble (98a9620)
- https://github.com/colcon/colcon-hardware-acceleration : 0.8.0 (0bff72e)
- https://github.com/ros-acceleration/ros2_kria : humble (689765d)
- https://github.com/ros-acceleration/ros2acceleration : humble (d8c1465)
- https://github.com/ros-acceleration/vitis_common : humble (661d5ed)
- https://github.com/ros-acceleration/humble : main (7852c02)
- https://github.com/ros2/ros2_tracing.git : humble (638fa0a)
関連パッケージをPetaLinuxに含められるのか
PetaLinuxイメージの詳細なビルド手順は PetaLinux ToolsをDockerコンテナに閉じる に記載している。
PetaLinuxイメージをビルドする時のワークスペースの project-spec/meta-user/conf/user-rootfsconfig に設定を追記し、有効化することで、PetaLinuxイメージに含めるパッケージを追加することができる。 例えば tmux を含める場合には、 CONFIG_tmux を追記する。 また、以下のコマンドを実行して有効化する。
petalinux-config --component rootfs
user packages を選択して、必要な項目を有効化することでPetaLinuxイメージに含めることができる。 ここでは vitis_tutorial/user-rootfsconfig を使用して、全て有効化すればよい。 また、 gcc g++ swig も必要なので有効化する。
なお、 python3-bt2 、 python3-tk 、 python3-wasabi についても設定を追加し有効化した場合には、ビルド時に以下のエラーが出た。
ERROR: Nothing RPROVIDES 'python3-bt2' (but /home/np/xilinx-kv260-starterkit-2022.1/components/yocto/layers/meta-petalinux/recipes-core/images/petalinux-image-minimal.bb RDEPENDS on or otherwise requires it)
NOTE: Runtime target 'python3-bt2' is unbuildable, removing...
Missing or unbuildable dependency chain was: ['python3-bt2']
ERROR: Required build target 'petalinux-image-minimal' has no buildable providers.
Missing or unbuildable dependency chain was: ['petalinux-image-minimal', 'python3-bt2']
ERROR: Nothing RPROVIDES 'python3-tk' (but /home/np/xilinx-kv260-starterkit-2022.1/components/yocto/layers/meta-petalinux/recipes-core/images/petalinux-image-minimal.bb RDEPENDS on or otherwise requires it)
NOTE: Runtime target 'python3-tk' is unbuildable, removing...
Missing or unbuildable dependency chain was: ['python3-tk']
ERROR: Required build target 'petalinux-image-minimal' has no buildable providers.
Missing or unbuildable dependency chain was: ['petalinux-image-minimal', 'python3-tk']
ERROR: Nothing RPROVIDES 'python3-wasabi' (but /home/np/xilinx-kv260-starterkit-2022.1/components/yocto/layers/meta-petalinux/recipes-core/images/petalinux-image-minimal.bb RDEPENDS on or otherwise requires it)
NOTE: Runtime target 'python3-wasabi' is unbuildable, removing...
Missing or unbuildable dependency chain was: ['python3-wasabi']
ERROR: Required build target 'petalinux-image-minimal' has no buildable providers.
Missing or unbuildable dependency chain was: ['petalinux-image-minimal', 'python3-wasabi']
PetaLinuxイメージに上記のパッケージを含めるのは簡単にはできなさそう。 というわけで、Kria KV260上でソースビルドする必要がある。
ファームウェアを用意する
上記の手順でPetaLinuxイメージに含めるパッケージを増やした状態で PetaLinux ToolsをDockerコンテナに閉じる の手順でPetaLinuxイメージをビルドする。
KRSをDockerコンテナに閉じる で作成したDockerコンテナの中で、Kria KV260のファームウェアを配置する。 まず、公式のファームウェアを退避する。
cd ${HOME}/krs_ws
sudo mv acceleration/firmware/kv260{,.orig}
公式のファームウェアと、用意したPetaLinuxイメージのデータを使用してファームウェアを配置する。 PetaLinuxイメージのデータは事前に $HOME/output/images/linux に配置しておく。 まず、変数に各ディレクトリのpathを設定する。
cd ${HOME}/krs_ws
mkdir -p acceleration/firmware/kv260
SRC_IMAGE=${HOME}/output/images/linux
SRC_FIRMWARE=${HOME}/krs_ws/acceleration/firmware/kv260.orig
DST_FIRMWARE=${HOME}/krs_ws/acceleration/firmware/kv260
SRC_SYSROOT=${SRC_FIRMWARE}/sysroots/cortexa72-cortexa53-xilinx-linux
DST_SYSROOT=${DST_FIRMWARE}/sysroots/cortexa72-cortexa53-xilinx-linux
必要なファイルを順に配置していく。 [1]
PetaLinuxイメージのデータを配置する。
cp ${SRC_IMAGE}/rootfs.cpio.gz ${DST_FIRMWARE}/
cp ${SRC_IMAGE}/ramdisk.cpio.gz.u-boot ${DST_FIRMWARE}/
mkdir -p ${DST_FIRMWARE}/kernel/
cp ${SRC_IMAGE}/Image ${DST_FIRMWARE}/kernel/
cp ${SRC_IMAGE}/image.ub ${DST_FIRMWARE}/kernel/
mkdir -p ${DST_FIRMWARE}/platform/sw/kv260_custom_platform/boot
cp ${SRC_IMAGE}/*.elf ${DST_FIRMWARE}/platform/sw/kv260_custom_platform/boot/
cp ${SRC_IMAGE}/*.bif ${DST_FIRMWARE}/platform/sw/kv260_custom_platform/boot/
cp ${SRC_IMAGE}/system.dtb ${DST_FIRMWARE}/platform/sw/kv260_custom_platform/boot/
cp ${SRC_IMAGE}/BOOT.BIN ${DST_FIRMWARE}/platform/sw/kv260_custom_platform/boot/
cp ${SRC_IMAGE}/bl31.* ${DST_FIRMWARE}/
mkdir -p ${DST_FIRMWARE}/platform/sw/kv260_custom_platform/xrt/image/
cp ${SRC_IMAGE}/system.dtb ${DST_FIRMWARE}/platform/sw/kv260_custom_platform/xrt/image/
mkdir -p ${DST_FIRMWARE}/bootbin
cp ${SRC_IMAGE}/BOOT.BIN ${DST_FIRMWARE}/bootbin/BOOT.BIN.default
mkdir -p ${DST_FIRMWARE}/boot_scripts
cp ${SRC_IMAGE}/boot.scr ${DST_FIRMWARE}/boot_scripts/boot.scr.default
mkdir -p ${DST_FIRMWARE}/device_tree
cp ${SRC_IMAGE}/system.dtb ${DST_FIRMWARE}/device_tree/system.dtb.default
一部のファイルは公式のファームウェアのものを流用する。
cp -r ${SRC_FIRMWARE}/imagebuilder ${DST_FIRMWARE}/
cp ${SRC_FIRMWARE}/boot_scripts/boot.scr.sd ${DST_FIRMWARE}/boot_scripts/
cp ${SRC_FIRMWARE}/BOARD ${DST_FIRMWARE}/
cp ${SRC_FIRMWARE}/SOC ${DST_FIRMWARE}/
cp ${SRC_FIRMWARE}/shell.json ${DST_FIRMWARE}/
cp ${SRC_FIRMWARE}/platform.cfg ${DST_FIRMWARE}
cp ${SRC_FIRMWARE}/setup.sh ${DST_FIRMWARE}//
cp -r ${SRC_FIRMWARE}/mixin ${DST_FIRMWARE}/
mkdir -p ${DST_FIRMWARE}/data
cp ${SRC_FIRMWARE}/device_tree/kernel_default.dtbo ${DST_FIRMWARE}/device_tree/kernel_default.dtbo
cp -r ${SRC_FIRMWARE}/platform ${DST_FIRMWARE}/
sysroots はPetaLinuxイメージと共に作成される sdk.sh で生成する。
${SRC_IMAGE}/sdk.sh -d ${DST_FIRMWARE}/
ファームウェアのディレクトリが colcon build の対象にならないように COLCON_IGNORE を作成する。
touch ${DST_FIRMWARE}/COLCON_IGNORE
公式のファームウェアの sysroots から必要なファイルをコピーする。 ここでは個別にコピーしているとキリが無いので、 sdk.sh で展開した後に sysroots に含まれていないものを全てコピーする。
cp -r --no-clobber ${SRC_SYSROOT}/usr/share/* ${DST_SYSROOT}/usr/share/
cp -r --no-clobber ${SRC_SYSROOT}/usr/lib/* ${DST_SYSROOT}/usr/lib/
cp -r --no-clobber ${SRC_SYSROOT}/usr/include/* ${DST_SYSROOT}/usr/include/
cp -r --no-clobber ${SRC_SYSROOT}/usr/bin/* ${DST_SYSROOT}/usr/bin/
ビルド時に発生する参照周りのエラーを回避するために、修正を加える。
grep -rn -l FIXMESTAGINGDIRHOST ${DST_SYSROOT}/usr/share | xargs sed -i 's/FIXMESTAGINGDIRHOST//g'
grep -rn -l 'INTERFACE_INCLUDE_DIRECTORIES "/usr/lib/python3.9/site-packages/numpy/core/include"' ${DST_SYSROOT}/usr/share/ | xargs sed -i 's/INTERFACE_INCLUDE_DIRECTORIES "\/usr\/lib\/python3.9\/site-packages\/numpy\/core\/include"//g'
grep -rn -l '\/scratch\/jenkins-BUILDS-eSDK-2022.1_stable-pipeline-build_async-40_ZynqMpEvFull\/build\/tmp\/work\/cortexa72-cortexa53-xilinx-linux\/[^;]*;' ${DST_SYSROOT}/usr/share/ | xargs sed -i 's/\/scratch\/jenkins-BUILDS-eSDK-2022.1_stable-pipeline-build_async-40_ZynqMpEvFull\/build\/tmp\/work\/cortexa72-cortexa53-xilinx-linux\/[^;]*;//g'
grep -rn -l '\/scratch\/jenkins-BUILDS-eSDK-2022.1_stable-pipeline-build_async-40_ZynqMpEvFull\/build\/tmp\/work\/cortexa72-cortexa53-xilinx-linux\/[^;]*"' ${DST_SYSROOT}/usr/share/ | xargs sed -i 's/\/scratch\/jenkins-BUILDS-eSDK-2022.1_stable-pipeline-build_async-40_ZynqMpEvFull\/build\/tmp\/work\/cortexa72-cortexa53-xilinx-linux\/[^;]*"/"/g'
grep -rn -l '\/scratch\/jenkins-BUILDS-eSDK-2022.1_stable-pipeline-build_async-74_ZynqMpEvFull\/build\/tmp\/work\/cortexa72-cortexa53-xilinx-linux\/[^;]*;' ${DST_SYSROOT}/usr/share/ | xargs sed -i 's/\/scratch\/jenkins-BUILDS-eSDK-2022.1_stable-pipeline-build_async-74_ZynqMpEvFull\/build\/tmp\/work\/cortexa72-cortexa53-xilinx-linux\/[^;]*;//g'
ここまででファームウェアの配置は完了した。 あとは KRSをDockerコンテナに閉じる と同様の手順でファームウェアを指定してKRSをビルドすれば使用することができる。 なお、KRSで作成したPetaLinuxイメージをmicroSDカードに焼いた後に、以下の作業が必要となる。 ここで、microSDカードの第二パーティションのデバイスパスは /dev/sdb2 としている。 また cp コマンドの引数が長くなりすぎるとエラーになるため、パターンを指定して ${SDK_SYSROOT}/usr/lib のコピーを複数回に分けている。
SDK_SYSROOT=${HOME}/output/krs_wsacceleration/firmware/kv260/sysroots/cortexa72-cortexa53-xilinx-linux
sudo mkdir -p /mnt/rootfs
sudo mount /dev/sdb2 /mnt/rootfs
sudo cp -r \
${SDK_SYSROOT}/usr/lib/python3.9/site-packages/cv_bridge* \
${SDK_SYSROOT}/usr/lib/python3.9/site-packages/image_geometry* \
${SDK_SYSROOT}/usr/lib/python3.9/site-packages/ros2trace* \
${SDK_SYSROOT}/usr/lib/python3.9/site-packages/tracetools_launch* \
${SDK_SYSROOT}/usr/lib/python3.9/site-packages/tracetools_trace* \
/mnt/rootfs/usr/lib/python3.9/site-packages/
sudo cp -r --no-clobber ${SDK_SYSROOT}/usr/share/* /mnt/rootfs/usr/share/
sudo cp -r --no-clobber ${SDK_SYSROOT}/usr/lib/[a-k]* /mnt/rootfs/usr/lib/
sudo cp -r --no-clobber ${SDK_SYSROOT}/usr/lib/l[^i]* /mnt/rootfs/usr/lib/
sudo cp -r --no-clobber ${SDK_SYSROOT}/usr/lib/lib[a-n]* /mnt/rootfs/usr/lib/
sudo cp -r --no-clobber ${SDK_SYSROOT}/usr/lib/lib[o-z]* /mnt/rootfs/usr/lib/
sudo cp -r --no-clobber ${SDK_SYSROOT}/usr/lib/[m-z]* /mnt/rootfs/usr/lib/
sudo cp -r --no-clobber ${SDK_SYSROOT}/usr/include/* /mnt/rootfs/usr/include/
sudo cp -r --no-clobber ${SDK_SYSROOT}/usr/bin/* /mnt/rootfs/usr/bin/
sync
sudo umount /mnt/rootfs
sudo eject /dev/sdb
microSDカードをKria KV260に入れて起動すると、KRSが起動できる。
[1] | acceleration_firmware_kv260のREADME.md には firmware/ARTIFACTS.md を参照するように記載されているが、含まれていない。2022年9月時点の最新のacceleration_firmware_jetson_nanoのARTIFACTS.md はあるが TODO (see other examples) と記載されているのみで詳細は一切わからない。 |