はじめに
Altera®(Intel®)SoC FPGA のブートフローに採用されている U-Boot では、後段のソフトウェアのブート方法や、U-Boot 自身の動作を決める情報として環境変数に様々な設定情報を持っています。
この記事では、U-Boot の環境変数のカスタマイズおよび注意点について紹介します。
以下は、各 SoC FPGA ファミリーのブートフローです。各ブートフローにおける U-Boot の位置付けをご確認ください。尚、Stratix® 10 / Agilex™ では U-Boot は SSBL(Second Stage Boot Loader)とも呼ばれます。
Cyclone® V SoC / Arria® 10 SoC のブートフロー
【図 1】 Cyclone® V SoC / Arria® 10 SoC のブートフロー
Stratix® 10 SoC / Agilex™ SoC のブートフロー
【図 2】 Stratix® 10 SoC / Agilex™ SoC のブートフロー
参考: SoC FPGA 向け U-Boot ソースツリーの公開サイト
ヒント: 詳細情報は U-Boot 公式サイトの情報が役に立ちます。
重要な環境変数
U-Boot から後段のソフトウェアをロードする際に重要となる環境変数を3つご紹介しておきます。以下の3つはどのようなブート方式を使用する場合にも関係するため、覚えておくと役に立ちます。
- bootcmd: 後段のソフトウェアを起動するためのコマンドを指定する変数です。後段のソフトウェアのブート方法を変更する場合に編集します(CONFIG_BOOTCOMMAND で定義された内容が適用されます)。
- bootdelay: 指定の秒数カウントダウンした後に後段のソフトウェアを起動します。カウントダウン中にキー入力を検出した場合は U-Boot プロンプトへ移行します。ブート時間を短縮したい場合に編集します(CONFIG_BOOTDELAY で定義された秒数が適用されます)。
- bootargs: 後段のソフトウェア(Linux)起動時の引数を指定する変数です。Linux へオプションを渡したい場合に編集します(CONFIG_BOOTARGS で定義された内容が適用されます)。
U-Boot 環境変数の定義ファイル(カスタマイズする際の編集対象)
U-Boot 環境変数は u-boot-socfpga / include / env_default.h ファイルにより定義されます。ただし、env_default.h には環境変数の詳細な内容は記述されず、CONFIG 定義(CONFIG_BOOTCOMMAND, CONFIG_BOOTDEALY など)を参照して U-Boot 全体の環境変数を組み立てる仕組みになっています。
これらの定義により、U-Boot の実行ファイルが保持する環境変数のデフォルト設定値が決定します。
【図 3】 env_default.h ファイルによる U-Boot 環境変数のカスタマイズ
U-Boot 環境変数の保存場所(ビルド時のコンフィグオプション)
U-Boot の実行ファイルが保持するデフォルト設定値の他に、U-Boot は環境変数の設定変更後の値を保存するために、最新の設定値をコンフィグ時に指定した記憶領域に保持します。
- CONFIG_ENV_IS_IN_MMC : SD/MMC カード上に保持
- CONFIG_ENV_IS_IN_SPI_FLASH : SPI(QSPI)Flash 上に保持
- CONFIG_ENV_IS_IN_NAND : NAND Flash 上に保持
- CONFIG_ENV_IS_IN_FAT : SD/MMC カード上の FAT ファイルシステムに保持
- CONFIG_ENV_IS_IN_UBI : NAND Flash 上の UBI ファイルシステムに保持
ポイント:
U-Boot のログに表示される「Loading Environment from xxx」より、U-Boot が環境変数をどこから読み出しているかを確認することができます。
以下の例では、CONFIG_ENV_IS_IN_FAT と CONFIG_ENV_IS_IN_SPI_FLASH の両方が有効となっているケースを対象としていますが、FAT ファイルシステム上に環境変数を保存するファイル "uboot.env" が見つからないため、SPI FLASH 上のデータを環境変数として読み出したことを示しています。
U-Boot 2022.01 (Jul 08 2022 - 10:08:06 +0900)socfpga_agilex
CPU: Intel FPGA SoCFPGA Platform (ARMv8 64bit Cortex-A53)
Model: SoCFPGA Agilex SoCDK
DRAM: 8 GiB
WDT: Started watchdog@ffd00200 with servicing (10s timeout)
MMC: dwmmc0@ff808000: 0
Loading Environment from FAT... Unable to read "uboot.env" from mmc0:1... Loading Environment from SPIFlash... SF: Detected mt25qu02g with page size 256 Bytes, erase size 4 KiB, total 256 MiB
OK
In: serial0@ffc02000
Out: serial0@ffc02000
U-Boot 実行時の操作:環境変数のリセット(env コマンド)
U-Boot ターミナル上で以下のコマンドを使用して環境変数の操作が可能なことは良く知られているかと思います。これらのコマンドがあれば環境変数に関わる大半の編集操作は可能です。
- printenv - print environment variables(環境変数の設定内容をターミナル出力)
- saveenv - save environment variables to persistent storage(現在の環境変数を保存)
- setenv - set environment variables(環境変数を設定)
- editenv - edit environment variable(既存の環境変数を編集)
さらに「env」というコマンドを使用することで詳細な操作が可能となっています。
- env - environment handling commands
以下は「env」コマンドのヘルプ表示です。コマンドライン引数に応じてあらゆる操作が可能となっていますが、太字で示した「env default -f -a」コマンドは覚えておくことをお勧めします。
SOCFPGA_AGILEX # env
env - environment handling commands
Usage:
env default [-f] -a - [forcibly] reset default environment
env default [-f] var [...] - [forcibly] reset variable(s) to their default values
env delete [-f] var [...] - [forcibly] delete variable(s)
env edit name - edit environment variable
env exists name - tests for existence of variable
env export [-t | -b | -c] [-s size] addr [var ...] - export environment
env import [-d] [-t [-r] | -b | -c] addr [size] [var ...] - import environment
env print [-a | name ...] - print environment
env run var [...] - run commands in an environment variable
env save - save environment
env select [target] - select environment target
env set [-f] name [arg ...]
「env default -f -a」コマンドにより、全ての環境変数を強制的にデフォルト値に戻すことが可能です。
SOCFPGA_AGILEX # env default -f -a
## Resetting to default environment
注記:
環境変数の初期値をカスタマイズした後、ブートソース(SDMMC, QSPI など)の全領域を書き替えず U-Boot イメージだけを差し替える場合には、「env default -f -a」コマンドを実行してカスタマイズ後の環境変数(初期値)を適用する操作が必要です(以前の環境変数がブートソースに保存されているため、この操作を行わないと新しい環境変数が適用されません)。
まとめ
今回は U-Boot の環境変数の操作として知っておくと役に立つ内容を紹介しました。特に、最後の項目で記載した「env default -f -a」コマンドについては、実際に評価の際に陥ったポイントを基に紹介しています。特に Stratix® 10 および Agilex™ では、環境変数の保存先となり得る領域がセキュア・デバイス・マネージャー(SDM)側の QSPI Flash(CONFIG_ENV_IS_IN_SPI_FLASH)と、HPS 側の SD/MMC(CONFIG_ENV_IS_IN_FAT)のように複数存在するため注意が必要です。