KRSをビルドするために環境を汚したくないため、Dockerコンテナに閉じたい。 というわけで、Dockerfileを作成し、Kria KV260向けのKRSをビルドするまでの手順を整理した。
動作環境
- OS : Ubuntu 20.04.3 LTS(64 bit)
- Vivado : 2022.1
- Vitis : 2022.1
- Vitis_HLS : 2022.1
- ROS2 : Humble
KRSとは
KRS(Kria Robotic Stack)とは、Kriaボード向けにROS2のパッケージをビルドするツールのことである。 公式サイト には以下の記載がある。
Kria ロボティクス スタック (KRS) は、ハードウェアを使用して、産業用グレードのロボット ソリューションの開発、メンテナンス、商用展開を加速するためのロボット ライブラリとユーティリティの統合セットです。
今回作成したDockerfileの内容は、基本的には https://xilinx.github.io/KRS/sphinx/build/html/index.html の内容を踏襲した。 Dockerイメージのビルド手順は https://github.com/npz35/vitis_tutorial/blob/0.2.2/README_krs.md にまとめた。
acceleration_firmware_kv260 を見るとわかるが、KRSにはalphaとbetaと1.0がある。 ここでは1.0を使用する。
KRSのビルド(開発マシン向け)
上記の README_krs.md の手順で作成したDockerコンテナの中で、以下を実行する。
cd $HOME/krs_ws
colcon build --merge-install
ハードウェアプラットフォームファイル
FPGAバイナリ( xclbin ファイル)の生成には、プラットフォームファイル( xpfm ファイル)と、そこから参照されるハードウェアプラットフォームファイル( xsa ファイル)が必要となる。 これらのファイルは acceleration_firmware_kv260 パッケージに含まれている。 後述する colcon build の後に、KRSのワークスペースの中に展開される。 KRSのワークスペースの中で確認した時の例を以下に示す。
$ ls acceleration/firmware/kv260/platform/*
acceleration/firmware/kv260/platform/kv260_custom_platform.xpfm
acceleration/firmware/kv260/platform/hw:
kv260_hardware_platform.xsa
acceleration/firmware/kv260/platform/sw:
kv260_custom_platform kv260_custom_platform.spfm
余談だが、ソフトウェアプラットフォームファイル( spfm ファイル)も含まれていることがわかる。
KRSのビルド(Kria KV260向け)
Dockerコンテナの中で以下のコマンドを実行して、KRSのパッケージ設定を読み込む。
cd $HOME/krs_ws
source install/setup.bash
次に、Kria KV260向けにKRSをビルドする。 まず、以下のコマンドを実行し、Kria KV260のファームウェアを選択する。
colcon acceleration select kv260
以下のコマンドを実行し、Kria KV260のファームウェアが選択されていることを確認する。
$ colcon acceleration list
kv260*
以下のコマンドを実行し、Kria KV260向けにKRSをビルドする。 なお、FPGAバイナリのビルドを含むため時間がかかる。
colcon build \
--build-base=build-kv260 \
--install-base=install-kv260 \
--merge-install \
--mixin kv260 \
--packages-select \
ament_acceleration \
ament_vitis \
vitis_common \
simple_adder \
offloaded_doublevadd_publisher
以下のコマンドを実行し、Dockerコンテナの中でビルドしたKRSを、ホスト側にコピーする。
mkdir -p $HOME/output/krs_ws
sudo cp -r -d acceleration $HOME/output/krs_ws/
cp -r -d src $HOME/output/krs_ws/
cp -r -d build-kv260 $HOME/output/krs_ws/
cp -r -d install-kv260 $HOME/output/krs_ws/
ホスト側で以下を実行し、ファームウェアの所有者を変更する。
cd $HOME/output/krs_ws/
sudo chown -R $USER acceleration
イメージの作成
イメージの作成には、imagebuilder を使用している。 imagebuilderはループデバイスを使用する。 そのため、イメージの作成はDockerコンテナの中で完結することが難しい。 Dockerコンテナの外でイメージを作成する。
colcon を使用するために、ホスト側で以下を実行する。
sudo apt install -y \
python3-colcon-argcomplete \
python3-colcon-bash \
python3-colcon-cd \
python3-colcon-cmake \
python3-colcon-common-extensions \
python3-colcon-core \
python3-colcon-defaults \
python3-colcon-devtools \
python3-colcon-library-path \
python3-colcon-metadata \
python3-colcon-mixin \
python3-colcon-notification \
python3-colcon-output \
python3-colcon-package-information \
python3-colcon-package-selection \
python3-colcon-parallel-executor \
python3-colcon-pkg-config \
python3-colcon-powershell \
python3-colcon-python-setup-py \
python3-colcon-recursive-crawl \
python3-colcon-ros \
python3-colcon-test-result \
python3-colcon-zsh
以下のコマンドを実行し、KRSをビルドする。 なお、Vitisの cmake が使用されることを回避するために PATH を変更する。
cd $HOME/output/krs_ws/
export PATH=/usr/bin:$PATH
colcon build \
--merge-install \
--packages-select colcon-hardware-acceleration
以下のコマンドを実行して、KRSのパッケージ設定を読み込む。
source install/setup.bash
次に、Kria KV260向けにKRSをビルドする。 以下のコマンドを実行し、Kria KV260のファームウェアを選択する。
unlink acceleration/firmware/select
colcon acceleration select kv260
必要に応じて以下のコマンドを実行し、 BOOT.bin のシンボリックリンクを変更する。
BOOT_PATH=`readlink acceleration/firmware/select/BOOT.BIN | sed 's/.*krs_ws\///g'`
unlink acceleration/firmware/kv260/BOOT.BIN
ln -s `pwd`/${BOOT_PATH} acceleration/firmware/kv260/BOOT.BIN
以下のコマンドを実行し、イメージを作成する。
LANG=C
colcon acceleration linux vanilla --install-dir install-kv260
acceleration/firmware/kv260/sd_card.img が作成されていることを確認する。
$ fdisk -l acceleration/firmware/kv260/sd_card.img
Disk acceleration/firmware/kv260/sd_card.img: 4.24 GiB, 4548722688 bytes, 8884224 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xeba4fad3
Device Boot Start End Sectors Size Id Type
acceleration/firmware/kv260/sd_card.img1 * 2048 1120255 1118208 546M c W95 FAT32 (LBA)
acceleration/firmware/kv260/sd_card.img2 1120256 8853503 7733248 3.7G 83 Linux
microSDカードにイメージを焼く
以下のコマンドを実行し、microSDカードをフォーマットする。 フォーマットすると、microSDカード上のデータは全て消去される。 ここでは、microSDカードのデバイスパスは /dev/sda であるとする。
sudo XAUTHORITY=~/.Xauthority gparted
右上のプルダウンから /dev/sda を選択し、全てのパーティションを消去し、チェックマークを押してフォーマットを実行する。 完了したら閉じる。
以下のコマンドを実行し、イメージを焼く。
cd $HOME/output/krs_ws/acceleration/firmware/kv260/
sudo dd if=sd_card.img of=/dev/sda bs=1M status=progress
デバイスツリーの差し替え
KRSで作成されるイメージのブート領域の中身は以下のようになっている。
- BOOT.BIN
- Image
- boot.scr
- ramdisk.cpio.gz.u-boot
- system.dtb
このうち、デバイスツリーである system.dtb が acceleration_firmware_kv260 v1.0.0 の時点で不整合を起こしている。 このままだと、PetaLinuxの起動時に以下のようなエラーが出て起動に失敗する。
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
これを回避するために、 system.dtb を差し替える。
PetaLinux ToolsをDockerコンテナに閉じる の手順で作成した system.dtb を用意する必要がある。
上記のイメージを焼いたmicroSDカードを開発マシンに接続する。 ここでは、microSDカードのデバイスパスは /dev/sda であるとする。 以下のコマンドを実行し、microSDカードの第一パーティションをマウントする。
sudo mkdir -p /media/BOOT
sudo mount /dev/sda1 /media/BOOT
以下のコマンドを実行し、PetaLinux Toolsで生成した system.dtb で上書きする。
sudo cp system.dtb /media/BOOT/
以下のコマンドを実行し、microSDカードをアンマウントする。
sudo umount /media/BOOT/
sudo eject /dev/sda