Kria KV260 環境構築メモ
概要
Kria KV260用の環境を構築した際の個人的メモです(備忘録)。
同じような使い方をする人の参考になれば幸いです。
以前 Qiita の方にUltra96V2 Debian環境構築メモという記事を書いておりますが、最終的に似たような環境を KV260 に作るのが目的です。
Ubuntu の SDカード作成
こちらから、SDカードのイメージを取得して、dd コマンド(Linuxの場合)や、Win32DiskImager(Windowsの場合) でSDカードに焼き込みます。
私が使ったバージョンは iot-kria-classic-desktop-2004-x03-20211110-98.img.xz でした。
SDが出来上がったら、ボードに差し込んで電源を入れれば起動します。
初期アカウント ubuntu の 初期パスワードは ubuntu のようなので、ログインするとパスワードを変えるように促されるので設定します。
CUI/GUI の切り替え
GUI使わないという人はさっさとCUIに切り替えてしまう手もあるかもしれません(お好みで)。
# CUIにする
sudo systemctl set-default multi-user.target
# GUIにする
sudo systemctl set-default graphical.target
ユーザーを作る
デフォルトのユーザー(ubuntu)をそのまま使ってもよいのですが、新規に作る場合は。
sudo adduser <username>
でユーザーを作って
sudo gpasswd -a <username> sudo
で sudo 権限を付けておきましょう。
fclkcfg と u-dma-buf のインストール
ZynqMP開発の定番となっている ikwzm氏のfclkcfgとu-dma-bufをインストールします。
git clone --recursive --depth=1 -b v1.7.2 https://github.com/ikwzm/fclkcfg-kmod-dpkg
cd fclkcfg-kmod-dpkg
sudo debian/rules binary
cd ..
sudo dpkg -i fclkcfg-5.4.0-1017-xilinx-zynqmp_1.7.2-1_arm64.deb
git clone --recursive --depth=1 -b v3.2.3 https://github.com/ikwzm/u-dma-buf-kmod-dpkg
cd u-dma-buf-kmod-dpkg
sudo debian/rules binary
cd ..
sudo dpkg -i u-dma-buf-5.4.0-1017-xilinx-zynqmp_3.2.3-0_arm64.deb
RPU (Cortex-R5) を認識させる
詳しい記事はこちらに書いております。
下記の方法で現状のデバイスツリーを取得します。
sudo dtc /sys/firmware/fdt 2> /dev/null > system.dts
取得した system.dts に対して、まず interrupt-controller@f9010000 のセクションを探して "gic:" を追記しました。
gic: interrupt-controller@f9010000 {
次に symbols の直前に下記を追記しました。
reserved-memory {
#address-cells = <2>;
#size-cells = <2>;
ranges;
rproc_0_dma: rproc@3ed40000 {
no-map;
compatible = "shared-dma-pool";
reg = <0x0 0x3ed40000 0x0 0x100000>;
};
rproc_0_reserved: rproc@0x3ed00000 {
no-map;
reg = <0x0 0x3ed00000 0x0 0x40000>;
};
rproc_1_dma: rproc@0x3ef00000 {
no-map;
compatible = "shared-dma-pool";
reg = <0x0 0x3ef00000 0x0 0x40000>;
};
rproc_1_reserved: rproc@0x3ef40000 {
no-map;
reg = <0x0 0x3ef40000 0x0 0x100000>;
};
};
zynqmp-rpu {
compatible = "xlnx,zynqmp-r5-remoteproc-1.0";
#address-cells = <2>;
#size-cells = <2>;
ranges;
core_conf = "split";
r5_0: r5@0 {
#address-cells = <2>;
#size-cells = <2>;
ranges;
memory-region = <&rproc_0_reserved>, <&rproc_0_dma>;
pnode-id = <0x7>;
mboxes = <&ipi_mailbox_rpu0 0>, <&ipi_mailbox_rpu0 1>;
mbox-names = "tx", "rx";
tcm_0_a: tcm_0@0 {
reg = <0x0 0xFFE00000 0x0 0x10000>;
pnode-id = <0xf>;
};
tcm_0_b: tcm_0@1 {
reg = <0x0 0xFFE20000 0x0 0x10000>;
pnode-id = <0x10>;
};
};
r5_1: r5@1 {
#address-cells = <2>;
#size-cells = <2>;
ranges;
memory-region = <&rproc_1_reserved>, <&rproc_1_dma>;
pnode-id = <0x8>;
mboxes = <&ipi_mailbox_rpu1 0>, <&ipi_mailbox_rpu1 1>;
mbox-names = "tx", "rx";
tcm_1_a: tcm_1@0 {
reg = <0x0 0xFFE90000 0x0 0x10000>;
pnode-id = <0x11>;
};
tcm_1_b: tcm_1@1 {
reg = <0x0 0xFFEB0000 0x0 0x10000>;
pnode-id = <0x12>;
};
};
};
zynqmp_ipi1 {
compatible = "xlnx,zynqmp-ipi-mailbox";
interrupt-parent = <&gic>;
interrupts = <0 29 4>;
xlnx,ipi-id = <7>;
#address-cells = <2>;
#size-cells = <2>;
ranges;
// APU<->RPU0 IPI mailbox controller
ipi_mailbox_rpu0: mailbox@0xff990000 {
reg = <0x00 0xff990600 0x00 0x20>,
<0x00 0xff990620 0x00 0x20>,
<0x00 0xff9900c0 0x00 0x20>,
<0x00 0xff9900e0 0x00 0x20>;
reg-names = "local_request_region",
"local_response_region",
"remote_request_region",
"remote_response_region";
#mbox-cells = <1>;
xlnx,ipi-id = <1>;
};
};
zynqmp_ipi2 {
compatible = "xlnx,zynqmp-ipi-mailbox";
interrupt-parent = <&gic>;
interrupts = <0 30 4>;
xlnx,ipi-id = <8>;
#address-cells = <2>;
#size-cells = <2>;
ranges;
// APU<->RPU0 IPI mailbox controller
ipi_mailbox_rpu1: mailbox@ff3f0b00 {
reg = <0x00 0xff3f0b00 0x00 0x20>,
<0x00 0xff3f0b20 0x00 0x20>,
<0x00 0xff3f0940 0x00 0x20>,
<0x00 0xff3f0960 0x00 0x20>;
reg-names = "local_request_region",
"local_response_region",
"remote_request_region",
"remote_response_region";
#mbox-cells = <1>;
xlnx,ipi-id = <2>;
};
};
下記のように dtc でコンパイルして、FAT領域にコピーすれば完了です。
dtc -I dts -O dtb system.dts -o system.dtb
sudo cp system.dtb /boot/firmware/
リブートして /sys/class/remoteproc/ の下にプロセッサが2つ見えていれば成功です。
bootgenを入れる
PLを使うアプリで必要となるので bootgenも入れておきます。
git clone https://github.com/Xilinx/bootgen
cd bootgen/
make
sudo cp bootgen /usr/local/bin/
Docker を入れる
公式のUbuntu イメージは比較的簡単にDockerを入れることができるので、今回は環境構築に活用します。
sudo apt install docker.io
sudo apt install docker-compose
下記のように特手ユーザーに権限を付けると sudo が不要になります。
sudo usermod -aG docker <username>
Samba を入れる
必須ではありませんが、Windowsユーザーの場合は入れておくと何かと便利かと思います。
sudo apt update
sudo apt install -y samba
sudo nano /etc/samba/smb.conf
として、/etc/samba/smb.conf を編集します。
[home]セクションのコメントアウトをすべて外して、
read only = no
とします。また [global] のセクションに
unix extensions = no
wide links = yes
を足すと、シンボリックリンクの先もアクセスできるようです。
ユーザーを追加は下記のコマンドで行うことができ
sudo pdbedit -a <username>
次のようにして再起動して反映可能です。
sudo systemctl restart smbd nmbd
使ってみる
ここで、Docker を使って、拙作の Jelly のサンプルを1つ動かしてみようと思います。
まず、下記のようにして jelly をビルドするのに必要な環境一式の入った環境を Docker で起動します。
git clone https://github.com/ryuz/jelly -b v2.0.2
cd jelly/docker/zynqmp_jelly/
./compose.sh up -d
これで、Docker イメージが起動し ポート 20022 番で ssh 接続を待ち受けます。
この時、起動したユーザ名、UID、GID にて内部で新しいユーザーが作られ、パスワードは fpga となります。
さらにホストの home ディレクトリをボリュームとしてマウントしますので、Dokcer イメージの中で、ツールセットのみ利用しつつ、homeにあるユーザーデータは同じ UID、GID で引き続き操作できるようにしています。
.bashrc も home のものが読まれますので
if [ -f /.dockerenv ]; then
export PATH="/opt/opencv4/bin:$PATH"
export PKG_CONFIG_PATH="/opt/opencv4/lib/pkgconfig:$PKG_CONFIG_PATH"
export LD_LIBRARY_PATH="/opt/opencv4/lib:$LD_LIBRARY_PATH"
export PATH="/opt/opencv3/bin:$PATH"
export PKG_CONFIG_PATH="/opt/opencv3/lib/pkgconfig:$PKG_CONFIG_PATH"
export LD_LIBRARY_PATH="/opt/opencv3/lib:$LD_LIBRARY_PATH"
export PATH="/opt/grpc/bin:$PATH"
export PKG_CONFIG_PATH="/opt/grpc/lib/pkgconfig:$PKG_CONFIG_PATH"
export PATH="/opt/riscv/bin:$PATH"
fi
のような行を追加するとよいでしょう。
ポート 20022 への ssh の接続は VS Code Remote Development などで繋ぐこともできます。
事前に各サンプルの READMEに従って別PCで bit ファイルを合成してコピーしておく必要がありますが、それができていれば、ssh接続して
cd jelly/projects/kv260/kv260_udmabuf_sample/app/
make run
とすれば、udmabuf のサンプルが動きます。
もし Raspberry Pi Camera Module V2 (Sony IMX219) をお持ちであり、ssh での X-Window のポートフォワードが有効であれば
cd jelly/projects/kv260/kv260_imx219/app/
make run
とすることで、カメラも試すことができるでしょう。
Discussion