みつきんのメモ

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

raspberrypi2 yoctoでPiTFT3.5 (Console編)

以前にAdafruitのイメージで動かしたあと放置気味だったが、yoctoでPiTFT3.5を動作させたのでメモ。

ドライバについて

今回はmeta-pitft35-rpiというレイヤを作成した。 このレイヤはHX8357Dサポートのパッチをmeta-raspberrypiのカーネルへバックポートして、dtoverlayなど必要な設定をしたもの。

HX8357Dのパッチはそのままでは適用できなかったので手パッチをあてた。

環境の作成

meta-pitft35-rpiを使用した環境を作成する。

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

まいどお馴染みの基本環境のダウンロード

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

meta-pitft35-rpi

今回作成したレイヤのダウンロード

$ cd ~/work/rpi2/poky
$ git clone https://github.com/mickey-happygolucky/meta-pitft35-rpi.git

ビルド環境の設定

ビルドのための環境変数の設定とビルドディレクトリの作成。 このコマンド実行後は自動的にビルドディレクトリに移動される。

$ cd ~/work/rpi2
$ source poky/oe-init-build-env build_pitft35

今回はビルドディレクトリを、build_pitft35とする。

conf/bblayers.conf

レイヤーの設定。

BBLAYERS ?= " \
  /home/mickey/work/rpi2/poky/meta \
  /home/mickey/work/rpi2/poky/meta-yocto \
  /home/mickey/work/rpi2/poky/meta-yocto-bsp \
  /home/mickey/work/rpi2/poky/meta-raspberrypi \
  /home/mickey/work/rpi2/poky/meta-pitft35-rpi \
  "

今回は、meta-raspberrypiとmeta-pitft35-rpiを追加している。

conf/local.conf

MACHINE ?= "raspberrypi2"
BB_NUMBER_THREADS = "6"
PARALLEL_MAKE = "-j 6"
VIDEO_CAMERA = "1"
GPU_MEM = "128"
LICENSE_FLAGS_WHITELIST += "commercial"
DL_DIR ?= "${TOPDIR}/../downloads"

KERNEL_DEVICETREE_append = " pitft35-resistive-overlay.dtb"

RPI_PITFT35 = "1"

「KERNEL_DEVICETREE_append = " pitft35-resistive-overlay.dtb"」で、 pitft35のdtoverlayをビルド対象に含め、 「RPI_PITFT35 = "1"」でこれを有効化している。

動作確認

ビルド

今回はRPi向け最小構成(おそらく)のrpi-basic-imageをbitbakeする。

$ cd ~/work/rpi2/build_pitft35
$ bitbake rpi-basic-image

焼きこみ

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

RPi2での確認

PiTFT3.5を装着して起動すると、しばらくしてログイン画面になる。

f:id:mickey_happygolucky:20150726184645j:plain

raspberrypi2 yoctoでPifi DAC+(HifiBerry DAC+互換)

ハイレゾオーディオの波に乗るために、Pifi DAC+ v2.0を購入した。 実際にはAmazon.co.jpで4000円弱で買うことができた。

RPi2でDACオーディオというと、Volumioばかり出てくるが、 それだと面白みがないので、ここでは当然yoctoで利用する。

Pifi DAC+について

実はこのボード、HifiBerry DAC+と同じ「pcm5122」というCodec ICが搭載されており、同じドライバで動作させることができる。

ドライバ

HifiBerry DAC+の動作に必要なドライバはmeta-raspberrypiのカーネル3.18には組み込まれており、 実はconfig.txtでdtoverlayを有効化するだけで利用できるようになる。

RaspbianなどRPi向けLinuxのための設定手順はここが詳しい。

yocto環境の作成手順

Pifi DAC+を動作させるために、今回はmeta-hifiberry-rpiというレイヤを作成した。 これはlocal.confの設定で使用するhifiberryを有効化できるようにしたもの。

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

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

meta-hifiberry-rpi

config.txtを設定するrpi-configのレシピにbbappendを作成した。 これはconfig.txtにdtoverlayを設定し、必要なデバイス設定を有効化するもの。

$ cd ~/work/rpi2/poky
$ git clone https://github.com/mickey-happygolucky/meta-hifiberry-rpi.git

