Petalinux 2021.2 & ZedBoard (2) Linuxを動作させてみる

# はじめに
本稿はZedBoard上でLinuxやカスタムIPを動作させるための手順をまとめたものである。

# 目次
(1) [開発環境の構築](https://qiita.com/daisuke-0213/items/618f2e4955cc6cccb022)
(2) Linuxを動作させてみる (今回の内容)

# 今回やること
PetalinuxでLinuxイメージを作成しSDカードにコピー、SDカードをZedBoardに読み込ませてLinuxの起動およびWindow PCとシリアル通信ができることを確認する。

# 大まかな流れ
1. Boardファイルの配置
2. XSAファイルの作成 (Vivado)
3. 起動イメージの作成 (Petalinux)
4. SDカードへのコピー
5. Linuxの動作確認

# 手順詳細
## 1. Boardファイルの配置
まずBoard FileというFPGAボードの様々な情報がまとめられたファイルを所定のディレクトリに配置する必要がある。ZedBoardの場合[DiglentのGithubページ](https://github.com/Digilent/vivado-boards)から入手可能である。ダウンロードしたZIPファイルを展開し、vivado-boards-master/new-/board_filesにある全てのディレクトリを以下の場所にコピーする (zedboardだけでもOK)。

![SnapCrab_NoName_2024-8-2_17-13-8_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818410/64089754-cce4-f362-57ba-6c5bdc5aa42c.png)

```
C:\Xilinx\Vivado\2021.2\data\xhub\boards\XilinxBoardStore\boards\Xilinx
```

:::note
ちなみにViado上でBoardファイルを追加することもできる。
:::

## 2.XSAファイルの作成 (Vivado)
### 2.1 プロジェクトの作成
Vivadoを起動する。今回はプロジェクト名を"Simple_PS"として設計を進める。基本的にはデフォルトの設定でNextをクリックし続けるが、以下の画面では"Boards"のタブをクリックし、"Search"に"zed"と入力するとZedboardが表示される。ZedBoardの行をクリックし選択状態にしてNextをクリック。確認画面が表示されるのでFinish。

![SnapCrab_NoName_2024-8-2_17-21-23_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818410/9552dad1-c307-3bae-6407-88bb3872df29.png)

### 2.2 回路図の作成
左側のメニューのCreate Block Designをクリックし回路図エディタを起動する。画面中央の「＋」をクリックすると追加できるIPのリストが表示される。Searchの欄に"zynq"と入力すると"ZYNQ Processing System"が表示される。これをダブルクリックするとZYNQが配置される。![SnapCrab_NoName_2024-8-2_17-30-22_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818410/fdfa52d3-e00b-a7c8-3ea9-1f0253eb23f6.png)

画面やや左側上部の"Run Block Automation"をクリックし、デフォルトの状態でOKをクリックする。
![SnapCrab_NoName_2024-8-2_17-35-17_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818410/dd8674a7-cb12-e878-31a3-43616d29ac7f.png)

ZedBoardに合わせた構成に自動修正されるが、"FCLK_CLK0"のピンをドラッグし"M_AXI_GP0_ACLK"のピンに重ねてこれらの端子間を結線する必要がある。

![SnapCrab_NoName_2024-8-2_17-38-16_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818410/1d7cb55b-6ff0-dae9-d4aa-e3e625ead860.png)

ZYNQのモジュールをダブルクリックし、Peripheral I/O Pinsをクリックする。"Ethernet 0"の項目をクリックして"MDIO"を表示させる。この状態で画面を右方向にスクロールさせると、"EMIO"が黄緑色でハイライトされた状態になっている。その隣の"MDIO"をクリックすると"MDIO"がハイライトされる。この状態でOKをクリックとZedBoard上のLANポートを使えるようになる。

![SnapCrab_NoName_2024-8-2_17-41-54_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818410/a5bc3fb3-c4fd-12ca-f390-157743f9f18f.png)

以下のようなWarningが表示されるが特に問題ない。
![SnapCrab_NoName_2024-8-2_17-51-13_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818410/f9bac5e2-390b-b306-f9bf-53972392c011.png)

左上の"Sources"のタブをクリックし、design_1(design_1.bd)を右クリック"Create HDL Wrapper"をクリックし、トップモジュールを作成、Generate Bitstreamを実行する。
![SnapCrab_NoName_2024-8-2_17-52-18_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818410/6d0d85b9-075d-fd77-68a4-5c1982903dbe.png)

Bitstream生成が完了したら、メニューバーのFileからExport->Export Hardwareを選択する。基本的にはデフォルトのままだが以下の画面では"Include Bitstream"を選択すること。プロジェクトのディレクトリに"design_1_wrapper.xsa"が生成される。

![SnapCrab_NoName_2024-8-2_18-2-29_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818410/9d100a4f-3497-5032-2a65-93316bc5206e.png)

## 3. 起動イメージの作成 (Petalinux)
### 3.1 作業ディレクトリの作成
ここからはUbuntuマシンでの作業となる。まず作業ディレクトリを作成する。ここでは~/workディレクトリ以下にzedboardディレクトリ、zedboardディレクトリ以下にxsaディレクトリを作成し、xsaディレクトリにdesign_1_wrapper.xsa、zedboardディレクトリ以下でビルドの作業を行うことにする。
```
~/work
      -> zedboard
         -> xsa
            -> design_1_wrapper.xsa
         -> (ビルド用のディレクトリ1)
         -> (ビルド用のディレクトリ2)
         ...
```

### 3.2 プロジェクトの作成 (petalinux-create)
zedboardディレクトリに移動し、以下のコマンドを実行、プロジェクトを作成する。Simple_PSというディレクトリが作成されるのでそこに移動する。
```
petalinux-create -t project -n Simple_PS -s /cad/share/avnet-digilent-zedboard-v2021.2-final.bsp
cd Simple_PS
```
### 3.3 プロジェクトの設定 (petalinux-config)
以下のコマンドを実行し、Petalinux設定画面を起動する。
```
petalinux-config --get-hw-description=../xsa/design_1_wrapper.xsa
```

以下のようなウィンドウが起動する。カーソルを"Yocto Settings"まで移動させEnter、以下のようにそれぞれ設定する。設定が終わったら"Exit"を選択し、設定を保存して終了する。
```
Add pre-mirror url -> file:///cad/share/downloads
Local sstate feeds settings -> /cad/share/sstate_aarch64_2021.2/aarch64
[ ] Enable Network sstate feeds (Spaceキーでチェックを外す)
[*] Enable BB NO NETWORK
```
![SnapCrab_NoName_2024-8-2_18-31-20_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818410/91af079a-adf9-5515-fc85-dd7b4c2f31ca.png)

次に./project-spec/meta-user/conf/petalinuxbsp.confをvi等のエディタで開き、以下の2行を追加する。
```
DL_DIR = "/cad/share/downloads"
SSTATE_DIR = "/cad/share/sstate_aarch64_2021.2/aarch64"
```
以上でビルドの準備が整った。

### 3.3 ビルドの実行 (petalinux-build)
以下のコマンドでビルドを実行する。結構時間がかかる。ちなみに上記のdownladsとsstateを設定しないと30分以上かかる…。
```
petalinux-build
```
### 3.4 イメージファイルの作成 (petalinux-package)
以下のコマンドでイメージファイルを作成する。ちなみに2回目以降は末尾に"--force"オプションが必要。

```
petalinux-package --boot --fsbl images/linux/zynq_fsbl.elf --fpga images/linux/*.bit --u-boot
```
以下の3つのファイルが作成されていることを確認する。

:::note
* BOOT.bin (起動イメージ)
* image.ub (Linuxカーネルイメージ)
* boot.scr (起動スクリプト)
:::

![SnapCrab_NoName_2024-8-2_18-56-50_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818410/0dc73e3b-33ce-9390-f01f-73dc6ea4a84d.png)

## 4. SDカードへの書込み
SDカードをUbuntuマシンに接続し、dmesgで識別番号を確認する。ここでは"sdb"として作業を進める。管理者権限でfdiskコマンドを実行する。
```
sudo fdisk /dev/sdb
```
始めに"p"を入力し、既存パーティションを確認する。2つのパーティションがあることが分かる(ちなみに作成済の起動イメージが入っている)。これを削除するために"d"を入力しパーティション情報を削除する、これを2回行う(この段階ではまだ反映されていない)。
![SnapCrab_NoName_2024-8-2_19-4-51_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818410/a9467300-6b31-e68c-b43d-e872d1483638.png)

再度"p"を入力しパーティションが消えていることを確認し、"w"を入力して反映させる。ここで一旦fdiskが終了する。
![SnapCrab_NoName_2024-8-2_19-9-31_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818410/a23315c8-61c3-fb83-ab13-c16de3e793ac.png)

再度sudo fdisk /dev/sdbを実行する。今度は"n"で新たにパーティションを作成する。
* 1回目は基本的にはデフォルトでyes、Last Setorの所は+1Gとしておく。
* 2回目は全てデフォルト。空き領域が割り当てられる。
![SnapCrab_NoName_2024-8-2_19-20-2_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818410/f1364031-8791-0dd8-aceb-df1333cf64f8.png)

作成したら"w"を入力して反映させる。次に以下のコマンドで各パーティションにファイルシステムを作成する。
```
sudo mkfs.vfat -n ZYNQ_BOOT /dev/sdb1
sudo mkfs.ext4 /dev/sdb2 -L ROOT_FS
```
作成したファイルシステムにSDカードのイメージをコピーする。
```
sudo mkdir /mnt/sd1
sudo mount /dev/sdb1 /mnt/sd1
sudo cp ./images/linux/BOOT.BIN  /mnt/sd1
sudo cp ./images/linux/image.ub  /mnt/sd1
sudo cp ./images/linux/boot.scr  /mnt/sd1
sudo umount /mnt/sd1
```

## 5. Linuxの動作確認
※ Tera Term Proはインストール済であるとする。
### 5.1 ケーブルドライバのインストール
ZedBoardでシリアル通信を行うにはCypressのUSBドライバが必要となるが、CypressはInfenionに買収されており現在は[Infenionのページ](https://www.infineon.com/cms/jp/design-support/tools/sdk/usb-controllers-sdk/usb-serial-software-development-kit/)からUSBドライバをダウンロードすることになる。[Infenionのページ](https://www.infineon.com/cms/jp/design-support/tools/sdk/usb-controllers-sdk/usb-serial-software-development-kit/)に移動し、WindowsのUSB-Serial Windows Driver Installerをダウンロードし、インストールする。設定はデフォルトのままでOK。

### 5.2 ZedBoardとWindows PCの接続
ZedBoardに電源ケーブルとUSBケーブル、LANケーブルを接続する。USBのポートは幾つかあるが基板上に"J14"および"UART"書かれているポートに接続すること。またDigilentのロゴの上のジャンパが以下の写真のようになっていることを確認する。

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818410/7b3d5a48-c406-227f-0162-02e584e28f70.png)

![IMG_0401.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818410/dd44237b-52e3-61d1-d24c-12600d26f4f6.jpeg)

この状態で電源を入れデバイスマネージャを起動し、"ポート(COMとLPT)"を選択し、"USB Serial Port (COM8)"を右クリックして (番号は環境依存)プロパティを選択する。
![SnapCrab_NoName_2024-8-2_19-47-16_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818410/c289c5e8-af59-55a5-80ae-703081a51f02.png)

Port Settingsのタブをクリックし"Bits Per Seconds"115200にし、Advancedのボタンをクリック、以下のように設定する。

![SnapCrab_NoName_2024-8-2_19-39-37_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818410/cf71618a-2505-f670-ef86-fb39622087ed.png)

![SnapCrab_NoName_2024-8-2_19-39-28_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818410/6f7cef45-1bac-1445-4773-472fe4acb996.png)

以上で準備が整った。

### 5.3 Linuxの起動確認
SDカードをZedBoardのスロットに差し込み、電源をオンにする。次にTera Termを起動し、接続先を"シリアル"にする。
![SnapCrab_NoName_2024-8-2_19-54-0_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818410/a79049c5-909a-b1da-86bb-1bd0e09b4e55.png)

色々と起動ログが表示されLinuxの起動が完了する。必要最低限のコマンドした使えないがLinuxとして動作していることが分かる。

![SnapCrab_COM8 - Tera Term VT_2024-8-2_20-0-56_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818410/4c04e57d-6d00-6c3f-b3b8-f3091d7f8aef.png)

pingコマンドでWindowマシンとLAN経由でつながっていることも確認できる。

![SnapCrab_COM8 - Tera Term VT_2024-8-2_20-2-34_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818410/f8af0d21-be61-8ff6-181a-8cffe08b84c6.png)

以上で動作確認は終了。shutdown -h nowでシステムを停止し、電源をオフにする。

以降これをベースにしてZedBoardで動作するLinuxのカスタマイズを行っていく。

(終)