Ultra96/Ultra96-V2 向け Debian GNU/Linux で X Window を動かす(LibMali編)







# はじめに


筆者は Ultra96/Ultra96-V2(ZynqMP) 向けに Debian GNU/Linux を提供しています[1]。提供している Debian GNU/Linux は CUI ベースですが、今回 GUI に対応するために X Window Systemを Ultra96/Ultra96-V2 で動くようにしました。

そこで Ultra96/Ultra96-V2 で X Window System を動かすための手順を幾つかのパートに分けて説明します。

  * [概要編]
  * [Video Driver 編]
  * [Mali Driver 編]
  * LibMali 編 (この記事)
  * [fbdev 編]
  * [glmark2 編]

この記事では、LibMaliの Debian Package をビルドする手順、および ZynqMP-FPGA-Linux に libMali を含んだ X Window System をインストールする手順を説明します。


# LibMali (User Space Libraries for Mali) とは


libMali とはGPU(Mali-400) で 3D レンダリングするためのユーザー空間で動作するライブラリです。OpenGL ES 2.0に対応しています。GPU を使って 3D レンダリングする場合はこのライブラリが必要です。このライブラリは ARM よりバイナリで提供されています。


![Fig.1 LibMali(User Space Libraries for Mali)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24981/5ade2660-58a9-5815-0834-18c078045c75.jpeg "Fig.1 LibMali(User Space Libraries for Mali)")

Fig.1 LibMali(User Space Libraries for Mali)

<br />


# Debian Package のビルド手順


この章では、libMali の Debian Package を作るための手順を説明します。

なお、ここで説明する手順で生成したリポジトリは以下の URL に用意しています。リポジトリを作るのが面倒な人は以下のリポジトリを使ってください。

* https://github.com/ikwzm/libmali-zynqmp



なお、libMali は Xilinx 社がバイナリーで提供しているライブラリです。ソースコードによる提供ではありません。この記事では、バイナリーで提供されているライブラリを Debian Package にする手順を説明するものです。Debian Package にするのは、パッケージ化することで Debian にインストールしやすくするためです。

また、ビルド済みの libMaliの Debian Package を以下のリポジトリに用意しています。ビルドが面倒な人はこちらをお使いください。

* https://github.com/ikwzm/ZynqMP-FPGA-Xserver

  * libegl1-zynqmp-dev_1.7-0_arm64.deb
  * libegl1-zynqmp_1.7-0_arm64.deb
  * libgbm-zynqmp-dev_1.7-0_arm64.deb
  * libgbm1-zynqmp_1.7-0_arm64.deb
  * libgles1-zynqmp-dev_1.7-0_arm64.deb
  * libgles1-zynqmp_1.7-0_arm64.deb
  * libgles2-zynqmp-dev_1.7-0_arm64.deb
  * libgles2-zynqmp_1.7-0_arm64.deb
  * libmali-zynqmp-dev_1.7-0_arm64.deb
  * libmali-zynqmp_1.7-0_arm64.deb


## リポジトリを作る



```Shell
shell$ mkdir libmali-zynqmp
shell$ cd libmali-zynqmp 
shell$ git init

```



## バイナリーライブラリを得る


バイナリーライブラリーは、Xilinx 社が提供しているライブラリを使います。次の Web ページを参照してソフトウェアライセンスに同意した上で mali-400-userspace.tar をダウンロードしてください。

* https://www.xilinx.com/products/design-tools/embedded-software/petalinux-sdk.html#licensing

また、以下の方法でダウンロードすることも出来ます。ただしソフトウェアライセンスに同意してください。


```Shell
shell$ wget https://www.xilinx.com/publications/products/tools/mali-400-userspace.tar
--2019-12-08 21:39:58--  https://www.xilinx.com/publications/products/tools/mali-400-userspace.tar
-UUU:----F1  Readme.md<libmali-zynqmp>   49% L37   Git-master  (Fundamental) ---
HTTP request sent, awaiting response... 200 OK
Length: 572887040 (546M) [application/x-tar]
Saving to: ‘mali-400-userspace.tar’
mali-400-userspace. 100%[==================>] 546.35M  1.27MB/s    in 9m 2s
2019-12-24 16:54:47 (1.01 MB/s) - ‘mali-400-userspace.tar’ saved [572887040/572887040]

```




