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







# はじめに


筆者は 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 編]

この記事では、Video Driver(xserver-xorg-video-armsoc-xilinx) の Debian Package をビルドして ZynqMP-FPGA-Linux にインストールする手順を説明します。


# xserver-xorg-video-armsoc-xilinxとは


ZynqMP に対応したX Window Serverの DDX Driver(Video Driver) のことです。Xilinx が提供する Kernel Module(xlnx_drv) のDRM/KMS(Kernel Module Setting) を通じてディスプレイの情報を得たりディスプレイの設定を行うことが出来ます。


![Fig.1 xserver-xorg-video-armsoc-xilinx](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24981/fce563f6-95d3-4269-09cd-a92a7a4c5206.jpeg "Fig.1 xserver-xorg-video-armsoc-xilinx")

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

<br />




# Debian Package のビルド手順


この章では、xserver-xorg-video-armsoc-xilinx の Debian Package を作るための手順を説明します。

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

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

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

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

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


## ビルド環境


ビルドする環境には一つ注意点があります。それは、xserver-xorg-video-armsoc-xilinx は xserver-xorg-core のプラグインモジュールとしてビルドしなければなりません。そのためには、xserver-xorg-core をビルドした環境が必要になります。その際、ターゲットとなる環境(この場合は Debian10(ARM64))とビルド用の環境(例えばUbuntu(amd64)など)が違っていると、正常にビルド出来ないなどの問題が起こることがあります。

この問題を解決するには、 Ultra96/Ultra96-V2 で動く Debian 10 の上で xserver-xorg-video-armsoc を(セルフ)ビルドしてしまうのが一番手っ取り早いです。この記事では Ultra96/Ultra96-V2 で動く Debian 10 の上でビルドする手順を説明します。




## 元になるソースを得る


 xserver-xorg-video-armsoc-xilinxは xf86-video-armsoc を元にしています。しかし、実はxf86-video-armsoc はいくつものバージョンが存在します。github でサーチしただけでも32のリポジトリがみつかります。github 以外にも Linaro.org や freedesktop.org にも git のリポジトリが存在します。まさに百花繚乱、玉石混淆です。以下にざっと見つかったリポジトリを紹介します。



* https://git.linaro.org/arm/xorg/driver/xf86-video-armsoc.git
* https://anongit.freedesktop.org/git/xorg/driver/xf86-video-armsoc.git
* https://github.com/endlessm/xf86-video-armsoc.git
* https://github.com/paolosabatino/xf86-video-armsoc.git
* https://github.com/prahal/xf86-video-armsoc.git
* https://github.com/tmarques/xf86-video-armsoc.git



上であげたリポジトリのうち、xserver-xorg-video-armsoc-xilinx では freedesktop.org が提供しているものを使います。このリポジトリを選んだ理由は、Xilinx 社が提供している PetaLinux で採用している(と思われる)からです。他のリポジトリも試してみましたが、いずれもうまくビルドできなかったり、表示出来なかったりしました。

freedesktop.org のリポジトリは github ではないので fork できません。そこで以下の手順でローカルリポジトリを作ります。


```console
shell$ mkdir xserver-xorg-video-armsoc-xilinx
shell$ cd xserver-xorg-video-armsoc-xilinx
shell$ git init
shell$ git remote add freedesktop https://anongit.freedesktop.org/git/xorg/driver/xf86-video-armsoc.git
shell$ git fetch freedesktop
shell$ git merge freedesktop/master
```



## Xilinx 用のパッチをあてる


Xilinx 社の PetaLinux では freedesktop.org が提供しているリポジトリにパッチをあててビルドしています。パッチのファイルは以下のURL にあります。

* https://github.com/Xilinx/meta-xilinx/blob/master/meta-xilinx-bsp/recipes-graphics/xorg-driver/xf86-video-armsoc/0001-src-drmmode_xilinx-Add-the-dumb-gem-support-for-Xili.patch 

このパッチファイルをダウンロードしてリポジトリにパッチをあてます。ついでに git commit もしてしまいます。