dtoverlayとは、device tree overlayの設定で、名前の通りdevice treeの設定を上書きする仕組みである。

device treeについて

device treeはハードウェアの詳細を表現したデータ構造。

ARMプロセッサ向けのデバイスドライバは制御する中身は同じなのに、デバイスのアドレスだけが異なるというものが多く、そのようなコードが大量にカーネルにコミットされようとした時に、デバイス構造の差分を吸収して共用できるコードは統一しようという目的で導入されたもの。

device treeはdtsというテキスト形式で記述され、dtbというバイナリ形式に変換される。 カーネルへは変換済みのdtbが読み込まれる。

device treeで構成されたハードウェアの制御に必要なドライバはcompatibleのキーワードによって自動的にカーネルに読み込まれる。

dtoverlayについて

device tree overlayは、変換済みのdtbを上書きする。 そのため、dtsからdtbを作りなおさずにデバイス構造を上書きできる。

ビルド環境の設定

ビルドのための環境変数の設定とビルドディレクトリの作成。 このコマンド実行後は自動的にビルドディレクトリに移動される。

$ cd ~/work/rpi2
$ source poky/oe-init-build-env build_pifidac

今回はビルドディレクトリを、build_pifidacとする。

conf/bblayers.conf

レイヤーの設定。

BBLAYERS ?= " \
    /home/mickey/work/rpi2/poky/meta \
    /home/mickey/work/rpi2/poky/meta-yocto \
    /home/mickey/work/rpi2/poky/meta-yocto-bsp \
    /home/mickey/work/rpi2/poky/meta-raspberrypi \
    /home/mickey/work/rpi2/poky/meta-hifiberry-rpi \
  "

今回は、meta-raspberrypiとmeta-hifiberry-rpiを追加している。

conf/local.conf

MACHINE ?= "raspberrypi2"
BB_NUMBER_THREADS = "6"
PARALLEL_MAKE = "-j 6"
VIDEO_CAMERA = "1"
GPU_MEM = "128"
LICENSE_FLAGS_WHITELIST += "commercial"
DL_DIR ?= "${TOPDIR}/../downloads"

HIFIBERRY_DACPLUS = "1"

IMAGE_INSTALL_append = " alsa-utils"

「HIFIBERRY_DACPLUS = "1"」の行でHifiBerry DAC+のデバイスを有効化して、 alsa関連のツールである「alsa-utils」を追加でインストールしている。

動作確認

ビルド

今回はRPi向け最小構成(おそらく)のrpi-basic-imageをbitbakeする。

$ cd ~/work/rpi2/build_pifidac
$ bitbake rpi-basic-image

焼きこみ

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

RPi2での確認

ドライバ確認

# lsmod
Not tainted
ipv6 332166 16 [permanent], Live 0x7f19d000
joydev 8487 0 - Live 0x7f197000
evdev 9802 0 - Live 0x7f190000
snd_soc_pcm512x_i2c 1651 1 - Live 0x7f18c000
snd_soc_pcm512x 6280 1 snd_soc_pcm512x_i2c, Live 0x7f187000
snd_soc_hifiberry_dacplus 2684 0 - Live 0x7f183000
snd_soc_bcm2708_i2s 6659 2 - Live 0x7f17e000
snd_soc_hifiberry_dac 2419 0 - Live 0x7f13f000
regmap_mmio 3394 1 snd_soc_bcm2708_i2s, Live 0x7f10f000
regmap_i2c 2320 1 snd_soc_pcm512x_i2c, Live 0x7f10b000
snd_soc_core 132200 4 snd_soc_pcm512x,snd_soc_hifiberry_dacplus,snd_soc_bcm2708_i2s,snd_soc_hifiberry_dac, Live 0x7f09f000
snd_compress 7564 1 snd_soc_core, Live 0x7f095000
snd_pcm_dmaengine 3303 1 snd_soc_core, Live 0x7f08b000
snd_pcm 71771 3 snd_soc_hifiberry_dac,snd_soc_core,snd_pcm_dmaengine, Live 0x7f051000
snd_timer 17315 1 snd_pcm, Live 0x7f03d000
i2c_bcm2708 4916 0 - Live 0x7f038000
snd 49399 4 snd_soc_core,snd_compress,snd_pcm,snd_timer, Live 0x7f00a000
uio_pdrv_genirq 2916 0 - Live 0x7f006000
uio 7608 1 uio_pdrv_genirq, Live 0x7f000000

