Ultra96V2でとりあえずLinuxを動かす (2) ※2021.1

# 前回
[前回](https://qiita.com/alkarhythm/items/88ce763d4af0f0b763dd)はVivadoでプラットフォームを生成するところまでを解説しました。
今回は前回作成したXSAファイルを用いてPetaLinuxでLinuxカーネルを生成するところまでを解説しようと思います。

## XRTのインストール (このプロセスは必要かどうかわからない)
高位合成を行う上では、プラットフォーム <-> カーネル間の通信のためにXilinx Runtime Library (XRT)が必要とのことなのでインストールを行います。
※x86_64 <-> PCIe環境の場合のみ必要なのかどうかわからないため、念の為インストールします。もしかしたら必要ありません。

XRTのgitからクローンします。

```
git clone https://github.com/Xilinx/XRT
```

次のコマンドでXRTをインストールするために必要なパッケージがインストールできます。

```
sudo <XRTを置いたフォルダ>/src/runtime_src/tools/scripts/xrtdeps.sh
```

次にbuildフォルダーに潜ってbuild.shを実行します。

```
cd build
./build.sh
```

はい、エラーが出ました。

```
CMake Error at CMakeLists.txt:6 (CMAKE_MINIMUM_REQUIRED):
  CMake 3.5.0 or higher is required.  You are running version 3.3.2
```

CMakeのバージョンとして3.5.0以上のものが必要なのに対し、3.3.2が使用されているようです。aptでインストールしたCMakeのバージョンが3.16.3でしたので別PATHのCMakeが使用されているようです。確認してみると、Xilinxをインストールしたフォルダに3.3.2のCMakeが存在しており、それが使用されていそうです。

```
$ whereis cmake
cmake: /usr/bin/cmake /usr/lib/x86_64-linux-gnu/cmake /usr/lib/cmake /usr/share/cmake /tools/Xilinx/Vitis/2021.1/tps/lnx64/cmake-3.3.2/bin/cmake /usr/share/man/man1/cmake.1.gz /usr/src/googletest/googletest/cmake
```
以上のエラーは.bashrc等にVitisのsettings64.shをsourceしている場合に起こるようです。
bashrc弄るの面倒なのでbuild.shを弄ります。

build.shの8行目を以下のように変更します。

```
CMAKE=cmake -> CMAKE=/usr/bin/cmake
```

気を取り直して再度build実行します。

```
./build.sh
```

上手くビルドできたら、次にXRTパッケージのインストールを行います。

```
cd Release
sudo apt install ./xrt_202210.2.13.0_20.04-amd64-xrt.deb
```
## PetaLinuxプロジェクトの作成
ultra96v2フォルダにて、次のコマンドでPetaLinuxのプロジェクトを生成します。(ultra96v2_plnxフォルダを作成済みの方は一度削除してください)。

```
petalinux-create --type project --template zynqMP --name ultra96v2_plnx
cd ultra96v2_plnx
petalinux-config --get-hw-description=../ultra96v2_platform/ultra96v2_wrapper.xsa
```

以上のコマンドを実行すると次のような画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149874/5c1dd37b-e68d-ffe8-8724-f8e79bff3b55.png)

`Subsystem AUTo Hardware Settings -> Serial Settings`を開き、psu_uart_0からpsu_uart_1に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149874/a8e605de-9556-5ca3-5c4f-ce09967c78ee.png)


次に、`DTG Settings -> MACHINE_NAME`をtempleteからavnet-ultra96-rev1に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149874/7fb76023-714e-b4b6-fb29-66cb8f16bab1.png)


次に、`Image Packaging Configuration -> Root filesystem type`をEXT4 (SD/eMMC/SATA/USB)に変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149874/02049753-c8ab-3cec-5596-d99b3671bc1f.png)

以上の設定を済ませたらExit -> OKで設定を終えます。

次にユーザーパッケージの追加を行います。XRTとOpenCL周りです。OpenCVは多分必要ありませんが一応追加。
`ultra96v2_plnx/project-spec/meta-user/conf/user-rootfsconfig`に次の行を追記します。

```
CONFIG_xrt
CONFIG_xrt-dev
CONFIG_opencl-clhpp-dev
CONFIG_opencl-headers-dev
CONFIG_packagegroup-petalinux-opencv
CONFIG_packagegroup-petalinux-opencv-dev
```

次のコマンドを実行し、rootfsの設定を行います。

```
petalinux-config -c rootfs
```
`user packages`を開いて全部にチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149874/6b4f4515-bc6b-7792-5375-9f25701c0d58.png)

Exit -> OKを押して設定を終えます。

次にカーネルの設定を行います。

```
petalinux-config -c kernel
```
次のような画面が開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149874/695b7f30-8acc-6096-14eb-1a70b7a38c4a.png)

次はお好みになりますが、JTAG使ってデバッグする場合は次の設定をオフにします (Idle状態のCPUとJTAGで通信するとハングアップしてしまうらしい)。

- CPU Power Management -> CPU Idle
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149874/473ea457-172a-f22f-35c3-9bdef2c91463.png)

- CPU Power Management -> CPU Frequency scaling
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149874/9d8b3c3f-74d7-85f2-9610-aee411fc0979.png)

次に、`Library routines -> Size in Mega Bytes`を256から1024に変更します (連続メモリ空間のサイズを上げる)。
※こちらは過去の他の方の解説記事で多くの方がしていたのでそれに倣っているだけですが、このような設定を行う詳しい理由はわかりません。知っている方いましたら教えてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149874/2a5c6a3d-b578-3567-b86f-a0702df0cf2f.png)

カーネルの設定は以上になります。

なお、PetaLinux 2021.1では次のような問題があるためDP出力ができません。そのため、パッチを当てる必要があります。

https://support.xilinx.com/s/article/76568?language=ja

このページの最下部にあるこのファイルをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149874/84253823-d0b6-de3e-5504-6ef5d117a6a8.png)

ダウンロードしたファイルを`ultra96v2_plnx/project-spec/meta-user/recipes-bsp/device-tree/files`の中に格納します。
`ultra96v2_plnx/project-spec/meta-user/recipes-bsp/device-tree/device-tree.bbappend`に追記します。

```
SRC_URI_append = " file://config file://system-user.dtsi file://0001-kernel-v2021.1-Sync-the-psgtr-node-from-U-boot.patch"
```

次にビルドします。

```
petalinux-build
```

ビルド中何度か止まるのでCtrl-Cでプロセス終了させて再度ビルド実行しました。

ビルドが完了したら以下のコマンドを実行してSDKを作成します。こちらはVitisプラットフォームを作成する際に必要になります。

```
petalinux-build --sdk
```
こちらも何故か何度もプロセスが固まるのでCtrl-Cで終了させ再度上記コマンドを実行しています。

## 次の記事
本記事は以上までとなります。次はVitisを用いてプラットフォームの構築を行いたいと思います。

https://qiita.com/alkarhythm/items/28ced7844283606f1ace