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

# 前回
[前回](https://qiita.com/alkarhythm/items/72398a561c7c28931ed7)はPetaLinuxでLinux環境を構築するところまでを解説しました。
今回は前回作成したSDKファイルを用いてVitisでプラットフォームを作成し、vaddプログラムを実行するところまでを解説しようと思います。

## Vitis Platformの作成
まず、ultra96v2_pkgフォルダ等を作成します。

```
mkdir ultra96v2_pkg
cd ultra96v2_pkg
mkdir pfm
```
※pfmフォルダはプラットフォームのパッケージング用ファイルを格納するフォルダです。

次にSDKを展開します。

```
cd ultra96v2_plnx/images/linux
./sdk.sh -d ../../../ultra96v2_pkg/
```

次に、pfmフォルダに必要なファイルを格納します。まず以下のフォルダを作成します。

```
cd ultra96v2_pkg/pfm
mkdir sd_dir
mkdir boot
```

sd_dirフォルダには`ultra96v2_plnx/images/linux`フォルダから次のファイルをコピーします。以下のファイルはV++によるFAT32パーティション作成のために必要になるそうです。

- boot.scr
- system.dtb

bootフォルダには次のファイルをコピーします。以下のファイルはBOOT.BINの作成に必要になるそうです。

- zynqmp_fsbl.elf
- pmufw.elf
- bl31.elf (bl31.binと間違えないように)
- u-boot-dtb.elf
- system.dtb

また、`u-boot-dtb.elf`を`u-boot.elf`にリネームします。 
※PetaLinux 2021.1ではu-boot.elfからデバイスツリーの情報が削除されているため、このようなリネームが必要とのことです。次のVitisリリース時にはこのようなリネームは必要なくなるようです。バージョン毎にいろいろと変わるのは面倒なので辞めてほしいのですが・・・。こうした記事も陳腐化します。

最終的に以下のフォルダ構成になります。

```
ultra96v2
    -ultra96v2_platform
    -ultra96v2_plnx
    -ultra96v2_pkg
        -sysroot
        -pfm
            -sd_dir
                boot.scr
                system.dtb
            -boot
                zynqmp_fsbl.elf
                pmufw.elf
                bl31.elf
                u-boot.elf
                system.dtb
```

以上で準備ができましたので、Vitisを起動します。

```
cd ultra96v2_pkg
vitis &
```

workspaceはultra96v2_pkgとします。
![Vivado_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149874/58f71275-c04d-391a-2acb-9d35bc7a1552.png)

Launchを押したら次のような画面が開きますので、`Create Platform Project`を選択します。

![Vivado_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149874/d7cc3046-42f4-176b-fe02-715f3bed0761.png)

プロジェクト名はultra96v2としておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149874/0d4aac30-6c40-719a-3791-d0e599e0c171.png)

次のページでは、Vivadoで作成したXSAファイルを選択します。またOperating systemはlinuxに変更します。
![Vivado_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149874/04d65535-cbf2-0c4b-c084-28dc0e66a999.png)

Finishを押します。

次にBootファイル等のディレクトリ設定を行います。`linux on psu_cortexa53`を
選択すると以下の画面になります。
![Vivado_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149874/c88456d1-7489-7cd9-a0b2-0a379613d2ca.png)

最初にBifを生成します。Bif File行のBrowseをドロップダウンさせると、`Generate Bif`というのがありますので、選択します。
![Vivado_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149874/4579ca08-8b0f-3494-3621-05b29abd1b12.png)

次に`Boot Components Directry`と`FAT32 Partition Directory`の設定を行います。
`Boot Components Directory`には`ultra96v2_pkg/pfm/boot`を、`FAT32 Partition Directory`には`ultra96v2_pkg/pfm/sd_dir`をそれぞれ設定します。

![Vivado_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149874/b32d0607-d995-cb1f-3026-c879a0c817d3.png)

以上の設定を済ませたらビルドします。Explorer上でultra96v2を選択し、赤枠で囲った金槌マークを実行します。
![Vivado_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149874/fb69ada3-1622-d8e6-1e7b-aeb7417f55a2.png)

exportフォルダを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149874/c3c1df8b-4df3-8809-5a1e-3dbab7f13493.png)


`platforminfo ./ultra96v2_pkg/ultra96v2/export/ultra96v2/ultra96v2.xpfm`で結果を確認してみます。

