みつきんのメモ

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

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