2024年1月15日追記
この記事は2023年5月10日に投稿したものであり、古い内容が含まれています。2024年1月15日に以下の記事を投稿しましたので参照してください。
はじめに
この記事の目的
この記事は、UltraZed/Ultra96/Ultra96-V2/KV260/KR260 用に Boot Loader(U-Boot等)、Linux Kernel、Debian11.7(bullseye) Root File System を以下の URL に用意したので、そのインストール方法を説明します。Boot Loader や Linux Kernel のビルドが面倒くさいという方はどうぞ。
注意事項
この記事で紹介しているリポジトリで提供されている Linux カーネルと Debian11 ルートファイルシステムは、AMD社(旧Xilinx社)の公式のものではありません。筆者が道楽で自分好みに魔改造しています。使用する際にはこの点に留意して自己責任でお願いします。
注記
これまで 旧記事 で紹介していた https://github.com/ikwzm/ZynqMP-FPGA-Linux は現在更新を停止しています。その理由は、このリポジトリには大量のバイナリファイルが含まれており保守が困難になっているためです。今後はディストリビューションごとに個別のリポジトリを提供することにしました。
特徴
対応ボード
- UltraZed-EG-IOCC : Xilinx Zynq UltraScale+ MPSoC Starter Kit by Avnet.
- 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 5.15.108-zynqmp-fpga-generic
- linux-stable 5.15.108 がベース
- Patched equivalent to linux-xlnx v2022.2
- Enable Device Tree Overlay with Configuration File System
- Enable FPGA Manager
- Enable FPGA Bridge
- Enable FPGA Reagion
- Enable ATWILC3000 Linux Driver for Ultra96-V2
- Other Configuration
Debian11.7(bullseye) Root File System
- Installed build-essential
- Installed device-tree-compiler
- 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-Debian11/archive/refs/tags/v1.0.1.tar.gz
shell$ tar xfz v1.0.1.tar.gz
shell$ cd ZynqMP-FPGA-Debian11-1.0.1
ファイルの説明
- target/Kv260/boot/
- boot.scr : Stage Script file
- uEnv.txt : U-Boot environment variables for linux boot
- devicetree-5.15.108-zynqmp-fpga-generic-kv260-revB.dtb : Linux Device Tree Blob
- devicetree-5.15.108-zynqmp-fpga-generic-kv260-revB.dts : Linux Device Tree Source
- target/Kr260/boot/
- boot.scr : Stage Script file
- uEnv.txt : U-Boot environment variables for linux boot
- devicetree-5.15.108-zynqmp-fpga-generic-kr260-revB.dtb : Linux Device Tree Blob
- devicetree-5.15.108-zynqmp-fpga-generic-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-5.15.108-zynqmp-fpga-generic-ultra96.dtb : Linux Device Tree Blob
- devicetree-5.15.108-zynqmp-fpga-generic-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-5.15.108-zynqmp-fpga-generic-ultra96v2.dtb : Linux Device Tree Blob
- devicetree-5.15.108-zynqmp-fpga-generic-ultra96v2.dts : Linux Device Tree Source
- files/
- vmlinuz-5.15.108-zynqmp-fpga-generic-5 : Linux Kernel Image
- config-5.15.108-zynqmp-fpga-generic-5 : Linux Kernel Configuration File
- debian11-rootfs-vanilla.tgz.files/ : Debian11 Root File System
- x00 .. x08 : (splited files)
- debian/
- linux-image-5.15.108-zynqmp-fpga-generic_5.15.108-zynqmp-fpga-generic-5_arm64.deb : Linux Image Package
- linux-headers-5.15.108-zynqmp-fpga-generic_5.15.108-zynqmp-fpga-generic-5_arm64.deb : Linux Headers Package
- fclkcfg-5.15.108-zynqmp-fpga-generic_1.7.2-1_arm64.deb : fclkcfg(1.7.2) Device Driver and Services Package
- u-dma-buf-5.15.108-zynqmp-fpga-generic_4.4.1-0_arm64.deb : u-dma-buf(4.4.1) Device Driver and Services 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-5.15.108-zynqmp-fpga-generic-5 > /mnt/usb1/image-5.15.108-zynqmp-fpga-generic
KR260 の場合
SD-Card のブートパーティション(例では/mnt/usb1)に target/Kr260/boot/ 下のファイルと Linux Kernel Image をコピーします。
shell# cp target/Kr260/boot/* /mnt/usb1
shell# gzip -d -c files/vmlinuz-5.15.108-zynqmp-fpga-generic-5 > /mnt/usb1/image-5.15.108-zynqmp-fpga-generic
Ultra96 の場合
SD-Card のブートパーティション(例では/mnt/usb1)に target/Ultra96/boot/ 下のファイルと Linux Kernel Image をコピーします。
shell# cp target/Ultra96/boot/* /mnt/usb1
shell# gzip -d -c files/vmlinuz-5.15.108-zynqmp-fpga-generic-5 > /mnt/usb1/image-5.15.108-zynqmp-fpga-generic
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-5.15.108-zynqmp-fpga-generic-5 > /mnt/usb1/image-5.15.108-zynqmp-fpga-generic
UltraZed の場合
SD-Card のブートパーティション(例では/mnt/usb1)に target/UltraZed-EG-IOCC/boot/ 下のファイルと Linux Kernel Image をコピーします。
shell# cp target/UltraZed-EG-IOCC/boot/* /mnt/usb1
shell# gzip -d -c files/vmlinuz-5.15.108-zynqmp-fpga-generic-5 > /mnt/usb1/image-5.15.108-zynqmp-fpga-generic
2. ルートパーティションの作成
SD-Card のルートパーティション(例では/mnt/usb2)に debian11-rootfs-vanilla.tgz.files の中身を展開します。展開したルートファイルシステムの home/fpga にデバイスドライバの Debian パッケージをあらかじめコピーしておくと良いでしょう。後から network 経由でコピーしてもかまいません。
shell# cat debian11-rootfs-vanilla.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
余談: このくらいの記述ならあらかじめ debian11-rootfs-vanilla.tgz に書いておけば良いのに、何故わざわざ後で設定するのか疑問に思われるかもしれません。その理由は、debian11-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 というのも存在していて、あらかじめ debian11-rootfs-vanilla.tgz に書いてしまっていると UltraZed では間違えて別のデバイスにアクセスしてしまいます。そこで、面倒ですが後で設定するようにしました。
4. ネットワークの設定
Ultra96/Ultra96-V2 は WiFi を通じてネットワークに接続します。あらかじめホスト側で設定ファイルを作って RootFS に書いておくと良いかもしれません。もちろん、後で Ultra96/Ultra96-V2 を起動してそちらで設定してもかまいません。
ここでは SSID を ssssssssに、パスフレーズを ppppppppp に、暗号化したアクセスキーを xxxx とします。
まずは wpa_passphrase に SSID とパスフレーズを入力して暗号化したアクセスキーを作ります。
shell# wpa_passphrase ssssssss ppppppppp
network={
ssid="ssssssss"
#psk="ppppppppp"
psk=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
}
4.1 /etc/network/interfaces.d/wlan0 に直接記述
SSID と暗号化したアクセスキーをネットワーク設定ファイル(/etc/network/interfaces.d/wlan0)に直接記述します。
auto wlan0
iface wlan0 inet dhcp
wpa-ssid ssssssss
wpa-psk xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4.2 /etc/wpa_supplicant/wpa_supplicant.conf に記述
ネットワーク設定ファイル(/etc/network/interfaces.d/wlan0)に、次のように、ブート時に wpa_supplicant.conf を読み込んで Wifi を設定するように記述します。
auto wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
SSID と暗号化したアクセスキーをWifi設定ファイル(/etc/wpa_supplicant/wpa_supplicant.conf)に記述します。
ctrl_interface=/run/wpa_supplicant
update_config=1
network={
ssid="ssssssss"
psk=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
}
なお、ステルス SSID の場合、スキャンを強制的に行う必要があります。この場合は、/etc/wpa_supplicant/wpa_supplicant.conf に scan_ssid=1
を追加します。
ctrl_interface=/run/wpa_supplicant
update_config=1
network={
ssid="ssssssss"
scan_ssid=1
key_mgmt=WPA-PSK
psk=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
}
パスフレーズ無し の SSID に接続する場合は、key_mgmt=NONE
(NONE は大文字) にすると良いようです。
ctrl_interface=/run/wpa_supplicant
update_config=1
network={
ssid="ssssssss"
scan_ssid=1
key_mgmt=NONE
}
5. SD-Card のアンマウント
shell# umount /mnt/usb1
shell# umount /mnt/usb2
デバイスドライバパッケージのインストール
ターゲットのブート
デバイスドライバなどの Debian パッケージをインストールするためには、上記で作成した SD-Card を使ってターゲットをブートする必要があります。
root でログイン
root でログインします。debian11-rootfs-vanilla.tgz の root のパスワードは admin
です。root のパスワードは適時変更しておくと良いでしょう。
debian-fpga login: root
Password:
root@debian-fpga:~#
Linux Image Package のインストール
debian11-rootfs-vanilla.tgz にはすでに Linux Image Package(linux-image-5.15.108-zynqmp-fpga-generic_5.15.108-zynqmp-fpga-generic-5_arm64.deb) がインストールされています。ですので、以下の作業は不要ですが、なんらかの事情で再インストールする際の参考にしてください。
なお、Linux Image Package はカーネルモジュールが含まれており、Debian が正常に起動するためには必須のパッケージです。必ずインストールしておいてください。
root@debian-fpga:~# cd /home/fpga/debian
root@debian-fpga:/home/fpga/debian# dpkg -i linux-image-5.15.108-zynqmp-fpga-generic_5.15.108-zynqmp-fpga-generic-5_arm64.deb
(Reading database ... 27341 files and directories currently installed.)
Preparing to unpack linux-image-5.15.108-zynqmp-fpga-generic_5.15.108-zynqmp-fpga-generic-5_arm64.deb ...
Unpacking linux-image-5.15.108-zynqmp-fpga-generic (5.15.108-zynqmp-fpga-generic-5) over (5.15.108-zynqmp-fpga-generic-5) ...
Setting up linux-image-5.15.108-zynqmp-fpga-generic (5.15.108-zynqmp-fpga-generic-5) ...
Linux Header Package のインストール
dpkg を使って linux-headers-5.15.108-zynqmp-fpga-generic_5.15.108-zynqmp-fpga-generic-5_arm64.deb をインストールします。途中で何故か ARM64_BTI、ARM64_E0PD、ARCH_RANDOM、ARM64_MTE、KASAN についてどうするか聞かれますが、かまわず ENTER キーを押してください。
なお、Linux Header Package のインストールは必須ではありませんが、デバイスドライバをセルフでビルドしたり、DKMS をつかってサードパーティが提供するドライバをインストールする際に必要になります。必要に応じてインストールしてください。
root@debian-fpga:~# cd /home/fpga/debian
root@debian-fpga:/home/fpga/debian# dpkg -i linux-headers-5.15.108-zynqmp-fpga-generic_5.15.108-zynqmp-fpga-generic-5_arm64.deb
Selecting previously unselected package linux-headers-5.15.108-zynqmp-fpga-generic.
(Reading database ... 27341 files and directories currently installed.)
Preparing to unpack linux-headers-5.15.108-zynqmp-fpga-generic_5.15.108-zynqmp-fpga-generic-5_arm64.deb ...
Unpacking linux-headers-5.15.108-zynqmp-fpga-generic (5.15.108-zynqmp-fpga-generic-5) ...
Setting up linux-headers-5.15.108-zynqmp-fpga-generic (5.15.108-zynqmp-fpga-generic-5) ...
make: Entering directory '/usr/src/linux-headers-5.15.108-zynqmp-fpga-generic'
SYNC include/config/auto.conf.cmd
HOSTCC scripts/basic/fixdep
HOSTCC scripts/kconfig/conf.o
HOSTCC scripts/kconfig/confdata.o
HOSTCC scripts/kconfig/expr.o
LEX scripts/kconfig/lexer.lex.c
YACC scripts/kconfig/parser.tab.[ch]
HOSTCC scripts/kconfig/lexer.lex.o
HOSTCC scripts/kconfig/menu.o
HOSTCC scripts/kconfig/parser.tab.o
HOSTCC scripts/kconfig/preprocess.o
HOSTCC scripts/kconfig/symbol.o
HOSTCC scripts/kconfig/util.o
HOSTLD scripts/kconfig/conf
*
* Restart config...
*
*
* ARMv8.5 architectural features
*
Branch Target Identification support (ARM64_BTI) [Y/n/?] y
Enable support for E0PD (ARM64_E0PD) [Y/n/?] y
Enable support for random number generation (ARCH_RANDOM) [Y/n/?] y
Memory Tagging Extension support (ARM64_MTE) [Y/n/?] (NEW)
*
* KASAN: runtime memory debugger
*
KASAN: runtime memory debugger (KASAN) [N/y/?] (NEW)
HOSTCC scripts/dtc/dtc.o
HOSTCC scripts/dtc/flattree.o
HOSTCC scripts/dtc/fstree.o
HOSTCC scripts/dtc/data.o
HOSTCC scripts/dtc/livetree.o
HOSTCC scripts/dtc/treesource.o
HOSTCC scripts/dtc/srcpos.o
HOSTCC scripts/dtc/checks.o
HOSTCC scripts/dtc/util.o
HOSTCC scripts/dtc/dtc-lexer.lex.o
HOSTCC scripts/dtc/dtc-parser.tab.o
HOSTLD scripts/dtc/dtc
HOSTCC scripts/dtc/libfdt/fdt.o
HOSTCC scripts/dtc/libfdt/fdt_ro.o
HOSTCC scripts/dtc/libfdt/fdt_wip.o
HOSTCC scripts/dtc/libfdt/fdt_sw.o
HOSTCC scripts/dtc/libfdt/fdt_rw.o
HOSTCC scripts/dtc/libfdt/fdt_strerror.o
HOSTCC scripts/dtc/libfdt/fdt_empty_tree.o
HOSTCC scripts/dtc/libfdt/fdt_addresses.o
HOSTCC scripts/dtc/libfdt/fdt_overlay.o
HOSTCC scripts/dtc/fdtoverlay.o
HOSTLD scripts/dtc/fdtoverlay
HOSTCC scripts/selinux/genheaders/genheaders
HOSTCC scripts/selinux/mdp/mdp
HOSTCC scripts/kallsyms
HOSTCC scripts/sorttable
HOSTCC scripts/asn1_compiler
HOSTCC scripts/extract-cert
CC scripts/mod/empty.o
HOSTCC scripts/mod/mk_elfconfig
MKELF scripts/mod/elfconfig.h
CC scripts/mod/devicetable-offsets.s
HOSTCC scripts/mod/modpost.o
HOSTCC scripts/mod/file2alias.o
HOSTCC scripts/mod/sumversion.o
HOSTLD scripts/mod/modpost
scripts/Makefile.build:459: warning: overriding recipe for target 'modules.order'
Makefile:1508: warning: ignoring old recipe for target 'modules.order'
make: Leaving directory '/usr/src/linux-headers-5.15.108-zynqmp-fpga-generic'
fclkcfg デバイスドライバのインストール
dpkg を使って fclkcfg-5.15.108-zynqmp-fpga-generic_1.7.2-1_arm64.deb をインストールします。
このパッケージは必須ではありません。
root@debian-fpga:~# cd /home/fpga/debian
root@debian-fpga:/home/fpga/debian# dpkg -i fclkcfg-5.15.108-zynqmp-fpga-generic_1.7.2-1_arm64.deb
Selecting previously unselected package fclkcfg-5.15.108-zynqmp-fpga-generic.
(Reading database ... 43883 files and directories currently installed.)
Preparing to unpack fclkcfg-5.15.108-zynqmp-fpga-generic_1.7.2-1_arm64.deb ...
Unpacking fclkcfg-5.15.108-zynqmp-fpga-generic (1.7.2-1) ...
Setting up fclkcfg-5.15.108-zynqmp-fpga-generic (1.7.2-1) ...
udmabuf デバイスドライバのインストール
dpkg を使って u-dma-buf-5.15.108-zynqmp-fpga-generic_4.4.1-0_arm64.deb をインストールします。
このパッケージは必須ではありません。
root@debian-fpga:~# cd /home/fpga/debian
root@debian-fpga:/home/fpga/debian# dpkg -i u-dma-buf-5.15.108-zynqmp-fpga-generic_4.4.1-0_arm64.deb
Selecting previously unselected package u-dma-buf-5.15.108-zynqmp-fpga-generic.
(Reading database ... 43889 files and directories currently installed.)
Preparing to unpack u-dma-buf-5.15.108-zynqmp-fpga-generic_4.4.1-0_arm64.deb ...
Unpacking u-dma-buf-5.15.108-zynqmp-fpga-generic (4.4.1-0) ...
Setting up u-dma-buf-5.15.108-zynqmp-fpga-generic (4.4.1-0) ...
参考
- https://github.com/ikwzm/ZynqMP-FPGA-Debian11
- https://github.com/ikwzm/ZynqMP-FPGA-Linux-Kernel-5.15
- 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
- https://github.com/ikwzm/ZynqMP-FPGA-Ubuntu22.04-Console
- https://github.com/ikwzm/ZynqMP-FPGA-Ubuntu22.04-Desktop
旧記事
現時点の最新バージョンは ZynqMP-FPGA-Debian11 v1.0.1 ですが、それ以前のバージョンをインストールする際は以下の記事を参照してください。
- 「UltraZed/Ultra96/Ultra96-V2/KV260 向け Debian GNU/Linux (v2021.1版) ブートイメージの提供」 @Qiita
- 「UltraZed/Ultra96/Ultra96-V2 向け Debian GNU/Linux (v2020.2版) ブートイメージの提供」 @Qiita
- 「UltraZed/Ultra96/Ultra96-V2 向け Debian GNU/Linux (v2019.2版) ブートイメージの提供」 @Qiita
- 「UltraZed/Ultra96/Ultra96-V2 向け Debian GNU/Linux (v2019.1版) ブートイメージの提供」 @Qiita
- 「Ultra96 向け Debian GNU/Linux (v2018.2版) ブートイメージの提供」 @Qiita
- 「UltraZed 向け Debian GNU/Linux (v2018.2版) ブートイメージの提供」 @Qiita