はじめに
下記の2つの関連記事ではブートローダーを生成し、ブートローダーから Linux を起動する方法を説明しています。
【関連記事】
- SoC EDS v19.1 std / v19.3 pro 以降のブートローダー生成フロー(Cyclone® V SoC / Arria® V SoC 編)
- SoC EDS v19.1 std / v19.3 pro 以降のブートローダー生成フロー(Arria® 10 SoC 編)
上記記事の手順でブートローダーから Linux を起動するためには、Linux カーネル、Linux デバイスツリー、およびルートファイル・システム(以降、RootFs)が必要となります。
この記事ではそれらをビルドする方法を説明します。
最新の情報については、下記 Rocketboards.org のページもご参照ください。
参考:Building Bootloader for Cyclone V and Arria 10 ⇒ Appendix - Building Linux Binaries
なおこの記事では、以下の Linux カーネルを対象にビルドする方法を記載しています。
デバイス | Linux ブランチ |
Cyclone® V SoC Arria® 10 SoC |
5.15.70-lts |
注記:上記は 2023年 3月 1日 現在のデバイスと Linux の対応表です(リリース毎に内容は
アップデートされます)。
1. 前提条件
注記:ご使用の開発環境が以下の Yocto システム要件を満たしていることをご確認ください。
Yocto Project Overview and Concepts Manual
1 System Requirements
1.1 Supported Linux Distributions
1.2 Required Packages for the Build Host
■ この記事では以下の環境を使用しています(ここで使用している環境はあくまで一例です):
-
- Linux を実行しているホストマシン。この記事では VirtualBox + Ubuntu 20.04 LTS を使用しました。
- ツールをダウンロードし、GitHub から U-Boot git ツリーをクローンするためのインターネット接続環境。ファイアウォールやプロキシがある場合は、システム管理者が git ツリーにアクセスできるようにする必要があります。
- 目的のデバイスを搭載した SoC FPGA 開発キット: Cyclone® V SoC / Arria® 10 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
■ Linux カーネルと RootFs をビルドするには、いくつかの Linux パッケージをインストールする
必要があります。この記事の手順で使用した Ubuntu 20.04 LTS マシンでは、次のコマンドを使用
してインストールを行いました:
$ sudo apt install gawk wget git git-core diffstat unzip texinfo gcc gcc-multilib \
build-essential chrpath socat cpio python python3 python3-pip python3-pexpect \
xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa \
libsdl1.2-dev pylint3 xterm python3-subunit libncurses-dev flex bison openssl \
libssl-dev mesa-common-dev zstd liblz4-tool
$ sudo apt install make python3-pip
$ sudo pip3 install sphinx sphinx_rtd_theme pyyaml
$ sudo apt install g++-multilib
$ sudo apt install libgmp-dev libmpc-dev
■ 社内ネットワークなどでプロキシがある場合、以下のような git config --global コマンドにより
プロキシの設定を行っておくことが必要です(ネットワーク環境に合わせて適切な設定を行って
ください)。
$ git config --global http.proxy http://proxy.address:proxy.port
$ git config --global https.proxy https://proxy.address:proxy.port
2. Linux バイナリーのビルド
ここでは、Linux バイナリーのビルド方法について説明します。
2-1. 準備
- Embedded Command Shell を起動している場合は、一旦 Linux ホストマシンの端末を終了した後、再度端末を開きます。
- 社内ネットワークなどでプロキシがある場合、前述の「1. 前提条件」で説明したプロキシの設定が必要です。
- 前述の「はじめに」でご紹介した関連ブートローダー記事で使用される、Linux ビルドバイナリーを配置するための $LINUX_BIN/a9 フォルダーを準備しておきます:
$ rm -rf linux-bin && mkdir linux-bin
$ export set LINUX_BIN=`pwd`/linux-bin
$ mkdir -p $LINUX_BIN/a9
2-2. Linux カーネルのビルド
注記:Linux カーネルのビルド手順は、Cyclone® V, Arria® V および Arria® 10 共通です。
① Top フォルダーを準備します:
$ rm -rf linux && mkdir linux
$ export set LINUX_TOP=`pwd`/linux
② ツールチェーンをダウンロードしてセットアップします:
$ cd $LINUX_TOP
$ 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 git ツリーを複製してコードを取得します:
$ cd $LINUX_TOP
$ git clone https://github.com/altera-opensource/linux-socfpga linux-socfpga.a9
$ cd linux-socfpga.a9
# 次の行をコメントアウトすると、最新の Linux カーネルブランチが使用されます
$ git checkout -b test-kernel -t origin/socfpga-5.15.70-lts
注記:(Cyclone® V SoC 開発キット使用時のみ)
ほとんどの Cyclone® V SoC 開発キットには、512MB の QSPI フラッシュデバイスが搭載されていますが、Linux カーネル DTS はデフォルトで 1Gb(128MB)のものを想定しています。
標準の 512MB を使用する場合は、後述の手順「④ Linux カーネルをビルドします」を実行する
前に、linux-socfpga/arch/arm/boot/dts/socfpga_cyclone5_socdk.dts ファイルを適宜変更します:
$ gedit arch/arm/boot/dts/socfpga_cyclone5_socdk.dts
【図 1】 Cyclone® V SoC 開発キットの QSPI デバイスサイズによる dts ファイルの変更
④ Linux カーネルをビルドします:
$ make socfpga_defconfig
$ make -j 48 zImage Image dtbs modules
$ make -j 48 modules_install INSTALL_MOD_PATH=modules_install
$ rm -rf modules_install/lib/modules/*/build
$ rm -rf modules_install/lib/modules/*/source
⑤ 関連するすべてのファイルを $LINUX_BIN/a9 にリンクします:
$ ln -s $LINUX_TOP/linux-socfpga.a9/arch/arm/boot/zImage $LINUX_BIN/a9/
$ ln -s $LINUX_TOP/linux-socfpga.a9/arch/arm/boot/Image $LINUX_BIN/a9/
$ ln -s $LINUX_TOP/linux-socfpga.a9/arch/arm/boot/dts/socfpga_cyclone5_socdk.dtb $LINUX_BIN/a9/
$ ln -s $LINUX_TOP/linux-socfpga.a9/arch/arm/boot/dts/socfpga_arria10_socdk_sdmmc.dtb $LINUX_BIN/a9/
$ ln -s $LINUX_TOP/linux-socfpga.a9/arch/arm/boot/dts/socfpga_arria10_socdk_qspi.dtb $LINUX_BIN/a9/
$ ln -s $LINUX_TOP/linux-socfpga.a9/arch/arm/boot/dts/socfpga_arria10_socdk_nand.dtb $LINUX_BIN/a9/
$ ln -s $LINUX_TOP/linux-socfpga.a9/modules_install/lib/modules $LINUX_BIN/a9/
⑥ 次のファイルが $LINUX_BIN/a9 フォルダーにリンクされます:
【表 1】 Linux カーネルのビルド生成ファイル
ファイル | 説明 |
zImage | 圧縮カーネルイメージ |
Image | 非圧縮カーネルイメージ |
socfpga_cyclone5_socdk.dtb | Cyclone® V SoC 向け SD/MMC ブートと QSPI ブートの両方用デバイスツリー blob |
socfpga_arria10_socdk_sdmmc.dtb | Arria® 10 SoC 向け SD/MMC ブート用デバイスツリー blob |
socfpga_arria10_socdk_qspi.dtb | Arria® 10 SoC 向け QSPI ブート用デバイスツリー blob |
socfpga_arria10_socdk_nand.dtb | Arria® 10 SoC 向け NAND ブート用デバイスツリー blob |
modules | カーネル・ローダブルモジュール |
2-3. RootFs のビルド
この例では、Yocto レシピを使用して Linux RootFs をビルドする方法を示します。
Yocto レシピは実際にはすべてをビルドしますが、この記事では RootFs のみに着目していることに
注意してください。
RootFs の Top フォルダーを準備します:
$ cd $LINUX_TOP
$ mkdir rootfs && cd rootfs
$ export set ROOTFS_TOP=`pwd`
2-3-1. Cyclone® V SoC の場合:
Cyclone® V SoC 向け RootFs のビルドは以下の手順で行います:
$ cd $ROOTFS_TOP
$ rm -rf cv && mkdir cv && cd cv
$ git clone -b honister https://git.yoctoproject.org/poky
$ git clone -b honister https://git.yoctoproject.org/meta-intel-fpga
$ source poky/oe-init-build-env ./build
$ echo 'MACHINE = "cyclone5"' >> conf/local.conf
$ echo 'BBLAYERS += " ${TOPDIR}/../meta-intel-fpga "' >> conf/bblayers.conf
# イメージにさらにパッケージを追加するには、次の行のコメントを外します
# $ echo 'CORE_IMAGE_EXTRA_INSTALL += "openssh gdbserver"' >> conf/local.conf
$ bitbake core-image-minimal
$ ln -s $ROOTFS_TOP/cv/build/tmp/deploy/images/cyclone5/core-image-minimal-cyclone5.tar.gz $LINUX_BIN/a9/
上記手順を実行することにより、次のファイルが $LINUX_BIN/a9 フォルダーにリンクされます:
【表 2】 Cyclone® V SoC 向け RootFs のビルド生成ファイル
ファイル | 説明 |
core-image-minimal-cyclone5.tar.gz | Cyclone® V SoC 用 RootFs(tar アーカイブ形式) |
2-3-2. Arria® 10 SoC の場合:
Arria® 10 SoC 向け RootFs のビルドは以下の手順で行います:
$ cd $ROOTFS_TOP
$ rm -rf a10 && mkdir a10 && cd a10
$ git clone -b kirkstone https://git.yoctoproject.org/poky
$ git clone -b kirkstone https://git.yoctoproject.org/meta-intel-fpga
$ source poky/oe-init-build-env ./build
$ echo 'MACHINE = "arria10"' >> conf/local.conf
$ echo 'BBLAYERS += " ${TOPDIR}/../meta-intel-fpga "' >> conf/bblayers.conf
# イメージにさらにパッケージを追加するには、次の行のコメントを外します
# $ echo 'CORE_IMAGE_EXTRA_INSTALL += "openssh gdbserver"' >> conf/local.conf
$ bitbake core-image-minimal
$ ln -s $ROOTFS_TOP/a10/build/tmp/deploy/images/arria10/core-image-minimal-arria10.tar.gz $LINUX_BIN/a9/
上記手順を実行することにより、次のファイルが $LINUX_BIN/a9 フォルダーにリンクされます:
【表 3】 Arria® 10 SoC 向け RootFs のビルド生成ファイル
ファイル | 説明 |
core-image-minimal-arria10.tar.gz | Arria® 10 SoC 用 RootFs(tar アーカイブ形式) |
おわりに
この記事では、Cyclone® V SoC / Arria® 10 SoC 向けブートローダーから Linux を起動するために必要な、Linux カーネル、デバイスツリー、および RootFs をビルドするための最小限の手順を参考として説明しました。ブートローダーから Linux を起動させるための参考になれば幸いです。
なお、Altera®(Intel®)SoC FPGA の HPS(ハード・プロセッサー・システム)側のブートに使用する SD カードイメージの作成方法については、以下の記事も参考にまりますので併せてご参照ください。