再生デバイス確認

$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: sndrpihifiberry [snd_rpi_hifiberry_dacplus], device 0: HiFiBerry DAC+ HiFi pcm512x-hifi-0 []
Subdevices: 1/1
  Subdevice #0: subdevice #0

wavファイルをSDカードへコピーしてaplayで再生すると音が再生された。

f:id:mickey_happygolucky:20150630235217j:plain

raspaberrypi2でcore-image-sato

yoctoでGUIを動かすための基本的なイメージであるcore-image-satoだが、 RPiではすんなりビルドが通らなかったことや、X-Windowsが古い、重いなどのイメージがあり、 RPiのような非力な環境で動かすために、労力を使うメリットを感じなかったため、 特に深追いしていなかった。 RPi2はそこそこパワーのある環境なので、試しに作ってみた。

今回は手順的なところよりも、発生した問題に対してどのように対処したかを重点的にメモしておく。

作成手順

yoctoの基本環境

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

meta-raspberrypi

今まではagherzanさんのmeta-raspberrypiを使わせてもらっていたが、 blog開始当時とは異なり、yoctoprojectのリポジトリのRPi2化が進んだため、 こちらを使用するようにする。

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

ビルド環境の設定

毎度おなじみの環境変数の設定およびビルドディレクトリの作成、移動。

$ cd ~/work/rpi2
$ source poky/oe-init-build-env build_sato

oe-init-build-envのあとにディレクトリ名を指定すると、 その名前でビルドディレクトリが作成される。 今回は、build_satoとする。

conf/bblayers.conf

これもおなじみとなってきたが、ビルドに使用するレイヤーの設定。

BBLAYERS ?= " \
  /home/mickey/work/rpi2/poky/meta \
  /home/mickey/work/rpi2/poky/meta-yocto \
  /home/mickey/work/rpi2/poky/meta-yocto-bsp \
  /home/mickey/work/rpi2/poky/meta-raspberrypi \
  "

BBLAYERSにmeta-raspberrypiを追加する。

conf/local.conf

こちらも毎度の設定だが、肝となる設定ファイル。

MACHINE ?= "raspberrypi2"
BB_NUMBER_THREADS = "6"
PARALLEL_MAKE = "-j 6"
GPU_MEM = "128"
LICENSE_FLAGS_WHITELIST += "commercial"
DL_DIR ?= "${TOPDIR}/../downloads"

ここではMACHINEをraspberrypi2に設定している。 DL_DIRの行はなくても構わないが、ダウンロードディレクトリを一段上げている。

bitbake実行

core-image-satoのビルドを実行する。

$ bitbake core-image-sato

エラー

bitbake

| checking for KHR/khrplatform.h... yes
| checking if arm-poky-linux-gnueabi-gcc  -march=armv7-a -marm  -mthumb-interwork -mfloat-abi=hard -mfpu=neon-vfpv4 -mtune=cortex-a7 --sysroot=/home/mickey/work/rpi2/build_sato/tmp/sysroots/raspberrypi2 -std=gnu99 supports -Wno-int-conversion... yes
| checking for X11... yes
| checking for EGL... no
| configure: error: Package requirements (egl) were not met:
|
| No package 'egl' found
|
| Consider adjusting the PKG_CONFIG_PATH environment variable if you
| installed software in a non-standard prefix.
|
| Alternatively, you may set the environment variables EGL_CFLAGS
| and EGL_LIBS to avoid the need to call pkg-config.
| See the pkg-config man page for more details.
| Configure failed. The contents of all config.log files follows to aid debugging
| ERROR: oe_runconf failed
| WARNING: exit code 1 from a shell command.
| ERROR: Function failed: do_configure (log file is located at /home/mickey/work/rpi2/build_sato/tmp/work/cortexa7hf-vfp-vfpv4-neon-poky-linux-gnueabi/libepoxy/1.2+gitAUTOINC+20062c25e7-r0/temp/log.do_configure.14448)
ERROR: Task 4685 (/home/mickey/work/rpi2/poky/meta/recipes-graphics/libepoxy/libepoxy_git.bb, do_configure) failed with exit code '1'
NOTE: Tasks Summary: Attempted 2779 tasks of which 0 didn't need to be rerun and 1 failed.
Waiting for 0 running tasks to finish:

