Ultra96/Ultra96-V2/KV260/KR260 向け Ubuntu 22.04(Desktop版) ブートイメージの提供


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

### この記事の目的

かつて筆者は 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 のビルドが面倒くさいという方はどうぞ。

 * https://github.com/ikwzm/ZynqMP-FPGA-Ubuntu22.04-Desktop

### 注意事項

この記事で紹介しているリポジトリで提供されている 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
    + https://github.com/ikwzm/ZynqMP-FPGA-Linux-Kernel-6.1/tree/6.1.70-zynqmp-fpga-trial-2
  * 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
    + https://github.com/ikwzm/ZynqMP-FPGA-Ubuntu22.04-Desktop/blob/v3.0.0/files/ubuntu22.04-desktop-dpkg-list.txt

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

### ダウンロード

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 のフォーマット

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

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

 * https://github.com/ikwzm/ZynqMP-FPGA-Ubuntu22.04-Desktop/blob/main/doc/install/format-disk.md


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

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

SD-Card のパーティション１(ブートパーティション)とパーティション２(ルートパーティション)を読み書き出来るようにマウントします。
この例では、ブートパーティションを /mnt/usb1 に、ルートパーティションを /mnt/usb2 にそれぞれマウントしています。

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

#### 1. ブートパーティションの作成

##### KV260 の場合

SD-Card のブートパーティション(例では/mnt/usb1)に target/Kv260/boot/ 下のファイルと Linux Kernel Image をコピーします。

```console
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 をコピーします。

```console
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 をコピーします。

```console
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 をコピーします。

```console
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 経由でコピーしてもかまいません。


```console
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``` です。

```console
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``` です。

```console
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``` です。

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

```console
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 のアンマウント

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

起動方法
--------------------------------------------------

  1. インストールした SD-Card を Ultra96/Ultra96-V2/Kv260/Kr260 のスロットにセット
  2. Ultra96/Ultra96-V2/Kv260/Kr260 の display port にモニターを接続
  3. Ultra96/Ultra96-V2/Kv260/Kr260 の USB port に USB mouse と USB keyboard 接続
  4. Ultra96/Ultra96-V2/KV260/KR260 の電源を入れる
  5. 数秒後にディスプレイモニターに Ubuntu のログイン画面が表示されます
  6. ユーザーが fpga ならばパスワードに fpga を入力してください
  7. ユーザーが 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



[概要編]: https://qiita.com/ikwzm/items/e8fa7540efdf580e902f "『ZynqMP 向け Ubuntu22.04で Lima を動かしてみた(概要編)』@Qiita"
[DRM Lima 編]: https://qiita.com/ikwzm/items/465bcb51ab5a6ed8dbfb "『ZynqMP 向け Ubuntu22.04で Lima を動かしてみた(DRM Lima 編)』@Qiita"
[DRI Lima 編]: https://qiita.com/ikwzm/items/a5681608932a97bf2037 "『ZynqMP 向け Ubuntu22.04で Lima を動かしてみた(DRI Lima 編)』@Qiita"
[共有バッファ編]: https://qiita.com/ikwzm/items/aaa7c7a321cfc29518df "『ZynqMP 向け Ubuntu22.04で Lima を動かしてみた(共有バッファ編)』@Qiita"
[ストライド問題編]: https://qiita.com/ikwzm/items/0c49289e4e4db7a673ac "『ZynqMP 向け Ubuntu22.04で Lima を動かしてみた(ストライド問題編)』@Qiita"
[GEM キャッシュ編]: https://qiita.com/ikwzm/items/23165500ca2a0363de6e "『ZynqMP 向け Ubuntu22.04で Lima を動かしてみた(GEM キャッシュ編)』@Qiita"
[glmark2編]: https://qiita.com/ikwzm/items/5e8694aafb811f24a549 "『ZynqMP 向け Ubuntu22.04で Lima を動かしてみた(glmark2編)』@Qiita"