みつきんのメモ

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

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がもともとノイジーではある。 何か対策を講じる必要があるかはよくわからない。