Summary: 1 task failed:
/home/mickey/work/rpi2/poky/meta/recipes-graphics/libepoxy/libepoxy_git.bb, do_configure
Summary: There was 1 ERROR message shown, returning a non-zero exit code.

エラーメッセージと、詳細なログの場所が表示される。

ここで注目するのは以下の行。

| ERROR: Function failed: do_configure (log file is located at /home/mickey/work/rpi2/build_sato/tmp/work/cortexa7hf-vfp-vfpv4-neon-poky-linux-gnueabi/libepoxy/1.2+gitAUTOINC+20062c25e7-r0/temp/log.do_configure.14448)
ERROR: Task 4685 (/home/mickey/work/rpi2/poky/meta/recipes-graphics/libepoxy/libepoxy_git.bb, do_configure) failed with exit code '1'

上の行はログファイルの格納場所がフルパスが書かれている。このファイルをエディタで開いて解析したりする。 下の行はどのレシピでエラーが発生したかが書かれている。ここではlibepoxy_git.bbでエラーが発生している。

問題点

ここではログファイルを解析する前に、明確に以下の行に問題がありそうだと見受けられる。

| checking for EGL... no
| configure: error: Package requirements (egl) were not met:
|
| No package 'egl' found
|
| Consider adjusting the PKG_CONFIG_PATH environment variable if you

レシピのconfigure処理中にeglが見つからないことが問題になっていると推測できる。

環境にeglが存在しないのにconfigが有効化されていることが問題だと考えられるので、対処法は2種類考えられる。

  1. eglを環境に追加する
  2. eglをconfigから無効化する

これはeglが見つからないことが原因でエラーとなるレシピが他にどれだけ居るか(居そうか)?というところが アプローチを決定するなんとなくの要因となる。

configでeglが有効化される要因

libepoxy_git.bbを見てみる。

DEPENDS = "util-macros virtual/egl"

依存関係にvirtual/eglが明示されている。

virtual/eglというレシピについて

virtualというキーワードから推測されるように、virtual/eglという名前のレシピは存在しない。 その名の通り仮想レシピとなる。

EGL自体はハードウェアに依存するが、EGLの機能を使用するレシピはEGLに依存するだけで通常ハードウェアには依存しない。

f:id:mickey_happygolucky:20150628003530p:plain

仮想レシピが存在しない場合、EGLの機能を使用するためだけにハードウェア毎にレシピを分ける必要が出てくる。

f:id:mickey_happygolucky:20150628003540p:plain

そのような問題を解決するために、EGLの機能を利用するがハードウェアに依存しないレシピからは「virtual/egl」に依存関係を設定すると、ハードウェア環境によって適切なeglの機能を提供するレシピが選択されるようになっている。

f:id:mickey_happygolucky:20150628003553p:plain

具体的には、PREFERRED_PROVIDER_virtual/eglによって指定されたレシピが選択されるようになっている。 この、PREFERRED_PROVIDERは各ボードのBSPのレイヤーなどで設定されているがlocal.confで上書きすることもできる。

仮想レシピの機能を提供するレシピには以下のように記述をしておく。

PROVIDES = "virtual/egl"

その他の仮想レシピとしてはvirtual/kernelなどが存在する。

virtual/eglの実態

virtual/eglが実際にはどのレシピになるかを確認する。

$ bitbake virtual/egl -v
...
NOTE: selecting userland to satisfy virtual/egl due to PREFERRED_PROVIDERS

userlandのレシピが選択されている。

eglのレシピが存在しているのにエラーが出る原因

virtual/eglで選択されたuserlandは、この時点で正しくビルドされている。 本来の解釈であれば、eglライブラリは存在するはずである。なぜeglが見つからないのか。

ログメッセージの以下を再度見ると、eglの検出にはpkg-configを利用している。 pkg-configがライブラリの検出するためには「ライブラリ.pc」というファイルが必要になる。

この場合、「egl.pc」が必要になる。

