DE10-Nanoブート用のイメージの作成手順について

DE10-nanoで色々試す(遊ぶ)ためにLinuxカーネルブートローダディストリビューションのビルドを行ったのでその手順を備忘録としてまとめる

背景

今回、DE10-nanoで遊んでみようと思ったのはHDLを色々かいて勉強する際にFPGAで実際に動かしてみようと思ったのがきっかけ

Cyclone V SoCを選んだのは、SoC FPGAデバイスドライバとかの足回りについても調べてみようかなと思ったのと、Cyclone Vなら数年前に少し触ったのが理由
(時間とお金があればZynq, Zynq MPとかにも挑戦したい)

 

参考文献

今回、カーネル等のビルドの手順を調べてみたところmacnicaのサイトにビルド手順がまとめられていたのでこれらを参考にした。

 

1.SoC EDS v19.1 std / v19.3 pro から変更された新しいブートローダー生成フローの動作確認(Cyclone® V SoC / Arria® V SoC 編) – 株式会社マクニカ アルティマカンパニー

2.インテル® SoC FPGA 向け Linux ビルド方法 - 半導体事業 - マクニカ

 
手順はほぼリンク先に載っている通りに行ったが今回は備忘録として実行した手順をまとめる
 

ビルド手順

これから行うビルドの手順は以下の通り

 

1.Linuxカーネルのビルド

2.u-bootのビルド

3.Angstromのビルド

4.SDカードへの書きこみ

 

AngstromのビルドでLinuxカーネルやu-bootも生成されるが今回はデバイスドライバのクロスコンパイルも考えているので別にビルドを行う

また、ビルドにかかる時間を短縮するためにAWSのt2.xlargeインスタンス(ubuntu16.04)でビルドを行った

 

1.Linuxカーネルのビルド

まずはビルドに使うコンパイラをダウンロードし、環境変数に登録する
参考にしたサイトではバージョン2015.06のコンパイラであったが、最新のものを試してみる


$ wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
$ tar xf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
$ export PATH=`pwd`/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/:$PATH
$ export ARCH=arm
$ export CROSS_COMPILE=`pwd`/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
 
次にビルドするLinuxgithubのaltera-opensourceのリポジトリからクローンしてビルドする

$ git clone https://github.com/altera-opensource/linux-socfpga
$ cd linux-socfpga
$ git checkout -t -b test origin/socfpga-4.14.130-ltsi
$ make socfpga_defconfig
$ make -j 24 zImage dtbs
 
これでカーネルイメージがビルドされる。生成された
linux-socfpga/arch/arm/boot/zImage (圧縮イメージ)
linux-socfpga/arch/arm/boot/dts/socfpga_cyclone5_socdk.dtb (デバイスツリー)
の2つのファイルを今回利用する

2.u-bootのビルド

u-bootのビルドでは別のコンパイラを使うのでダウンロードして、環境変数を設定しなおす。こちらでも最新のコンパイラを使ってみる


$ wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/arm-eabi/gcc-linaro-7.5.0-2019.12-x86_64_arm-eabi.tar.xz
$ tar xf gcc-linaro-7.5.0-2019.12-x86_64_arm-eabi.tar.xz
$ export PATH=`pwd`/gcc-linaro-7.5.0-2019.12-x86_64_arm-eabi/bin:$PATH
$ export ARCH=arm
$ export CROSS_COMPILE=`pwd`/gcc-linaro-7.5.0-2019.12-x86_64_arm-eabi/bin/arm-eabi-

 

参考にしたサイトではu-bootのビルドにはintel SoC EDS内のスクリプトやサンプルプロジェクトを利用しているが、今回はTerasicのサイトにDE10-nanoのサンプルプロジェクトを利用する

$ ~/workspace/opt/intelFPGA/19.1/embedded/embedded_command_shell.sh
$ cd DE10_NANO_SoC_GHRD
$ rm -rf software
$ mkdir -p software/bootloader
$ bsp-create-settings --type spl --bsp-dir software/bootloader --preloader-settings-dir "hps_isw_handoff/soc_system_hps_0" --settings software/bootloader/settings.bsp
altera-opensourceのリポジトリからu-bootをクローンして、生成したFPGA側の設定を反映してビルドする

$ cd software/bootloader
$ git clone https://github.com/altera-opensource/u-boot-socfpga
$ cd u-boot-socfpga
$ git checkout -t -b test origin/socfpga_v2019.04
$ ./arch/arm/mach-socfpga/qts-filter.sh cyclone5 ../../../ ../ ./board/altera/cyclone5-socdk/qts/
$ make socfpga_cyclone5_defconfig
$ make -j 24

これでu-bootがビルドされる。今回使うのはSPLとu-bootが一体化したu-boot-with-spl.sfpファイル

 

3.Angstromディストリビューションのビルド

今回はRocketboard.orgのリポジトリがあるAngstromのディストリビューションを使う

バージョンとしてはAngstom-v2019.06-warriorをビルドしていく
とりあえずおまじないとして以下のコマンドを実行する


$ mkdir angstrom-build-v2019.06
$ cd angstrom-build-v2019.06
$ wget http://commondatastorage.googleapis.com/git-repo-downloads/repo
$ chmod 777 repo
$ ./repo init -u git://github.com/Angstrom-distribution/angstrom-manifest -b angstrom-v2019.06-warrior
$ wget http://releases.rocketboards.org/release/2019.10/src/altera.xml
$ mkdir -p .repo/local_manifests
$ mv altera.xml .repo/local_manifests/
$ ./repo sync
$ 
ここで、ダウンロードされた layers/meta-altera-refdes/conf/layer.conf の12行目にあるLAYERSERIES_COMPAT_meta-altera-refdes = "zeus"コメントアウトする
(macnicaのサイトでは"zeus"を"warrior"に変更している)
 
