Ultra96/Ultra96-V2 向け Ubuntu20.04で Lima を動かしてみた(インストール編)







# はじめに


[Lima] とは Mali-400/450 用のオープンソースなグラフィックドライバです。筆者は Lima を Ultra96/Ultra96-V2 向け Ubuntu 20.04 で試験的に動かしてみました。動かすのに少々苦労したので、その方法を何回かに分けて説明します。



  * [概要編]
  * [DRM Lima 編]
  * [DRI Lima 編]
  * [共有バッファ編]
  * [ストライド問題編]
  *  __インストール編(この記事)__  
  * [Ubuntu Desktop ビルド編]



以下の URL に Ultra96/Ultra96-V2 用に Boot Loader(U-Boot 等)、DRM Lima をイネーブルにして DRM Xlnx に修正を加えた Linux Kernel、DDX Xlnx と DRI Lima を Debian Package としてインストール済みの Ubuntu 20.04 Desktop Root File System を用意しています。この記事ではインストール方法を説明します。

* https://github.com/ikwzm/ZynqMP-FPGA-Ubuntu20.04-Lima-Ultra96



Boot Loader、Linux Kernel、Ubuntu 20.04 Desktop Root File System のビルドはとても面倒です。単に使ってみたいという方はどうぞ。



  __なお、現時点(2021年4月)では、Ubuntu 20.04 の gnome-shell が動作するところまで確認していますが、すべてのアプリケーションで動作を確認したわけでは無いことに注意してください。__  




# 概要


* Hardware
  * 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 Ultra96/Ultra96-V2)
  * PMU Firmware(Platform Management Unit Firmware)
  * BL31(ARM Trusted Firmware Boot Loader stage 3-1)
  * U-Boot xilinx-v2019.2 (customized)
* Linux Kernel Version v5.4.0
  * linux-xlnx tag=xilinx-v2020.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
  * Enable CIFS (Common Internet File System)
  * Enable Xilinx APF Accelerator driver
  * Enable Xilinx APF DMA engines support
  *  __Enable DRM Lima (Open-source reverse-engineered driver for Mali-4xx GPUs)__  
  *  __Fixed DRM Xlnx to support shared buffer with  DRM Lima__  
* Ubuntu20.04(focal) Desktop Root File System
  * Installed build-essential
  * Installed ubuntu-desktop
  * Installed lightdm
  * Installed ruby python python3
  *  __Installed DDX Xlnx for DRI3 and Lima__  
  *  __Installed DRI Lima for DDX Xlnx and DRM Xlnx__  


# インストール



## ダウンロード


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


```console
shell$ git clone --depth=1 --branch v2020.2-desktop-rc2 git://github.com/ikwzm/ZynqMP-FPGA-Ubuntu20.04-Lima-Ultra96
shell$ cd ZynqMP-FPGA-Ubuntu20.04-Lima-Ultra96
shell$ git lfs pull
```





## ファイルの説明


* target/Ultra96
  + boot/
     - boot.bin : Stage 1 Boot Loader
     - uEnv.txt : U-Boot environment variables for linux boot
     - image-5.4.0-xlnx-v2020.2-zynqmp-fpga-lima : Linux Kernel Image (use Git LFS)
     - devicetree-5.4.0-xlnx-v2020.2-zynqmp-fpga-lima-ultra96.dtb : Linux Device Tree Blob for Ultra96
     - devicetree-5.4.0-xlnx-v2020.2-zynqmp-fpga-lima-ultra96.dts : Linux Device Tree Source for Ultra96
* target/Ultra96-V2
  + boot/
     - boot.bin : Stage 1 Boot Loader
     - uEnv.txt : U-Boot environment variables for linux boot
     - image-5.4.0-xlnx-v2020.2-zynqmp-fpga-lima : Linux Kernel Image (use Git LFS)
     - devicetree-5.4.0-xlnx-v2020.2-zynqmp-fpga-lima-ultra96v2.dtb : Linux Device Tree Blob for Ultra96-V2
     - devicetree-5.4.0-xlnx-v2020.2-zynqmp-fpga-lima-ultra96v2.dts : Linux Device Tree Source for Ultra96-V2
