【EBAZ4205+Vivado2023.2】 ♯* WSL2上のUbuntuでPetaLinux2023.2のビルド環境を構築してみる

Aliexpressにて激安で販売されている、Zync-7000(xc7z010clg400-1)を搭載したマイニング用ボード「EABZ4205」向けにAMD(Xilinx)の公式Linux環境であるPetaLinuxを動かした記録です。
ネット上の記事ではVivado(Vitis)のバージョンが古い(2020.1が多い)ものが多いこともあり、比較的新しい2023.2を使ってWindows11のWSL2+Ubuntuでビルドしたのですが、[※1: Xilinxの公式ドキュメント(UG114)](https://docs.amd.com/r/2023.2-English/ug1144-petalinux-tools-reference-guide/Overview)通りではエラーが出まくってかなり苦戦したので、記録に残しておきます。

EBAZ4205については、参考リンク [※2](https://qiita.com/kan573/items/e951a0b2e26e19372800
)を参照してください。

## WSL2でのPetaLinux環境の構築

### 開発環境
* Windows11 Pro 24H2
* WSL v2.3.26.0

### Windows11にWSL2をインストールする

以下の記事を参考にさせていただきました。
[Windows 11にWSL2をインストールする](https://qiita.com/SAITO_Keita/items/148f794a5b358e5cb87b)

Windows Power Shell を**管理者権限**で起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/9ebd96ba-92e1-caf9-64a4-710d16e9928d.png)

起動したら、以下のコマンドでWSL2をインストールします。
```
PS C:\Users\***> WSL --install
```
インストールが完了したら、システムを再起動します。
標準のインストールでは、規定のUbuntuのバージョンがインストールされます。
PetaLinux2023.2がサポートするOSのバージョンをユーザーガイド(UG1144)で確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/da79effc-cefd-ee1a-e77f-4b344cb2cadf.png)

WSL2でインストールできるディストリビューションをPower Shellで確認します。

```
PS C:\Users\***> WSL --list --online
インストールできる有効なディストリビューションの一覧を次に示します。
'wsl.exe --install <Distro>' を使用してインストールします。

NAME                            FRIENDLY NAME
Ubuntu                          Ubuntu
Debian                          Debian GNU/Linux
kali-linux                      Kali Linux Rolling
Ubuntu-18.04                    Ubuntu 18.04 LTS
Ubuntu-20.04                    Ubuntu 20.04 LTS
Ubuntu-22.04                    Ubuntu 22.04 LTS
Ubuntu-24.04                    Ubuntu 24.04 LTS
OracleLinux_7_9                 Oracle Linux 7.9
OracleLinux_8_7                 Oracle Linux 8.7
OracleLinux_9_1                 Oracle Linux 9.1
openSUSE-Leap-15.6              openSUSE Leap 15.6
SUSE-Linux-Enterprise-15-SP5    SUSE Linux Enterprise 15 SP5
SUSE-Linux-Enterprise-15-SP6    SUSE Linux Enterprise 15 SP6
openSUSE-Tumbleweed             openSUSE Tumbleweed
```
今回は、サポートしているUbuntuのバージョンで最新の"Ubuntu-22.04"を追加でインストールします。

```
PS C:\Users\***> wsl --install Ubuntu-22.04
```
インストールが終わったら、PoWER Shellでインストールされているディストリビューションを確認します。

```
PS C:\Users\***> WSL --list
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu (既定)
Ubuntu-24.04
Ubuntu-22.04
```

以下のコマンドで規定のバージョンを22.04に変更します。

```
PS C:\Users\***> wsl --set-default ubuntu-22.04
この操作を正しく終了しました。
PS C:\Users\***> WSL --list
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu-22.04 (既定)
Ubuntu-24.04
Ubuntu
```

### PetaLinuxをインストールする

PetaLinux2023.2のインストーラを以下からダウンロードします。

https://japan.xilinx.com/support/download/index.html/content/xilinx/ja/downloadNav/embedded-design-tools/2023-2.html

ダウンロードページのリンク[製品アップデートのリリース ノートおよび既知の問題](https://adaptivesupport.amd.com/s/article/000035572?language=ja)を開きます。

最下段のリンクからUbuntu22.04での必要なパッケージリストが記載されたエクセルをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/444b567a-1bdb-79e9-bf1b-a08b2c4d75ee.png)

このファイルの"Ubuntu Desktop/Server 64-bit"に記載された部分が必要なパッケージです。

Ubuntu22.04を起動必要なパッケージをインストールします。
Ubuntu22.04では"python"は廃止され”python2"に名称が変わっているので、以下のように修正して実行します。
~~~PetaLinux_2023.2_OS_Package_List.xlsx
~$ sudo apt-get install iproute2 gawk python3 python2 build-essential gcc git make net-tools libncurses5-dev tftpd zlib1g-dev libssl-dev flex bison libselinux1 gnupg wget git-core diffstat chrpath socat xterm autoconf libtool tar unzip texinfo zlib1g-dev gcc-multilib automake zlib1g:i386 screen pax gzip cpio python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev pylint
~~~

