はじめに
この記事では、Altera®(Intel®)SoC FPGA デバイスのブートローダー(U-Boot)に含まれるデバイス/ボード依存の設定や定義について記載します。過去のバージョンでは、デバイスファミリー毎に利用する U-Boot のバージョンが異なっていましたが、SoC FPGA エンベデッド開発スイート(SoC EDS)バージョン 19.1 以降から全ファミリー共通の U-Boot ソースツリーを使用するように変わっています。
また、最近の U-Boot バージョンでは、従来 Linux で使用されてきたデバイスツリーの概念も導入されているため、デバイス/ボード依存の設定の一部はソースコード上の定義ではなく、デバイスツリーのパラメーターとして記述されるものも存在しています。
以下、SoC FPGA デバイスファミリー別にデバイス/ボード依存の ファイルがどのようになっているかを紹介していきます。
ブートローダー(U-Boot)のソースコードおよびビルド手順は以下のリンクをご参照ください。
参考資料: Altera Opensource ‐ github.com『u-boot-socfpga - socfpga_v2020.04』
参考資料: Rocketboards.org『Building Bootloader (Building latest bootloader for SoC FPGA devices)』
1. デバイス/ボードに依存するファイルの種類
デバイス/ボード依存の実装は主に以下の 4 種類分けて実装されています。
ハンドオフ情報の他にもデバイス/ボード依存の実装が存在します。特にオリジナルのボードを作成した場合には各ファイルに対して、それぞれ編集の要否について判断が必要になります。
【表 1】 デバイス/ボード依存ファイルの種類
種類 | 概要 | 実装箇所 |
ハンドオフ |
Quartus® Prime プロジェクト上で設定したオプションから引き継がれる情報(デバイスファミリーにより実装が異なる) |
デバイスファミリーにより異なる |
defconfig | U-Boot のコンフィグレーション情報を含むファイル ビルド時の最初に行う make xxx_defconfig で適用される定義 |
configs 以下 |
include/configs | ボード固有の定義を含むヘッダーファイル include/configs/<CONFIG_SYS_CONFIG_NAME>.h |
include/configs 以下 |
デバイスツリー |
デバイス/ペリフェラルの設定パラメーターを含む。拡張子:dts, dtsi(メインは dts ファイル、dtsi は被インクルード専用) |
arch/arm/dts 以下 |
以下、各ファイルについて説明していきます。
2. ハンドオフ
Quartus® Prime プロジェクトで設定する Pin や HPS の設定パラメータを引き継ぐための情報です。ハンドオフ情報をブートローダーのソースツリーに反映させる方法はデバイスファミリー毎に異なります。
ポイント:
Quartus® Prime プロジェクトの設定を変更した場合には、新しいハンドオフ情報をブートローダーへ反映させる必要があるという点にご注意ください。
ハンドオフに影響する主な変更は、HPS 関連の Pin 設定、HPS 用 SDRAM コントローラーの設定、HPS のオプション変更などが対象になります(FPGA 側デザインの完成時点で、ハンドオフ情報を再適用することを推奨します)。
2-1. Cyclone® V SoC / Arria® V SoC のハンドオフ
ブートローダーのビルド手順に従って、bsp-create-settings、qts-filter.sh を実行すると、以下のファイルがソースツリー(board/altera/cyclone5-socdk/qts)に反映されます。
- iocsr_config.h ... HPS 側 I/O の設定(Scan Manager による I/O コンフィグレーション)
- pinmux_config.h ... HPS 側 I/O の機能選択(ピンマルチプレクサーの設定)
- pll_config.h ... HPS 内部 PLL のクロック設定
- sdram_config.h ... SDRAM コントローラーの設定
2-2. Arria® 10 SoC のハンドオフ
ビルド手順に従って、bsp-create-settings を実行すると、ハンドオフ情報がデバイスツリーフォーマット(devicetree.dts)で生成されます。このファイルから不要な記述(dts-v1, chosen)を削除して arch/arm/dts/socfpga_arria10-handoff.dtsi へ上書きコピーすることでハンドオフ情報を反映します。
詳細は devicetree.dts の内容を参照ください(PLL, PinMux, I/O Config, HPS-FPGA Bridge 設定などを含む)。
尚、devicetree.dts から不要な記述を削除する場合は、以下のコマンドで対応できます。
sed -i '/dts-v1/d' devicetree.dts sed -i '/chosen/,+4d' devicetree.dts
2-3. Stratix® 10 SoC / Agilex™ SoC のハンドオフ
これらのファミリーでは、ハンドオフに相当する情報はコンフィグレーション・データ(.sof)に含まれます。ブートローダー生成時にはハンドオフ情報のインプットは必要ありません。
ブート実行時にセキュア・デバイス・マネージャー(SDM)により、1st Stage ブートローダー(FSBL)とハンドオフ情報の両方が RAM 上にロードされ、FSBL からハンドオフ情報を参照します。
ハンドオフの内容は Quartus® Prime プロジェクトをフルコンパイルした後、output_files ディレクトリー以下のテキストファイル(asm_hps_handoff_data_dump.txt や hps_handoff_array_formated.txt)を開くと確認することができます(PLL, PinMux, I/O Config, Misc など)。
3. defconfig
U-Boot 環境のコンフィグレーション用ファイル。このファイルには、以下のように CONFIG_xxx で始まる各種オプション設定が含まれます。
CONFIG_ARM=y
CONFIG_ARCH_SOCFPGA=y
CONFIG_SYS_MALLOC_F_LEN=0x4000
CONFIG_ENV_SIZE=0x10000
CONFIG_ENV_SECT_SIZE=0x10000
CONFIG_ENV_OFFSET=0x200000
CONFIG_DM_GPIO=y
CONFIG_SPL_DRIVERS_MISC_SUPPORT=y
CONFIG_SPL_SYS_MALLOC_F_LEN=0x2000
CONFIG_TARGET_SOCFPGA_ARRIA10_SOCDK=y
CONFIG_ENV_OFFSET_REDUND=0x210000
:
各デバイスファミリー毎に Development Kit 用のファイルが用意されているので、Development Kit で検証する場合は以下のファイルをそのまま利用できます。
- socfpga_cyclone5_defconfig
- socfpga_arria5_defconfig
- socfpga_arria10_defconfig
- socfpga_stratix10_defconfig
- socfpga_agilex_defconfig
上記以外にも、3rd パーティーの評価ボード用や、純正 Development Kit の QSPI ブート用、NAND ブート用など、各種 defconfig がソースツリーに含まれています。オリジナルボードに対応する場合も予め用意されている defconfig をベースに必要箇所を編集して対応する方法が簡単です。
ポイント:
オプション項目には、QSPI Flash デバイスや Ethernet PHY デバイスのベンダーやシリーズを選択する項目が存在します。Development Kit と異なるデバイスを使用する場合にはこれらのオプションの変更が必要になる点も注意が必要です。
- CONFIG_SPI_FLASH_STMICRO=y ... QSPI Flash("STMICRO" を "MACRONIX" などに変更可能)
- CONFIG_PHY_MICREL=y ... Ethernet PHY ベンダー
- CONFIG_PHY_MICREL_KSZ90X1=y ... Ethernet PHY シリーズ
コードサイズを抑えるため基本的には使用しないベンダー向けのオプションは全て無効になっています。選択可能なオプションはソースツリーに含まれる Kconfig や menuconfig で確認可能です。
【図 1】menuconfig の表示例
4. include/configs
defconfig に含まれるターゲットボード選択のオプション(CONFIG_TARGET_xxx)に応じて、ビルド実行時に include/configs ディレクトリー以下にある <CONFIG_SYS_CONFIG_NAME>.h がインクルードされます。<CONFIG_SYS_CONFIG_NAME>.h 並びにそこからインクルードされるヘッダーファイルにもデバイス/ボード依存の定義が含まれます。
使用されるヘッダーファイル(CONFIG_SYS_CONFIG_NAME)は、arch/arm/mach-socfpga/Kconfig にて以下のように指定されています。
config SYS_CONFIG_NAME
default "socfpga_agilex_socdk" if TARGET_SOCFPGA_AGILEX_SOCDK
default "socfpga_arria5_socdk" if TARGET_SOCFPGA_ARRIA5_SOCDK
default "socfpga_arria10_socdk" if TARGET_SOCFPGA_ARRIA10_SOCDK
default "socfpga_cyclone5_socdk" if TARGET_SOCFPGA_CYCLONE5_SOCDK
default "socfpga_stratix10_socdk" if TARGET_SOCFPGA_STRATIX10_SOCDK
CONFIG_SYS_CONFIG_NAME の設定状態は、ソースツリー Top ディレクトリーの u-boot.cfg を開くか、もしくは menuconfig 上で SYS_CONFIG_NAME を検索('/' キー入力)することで確認できます。
ポイント:
オリジナルボードに搭載する DDR メモリーサイズを Development Kit よりも小さくしている場合には、PHYS_SDRAM_1_SIZE の設定値に注意が必要です。 搭載するメモリーサイズが 1GB 以外の場合には PHYS_SDRAM_1_SIZE を変更する必要があります。
socfpga_cyclone5_socdk.h より抜粋:
/* Memory configurations */
#define PHYS_SDRAM_1_SIZE 0x40000000 /* 1GiB on SoCDK */
socfpga_soc64_common.h( socfpga_stratix10_socdk.h などからインクルード)より抜粋:
/*
* External memory configurations
*/
#define PHYS_SDRAM_1 0x0
#define PHYS_SDRAM_1_SIZE (1 * 1024 * 1024 * 1024)
5. デバイスツリー
デバイスツリー・ファイル(.dtb)は arch/arm/dts 以下に格納されているデバイスツリー・ソース(.dts)を元に生成されます。ソースには、各種ペリフェラルに対するパラメーター設定が記述されていますが、構文や設定項目は Linux デバイスドライバーに適用されるデバイスツリーと概ね同じ内容になっています。
一部、"u-boot,dm-pre-reloc" や "u-boot,dm-spl" など U-Boot 固有のプロパティーが含まれます。デバイスツリーは、U-Boot だけでなく SPL にも適用可能になっていますが、SPL に適用されるデバイスツリーは、ファイルサイズ削減のため、U-Boot 用のデバイスツリーから "u-boot,dm-pre-reloc" もしくは "u-boot,dm-spl" のプロパティーを含む定義のみを抽出したものが使用されます(この仕様については、U-Boot ソースツリーに含まれるテキスト・ドキュメント「doc/driver-model/design.rst」に記載されています)。
ポイント:
Arria® 10 SoC がターゲットの場合は、ハンドオフ情報もデバイスツリー(.dtb)の中に含まれます(前述の socfpga_arria10-handoff.dtsi により適用されます)。
使用されるデバイスツリーは、defconfig で指定される CONFIG_DEFAULT_DEVICE_TREE にて選択されます。 CONFIG_DEFAULT_DEVICE_TREE の設定状態は、ソースツリー Top ディレクトリーの u-boot.cfg を開くか、もしくは menuconfig 上で DEFAULT_DEVICE_TREE を検索('/' キー入力)することで確認できます。
ポイント:
デバイスツリーにも DDR メモリーサイズの定義が含まれます。Development Kit 搭載のサイズ(1GB)から変更している場合にはデバイスツリー・ソースに含まれる memory の定義についても変更が必要になります。
以下、デバイスツリー・ソースに含まれる memory の定義です。「reg = <0x0 0x40000000>;」にて、ベースアドレス(0x0)とサイズ(1GB: 0x40000000)を指定しているので、必要に応じてサイズを変更してください。
memory@0 {
device_type = "memory";
reg = <0x0 0x40000000>;
u-boot,dm-pre-reloc;
};
その他のデバイス/ペリフェラルに対する定義も必要に応じて変更してください。
まとめ
今回は、U-Boot に含まれるデバイス/ボード依存の定義について紹介しました。
ポイント に記載した内容の一部は、オリジナルのボードを作成した場合のボード立ち上げ時のトラブルとして良くある事例をもとにしています。
オリジナルボード向けのブートローダーを生成する際には是非参考にしてみてください。