| configure: error: Package requirements (egl) were not met:
|
| No package 'egl' found
|
| Consider adjusting the PKG_CONFIG_PATH environment variable if you
| installed software in a non-standard prefix.
|
| Alternatively, you may set the environment variables EGL_CFLAGS
| and EGL_LIBS to avoid the need to call pkg-config.
| See the pkg-config man page for more details.

userlandのレシピが、egl.pcを提供するかどうかを調べる。 tmp以下にあるuserlandのビルドディレクトリからegl.pcが見つかるかどうかで判断する。

$ cd tmp/work/
$ find -name 'userland'
./raspberrypi2-poky-linux-gnueabi/userland
./raspberrypi2-poky-linux-gnueabi/userland/git-r4/pkgdata/runtime-reverse/userland
./raspberrypi2-poky-linux-gnueabi/userland/git-r4/pkgdata/runtime/userland
./raspberrypi2-poky-linux-gnueabi/userland/git-r4/pkgdata/userland
./raspberrypi2-poky-linux-gnueabi/userland/git-r4/license-destdir/userland
./raspberrypi2-poky-linux-gnueabi/userland/git-r4/packages-split/userland-dbg/usr/src/debug/userland
./raspberrypi2-poky-linux-gnueabi/userland/git-r4/packages-split/userland
./raspberrypi2-poky-linux-gnueabi/userland/git-r4/sysroot-destdir/sysroot-providers/userland
./raspberrypi2-poky-linux-gnueabi/userland/git-r4/package/usr/src/debug/userland

つまりuserlandのビルドディレクトリは「./raspberrypi2-poky-linux-gnueabi/userland」

$ find ./raspberrypi2-poky-linux-gnueabi/userland -name 'egl.pc'

みつからない。 つまり、userlandのレシピはegl.pcを提供していないことがわかる。

対処方法

meta-raspberrypiにおいてvirtual/eglの機能を提供するレシピは、実はuserlandの他にも存在している。 そしてそれは、egl.pcを提供している。

vc-graphicsの存在

以下のように検索すると、virtual/eglの機能を提供する仮想レシピがuserlandの他にも存在することがわかる。

$ cd ~/work/rpi2/poky/meta-raspberrypi
$ grep -r 'virtual/egl' .
./recipes-graphics/vc-graphics/vc-graphics.inc:PROVIDES = "virtual/libgles2 virtual/egl"
./recipes-graphics/userland/userland_git.bb:            virtual/egl"

egl.pcの提供

vc-graphics.incを見ると以下の記述が見つかる。

SRC_URI += " \
    file://egl.pc \
    file://vchiq.sh \
"

つまり、egl.pcを提供している。

vc-graphics.incを使用しているレシピ

.incファイルは複数のレシピで共通化できる部分を抜き出したもの。

つまり、.incに記述された部分をイメージに取り込むためには、これをインクルードしているレシピを特定する必要がある。

以下のコマンドでvc-graphics.incをインクルードしているレシピを絞り込む

$ grep -r 'vc-graphics.inc' .
./recipes-graphics/vc-graphics/vc-graphics.bb:require vc-graphics.inc
./recipes-graphics/vc-graphics/vc-graphics-hardfp.bb:require vc-graphics.inc

vc-graphics.bbとvc-graphics-hardfp.bbが見つかる。 これらはTUNEのパラメータをsoft-floatにするかhard-floatにするかで選択する。

bitbakeのログに以下のようにcallconvention-hardが出ているため、 この環境はhard-floatとなるので、vc-graphics-hardfp.bbを使用する。

Build Configuration:
BB_VERSION        = "1.27.1"
BUILD_SYS         = "x86_64-linux"
NATIVELSBSTRING   = "Ubuntu-15.04"
TARGET_SYS        = "arm-poky-linux-gnueabi"
MACHINE           = "raspberrypi2"
DISTRO            = "poky"
DISTRO_VERSION    = "1.8+snapshot-20150627"
TUNE_FEATURES     = "arm armv7a vfp thumb neon callconvention-hard vfpv4 cortexa7"
TARGET_FPU        = "vfp-vfpv4-neon"

virtual/eglがvc-graphics-hardfpを選択されるようにする

先述の通り、PREFERRED_PROVIDER_virtual/eglをlocal.confで上書きするのだが注意点がある。

