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

はじめに
皆さんこんにちは。
前回 Zynq® UltraScale+™ MPSoCにおいて、eMMCデバイスからPetaLinuxツールをBOOTするとき、U-bootを使ってeMMCデバイスを書き込む方法の備忘録を紹介しました。
*前回のTECHブログは コチラからご覧いただけます。
前回の方法はJTAG経由でIMGファイルを転送するために、時間がかかりました。(約20Mのファイルは、30分以上かかりました。)
さて、今回は高速のTFTPを利用する方法を紹介したいと思います。
- 前提条件
- Vivado® Design Suite のFPGA設計方法及びPetaLinuxのBuild方法はここでは割愛し、TFTPサーバーの構築方法とeMMCデバイスの書き込み手順を説明します。
必要機材
- Zynq® UltraScale+™ MPSoC搭載基板一式
- LINUX HOST PC
- プラットフォーム ケーブル USB II(Xilinx社)
- Uart cable
- LAN cable(必要に応じて、SWICH HUBやDHCP環境)
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
TFTPサーバーの構築手順(例)
sudo mkdir /tftpboot
sudo chmod -R 777 /tftpboot
sudo chown -R nobody /tftpboot
sudo nano /etc/xinetd.d/tftp
下記の内容をtftpファイルにcopyして保存します。
**********************
service tftp
{
protocol = udp
port = 69
socket_type = dgram
wait = yes
user = nobody
server = /usr/sbin/in.tftpd
server_args = /tftpboot
disable = no
}
**********************
$ sudo yum install -y tftp-server
$ sudo firewall-cmd --add-service=tftp --permanent
$ sudo firewall-cmd --reload
$ sudo systemctl enable tftp
$ sudo systemctl restart tftp
これでTFTPサーバーの構築が完了です。
書き込み手順
下記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でBOOT.bin と Image.ub.を生成します。
このSTEPは前提条件として、詳しい説明はここでは割愛いたします。
手順は (UG1137) Zynq® UltraScale+™ MPSoC Software Developer Guide.をご参照ください。
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が生成されます。
STEP 3 Programming the emmc.img on the eMMC device
3-1)Xilinx🄬 Platform cable USB とUart cableを接続します。
3-2) Boot in JTAG boot mode (Mode Pins[3:0] = 0x0)
3-3) Using XSDB to download u-boot and emmc.img
XSDBで下記のコマンドを実行します。
connect
exec sleep 4
targets -set -filter {name =~ "PSU"}
# write bootloop and release A53-0 reset
mwr 0xffff0000 0x14000000
mwr 0xFD1A0104 0x380E
exec sleep 1
# download and run FSBL
targets -set -filter {name =~ "Cortex-A53 #0"}
# downloading FSBL
dow zynqmp_fsbl.elf
con
exec sleep 4
stop
exec sleep 1
mwr 0xFF18031C 0x64406440
mwr 0xFF180314 0x01150000
mwr 0xFF180318 0x00450043
exec sleep 1
dow u-boot.elf
dow bl31.elf
con
#ここまではXSDBで実行します。下記3-4)はUart(u-boot prompt)で実行します。
3-4) Programming steps from u-boot prompt:
u-boot promptで下記のコマンドを実行します。
setenv ipaddr 192.168.0.3
(環境依存)setenv netmask 255.255.255.0 setenv serverip 192.168.0.2
(環境依存)
tftpb 8000 emmc.img mmcinfo mmc write 8000 0 10000
Note: The First entry is the address, the last entry is $filesize/512
3-5) Verification steps from the u-boot prompt:
mmc rescan
mmc part
************* Output Example ****************** | ||||
Partition Map for MMC device 0 -- Partition Type: DOS | ||||
Part | Start Sector | Num Sectors | UUID | Type |
1 | 1 | 65535 | 000cbbb0-01 | 0c |
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します。
おわりに
いかがでしたでしょうか?
これで、基板のeMMC bootができるようになります。
上記手順の
メリットはimgファイルの転送速度がはやいです。
(数十Mなら数秒で転送完了)
#ETH portがあるボードなら、この方法を推奨します。
#ETH portがないボードでしたら、前回紹介した、xsdb経由の方法で転送可能です。
このブログは「FPGA設計ブログ一覧」の
5. プログラミング(FPGAへの書き込み)の
ひとつです。
最後までご覧いただきましてありがとうございました。