PetaLinux® FSBLを変更する方法

皆さん、こんにちは。
本ブログではPetaLinux® 2020.2を使用する際のFSBLを変更する方法を紹介します。
このブログは「FPGA設計ブログ一覧」の
5. プログラミング(FPGAへの書き込み)の
ひとつです。
目次
はじめに
PetaLinux® ツールは、AMD社のプロセッシング システム上でエンベデッド Linux ソリューションをカスタマイズ、ビルドおよびデプロイするために必要なものをすべて提供します。
設計生産性の加速を目的とするこのソリューションは、AMD社のハードウェア設計ツールと連動し、Versal®、Zynq® UltraScale+™ MPSoC、Zynq®-7000 SoC、および MicroBlaze™向けのLinuxシステム開発を容易にします。
背景
AMD社のVivado® ML EditionでXSAファイル(ハードウェア情報)を作成し、PetaLinux®ビルドするときに、デフォルトの設定では、FSBLは自動生成されて変更ができません。
以下の方法で、PetaLinux®ビルド時にFSBLをカスタマイズすることが可能ですので紹介します。
手順
1. FSBLのフォルダを作成する
以下のコマンドでpath project-spec/meta-user/recipes-bsp/fsbl/ にfilesのフォルダを作成します。
[linux@pc project]$ mkdir -p project-spec/meta-user/recipes-bsp/fsbl/files
2. 変更した差分 FSBL.patch を project-spec/meta-user/recipes-bsp/fsbl/files にコピーする
sample source code FSBL.patch
以下の四角枠は、サンプルソースコード FSBL.patch の内容です。
diff --git a/lib/sw_apps/zynqmp_fsbl/src/xfsbl_config.h b/lib/sw_apps/zynqmp_fsbl/src/xfsbl_config.h
index 7ee817c..01f6691 100644
--- a/lib/sw_apps/zynqmp_fsbl/src/xfsbl_config.h
+++ b/lib/sw_apps/zynqmp_fsbl/src/xfsbl_config.h
@@ -117,7 +117,8 @@ extern "C" {
#define FSBL_BS_EXCLUDE_VAL (0U)
#define FSBL_EARLY_HANDOFF_EXCLUDE_VAL (1U)
#define FSBL_WDT_EXCLUDE_VAL (0U)
-#define FSBL_PERF_EXCLUDE_VAL (1U)
+//#define FSBL_PERF_EXCLUDE_VAL (1U)
+#define FSBL_PERF_EXCLUDE_VAL (0U)
#define FSBL_A53_TCM_ECC_EXCLUDE_VAL (1U)
#define FSBL_PL_CLEAR_EXCLUDE_VAL (1U)
#define FSBL_USB_EXCLUDE_VAL (1U)
diff --git a/lib/sw_apps/zynqmp_fsbl/src/xfsbl_hooks.c b/lib/sw_apps/zynqmp_fsbl/src/xfsbl_hooks.c
index 80a1314..b9e04a5 100644
--- a/lib/sw_apps/zynqmp_fsbl/src/xfsbl_hooks.c
+++ b/lib/sw_apps/zynqmp_fsbl/src/xfsbl_hooks.c
@@ -46,7 +46,7 @@ u32 XFsbl_HookBeforeBSDownload(void )
/**
* Add the code here
*/
-
+ Xil_Out32(0xFFCA0004,0x1);
return Status;
}
diff --git a/lib/sw_apps/zynqmp_fsbl/src/xfsbl_qspi.c b/lib/sw_apps/zynqmp_fsbl/src/xfsbl_qspi.c
index 0b6aac4..29f13e8 100644
--- a/lib/sw_apps/zynqmp_fsbl/src/xfsbl_qspi.c
+++ b/lib/sw_apps/zynqmp_fsbl/src/xfsbl_qspi.c
@@ -244,8 +244,9 @@ u32 XFsbl_Qspi24Init(u32 DeviceFlags)
/*
* Set the pre-scaler for QSPI clock
*/
- Status = XQspiPsu_SetClkPrescaler(&QspiPsuInstance, XQSPIPSU_CLK_PRESCALE_8);
-
+// Status = XQspiPsu_SetClkPrescaler(&QspiPsuInstance, XQSPIPSU_CLK_PRESCALE_8);
+// Status = XQspiPsu_SetClkPrescaler(&QspiPsuInstance, XQSPIPSU_CLK_PRESCALE_4);
+ Status = XQspiPsu_SetClkPrescaler(&QspiPsuInstance, XQSPIPSU_CLK_PRESCALE_2);
if (Status != XFSBL_SUCCESS) {
UStatus = XFSBL_ERROR_QSPI_PRESCALER_CLK;
XFsbl_Printf(DEBUG_GENERAL,"XFSBL_ERROR_QSPI_PRESCALER_CLK\r\n");
@@ -929,8 +930,9 @@ u32 XFsbl_Qspi32Init(u32 DeviceFlags)
/*
* Set the pre-scaler for QSPI clock
*/
- Status = XQspiPsu_SetClkPrescaler(&QspiPsuInstance, XQSPIPSU_CLK_PRESCALE_8);
-
+// Status = XQspiPsu_SetClkPrescaler(&QspiPsuInstance, XQSPIPSU_CLK_PRESCALE_8);
+// Status = XQspiPsu_SetClkPrescaler(&QspiPsuInstance, XQSPIPSU_CLK_PRESCALE_4);
+ Status = XQspiPsu_SetClkPrescaler(&QspiPsuInstance, XQSPIPSU_CLK_PRESCALE_2);
if (Status != XFSBL_SUCCESS) {
UStatus = XFSBL_ERROR_QSPI_PRESCALER_CLK;
XFsbl_Printf(DEBUG_GENERAL,"XFSBL_ERROR_QSPI_PRESCALER_CLK\r\n");
sample FSBL.patch の変更内容
(ubuntu18.04のKompareでFSBL.patchを開いて変更内容表示する)
以下は、ubuntu18.04の画面キャプチャとなります。
3. fsbl_%.bbappend ファイルを作成する
project-spec/meta-user/recipes-bsp/fsbl/にfsbl_%.bbappendファイルを作成します。
fsbl_%.bbappend ファイルの中身は以下のように記述してください。
#Enable appropriate FSBL debug flags YAML_COMPILER_FLAGS_append = " -DFSBL_DEBUG"
#Add debug for FSBL
#XSCTH_BUILD_DEBUG = "1"
#To add compiler flags in FSBL:
#YAML_COMPILER_FLAGS_append = " -DFSBL_PROT_BYPASS"
#FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
#SRC_URI += " file://fsbl.patch"
#FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
# Patch for FSBL
#do_configure_prepend() {
# if [ -d "${S}/patches" ]; then
# rm -rf ${S}/patches
# fi
#
# if [ -d "${S}/.pc" ]; then
# rm -rf ${S}/.pc
# fi
#}
SRC_URI_append = " file://fsbl.patch "
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
4. plnx-proj-root/components/plnx_workspace を削除する
[linux@pc project]$ petalinux-build -x mrproper
[linux@pc project]$ rm -rf components/plnx_workspace
5. FSBLを再ビルドする
[linux@pc project]$ petalinux-build
[linux@pc project]$ petalinux-build -c bootloader
INFO: Sourcing build tools
[INFO] Building bootloader
[INFO] Sourcing build environment
[INFO] Generating workspace directory
INFO: bitbake virtual/fsbl
Loading cache: 100% |#############################################################################| Time: 0:00:00
Loaded 4273 entries from dependency cache.
Parsing recipes: 100% |###########################################################################| Time: 0:00:03
Parsing of 3004 .bb files complete (3003 cached, 1 parsed). 4274 targets, 174 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
Initialising tasks: 100% |########################################################################| Time: 0:00:01
Checking sstate mirror object availability: 100% |################################################| Time: 0:00:00
Sstate summary: Wanted 149 Found 37 Missed 112 Current 884 (24% match, 89% complete)
NOTE: Executing Tasks
NOTE: Setscene tasks completed
NOTE: Tasks Summary: Attempted 3146 tasks of which 3146 didn't need to be rerun and all succeeded.
INFO: copy to TFTP-boot directory is not enabled !!
[INFO] Successfully built bootloader
[linux@pc project]$
以上でカスタマイズしたbootloaderが生成されました。
弊社ではFPGA設計や回路図設計、レイアウト設計、ソフトウェア設計、筐体設計などを受託開発しています。サービス内容をWEBサイトに掲載していますので、ぜひご覧ください。
FPGAの活用に際して設計検討などありましたら、お気軽にお問い合わせください。
最後までお付き合いいただきありがとうございました。