mali-400-userspace.tar からmali/rel-v2019.1/r8p0-01rel0 を取り出します。


```Shell
shell$ tar xf mali-400-userspace.tar mali/rel-v2019.1/r8p0-01rel0.tar
shell$ tar xf mali/rel-v2019.1/r8p0-01rel0.tar

```



## Debian Package を作るためのファイルを追加する


debian ディレクトリを作って、以下のファイルを追加します。ここではこれらのファイルの説明はしません。詳細はhttps://github.com/ikwzm/libmali-zynqmp を参照してください。

* debian/

  * README.Debian
  * README.source
  * changelog
  * compat
  * control
  * copyright
  * libegl1-zynqmp-dev.install
  * libegl1-zynqmp-dev.links
  * libegl1-zynqmp.install
  * libegl1-zynqmp.links
  * libgbm-zynqmp-dev.dirs
  * libgbm-zynqmp-dev.install
  * libgbm-zynqmp-dev.links
  * libgbm1-zynqmp.install
  * libgbm1-zynqmp.links
  * libgles1-zynqmp-dev.install
  * libgles1-zynqmp.install
  * libgles1-zynqmp.links
  * libgles2-zynqmp-dev.install
  * libgles2-zynqmp-dev.links
  * libgles2-zynqmp.install
  * libgles2-zynqmp.links
  * libmali-zynqmp-dev.dirs
  * libmali-zynqmp-dev.install
  * libmali-zynqmp-dev.links
  * libmali-zynqmp.install
  * libmali-zynqmp.links
  * rules




## pkgconfig 用のファイルを追加する


libMali の開発用の Debian Package (libgbm-zynqmp-dev_1.6-3_arm64.debおよび libmali-zynqmp-dev_1.6-3_arm64.deb) には pkgconfig のためのファイルも含まれます。インストールするpkgconfig 用のファイルを追加します。ここではこれらのファイルの説明はしません。詳細はhttps://github.com/ikwzm/libmali-zynqmp を参照してください。

* pkgconfig/

  * OpenCL.pc.cmake
  * egl.pc.cmake
  * gbm.pc.cmake
  * glesv2.pc.cmake
  * mali.pc.cmake
  * wayland-egl.pc.cmake


## CMakeLists.txt を追加する


Debian Package をビルドする際 cmake を使います。そのための CMakeLists.txt を追加します。


## Debian Package をビルドする


前節までで説明した手順で作ったリポジトリを以下のURL に用意しています。リポジトリをつくるのが面倒な人はこのリポジトリをクローンしてください。

https://github.com/ikwzm/libmali-zynqmp



debian/rule binary を実行して Debian Package をビルドします。ビルドしたパッケージは一つ上のディレクトリに作られます。


```console
shell$ sudo debian/rule binary
	:
	後略
```


* ../

  * libegl1-zynqmp-dev_1.7-0_arm64.deb
  * libegl1-zynqmp_1.7-0_arm64.deb
  * libgbm-zynqmp-dev_1.7-0_arm64.deb
  * libgbm1-zynqmp_1.7-0_arm64.deb
  * libgles1-zynqmp-dev_1.7-0_arm64.deb
  * libgles1-zynqmp_1.7-0_arm64.deb
  * libgles2-zynqmp-dev_1.7-0_arm64.deb
  * libgles2-zynqmp_1.7-0_arm64.deb
  * libmali-zynqmp-dev_1.7-0_arm64.deb
  * libmali-zynqmp_1.7-0_arm64.deb


# インストール



## Debian Packageの紹介


この章では libMali を含んだ X Window System  を ZynqMP-FPGA-Linux にインストールする手順を説明します。

なお、ビルド済みのDebian Package を以下のリポジトリに用意しています。こちらをインストールしてもかまいません。

