はじめに
SoC FPGA エンベデッド開発スイート(以下、SoC EDS)の v19.1 スタンダード・エディション(以下、v19.1 Std) / v19.3 プロ・エディション(以下、v19.3 Pro)からブートローダーの生成フローが変更になりました。
- リリースノートにも記載されていますが、SoC EDS v18.1 以前まで SoC EDS にバンドルされていたブートローダーのソースツリーが付属しなくなりました。
- SoC EDS v19.1 Std / v19.3 Pro からは、ユーザーが GitHub からブートローダーのソースツリーを
取得する必要があります。これにより最新のブートローダーを使用することができ、容易にアップデートに対応できるようになりました。 - 変更後のブートローダーの生成フローは、以下の RocketBoards.org のページに掲載されています。
参考:Building Bootloader for Cyclone V and Arria 10
この記事では、次の構成で U-Boot をビルドする方法を記載しています。
デバイス | Quartus® バージョン | U-Boot ブランチ | Linux ブランチ |
Cyclone® V SoC | 22.1 Std | 2022.04 | 5.15.70-lts |
注記:
※ 上記は 2023年 3月 1日 現在のデバイスとツールの対応表です(リリース毎に内容はアップデート
されます)。
※ リリース v22.1 Std 以降では、Cyclone® V SoC のハンドオフフォルダーを生成するために SoC EDS
は不要になりました。
SoC EDS の変更の経緯については Building Bootloader for Cyclone V and Arria 10 のページを
ご確認ください。
この記事では、Cyclone® V SoC および Arria® V SoC の場合における新旧のブートローダー・ビルドフローの説明と、Cyclone® V SoC でのブートローダーをビルドする手順を説明しています。
注記:
この記事では Cyclone® V SoC のビルド例のみを紹介しています。Arria® V SoC のビルドもほぼ同じ手順ですのでここでは割愛しています。
参考:
公式の SoC FPGA U-Boot のリポジトリは、https://github.com/altera-opensource/u-boot-socfpga にあります。
※ "RC" というラベルの付いたブランチは、公式のカスタマーサポートなしで、内部のアクティブな
開発用および Customer Early Access 用です。
※ Intel 以外での開発および本番環境での使用には、最新の安定版ブランチ(RC ラベルなし)を強く
お勧めします。
※ Quartus® およびデバイスのサポートについては、doc/README.socfpga を参照してください。
1. Cyclone® V SoC および Arria® V SoC のビルドフロー
Cyclone® V SoC および Arria® V SoC の場合、Quartus® コンパイルによって作成されるハンドオフ情報は、C ソースコード、XML、バイナリーファイルなどのいくつかの形式で提供されます。
bsp-editor はこの情報を取得し、U-Boot のビルドに使用されるソースコードに変換します。
SoC EDS の古いバージョンの場合、ユーザーは bsp-editor GUI でさまざまな U-Boot パラメーターを設定できました。
v20.1 Std より古いバージョンの SoC EDS の場合、BSP Editor を使用することができました。
しかし、v20.1 Std 以降では BSP Editor の使用しない新しい手順が紹介されています。
1-1. SoC EDS v18.1 以前のフロー
SoC EDS v18.1 以前のバージョンでは、次のフローを使用して U-Boot をビルドできました:
【図 1】 SoC EDS v18.1 以前のバージョンでのブートローダー生成フロー
- 主要なユーザーオプション(ブートソース、ECC スクラビングの有効化、ウォッチドッグなど)は、bsp-editor GUI または同等のコマンドラインを介して設定されました。
- U-Boot ソースコードは SoC EDS に付属していました。
- bsp-editor によって作成された Makefile により、'make' コマンド 1 つでブートローダーをビルドできました。
1-2. SoC EDS v19.1 Std / v19.3 Pro ~ v20.1 のフロー
SoC EDS v19.1 Std / v19.3 Pro ~ v20.1 では、以下に示すようにビルドフローが異なります:
【図 2】 SoC EDS v19.1 Std / v19.3 Pro ~ v20.1 のブートローダー生成フロー
主な違いは次のとおりです:
- bsp-editor で定義されたすべてのユーザーオプションは適用されなくなりました。これらは引き続き bsp-editor で設定はできますが効果はありません。
- すべてのカスタムユーザー設定は、U-Boot で直接行う必要があります(デバイスツリー、コンフィグレーション、およびソースコード)。
- bsp-editor によって生成される Makefile では U-Boot はビルドできません。代わりに U-Boot のソースツリーに含まれる Makefile を使用して make します。
- バイナリ変換やイメージファイルへの変換は Rocketboards.org の Building Bootloader for Cyclone V and Arria 10 ページの手順に従って行います。
- U-boot ソースコードは、ユーザーが GitHub から取得する必要があります。
- qts_filter(U-Boot の一部)と呼ばれるツールを呼び出して、ハンドオフファイルと bsp-editor で生成されたファイルを、新しい U-Boot バージョンで必要な形式に変換する必要があります。
1-3. SoC EDS 廃止後の v21.1 Std 以降のフロー
v21.1 Std 以降は下図のようなブートフローとなります。
SoC EDS が廃止となったこともあり、いくつか変更点があります:
【図 3】 v21.1 Std 以降のブートローダー生成フロー
主な違いは次のとおりです:
- SoC EDS の廃止に伴い bsp-editor(bsp-create-settings)がフローから無くなりました。代わりに、U-boot ソースツリーに同梱されている cv_bsp_generator.py スクリプトを使用することになりました。
- bsp-editor(bsp-create-settings)から cv_bsp_generator.py スクリプトに変更となったことで、
ハンドオフフォルダーからソースを取得し適切にフォーマットして、U-Boot ソースコードにヘッダーファイルが取り込まれます。
2. ビルドの実行方法
2-1. 前提条件
■ この記事では以下の環境を使用しています(ここで使用している環境はあくまで一例です):
-
- Linux を実行しているホストマシン。この記事では VirtualBox + Ubuntu 20.04 LTS を使用しました。
- ツールをダウンロードし、GitHub から U-Boot git ツリーをクローンするためのインターネット接続環境。ファイアウォールやプロキシがある場合は、システム管理者が git ツリーにアクセスできるようにする必要があります。
- 目的のデバイスを搭載した SoC FPGA 開発キット: Cyclone® V SoC / Arria® V SoC
■ 社内ネットワークなどでプロキシがある場合、次のようなプロキシの設定が必要です:
Linux ホストマシンで /etc/apt/apt.conf ファイルをテキストエディター(gedit など)で開き、
以下のようなプロキシ設定を記述してセーブします。
$ sudo gedit /etc/apt/apt.conf
Acquire::http::proxy "http://proxy.address:proxy.port";
Acquire::https::proxy "https://proxy.address:proxy.port";
Acquire::ftp::proxy "ftp://proxy.address:proxy.port";
※ 上記のプロキシ設定において、proxy.address はプロキシアドレス、proxy.port はプロキシポート番号を
意味します。ユーザーのネットワーク環境に合わせて適切な設定を行ってください。
Linux ホストマシンで .bashrc ファイルをテキストエディター(gedit など)で開き、
最終行に下記のようなプロキシを追記してセーブします。
$ gedit ~/.bashrc
export http_proxy="http://proxy.address:proxy.port"
export https_proxy="https://proxy.address:proxy.port"
export ftp_proxy="ftp://proxy.address:proxy.port"
※ 上記のプロキシ設定において、proxy.address はプロキシアドレス、proxy.port はプロキシポート番号を
意味します。ユーザーのネットワーク環境に合わせて適切な設定を行ってください。
Linux ホストマシンの端末を一旦終了してから、再度端末を起動します。
■ 端末を開き、次のコマンドを入力して、パッケージ情報を更新しておきます:
$ sudo apt update
$ sudo apt upgrade
■ 社内ネットワークなどでプロキシがある場合、以下のような git config --global コマンドにより
プロキシの設定を行っておくことが必要です(ネットワーク環境に合わせて適切な設定を行って
ください):
$ git config --global http.proxy http://proxy.address:proxy.port
$ git config --global https.proxy https://proxy.address:proxy.port
■ ツールチェーンをダウンロードしてセットアップします:
$ wget https://developer.arm.com/-/media/Files/downloads/gnu/11.2-2022.02/binrel/gcc-arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf.tar.xz
$ tar xf gcc-arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf.tar.xz
$ rm gcc-arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf.tar.xz
$ export PATH=`pwd`/gcc-arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf/bin:$PATH
$ export ARCH=arm
$ export CROSS_COMPILE=arm-none-linux-gnueabihf-
■ この記事ではブートローダーから Linux を起動しています。Linux を起動するためには、
Linux カーネル、Linux デバイスツリー および Root Filesystem(以下、RootFs)が必要です。
Linux バイナリーの作成手順については、下記の関連記事をご参照ください。
参考:
SoC EDS v19.1 std / v19.3 pro 以降のブートローダー生成フロー(付録:Linux バイナリーのビルド - Cyclone® V SoC / Arria® 10 SoC 編)
注記:
この記事では上記の関連記事でビルドした、下記の Linux バイナリーファイルが $LINUX_BIN/a9 フォルダー下に生成済みであることを前提に説明しています。
【表 1】 $LINUX_BIN/a9 フォルダーに事前にビルドされている Linux バイナリーファイル
ファイル | 説明 |
zImage | 圧縮されたカーネルイメージ |
socfpga_cyclone5_socdk.dtb | Cyclone® V SoC 向け SD/MMC ブートと QSPI ブートの両方用デバイスツリー blob |
core-image-minimal-cyclone5.tar.gz | Cyclone® V SoC 用 RootFs(tar アーカイブ形式) |
2-2. Cyclone® V SoC ブートローダーのビルド(SD カードブート向け)
2-2-1. セットアップ
① Top フォルダーを作成します:
$ mkdir cv_example.sdmmc
$ cd cv_example.sdmmc
$ export TOP_FOLDER=`pwd`
② GitHub からハードウェア・デザインを取得してコンパイルします。
その中のすでにコンパイルされている software フォルダーを削除します:
$ cd $TOP_FOLDER
$ rm -rf ghrd-socfpga-QPDS22.1STD_REL_GSRD_PR QPDS22.1STD_REL_GSRD_PR.zip cv_soc_devkit_ghrd
$ wget https://github.com/altera-opensource/ghrd-socfpga/archive/refs/tags/QPDS22.1STD_REL_GSRD_PR.zip
$ unzip QPDS22.1STD_REL_GSRD_PR.zip
$ mv ghrd-socfpga-QPDS22.1STD_REL_GSRD_PR/cv_soc_devkit_ghrd .
$ rm -rf ghrd-socfpga-QPDS22.1STD_REL_GSRD_PR QPDS22.1STD_REL_GSRD_PR.zip
$ cd cv_soc_devkit_ghrd
$ rm -rf software
$ ~/intelFPGA/22.1std/nios2eds/nios2_command_shell.sh \
make generate_from_tcl
$ ~/intelFPGA/22.1std/nios2eds/nios2_command_shell.sh \
make sof
2-2-2. U-Boot をビルドする
① git ツリーのクローンを作成し、サポートされているブランチをチェックアウトして、
U-Boot ソースコードを取得します:
$ cd $TOP_FOLDER/cv_soc_devkit_ghrd
$ mkdir software
$ mkdir software/bootloader
$ cd software/bootloader
$ git clone https://github.com/altera-opensource/u-boot-socfpga
$ cd u-boot-socfpga
# 最新の U-Boot ブランチを使用する場合は、次の行をコメントアウトします
# $ git checkout -b test-bootloader -t origin/socfpga_v2022.04
② cv_bsp_generator.py スクリプトを実行して、ハンドオフフォルダーからソースを取得し、
適切にフォーマットして、U-Boot ソースコードにコピーします:
$ cd $TOP_FOLDER/cv_soc_devkit_ghrd/software/bootloader/u-boot-socfpga/arch/arm/mach-socfpga/cv_bsp_generator
$ python cv_bsp_generator.py -i $TOP_FOLDER/cv_soc_devkit_ghrd/hps_isw_handoff/soc_system_hps_0 \
-o ../../../../board/altera/cyclone5-socdk/qts
③ U-Boot をコンフィグしてビルドします:
$ cd $TOP_FOLDER/cv_soc_devkit_ghrd/software/bootloader/u-boot-socfpga
$ export CROSS_COMPILE=arm-none-linux-gnueabihf-
$ make socfpga_cyclone5_defconfig
$ make -j 48
④ 次のファイルが $TOP_FOLDER/cv_soc_devkit_ghrd/software/bootloader/u-boot-socfpga
フォルダーにビルドされます:
【表 2】 ビルドにより生成された Preloader(SPL)と U-Boot
ファイル | 説明 |
spl/u-boot-spl | SPL ELF 実行可能ファイル |
u-boot | U-Boot ELF 実行可能ファイル |
u-boot-with-spl.sfp | ブート可能ファイル: SPL の 4 つのコピーと U-Boot イメージ上の 1 つのコピー |
2-2-3. SD カードのイメージを準備する
① sd_card フォルダを作成し、SD カードスクリプトを取得します:
$ cd $TOP_FOLDER/
$ sudo rm -rf sd_card && mkdir sd_card && cd sd_card
$ wget https://releases.rocketboards.org/2021.04/gsrd/tools/make_sdimage_p3.py
$ chmod +x make_sdimage_p3.py
② FAT パーティションを準備します:
$ cd $TOP_FOLDER/sd_card
$ mkdir sdfs && cd sdfs
$ export LINUX_BIN=~/linux-bin ← LINUX_BIN のパスを export しておきます
$ cp $LINUX_BIN/a9/zImage .
$ cp $LINUX_BIN/a9/socfpga_cyclone5_socdk.dtb .
$ mkdir extlinux
$ echo "LABEL Linux Default" > extlinux/extlinux.conf
$ echo " KERNEL ../zImage" >> extlinux/extlinux.conf
$ echo " FDT ../socfpga_cyclone5_socdk.dtb" >> extlinux/extlinux.conf
$ echo " APPEND root=/dev/mmcblk0p2 rw rootwait earlyprintk console=ttyS0,115200n8" >> extlinux/extlinux.conf
③ RootFs パーティションを準備します:
$ cd $TOP_FOLDER/sd_card
$ sudo rm -rf rootfs
$ mkdir rootfs && cd rootfs
$ sudo tar xf $LINUX_BIN/a9/core-image-minimal-cyclone5.tar.gz
$ sudo rm -rf lib/modules/*
$ sudo cp -r $LINUX_BIN/a9/modules/* lib/modules
④ U-boot のブート可能なバイナリーファイルをコピーします:
$ cd $TOP_FOLDER/sd_card
$ cp ../cv_soc_devkit_ghrd/software/bootloader/u-boot-socfpga/u-boot-with-spl.sfp .
⑤ SD カードイメージを準備します:
$ cd $TOP_FOLDER/sd_card
$ sudo python3 ./make_sdimage_p3.py -f \
-P u-boot-with-spl.sfp,num=3,format=raw,size=10M,type=A2 \
-P sdfs/*,num=1,format=fat32,size=100M \
-P rootfs/*,num=2,format=ext3,size=300M \
-s 512M \
-n sdcard_cv.img
⑥ 生成された SD カードイメージ sdcard_cv.img を SD カードに書き込みます(Win32DiskImager
等を使用)。
2-2-4. SD カードからのブート
① SD カードを Cyclone® V SoC 開発キットの SD カードスロットに挿入します。
② Cyclone® V SoC 開発キットが 3.3V SD デバイスから起動するように BSEL ジャンパーを設定
します:
-
-
- BSEL2 = 1(左)
- BSEL1 = 0(右)
- BSEL0 = 1(左)
-
③ Cyclone® V SoC 開発キットの電源を入れ直して Linux を起動します。
ユーザー名に「root」を使用して、パスワード無しでログインします:
U-Boot SPL 2022.04-21237-gfda0d9176f-dirty (Mar 16 2023 - 14:24:48 +0900)
DDRCAL: Scrubbing ECC RAM (1024 MiB).
DDRCAL: SDRAM-ECC initialized success with 578 ms
Trying to boot from MMC1
U-Boot 2022.04-21237-gfda0d9176f-dirty (Mar 16 2023 - 14:24:48 +0900)
CPU: Altera SoCFPGA Platform
FPGA: Altera Cyclone V, SE/A6 or SX/C6 or ST/D6, version 0x0
BOOT: SD/MMC Internal Transceiver (3.0V)
Watchdog enabled
DRAM: 1 GiB
Core: 25 devices, 15 uclasses, devicetree: separate
MMC: dwmmc0@ff704000: 0
Loading Environment from MMC... *** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Model: Altera SOCFPGA Cyclone V SoC Development Kit
Net:
Warning: ethernet@ff702000 (eth0) using random MAC address - ca:ff:d4:a6:68:65
eth0: ethernet@ff702000
Hit any key to stop autoboot: 0
Failed to load 'u-boot.scr'
switch to partitions #0, OK
mmc0 is current device
Scanning mmc 0:1...
Found /extlinux/extlinux.conf
Retrieving file: /extlinux/extlinux.conf
1: Linux Default
Retrieving file: /extlinux/../zImage
append: root=/dev/mmcblk0p2 rw rootwait earlyprintk console=ttyS0,115200n8
Retrieving file: /extlinux/../socfpga_cyclone5_socdk.dtb
Kernel image @ 0x1000000 [ 0x000000 - 0x55cbc0 ]
## Flattened Device Tree blob at 02000000
Booting using the fdt blob at 0x2000000
Loading Device Tree to 09ff6000, end 09fffb91 ... OK
Starting kernel ...
Deasserting all peripheral resets
[ 0.000000] Booting Linux on physical CPU 0x0
[ 0.000000] Linux version 5.15.70-153198-gf87aaa2c4d7c-dirty (ubuntu@ubuntu1804) (arm-none-linux-gnueabihf-gcc (GNU Toolchain for the Arm Architecture 11.2-2022.02 (arm-11.14)) 11.2.1 20220111, GNU ld (GNU Toolchain for the Arm Architecture 11.2-2022.02 (arm-11.14)) 2.37.20220122) #1 SMP Tue Mar 14 09:48:08 JST 2023
[ 0.000000] CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=10c5387d
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[ 0.000000] OF: fdt: Machine model: Altera SOCFPGA Cyclone V SoC Development Kit
~ 途中省略 ~
[ 4.857493] socfpga-dwmac ff702000.ethernet eth0: No Safety Features support found
[ 4.875296] socfpga-dwmac ff702000.ethernet eth0: registered PTP clock
[ 4.885533] socfpga-dwmac ff702000.ethernet eth0: configuring for phy/rgmii link mode
udhcpc: started, v1.34.1
udhcpc: broadcasting discover
udhcpc: broadcasting discover
udhcpc: broadcasting discover
udhcpc: no lease, forking to background
done.
Starting syslogd/klogd: done
Poky (Yocto Project Reference Distro) 3.4.4 cyclone5 /dev/ttyS0
cyclone5 login: root
root@cyclone5:~#
以上で、生成した SD カード向けブートローダーにより、Linux が起動することを確認できました。
2-3. Cyclone® V SoC ブートローダーのビルド(QSPI ブート向け)
2-3-1. セットアップ
① Top フォルダーを作成します:
$ mkdir cv_example.qspi
$ cd cv_example.qspi
$ export TOP_FOLDER=`pwd`
② GitHub からハードウェア・デザインを取得してコンパイルします。
その中のすでにコンパイルされている software フォルダーを削除します:
$ cd $TOP_FOLDER
$ rm -rf ghrd-socfpga-QPDS22.1STD_REL_GSRD_PR QPDS22.1STD_REL_GSRD_PR.zip cv_soc_devkit_ghrd
$ wget https://github.com/altera-opensource/ghrd-socfpga/archive/refs/tags/QPDS22.1STD_REL_GSRD_PR.zip
$ unzip QPDS22.1STD_REL_GSRD_PR.zip
$ mv ghrd-socfpga-QPDS22.1STD_REL_GSRD_PR/cv_soc_devkit_ghrd .
$ rm -rf ghrd-socfpga-QPDS22.1STD_REL_GSRD_PR QPDS22.1STD_REL_GSRD_PR.zip
$ cd cv_soc_devkit_ghrd
$ rm -rf software
$ ~/intelFPGA/22.1std/nios2eds/nios2_command_shell.sh \
make generate_from_tcl
$ ~/intelFPGA/22.1std/nios2eds/nios2_command_shell.sh \
make sof
2-3-2. U-Boot をビルドする
① git ツリーのクローンを作成し、サポートされているブランチをチェックアウトして、
U-Boot ソースコードを取得します:
$ cd $TOP_FOLDER/cv_soc_devkit_ghrd
$ mkdir software
$ mkdir software/bootloader
$ cd software/bootloader
$ git clone https://github.com/altera-opensource/u-boot-socfpga
$ cd u-boot-socfpga
# 最新の U-Boot ブランチを使用する場合は、次の行をコメントアウトします
# $ git checkout -b test-bootloader -t origin/socfpga_v2022.04
② cv_bsp_generator.py スクリプトを実行して、ハンドオフフォルダーからソースを取得し、
適切にフォーマットして、U-Boot ソースコードにコピーします:
$ cd $TOP_FOLDER/cv_soc_devkit_ghrd/software/bootloader/u-boot-socfpga/arch/arm/mach-socfpga/cv_bsp_generator
$ python cv_bsp_generator.py -i $TOP_FOLDER/cv_soc_devkit_ghrd/hps_isw_handoff/soc_system_hps_0 \
-o ../../../../board/altera/cyclone5-socdk/qts
③ U-Boot をコンフィグしてビルドします:
$ cd $TOP_FOLDER/cv_soc_devkit_ghrd/software/bootloader/u-boot-socfpga
$ export CROSS_COMPILE=arm-none-linux-gnueabihf-
$ make socfpga_cyclone5_qspi_defconfig
$ make -j 48
④ 次のファイルが $TOP_FOLDER/cv_soc_devkit_ghrd/software/bootloader/u-boot-socfpga
フォルダーにビルドされます:
【表 3】 ビルドにより生成された Preloader(SPL)と U-Boot
ファイル | 説明 |
spl/u-boot-spl | SPL ELF 実行可能ファイル |
u-boot | U-Boot ELF 実行可能ファイル |
u-boot-with-spl.sfp | ブート可能ファイル: SPL の 4 つのコピーと U-Boot イメージ上の 1 つのコピー |
2-3-3. QSPI バイナリーを準備する
① qspi_bin フォルダーを作成し、すべてのファイルを取り込みます:
$ cd $TOP_FOLDER/
$ sudo rm -rf qspi_bin && mkdir qspi_bin && cd qspi_bin
$ cp ../cv_soc_devkit_ghrd/software/bootloader/u-boot-socfpga/u-boot-with-spl.sfp .
$ export LINUX_BIN=~/linux-bin ← LINUX_BIN のパスを export しておきます
$ cp $LINUX_BIN/a9/zImage .
$ cp $LINUX_BIN/a9/socfpga_cyclone5_socdk.dtb .
② RootFs JFFS2 イメージをビルドします:
$ cd $TOP_FOLDER/qspi_bin
$ sudo rm -rf core-image-minimal-cyclone5-rootfs
$ mkdir core-image-minimal-cyclone5-rootfs
$ cd core-image-minimal-cyclone5-rootfs
$ sudo tar xf $LINUX_BIN/a9/core-image-minimal-cyclone5.tar.gz
$ sudo rm -rf lib/modules/*
$ cd ..
$ sudo apt install mtd-utils ← mkfs.jffs2 の実行に必要なパッケージをインストールしておきます
$ sudo mkfs.jffs2 -r core-image-minimal-cyclone5-rootfs -s 256 -e 64KiB --squash -o core-image-minimal-cyclone5-rootfs.jffs2
$ sudo chown $USER:$USER core-image-minimal-cyclone5-rootfs.jffs2
$ sudo rm -rf core-image-minimal-cyclone5-rootfs
③ この時点で、次のバイナリーが $TOP_FOLDER/qspi_bin で利用できます:
【表 4】 Linux のブートに使用するファイル
ファイル | 説明 |
u-boot-with-spl.sfp | 4 つの SPL イメージと U-Boot イメージ |
socfpga_cyclone5_socdk.dtb | Linux デバイスツリー blob |
zImage | 圧縮された Linux カーネル |
core-image-minimal-cyclone5-rootfs.jffs2 | Cyclone® V SoC 用 RootFs(jffs2 形式) |
2-3-4. QSPI からのブート
① Cyclone® V SoC 開発キットが 3.3V QSPI デバイスからブートするように BSEL ジャンパーを
設定します:
-
-
- BSEL2 = 1(左)
- BSEL1 = 1(左)
- BSEL0 = 1(左)
-
② バイナリーを QSPI フラッシュに書き込みます:
【表 5】 QSPI フラッシュに書き込むファイルとアドレスの対応
アドレス | ファイル | 説明 |
0x0000000 | u-boot-with-spl.sfp | 4 つの SPL バイナリーと U-Boot イメージ |
0x0200000 | n/a | U-Boot 環境 |
0x0220000 | socfpga_cyclone5_socdk.dtb | Cyclone® V SoC 向け SD/MMC ブートと QSPI ブートの両方用デバイスツリー blob |
0x0230000 | zImage | Linux カーネル |
0x0800000 | core-image-minimal-cyclone5-rootfs.jffs2 | Cyclone® V SoC 用 RootFs(jffs2 形式) |
$ cd $TOP_FOLDER/qspi_bin
$ ~/intelFPGA/22.1std/nios2eds/nios2_command_shell.sh \
quartus_hps -c 1 -o pv -a 0x000000 u-boot-with-spl.sfp
$ ~/intelFPGA/22.1std/nios2eds/nios2_command_shell.sh \
quartus_hps -c 1 -o pv -a 0x220000 socfpga_cyclone5_socdk.dtb
$ ~/intelFPGA/22.1std/nios2eds/nios2_command_shell.sh \
quartus_hps -c 1 -o pv -a 0x230000 zImage
$ ~/intelFPGA/22.1std/nios2eds/nios2_command_shell.sh \
quartus_hps -c 1 -o pv -a 0x800000 -s 0x3800000 core-image-minimal-cyclone5-rootfs.jffs2
③ Cyclone® V SoC 開発キットの電源を入れ直して Linux を起動します。
ユーザー名に「root」を使用して、パスワード無しでログインします:
U-Boot SPL 2022.04-21237-gfda0d9176f-dirty (Mar 20 2023 - 18:57:25 +0900)
DDRCAL: Scrubbing ECC RAM (1024 MiB).
DDRCAL: SDRAM-ECC initialized success with 579 ms
Trying to boot from SPI
U-Boot 2022.04-21237-gfda0d9176f-dirty (Mar 20 2023 - 18:57:25 +0900)
CPU: Altera SoCFPGA Platform
FPGA: Altera Cyclone V, SE/A6 or SX/C6 or ST/D6, version 0x0
BOOT: QSPI Flash (3.0V)
Watchdog enabled
DRAM: 1 GiB
Core: 25 devices, 15 uclasses, devicetree: separate
MMC: dwmmc0@ff704000: 0
Loading Environment from SPIFlash... SF: Detected n25q512ax3 with page size 256 Bytes, erase size 64 KiB, total 64 MiB
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Model: Altera SOCFPGA Cyclone V SoC Development Kit
Net:
Warning: ethernet@ff702000 (eth0) using random MAC address - 36:3f:43:8c:6c:0b
eth0: ethernet@ff702000
Hit any key to stop autoboot: 0
SF: Detected n25q512ax3 with page size 256 Bytes, erase size 64 KiB, total 64 MiB
device 0 offset 0x230000, size 0x5d0000
SF: 6094848 bytes @ 0x230000 Read: OK
device 0 offset 0x220000, size 0x10000
SF: 65536 bytes @ 0x220000 Read: OK
Kernel image @ 0x1000000 [ 0x000000 - 0x55cbc0 ]
## Flattened Device Tree blob at 02000000
Booting using the fdt blob at 0x2000000
Loading Device Tree to 09ff6000, end 09fffb91 ... OK
Starting kernel ...
Deasserting all peripheral resets
[ 0.000000] Booting Linux on physical CPU 0x0
[ 0.000000] Linux version 5.15.70-153198-gf87aaa2c4d7c-dirty (ubuntu@ubuntu1804) (arm-none-linux-gnueabihf-gcc (GNU Toolchain for the Arm Architecture 11.2-2022.02 (arm-11.14)) 11.2.1 20220111, GNU ld (GNU Toolchain for the Arm Architecture 11.2-2022.02 (arm-11.14)) 2.37.20220122) #1 SMP Tue Mar 14 09:48:08 JST 2023
[ 0.000000] CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=10c5387d
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[ 0.000000] OF: fdt: Machine model: Altera SOCFPGA Cyclone V SoC Development Kit
~ 途中省略 ~
[ 5.284680] socfpga-dwmac ff702000.ethernet eth0: No Safety Features support found
[ 5.292635] socfpga-dwmac ff702000.ethernet eth0: registered PTP clock
[ 5.302575] socfpga-dwmac ff702000.ethernet eth0: configuring for phy/rgmii link mode
Poky (Yocto Project Reference Distro) 3.4.4 cyclone5 /dev/ttyS0
cyclone5 login: root
root@cyclone5:~#
以上で、生成した QSPI 向けブートローダーにより、Linux が起動することを確認できました。
おわりに
この記事では、Cyclone® V SoC および Arria® V SoC の場合における新旧のブートローダー・ビルドフローの説明と、Cyclone® V SoC でのブートローダーをビルドする手順を説明しました。
ブートローダー生成の参考になれば幸いです。