はじめに
UltraZed-EG スターターキットに Debian GNU/Linux を構築する方法について、具体的な方法をいくつかに分けて説明します。
- Introduction
-
Boot Loader
- Sample FPGA Design
- FSBL (First Stage Boot Loader)
- PMUFW (Platform Manager Unit Firmware)(この記事)
- BL31 (ARM Trusted Firmware Boot Loader state 3-1)
- U-Boot
- BOOT.BIN
- Linux Kernel
- Debian9 Root File System
この記事では、ZynqMP の Boot Loader で使うための PMUFW (Platform Manager Unit Firmware) の構築について説明をします。
必要な環境
- Vivado SDK 2017.2
Sample FPGA Design の構築
PMUFW の構築には Sample FPGA Design のハードウェア情報が必要です。「UltraZed 向け Debian GNU/Linux (v2017.3版) の構築(Sample FPGA Design編)」の通りに target/UltraZed-EG-IOCC/build/fpga/project.sdk/design_1_wrapper.hdf を作っておきます。
PMUFW の構築
ここでは Vivado の hsi(Hardware Software Interface) を使って構築する方法を示します。GUI を使って手で入力するのは面倒なので Tcl スクリプトファイルを用意しています。Tcl スクリプトの詳しい内容は「Vivado SDK でZynq FSBL(First Stage Boot Loader)をビルドするTclスクリプト(hsi編)」を参照してください。
#!/usr/bin/tclsh
set app_name "pmufw"
set app_type "zynqmp_pmufw"
set hwspec_file "design_1_wrapper.hdf"
set proc_name "psu_pmu_0"
set project_name "project"
set project_dir [pwd]
set sdk_workspace [file join $project_dir $project_name.sdk]
set app_dir [file join $sdk_workspace $app_name]
set app_release_dir [file join [pwd] ".." ]
set app_release_elf "zynqmp_pmufw.elf"
set hw_design [open_hw_design [file join $sdk_workspace $hwspec_file]]
generate_app -hw $hw_design -os standalone -proc $proc_name -app $app_type -compile -dir $app_dir
file copy -force [file join $app_dir "executable.elf"] [file join $app_release_dir $app_release_elf]
build_zynqmp_pmufw.hsi を Vivado で実行することにより、target/UltraZed-EG-IOCC/build/zynqmp_pmufw.elf が生成されます。
vivado% cd target/UltraZed-EG-IOCC/build/fpga/
vivado% hsi -mode tcl -source build_zynqmp_pmufw.hsi
Vivado SDK 2017.3 で構築する際の注意点
今回は Vivado SDK 2017.2 を使って構築しましたが、Vivado SDK 2017.3 を使いたいという場合もあるでしょう。しかし Vivado 2017.3 では上手くいかない事が報告されています。
要するに次のような次第らしいです。
- Vivado SDK 2017.3 で PMUFW のコードが増えて通常のコンパイルオプションでは RAM に入りきらなくなった。
- Vivado SDK 2017.3 の GUI では
-Os -flto -ffat-lto-objects
というコンパイルオプションが追加されている。これは最適化用のコンパイラオプション。 - しかし CUI 用の generate_app では上記コンパイルオプションが追加されていない(忘れてた?
暫定的な対処方法として次のようにすると良いようです。
- generate_app の時に
-compile
オプションを外して実行して、環境だけを構築する。 - 構築した環境のディレクトリ(ここでは target/UltraZed-EG-IOCC/build/fpga/project.sdk/pmufw)の Makefile の CC_FLAGS に に
-Os -flto -ffat-lto-objects
を追加する。 - 構築した環境のディレクトリ(ここでは target/UltraZed-EG-IOCC/build/fpga/project.sdk/pmufw)で make を実行する。
- 出来た
executable.elf
を target/UltraZed-EG-IOCC/build/zynqmp_pmufw.elf にコピーする。