vc-graphics.incとuserland_git.bbをそれぞれ見てみる。

vc-graphics.inc

PROVIDES = "virtual/libgles2 virtual/egl"

userland_git.bb

PROVIDES = "virtual/libgles2 \
            virtual/egl"

それぞれ、virtual/libgles2も提供しているため、virtual/eglのみを変更すると、 userlandとvc-graphpicsのレシピが同時にインストールされることになる。

しかし、これらは同時にインストールすることはできない^1ため、 virtual/eglとvirtual/libgles2はセットで上書きする必要がある。

conf/local.confの修正

以下の記述をlocal.confに追加する。

PREFERRED_PROVIDER_virtual/egl = "vc-graphics-hardfp"
PREFERRED_PROVIDER_virtual/libgles2 = "vc-graphics-hardfp"

動作確認

イメージを作成して動作確認する。

ビルド

$ cd ~/work/rpi2/build_sato
$ bitbake core-image-sato

焼きこみ

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

実行画面

f:id:mickey_happygolucky:20150628002923j:plain

動作した。

raspberrypi2 yoctoでalsasink(gstreamer1.0)

前回ALSAで音がなった。

aplay以外のコマンドでも音を鳴らしてみたいのでgstreamerのalsasinkで音を試してみる。

作業環境は、引き続き前回ALSAのものを利用する。

GStreamerのバージョン

gstreamerには0.10系と1.0系があり、1.0にバージョンを移行しようとしている。 ただ、あまり進んでいないのか、両方が混在したシステムが多い。 GStreamerのチュートリアルも0.10系をベースに書かれていたり、意外とGStreamer1.0の情報は見つけづらい印象。

しかし、ここでは将来性を考えて1.0系を導入する。

meta-gstreamer1.0について

yoctoではGStreamer1.0のレシピを集めたmeta-gstreamer1.0が存在する。 ただし、最近はメンテナンスされていないようで、 meta(無印)の方がバージョンが新しい。このため、meta-gstreamer1.0は導入しない。

GStreamer1.0関連のパッケージの追加

poky/meta-local/recipes-core/images/rpi-basic-image.bbappend の内容を以下のようにする。

IMAGE_INSTALL += " alsa-lib \
          alsa-utils \
          gstreamer1.0 \
          gstreamer1.0-libav \
          gstreamer1.0-plugins-base \
          gstreamer1.0-plugins-good \
          gstreamer1.0-plugins-bad \
          gstreamer1.0-plugins-ugly \
"

local.confの修正

以下の行を追加する。 これをしないと、LICENSE関連でエラーになる。

LICENSE_FLAGS_WHITELIST += "commercial"   

ビルド

bitbake

以下のコマンドでイメージを作成する。

$ bitbake rpi-basic-image

書き込み

SDに書き込む。

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

実行

サウンドドライバの組み込み

まずはドライバを組み込む

# modprobe snd_bcm2835

これを忘れると音が出ずにエラーになる。

alsasinkの動作確認

gst-launch-1.0というコマンドで任意のGStreamerパイプラインを実行することができる。 以下のようにして、alsasinkの動作を確認する。

# gst-launch-1.0 audiotestsrc ! alsasink

これで音が出れば成功。

raspberrypi2 yoctoでALSA

前回Linuxサウンドについてざっくりと書いたので、それを踏まえて今回はALSAのみで音を鳴らしてみる。

ファイル取得

ベース環境

ベースの環境はこれを使う。

meta-local

作業用のレイヤとしてmeta-localを準備する。

ファイルの作成

必要なディレクトリおよびファイルを作成する。

$ cd ~/rpi2/poky $ mkdir -p meta-local/conf $ touch
meta-local/conf/layer.conf

layer.confの作成

meta-local/conf/layer.confを下記の内容で作成する。

