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

# はじめに


筆者は 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 編]
  * [Gnome Desktop 編]


# X Window System の構造


X Window System を動かすためのグラフィックスタックは一般的に Fig.1のようになります。


## グラフィックスタック



![Fig.1 X Window System Graphics Stack](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24981/78e97130-c63f-0186-78c3-3ed0c7817cd9.jpeg "Fig.1 X Window System Graphics Stack")

Fig.1 X Window System Graphics Stack

<br />

このグラフィックスタックをUltra96/Ultra96-V2(ZynqMP) に適応すると次のようになります。シェードがかかっているブロックが ZynqMP 独自の部分です。


![Fig.2 X Window System Graphics Stack for ZynqMP](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24981/2fedc715-a9a6-4f94-800b-c94b354d2631.jpeg "Fig.2 X Window System Graphics Stack for ZynqMP")

Fig.2 X Window System Graphics Stack for ZynqMP

<br />



ZynqMP 独自に用意しなければならないモジュールは次の４つです。

  * DRM Driver(ZynqMP Display Driver(xlns_drv))
  * Video Driver(xserver-xorg-video-armsoc-xilinx)
  * GPU(Mali) Kernel Module
  * OpenGL Driver(LibMali)



以降の節でこれらモジュールを簡単に紹介します。


## ZynqMP Display Driver(xlnx_drv)


ZynqMP の DisplayPort Controller を制御するためのカーネルモジュールです。このカーネルモジュールは User Space のプログラムに対して DRI(Direct Rendering Infrastructure) および  fbdev(Linux Framebuffer Device) Interfaceを提供します。このカーネルモジュールとそれに対応したデバイスツリーはすでにZynqMP-FPGA-Linux に標準で組み込まれています。そのため、別途ビルドやインストールは必要ありません。


![Fig.3 ZynqMP Display Driver(xlnx_drv)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24981/eb290348-1b71-a916-d4bd-76baf2e476f6.jpeg "Fig.3 ZynqMP Display Driver(xlnx_drv)")

Fig.3 ZynqMP Display Driver(xlnx_drv)

<br />


## Video Driver(xserver-xorg-video-armsoc-xilinx)


ZynqMP Display Driver に対応した X Window の DDX Driver(Video Driver) です。このドライバは Debian 10 が標準で提供するパッケージには含まれていません。別途追加する必要があります。このドライバの詳細は [Video Driver 編] で説明します。


![Fig.4 xserver-xorg-video-armsoc-xilinx](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24981/995f36c6-784e-651c-af76-8badffbef35a.jpeg "Fig.4 xserver-xorg-video-armsoc-xilinx")

Fig.4 xserver-xorg-video-armsoc-xilinx

<br />


## Mali Kernel Module


ZynqMP の GPU(Mali-400)を制御するためのカーネルモジュールです。このカーネルモジュールは ZynqMP-FPGA-Linuxには標準では組み込まれていません。ただし、デバイスツリーはすでに標準で組み込まれています。GPU を使って 3D レンダリングする場合はこのカーネルモジュールを新たにビルドして追加する必要があります。このカーネルモジュールを Debian Package にしてインストールする手順を [Mali Driver 編] で説明します。


![Fig.5 Mali Kernel Module](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24981/d029257a-2480-166a-5b2c-769555deaade.jpeg "Fig.5 Mali Kernel Module")

Fig.5 Mali Kernel Module

<br />


## LibMali(User Space Libraries for Mali)


GPU(Mali-400) で 3D レンダリングするためのユーザー空間で動作するライブラリです。OpenGL ES 2.0に対応しています。GPU を使って 3D レンダリングする場合はこのライブラリが必要です。このライブラリは ARM よりバイナリで提供されています。このバイナリのライブラリを Debian Package にしてインストールする手順を [LibMali 編] で説明します。


![Fig.6 LibMali(User Space Libraries for Mali)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24981/324bb862-737d-026b-2b3a-8df0c1eeb0c9.jpeg "Fig.6 LibMali(User Space Libraries for Mali)")

Fig.6 LibMali(User Space Libraries for Mali)

<br />




# Debian Packages



## ZynqMP-FPGA-Xserver


ZynqMP-FPGA-Linux で X Window System を構成するための Debian Package は以下の github で提供しています。

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

上のリポジトリで次の Debian Package を提供しています。

* xserver-xorg-video-armsoc-xilinx_1.4-1_arm64.deb
* 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.2-0_arm64.deb


## xf86-video-armsoc-xilinx


ZynqMP Display Driver に対応した X Window の DDX Driver(Video Driver) のDebian Package をビルドするためのリポジトリは以下にあります。

* https://github.com/ikwzm/xf86-video-armsoc-xilinx

このリポジトリから以下の Debian Package をビルドすることが出来ます(このリポジトリには Debian Package は含まれません)。

* xserver-xorg-video-armsoc-xilinx_1.4-1_arm64.deb


## LibMali(User Space Librarys for Mali)


GPU(Mali-400) で 3D レンダリングするためのユーザー空間で動作するライブラリを Debian Package にするリポジトリは以下にあります。

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

このリポジトリから以下の Debian Package をビルドすることが出来ます(このリポジトリには Debian Package は含まれません)。

* 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


## Mali Kernel Module


ZynqMP の GPU(Mali-400)を制御するためのカーネルモジュールを Debian Package にするリポジトリは以下にあります。

* https://github.com/ikwzm/zynqmp-gpu-kmod-dpkg

このリポジトリから以下の Debian Package をビルドすることが出来ます(このリポジトリには Debian Package は含まれません)。

* zynqmp-gpu-4.19.0-xlnx-v2019.1-zynqmp-fpga_0.1.2-0_arm64.deb


# インストール


ZynqMP に対応した X Window System には大きく分けて次の３種類あります。

  *  fbdev のみ
  *  Video Driver のみ
  *  Video Driver + GPU 


## fbdev のみ


X Window System には fbdev(Linux Framebuffer Device) を使って表示するためのドライバが標準でついています。この場合のインストール方法は以下の記事を参照してください。

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


## Video Driver のみ


ZynqMP Display Driver に対応した X Window の DDX Driver(Video Driver) を使って表示する方法です。ただし GPU によるレンダリングは含みません。この方法はインストールが比較的簡単なため、3D レンダリングを行わない場合はこちらのほうが良い場合があります。この場合のインストール方法は以下の記事を参照してください。

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


## Video Driver + GPU


ZynqMP Display Driver に対応した X Window の DDX Driver(Video Driver)と GPU(Mali-400) を使って表示する方法です。この方法はインストールが比較的複雑です。この場合のインストール方法は以下の記事を参照してください。

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


# ベンチマーク


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

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




# 参考


* [『UltraZed/Ultra96/Ultra96-V2 向け Debian GNU/Linux (v2019.1版) ブートイメージの提供』@Qiita][1]



[概要編]: 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"
[Gnome Desktop 編]: https://qiita.com/ikwzm/items/2e5e60d2a30b6a4769a7 "『Ultra96/Ultra96-V2 向け Debian GNU/Linux で X Window を動かす(Gnome Desktop 編)』@Qiita"
[1]: https://qiita.com/ikwzm/items/0c6f110aa19e368af03d "『UltraZed/Ultra96/Ultra96-V2 向け Debian GNU/Linux (v2019.1版) ブートイメージの提供』@Qiita"