Zedboard-PetaLinux2020.2 セットアップ

# 前置き

PetaLinuxはXILINX製プロセッサで組み込みLinux開発を行うためのツールである。
XILINX製Zynq-7000 SoCを搭載する評価ボードZedBoardでPetaLinuxによる
組み込みLinux開発を行うまでの環境構築、セットアップ手順をやってみた

PetaLinux version:2020.2
VIVADO version:2020.2

[XILIMX PetaLinux ツール概要]
https://japan.xilinx.com/products/design-tools/embedded-software/petalinux-sdk.html

なお、このセットアップ手順は下記資料をほぼそのまま実行している。

[PetaLinux ツール資料リファレンスガイド]
https://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx2020_2/ug1144-petalinux-tools-reference-guide.pdf

## 1. PetaLinuxツール 準備

環境構築はLinux PCでUbuntuのDocker Imageを作成し行った。
OS: Ubuntu 18.04.3 LTS (Bionic Beaver)

### 1.1. PetaLinuxツールのインストール

事前にpetalinuxツールの展開に必要なパッケージをインストールしておく。
これだけで足りなければ.runのインストール時にErrorが出るので
適宜インストールする。

``` bash
$ sudo apt install -y xterm libtool zlib1g-dev gcc-multilib build-essential
$ sudo apt install -y rsync
$ sudo apt install -y net-tools
$ sudo apt install -y ncurses-dev
$ sudo apt install -y tofrodos
$ sudo apt install -y iproute2
$ sudo apt install -y gawk

$ sudo dpkg --add-architecture i386
$ sudo apt-get update
$ sudo apt-get install zlib1g:i386
```

PetaLinux ツールインストーラをインストールしてくる。
(要ユーザー登録)

[PetaLinux ツール - インストーラー - 2020.2  Full Product Installation]
https://japan.xilinx.com/member/forms/download/xef.html?filename=petalinux-v2020.2-final-installer.run

インストーラを任意のディレクトリに置き、任意のディレクトリにインストールする。
このとき、root権限だと展開できないため、ユーザー(zed)を生成した。

``` bash
$ cd /workspace/share/petalinux/
$ mkdir <installer-folder>
$ mkdir /opt/pkg
$ mkdir /opt/pkg/petalinux
$ mkdir /opt/pkg/petalinux/2020.2

$ useradd zed
(パスワード等は適宜設定する)
$ su zed
(ここからはzedユーザーで実施)
$ cd <installer-folder>
$ ./petalinux-v2020.2-final-installer.run -d /opt/pkg/petalinux/2020.2
```

### 1.2. PetaLinux作業環境のセットアップ

settingsスクリプトを実行する
ユーザーシェルがbashとCシェルの場合で実行ファイルが異なる。

今回はbashを使う

``` bash
$ cd /opt/pkg/petalinux/2020.2/
$ source settings.sh
```

WARNINGが出るが気にしなくて良い模様。

正しくセットアップされたことを確認。

``` bash
$ echo $PETALINUX
/opt/pkg/petalinux/2020.2
```

## 2. プロジェクトの作成

### 2.1. PetaLinux BSPのインストール

BSPは各ボードに適したものをインストールする。
今回はZedBoardを使用するので、下記URLの、
「Zynq-7000 SoC ボード サポート パッケージ - 2020.2」->「ZED BSP」をダウンロード
（要ユーザー登録)

[ダウンロードページ]
https://japan.xilinx.com/support/download/index.html/content/xilinx/ja/downloadNav/embedded-design-tools.html

### 2.2. PetaLinuxプロジェクトの作成

ダウンロードしたBSPファイルを開発環境Linux側の任意のフォルダに置く。

``` bash
<petalinux-bsp-folder>/avnet-digilent-zedboard-v2020.2-final.bsp
```

プロジェクト作成する任意のフォルダを作成し移動

``` bash
$ cd /workspace/share/petalinux/project
$ mkdir workspace
$ cd workspace
```

ここからPetaLinuxコマンドを使用していくが、どうやら`LANG=C`が必要らしいので
あらかじめ`alias`しておく

``` bash
$ vi ~/.bashrc

alias petalinux-setup='source /opt/pkg/petalinux/2020.2/settings.sh'
alias petalinux-boot='LANG=C petalinux-boot'
alias petalinux-build='LANG=C petalinux-build'
alias petalinux-config='LANG=C petalinux-config'
alias petalinux-create='LANG=C petalinux-create'
alias petalinux-package='LANG=C petalinux-package'
alias petalinux-util='LANG=C petalinux-util'
```

プロジェクト作成のコマンドを実行する。
（root権限でないユーザーで実行した。）

``` bash
petalinux-create -t project -s <petalinux-bsp-folder>/avnet-digilent-zedboard-v2020.2-final.bsp
```

※ユーザーログオフするたびに`petalinux-setup`しないとpetalinuxコマンドが
有効にならないため注意。

下記のようなプロジェクトフォルダが生成された。
このプロジェクトはインストールされたBSPに基づくものである。

``` bash
<petalinux-project-folder>/avnet-digilent-zedboard-2020.2
```

