UltraZed 向け Debian GNU/Linux (v2017.3版) ブートイメージの提供

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

UltraZed-EG スターターキットに Debian GNU/Linux (v2017.3版) を構築する方法について、次の記事で説明しました。

 * [Introduction](https://qiita.com/ikwzm/items/a4ebcffdd26ab3e8124d)
 * [Boot Loader](https://qiita.com/ikwzm/items/9d2a76f9665759df58e7)
   - [Sample FPGA Design](https://qiita.com/ikwzm/items/61316ecec2fc68be4c96)
   - [FSBL   (First Stage Boot Loader)](https://qiita.com/ikwzm/items/6c345b0ef7fc397d37bf)
   - [PMUFW  (Platform Manager Unit Firmware)](https://qiita.com/ikwzm/items/9835f591a78e83d6b92b)
   - [BL31   (ARM Trusted Firmware Boot Loader state 3-1)](https://qiita.com/ikwzm/items/6d03b7e5b47721df3ae9)
   - [U-Boot](https://qiita.com/ikwzm/items/27e6ab1517d724b7f2eb)
   - [BOOT.BIN](https://qiita.com/ikwzm/items/45520c8722edbfcd3575)
 * [Linux Kernel](https://qiita.com/ikwzm/items/367f49e9b02102e907d8)
 * [Debian9 Root File System](https://qiita.com/ikwzm/items/a0e88798ed29b30fa003)

上の記事はビルド方法の説明だけでしたが、実際に動作する環境もあった方が良いかと思い、以下の URL にビルド済みの Boot Loader、Linux Kernel、Debian9-rootfs、デバイスドライバ(fclkcfg)のパッケージを用意しました。

 * [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.
* 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 v2017.01 (customized)
* Linux Kernel Version v4.9.0
  + [linux-xlnx](https://github.com/Xilinx/linux-xlnx) tag=xilinx-v2017.3
  + Enable Device Tree Overlay with Configuration File System
  + Enable FPGA Manager
  + Enable FPGA Bridge
  + Enable FPGA Reagion
* Debian9(stretch) 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
* FPGA Device Drivers and Services
  + [fclkcfg    (FPGA Clock Configuration Device Driver)](https://github.com/ikwzm/fclkcfg)

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

### ダウンロード

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

```console
shell$ git clone --depth=1 -b v2017.3.0 git://github.com/ikwzm/ZynqMP-FPGA-Linux
shell$ cd ZynqMP-FPGA-Linux
shell$ git lfs pull
```

### ファイルの説明

 * tareget/UltraZed-EG-IOCC/
   + boot/
     - boot.bin                                                    : Stage 1 Boot Loader
     - uEnv.txt                                                    : U-Boot environment variables for linux boot
     - image-4.9.0-xlnx-v2017.3-fpga                               : Linux Kernel Image       (use Git LFS)
     - devicetree-4.9.0-xlnx-v2017.3-fpga-zynqmp-uz3eg-iocc.dtb    : Linux Device Tree Blob   
     - devicetree-4.9.0-xlnx-v2017.3-fpga-zynqmp-uz3eg-iocc.dts    : Linux Device Tree Source
 * debian9-rootfs-vanilla.tgz                                      : Debian9 Root File System (use Git LFS)
 * linux-image-4.9.0-xlnx-v2017.3-zynqmp-fpga_4.9.0-xlnx-v2017.3-zynqmp-fpga-2_arm64.deb   : Linux Image Package      (use Git LFS)
 * linux-headers-4.9.0-xlnx-v2017.3-zynqmp-fpga_4.9.0-xlnx-v2017.3-zynqmp-fpga-2_arm64.deb : Linux Headers Package    (use Git LFS)
 * fclkcfg-4.9.0-xlnx-v2017.3-zynqmp-fpga_1.0.0-1_arm64.deb        : fclkcfg Device Driver and Services Package
 * udmabuf-4.9.0-xlnx-v2017.3-zynqmp-fpga_1.1.0-1_arm64.deb        : udmabuf Device Driver and Services Package

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

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

フォーマット方法の詳細は省略します。

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

 1. SD-Card のパーティション１(下の例では/dev/sdc1)に target/UltraZed-EG-IOCC/boot/ 下のファイルをコピーします。
 2. SD-Card のパーティション２(下の例では/dev/sdc2)に debian9-rootfs-vanilla.tgz の中身を展開します。

展開したルートファイルシステムの home/fpga にデバイスドライバの Debian パッケージをあらかじめコピーしておくと良いでしょう。後から network 経由でコピーしてもかまいません。

```console
shell# mount /dev/sdc1 /mnt/usb1
shell# mount /dev/sdc2 /mnt/usb2
shell# cp target/UltraZed-EG-IOCC/boot/*                           /mnt/usb1
shell# tar xfz debian9-rootfs-vanilla.tgz -C                       /mnt/usb2
shell# mkdir                                                       /mnt/usb2/home/fpga/debian
shell# cp linux-image-4.9.0-xlnx-v2017.3-zynqmp-fpga_4.9.0-xlnx-v2017.3-zynqmp-fpga-1_arm64.deb   /mnt/usb2/home/fpga/debian
shell# cp linux-headers-4.9.0-xlnx-v2017.3-zynqmp-fpga_4.9.0-xlnx-v2017.3-zynqmp-fpga-1_arm64.deb /mnt/usb2/home/fpga/debian
shell# cp fclkcfg-4.9.0-xlnx-v2017.3-zynqmp-fpga_0.0.1-1_arm64.deb /mnt/usb2/home/fpga/debian
shell# cp udmabuf-4.9.0-xlnx-v2017.3-zynqmp-fpga_0.0.2-1_arm64.deb /mnt/usb2/home/fpga/debian
shell# umount mnt/usb1
shell# umount mnt/usb2
```

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

####  UltraZed-EG-IOCC をブートして root でログイン

root'password is "admin".

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

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

dpkg を使って linux-image-4.9.0-xlnx-v2017.3-zynqmp-fpga_4.9.0-xlnx-v2017.3-zynqmp-fpga-2_arm64.deb をインストールします。

```console
root@debian-fpga:~# cd /home/fpga/debian
root@debian-fpga:~# dpkg -i linux-image-4.9.0-xlnx-v2017.3-zynqmp-fpga_4.9.0-xlnx-v2017.3-zynqmp-fpga-2_arm64.deb
Selecting previously unselected package linux-image-4.9.0-xlnx-v2017.3-zynqmp-fpga.
(Reading database ... 24759 files and directories currently installed.)
Preparing to unpack linux-image-4.9.0-xlnx-v2017.3-zynqmp-fpga_4.9.0-xlnx-v2017.3-zynqmp-fpga-2_arm64.deb ...
Unpacking linux-image-4.9.0-xlnx-v2017.3-zynqmp-fpga (4.9.0-xlnx-v2017.3-zynqmp-fpga-2) ...
Setting up linux-image-4.9.0-xlnx-v2017.3-zynqmp-fpga (4.9.0-xlnx-v2017.3-zynqmp-fpga-2) ...
```

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

dpkg を使って linux-headers-4.9.0-xlnx-v2017.3-zynqmp-fpga_4.9.0-xlnx-v2017.3-zynqmp-fpga-2_arm64.deb をインストールします。

```console
root@debian-fpga:~# cd /home/fpga/debian
root@debian-fpga:~# dpkg -i linux-headers-4.9.0-xlnx-v2017.3-zynqmp-fpga_4.9.0-xlnx-v2017.3-zynqmp-fpga-2_arm64.deb
Selecting previously unselected package linux-headers-4.9.0-xlnx-v2017.3-zynqmp-fpga.
(Reading database ... 24872 files and directories currently installed.)
Preparing to unpack linux-headers-4.9.0-xlnx-v2017.3-zynqmp-fpga_4.9.0-xlnx-v2017.3-zynqmp-fpga-2_arm64.deb ...
Unpacking linux-headers-4.9.0-xlnx-v2017.3-zynqmp-fpga (4.9.0-xlnx-v2017.3-zynqmp-fpga-2) ...
Setting up linux-headers-4.9.0-xlnx-v2017.3-zynqmp-fpga (4.9.0-xlnx-v2017.3-zynqmp-fpga-2) ...
make: Entering directory '/usr/src/linux-headers-4.9.0-xlnx-v2017.3-zynqmp-fpga'
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/basic/bin2c
  HOSTCC  scripts/kconfig/conf.o
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
scripts/kconfig/conf  --silentoldconfig 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
  GEN     scripts/mod/devicetable-offsets.h
  HOSTCC  scripts/mod/file2alias.o
  HOSTCC  scripts/mod/sumversion.o
  HOSTLD  scripts/mod/modpost
  HOSTCC  scripts/kallsyms
  HOSTCC  scripts/conmakehash
  HOSTCC  scripts/sortextable
make: Leaving directory '/usr/src/linux-headers-4.9.0-xlnx-v2017.3-zynqmp-fpga'
```

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

dpkg を使って fclkcfg-4.9.0-xlnx-v2017.3-zynqmp-fpga_1.0.0-1_arm64.deb をインストールします。

```console
root@debian-fpga:~# cd /home/fpga/debian
root@debian-fpga:~# dpkg -i fclkcfg-4.9.0-xlnx-v2017.3-zynqmp-fpga_1.0.0-1_arm64.deb
Selecting previously unselected package fclkcfg-4.9.0-xlnx-v2017.3-zynqmp-fpga.
(Reading database ... 43515 files and directories currently installed.)
Preparing to unpack fclkcfg-4.9.0-xlnx-v2017.3-zynqmp-fpga_1.0.0-1_arm64.deb ...
Unpacking fclkcfg-4.9.0-xlnx-v2017.3-zynqmp-fpga (1.0.0-1) ...
Setting up fclkcfg-4.9.0-xlnx-v2017.3-zynqmp-fpga (1.0.0-1) ...
Created symlink /etc/systemd/system/multi-user.target.wants/fpga-clock.service  → /etc/systemd/system/fpga-clock.service.
```

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

dpkg を使って udmabuf-4.9.0-xlnx-v2017.3-zynqmp-fpga_1.1.0-1_arm64.deb をインストールします。

```console
root@debian-fpga:~# cd /home/fpga/debian
root@debian-fpga:~# dpkg -i udmabuf-4.9.0-xlnx-v2017.3-zynqmp-fpga_0.0.2-1_arm64.deb
Selecting previously unselected package udmabuf-4.9.0-xlnx-v2017.3-zynqmp-fpga.
(Reading database ... 43522 files and directories currently installed.)
Preparing to unpack udmabuf-4.9.0-xlnx-v2017.3-zynqmp-fpga_1.1.0-1_arm64.deb ...
Unpacking udmabuf-4.9.0-xlnx-v2017.3-zynqmp-fpga (1.1.0-1) ...
Setting up udmabuf-4.9.0-xlnx-v2017.3-zynqmp-fpga (1.1.0-1) ...
Created symlink /etc/systemd/system/multi-user.target.wants/udmabuf.service → /etc/systemd/system/udmabuf.service.
```

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

 * [https://github.com/ikwzm/ZynqMP-FPGA-Linux](https://github.com/ikwzm/ZynqMP-FPGA-Linux)
 * [「UltraZed 向け Debian GNU/Linux (v2017.3版) の構築(イントロ編)」@Qiita](https://qiita.com/ikwzm/items/a4ebcffdd26ab3e8124d)