KRSのファームウェアを用意する

KRSの合成レポートを確認してみる の続き。 2022年9月時点の最新のacceleration_firmware_kv260 ではROS2からLTTngを使用することができない。 と …

npz35 Sun 16 October 2022

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

関連パッケージを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-bt2python3-tkpython3-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) と記載されているのみで詳細は一切わからない。