## 3. VIVADO セットアップ

### 3.1. VIVADOインストール

PetaLinuxとバージョンを合わせたVIVADOが必要となる。
「Vivado Design Suite - HLx Edition - 2020.2  Full Product Installation」
 ->「ザイリンクス統合インストーラー 2020.2: Windows 用自己解凍型ウェブ インストーラー」をダウンロード
VIVADOはGUIでやるので手元のWindows PCにインストールした。

[ダウンロードページ]
https://japan.xilinx.com/support/download/index.html/content/xilinx/ja/downloadNav/vivado-design-tools.html

+ ダウンロード時の注意
Xilinxのツールをダウンロードする際はサインインが必要。
サインイン後も詳細情報の⼊⼒画⾯に遷移するが、ページ下部のDownloadを押せば良い。

+ インストール時の注意
User Authentication欄はダウンロード時と同じアカウントを指定する。
エディションは Vivado HL WebPACK を選択する。
その他はデフォルト設定のままにしておく。

### 3.2. VIVADOによるハードウェアプラットフォームの生成

Zynq7000だけの単純なPSをとりあえず作成した。

プロジェクトの作成が終わったら、
「File」->「Export」->「Export Hardware」
を実行する。

これによりXSAファイルが生成される。
\<vivado-project-folder\>/design_xxx_wrapper.xsa

## 4. 設定およびビルド

### 4.1. ハードウェア コンフィギュレーションのインポート

ここからはまたUbuntu環境。
PetaLinux プロジェクトディレクトリに移動

``` bash
$ cd <petalinux-project-folder>/avnet-digilent-zedboard-2020.2
```

XSAファイルを任意のフォルダに置いておく

``` bash
<vivado-xsa-folder>/design_xxx_wrapper.xsa
```

XSAファイルのあるディレクトリへのパスを指定して`petalinux-config`コマンドを実行。
（root権限でないユーザーで実行した。このときXSAファイルの閲覧権限やプロジェクトディレクトリの書込権限がないとKconfigの生成ができずハマる。rootでできるのだろうか。。。）

``` bash
$ petalinux-config --get-hw-description=<vivado-xsa-folder>
```

このようなConfig画面が出る。今回は特に変更せず`< Exit >`
![4.1.1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546326/9ebdef1b-fdc4-dd2f-ecbd-3a94faf2a0d1.png)


これでVIVADOで生成したハードウェア設定が反映された。

### 4.2. システムイメージのビルド

PetaLinux プロジェクトディレクトリに移動

``` bash
$ cd <petalinux-project-folder>/avnet-digilent-zedboard-2020.2
```

`petalinux-build`を実行してビルドする。

``` bash
$ petalinux-build
```

ビルドが完了すると、`images`ディレクトリにイメージが生成されている。

``` bash
$ ls images/linux/
boot.scr      rootfs.cpio            rootfs.jffs2     system.bit  u-boot.elf  zImage
image.ub      rootfs.cpio.gz         rootfs.manifest  system.dtb  uImage      zynq_fsbl.elf
pxelinux.cfg  rootfs.cpio.gz.u-boot  rootfs.tar.gz    u-boot.bin  vmlinux
```

### 4.3. Zynq-7000用ブートイメージのビルド

`petalinux-package`コマンドで、`.BIN`フォーマットのブートイメージを生成する。

``` bash
$ petalinux-package --boot --fsbl images/linux/zynq_fsbl.elf --fpga images/linux/*.bit --u-boot
```

`images/linux`下に`BOOT.BIN`が生成された。

``` bash
$ ls images/linux/
BOOT.BIN  pxelinux.cfg    rootfs.cpio.gz.u-boot  rootfs.tar.gz  u-boot.bin  vmlinux
boot.scr  rootfs.cpio     rootfs.jffs2           system.bit     u-boot.elf  zImage
image.ub  rootfs.cpio.gz  rootfs.manifest        system.dtb     uImage      zynq_fsbl.elf
```

### 5. 起動確認

#### 5.1. SDへの書き込み

ZedBoardに挿入するSDカードを用意。
まずパーティションを2つに分けておく必要がある。
パーティション1をfat32に、2をext4にフォーマットする必要がある。
PetaLinuxデフォルトだとブートファイル、イメージファイルはBOOT.BIN、image.ubに
合成されているらしく、この２つがあればよいらしい。

| パーティション | フォーマット | ファイル |
| -------------- | ------------ | -------- |
| 1              | fat32        | BOOT.BIN |
| 1              | fat32        | image.ub |
| 2              | ext4         | rootfs.tar.gzを展開 |

#### 5.2. ZedBoardでの起動確認

SDをZedBoardに挿入し電源ONするとU-Bootが走り、下記ログがUSB-UARTから吐き出された。
Bootモードからカーネルの起動が始まらない様子。

