注意(2023年5月10日追記)
この記事は2020年に投稿(2021年11月追記)したものであり、古い内容が含まれています。2023年5月10に以下の記事を投稿しましたので参照してください。
注意(2021年11月25日追記)
この記事は 2020年に投稿したものであり、古い内容が含まれています。2021年11月25日に以下の記事を投稿しましたので参照していください。
はじめに
この記事は、UltraZed/Ultra96/Ultra96-V2 用に Boot Loader(U-Boot等)、Linux Kernel、Debian10(buster) Root File System を以下の URL に用意したので、そのインストール方法を説明します。Boot Loader や Linux Kernel のビルドが面倒くさいという方はどうぞ。
概要
- Hardware
- 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.
- Boot Loader
- 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 Version v4.19.0
- linux-xlnx tag=xilinx-v2019.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
- Debian10(buster) 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 list -> https://github.com/ikwzm/ZynqMP-FPGA-Linux/blob/v2019.2.1/files/debian10-dpkg-list.txt
- FPGA Device Drivers and Services
インストール
ダウンロード
github から次のようにダウンロードしてください。現時点の最新バージョンは v2019.2.1 です。なお、いくつかのイメージファイルはかなり大きいので、Git LFS(Large File Storage)を使っています。お使いの環境に git-lfs がインストールされている必要があります。
shell$ git clone -b v2019.2.1 git://github.com/ikwzm/ZynqMP-FPGA-Linux
shell$ cd ZynqMP-FPGA-Linux
shell$ git lfs pull
ファイルの説明
- target/Ultra96
- boot/
- boot.bin : Stage 1 Boot Loader
- uEnv.txt : U-Boot environment variables for linux boot
- image-4.19.0-xlnx-v2019.2-zynqmp-fpga : Linux Kernel Image (use Git LFS)
- devicetree-4.19.0-xlnx-v2019.2-zynqmp-fpga-ultra96.dtb : Linux Device Tree Blob
- devicetree-4.19.0-xlnx-v2019.2-zynqmp-fpga-ultra96.dts : Linux Device Tree Source
- boot/
- target/Ultra96-V2
- boot/
- boot.bin : Stage 1 Boot Loader
- uEnv.txt : U-Boot environment variables for linux boot
- image-4.19.0-xlnx-v2019.2-zynqmp-fpga : Linux Kernel Image (use Git LFS)
- devicetree-4.19.0-xlnx-v2019.2-zynqmp-fpga-ultra96v2.dtb : Linux Device Tree Blob
- devicetree-4.19.0-xlnx-v2019.2-zynqmp-fpga-ultra96v2.dts : Linux Device Tree Source
- boot/
- target/UltraZed-EG-IOCC/
- boot/
- boot.bin : Stage 1 Boot Loader
- uEnv.txt : U-Boot environment variables for linux boot
- image-4.19.0-xlnx-v2019.2-zynqmp-fpga : Linux Kernel Image (use Git LFS)
- devicetree-4.19.0-xlnx-v2019.2-zynqmp-fpga-ultra96v2.dtb : Linux Device Tree Blob
- devicetree-4.19.0-xlnx-v2019.2-zynqmp-fpga-ultra96v2.dts : Linux Device Tree Source
- boot/
- debian10-rootfs-vanilla.tgz : Debian10 Root File System (use Git LFS)
- linux-image-4.19.0-xlnx-v2019.2-zynqmp-fpga_4.19.0-xlnx-v2019.2-zynqmp-fpga-2_arm64.deb : Linux Image Package (use Git LFS)
- linux-headers-4.19.0-xlnx-v2019.2-zynqmp-fpga_4.19.0-xlnx-v2019.2-zynqmp-fpga-2_arm64.deb : Linux Headers Package (use Git LFS)
- fclkcfg-4.19.0-xlnx-v2019.2-zynqmp-fpga_1.3.0-1_arm64.deb : fclkcfg(1.3.0) Device Driver Package
- udmabuf-4.19.0-xlnx-v2019.2-zynqmp-fpga_1.4.6-0_arm64.deb : udmabuf(1.4.6) Device Driver Package
- u-dma-buf-4.19.0-xlnx-v2019.2-zynqmp-fpga_2.1.3-0_arm64.deb : udmabuf(2.1.3) Device 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 のマウント
shell# mount /dev/sdc1 /mnt/usb1
shell# mount /dev/sdc2 /mnt/usb2
1. Boot Partition のコピー
Ultra96 の場合
SD-Card のパーティション1(下の例では/dev/sdc1)に target/Ultra96/boot/ 下のファイルをコピーします。
shell# cp target/Ultra96/boot/* /mnt/usb1
Ultra96-V2 の場合
SD-Card のパーティション1(下の例では/dev/sdc1)に target/Ultra96-V2/boot/ 下のファイルをコピーします。
shell# cp target/Ultra96-V2/boot/* /mnt/usb1
UltraZed の場合
SD-Card のパーティション1(下の例では/dev/sdc1)に target/UltraZed-EG-IOCC/boot 下のファイルをコピーします。
shell# cp target/UltraZed-EG-IOCC/boot/* /mnt/usb1
2. RootFS Partition の生成
SD-Card のパーティション2(下の例では/dev/sdc2)に debian10-rootfs-vanilla.tgz の中身を展開します。展開したルートファイルシステムの home/fpga にデバイスドライバの Debian パッケージをあらかじめコピーしておくと良いでしょう。後から network 経由でコピーしてもかまいません。
shell# tar xfz debian10-rootfs-vanilla.tgz -C /mnt/usb2
shell# mkdir /mnt/usb2/home/fpga/debian
shell# cp linux-image-4.19.0-xlnx-v2019.2-zynqmp-fpga_4.19.0-xlnx-v2019.2-zynqmp-fpga-2_arm64.deb /mnt/usb2/home/fpga/debian
shell# cp linux-headers-4.19.0-xlnx-v2019.2-zynqmp-fpga_4.19.0-xlnx-v2019.2-zynqmp-fpga-2_arm64.deb /mnt/usb2/home/fpga/debian
shell# cp fclkcfg-4.19.0-xlnx-v2019.2-zynqmp-fpga_1.3.0-1_arm64.deb /mnt/usb2/home/fpga/debian
shell# cp udmabuf-4.19.0-xlnx-v2019.2-zynqmp-fpga_1.4.6-0_arm64.deb /mnt/usb2/home/fpga/debian
shell# cp u-dma-buf-4.19.0-xlnx-v2019.2-zynqmp-fpga_2.1.3-0_arm64.deb /mnt/usb2/home/fpga/debian
3. Boot Partition を見えるように fstab を設定
Boot Partition を Linux 側から常時見えるようにしておくと便利です。その場合は、あらかじめ fstab にブートパーティションをマウントするように設定しておくと良いでしょう。すでに fstab には configfs のマウントが設定されているので注意してください。
shell# mkdir /mnt/usb2/mnt/boot
shell# cat <<EOT >> /mnt/usb2/etc/fstab
/dev/mmcblk0p1 /mnt/boot auto defaults 0 0
EOT
余談: このくらいの記述ならあらかじめ debian10-rootfs-vanilla.tgz に書いておけば良いのに、何故わざわざ後で設定するのか疑問に思われるかもしれません。その理由は、debian10-rootfs-vanilla.tgz が Ultra96 と UltraZed と共用だからです。Ultra96 の SD-Card のブートパーティションは /dev/mmcblk0p1
ですが、UltraZed の SD-Card のブートパーティションは /dev/mmcblk1p1
です。しかも UltraZed には /dev/mmcblk0p1 というのも存在していて、あらかじめ debian10-rootfs-vanilla.tgz に書いてしまっていると UltraZed では間違えて別のデバイスにアクセスしてしまいます。そこで、面倒ですが後で設定するようにしました。
4. network の設定
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
デバイスドライバ パッケージのインストール
Ultra96/Ultra96-V2/UltraZed をブートして root でログイン
root'password is "admin".
debian-fpga login: root
Password:
root@debian-fpga:~#
Linux Image Package のインストール
debian10-rootfs-vanilla.tgz にはすでに v2019.2.1 の Linux Image Package(linux-image-4.19.0-xlnx-v2019.2-zynqmp-fpga_4.19.0-xlnx-v2019.2-zynqmp-fpga-2_arm64.deb) がインストールされています。ですので、以下の作業は不要ですが、なんらかの事情で再インストールする際の参考にしてください。
root@debian-fpga:~# cd /home/fpga/debian
root@debian-fpga:/home/fpga/debian# dpkg -i linux-image-4.19.0-xlnx-v2019.2-zynqmp-fpga_4.19.0-xlnx-v2019.2-zynqmp-fpga-2_arm64.deb
(Reading database ... 26393 files and directories currently installed.)
Preparing to unpack linux-image-4.19.0-xlnx-v2019.2-zynqmp-fpga_4.19.0-xlnx-v2019.2-zynqmp-fpga-2_arm64.deb ...
Unpacking linux-image-4.19.0-xlnx-v2019.2-zynqmp-fpga (4.19.0-xlnx-v2019.2-zynqmp-fpga-2) over (4.19.0-xlnx-v2019.2-zynqmp-fpga-2) ...
Setting up linux-image-4.19.0-xlnx-v2019.2-zynqmp-fpga (4.19.0-xlnx-v2019.2-zynqmp-fpga-2) ...
Linux Header Package のインストール
dpkg を使って linux-headers-4.19.0-xlnx-v2019.2-zynqmp-fpga_4.19.0-xlnx-v2019.2-zynqmp-fpga-2_arm64.deb をインストールします。
root@debian-fpga:~# cd /home/fpga/debian
root@debian-fpga:/home/fpga/debian# dpkg -i linux-headers-4.19.0-xlnx-v2019.2-zynqmp-fpga_4.19.0-xlnx-v2019.2-zynqmp-fpga-2_arm64.deb
Selecting previously unselected package linux-headers-4.19.0-xlnx-v2019.2-zynqmp-fpga.
(Reading database ... 26393 files and directories currently installed.)
Preparing to unpack linux-headers-4.19.0-xlnx-v2019.2-zynqmp-fpga_4.19.0-xlnx-v2019.2-zynqmp-fpga-2_arm64.deb ...
Unpacking linux-headers-4.19.0-xlnx-v2019.2-zynqmp-fpga (4.19.0-xlnx-v2019.2-zynqmp-fpga-2) ...
Setting up linux-headers-4.19.0-xlnx-v2019.2-zynqmp-fpga (4.19.0-xlnx-v2019.2-zynqmp-fpga-2) ...
make: Entering directory '/usr/src/linux-headers-4.19.0-xlnx-v2019.2-zynqmp-fpga'
HOSTCC scripts/basic/fixdep
HOSTCC scripts/kconfig/conf.o
YACC scripts/kconfig/zconf.tab.c
LEX scripts/kconfig/zconf.lex.c
HOSTCC scripts/kconfig/zconf.tab.o
HOSTLD scripts/kconfig/conf
scripts/kconfig/conf --syncconfig Kconfig
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
CC scripts/mod/empty.o
HOSTCC scripts/mod/mk_elfconfig
MKELF scripts/mod/elfconfig.h
HOSTCC scripts/mod/modpost.o
CC scripts/mod/devicetable-offsets.s
HOSTCC scripts/mod/file2alias.o
HOSTCC scripts/mod/sumversion.o
HOSTLD scripts/mod/modpost
HOSTCC scripts/bin2c
HOSTCC scripts/kallsyms
HOSTCC scripts/conmakehash
HOSTCC scripts/sortextable
HOSTCC scripts/asn1_compiler
HOSTCC scripts/extract-cert
make: Leaving directory '/usr/src/linux-headers-4.19.0-xlnx-v2019.2-zynqmp-fpga'
fclkcfg デバイスドライバのインストール
dpkg を使って fclkcfg-4.19.0-xlnx-v2019.2-zynqmp-fpga_1.3.0-1_arm64.deb をインストールします。
root@debian-fpga:~# cd /home/fpga/debian
root@debian-fpga:/home/fpga/debian# dpkg -i fclkcfg-4.19.0-xlnx-v2019.2-zynqmp-fpga_1.3.0-1_arm64.deb
Selecting previously unselected package fclkcfg-4.19.0-xlnx-v2019.2-zynqmp-fpga.
(Reading database ... 45373 files and directories currently installed.)
Preparing to unpack fclkcfg-4.19.0-xlnx-v2019.2-zynqmp-fpga_1.3.0-1_arm64.deb ...
Unpacking fclkcfg-4.19.0-xlnx-v2019.2-zynqmp-fpga (1.3.0-1) ...
Setting up fclkcfg-4.19.0-xlnx-v2019.2-zynqmp-fpga (1.3.0-1) ...
udmabuf デバイスドライバのインストール
dpkg を使って udmabuf-4.19.0-xlnx-v2019.2-zynqmp-fpga_1.4.6-0_arm64.deb をインストールします。
root@debian-fpga:~# cd /home/fpga/debian
root@debian-fpga:/home/fpga/debian# dpkg -i udmabuf-4.19.0-xlnx-v2019.2-zynqmp-fpga_1.4.6-0_arm64.deb
Selecting previously unselected package udmabuf-4.19.0-xlnx-v2019.2-zynqmp-fpga.
(Reading database ... 45379 files and directories currently installed.)
Preparing to unpack udmabuf-4.19.0-xlnx-v2019.2-zynqmp-fpga_1.4.6-0_arm64.deb ...
Unpacking udmabuf-4.19.0-xlnx-v2019.2-zynqmp-fpga (1.4.6-0) ...
Setting up udmabuf-4.19.0-xlnx-v2019.2-zynqmp-fpga (1.4.6-0) ...
v2019.2 からは udmabuf の別名の u-dma-buf の Package も用意しています。もし必要ならば、これもインストールしておくと良いでしょう。
udmabuf から u-dma-buf に名前を変更した理由は、udmabuf と同じ名前の別のカーネルモジュールが Linux Kernel 5.0 に追加されたからです。したがって、Linux Kernel 5.0 以降では udmabuf という名前は使用できません。そこで u-dma-buf が替わりに提供されます。
root@debian-fpga:~# cd /home/fpga/debian
root@debian-fpga:/home/fpga/debian# dpkg -i u-dma-buf-4.19.0-xlnx-v2019.2-zynqmp-fpga_2.1.3-0_arm64.deb
Selecting previously unselected package u-dma-buf-4.19.0-xlnx-v2019.2-zynqmp-fpga.
(Reading database ... 45384 files and directories currently installed.)
Preparing to unpack u-dma-buf-4.19.0-xlnx-v2019.2-zynqmp-fpga_2.1.3-0_arm64.deb ...
Unpacking u-dma-buf-4.19.0-xlnx-v2019.2-zynqmp-fpga (2.1.3-0) ...
Setting up u-dma-buf-4.19.0-xlnx-v2019.2-zynqmp-fpga (2.1.3-0) ...
v2019.1 からのアップグレード
v2019.1 からの変更点
v2019.1 から、次の点が変更になっています。
- Debian10(buster) Root File System の各種アプリケーションがバージョンアップしている
- device-tree-compiler のビルドを削除
- Linux Kernel のバージョンが 4.19.0-xlnx-v2019.1 から 4.19.0-xlnx-v2019.2 になった
- Boot Loader の各バイナリ(U-Boot、ATF、PMUFW、FSBL、design_1_wrapper.bit) のバージョンアップ
- uEnv.txt の大幅な追加
従って、以下の手順で v2019.1 から v2019.2 にアップグレードすることが出来ます。
アップグレード手順
1. Debian10(buster) のアップグレード
Debian10(buster) の各種アプリケーションがバージョンアップしています。Ultra96/Ultra96-V2/UltraZed がネットワークに接続しているならば、apt コマンド で v2019.1 から v2019.2 相当にアップグレードできます。Ultra96/Ultra96-V2/UltraZed をブートして root でログインして apt update と apt upgrade を実行してください。
debian-fpga login: root
Password:
root@debian-fpga:~# apt update
:
(中略)
:
root@debian-fpga:~# apt upgrade
:
(中略)
:
この方法では、Package すべてアップグレードしてしまいます。もしアップグレードしたくない Package がある場合は注意してください。
2. Linux Image Package のアップグレード
https://github.com/ikwzm/ZynqMP-FPGA-Linux に linux-image-4.19.0-xlnx-v2019.2-zynqmp-fpga_4.19.0-xlnx-v2019.2-zynqmp-fpga-2_arm64.deb を用意しているので、これを dpkg でインストールしてください。
3. Linux Header Package のアップグレード
https://github.com/ikwzm/ZynqMP-FPGA-Linux に linux-headers-4.19.0-xlnx-v2019.2-zynqmp-fpga_4.19.0-xlnx-v2019.2-zynqmp-fpga-2_arm64.deb を用意しているので、これを dpkg でインストールしてください。
4. Device Driver のアップグレード
Linux Kernel のバージョンが上ったため、デバイスドライバを新しい Linux Kernel バージョンに対応させる必要があります。udmabuf と fclkcfg は https://github.com/ikwzm/ZynqMP-FPGA-Linux に Package を用意しているので、これを dpkg でインストールしてください。
5. device-tree-compiler のインストール
v2018.2 で採用した Debian9では device-tree-compiler のバージョンが古い(シンボルに対応していなかった)ため、https://git.kernel.org/pub/scm/utils/dtc/dtc.git から v1.4.7 をダウンロードしてビルド&インストールしていました。
v2019.1 で採用した Debian10 では device-tree-compiler のバージョンが v1.4.7 になってシンボルに対応しました。しかし、私が v2019.1 を作っていたときはこのことに気が付かず、v2018.2 と同じように https://git.kernel.org/pub/scm/utils/dtc/dtc.git から v1.4.7 をダウンロードしてビルド&インストールしていました。
v2019.2 の Debian10 Root File System では Debian10 が提供している device-tree-compiler がインストールされています。v2019.1 からアップグレードする際は /usr/local/bin/dtc を削除して、apt コマンドで device-tree-compiler をインストールしておいたほうが良いでしょう。
6. Boot Partition のアップグレード
Boot Partition には Boot Loader、Linux Kernel Image、uEnv.txt が含まれます。github から v2019.2.1 をダウンロードて、target/[Ultra96|Ultra96-V2|UltraZed-EG-IOCC]/boot 下のファイルを Boot Partition にコピーしてください。ただし、uEnv.txt も上書きしてしまいますので、uEnv.txt になにか重要な変更を加えていた場合はバックアップをとっておくと良いでしょう。
6.1 Ultra96 の場合
SD-Card のパーティション1(下の例では/mnt/boot)に target/Ultra96/boot/ 下のファイルをコピーします。
shell# cp target/Ultra96/boot/* /mnt/boot
6.2 Ultra96-V2 の場合
SD-Card のパーティション1(下の例では/mnt/boot)に target/Ultra96-V2/boot/ 下のファイルをコピーします。
shell# cp target/Ultra96-V2/boot/* /mnt/boot
6.3 UltraZed の場合
SD-Card のパーティション1(下の例では/mnt/boot)に target/UltraZed-EG-IOCC/boot 下のファイルをコピーします。
shell# cp target/UltraZed-EG-IOCC/boot/* /mnt/boot
参考
v2019.2 から Boot Loader(U-Boot等) のビルド環境はターゲット毎に別々のリポジトリに暖簾分けされました。以下の URL を参考にしてください。
- 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
現時点の最新バージョンは v2019.2.1 ですが、それ以前のバージョンをインストールする際は以下の記事を参照してください。