みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

yocto raspberrypi3でmorty

ちょっと時間が経ってしまったが、yocto 2.2(morty)がリリースされたので、raspberrypi3で動かしてみる。

ベース環境の取得

$ git clone git://git.yoctoproject.org/poky.git -b morty
$ cd poky
$ git clone git://git.yoctoproject.org/meta-raspberrypi

meta-raspberrypiはまだブランチがないのでmasterを使用する。

oe-init-build-envの読み込み

下記を実行する。

$ cd ~/rpi3
$ source poky/oe-init-build-env

これにより、クロスコンパイルに必要な環境変数が設定され、ビルドディレクトリに移動される。

meta-raspberrypiをビルド対象に追加

次のコマンドを実行する。

$ bitbake-layers add-layer ../poky/meta-raspberrypi

local.confの修正

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

MACHINE ?= "raspberrypi3"
DL_DIR ?= "${HOME}/work/yocto/downloads"

動作確認

bitbakeの実行

$ bitbake rpi-basic-image

DISTRO_VERSIONが2.2になっていることがわかる。

Build Configuration:
BB_VERSION        = "1.32.0"
BUILD_SYS         = "x86_64-linux"
NATIVELSBSTRING   = "Ubuntu-16.10"
TARGET_SYS        = "arm-poky-linux-gnueabi"
MACHINE           = "raspberrypi3"
DISTRO            = "poky"
DISTRO_VERSION    = "2.2"
TUNE_FEATURES     = "arm armv7ve vfp thumb neon vfpv4 callconvention-hard cortexa7"
TARGET_FPU        = "hard"
meta              
meta-poky         
meta-yocto-bsp    = "morty:dc8508f609974cc99606b9042bfa7f870ce80228"
meta-raspberrypi  = "master:17a6933adfc7bdf4e7e18dcc9d59e35718620fd4"

Initialising tasks: 100% |################################################################################################| Time: 0:00:14
NOTE: Executing SetScene Tasks
NOTE: Executing RunQueue Tasks
NOTE: Tasks Summary: Attempted 5485 tasks of which 15 didn't need to be rerun and all succeeded.

Summary: There was 1 WARNING message shown.

SDカードの作成

$ sudo dd if=tmp/deploy/images/raspberrypi3/rpi-basic-image-raspberrypi3.rpi-sdimg of=/dev/sdb bs=40M

/dev/sdbはSDカードのデバイス。環境により変更が必要な場合がある。

実行

f:id:mickey_happygolucky:20161115235426j:plain

無事起動した。

yocto meta-raspberrypiでVC4 graphics driverを試す

このように、RaspbianではVC4のgalliumドライバが使用できていたのだが、 最近、meta-raspberrypiでもこの対応が入ったので試してみる。

local.confにMACHINE_FEATURES += "vc4graphics"の行を追加することで、galliumドライバが有効になり、X11環境からOpenGLを使用できるようになる。

これによって、いままで使用できなかった、GLUTやGLFWが使用できるようになる。(かもしれない)

今回はes2gear_x11で歯車を表示するところまで確認する。

ベース環境の取得

$ git clone git://git.yoctoproject.org/poky.git
$ cd poky
$ git clone git://git.yoctoproject.org/meta-raspberrypi

特にポリシーはないが、今回はmasterブランチで作業する。

oe-init-build-envの読み込み

下記を実行する。

$ cd ~/rpi3
$ source poky/oe-init-build-env

これにより、クロスコンパイルに必要な環境変数が設定され、ビルドディレクトリに移動される。

meta-raspberrypiをビルド対象に追加

次のコマンドを実行する。

$ bitbake-layers add-layer ../poky/meta-raspberrypi

local.confの修正

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

MACHINE ?= "raspberrypi3"
MACHINE_FEATURES += "vc4graphics"
IMAGE_INSTALL_append = " mesa-demos"

DL_DIR ?= "${HOME}/work/yocto/downloads"

mesa-demosを追加インストールしているは、歯車を表示するため。

DL_DIRの行は必要はないが、ダウンロードしたファイルを複数のビルドディレクトリから使いまわせるようにするために設定している。

動作確認

bitbakeの実行

今回はX11OpenGLが使用できるようになったかを確かめたいので、core-image-satoを作成する。

$ bitbake core-image-sato

SDカードの作成

$ sudo dd if=./tmp/deploy/images/raspberrypi3/core-image-sato-raspberrypi3.rpi-sdimg of=/dev/sdb bs=40M