現状meta-altera-refdesの最新版はAngstrom-v2019.12-zeusを指定しているのに対し、meta-alteraの最新版はAngstrom-v2019.06-warrior用になっているのでこのままではビルドできない。
そこでmeta-altera-refdes のバージョン指定をコメントアウトすることでとりあえずビルドできるようになる
 
次に環境変数のセットアップと設定ファイルの修正を行う
(設定ファイルの変更内容を入れるのは冗長な気がするがこれもまとめとして入れておく)

$ MACHINE=cyclone5 . ./setup-environment
$ sed -i '/meta-altera/a \ \ ${TOPDIR}\/layers\/meta-altera-refdes \\' conf/bblayers.conf
$ sed -i '/meta-atmel/d' conf/bblayers.conf
$ sed -i '/meta-freescale/d' conf/bblayers.conf
$ echo "DISTRO_FEATURES_remove = \" wayland \"" >> conf/local.conf
$ echo "DISTRO_FEATURES_remove = \" alsa \"" >> conf/local.conf
$ export KERNEL_PROVIDER=linux-altera-ltsi
$ export KERNEL_TAG=refs/tags/ACDS19.3_REL_GSRD_PR
$ export KBRANCH=socfpga-4.14.130-ltsi
$ export BB_ENV_EXTRAWHITE="$BB_ENV_EXTRAWHITE KBRANCH KERNEL_TAG UBOOT_TAG KERNEL_PROVID
最後に次のコマンドを実行することでディストリビューションのビルドが始まる
今回使ったawsのそこそこのインスタンスでも完了までに数時間かかる処理になる
 

$ bitbake gsrd-console-image  
 
このコマンドで生成された以下のファイルを今回は使う
deploy/glibc/images/cyclone5/gsrd-console-image-cyclone5.tar.gz
 

4.SDカードへの書きこみ

最後に生成した以下の4つのファイルをSDカードに書きこむ
zImage
socfpga_cyclone5_socdk.dtb
u-boot-with-spb.sfp
gsrd-console-image-cyclone5.tar.gz
 
まずは書き込むためのパーティションを設定する
作成するのは
  1. linuxカーネルなどのブート用のファイルを配置するFATパーティション
  2. linuxファイルシステムを配置するext3パーティション
  3. ブートローダバイナリを配置するA2タイプのパーティション
作成にはfdiskコマンドを使う
sudo fdisk -lでsdカードのデバイス名を調べて下記の手続きを行う
(下記は/dev/sdbの場合)
 

$ sudo fdisk /dev/sdb
コマンド (m でヘルプ): o
選択 (既定値 p): p
パーティション番号 (1-4, 既定値 1): 3
最初のセクタ (2048-124735487, 既定値 2048):
最終セクタ, +セクタ番号 または +サイズ{K,M,G,T,P} : +16MB
コマンド (m でヘルプ): t
16 進数コード (L で利用可能なコードを一覧表示します): a2

コマンド (m でヘルプ): n
選択 (既定値 p): p
パーティション番号 (1,2,4, 既定値 1): 1
最初のセクタ (32768-124735487, 既定値 32768):
最終セクタ, +セクタ番号 または +サイズ{K,M,G,T,P} : +128M
コマンド (m でヘルプ): t
16 進数コード (L で利用可能なコードを一覧表示します): b

コマンド (m でヘルプ): n
選択 (既定値 p): p
パーティション番号 (2,4, 既定値 2): 2
最初のセクタ (294912-124735487, 既定値 294912):
最終セクタ, +セクタ番号 または +サイズ{K,M,G,T,P} :
コマンド (m でヘルプ): w
 
次にそれぞれのパーティションにファイルを配置する
1番目のfatパーティションにはzImageとデバイスツリーを配置し
ブート時の引数にあたるファイルをextlinuxディレクトリに配置する

$ sudo mkdir /mnt/sdcard1
$ sudo mount /dev/sdb1 /mnt/sdcard1
$ sudo cp zImage /mnt/sdcard1/.
$ sudo cp socfpga_cyclone5_socdk.dtb /mnt/sdcard1/.
$ sudo sh -c "echo 'LABEL Linux Defaul' > /mnt/sdcard1/extlinux/extlinux.conf"
$ sudo sh -c "echo ' KERNEL ../zImage' >> /mnt/sdcard1/extlinux/extlinux.conf"
$ sudo sh -c "echo ' FDT ../socfpga_cyclone5_socdk.dtb' >> /mnt/sdcard1/extlinux/extlinux.conf"
$ sudo sh -c "echo ' APPEND root=/dev/mmcblk0p2 rw rootwait earlyprintk console=ttyS0,115200n8' >> /mnt/sdcard1/extlinux/extlinux.conf"
$ sudo umount /mnt/sdcard1
2番目のextパーティションにはgsrd-console-imae-cyclone5.tar.gzを展開する

$ sudo mkfs.ext3 /dev/sdb2
$ sudo mkdir /mnt/sdcard2
$ sudo mount /dev/sdb2 /mnt/sdcard2
$ sudo tar xf gsrd-console-image-cyclone5.tar.gz -C /mnt/sdcard2/
$ sudo umount /mnt/sdcard2
 
3番目のA2パーティションにはu-boot-with-spl.sfpを書きこむ
$ sudo dd if=u-boot-with-spl.sfp of=/dev/sdb3
 
 これでDE10-nanoを起動するためのSDカードが出来上がった
FPGAコンフィギュレーションするためにはさらに設定を行う必要があるがそれは次の記事でまとめようと思う