* https://github.com/ikwzm/ZynqMP-FPGA-Xserver

  * libegl1-zynqmp-dev_1.7-0_arm64.deb
  * libegl1-zynqmp_1.7-0_arm64.deb
  * libgbm-zynqmp-dev_1.7-0_arm64.deb
  * libgbm1-zynqmp_1.7-0_arm64.deb
  * libgles1-zynqmp-dev_1.7-0_arm64.deb
  * libgles1-zynqmp_1.7-0_arm64.deb
  * libgles2-zynqmp-dev_1.7-0_arm64.deb
  * libgles2-zynqmp_1.7-0_arm64.deb
  * libmali-zynqmp-dev_1.7-0_arm64.deb
  * libmali-zynqmp_1.7-0_arm64.deb
  * zynqmp-gpu-4.19.0-xlnx-v2019.1-zynqmp-fpga_0.1.1-0_arm64.deb
  * xserver-xorg-video-armsoc-xilinx_1.4-1_arm64.deb


## 注意点


libMali の Debian Package をインストールする際、インストールする順番が重要です。というのもlibMali の Debian Package は、 X Window System が標準でインストールされる Debian Package の内容を一部上書きするからです。筆者が Debian Package にあまり詳しくないため、どうしても一発でインストールできるような Debian Package を作ることができませんでした。ご了承ください。


## インストールの手順


具体的には次の手順でインストールします。



1. Mali Driver のインストール
2. X Window System のインストール
3. libMali のインストール
4. Video Driver(xserver-xorg-video-armsoc-xilinx) のインストール
5. xorg.conf の編集
6. 開発用パッケージのインストール(必要ならば)



なお、すでに X Window System がインストールされている場合は、後述の手順で一度 X Window System をアンインストールしておかなければなりません。


### 1. Mali Driver のインストール


Mali Driver とは ZynqMP に搭載されている GPU(Mali-400) を制御するための Kernel Module です。Mali Driver のインストールに関しては次の記事を参照してください。

* [『Ultra96/Ultra96-V2 向け Debian GNU/Linux で X Window を動かす(Mali Driver編)』 @Qiita][Mali Driver 編]




### 2. X Window System のインストール


X Window System をインストールします。


```console
shell$  apt install x-window-system-core
	:
	後略
```





### 3. libMaliのインストール


X Window System をインストール  __した後に__  libMali をインストールします。libMaliの Debian Package を以下の順番でインストールします。


```console
shell$ sudo dpkg -i libmali-zynqmp_1.7-0_arm64.deb 
Selecting previously unselected package libmali-zynqmp:arm64.
(Reading database ... 85064 files and directories currently installed.)
Preparing to unpack libmali-zynqmp_1.7-0_arm64.deb ...
Unpacking libmali-zynqmp:arm64 (1.7-0) ...
Setting up libmali-zynqmp:arm64 (1.7-0) ...
Processing triggers for libc-bin (2.28-10) ...
```





```console
shell$ sudo dpkg -i libegl1-zynqmp_1.7-0_arm64.deb 
Selecting previously unselected package libegl1-zynqmp:arm64.
(Reading database ... 85072 files and directories currently installed.)
Preparing to unpack libegl1-zynqmp_1.7-0_arm64.deb ...
Unpacking libegl1-zynqmp:arm64 (1.7-0) ...
Replacing files in old package libegl1:arm64 (1.1.0-1) ...
Setting up libegl1-zynqmp:arm64 (1.7-0) ...
```



```console
shell$ sudo dpkg -i libgles1-zynqmp_1.7-0_arm64.deb 
Selecting previously unselected package libgles1-zynqmp:arm64.
(Reading database ... 85076 files and directories currently installed.)
Preparing to unpack libgles1-zynqmp_1.7-0_arm64.deb ...
Unpacking libgles1-zynqmp:arm64 (1.7-0) ...
Setting up libgles1-zynqmp:arm64 (1.7-0) ...
```





```console
shell$ sudo dpkg -i libgles2-zynqmp_1.7-0_arm64.deb
Selecting previously unselected package libgles2-zynqmp:arm64.
(Reading database ... 85081 files and directories currently installed.)
Preparing to unpack libgles2-zynqmp_1.7-0_arm64.deb ...
Unpacking libgles2-zynqmp:arm64 (1.7-0) ...
Setting up libgles2-zynqmp:arm64 (1.7-0) ...
```