* ubuntu20.04-desktop-rootfs.tgz : Ubuntu 20.04 Desktop Root File System (use Git LFS)
* linux-image-5.4.0-xlnx-v2020.2-zynqmp-fpga-lima_5.4.0-xlnx-v2020.2-zynqmp-fpga-lima-1_arm64.deb
* linux-headers-5.4.0-xlnx-v2020.2-zynqmp-fpga-lima_5.4.0-xlnx-v2020.2-zynqmp-fpga-lima-1_arm64.deb
* libgl1-mesa-xlnx-dri_20.2.6-0ubuntu0~20.04.1_arm64.deb : Debian Pacakge for DRI Lima
* xserver-xorg-video-armsoc-xilinx_1.5-alpha8_arm64.deb : Debian Package for DDX Xlnx




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


1. SD-Card のパーティション１を VFAT File System でファイルシステムを作ります。だいたい100MB〜300MBあれば充分です。
2. SD-Card のパーティション２を ext4 File System でファイルシステムを作ります。



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



* https://github.com/ikwzm/ZynqMP-FPGA-Ubuntu20.04-Lima-Ultra96/blob/main/doc/install/format-disk.md




## SD-Card への書き込み



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


ここではフォーマットした SD-Card のドライブが /dev/sdc だった場合の例を示します。


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



### 　1.1 Boot Partition のコピー(Ultra96 の場合)


SD-Card のパーティション1（この例では /mnt/usb1) にtarget/Ultra96/boot/ 下のファイルをコピーします。


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



### 　1.2 Boot Partition のコピー(Ultra96-V2 の場合)


SD-Card のパーティション1（この例では /mnt/usb1) にtarget/Ultra96-V2/boot/ 下のファイルをコピーします。


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



### 　2. RootFS Partition の生成


SD-Card のパーティション2(この例では /mnt/usb2) に ubuntu20.04-desktop-rootfs.tgz の中身を展開します。


```console
shell# tar xfz ubuntu20.04-desktop-rootfs.tgz -C /mnt/usb2
```



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



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



## Ultra96/Ultra96-V2のセットアップ


1. Ultra96/Ultra96-V2 の SD-Card スロットに SD-Card をセットします。
2. Ultra96/Ultra96-V2 の mini Display Port コネクタにモニターを接続します。
3. Ultra96/Ultra96-V2 の USB ポートにキーボードとマウスを接続します。




## Ubuntu 20.04 の開始


1. Ultra96/Ultra96-V2 の電源スイッチをオンにします。
2. 数秒後にディスプレイモニターに Ubuntu のログイン画面が出ます。
3. User Name に fpga、Password に fpga を入力してログインします。




# Lima の無効化


提供したシステムはあくまでも開発中のため、Lima を有効にしたことで動作しない場合が十分考えられます。この章では Lima を無効化する方法を説明します。


## DRI Lima の無効化


libGL は環境変数 LIBGL_ALWAYS_SOFTWARE に 1 を設定すると DRI Lima によるレンダリングを行わずにソフトウェアによるレンダリングを行います。


### 　アプリケーション毎の DRI Lima の無効化


ターミナルから起動するようなアプリケーションは、次の例のように環境変数 LIBGL_ALWAYS_SOFTWARE に 1 を設定して起動すると良いでしょう。


```console
shell$ LIBGL_ALWAYS_SOFTWARE=1 glmark2 
```



### 　Desktop の DRI Lima の無効化


Ubuntu 20.04 の Desktop は gnome-shell を使っています。Desktop 全体で DRI Lima を無効化するためには、gnome-shell の起動時に前述の 環境変数 LIBGL_ALWAYS_SOFTWARE に 1 を設定します。

gnome-shell は systemd の機構を使って起動しています。したがって、gnome-shell に環境変数を設定するためには systemd の設定ファイルを使います。具体的には、次のような /etc/systemd/user/gnome-shell-x11.service.d/override.conf を用意します。


```Shell:/etc/systemd/user/gnome-shell-x11.service.d/override.conf
[Service]
Environment="LIBGL_ALWAYS_SOFTWARE=1"
```



### 　DDX Xlnx の DRI3 対応の無効化


もしかしたら DDX Xlnx を DRI3 対応にしたことによる問題が発生するかもしれません。その場合は、DRI Lima を無効化するだけではダメで、DDX Xlnx の DRI3 対応を止めなければなりません。その場合は、/etc/X11/xorg.conf の Section "Device" の Option "DRI" を "2" に変更します。なお、DRI Lima は DRI3 でないとアプリケーションごと落ちてしまうので、DDX Xlnx を DRI2 にした場合は、前述のように DRI Lima を無効化するか、あるいは DRI Lima をアンインストールしておく必要があります。


```Shell:/etc/X11/xorg.conf
Section "Device"
        Identifier      "ZynqMP"
        Driver          "armsoc"
        Option          "DRI"				"2"
        Option          "NoFlip"			"false"
        Option          "Debug"			"false"
EndSection

```



