はじめに
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 を用意しています。この記事ではインストール方法を説明します。
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 がインストールされている必要があります。
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
- boot/
- 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
- boot/
- 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 のフォーマット
- SD-Card のパーティション1を VFAT File System でファイルシステムを作ります。だいたい100MB〜300MBあれば充分です。
- SD-Card のパーティション2を ext4 File System でファイルシステムを作ります。
Linux での SD-Card のフォーマットは次の URL を参照してください。
SD-Card への書き込み
0. SD-Card のマウント
ここではフォーマットした SD-Card のドライブが /dev/sdc だった場合の例を示します。
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/ 下のファイルをコピーします。
shell# cp target/Ultra96/boot/* /mnt/usb1
1.2 Boot Partition のコピー(Ultra96-V2 の場合)
SD-Card のパーティション1(この例では /mnt/usb1) にtarget/Ultra96-V2/boot/ 下のファイルをコピーします。
shell# cp target/Ultra96-V2/boot/* /mnt/usb1
2. RootFS Partition の生成
SD-Card のパーティション2(この例では /mnt/usb2) に ubuntu20.04-desktop-rootfs.tgz の中身を展開します。
shell# tar xfz ubuntu20.04-desktop-rootfs.tgz -C /mnt/usb2
3. SD-Card のアンマウント
shell# umount /mnt/usb1
shell# umount /mnt/usb2
Ultra96/Ultra96-V2のセットアップ
- Ultra96/Ultra96-V2 の SD-Card スロットに SD-Card をセットします。
- Ultra96/Ultra96-V2 の mini Display Port コネクタにモニターを接続します。
- Ultra96/Ultra96-V2 の USB ポートにキーボードとマウスを接続します。
Ubuntu 20.04 の開始
- Ultra96/Ultra96-V2 の電源スイッチをオンにします。
- 数秒後にディスプレイモニターに Ubuntu のログイン画面が出ます。
- User Name に fpga、Password に fpga を入力してログインします。
Lima の無効化
提供したシステムはあくまでも開発中のため、Lima を有効にしたことで動作しない場合が十分考えられます。この章では Lima を無効化する方法を説明します。
DRI Lima の無効化
libGL は環境変数 LIBGL_ALWAYS_SOFTWARE に 1 を設定すると DRI Lima によるレンダリングを行わずにソフトウェアによるレンダリングを行います。
アプリケーション毎の DRI Lima の無効化
ターミナルから起動するようなアプリケーションは、次の例のように環境変数 LIBGL_ALWAYS_SOFTWARE に 1 を設定して起動すると良いでしょう。
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 を用意します。
[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 をアンインストールしておく必要があります。
Section "Device"
Identifier "ZynqMP"
Driver "armsoc"
Option "DRI" "2"
Option "NoFlip" "false"
Option "Debug" "false"
EndSection
DRI Lima のアンインストール
libGL は対応する DRI ドライバが無ければ自動的にソフトウェアによるレンダリングを行います。いっそのこと DRI Lima をアンインストールしてしまう手もあります。
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" を指定します。
linux_boot_args_systemd=systemd.unit=multi-user.target
GUI でのブート
uEnv.txt の linux_boot_args_systemd に "systemd.unit=graphical.target" を指定します。
linux_boot_args_systemd=systemd.unit=graphical.target
デフォルトでのブート
デフォルトのランレベルは Ubuntu が起動してからも変更できます。デフォルトのランレベルでブートする場合は、uEnv.txt の linux_boot_args_systemd を空にします。
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)。
linux_boot_args_console=console=ttyPS0,115200
ディスプレイ+キーボードへの切り替え
uEnv.txt の linux_boot_args_console に "console=tty1" を指定します。
linux_boot_args_console=console=tty1