みつきんのメモ

組み込みエンジニアです。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を押さないとブートが止まってしまうのがちょっと気になる。

gitbook-templateを試す(その3)

はじめに

前回のつづき。

Dockerベースのgitbook-templateを使用していて、book.jsonでtitleに日本語を使用するとPDFに変換した時に文字化けするので調べた。

コンテナのロケール

おそらくコンテナのロケールがデフォルトのままであるため日本語が使用できないのだろうと、 コンテナのロケールを日本語に設定する方法を調べたところ、こんな記事を見つけた。

これを参考にDockerfileを次のように修正したみた。

diff --git a/Dockerfile b/Dockerfile
index 1e40043..41555f4 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -4,6 +4,7 @@ LABEL maintainer="HeRoMo"
 # install apt packages
 RUN apt-get update -y && \
     apt-get install -y \
+      locales \
       bzip2 \
       calibre \
       fonts-ricty-diminished && \
@@ -19,4 +20,9 @@ RUN chmod 755 /usr/bin/start.sh
 RUN mkdir -p /opt/gitbook
 COPY ./book.json /opt/gitbook
 
+RUN locale-gen ja_JP.UTF-8
+ENV LANG ja_JP.UTF-8
+ENV LC_CTYPE ja_JP.UTF-8
+RUN localedef -f UTF-8 -i ja_JP ja_JP.utf8
+
 ENTRYPOINT ["start.sh"]

コンテナのビルドと確認

docker-compose.ymlがあるディレクトリで次のコマンドを実行する。

$ docker-compose build
$ docker-compose run --rm gitbook pdf

文字化けが直った。

まとめ

Dockerを使っていて日本語でに文字化けするようなら、コンテナのロケールを確認すると良い。

gitbook-templateを試す(その2)

はじめに

前回のつづき。

PDF出力時の日本語フォントなど、細かいところは調整が難しい感じ。

と書いたが、Dockerfileをおいてどうにかできないか試してみた。

作業環境は前回のものをそのまま引き継ぐ。

Dockerfileのリポジトリ

オリジナルのDockerfileはHeRoMo/docker-gitbookで管理されている。

これをローカルの環境に取得して、コンテナに手を入れていきたい。

docker-compose.ymlがあるディレクトリで次のコマンドを実行する。ここでは適当にブランチを切っている。

$ git clone https://github.com/HeRoMo/docker-gitbook.git
$ cd docker-gitbook
$ git checkout -b mybook

そしてdocker-compose.ymlを次のように編集する。

--- docker-compose.yml~  2019-06-19 15:19:21.237108274 +0900
+++ docker-compose.yml    2019-06-28 16:40:38.619619404 +0900
@@ -4,7 +4,7 @@
     image: 'bitjourney/plantuml-service:1.3.3'
 
   gitbook:
-    image: hero/gitbook:latest
+    build: ./docker-gitbook
     volumes:
       - ./gitbook:/gitbook
       - plugins:/gitbook/node_modules

これでローカルのDockerfileを参照してイメージがビルドできるようになる。

$ docker-compose build

フォントを追加してみる

Dockerfileを編集してフォントをイメージに追加してみる。

diff --git a/Dockerfile b/Dockerfile
index fae376d..1e40043 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -5,7 +5,8 @@ LABEL maintainer="HeRoMo"
 RUN apt-get update -y && \
     apt-get install -y \
       bzip2 \
