みつきんのメモ

組み込みエンジニアです。Interface誌で「My オリジナルLinuxの作り方」連載中

DE0-Nano-SoCをyocto(warrior)で動かす

はじめに

Cyclone-Vのカスタムボードを動かす必要に迫られたが、Cyclone-Vでの環境構築が明るくない上に、 ボードがうまく動かなかったため勢いに任せて既製品のボードを買ってしまった。

カスタムボードが動かなかったのは結局のところハードウェア不良が原因だったらしく、 ソフトウェアの環境構築手順には問題はなかったらしい。

ただ、Cyclone-V自体が息の長い製品らしく、古い情報を参考にしても無駄が多かったので、 最近のyoctoprojectでの環境構築手順をまとめる。

昔の手順

古い情報を参考にすると次のような手順を踏む必要があるとなっている。

yoctoで環境構築を下としても次のような手順が必要だったらしい。

  1. preloaderの作成
  2. u-bootの作成
  3. kernelの作成
  4. rootfs(core-imgae-minimal)の作成

preloaderはyoctoでは作成できないためSoC EDSを使用する必要があった。

最近は、u-bootのSPLを使用することでpreloaderを使用せずに起動することができるので、SoC EDSなどのインストールも含めて手順を省略できる。

warrior(yocto 2.7)環境の構築

meta-alteraはwarriorブランチが作成されていないが、LAYERSERIES_COMPAT_meta-alteraがwarriorに設定されているため、 masterブランチががwarrior相当となっている。

$ mkdir -p de0-nano-soc/layers
$ cd de0-nano-soc/layers
$ git clone git://git.yoctoproject.org/poky -b warrior
$ git clone https://github.com/kraj/meta-altera.git
$ git clone git://git.linaro.org/openembedded/meta-linaro.git -b warrior

環境変数の読み込み

bitbakeが実行できるように環境変数の設定を行う。

$ cd ../
$ source ./layers/poky/oe-init-build-env

コマンド実行後はbuildディレクトリに自動的に移動される。

ビルド対象へのレイヤの追加

bitbakeの実行対象にレイヤを追加する。

$ bitbake-layers add-layer ../layers/meta-altera
$ bitbake-layers add-layer ../layers/meta-linaro/meta-linaro-toolchain

local.confの修正

次の行をlocal.confに追加する。

MACHINE = "cyclone5"
UBOOT_CONFIG = "de0-nano-soc"

カーネルコンパイルエラー

dtsのファイル名が変更されたようで、カーネルのビルド中に次のようなエラーが発生する。

|   Using /home/mickey/work/yocto/de0-nano-soc/build/tmp/work-shared/cyclone5/kernel-source as source for kernel
| make[3]: *** No rule to make target 'arch/arm/boot/dts/socfpga_cyclone5_de0_sockit.dtb'.  Stop.
| /home/mickey/work/yocto/de0-nano-soc/build/tmp/work-shared/cyclone5/kernel-source/Makefile:1224: recipe for target 'socfpga_cyclone5_de0_sockit.dtb' failed
| make[2]: *** [socfpga_cyclone5_de0_sockit.dtb] Error 2
| Makefile:169: recipe for target 'sub-make' failed
| make[1]: *** [sub-make] Error 2
| ERROR: oe_runmake failed
| Makefile:15: recipe for target '__sub-make' failed
| make: *** [__sub-make] Error 2
| WARNING: exit code 1 from a shell command.
| ERROR: Function failed: do_compile (log file is located at /home/mickey/work/yocto/de0-nano-soc/build/tmp/work/cyclone5-poky-linux-gnueabi/linux-altera/5.1+gitAUTOINC+a64da520ac-r0/temp/log.do_compile.5813)

これを回避するためにlocal.confに次の行を追加する。

KERNEL_DEVICETREE = "\
            socfpga_cyclone5_socdk.dtb \
            socfpga_cyclone5_sockit.dtb \
            socfpga_cyclone5_socrates.dtb \
            socfpga_cyclone5_de0_nano_soc.dtb \
            socfpga_cyclone5_mcvevk.dtb \
            socfpga_cyclone5_sodia.dtb \
            socfpga_cyclone5_trcom.dtb \
            socfpga_cyclone5_vining_fpga.dtb \
            "

u-bootのデバイスツリーの設定

extlinux.confのFDTはUBOOT_EXTLINUX_FDT_defaultによって設定されるらしい。 local.confに次の行を追加する。

UBOOT_EXTLINUX_FDT_default = "../socfpga_cyclone5_de0_nano_soc.dtb"

ビルド

bitbakeを実行しイメージを作成する。

$ bitbake core-image-base

tmp/deploy/images/cyclone5にwicイメージが生成される。

ddコマンドなどでSDカードにwicイメージを書き込むことでブート用のSDイメージができる。

起動

UARTのUSBケーブルを接続しSDカードを挿入したあと、電源を投入する。

次のメッセージが表示された後ログが止まるので、KEY4(ボタン)を押す。

U-Boot SPL 2019.01 (Jul 16 2019 - 06:23:35 +0000)
Trying to boot from MMC1


U-Boot 2019.01 (Jul 16 2019 - 06:23:35 +0000)

CPU:   Altera SoCFPGA Platform
FPGA:  Altera Cyclone V, SE/A4 or SX/C4, version 0x0
BOOT:  SD/MMC Internal Transceiver (3.0V)
DRAM:  1 GiB

するとu-bootからカーネルがキックされ、ログイン画面まで進む。

Poky (Yocto Project Reference Distro) 2.7.1 cyclone5 /dev/ttyS0

cyclone5 login:

まとめ

最近のyoctoではwicイメージをSDにddするだけでブートできる。

de0-nano-soc向けのDTSのファイル名が変更されているのでこれの対応をしておかないとカーネルのビルドに失敗するので注意が必要。

起動時にKEY4を押さないとブートが止まってしまうのがちょっと気になる。