この記事のその後の更新情報とリソースは個人のホームページにあります。ここをクリックしてご覧ください。
序文
Zynq への Linux の移植は、私たちのような初心者にとって常に長年の問題でしたが、Petalinux の正式リリース後、この問題は軽減されました。ただし、Petalinux OS の操作の簡単さは、すでに成熟したデスクトップ システムである Ubuntu には及ばず、現在、インターネット上のほとんどのチュートリアルは、Petalinux を使用してデバイス ツリーとカーネルを生成し、Ubuntu の rootfs を置き換えることに焦点を当てています。実際、Vitis AI の誕生後、ザイリンクスは Zynq MPSoc 用に移植された Ubuntu を提供し、これをザイリンクス認定 Ubuntu と名付けました。このバージョンは、ほとんどのハードウェア インターフェイスを駆動できるゴールデン イメージです。ただし、PL 側で変更を加えて Linux で動作させたい場合は、デバイス ツリーとビットストリームを自分で再構築する必要があります。ザイリンクス認定 Ubuntu を利用することのその他の利点は次のとおりです。
- Linux 側で PL リソースを管理するための xlnx-config、fpga-manager-xlnx、bootgen-xlnx およびその他のツールのスナップ イメージを提供します。
- xlnx-config を使用して、構成されているさまざまなプラットフォーム リソース (PAC) の切り替えを実現し、再起動直後に有効になるブート イメージを自動的に生成します。
プログラミング エラーが原因でブートできないイメージの場合、再起動してブートに失敗した後、ゴールデン イメージにロールバックされます。 - もっと
この記事では、ザイリンクス認定 Ubuntu のインストール、カスタム ハードウェア プラットフォームの設計、カスタム プラットフォーム資産 (PAC) の構築、Linux 上でのハードウェア資産の切り替えをベア ボードから段階的に実装します。学習記録として、皆様のお役に立てれば幸いです。
ステップ 1: ザイリンクス認定 Ubuntu をインストールして起動する
Ubuntu 公式 Web サイトにアクセスしてファームウェアをダウンロードします: https://ubuntu.com/download/amd-xilinx
執筆時点での最新ファームウェアは20.04LTSです。以下では 20.04LTS を例に説明します。
SD カードをカード リーダーに挿入し、ダウンロードした .xz 圧縮パッケージを img に解凍し、イメージ書き込みツールを使用してダウンロードしたイメージを SD カードに書き込みます。(balenaEtcher が推奨され、すべてのオペレーティング システムに共通です)。
電源、USB-UART ケーブル、SD カード、モニター、キーボードを接続します。ZCU102 の SW6 スイッチを下図のように調整します (UG1182 公式ドキュメントより、特に公式ドキュメントのピンのシリアル番号が [1:4] ではなく [4:1] であることに注意してください...)長い間行き詰まって調整していました)
公式マニュアルからの行き方
実際の場所
UART をコンピュータに接続すると (CP210X シリアル ポート チップのドライバがインストールされている場合)、さらに 4 つのポートがあり、インターフェイス 0 が開いていることがわかります (ボー レート 115200、8 ビット データ、1 ビット ストップ、なしパリティ)、電源を入れて、シリアル ポート情報が出力されているかどうかを確認します。
すべてが正常であれば、Ubuntu システムが正常に起動していることがわかります。ユーザー名とパスワードは両方とも ubuntu です。
将来的に独自のハードウェア プラットフォームに置き換えることができるように、起動プロセスを注意深く分析しましょう。
起動時の
SDカード内のファイルは以下のとおりです。
- boot.bin (ボード識別およびイメージ選択 ImgSel)
- boot 10(2,4,6)1.bin (ZCU102/104/106 専用イメージ)
- boot.scr.uimg (Uboot)
- 画像.フィット
- メタデータ、ネットワーク構成、ユーザーデータ (Linux に必要なデータ)
ザイリンクスが起動すると、BootROM は最初にデバイス モード ピンの状態を検出します。SD カードが起動すると、SD カードの最初のパーティションに boot.bin があるかどうか検索します。ない場合は、後ろに番号を追加します。 boot1.bin、boot2.bin...を検索します。boot8191.bin までは、このモードはマルチブートと呼ばれます。Certified Ubuntu では、boot.bin は、どのボードで実行されているかを判断し、実行のためにブート プロセスをより強力な FSBL に渡すために使用される最小限のアプリケーション (ImgSel) です。この例では、ImgSel が 102 ボードを検出し、MultiBoot レジスタに 1020 を書き込み、BootROM が boot1020.bin から開始し、最後に boot1021.bin (ZCU102 用に設計されたゴールデン イメージ) を見つけて開始します。イメージ管理のための上記の xlnx-config の使用は、基本的に boot1020.bin をパッケージ化して SD カードに書き込むことです。boot1020.bin が失敗すると、ゴールデン イメージの boot1021.bin に自動的にロールバックされます。
具体的な起動方法は右図を参照してください(参考文献[2]より)
ステップ 2 Vivado を使用して独自のハードウェア プラットフォームを作成する
Vivado を開き、ZCU102 ボードを選択し、ブロック デザインを作成します。
Zynq コアを追加し、最初にブロック オートメーションを実行し、ポップアップ ウィンドウで [Apply Board Preset] を選択すると、後で多くの内容を保存できます。
開発ボードの読み取りおよび書き込みピンをテストするための AXI GPIO と、BRAM テストのための AXI BRAM コントローラーを追加します。
ブロック デザインの生成 -> bd を右クリック -> HDL ラッパー
書き込み制約
の作成 ビットストリーム
ファイルの生成 -> ハードウェアのエクスポート xsa のエクスポート
Vitis を開き、新しいプラットフォーム プロジェクトを作成し、エクスポートした xsa を選択します。
プラットフォームプロジェクトを構築する
ビルド ビルド
が成功したら、以下の2つのファイルを取り出します
/zynqmp_fsbl/fsbl_a53.elf
/zynqmp_pmufw/pmufw.elf
次に、デバイスツリーをエクスポートします。
この操作を初めて実行する場合は、任意の場所でザイリンクスのデバイス ツリー ジェネレーターをプルする必要があります。そうしないと、エラーが報告されます。
git clone https://github.com/Xilinx/device-tree-xlnx
cd device-tree-xlnx
git checkout <你的套件版本,如xlnx_rel_v2021.2>
Vitis で、[Xilinx] -> [Software Repositories] を選択し、先ほどプルしたウェアハウスのローカル フォルダー アドレスを追加します。
次に、[Xilinx] -> [Generate Device Tree] を選択し、[xsa] を選択して、エクスポート フォルダーを構成します。
生成されたファイルを図に示します。XSA ファイルにはユーザー定義の IP と Zynq のみが含まれるため、イーサネット ネットワークをアクティブにするには、デバイス ツリーを自分で作成し、その中の system-top.dts を変更して、 Ethernet の PHY (ピットを踏む*n) と、Uboot/Ubuntu がハードウェア開発ボード情報を正しく識別してドライバーをロードできるように、モデルと互換性のあるフィールドを追加することも必要です (再びピットを踏む)。(参考: https://github.com/Xilinx/u-boot-xlnx/blob/3113b53d8cb1913ef8162cadf45f44ebf2ed9eea/arch/arm/dts/zynqmp-zcu102-revA.dts)
/dts-v1/;
#include "zynqmp.dtsi"
#include "zynqmp-clk-ccf.dtsi"
#include "pl.dtsi"
#include "pcw.dtsi"
/ {
model = "ZynqMP ZCU102 Rev1.1";
compatible = "xlnx,zynqmp-zcu102-rev1.1", "xlnx,zynqmp-zcu102", "xlnx,zynqmp";
chosen {
bootargs = "earlycon";
stdout-path = "serial0:115200n8";
};
aliases {
ethernet0 = &gem3;
i2c0 = &i2c0;
i2c1 = &i2c1;
serial0 = &uart0;
serial1 = &uart1;
spi0 = &qspi;
};
memory {
device_type = "memory";
reg = <0x0 0x0 0x0 0x7ff00000>, <0x00000008 0x00000000 0x0 0x80000000>;
};
};
&gem3 {
status = "okay";
phy-handle = <&phy0>;
phy-mode = "rgmii-id";
pinctrl-names = "default";
phy0: ethernet-phy@c {
reg = <0xc>;
ti,rx-internal-delay = <0x8>;
ti,tx-internal-delay = <0xa>;
ti,fifo-depth = <0x1>;
ti,dp83867-rxctrl-strap-quirk;
/* reset-gpios = <&tca6416_u97 6 GPIO_ACTIVE_LOW>; */
};
};
次に、デバイス ツリー BLOB ファイル (DTB) をコンパイルし、生成されたデバイス ツリー ディレクトリに入ります。この手順は Linux システムで実行する必要があります。
gcc -I my_dts -E -nostdinc -undef -D__DTS__ -x assembler-with-cpp -o system-top.dts.tmp system-top.dts
dtc -I dts -O dtb -o system-top.dtb system-top.dts.tmp
ここまでで、フォルダー内にデバイスツリーファイルsystem-top.dtbが表示されるので保存します。
次に、ARM Trusted Firmware (ATF) をコンパイルします。
git clone https://github.com/Xilinx/arm-trusted-firmware.git
cd arm-trusted-firmware
このリポジトリには Linux ライブラリへのソフト リンクがあります。エラーが発生した場合は、ソフト リンクを削除して自分で再構築する必要があります。どのリンクであるか忘れました。。加工後
make CROSS_COMPILE=aarch64-none-elf- PLAT=zynqmp RESET_TO_BL31=1
クロスコンパイルを実行するには、コンパイル後に bl31.elf が生成され、保存されます。
これで、次のファイルができました。
)
Vivado によって生成された PL ビットストリームをここに保存し、system.bit という名前を付けます。次に、次の内容を含む bootgen.bif という名前の新しいファイルを作成します。
the_ROM_image:
{
[bootloader, destination_cpu=a53-0] fsbl_a53.elf
[pmufw_image] pmufw.elf
[destination_device=pl] system.bit
[destination_cpu=a53-0, exception_level=el-3, trustzone] bl31.elf
[destination_cpu=a53-0, load=0x00100000] system-top.dtb
[destination_cpu=a53-0, exception_level=el-2] /usr/lib/u-boot/xilinx_zynqmp_virt/u-boot.elf
}
これらのファイルの意味については、Xilinx Wiki に対応する説明があります。
bootgen.bif | boot.binを生成するための記述ファイル |
fsbl_a53.elf | 第 1 段階のブートローダー |
システムビット | PLのビットストリームファイル |
bl31.エルフ | ARM の信頼できるファームウェア |
システムトップ.dtb | デバイスツリーファイルはsystem.bitに対応する必要があります |
uboot.elf | u-boot ファイル (ZCU102 の場合) は、認定 Ubuntu システムで /usr/lib/u-boot/xilinx_zynqmp_virt/u-boot.elf を直接使用できます。 |
dpu.xclbin | (オプション) system.bit の DPU 構成 |
pmufw.elf | プラットフォーム管理ユニット (PMU) ファームウェア |
これまでに多くのことを述べてきましたが、新しいハードウェア プラットフォームを置き換えるときは、system.bit、system-top.dtb、dpu.xclbin、およびその他のビルドが一度だけ完了することを考慮するだけで済みます。
または、ビルドしたくない場合は、fsbl および bl31 の場合、認定 Ubuntu のゴールデン イメージを使用できます。ストレージ パスは次のとおりです。
/usr/share/xlnx-firmware/zcu10[x]
次に、xlnx-config ツールの要件に従って、上記のファイルを次のように保存します (test_pac フォルダーは /boot/firmware/xlnx-config に保存されます。/boot/firmware は SD カードのマウント ポイントであるため、 SD カード上で直接操作することもできます)
test_pac/
└── hwconfig
├── test_pac
│ ├── manifest.yaml
│ ├── zcu102
│ │ ├── bl31.elf
│ │ ├── bootgen.bif
│ │ ├── fsbl_a53.elf
│ │ ├── pmufw.elf
│ │ ├── system.bit
│ │ └── system-top.dtb
マニフェスト.yaml は次のとおりです。
name: test_platform
desscription: Boot assets for the 2021.2 test design
revision: 1
assets:
zcu102: zcu102
ステップ 3 カスタム ハードウェア プラットフォーム (PAC) をアクティブ化する
まず、Xilinx 公式ツール xlnx-config をインストールする必要があります (スナップ プルの失敗率はかなり高いです。)
sudo snap install xlnx-config --classic --channel=1.x
xlnx-config.sysinit
スナップがない場合は、まずスナップをインストールしてから上記の操作を実行してください
sudo snap install snap-store
インストールが完了したら、「xlnx-config -q」と入力して、セットアップしたばかりのカスタム ハードウェア プラットフォームを確認します。
sudo xlnx-config -a test_pac を使用して、セットアップしたばかりのプラットフォームをアクティブにします。ツールは自動的に boot.bin にパッケージ化され、boot1020.bin という名前の SD カードに置かれます。再起動後に有効になります。
再起動後、xlnx-config -q を使用してアクティブ化された資産を表示できます。
参考
[1] ザイリンクス デバイス向け認定 Ubuntu 20.04 LTS のスタートガイド
[2] ザイリンクス デバイス用の認定済み Ubuntu 20.04 LTS のブート
[3] ARM Trusted Firmware (ATF) の構築
[4] スナップ – ザイリンクス デバイス上の認定 Ubuntu 用の xlnx-config スナップ
[5] ザイリンクス/embeddedsw
[6] ザイリンクス/linux-xlnx
[7] デバイスツリー
[8] ソリューション ZynqMP PL プログラミング
[9] Zynq Ultrascale および Zynq 7000 の Devicetree Generator からの Devicetree の作成
[10] ザイリンクス/u-boot-xlnx