-      calibre && \
+      calibre \
+      fonts-ricty-diminished && \
     apt-get autoremove -y && \
     apt-get clean && \
     rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/*

ここではfonts-ricty-diminishedを追加している。

gitbook/book.jsonを修正してPDF生成時に使用するフォントを設定してみる。

--- book.json~   2019-06-28 17:17:47.862386849 +0900
+++ book.json 2019-06-28 17:17:26.694060803 +0900
@@ -21,6 +21,7 @@
     }
   },
   "pdf": {
+    "fontFamily":"Ricty Diminished",
     "paperSize": "a4"
   },
   "language": "ja"

次のコマンドでPDFを生成する。

docker-compose run --rm gitbook pdf

ドキュメントビューアーで確認すると次のようになっている。

f:id:mickey_happygolucky:20190628172440p:plain
PDFのフォント情報

まとめ

ローカルにDockerfileを配置して、コンテナを自由に改変できるようになった。 フォントの埋め込みなどの、オリジナルのままではちょっと不便だと思うこともなんとかなりそう。

gitbook-templateを試す

はじめに

HeRoMo/gitbook-template: A gitbook project templateがよさそう。

Gitbook 環境 マイ・ベストを参考に作業する。

が。docker関連が一切入っていないのでそこから。

dockerのインストール

Ubuntuではsnapで入れる方法が簡単。ここが参考になる。

まず古いバージョンを削除。

$ sudo apt-get remove docker docker-engine docker.io containerd runc

次にdocker-ceをインストールする。

$ sudo snap install docker --stable

dockerのエラー

docker関連のコマンドを実行すると次のようなエラーが発生する。

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.38/images/create?fromImage=hero%2Fgitbook&tag=latest: dial unix /var/run/docker.sock: connect: permission denied

dockerグループをシステムに追加した後、ユーザーをdockerグループに追加する。

$ sudo addgroup --system docker
$ sudo adduser $USER docker
$ newgrp docker
$ sudo snap restart docker

これは普通に見落としがち。

gitbook-templateの導入

$ curl https://codeload.github.com/HeRoMo/gitbook-template/zip/master -O
$ unzip master
$ mv gitbook-template-master your-gitbook-name
$ cd your-gitbook-name

gitbookの初期化

$ docker-compose run --rm gitbook init

必要かわからないが、ファイルの所有権を変更しておく

$ sudo chown -R ${LOGNAME}:${LOGNAME} gitbook

ローカルサーバの操作

docker-compose.ymlがあるディレクトリで操作する。

起動

$ docker-compose up -d

停止

$ docker-compose stop

再起動

$ docker-compose restart

plantuml-cloudプラグインの修正

リンク元にあった謎のセミコロン問題を回避するために一度コンテナにログインする。

$ docker-compose exec gitbook bash

npmが更新されていないように見えるためgitbook/node_modules/gitbook-plugin-plantuml-cloud/index.jsを直接修正する。

# cd gitbook/node_modules/gitbook-plugin-plantuml-cloud
# cp index.js index.js.tmp
# sed -i 's|`!\[\](/${uml.svgPath});`|`!\[\](/${uml.svgPath})`;|g' index.js.tmp
# mv index.js.tmp index.js

ファイルを壊すとコンテナが起動しなくなるのでテンポラリファイルで作業する。 最後のmvの前にdiffなどで確認すると安心。

その後コンテナを再起動する。

$ docker-compose restart

PDF出力

$ docker-compose run --rm gitbook pdf

まとめ

gitbookの導入としては環境も汚れないため便利。

PDF出力時の日本語フォントなど、細かいところは調整が難しい感じ。 gitbookのプラグインはbook.jsonに記述すれば勝手にやってくれるっぽい?

NuttXアプリケーションの作成を補助するスクリプトを作った

はじめに

NuttXで小さい書捨てのアプリケーションをたくさん作る必要が出てきたので、 アプリケーションの雛形を出力するスクリプトを自分用に作成した。

せっかくなので(?)、githubに置いといた

スクリプトがやっていることの詳細はここを参照。

使い方

nuttx_gen_app.shをPATHの通ったディレクトリにコピーする。

環境変数NUTTX_APP_DIRappsディレクトリへのパスを設定する。

nuttx_gen_app.shを実行する。

アプリケーションの作成

次のように作成したいアプリケーション名を指定する。

$ nuttx_app_gen.sh hello

この時点でNuttXのmake menuconfigのメニューに追加されるようになる。 NuttXのmenuconfigに反映させるにはmake distcleanしてからtools/configure.shを実行し直す必要がある。

また、デフォルトのスタックサイズを指定することもできる。

$ nuttx_app_gen.sh hello 8192

アプリケーションの削除

次のようにすると、nuttx_gen_app.shで作成したアプリケーションを削除することができる。

$ nuttx_gen_app.sh hello -d

まとめ

自分用なので自分が必要な機能だけ。 そこまで細かいテストはしてないので、使用する場合はご注意を。

何かあればプルリクをくれると助かります。

Zephyrにアプリケーションを追加する

はじめに

Zephyrに自作のアプリケーションを追加したい。

ここの手順を参考にする。

環境変数の読み込み

とりあえず一番始めにsource zephyr-env.shを実行して環境変数を読み込む。 これを忘れるとwestがまともに動かない。

$ cd zephyr
$ source zephyr-env.sh

作成するファイル

次のような構成になるようにファイルを作成する。

app
├── CMakeLists.txt
├── prj.conf
└── src
    └── main.c

ディレクトリの名前はapp以外でも問題ない。 zephyrのソースツリー配下である必要もない。

今回は次のように作成する。

$ mkdir -p ~/zephyr_app/hello/src
$ cd ~/zephyr_app/hello

westでビルドする予定なので、あえて一段深い階層を作成する。

最終的には次のようになる。

~/zephyr_app
└── hello
    ├── CMakeLists.txt
    ├── prj.conf
    └── src
        └── main.c

CMakeLists.txt

CMakeLists.txtを次の内容で作成する、

cmake_minimum_required(VERSION 3.13.1)
include($ENV{ZEPHYR_BASE}/cmake/app/boilerplate.cmake NO_POLICY_SCOPE)
project(my_zephyr_app)

target_sources(app PRIVATE src/main.c)

使用するボイラープレートの都合でCMakeLists.txtに記述するプロジェクト名はappとしなければならない。

prj.conf

プロジェクト固有のコンフィグ設定を記述する。何もない場合は内容は空でもよいがファイルは作成する。

$ echo '# nothing here' > prj.conf

src/main.c

プログラム本体。

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("My first Zephyr application. \n");
    return 0;
}

ビルド

westでビルドする。

$ cd ~/zephyr_app
$ west build -b qemu_x86 hello

アプリケーションと同じ階層にbuildが作成され、その中に成果物が出力される。

とりあえずqemu向けにビルドする。

実行

qemuなのでwestで実行できる。

$ west build -t run

次のように表示されればOK.

SeaBIOS (version rel-1.12.0-0-ga698c8995f-prebuilt.qemu.org)
Booting from ROM..***** Booting Zephyr OS zephyr-v1.14.0-1091-ge58df2c34eab *****
My first Zephyr application.

Ctrl+a,xで終了。

まとめ

source zephyr-env.sh環境変数を読み込んでしまえば、zephyrのソースツリー以外でもwestが使用できる。

アプリケーションを管理するためのディレクトリもzephyrのソースツリーの外に置くことができるので、管理がしやすい。

アプリケーションのビルドやデバッグにもwestが使用できるので便利。

Zephyrでデバッグ

はじめに

Zephyrのアプリケーションをデバッグする。ターゲットはSTM32F4Discoveryを使用する。

コンフィグレーション

westでmenuconfigを開くには次のようにする。

$ west build -t menuconfig

デバッグ用設定

次の設定を有効化する。

  • DEBUG
  • DEBUG_INFO
  • DEBUG_OPTIMIZATION

デバッグ開始

westでデバッグを開始できる。

$ west debug

gdbserverの起動、gdbの起動、ターゲットの接続まで自動でやってくれる。

gdbgui

コマンドラインgdbデバッグできないにわかなのでgdbguiを使用したい。

しかし、westもgdbgui同様gdbのフロントエンドなので、westからgdbguiを呼び出すようにするのは難しい。

このような場合は、次のようにwestでデバッグサーバーを開始してからgdbguiを実行する。

$ west debugserver

別のターミナルで先程のコマンドを実行する。

$ gdbgui -g ${ZEPHYR_SDK_INSTALL_DIR}/arm-zephyr-eabi/bin/arm-zephyr-eabi-gdb --gdb-args "-ex 'target remote :3333' -ex 'monitor halt' -ex 'monitor reset' -ex 'load'" build/zephyr/zephyr.elf

まとめ

gdbサーバの起動やgdbの起動までwestで一発でできるのでデバッグ開始までが簡単。

gdbguiも一応使用できることがわかった。

west debugserverではボードによって使用するgdbサーバが変わることがあるためgdbで接続するポートが異なったりするので注意が必要。