```console
shell$ sudo dpkg -i libgbm1-zynqmp_1.7-0_arm64.deb
Selecting previously unselected package libgbm1-zynqmp:arm64.
(Reading database ... 85086 files and directories currently installed.)
Preparing to unpack libgbm1-zynqmp_1.7-0_arm64.deb ...
Unpacking libgbm1-zynqmp:arm64 (1.7-0) ...
Replacing files in old package libgbm1:arm64 (18.3.6-2) ...
Setting up libgbm1-zynqmp:arm64 (1.7-0) ...
```



### 4. Video Driver(xserver-xorg-video-armsoc-xilinx) のインストール


Video Driver(xserver-xorg-video-armsoc-xilinx) とは ZynqMP に対応したX Window Serverの DDX Driver(Video Driver) のことです。詳細は以下の記事を参照してください。

* [『Ultra96/Ultra96-V2 向け Debian GNU/Linux で X Window を動かす(Video Driver編)』 @Qiita](https://qiita.com/ikwzm/items/2a0fbfd2938a893e57d4)

dpkg を使って xserver-xorg-video-armsoc-xilinx_1.4-1_arm64.deb   
をインストールします。


```console
shell$ sudo dpkg -i xserver-xorg-video-armsoc-xilinx_1.4-1_arm64.deb
(Reading database ... 66644 files and directories currently installed.)
Preparing to unpack xserver-xorg-video-armsoc-xilinx_1.4-1_arm64.deb ...
Unpacking xserver-xorg-video-armsoc-xilinx (1.4-1) over (1.4-1) ...
Setting up xserver-xorg-video-armsoc-xilinx (1.4-1) ...
Processing triggers for man-db (2.8.5-2) ...
```



### 5. xorg.conf の編集


/etc/X11/xorg.conf の Device セクションの Driver プロパティに armsocを指定する必要があります。 


```conf:/etc/X11/xorg.conf
Section "Device"
	Identifier	"ZynqMP"
	Driver		"armsoc"
	Option		"DEBUG"	"true"
EndSection
Section "Screen"
	Identifier	"DefaultScreen"
	Device		"ZynqMP"
EndSection
```





### 6. 開発用パッケージのインストール(必要ならば)


もし必要ならば、開発用の Debian Package をインストールします。


```console
shell$ sudo dpkg -i libmali-zynqmp-dev_1.7-0_arm64.deb 
Selecting previously unselected package libmali-zynqmp-dev:arm64.
(Reading database ... 85097 files and directories currently installed.)
Preparing to unpack libmali-zynqmp-dev_1.7-0_arm64.deb ...
Unpacking libmali-zynqmp-dev:arm64 (1.7-0) ...
Setting up libmali-zynqmp-dev:arm64 (1.7-0) ...
```





```console
shell$ sudo dpkg -i libegl1-zynqmp-dev_1.7-0_arm64.deb 
Selecting previously unselected package libegl1-zynqmp-dev:arm64.
(Reading database ... 85101 files and directories currently installed.)
Preparing to unpack libegl1-zynqmp-dev_1.7-0_arm64.deb ...
Unpacking libegl1-zynqmp-dev:arm64 (1.7-0) ...
Setting up libegl1-zynqmp-dev:arm64 (1.7-0) ...
```





```console
shell$ sudo dpkg -i libegl1-zynqmp-dev_1.7-0_arm64.deb 
(Reading database ... 85110 files and directories currently installed.)
Preparing to unpack libegl1-zynqmp-dev_1.7-0_arm64.deb ...
Unpacking libegl1-zynqmp-dev:arm64 (1.7-0) over (1.7-0) ...
Setting up libegl1-zynqmp-dev:arm64 (1.7-0) ...
```





```console
shell$ sudo dpkg -i libgles2-zynqmp-dev_1.7-0_arm64.deb 
Selecting previously unselected package libgles2-zynqmp-dev:arm64.
(Reading database ... 85110 files and directories currently installed.)
Preparing to unpack libgles2-zynqmp-dev_1.7-0_arm64.deb ...
Unpacking libgles2-zynqmp-dev:arm64 (1.7-0) ...
Setting up libgles2-zynqmp-dev:arm64 (1.7-0) ...
```





```console
shell$ sudo dpkg -i libgbm-zynqmp-dev_1.7-0_arm64.deb 
Selecting previously unselected package libgbm-zynqmp-dev:arm64.
(Reading database ... 85119 files and directories currently installed.)
Preparing to unpack libgbm-zynqmp-dev_1.7-0_arm64.deb ...
Unpacking libgbm-zynqmp-dev:arm64 (1.7-0) ...
Setting up libgbm-zynqmp-dev:arm64 (1.7-0) ...
```



## アンインストール


筆者の勉強不足のせいで Debian Package の依存関係が乱れています。そのためパッケージの更新やアンインストールの際、失敗することがあるかもしれません。そうなった場合は X Window System を一度アンインストールした方がうまくいきます。ここでは、X Window System をアンインストールする手順を示します。


### 1. xserver-xorg-core をpurge


まずは xserver-xorg-core を purge します。


```console
shell$ sudo apt purge xserver-xorg-core
	:
	後略
```



### 2. autopurge する


xserver-xorg-core に依存していたパッケージを autopurge を使って取り除きます。


```console
shell$ sudo apt autopurge
	:
	後略
```



### 3. libMali をアンインストールする


libmali-zynqmp および libgbm1-zynqmp をアンインストールします。


```console
shell$ sudo dpkg --purge libgbm1-zynqmp
(Reading database ... 55745 files and directories currently installed.)
Removing libgbm1-zynqmp:arm64 (1.6-3) ...
```





```console
shell$ sudo dpkg --purge libmali-zynqmp
(Reading database ... 55741 files and directories currently installed.)
Removing libmali-zynqmp:arm64 (1.6-3) ...
Purging configuration files for libmali-zynqmp:arm64 (1.6-3) ...
Processing triggers for libc-bin (2.28-10) ...
```







# 起動


root でログインしてstartx で起動してみます。


```console
shell# startx &
	:
	後略
```


ディスプレイに X Windows が映れば成功です。




# ベンチマーク


Video Driver + GPU でベンチマークを走らせてみました。詳細は以下のページを参照してください。

* [『Ultra96/Ultra96-V2 向け Debian GNU/Linux で X Window を動かす(glmark2 編)』 @Qiita][glmark2 編]


[概要編]: https://qiita.com/ikwzm/items/fdec04519268b3fb9a50 "『Ultra96/Ultra96-V2 向け Debian GNU/Linux で X Window を動かす(概要編)』@Qiita"
[Video Driver 編]: https://qiita.com/ikwzm/items/2a0fbfd2938a893e57d4 "『Ultra96/Ultra96-V2 向け Debian GNU/Linux で X Window を動かす(Video Driver 編)』@Qiita"
[Mali Driver 編]: https://qiita.com/ikwzm/items/8c96d75e03cdcb91e5b2 "『Ultra96/Ultra96-V2 向け Debian GNU/Linux で X Window を動かす(Mali Driver 編)』@Qiita"
[LibMali 編]: https://qiita.com/ikwzm/items/85fa889def8eb07a9e94 "『Ultra96/Ultra96-V2 向け Debian GNU/Linux で X Window を動かす(libMali 編)』@Qiita"
[fbdev 編]: https://qiita.com/ikwzm/items/f922f7e17aa2382d5c76 "『Ultra96/Ultra96-V2 向け Debian GNU/Linux で X Window を動かす(fbdev 編)』@Qiita"
[glmark2 編]: https://qiita.com/ikwzm/items/5065fb0b6c01ea706571 "『Ultra96/Ultra96-V2 向け Debian GNU/Linux で X Window を動かす(glmark2 編)』@Qiita"
[1]: https://qiita.com/ikwzm/items/0c6f110aa19e368af03d "『UltraZed/Ultra96/Ultra96-V2 向け Debian GNU/Linux (v2019.1版) ブートイメージの提供』@Qiita"