# We have a conf and classes directory, add to BBPATH BBPATH
.= ":${LAYERDIR}" # We have recipes-* directories, add to BBFILES
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb
${LAYERDIR}/recipes*/*/*.bbappend"

BBFILE_COLLECTIONS += "local" BBFILE_PATTERN_local = "^${LAYERDIR}/"
BBFILE_PRIORITY_local = "7"

ビルドディレクト

以下のコマンドでbuildディレクトリに移動する。

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

conf/bblayers.conf

bblayers.confにmeta-localを追加する。

BBLAYERS ?= " \
  /home/mickey/rpi2/poky/meta \
  /home/mickey/rpi2/poky/meta-yocto \
  /home/mickey/rpi2/poky/meta-yocto-bsp \
  /home/mickey/rpi2/poky/meta-raspberrypi \
  /home/mickey/rpi2/poky/meta-local \
  "

ALSA関連のパッケージ追加

rpi-basic-imageにパッケージを追加する。

bbappend

$ cd ~/rpi2/poky
$ mkdir -p meta-local/recipes-core/images/
$ touch meta-local/recipes-core/images/rpi-basic-image.bbappend

rpi-basic-image.bbappendの内容を以下のようにする。

IMAGE_INSTALL += " alsa-lib \
          alsa-utils \
"

ビルド

bitbake

以下のコマンドでイメージを作成する。

$ bitbake rpi-basic-image

書き込み

SDに書き込む。

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

実行

サウンドバイスの確認(初期状態)

# aplay -l
aplay: device_list:268: no soundcards found...

初期状態ではないと言われる。

サウンドドライバの組み込み

初期状態ではみつからない。

# lsmod
    Not tainted
ipv6 331419 16 [permanent], Live 0x7f017000
uio_pdrv_genirq 2916 0 - Live 0x7f013000
joydev 8515 0 - Live 0x7f00d000
uio 7608 1 uio_pdrv_genirq, Live 0x7f007000
evdev 9794 0 - Live 0x7f000000

modprobeでドライバを組み込む

# modprobe snd_bcm2835

確認

# lsmod
    Not tainted
snd_bcm2835 19547 0 - Live 0x7f0bf000
snd_pcm 73676 1 snd_bcm2835, Live 0x7f0a2000
snd_timer 17315 1 snd_pcm, Live 0x7f098000
snd 49918 3 snd_bcm2835,snd_pcm,snd_timer, Live 0x7f081000
ipv6 331419 16 [permanent], Live 0x7f017000
uio_pdrv_genirq 2916 0 - Live 0x7f013000
joydev 8515 0 - Live 0x7f00d000
uio 7608 1 uio_pdrv_genirq, Live 0x7f007000
evdev 9794 0 - Live 0x7f000000

サウンドバイスの確認

ドライバ組み込み後はデバイスが見つかるようになる。

# aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 0: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

再生確認

RPi2のジャック(J7)にヘッドフォンを挿入し以下のコマンドを実行する。

aplay /usr/share/sounds/alsa/Front_Center.wav
Playing WAVE '/usr/share/sounds/alsa/Front_Center.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Mono

若干ノイズが気になるけど、Front_Center.wavがもともとノイジーではある。 何か対策を講じる必要があるかはよくわからない。

raspberrypi2 yoctoでweston(wayland)

yoctoの環境で作成したwestonのイメージがRPi2で動作したのでメモ。 wayland-eglライブラリが存在しない為それを移植するところが非常に大変だった。 https://github.com/albertd/buildroot-rpiの実装をかなり参考にした。 この方には非常に感謝している。

ここではその詳細は割愛して、動作させる手順だけまとめておく。

meta-weston-rpiの更新について

7/26時点でwestonのレシピなどが古くなっており、ビルドが通らない状態だったのだが、Leonさんが修正してコミットしてくれた。 READMEなど細かいところまで修正してくれていて、 非常に助かりました。 ありがとう!

ファイルの取得

ベース環境

前と同様にagherzanさんのmeta-raspberrypiを使わせてもらう。

$ cd ~/
$ mkdir rpi2
$ cd rpi2
$ git clone git://git.yoctoproject.org/poky.git
$ cd poky
$ git clone https://github.com/agherzan/meta-raspberrypi.git

meta-weston-rpi

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

ビルドディレクトリ

今回はビルドディレクトリをbuild_westonとする。

$ cd ~/rpi2
$ source poky/oe-init-build-env build_weston

conf/bblayers.confの編集

BBLAYERS ?= " \
  /home/mickey/rpi2/poky/meta \
  /home/mickey/rpi2/poky/meta-yocto \
  /home/mickey/rpi2/poky/meta-yocto-bsp \
  /home/mickey/rpi2/poky/meta-raspberrypi \
  /home/mickey/rpi2/poky/meta-weston-rpi \
  "

conf/local.confの編集

以下を追加する。

MACHINE ?= "raspberrypi2"
BB_NUMBER_THREADS = "8"
PARALLEL_MAKE = "-j 8"
VIDEO_CAMERA = "1"
GPU_MEM = "128"
LICENSE_FLAGS_WHITELIST += "commercial"
DL_DIR ?= "${TOPDIR}/../downloads"

FETCHCMD_wget = "/usr/bin/env wget -t 2 -T 3000 -nv --passive-ftp --no-check-certificate"

PREFERRED_PROVIDER_virtual/egl = "userland"
PREFERRED_PROVIDER_virtual/libgles2 = "userland"

MULTI_PROVIDER_WHITELIST += " \
             virtual/libgl \
             virtual/egl \
             virtual/libgles2 \
             virtual/mesa \
"

CORE_IMAGE_BASE_INSTALL_remove = " clutter-1.0-examples"

EGLやOpenGLES関連のライブラリはmesaで提供しているため、 何もしないとコンフリクトしてしまう。 そのためEGL、OpenGLESv2のvirtualパッケージをuserlandに上書きする。

clutter-1.0はRDEPENDSでmesaを引っ張ろうとしてしまうので除外している。 RDEPNDSはvirtualによる上書きが有効にならないようなのでこれを忘れるとかなりハマる。

DL_DIRの行は必要ではないが、download済みのファイルを格納するディレクトリを変更している。

bitbake

以下のコマンドでwestonのイメージを作成する。

$ bitbake core-image-weston

$ 書き込み

SDに書き込む。

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

実行画面

RPi2を起動するとwestonが立ち上がってくる。

f:id:mickey_happygolucky:20150301155957p:plain

感動した。

yocto QA Issueのあれこれ

パッケージのbbやbbappendを書いている時にQA Issueでエラーになることがある。 とりあえず解消出来たようなので、今回遭遇したエラーと対処をメモ。

QA Issue: userland rdepends on [package]

WARNING: QA Issue: userland rdepends on wayland, but it isn't a build dependency? [build-deps]

この例ではwaylandにビルド依存関係があるのでは?という警告。 waylandは今回引っかかったパッケージ。

回避策

bb/bbappendに以下を記述

PACKAGECONFIG += " wayland"

指摘されたパッケージをPACKAGECONFIGに追加してやる。

QA Issue: non -dev/-dbg/-nativesdk package contains symlink .so:

ERROR: QA Issue: non -dev/-dbg/-nativesdk package contains symlink .so: userland path '/work/raspberrypi2-poky-linux-gnueabi/userland/git-r4/packages-split/userland/usr/lib/libGLESv2.so' [dev-so]

開発用とかデバッグ用パッケージに必要な設定が足りないということらしい。

回避策

bb/bbappendに以下を記述

FILES_${PN}-dev += "${libdir}/libGLESv2.so \
                    ${libdir}/libEGL.so \
                    "
FILES_${PN}-dbg += "${libdir}/.debug"

なので、必要なものを追加してみる。

installed-vs-shipped

ERROR: QA Issue: userland: Files/directories were installed but not shipped
  /usr/lib/libGLESv2.so.2.0.0
  /usr/lib/libEGL.so.1.0.0
  /usr/lib/libGLESv2.so.2
  /usr/lib/libEGL.so.1
  /usr/lib/pkgconfig
  /usr/lib/pkgconfig/glesv2.pc
  /usr/lib/pkgconfig/wayland-egl.pc
  /usr/lib/pkgconfig/egl.pc [installed-vs-shipped]

これはイメージとしてイントールされるけど、 sysrootへ反映されないというエラーになるだろうか。

回避策

bb/bbappendに以下を記述

FILES_${PN} += "${libdir}/pkgconfig \
                ${libdir}/pkgconfig/glesv2.pc \
                ${libdir}/pkgconfig/egl.pc \
                ${libdir}/libGLESv2.so.2.0.0 \
                ${libdir}/libEGL.so.1.0.0 \
                ${libdir}/libGLESv2.so.2 \
                ${libdir}/libEGL.so.1 \

提供ファイルにの一覧に追加してみる。