``` log
U-Boot 2020.01 (Feb 26 2021 - 05:21:28 +0000)

CPU:   Zynq 7z020
Silicon: v3.1
Model: Zynq Zed Development Board
DRAM:  ECC disabled 512 MiB
Flash: 0 Bytes
NAND:  0 MiB
MMC:   mmc@e0100000: 0
Loading Environment from SPI Flash... SF: Detected s25fl256s1 with page size 256 Bytes, erase size 64 KiB, total 32 MiB
OK
In:    serial@e0001000
Out:   serial@e0001000
Err:   serial@e0001000
Net:
ZYNQ GEM: e000b000, mdio bus e000b000, phyaddr 0, interface rgmii-id

Warning: ethernet@e000b000 MAC addresses don't match:
Address in DT is                (※MACアドレスA)
Address in environment is       (※MACアドレスB)
eth0: ethernet@e000b000
Hit any key to stop autoboot:  0
Device: mmc@e0100000
Manufacturer ID: 13
OEM: 4b47
Name: SD08G
Bus Speed: 50000000
Mode: SD High Speed (50MHz)
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: 7.4 GiB
Bus Width: 4-bit
Erase Group Size: 512 Bytes
Device: mmc@e0100000
Manufacturer ID: 13
OEM: 4b47
Name: SD08G
Bus Speed: 50000000
Mode: SD High Speed (50MHz)
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: 7.4 GiB
Bus Width: 4-bit
Erase Group Size: 512 Bytes
Zynq>
```

U-Bootの環境変数を確認する。

``` bash
Zynq> printenv

(一部抜粋)
bootcmd=run $modeboot
modeboot=sdboot
sdboot=mmcinfo; run fpgaload; fatload mmc 0:1 0x2080000 zImage && fatload mmc 0:1 0x2000000 zynq-zed.dtb && bootz 0x2080000 - 0x2000000;
```

Linux Kernelの起動はbootcmdにより実行される。
`run` はあとに続くコマンドを順に実行していく。
この設定だと最終的に`sdboot`に書き並べられたコマンドが実行されていくことで
Linuxの起動が行われることが分かる。
これによると`zImage`と`zynq-zed`が必要そうだ。

`petalinux-build`実行後の生成物を見直すため、`image/linux`内を再度のぞくと、

``` bash
BOOT.BIN  pl.dtbo       rootfs.cpio.gz         rootfs.manifest  system.dtb  uImage   zynq_fsbl.elf
boot.scr  pxelinux.cfg  rootfs.cpio.gz.u-boot  rootfs.tar.gz    u-boot.bin  vmlinux
image.ub  rootfs.cpio   rootfs.jffs2           system.bit       u-boot.elf  zImage
```

`zImage`はあるが`zynq-zed.dtb`はなく、`system.dtb`がある。
これに合わせてU-Bootの環境変数を書き換えてみる。

``` bash
Zynq> env set sdboot "mmcinfo; run fpgaload; fatload mmc 0:1 0x2080000 zImage && fatload mmc 0:1 0x2000000 sytem.dtb && bootz 0x2080000 - 0x2000000;"
Zynq> env save
```

ついでにethernetのMACアドレスについてWarningが出ているため、修正

``` bash
$ petalinux-config

Subsystem AUTO Hardware Settings  --->
Ethernet Settings  --->
Ethernet MAC address
(※MACアドレスB)を入力
< OK >
< Save >

< Exit >
```

再ビルド

``` bash
$ petalinux-build
$ petalinux-package --boot --fsbl images/linux/zynq_fsbl.elf --fpga images/linux/*.bit --u-boot --force
```

SDカードのパーティション1に
`images/linux/zImage`
`images/linux/system.dtb`
をコピーする。

※zImageはZynq-7000デバイス用のカーネルイメージ(RootFS含む)

最終的にSDカードの構成はこうなった。

| パーティション | フォーマット | ファイル |
| -------------- | ------------ | -------- |
| 1              | fat32        | BOOT.BIN |
| 1              | fat32        | image.ub |
| 1              | fat32        | zImage |
| 1              | fat32        | system.dtb |
| 2              | ext4         | rootfs.tar.gzを展開 |


SDカードをZedBoardに挿入し、電源を入れるとLinuxが起動した。
初期のlogin IDとPasswordはどちらも"root"となっている。

``` bash
avnet-digilent-zedboard-2020_2 login: root
Password:
```

これでPetaLinuxシステムにログインできた。
OS情報はこうなっている。

``` bash
root@avnet-digilent-zedboard-2020_2:~# uname -a
Linux avnet-digilent-zedboard-2020_2 5.4.0-xilinx-v2020.2 #1 SMP PREEMPT Fri Feb 26 05:21:35 UTC 2021 armv7l GNU/Linux
```

### まとめ

とりあえずOSの起動までたどり着いた。
リファレンスではパーティション１に`BOOT.BIN`,`image.ub`の2ファイルがあれば良いと記載があるが、それでうまく行かない理由が分かっていない。U-Bootの環境変数はPetaLinux上で設定できるのだろうか？要勉強。

### 参考資料

https://qiita.com/iwatake2222/items/e1895900635fc29196b0
https://dora.bk.tsukuba.ac.jp/~takeuchi/?plugin=related&page=%E9%9B%BB%E6%B0%97%E5%9B%9E%E8%B7%AF%2Fzynq%2FPetalinux%20%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89