UltraZed/Ultra96/Ultra96-V2 向け Debian GNU/Linux (v2019.1版) ブートイメージの提供

注意(2023年5月10日追記)
--------------------------------------------------

この記事は2019年に投稿(2021年11追記)したものであり、古い内容が含まれています。2023年5月10に以下の記事を投稿しましたので参照してください。

 * [「UltraZed/Ultra96/Ultra96-V2/KV260/KR260 向け Debian (11.7) GNU/Linux ブートイメージの提供」 @Qiita](https://qiita.com/ikwzm/items/5ba7bbb54e65fdfab367)

注意(2021年11月25日追記)
--------------------------------------------------

この記事は 2019年に投稿したものであり、古い内容が含まれています。2021年11月25日に以下の記事を投稿しましたので参照していください。

* [「UltraZed/Ultra96/Ultra96-V2/KV260 向け Debian GNU/Linux (v2021.1版) ブートイメージの提供」 @Qiita](https://qiita.com/ikwzm/items/a9adc5a7329b2eb36895)


はじめに
--------------------------------------------------

 * UltraZed-EG スターターキットは Xilinx 社の Zynq UltraScale+ MPSoC(XCZU3EG-SFVA625) を搭載した UltraZed-EG-SOM と UltraZed IOキャリアカードで構成された Avnet 社のキットです。
 * Ultra96 は Xilinx 社の Zynq Ultrascale+ MPSoC(XCZU3EG-1SBVA484E) を搭載した Avnet 社製の 96boads 互換のボードです。
 * Ultra96-V2 は 2018年にリリースされた Ultra96 を更新&再構成したものです。

UltraZed/Ultra96/Ultra96-V2 用に Boot Loader(U-Boot等)、Linux Kernel、Debian10(buster) Root File System を以下の URL に用意したので、この記事ではインストール方法を説明します。

 * [https://github.com/ikwzm/ZynqMP-FPGA-Linux](https://github.com/ikwzm/ZynqMP-FPGA-Linux)

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.1 (customized)
* Linux Kernel Version v4.19.0
  + [linux-xlnx](https://github.com/Xilinx/linux-xlnx) tag=xilinx-v2019.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
* 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.1.0/files/debian10-dpkg-list.txt]
* FPGA Device Drivers and Services
  + [fclkcfg    (FPGA Clock Configuration Device Driver)](https://github.com/ikwzm/fclkcfg)
  + [udmabuf    (User space mappable DMA Buffer)](https://github.com/ikwzm/udmabuf)

インストール
--------------------------------------------------

### ダウンロード

github から次のようにダウンロードしてください。現時点の最新バージョンは v2019.1.2 です。なお、いくつかのイメージファイルはかなり大きいので、Git LFS(Large File Storage)を使っています。お使いの環境に git-lfs がインストールされている必要があります。

```console
shell$ git clone -b v2019.1.2 git://github.com/ikwzm/ZynqMP-FPGA-Linux
shell$ cd ZynqMP-FPGA-Linux
shell$ git lfs pull
```

### 注意

v2019.1.1 の Linux Kernel には以下の記事で示した修正が私のミスで反映されていませんでした。

 * [「ZynqMP 向け Debian/Linux(v2019.1版) でFPGA クロックの周波数の変更に失敗する件」@Qiita](https://qiita.com/ikwzm/items/f19669462ece632db040)

v2019.1.2 の Linux Kernel でこの修正が反映されています。



### ファイルの説明

 * target/Ultra96
   + boot/
     - boot.bin                                                    : Stage 1 Boot Loader for Ultra96
     - uEnv.txt                                                    : U-Boot environment variables for linux boot
     - image-4.19.0-xlnx-v2019.1-zynqmp-fpga                       : Linux Kernel Image       (use Git LFS)
     - devicetree-4.19.0-xlnx-v2019.1-zynqmp-fpga-ultra96.dtb      : Linux Device Tree Blob   
     - devicetree-4.19.0-xlnx-v2019.1-zynqmp-fpga-ultra96.dts      : Linux Device Tree Source
 * target/Ultra96-V2
   + boot/
     - boot.bin                                                    : Stage 1 Boot Loader for Ultra96-V2
     - uEnv.txt                                                    : U-Boot environment variables for linux boot
     - image-4.19.0-xlnx-v2019.1-zynqmp-fpga                       : Linux Kernel Image       (use Git LFS)
     - devicetree-4.19.0-xlnx-v2019.1-zynqmp-fpga-ultra96v2.dtb    : Linux Device Tree Blob   
     - devicetree-4.19.0-xlnx-v2019.1-zynqmp-fpga-ultra96v2.dts    : Linux Device Tree Source
 * target/UltraZed-EG-IOCC/
   + boot/
     - boot.bin                                                    : Stage 1 Boot Loader for UltraZed
     - uEnv.txt                                                    : U-Boot environment variables for linux boot
     - image-4.19.0-xlnx-v2019.1-zynqmp-fpga                       : Linux Kernel Image       (use Git LFS)
     - devicetree-4.19.0-xlnx-v2019.1-zynqmp-fpga-ultra96v2.dtb    : Linux Device Tree Blob   
     - devicetree-4.19.0-xlnx-v2019.1-zynqmp-fpga-ultra96v2.dts    : Linux Device Tree Source
 * debian10-rootfs-vanilla.tgz                                     : Debian10 Root File System (use Git LFS)
 * linux-image-4.19.0-xlnx-v2019.1-zynqmp-fpga_4.19.0-xlnx-v2019.1-zynqmp-fpga-3_arm64.deb   : Linux Image Package      (use Git LFS)
 * linux-headers-4.19.0-xlnx-v2019.1-zynqmp-fpga_4.19.0-xlnx-v2019.1-zynqmp-fpga-3_arm64.deb : Linux Headers Package    (use Git LFS)
 * fclkcfg-4.19.0-xlnx-v2019.1-zynqmp-fpga_1.2.0-1_arm64.deb       : fclkcfg Device Driver and Services Package
 * udmabuf-4.19.0-xlnx-v2019.1-zynqmp-fpga_1.4.2-0_arm64.deb       : udmabuf Device Driver and Services Package

### SD-Card のフォーマット

 1. SD-Card のパーティション１を VFAT File System でファイルシステムを作ります。
 2. SD-Card のパーティション２を ext4 File System でファイルシステムを作ります。

Linux での SD-Card のフォーマット方法は次の URL を参照してください。

 * https://github.com/ikwzm/ZynqMP-FPGA-Linux/blob/master/doc/install/format-disk-zynq.md

### SD-Card への書き込み

#### 0. SD-Card のマウント

```console
shell# mount /dev/sdc1 /mnt/usb1
shell# mount /dev/sdc2 /mnt/usb2
```

#### 1. Boot Partition のコピー

##### Ultra96 の場合

SD-Card のパーティション１(下の例では/dev/sdc1)に target/Ultra96/boot/ 下のファイルをコピーします。

```console
shell# cp target/Ultra96/boot/*                                           /mnt/usb1
```

##### Ultra96-V2 の場合

SD-Card のパーティション１(下の例では/dev/sdc1)に target/Ultra96-V2/boot/ 下のファイルをコピーします。

```console
shell# cp target/Ultra96-V2/boot/*                                        /mnt/usb1
```

##### UltraZed の場合

SD-Card のパーティション１(下の例では/dev/sdc1)に target/UltraZed-EG-IOCC/ 下のファイルをコピーします。

```console
shell# cp target/UltraZed-EG-IOCC/boot/*                                  /mnt/usb1
```

#### 2. RootFS Partition の生成

SD-Card のパーティション２(下の例では/dev/sdc2)に debian10-rootfs-vanilla.tgz の中身を展開します。展開したルートファイルシステムの home/fpga にデバイスドライバの Debian パッケージをあらかじめコピーしておくと良いでしょう。後から network 経由でコピーしてもかまいません。

```console
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.1-zynqmp-fpga_4.19.0-xlnx-v2019.1-zynqmp-fpga-3_arm64.deb   /mnt/usb2/home/fpga/debian
shell# cp linux-headers-4.19.0-xlnx-v2019.1-zynqmp-fpga_4.19.0-xlnx-v2019.1-zynqmp-fpga-3_arm64.deb /mnt/usb2/home/fpga/debian
shell# cp fclkcfg-4.19.0-xlnx-v2019.1-zynqmp-fpga_1.2.0-1_arm64.deb       /mnt/usb2/home/fpga/debian
shell# cp udmabuf-4.19.0-xlnx-v2019.1-zynqmp-fpga_1.4.2-0_arm64.deb       /mnt/usb2/home/fpga/debian
```

#### 3. ブートパーティションを見えるように fstab を設定

Boot Partition を Linux 側から常時見えるようにしておくと便利です。その場合は、あらかじめ fstab にブートパーティションをマウントするように設定しておくと良いでしょう。すでに fstab には configfs のマウントが設定されているので注意してください。

```console
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 とパスフレーズを入力して暗号化したアクセスキーを作ります。

```console
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)に直接記述します。

```text:/mnt/usb2/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 を設定するように記述します。

```text:/mnt/usb2/etc/network/interfaces.d/wlan0

auto  wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

```

SSID と暗号化したアクセスキーをWifi設定ファイル(/etc/wpa_supplicant/wpa_supplicant.conf)に記述します。

```text:/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``` を追加します。

```text:/etc/wpa_supplicant/wpa_supplicant.conf
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 は大文字) にすると良いようです。

```text:/etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=/run/wpa_supplicant
update_config=1

network={
	ssid="ssssssss"
	scan_ssid=1
	key_mgmt=NONE
}
```

#### 5. SD-Card のアンマウント

```console
shell# umount /mnt/usb1
shell# umount /mnt/usb2
```

### デバイスドライバ パッケージのインストール

####  Ultra96/Ultra96-V2/UltraZed をブートして root でログイン

root'password is "admin".

```console
debian-fpga login: root
Password:
root@debian-fpga:~#
```

#### Linux Image Package のインストール

debian10-rootfs-vanilla.tgz にはすでに v2019.1.1 の Linux Image Package(linux-image-4.19.0-xlnx-v2019.1-zynqmp-fpga_4.19.0-xlnx-v2019.1-zynqmp-fpga-2_arm64.deb) がインストールされています。v2019.1.1 から v2019.1.2 にアップグレードするためには linux-image-4.19.0-xlnx-v2019.1-zynqmp-fpga_4.19.0-xlnx-v2019.1-zynqmp-fpga-3_arm64.deb をインストールして Linux Image Package を更新してください。

```console
root@debian-fpga:~# cd /home/fpga/debian
root@debian-fpga:~# sudo dpkg -i linux-image-4.19.0-xlnx-v2019.1-zynqmp-fpga_4.19.0-xlnx-v2019.1-zynqmp-fpga-3_arm64.deb
(Reading database ... 48216 files and directories currently installed.)
Preparing to unpack linux-image-4.19.0-xlnx-v2019.1-zynqmp-fpga_4.19.0-xlnx-v2019.1-zynqmp-fpga-3_arm64.deb ...
Unpacking linux-image-4.19.0-xlnx-v2019.1-zynqmp-fpga (4.19.0-xlnx-v2019.1-zynqmp-fpga-3) over (4.19.0-xlnx-v2019.1-zynqmp-fpga-2) ...
Setting up linux-image-4.19.0-xlnx-v2019.1-zynqmp-fpga (4.19.0-xlnx-v2019.1-zynqmp-fpga-3) ...
```


#### Linux Header Package のインストール

dpkg を使って linux-headers-4.19.0-xlnx-v2019.1-zynqmp-fpga_4.19.0-xlnx-v2019.1-zynqmp-fpga-3_arm64.deb をインストールします。

```console
root@debian-fpga:~# cd /home/fpga/debian
root@debian-fpga:/home/fpga/debian# dpkg -i linux-headers-4.19.0-xlnx-v2019.1-zynqmp-fpga_4.19.0-xlnx-v2019.1-zynqmp-fpga-3_arm64.deb
Selecting previously unselected package linux-headers-4.19.0-xlnx-v2019.1-zynqmp-fpga.
(Reading database ... 26341 files and directories currently installed.)
Preparing to unpack linux-headers-4.19.0-xlnx-v2019.1-zynqmp-fpga_4.19.0-xlnx-v2019.1-zynqmp-fpga-3_arm64.deb ...
Unpacking linux-headers-4.19.0-xlnx-v2019.1-zynqmp-fpga (4.19.0-xlnx-v2019.1-zynqmp-fpga-3) ...
Setting up linux-headers-4.19.0-xlnx-v2019.1-zynqmp-fpga (4.19.0-xlnx-v2019.1-zynqmp-fpga-3) ...
make: Entering directory '/usr/src/linux-headers-4.19.0-xlnx-v2019.1-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.1-zynqmp-fpga'
```

#### fclkcfg デバイスドライバ＆サービスのインストール

dpkg を使って fclkcfg-4.19.0-xlnx-v2019.1-zynqmp-fpga_1.2.0-1_arm64.deb をインストールします。

```console
root@debian-fpga:~# cd /home/fpga/debian
root@debian-fpga:/home/fpga/debian# dpkg -i fclkcfg-4.19.0-xlnx-v2019.1-zynqmp-fpga_1.2.0-1_arm64.deb
Selecting previously unselected package fclkcfg-4.19.0-xlnx-v2019.1-zynqmp-fpga.
(Reading database ... 45308 files and directories currently installed.)
Preparing to unpack fclkcfg-4.19.0-xlnx-v2019.1-zynqmp-fpga_1.2.0-1_arm64.deb ...
Unpacking fclkcfg-4.19.0-xlnx-v2019.1-zynqmp-fpga (1.2.0-1) ...
Setting up fclkcfg-4.19.0-xlnx-v2019.1-zynqmp-fpga (1.2.0-1) ...
```

#### udmabuf デバイスドライバ＆サービスのインストール

dpkg を使って udmabuf-4.19.0-xlnx-v2019.1-zynqmp-fpga_1.4.2-0_arm64.deb をインストールします。

```console
root@debian-fpga:~# cd /home/fpga/debian
root@debian-fpga:/home/fpga/debian# dpkg -i udmabuf-4.19.0-xlnx-v2019.1-zynqmp-fpga_1.4.2-0_arm64.deb
Selecting previously unselected package udmabuf-4.19.0-xlnx-v2019.1-zynqmp-fpga.
(Reading database ... 45308 files and directories currently installed.)
Preparing to unpack udmabuf-4.19.0-xlnx-v2019.1-zynqmp-fpga_1.4.2-0_arm64.deb ...
Unpacking udmabuf-4.19.0-xlnx-v2019.1-zynqmp-fpga (1.4.2-0) ...
Setting up udmabuf-4.19.0-xlnx-v2019.1-zynqmp-fpga (1.4.2-0) ...
```

参考
--------------------------------------------------

 * [https://github.com/ikwzm/ZynqMP-FPGA-Linux](https://github.com/ikwzm/ZynqMP-FPGA-Linux)
 * [「Ultra96 向け Debian GNU/Linux (v2018.2版) ブートイメージの提供」 @Qiita](https://qiita.com/ikwzm/items/975ab6997905700dd2e0)
 * [「UltraZed 向け Debian GNU/Linux (v2018.2版) ブートイメージの提供」 @Qiita](https://qiita.com/ikwzm/items/6e0506fc161d1da58e9c)