/dev/sdbはSDカードのデバイス。環境により変更が必要な場合がある。

実行

Linux起動後、ターミナルを起動しes2gears_x11を実行してみる。

歯車が表示された。

日本語対応のditaaをpandocで使用する

PlantUMLなどでditaaを使用してみたが、ditaaは便利そうなのに日本語が非対応で残念。 しかし、日本語に対応したditaaも存在する。

これをpandocのフィルタと組み合わせて、pandocのマークダウンから直接、日本語ditaaを使用してみる。

作業ディレクト

jarファイルなどパスが通っているところに置かれていれば、どこでも良いと思うが、今回は~/binにパスを通して使用する。

jditaa.jarの入手

$ cd ~/bin
$ wget https://github.com/luozengbin/dot.emacs.d/raw/master/extra/org-ditaa/jditaa.jar

pandoc filter(codeblock-diagrams.pl)の入手

$ cd ~/bin
$ wget https://gist.githubusercontent.com/bpj/5454765371a4e3c1a8354fedced1cc6b/raw/0802b99341be3ca5abb3e1d49b1e6f5f79d367f3/codeblock-diagrams.pl
$ chmod +x ./codeblock-diagrams.pl

フィルタをjditaaに対応するために修正する。

--- codeblock-diagrams.pl~   2016-10-31 11:20:08.963133308 +0900
+++ codeblock-diagrams.pl 2016-10-31 11:21:13.333003211 +0900
@@ -93,7 +93,7 @@ my %ditaa;
 {
     my $loc = dirname(abs_path($0));
     my $home = abs_path($ENV{HOME});
-    my %jar = (png => "ditaa0_6b.jar", pdf => "DitaaEps.jar");
+    my %jar = (png => "jditaa.jar");
     JAR:
     while ( my($fmt, $name) = each %jar ) {
         PATH:

Pandoc::Elemntsの入手

$ cpan install Pandoc::Elements

実行コマンド

次のように使用する。

$ pandoc -F codeblock-diagrams.pl [-M dia_format=pdf|png] [PANDOC-OPTIONS] [FILE-NAME ...]

実行例

サンプル

```{.ditaa .no-separation scale=1.2 .fig_}

    +----------+      +--------+     +--------+  +-----+  +-----+  +-----+
    |          |      |        |     |        |  |     |  |     |  |     |
    | markdown |----->| pandoc |---->| output |  | img |  | img |  | img |
    | {d}      |      |        |     | {d}    |  | {d} |  | {d} |  | {d} |
    |          |      +--------+     |        |  |     |  |     |  |     |
    +----------+         |  ^        +--------+  +-----+  +-----+  +-----+
                         v  |                       ^        ^        ^ 
                      +--------+   +--------+       |        |        |     
                      |        |-->| ditaa  |-------+        |        |
                      | filter |   +--------+                |        |
                      |        |-->| dot    |----------------+        |
                      |        |   +--------+                         |
                      |        |-->| rdfdot |-------------------------+
                      +--------+   +--------+
```

次のようになる。

[f:id:mickey_happygolucky:20161101033910p:plain]

日本語

```{.ditaa .no-separation scale=1.0 .fig_}

    +----------+      +--------+     +--------+  +-----+  +-----+  +-----+
    |          |      |        |     |        |  |     |  |     |  |     |
    | マーク   |      |        |     |        |  |     |  |     |  |     |
    | ダウン   |----->| pandoc |---->| output |  | img |  | img |  | img |
    | {d}      |      |        |     | {d}    |  | {d} |  | {d} |  | {d} |
    |          |      |        |     |        |  |     |  |     |  |     |
    +----------+      +--------+     +--------+  +-----+  +-----+  +-----+
                         |  ^                       ^        ^        ^ 
                         v  |                       |        |        |
                      +--------+   +--------+       |        |        |     
                      |        |-->| ditaa  |-------+        |        |
                      | filter |   +--------+                |        |
                      |        |-->| dot    |----------------+        |
                      |        |   +--------+                         |
                      |        |-->| rdfdot |-------------------------+
                      +--------+   +--------+
```

次のようになる。

[f:id:mickey_happygolucky:20161101033916p:plain]

ditaaで絵を書くときはRictyなどの等幅フォントがよい。

「->classes is deprecated. Use [ split ‘ ’, $e->class ] instead」のエラー (2017/06/12 追記)

Ubuntu 16.04.2 LTSでこれを実行すると、当時とはPerlのバージョンが異なっているせいか、上記のようなエラーが発生する。

指示に従って次のように修正する。

--- codeblock-diagrams.pl.old    2017-06-12 23:08:06.907006140 +0900
+++ codeblock-diagrams.pl 2017-06-12 23:24:31.336718744 +0900
@@ -162,7 +162,7 @@ print $document->to_json;
 sub codeblock_dia {
     my($code_block) = @_;
     # 'CodeBlock' eq $code_block->name or return;
-    my($type, @classes) = @{ $code_block->classes };
+    my($type, @classes) = @{ [ split ' ', $code_block->class ] };
     return unless $type;
     return unless $diagramtypes{$type};
     my $kvs = $code_block->attr->[2];

これでエラーが回避できる。

raspberrypi3 yoctoでSSD1306 OLEDディスプレイを動かす

アマゾンで安価に入手できるOLEDディスプレイを購入した。

I2Cで、VCC、GND、SCL、SDAの4本のみの結線で使用できる。 制御用のICはSSD1306とのこと。

このデバイスはArduinoなどの電子工作用となっているが、意外とラズベリーパイでの動作報告が見当たらない。 そこでこれを動かしてやろうと考えた。

Linuxにはssd1307fb.cというドライバがあり、これがSSD1306にも対応している。

しかし、実際に動かそうとすると意外と問題があり、カーネル4.4ではLEDが光らなかったり、表示位置がずれていたりしたので、それらは力技で直した。

yoctoの基本環境およびmeta-raspberrypi

基本環境のダウンロード

$ mkdir ~/rpi3
$ cd ~/rpi3
$ git clone git://git.yoctoproject.org/poky.git
$ cd ~/rpi3/poky
$ git clone git://git.yoctoproject.org/meta-raspberrypi

meta-rpi-ssd1306

meta-rpi-ssd1306をダウンロード。

$ cd ~/rpi3/poky
$ git clone https://github.com/mickey-happygolucky/meta-rpi-ssd1306.git

環境変数を設定

下記を実行してbitbakeの実行に必要な環境変数を設定する。

$ cd ~/rpi3
$ source poky/oe-init-build-env build

ビルド対象に追加

bitbake-layerでビルド対象に追加。

$ bitbake-layers add-layer ../poky/meta-raspberrypi
$ bitbake-layers add-layer ../poky/meta-rpi-ssd1306

local.conf

今回は、SSD1306のディスプレイをコンソールとして使用するために次の行を追加する。

MACHINE ?= "raspberrypi3"

ENABLE_I2C = "1"
KERNEL_DEVICETREE_append = " overlays/ssd1306fb.dtbo"

OLED_CONSOLE = "1"

bitbake実行

$ bitbake rpi-basic-image

イメージの書き込み

meta-raspberrypiではrpi-sdimgとしてSDカードのイメージが生成されるので、これをddコマンドで書き込む。

$ sudo dd if=./tmp/deploy/images/raspberrypi3-64/rpi-basic-image-raspberrypi3-64.rpi-sdimg of=/dev/sdb bs=40M

/dev/sdbは環境によってはsdbだったりsdcだったりするので適宜変更する。 内蔵HDDの追加など行ってなければ大抵はsdbとなる。

動作確認

f:id:mickey_happygolucky:20161007024414j:plain

OLEDにコンソールが表示されている。

raspberrypi3 yoctoでkernel4.8を試す

インターフェース11月号の記事で、linuxカーネルのバージョン4.8からラズベリーパイ3の64ビットが対応されるという情報があった。 筆者が紹介したカーネルは、Electron752さんが4.5および4.6のカーネルに64ビット対応したものだったので、今回はもともと64ビット対応されているというカーネル4.8を試してみようと思う。

ただし、バニラカーネルだと自前でコンフィグレーションなどが必要になるので、ラズベリーパイのカーネルrpi-4.8.yブランチを使用する。

使用するブランチ

meta-raspberrpyはkrogothブランチを持っていないため、pokyのmasterブランチを追従している。 masterブランチはバージョンの移り変わりが激しく、時間が経つと再現性が乏しくなるという欠点がある。 そのため、なるべくその時点の最新のリリースバージョンのブランチ(今はkrogoth)を使用するのだが、最近masterブランチが破壊的な修正が入ってしまった。その影響で現時点(10/3)ではkrogothのpoky(oe-core)とmasterのmeta-raspberrypiの組み合わせではビルドできなくなっている。 これは非常に残念なので、meta-raspberrypiにはkrogothブランチを切って欲しいと思う。 特定のコミットでcheckoutするという回避策もあるにはあるのだが。

今回は、このような事情からpoky(oe-core)もraspberrypiもmasterブランチで作業する。

環境のダウンロード

poky

次のコマンドを実行し、pokyの環境をダウンロードする。作業は~/rpi3で行う。

$ mkdir ~/rpi3
$ cd ~/rpi3
$ git clone git://git.yoctoproject.org/poky.git

先述の通りmasterブランチで作業する。

meta-raspberrypi

meta-raspberrypiをダウンロードする。

$ cd ~/rpi3/poky
$ git clone git://git.yoctoproject.org/meta-raspberrypi

こちらもmasterブランチで作業する。

meta-rpi3-aarch64

インターフェース2016年11月号でも紹介させてもらった64ビット環境を作成するためのレイヤをダウンロードする。 ここでは、カーネル4.8に対応したrpi-4.8.yブランチを取得する。

$ git clone https://github.com/mickey-happygolucky/meta-rpi3-aarch64.git -b rpi-4.8.y

ビルド環境の設定

同じみのoe-init-build-envを読み込み、bitbakeに必要な環境変数などの設定を行う。 meta-rpi3-aarch64はコンフィグレーションファイルのテンプレートを提供しているので、次のようにする。

$ TEMPLATECONF=meta-rpi3-aarch64/conf/template source poky/oe-init-build-env build64

これで、local.confbblayers.confが設定済みの状態で作成される。

自動的にbuild64ディレクトリに移動される。

bitbakeの実行

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

$ bitbake rpi-basic-image

SDカードの作成

ddコマンドでSDカードにイメージを書き込む。

$ sudo dd if=./tmp/deploy/images/raspberrypi3-64/rpi-basic-image-raspberrypi3-64.rpi-sdimg of=/dev/sdb bs=100M

/dev/sdbはSDカードのデバイス。各自環境によって変化する可能性があるので注意。

実行

f:id:mickey_happygolucky:20161003235046j:plain

カーネルが4.8でaarch64になっている。

インターフェース 2016年11月号 特集記事の中の「マニアの挑戦!ラズパイ3×64ビットLinux初体験」とmeta-rpi3-aarch64についてのフォロー

今回、ありがたいことに、この記事を書かせていただきました。 しかし、ちょっと手違いとか不運なことが重なってしまったので、すこしフォローをしたいと思います。主には次の2点。

  1. P19の図3について
  2. P29〜P31で解説しているmeta-rpi3-aarch64の内容について

P19の図3について

こちらについては単純に誤植なのですが、掲載されている手順を実行しても64ビット版Linuxが作成されません。

$ cd rpi3
$ TEMPLATECONF=meta-rpi3-bt-support/conf/template source poky/oe-init-build-env build_bt
$ bitbake core-image-sato
$ sudo dd if=./tmp/deploy/images/raspberrypi3/core-image-sato-raspberrypi3.rpi-sdimg of=/dev/sdb bs=100M

正しくはこちらになります。

$ cd rpi3
$ TEMPLATECONF=meta-rpi3-aarch64/conf/template source poky/oe-init-build-env build64
$ bitbake rpi-basic-image
$ sudo dd if=./tmp/deploy/images/raspberrypi3-64/rpi-basic-image-raspberrypi3-64.rpi-sdimg of=/dev/sdb bs=100M

YoctoProjectを使用して64ビットLinuxを体験しましょうという記事なのに肝心の手順が間違っていたので、フォローさせていただきました。

P29〜P31で解説しているmeta-rpi3-aarch64の内容について

これは、Electron752さんがGithubで公開していたファームウェアと64ビット版カーネルをYoctoProjectのレイヤとして作成するという内容でした。

こちらは不運というか、執筆時点と現在でElectron752さんのGithubリポジトリの構成が大きく違ってしまったため、この記事の内容を実践してもビルドエラー(実際にはfetchエラー)になってしまいます。

meta-rpi3-aarch64の内容については私が公開しているものが、9/24時点のElectron752さんのリポジトリの構成に対応したものになっているため、こちらを参考にしていただければと思います。

執筆時点のものと現在のものについての差分はこちらになります。

raspberrypi3 yocto PiTFT3.5を赤く染める(SDKの作成)

先日の記事の最後で、「前回の記事で作成したfirst_window.cのコンパイル結果を実行すると、PiTFT35が赤く染まる」と書いたが、具体的な手順について解説する。

まずはじめに環境を整える必要がある。

  1. PiTFT35の手順でmeta-pitft35-rpiのビルド環境を作成
  2. rpi-fbcpの手順でmeta-rpi-fbcpの環境を作成

次にrpi-fbcpの環境をベースにSDKを作成する。

SDKの作成

bitbakeではLinuxイメージを作成するためにクロスコンパイルを行っているが、それとは別に作成されたLinuxの上で動作するアプリケーションを作成するためのクロスコンパイラ(ツールチェイン)を作成することができる。

次の手順で作成する。

$ cd ~/rpi3
$ source poky/oe-init-build-env build_pitft35
$ bitbake core-image-sato -c populate_sdk

SDKインストーラpoky-glibc-x86_64-core-image-sato-cortexa7hf-neon-vfpv4-toolchain-2.1.1.shbuild_pitft35/tmp/deploy/sdkにできあがる。

これを実行し、インストールする。

$ cd tmp/deploy/sdk
$ ./poky-glibc-x86_64-core-image-sato-cortexa7hf-neon-vfpv4-toolchain-2.1.1.sh
Poky (Yocto Project Reference Distro) SDK installer version 2.1.1
=================================================================
Enter target directory for SDK (default: /opt/poky/2.1.1): 
You are about to install the SDK to "/opt/poky/2.1.1". Proceed[Y/n]? 

デフォルトの設定では/opt/poky/2.1.1SDKがインストールされる。

SDKの使用

bitbake実行したシェルとは別のシェルを開いて、次のコマンドを実行する。

$ source /opt/poky/2.1.1/environment-setup-cortexa7hf-neon-vfpv4-poky-linux-gnueabi

これでクロスコンパイルのために必要な設定が環境変数に設定される。たとえば、次のようにしてみると、クロスコンパイル用のコンパイラおよびビルドオプションが確認できる。

$ echo $CC
arm-poky-linux-gnueabi-gcc -march=armv7ve -marm -mfpu=neon-vfpv4 -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=/opt/poky/2.1.1/sysroots/cortexa7hf-neon-vfpv4-poky-linux-gnueabi

上記はC言語のためのコマンドで、C++の場合は次のようにする。

$ echo $CXX
arm-poky-linux-gnueabi-g++ -march=armv7ve -marm -mfpu=neon-vfpv4 -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=/opt/poky/2.1.1/sysroots/cortexa7hf-neon-vfpv4-poky-linux-gnueabi

sourceコマンドによる環境変数の読み込みは、すでに読み込まれているシェルの上で実行するとエラーになる。

hello world

例えば、hello worldのプログラムを作成し、コンパイルを実行してみる。

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("hello world\n");
    return 0;
}
$ $CC ./hello.c -ohello

$CC環境変数が展開されarm-poky-linux-gnueabi-gccコマンドによりコンパイルが実行され、helloというファイルがされる。

次のようにして、生成されたファイルを確認する。

$ file ./hello
./hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.32, BuildID[sha1]=add3753e8732c8cec29a4b0203819bdc78aed85c, not stripped

ARMのバイナリが生成されていることがわかる。

このhelloファイルをラズベリーパイ上で実行すると、hello worldと文字が出力される。

コンパイル済みバイナリをラズベリーパイへコピー

方法はいくつかあるが、筆者がよく行うのは次の2つのうちどちらか。

  1. SDカードをPCにマウントし、/home/rootなどの適当な場所へコピーする。
  2. LAN環境へ接続し、scpコマンドで転送する。

環境が出来上がってしまえばscpのほうが手軽だと思う。

PiTFT3.5を赤く染める

PiTFTを赤く染める手順をSDKがインストールされた後の手順から示す。

ソースのダウンロード

先日のOpenGLESソースコードをダウンロードする。

作業は~/fisrt_windowで行う。

$ mkdir ~/first_window
$ cd ~/first_window
$ git clone https://gist.github.com/1650444ca53d819474c9c69ed2604abb.git

ビルド

sourceでSDK環境変数を読み込み、ビルドを実行する。

$ cd 1650444ca53d819474c9c69ed2604abb
$ source /opt/poky/2.1.1/environment-setup-cortexa7hf-neon-vfpv4-poky-linux-gnueabi
$ cmake .
$ make

出来上がったfirst_windowファイルをfbcpのLinuxイメージを書き込んだラズベリーパイの上で実行すると、PiTFT3.5が赤く染まる。

f:id:mickey_happygolucky:20160919153814j:plain