```console
shell$ git clone https://github.com/Xilinx/meta-xilinx/
Cloning into 'meta-xilinx'...
remote: Enumerating objects: 1209, done.        
remote: Counting objects: 100% (1209/1209), done.        
remote: Compressing objects: 100% (605/605), done.        
remote: Total 11725 (delta 678), reused 1045 (delta 551), pack-reused 10516        
Receiving objects: 100% (11725/11725), 8.88 MiB | 6.21 MiB/s, done.
Resolving deltas: 100% (6448/6448), done.
shell$
shell$ patch -p1 < meta-xilinx/meta-xilinx-bsp/recipes-graphics/xorg-driver/xf86-video-armsoc/0001-src-drmmode_xilinx-Add-the-dumb-gem-support-for-Xili.patch 
patching file src/Makefile.am
patching file src/armsoc_driver.c
patching file src/drmmode_driver.h
patching file src/drmmode_xilinx/drmmode_xilinx.c
shell$
shell$ git add --update
shell$ git add src/drmmode_xilinx
shell$ git commit -m "[add] src/drmmode_xilinx" 
[master 84e3cef] [add] src/drmmode_xilinx
 4 files changed, 80 insertions(+), 1 deletion(-)
 create mode 100644 src/drmmode_xilinx/drmmode_xilinx.c
```



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


debian ディレクトリを作って、以下のファイルを追加します。

* debian/

  * README.Debian
  * README.source
  * changelog
  * compat
  * control
  * copyright
  * rules
  * xserver-xorg-video-armsoc-xilinx.docs
  * xserver-xorg-video-armsoc-xilinx.install

ここではこれらのファイルの説明はしません。詳細はhttps://github.com/ikwzm/xf86-video-armsoc-xilinx を参照してください。

ファイルを追加したら git commit します。


```console
shell$ git add debian/
shell$ git commit -m "[add] debian/"
[master 3961b1d] [add] debian/
 8 files changed, 68 insertions(+)
 create mode 100644 debian/README.Debian
 create mode 100644 debian/README.source
 create mode 100644 debian/changelog
 create mode 100644 debian/compat
 create mode 100644 debian/control
 create mode 100644 debian/copyright
 create mode 100755 debian/rules
 create mode 100644 debian/xserver-xorg-video-armsoc-xilinx.docs
 create mode 100644 debian/xserver-xorg-video-armsoc-xilinx.install

```



## ビルドに必要なパッケージ


xserver-xorg-video-armsoc の Debian Package をビルドするためには以下のパッケージが必要です。 apt install でインストールしてください。

  * drm-dev
  * libudev-dev 
  * libxext-dev
  * pkg-config
  * x11proto-core-dev
  * x11proto-fonts-dev
  * x11proto-gl-dev
  * x11proto-xf86dri-dev
  * xutils-dev xserver-xorg-dev 
  * quilt 
  * dh-autoreconf 
  * debhelper


## configure と Makefile を生成


最初に autogen.sh を実行して configure と Makefile を生成します。その後、make distclean を実行して autogen.sh が生成した中間ファイルを消去しておかなければなりません。


```console
shell$ autogen.sh
	:
	中略
	:
shell$ make distclean
	:
	後略
```



## Debian Package をビルドする


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


```console
shell$ sudo debian/rule binary
	:
	中略
	:
shell$ dpkg --info ../xserver-xorg-video-armsoc-xilinx_1.4-1_arm64.deb
 new Debian package, version 2.0.
 size 32924 bytes: control archive=856 bytes.
     540 bytes,    12 lines      control
     611 bytes,     7 lines      md5sums
 Package: xserver-xorg-video-armsoc-xilinx
 Source: xf86-video-armsoc-xilinx
 Version: 1.4-1
 Architecture: arm64
 Maintainer: ikwzm <ichiro_k@ca2.so-net.ne.jp>
 Installed-Size: 100
 Depends: libc6 (>= 2.17), libdrm2 (>= 2.4.36), libpixman-1-0, xorg-video-abi-24, xserver-xorg-core (>= 2:1.18.99.901)
 Provides: xorg-driver-video
 Section: x11
 Priority: optional
 Homepage: <https://github.com/ikwzm/xf86-video-armsoc-xilinx>
 Description: X.Org X Server -- ARM SoC display driver for rockchip, amlogic, sunxi and Xilinx(ZynqMP) DRM (mainline kernel)
```





# インストール



## Debian Packageの紹介


この節では、前章でビルドした xserver-xorg-video-armsoc-xilinx の Debian Package を ZynqMP-FPGA-Linux にインストールする手順を説明します。

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

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

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


## 注意


ここでインストールする手順は、GPU(Mali-400) によるレンダリングを行わない場合です。GPU によるレンダリングを行う場合は、libMali や Mali Kernel ドライバのインストールが必要ですが、その場合、インストールする手順が複雑になります。詳細は以下の記事を参照してください。

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


## Debian Package のインストール


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


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




次に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
[sudo] password for fpga:
(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) ...
```




お好みのウィンドウマネージャーをインストールします。


```console
shell$  apt install jwm
	:
	後略
```



## 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
```





# 起動


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


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


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



[概要編]: 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"