PetaLinux SDKのインストールで"python"(python2)を呼び出しますので、シンボリックリンクを作成します。
~~~
~$ sudo ln -s /usr/bin/python2 /usr/bin/python
~~~

今回はPetaLinuxのインストーラを"~/Downloads/"に置き、 PetaLinuxを "~/petalinux2023.2/"にインストールします。
~~~
~/petalinux2023.2$ ../Downloads/petalinux-v2023.2-10121855-installer.run
~~~

PetaLinuxを実行するための設定ファイルを読み込みます。
~~~
~/petalinux2023.2$ source settings.sh
~~~

毎回起動時に設定ファイルを読み込む場合は、同じ内容を.bashrcに追記します。
~~~.bashrc
~/petalinux2023.2$ vi ~/.bashrc

//末尾に以下を追加
source ~/petalinux2023.2/settings.sh
~~~

#### EBAZ4205用のプロジェクトの作成

テンプレートから空のプロジェクトを作成します。
~~~
~/petalinux2023.2$ petalinux-create --type project --template zynq --name ebaz4205
~/petalinux2023.2$ cd ebaz4205/
~/petalinux2023.2/ebaz4205$
~~~

Vivadoからエクスポートしたハードウエア情報(ebaz4205_wrapper.xsa)を読み込みます。
~~~
~/petalinux2023.2/ebaz4205$ cp /mnt/c/Users/tomor/Downloads/ebaz4205_wrapper.xsa ../
~/petalinux2023.2/ebaz4205$ petalinux-config --get-hw-description ../ebaz4205_wrapper.xsa  
~~~

筆者の環境ではここで以下のエラーが出ましたので、追加のパッケージをインストールして対応しました。

* "en_US.utf8がない"というエラーになった場合
以下の言語パックを追加インストールします。ついでに日本語も追加しておきます。
~~~
~/petalinux2023.2/ebaz4205$ sudo apt install language-pack-ja -y
~/petalinux2023.2/ebaz4205$ sudo apt install language-pack-en -y
~~~

* "[INFO] Generating Kconfig for project"でエラーになった場合
以下の"libtinfo5"をインストールします。
~~~
~/petalinux2023.2/ebaz4205$ sudo apt-get install libtinfo5
~~~

### PetaLinux System Configuration
メニューが出るので、u-bootでFIT イメージ(image.ub)を読み込むアドレスを修正します。
デフォルト値
* imageub_addr=0x10000000

これは、EBAZ4205 に搭載された DDR3 のアドレス範囲(0x0000_0000～0x1000_0000)を超えていますので、正しく読み込めるアドレス
* imageub_addr=0x01000000

に変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/4936d52f-756b-702a-bc27-4b6e81ce6c96.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/7d830686-8792-c903-5692-a3f5762f3c22.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/8ec96c26-ec5f-dd3d-18c6-6f1b4d0f06e6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/3a09cee6-ae5b-d500-a68f-b14e2b7431b6.png)


### PetaLinuxをビルドする

