PetaLinux®のflashcp機能を使用したSDカードからQSPIへのBOOTファイル書き込み方法
はじめに
今回は、AMD社のZynq® UltraScale+™ MPSoCのPetaLinux flashcp機能を利用して、SDカードからSTANDALONE BOOTファイルをQSPIへ書き込む方法を紹介します。
この方法のメリットは、「書き込み手順が簡単であること」と、「JTAG経由のQSPI書き込みよりも遥かに速いこと」です。
前提条件
- Zynq® UltraScale+™ MPSoCのSTANDALONE BOOT用QSPIデータ作成済み
- 基板にSDカードスロットが存在すること
使用ツール
- Vivado™ 2022.2
- PetaLinux® 2022.2
書き込みツールが含めたPETALINUX SD BOOT IMGの作成
XSAファイルを生成
PetaLinux起動用Vivado projectを作成し、XSAファイルを生成します。下図のように書き込み基板に合わせたPS部分(最低限SD、QSPIの設定が必要)を設定します。既存デザインがあれば、既存デザインのPL部分を削除し、PS部分だけを残す方法は一番手軽だと思います。
(出典:AMD社 Vivado™ 2022.2)
Generate Bitstreamでコンパイルした後、File → Export → Export HardwareでXSAファイルを生成します。
(出典:AMD社 Vivado™ 2022.2)
PETALINUX PROJECTを作成
PetaLinuxの環境で以下のコマンドを実行し、XSAファイルを使用してPETALINUX PROJECTを作成します。
$ petalinux-create -t project -n test --template zynqMP
$ cd test
$ petalinux-config --get-hw-description=./ --silentconfig
DEVICE TREE編集
作成したPETALINUX PROJECTのDEVICE TREEを編集します。
/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsiを開いて、以下の内容を追加します。
/include/ "system-conf.dtsi"
/ {
chosen {
bootargs = "quiet earlycon console=ttyPS1,115200 clk_ignore_unused root=/dev/ram0 rw";
};
};
/* SDIO */
&sdhci0 {
status = "okay";
disable-wp;
no-1-8-v;
};
/* SDIO */
&sdhci1 {
status = "okay";
disable-wp;
no-1-8-v;
};
/* QSPI */
&qspi {
#address-cells = <1>;
#size-cells = <0>;
status = "okay";
is-dual = <1>;
num-cs = <1>;
xlnx,fb-clk = <0x1>;
xlnx,qspi-mode = <0x1>;
flash0: flash@0 {
compatible = "jedec,spi-nor";
spi-tx-bus-width = <1>;
spi-rx-bus-width = <1>;
spi-max-frequency = <40000000>;
reg = <0x0>;
#address-cells = <1>;
#size-cells = <1>;
};
};
BUILD
$ petalinux-build コマンドでBUILDします。
$ petalinux-build
(出典:シリアルコンソール画面)
SD BOOTファイル生成
以下のコマンドを使用して、SD BOOTファイルを生成します。
$ petalinux-package --boot --fsbl ./images/linux/zynqmp_fsbl.elf --u-boot ./images/linux/u-boot.elf --pmufw ./images/linux/pmufw.elf --fpga ./images/linux/system.bit –force
(出典:シリアルコンソール画面)
BOOT SDの用意
以下のファイルをSDにCOPYし、BOOT SDの用意が完了です。
$ mkdir BootSD
$ cp -f ./images/linux/BOOT.BIN ./BootSD/
$ cp -f ./images/linux/boot.scr ./BootSD/
$ cp -f ./images/linux/image.ub ./BootSD/
- #注:
- 別途用意したQSPI書き込み用のDATAのファイル名を重複しないようにBOOT_QSPI.BINにして、SDに保存します。
SDからQSPIへ書き込み
SDからBOOT
基板をSDBOOTモードに設定し、SDからBOOTします。
Login:名はpetalinuxです。
(出典:シリアルコンソール画面)
- #注:
- 上図は、文字列までが読み取れる解像度ではありませんが、起動時のログ出力のイメージをお伝えするために
掲載しています。
コマンドでQSPIへ書き込み
以下のコマンドでQSPIへ書き込みします。
flashcp -v /run/media/mmcblk1p1/BOOT_QSPI.BIN /dev/mtd0
(出典:シリアルコンソール画面)
すると、権限がないと言われました。(前はこれで書き込めたのに…)
そういえば、PetaLinux2022.1からrootが無効になった話を思い出しました。
改めて$petalinux-config -c rootfs コマンドでImage Features→* debug-tweaksと* auto-loginを有効にします。
$petalinux-config -c rootfs
(出典:シリアルコンソール画面)
BUILD~BOOT SDの用意の流れをもう一度実行し、今度は、ROOTで自動LOGINした画面が表示されました。
(出典:シリアルコンソール画面)
もう一度、以下のコマンドでQSPIへ書き込みします。
flashcp -v /run/media/mmcblk1p1/BOOT_QSPI.BIN /dev/mtd0
(出典:シリアルコンソール画面)
約20秒で書き込み完了しました。
(出典:ストップウォッチツール)
- #注:
- BOOT_QSPI.BINのサイズにより、QSPIのPARTITIONを調整する必要な場合があります。
調整方法については、別途ブログを掲載する予定です。
参考
Vivado JTAGで書き込みする場合、時間が15min30secかかりました。
(出典:AMD社 Vivado™ 2022.2)
(出典:AMD社 Vivado™ 2022.2)
おわりに
いかがでしたでしょうか。
以上の工程でPetaLinuxのflashcpでQSPI用BOOTデータの書き込みができました。
弊社ではFPGA設計や回路図設計、レイアウト設計、ソフトウェア設計、筐体設計などを受託開発しています。
サービス内容をWEBサイトに掲載していますので、ぜひご覧ください。
FPGAの活用に際して設計検討などありましたら、お気軽にお問い合わせください。
最後までご覧いただきありがとうございました。
このブログは「FPGA設計ブログ一覧」の
5. プログラミング(FPGAへの書き込み)の
ひとつです。