```
==========================
Basic Platform Information
==========================
Platform:           ultra96v2
File:               <プロジェクトフォルダ>/ultra96v2_pkg/ultra96v2/export/ultra96v2/ultra96v2.xpfm
Description:        
ultra96v2
    

=====================================
Hardware Platform (Shell) Information
=====================================
Vendor:                           avnet
Board:                            ultra96v2
Name:                             ultra96v2
Version:                          0.0
Generated Version:                2021.1
Hardware:                         1
Software Emulation:               1
Hardware Emulation:               1
Hardware Emulation Platform:      0
FPGA Family:                      zynquplus
FPGA Device:                      xczu3eg
Board Vendor:                     
Board Name:                       
Board Part:                       

=================
Clock Information
=================
  Default Clock Index: 2
  Clock Index:         2
    Frequency:         299.997000

==================
Memory Information
==================
  Bus SP Tag: HP0
  Bus SP Tag: HP1
  Bus SP Tag: HP2
  Bus SP Tag: HP3
  Bus SP Tag: HPC0
  Bus SP Tag: HPC1

=============================
Software Platform Information
=============================
Number of Runtimes:            1
Default System Configuration:  ultra96v2
System Configurations:
  System Config Name:                      ultra96v2
  System Config Description:               ultra96v2
  System Config Default Processor Group:   linux_domain
  System Config Default Boot Image:        standard
  System Config Is QEMU Supported:         1
  System Config Processor Groups:
    Processor Group Name:      linux on psu_cortexa53
    Processor Group CPU Type:  cortex-a53
    Processor Group OS Name:   linux
  System Config Boot Images:
    Boot Image Name:           standard
    Boot Image Type:           
    Boot Image BIF:            ultra96v2/boot/linux.bif
    Boot Image Data:           ultra96v2/linux_domain/image
    Boot Image Boot Mode:      sd
    Boot Image RootFileSystem: 
    Boot Image Mount Path:     /mnt
    Boot Image Read Me:        ultra96v2/boot/generic.readme
    Boot Image QEMU Args:      ultra96v2/qemu/pmu_args.txt:ultra96v2/qemu/qemu_args.txt
    Boot Image QEMU Boot:      
    Boot Image QEMU Dev Tree:  
Supported Runtimes:
  Runtime: OpenCL
```

Vivadoで設定を行ったクロックや、プラットフォーム <-> カーネル間通信のためのAXIインターフェースの設定が反映されています。

以上でPlatformの作成は終わります。

## Vitis Applicationの作成
Vitisのメニューバーから、`File -> New -> Application Project...`を選択します。
Platformは先ほど作成したプラットフォームが選択されています。
![Vivado_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149874/539defee-2d22-5ab6-aed4-6adb2849a463.png)

プロジェクト名はvaddとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149874/3baf435e-fdfb-29f7-c196-bd44466d22fa.png)

Sysroot、Root FS、Kernel Imageの設定を行います。

- Sysroot path : ultra96v2_pkg/sysroots/cortexa72-cortexa53-xilinx-linux
- Root FS : ultra96v2_plnx/images/linux/rootfs.ext4
- Kernel Image : ultra96_v2/images/linux/Image

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149874/b36db3fc-3373-dde3-9eaa-c4be715cd2f7.png)

実装するアプリケーションのテンプレート選択になります。`Validate Examples -> Vector Addition`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149874/7bd8b77a-ac3e-63ef-2eea-553a59de5c50.png)

Finishを押します。

次に、Explorerのvadd.prjを選択し、Active build configurationsをEmulation-SWからHardwareに変更します。
![Vivado_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149874/739a1308-5f30-1bf6-cdf5-e8a9f740e292.png)

Explorerのvadd_systemを選択し、金槌マークを押してビルドします。
![Vivado_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149874/8bd5d462-5163-80ab-c1a9-3b1db168768c.png)


次に、`ultra96v2_pkg/vadd_system/Hardware/package`に生成された`sd_card.img`をSDカードに書き込みます。

```
sudo fdisk -l
```

を実行し、SDカードを探します。私の場合は/dev/sdeでした。

```
ディスク /dev/sde: 14.94 GiB, 16022241280 バイト, 31293440 セクタ
Disk model: STORAGE DEVICE  
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0xe570588e

デバイス   起動 開始位置 最後から  セクタ サイズ Id タイプ
/dev/sde1  *        2048  2000895 1998848   976M 83 Linux
/dev/sde2        2000896  4194303 2193408     1G 83 Linux
[1]+  終了                  vitis
```
パーティションが残ってますのでとりあえず消します。

```
sudo fdisk /dev/sde
d
d
w
```
SDカードに書き込みます。

```
sudo dd if=ultra96v2_pkg/vadd_system/Hardware/package/sd_card.img of=/dev/sde bs=4M status=progress
sudo sync
```

syncが完了したら、SDカードを抜き、Ultra96V2ボードに差し込み電源を立ち上げます。

```
login : root
password : root
```
でログインします。

次のコマンドを実行し、`TEST PASSED`と表示されたら成功です。

```
cd /mnt/sd-mmcblk0p1/
./vadd binary_containter_1.xcbin
```

![IMG_20211010_125210218.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149874/b52cc79e-3727-b45b-d888-fae5f9acd13c.jpeg)

## 感想
高い。参入障壁が高い。スタート地点に立つまでにここまでツールをまたいで色々設定を行わなければならないとはとても面倒くさい。しかも情報が少ない。
特に過去のバージョン (2020.2とか) と同じ方法で出来るだろうと踏んでいたところができなかったりと、バージョンアップデートする毎になぜこんなにも変わるのか疑問が多かった。これもおそらく参入障壁が高い要因の一つだと思う(情報あるバージョンでやればいいじゃん、と言われたらそれまでだが。でも誰かが情報作らなくちゃいけないよね?)。
兎にも角にも、Vitisのサンプルアプリケーションを動かすところまではできたので、このあとはhackster.io等を眺めながら色々遊んでみたいと思います(高位合成してみたい)。