[UG1144](https://docs.amd.com/r/2023.2-English/ug1144-petalinux-tools-reference-guide/Overview)の手順では、デバイスツリーの記載にtypoがありエラーでビルドができませんので、[wavelet2氏のEBAZ4205リポジトリの2023.1ブランチ](https://github.com/wavelet2/EBAZ4205/blob/2023.1/docs/how-to-build.md)を参考に作業をしていきます。

デフォルトでは"system_conf.dtsi"にtypoがあるので、まずデバイスツリーをビルドします。
~~~
~/petalinux2023.2/ebaz4205$ petalinux-build -c device-tree -x do_configure
~~~

以下のファイルの18行目を'ps7_nand_0'から'nfc0'に変更します。
* components/plnx_workspace/device-tree/device-tree/system-conf.dtsi
~~~system-conf.dtsi
/*
 * CAUTION: This file is automatically generated by PetaLinux SDK.
 * DO NOT modify this file
 */

/ {
chosen {
    bootargs = "console=ttyPS0,115200 earlycon root=/dev/ram0 rw";
    stdout-path = "serial0:115200n8";
    };
};

&gem0 {
    local-mac-address = [00 0a 35 00 1e 53];
};

/*&ps7_nand_0 {*/
&nfc0 {
    nand@0 {
        partition@0 {
            label = "nand-boot";
            reg = <0x0 0x00000000 0x00500000>;
        };
        partition@1 {
            label = "nand-kernel";
            reg = <0x0 0x00500000 0x00a80000>;
        };
        partition@2 {
            label = "nand-bootenv";
            reg = <0x0 0x00f80000 0x00020000>;
        };
        partition@3 {
            label = "nand-device-tree";
            reg = <0x0 0x00fa0000 0x00400000>;
        };
        partition@4 {
            label = "nand-rootfs";
            reg = <0x0 0x013a0000 0x03c00000>;
        };
    };
};
~~~

修正が終わったら、PetaLinuxをビルドします。ビルドには数時間かかりますので気長に待ちます。
~~~
~/petalinux2023.2/ebaz4205$ petalinux-build
~~~

BOOT.BIN作成用のシェルスクリプトを作成し、プロジェクトディレクトリ(~/petalinux2023.2/ebaz4205$)に保存します。
~~~make_BOOT.BIN.sh
#!/bin/bash -eu
petalinux-package --boot --force --fsbl ./images/linux/zynq_fsbl.elf --fpga ./project-spec/hw-description/ebaz4205_wrapper.bit --u-boot
~~~

シエルスクリプトを実行しBOOT.BINを作成します。
~~~
~/petalinux2023.2/ebaz4205$ ./make_BOOT.BIN.sh
[INFO] Sourcing buildtools
INFO: File in BOOT BIN: "/petalinux2023.2/ebaz4205/images/linux/zynq_fsbl.elf"
INFO: File in BOOT BIN: "/petalinux2023.2/ebaz4205/project-spec/hw-description/ebaz4205_wrapper.bit"
INFO: File in BOOT BIN: "/petalinux2023.2/ebaz4205/images/linux/u-boot.elf"
INFO: File in BOOT BIN: "/petalinux2023.2/ebaz4205/images/linux/system.dtb"
INFO: Generating zynq binary package BOOT.BIN...

****** Bootgen v2023.2
  **** Build date : Sep  4 2023-15:57:12
    ** Copyright 1986-2022 Xilinx, Inc. All Rights Reserved.
    ** Copyright 2022-2023 Advanced Micro Devices, Inc. All Rights Reserved.

[INFO]   : Bootimage generated successfully

INFO: Binary is ready.
~~~~

~/petalinux2023.2/ebaz4205/images/Linux/ の下に起動用ブートイメージが生成されますので、
* BOOT.BIN
* boot.scr
* image.ub

の3個のファイルをSDカードにコピーします。

~~~
~/petalinux2023.2/ebaz4205/images/linux$ cp BOOT.BIN boot.scr image.ub /mnt/c/Users/*****/Downloads/
~~~

EBAZ4205をSDカードをからブートします。

筆者の環境では、u-bootを実行したところでFATの環境変数が設定されていないというエラーが出ましたので、以下のコマンドを実行し環境変数をFATファイルシステム(SDカード)に保存しました
~~~
Zynq> saveenv
~~~

リセットして再起動したら、u-bootのプロンプトで停止しましたが、"boot"と入力してPetaLinuxをブートできました。
~~~
U-Boot 2023.01 (Sep 21 2023 - 11:02:37 +0000)

CPU:   Zynq 7z010
Silicon: v3.1
DRAM:  ECC disabled 256 MiB
Core:  24 devices, 16 uclasses, devicetree: board
Flash: 0 Bytes
NAND:  0 MiB
MMC:   mmc@e0100000: 0
Loading Environment from FAT... OK
In:    serial@e0001000
Out:   serial@e0001000
Err:   serial@e0001000
Net:
ZYNQ GEM: e000b000, mdio bus e000b000, phyaddr 0, interface gmii
eth0: ethernet@e000b000
Hit any key to stop autoboot:  0
Zynq> boot
~~~

正常にブートすると、ログインのプロンプトが出ます。
ttyPS0経由では、rootログインできません。以下のユーザーが設定されていますのでこれでログインします。
* ユーザー: petalinux
* 新規パスワードの設定が要求されるので入力してログイン
~~~
PetaLinux 2023.2+release-S10121051 ebaz4205 ttyPS0

ebaz4205 login: petalinux
You are required to change your password immediately (administrator enforced).
New password:
Retype new password:
ebaz4205:~$
~~~

# 参考リンク
※1: PetaLinux ツール資料: リファレンス ガイド (UG1144) 2023.2
https://docs.amd.com/r/2023.2-English/ug1144-petalinux-tools-reference-guide/Overview

※2: 1500円の ZYNQ 基板を買ってみた (EBAZ4205, ANTMINER)
https://qiita.com/kan573/items/e951a0b2e26e19372800

※3: Windows 11にWSL2をインストールする
https://qiita.com/SAITO_Keita/items/148f794a5b358e5cb87b

※4: wavelet2氏のEBAZ4205リポジトリの2023.1ブランチ
https://github.com/wavelet2/EBAZ4205/blob/2023.1/docs/how-to-build.md