### 　DRI Lima のアンインストール


libGL は対応する DRI ドライバが無ければ自動的にソフトウェアによるレンダリングを行います。いっそのこと DRI Lima をアンインストールしてしまう手もあります。


```console
shell# dpkg --remove libgl1-mesa-xlnx-dri
```





# 備考



## GUI と CUI の切り替え


提供したシステムは GUI (Ubuntu 20.04 Desktop) が起動します。CUI と GUI の切り替えは、ランレベルをブート時にカーネルにわたすパラメーターで指定することで行います。カーネルパラメーターは uEnv.txt で指定できます。


### 　CUI でのブート


uEnv.txt の linux_boot_args_systemd に "systemd.unit=multi-user.target" を指定します。


```Shell
linux_boot_args_systemd=systemd.unit=multi-user.target
```





### 　GUI でのブート


uEnv.txt の linux_boot_args_systemd に "systemd.unit=graphical.target" を指定します。


```Shell
linux_boot_args_systemd=systemd.unit=graphical.target
```





### 　デフォルトでのブート


デフォルトのランレベルは Ubuntu が起動してからも変更できます。デフォルトのランレベルでブートする場合は、uEnv.txt の linux_boot_args_systemd を空にします。


```Shell
linux_boot_args_systemd=systemd.unit=
```



## システムコンソールの切り替え


提供したシステムはデフォルトではディスプレイモニターとキーボードがシステムコンソールになっています。Ultra96/Ultra96-V2 には USB-Serial  があり、こちらをシステムコンソールにすることができます。

システムコンソールの切り替えはブート時にカーネルにわたすパラメーターで指定することで行います。カーネルパラメーターは uEnv.txt で指定できます。 


### 　シリアルポートへの切り替え


uEnv.txt の linux_boot_args_console に "console=ttyPS0,115200" を指定します。ttyPS0 は Ultra96/Ultra96-V2 の USB-Serial のデバイス名です。ボーレートなどを指定することができます(例では115200)。


```Shell
linux_boot_args_console=console=ttyPS0,115200
```





### 　ディスプレイ＋キーボードへの切り替え


uEnv.txt の linux_boot_args_console に "console=tty1" を指定します。


```Shell
linux_boot_args_console=console=tty1
```





# 参考


* https://github.com/ikwzm/ZynqMP-FPGA-Ubuntu20.04-Lima-Ultra96



[概要編]: https://qiita.com/ikwzm/items/642df8c14fd3a9e782b6 "『Ultra96/Ultra96-V2 向け Ubuntu20.04で Lima を動かしてみた(概要編)』@Qiita"
[DRM Lima 編]: https://qiita.com/ikwzm/items/91adfcf05e767d33be70 "『Ultra96/Ultra96-V2 向け Ubuntu20.04で Lima を動かしてみた(DRM Lima 編)』@Qiita"
[DRI Lima 編]: https://qiita.com/ikwzm/items/ec29ae456ead67438733 "『Ultra96/Ultra96-V2 向け Ubuntu20.04で Lima を動かしてみた(DRI Lima 編)』@Qiita"
[共有バッファ編]: https://qiita.com/ikwzm/items/ed2ce2d8bb90391d7c65 "『Ultra96/Ultra96-V2 向け Ubuntu20.04で Lima を動かしてみた(共有バッファ編)』@Qiita"
[ストライド問題編]: https://qiita.com/ikwzm/items/5c4c0114c15cfba8e95b "『Ultra96/Ultra96-V2 向け Ubuntu20.04で Lima を動かしてみた(ストライド問題編)』@Qiita"
[インストール編]: https://qiita.com/ikwzm/items/4dfb8f06ddf9d59e310c "『Ultra96/Ultra96-V2 向け Ubuntu20.04で Lima を動かしてみた(インストール編)』@Qiita"
[Ubuntu Desktop ビルド編]: https://qiita.com/ikwzm/items/21a59e68d30ad9faad6a "『Ultra96/Ultra96-V2 向け Ubuntu20.04で Lima を動かしてみた(Ubuntu Desktop ビルド編)』@Qiita"
[Lima]: https://gitlab.freedesktop.org/lima/web "Lima Website"
[DRI]: https://dri.freedesktop.org/wiki "Mesa 3D and Direct Rendering Infrastructure wiki"
[DRI(Direct Rendering Infrastructure)]: https://dri.freedesktop.org/wiki "Mesa 3D and Direct Rendering Infrastructure wiki"