Zynq® UltraScale+™ MPSoCにおける U-bootを使ってeMMCデバイスを書き込む方法(SD Card編)

以前のブログでは、ZYNQ® UltraScale+™ MPSoCのeMMCデバイスからPetaLinuxをBOOTするとき、U-bootを使ってeMMCデバイスを書き込む方法を JTAG編 と TFTP編 にわけて紹介しました。
JTAGとTFTP使用する場合、Vivado® Design Suite などの開発環境が必要になりますが、今回は書き込み時に、開発環境に依存しないSD Card経由のeMMC書き込み方法を紹介したいと思います。
前提条件
ボードにSD Card SLOTが存在すること。
*Vivado®のFPGA設計方法及びPetaLinuxのBuild方法はここでは割愛し、eMMCデバイスの書き込み手順を説明します。
このブログは「FPGA設計ブログ一覧」の
5. プログラミング(FPGAへの書き込み)の
ひとつです。
目次
必要機材
必要機材は以下の通りです。
- ・Zynq® UltraScale+™ MPSoC搭載基板一式
- ・Uart cable
Zynq® UltraScale+™ MPSoC搭載基板
例:「So-One KIT」
So-One KITは、Carrier BoardにPALTEKで開発した組み込みFPGAエッジコンピューティング「So-Oneモジュール」を搭載した2段構成となっているオリジナルFPGA評価ボードです。
https://www.paltek.co.jp/design/original/so-one/index.html
書き込み手順
以下4つのSTEPになります。
STEP 1Creating a Xilinx bootable image
STEP 2Creating the emmc.img
STEP 3Programming the emmc.img on the eMMC device
STEP 4Boot Linux from the eMMC device
書き込みの詳細コマンド:
各STEPの手順、特にeMMC書き込みの詳細手順は以下の通りになります。
STEP 1 Creating a Xilinx bootable image(前提条件)
Vivado® Design SuiteとPetaLinuxでSD boot用 BOOT.bin、BOOT.scr と Image.ubを生成します。
このSTEPは前提条件として、詳しい説明はここでは割愛いたします。
手順は
(UG1137) Zynq UltraScale+ MPSoCソフトウェア開発者向けガイドをご参照ください。
STEP 2 Creating the emmc.img
LINUX HOST PCを用いて、STEP1で生成したBOOT.bin と Image.ubから、eMMC書き込みIMGを生成します。
LINUX HOSTから下記のコマンドを実行します。
dd if=/dev/zero of=emmc.img bs=512 count=65536
sudo parted emmc.img mktable msdos
sudo parted emmc.img mkpart p fat32 0% 100%
sudo kpartx -a emmc.img
sudo mkfs.vfat /dev/mapper/loop0p1
sudo mount /dev/mapper/loop0p1 /mnt/sata/
sudo cp BOOT.bin /mnt/sata/BOOT.bin
sudo umount /dev/mapper/loop0p1
sudo kpartx -d emmc.img
これで、eMMCの書き込みIMGファイル、emmc.imgが生成されます。
*emmc.imgファイルをSD cardのbootパーティションにCOPYします
STEP 3 Programming the emmc.img on the eMMC device
3-1) PCと基板間Uart cableを接続して、Tera Termなどの端末を立ち上げます
#Tera Termは基板とPCの環境に合わせて設定します
3-2) Boot in SD boot mode (Mode Pins[3:0] = 0x5)
3-3) SD Cardを挿入します
3-4) 電源を投入し、SDからbootします
以下のように、Tera Term の画面に Hit any key to stop autoboot:が表示されたら、PCの任意のキーを押しAUTOBOOTを止めて、U-bootに入ります
Hit any key to stop autoboot: 0
ZynqMP>
3-5) mmc listコマンドでmmcデバイスを確認します
ZynqMP> mmc list
mmc@ff160000: 0 (SD)
mmc@ff170000: 1 (eMMC)
3-6) mmc devコマンドでmmcデバイスとしてSDを選択します
ZynqMP> mmc dev 0
switch to partitions #0, OK
mmc0 is current device
3-7) fatlsコマンドでファイルを確認します
ZynqMP> fatls mmc 0:1
xxxx image.ub
xxxx boot.scr
xxxx emmc.img
xxxx BOOT.BIN
#xxxx sizeはデザイン依存します。
3-8) fatloadコマンドでファイルをDDRに転送します。
ZynqMP> fatload mmc 0:1 8000 BOOT_QSPI.BIN
xxxx bytes read in 4195 ms (14.9 MiB/s)
3-9) mmc devコマンドでmmcデバイスとしてemmcを選択します
ZynqMP> mmc dev 1
switch to partitions #1, OK
mmc1 is current device
3-10) mmc writeコマンドでmmcデバイスを書き込みします
mmc write 8000 0 10000
Note: The First entry is the address, the last entry is $filesize/512
STEP 4 Boot Linux from the eMMC device
4-1) 基板の電源をOFFにし。基板の起動モードをeMMC起動に設定します
#SWの位置は基板依存ですが、ZYNQ® UltraScale+™ MPSoCデバイスのboot mode は(Mode Pins[3:0] = 0x6))になるよう設定します
4-2) 基板の電源をONにすると基板がeMMCからbootします
#SD Card SLOTがあるボードなら、この方法をおすすめします。
#SD Cardがないボードの場合、前に紹介したxsdb経由もしくは (TFTP経由) の方法でeMMCの書き込みは可能です。
おわりに
いかがでしたでしょうか?
これで、基板のeMMC bootができるようになります。
今まで3つの方法を紹介しました。上記手順のSD cardの方法は一番環境依存の少ないシンプルな方法になります。
このブログは「FPGA設計ブログ一覧」の
5. プログラミング(FPGAへの書き込み)の
ひとつです。
最後までご覧いただきましてありがとうございました。