はじめに
この記事の目的
かつて筆者は ZynqMP で Lima (Mali-400/450樣のオープンンソースなグラフィックドライバ)を Ubuntu 22.04 で試験的に動かしてみた記事を投稿しました。
- 「ZynqMP 向け Ubuntu22.04で Lima を動かしてみた」@Qiita
- 概要編
- DRM Lima 編
- DRI Lima 編
- 共有バッファ編
- ストライド問題編
- GEM キャッシュ編
- インストール編(この記事)
- glmark2編
上記の記事に示したような改造を加えた Ultra96/Ultra96-V2/KV260/KR260 用の Boot Loader(U-Boot等)、Linux Kernel、Ubuntu 22.04(jammy) Root File System を以下の URL に用意しました。この記事はそのインストール方法を説明します。Boot Loader や Linux Kernel のビルドが面倒くさいという方はどうぞ。
注意事項
この記事で紹介しているリポジトリで提供されている Linux カーネルと Ubuntu 22.04 ルートファイルシステムは、AMD社(旧Xilinx社)および Canonical社の公式のものではありません。筆者が道楽で自分好みに魔改造しています。使用する際にはこの点に留意して自己責任でお願いします。
特徴
対応ボード
- Ultra96 : Xilinx Zynq UltraScale+ MPSoC development board based on the Linaro 96Boards specification.
- Ultra96-V2 : updates and refreshes the Ultra96 product that was released in 2018.
- KV260 : Kria KV260 Vision AI Startar Kit.
- KR260 : Kria KR260 Robotics Startar Kit.
ブートローダー
- FSBL(First Stage Boot Loader for ZynqMP)
- PMU Firmware(Platform Management Unit Firmware)
- BL31(ARM Trusted Firmware Boot Loader stage 3-1)
- U-Boot xilinx-v2019.2 (customized)
Linux Kernel
- Linux Kernel Version 6.1.70-zynqmp-fpga-trial
- linux-stable 6.1.70 がベース
- Patched equivalent to linux-xlnx v2023.1
- Enable Device Tree Overlay with Configuration File System
- Enable FPGA Manager
- Enable FPGA Bridge
- Enable FPGA Reagion
- Enable ATWILC3000 Linux Driver for Ultra96-V2
- Enable Lima(Open Source Mali-400 Device Driver)
- Patch to lima for multiple clocks
- Patch to lima for multiple interrupt names
- Patch to lima for alternative device tree ID
- Patch to xlnx_drm for default alignment size
- Patch to xlnx_drm for enable data cache
Ubuntu 22.04(jammy) Root File System
- Installed build-essential
- Installed ubuntu-desktop
- Installed lightdm
- Installed ddx xlnx (xserver-xorg-video-armsoc-xilinx)
- Installed dri xlnx (libgl1-mesa-xlnx-dri)
- Installed ruby ruby-msgpack ruby-serialport
- Installed python python3 msgpack-rpc-python
- Installed u-boot-tools
- Installed Other package
インストール
ダウンロード
github から次のようにダウンロードしてください。
shell$ wget https://github.com/ikwzm/ZynqMP-FPGA-Ubuntu22.04-Desktop/archive/refs/tags/v3.0.0.tar.gz
shell$ tar xfz v3.0.0.tar.gz
shell$ cd ZynqMP-FPGA-Ubuntu22.04-Desktop-3.0.0
ファイルの説明
- target/Kv260/boot/
- boot.scr : U-Boot script file
- uEnv.txt : U-Boot environment variables for linux boot
- devicetree-6.1.70-zynqmp-fpga-trial-kv260-revB.dtb : Linux Device Tree Blob
- devicetree-6.1.70-zynqmp-fpga-trial-kv260-revB.dts : Linux Device Tree Source
- target/Kr260/boot/
- boot.scr : U-Boot script file
- uEnv.txt : U-Boot environment variables for linux boot
- devicetree-6.1.70-zynqmp-fpga-trial-kr260-revB.dtb : Linux Device Tree Blob
- devicetree-6.1.70-zynqmp-fpga-trial-kr260-revB.dts : Linux Device Tree Source
- target/Ultra96/boot/
- boot.bin : Stage 1 Boot Loader
- uEnv.txt : U-Boot environment variables for linux boot
- devicetree-6.1.70-zynqmp-fpga-trial-ultra96.dtb : Linux Device Tree Blob
- devicetree-6.1.70-zynqmp-fpga-trial-ultra96.dts : Linux Device Tree Source
- target/Ultra96-V2/boot/
- boot.bin : Stage 1 Boot Loader
- uEnv.txt : U-Boot environment variables for linux boot
- devicetree-6.1.70-zynqmp-fpga-trial-ultra96v2.dtb : Linux Device Tree Blob
- devicetree-6.1.70-zynqmp-fpga-trial-ultra96v2.dts : Linux Device Tree Source
- files/
- vmlinuz-6.1.70-zynqmp-fpga-trial-2 : Linux Kernel Image
- config-6.1.70-zynqmp-fpga-trial-2 : Linux Kernel Configuration File
- ubuntu22.04-desktop-rootfs.tgz.files/ : Ubuntu 22.04 Desktop Root File System
- x00 .. x16 : (splited files)
- debian/
- linux-image-6.1.70-zynqmp-fpga-trial_6.1.70-zynqmp-fpga-trial-2_arm64.deb : Linux Image Package
- linux-headers-6.1.70-zynqmp-fpga-trial_6.1.70-zynqmp-fpga-trial-2_arm64.deb : Linux Headers Package
- libgl1-mesa-xlnx-dri_23.0.4-0ubuntu1~22.04.1_arm64.deb : Mesa Dri Xlnx Driver Package
- xserver-xorg-video-armsoc-xilinx_1.5-trial-13_arm64.deb : X.org Graphics Driver Package
SD-Card のフォーマット
- SD-Card のパーティション1を VFAT File System でファイルシステムを作ります。
- SD-Card のパーティション2を ext4 File System でファイルシステムを作ります。
Linux での SD-Card のフォーマット方法は次の URL を参照してください。
SD-Card への書き込み
0. SD-Card のマウント
SD-Card のパーティション1(ブートパーティション)とパーティション2(ルートパーティション)を読み書き出来るようにマウントします。
この例では、ブートパーティションを /mnt/usb1 に、ルートパーティションを /mnt/usb2 にそれぞれマウントしています。
shell# mount /dev/sdc1 /mnt/usb1
shell# mount /dev/sdc2 /mnt/usb2
1. ブートパーティションの作成
KV260 の場合
SD-Card のブートパーティション(例では/mnt/usb1)に target/Kv260/boot/ 下のファイルと Linux Kernel Image をコピーします。
shell# cp target/Kv260/boot/* /mnt/usb1
shell# gzip -d -c files/vmlinuz-6.1.70-zynqmp-fpga-trial-2 > /mnt/usb1/image-6.1.70-zynqmp-fpga-trial
KR260 の場合
SD-Card のブートパーティション(例では/mnt/usb1)に target/Kr260/boot/ 下のファイルと Linux Kernel Image をコピーします。
shell# cp target/Kr260/boot/* /mnt/usb1
shell# gzip -d -c files/vmlinuz-6.1.70-zynqmp-fpga-trial-2 > /mnt/usb1/image-6.1.70-zynqmp-fpga-trial
Ultra96 の場合
SD-Card のブートパーティション(例では/mnt/usb1)に target/Ultra96/boot/ 下のファイルと Linux Kernel Image をコピーします。
shell# cp target/Ultra96/boot/* /mnt/usb1
shell# gzip -d -c files/vmlinuz-6.1.70-zynqmp-fpga-trial-2 > /mnt/usb1/image-6.1.70-zynqmp-fpga-trial
Ultra96-V2 の場合
SD-Card のブートパーティション(例では/mnt/usb1)に target/Ultra96-V2/boot/ 下のファイルと Linux Kernel Image をコピーします。
shell# cp target/Ultra96-V2/boot/* /mnt/usb1
shell# gzip -d -c files/vmlinuz-6.1.70-zynqmp-fpga-trial-2 > /mnt/usb1/image-6.1.70-zynqmp-fpga-trial
2. ルートパーティションの作成
SD-Card のルートパーティション(例では/mnt/usb2)に ubuntu22.04-desktop-rootfs.tgz.files の中身を展開します。展開したルートファイルシステムの home/fpga にデバイスドライバの Debian パッケージをあらかじめコピーしておくと良いでしょう。後から network 経由でコピーしてもかまいません。
shell# (cat ubuntu22.04-desktop-rootfs.tgz.files/*) | tar xfz - -C /mnt/usb2
shell# mkdir /mnt/usb2/home/fpga/debian
shell# cp debian/* /mnt/usb2/home/fpga/debian
3. ブートパーティションが見えるように fstab を設定
ブートパーティションを Linux 側から常時見えるようにしておくと便利です。その場合は、あらかじめ fstab にブートパーティションをマウントするように設定しておくと良いでしょう。すでに fstab には configfs のマウントが設定されているので注意してください。
Ultra96/Ultra96-V2 のブートパーティションは /dev/mmcblk0p1
です。
shell# mkdir /mnt/usb2/mnt/boot
shell# cat <<EOT >> /mnt/usb2/etc/fstab
/dev/mmcblk0p1 /mnt/boot auto defaults 0 0
EOT
KV260/UltraZed のブートパーティションは /dev/mmcblk1p1
です。
shell# mkdir /mnt/usb2/mnt/boot
shell# cat <<EOT >> /mnt/usb2/etc/fstab
/dev/mmcblk1p1 /mnt/boot auto defaults 0 0
EOT
KR260 のブートパーティションは /dev/sda1
です。
shell# mkdir /mnt/usb2/mnt/boot
shell# cat <<EOT >> /mnt/usb2/etc/fstab
/dev/sda1 /mnt/boot auto defaults 0 0
EOT
余談: このくらいの記述ならあらかじめ debian12-rootfs-vanilla.tgz に書いておけば良いのに、何故わざわざ後で設定するのか疑問に思われるかもしれません。その理由は、debian12-rootfs-vanilla.tgz が Ultra96/Ultra96V2/UltraZed/KV260/KR260 と共用だからです。Ultra96/Ultra96-V2 の SD-Card のブートパーティションは /dev/mmcblk0p1
ですが、UltraZed/KV260 の SD-Card のブートパーティションは /dev/mmcblk1p1
で、さらに KR260 の SD-Card のブートパーティションは /dev/sda1
です。しかも UltraZed には /dev/mmcblk0p1 というのも存在していて、あらかじめ debian12-rootfs-vanilla.tgz に書いてしまっていると UltraZed では間違えて別のデバイスにアクセスしてしまいます。そこで、面倒ですが後で設定するようにしました。
4. ネットワークの設定
Ultra96/Ultra96-V2 は WiFi を通じてネットワークに接続します。あらかじめホスト側で設定ファイルを作って RootFS に書いておくと良いかもしれません。もちろん、後で Ultra96/Ultra96-V2 を起動してそちらで設定してもかまいません。
ここでは SSID を ssssssssに、パスフレーズを ppppppppp に、暗号化したアクセスキーを xxxx とします。
SSID と暗号化したアクセスキーをネットワーク設定ファイル(/etc/netplan/99-network-config.yaml)に直接記述します。
shell# cat <<EOT > /mnt/usb2/etc/netplan/99-network-config.yaml
network:
version: 2
renderer: NetworkManager
wifis:
wlan0:
optional: true
access-points:
"ssssssss" :
password: "ppppppppp"
dhcp4: true
EOT
5. SD-Card のアンマウント
shell# umount /mnt/usb1
shell# umount /mnt/usb2
起動方法
- インストールした SD-Card を Ultra96/Ultra96-V2/Kv260/Kr260 のスロットにセット
- Ultra96/Ultra96-V2/Kv260/Kr260 の display port にモニターを接続
- Ultra96/Ultra96-V2/Kv260/Kr260 の USB port に USB mouse と USB keyboard 接続
- Ultra96/Ultra96-V2/KV260/KR260 の電源を入れる
- 数秒後にディスプレイモニターに Ubuntu のログイン画面が表示されます
- ユーザーが fpga ならばパスワードに fpga を入力してください
- ユーザーが root ならばパスワードに admin を入力してください
参考
- https://github.com/ikwzm/ZynqMP-FPGA-Ubuntu22.04-Desktop
- https://github.com/ikwzm/ZynqMP-FPGA-Ubuntu22.04-Console
- https://github.com/ikwzm/ZynqMP-FPGA-Debian12
- https://github.com/ikwzm/ZynqMP-FPGA-Linux-Kernel-6.1
- https://github.com/ikwzm/ZynqMP-U-Boot-Ultra96
- https://github.com/ikwzm/ZynqMP-U-Boot-Ultra96-V2
- https://github.com/ikwzm/ZynqMP-U-Boot-UltraZed-EG-IOCC