FC2ブログ

Home > Raspbian I2S Driver導入チャレンジ Archive

Raspbian I2S Driver導入チャレンジ Archive

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  • Comments (Close): -
  • TrackBack (Close): -

I2S Driver Ready!

ネットの情報を探していろいろ迷子になりましたが最終的に・・・
I2S Driver導入に成功!

今、RPi3(VolumioではなくRaspbian4.4.11) + I2S DACで音楽再生させながらブログ書いてるヽ(´∀`)ノ
Raspberry Piは古いバージョンだといろいろお作法が異なるようで、最初その方法でいろいろ試してみてはまった。
運良く(?)自分の環境に適した情報に巡り会え、そこからは比較的早く問題解決したと思う。
そんなわけで、時間がたつと直ぐにやり方忘れそうなので備忘録として手順を記録しておくこととする。

1.カーネルビルド環境の準備

前回カーネルビルドを試してみたわけだが、今回の作業でもカーネルビルドを行ったため、作業手順をここに纏めておく。なお、クロスコンパイルではなくセルフコンパイル(RPi自機でカーネルをビルドする作業)で行っている。

作業用ディレクトリ作成
piユーザでログインし作業用のディレクトリを作成し移動する
$ cd
$ mkdir kernel
$ cd kernel

カーネルのダウンロード
$ git clone --depth=1 https://github.com/raspberrypi/linux
これでカレントディレクトリに「linux」というディレクトリが作成され、カーネルビルドに必要なファイルが配置される。
bcもインストールしておいた方が良いらしいので、インストール
$ sudo apt-get update
$ sudo apt-get install bc

カーネルコンフィギュレーション作成
カーネルを構成する設定ファイルをどうやら作成する必要があるらしい
$ cd linux
$ KERNEL=kernel7
$ make bcm2709_defconfig
移動したlinuxディレクトリに.configというコンフィグレーションファイルが作成される。vi等で開けるが「勝手にいじるんじゃねー(DO NOT EDIT.)」っていうようなコメントが書かれているのでそっ閉じする。次節のmenuconfigというツールで編集するらしい。

menuconfigで.configを編集
menuconfig使うためにはlibncurses5-devというライブラリが必要らしいので以下を実行。
$ sudo apt-get install libncurses5-dev

menuconfigツールを起動する。
$ make menuconfig

前回のカーネルビルドの試行ではmenuconfigで一切変更せずスキップをしたが、今回はここが重要なので変更を実施する。
設定変更が必要なのは
Device Drivers>Sound card support>Advanced Linux Sound Architecture>ALSA for SoC audio support以下の設定。
kernelsetting.pngこんな感じでとりあえず何でもかんでも[M]にしておいた。(ビルド後ドライバーをインストールしなければ問題ないので全部でもいいかも)
Mキーを押すと<M>になりスペースキーを押すと< >になる。HifiBerry DACなどは「SoC Audio support for the Broadcom BCM2835 I2S module」が<M>になっていないと表示されないようだ。
「→」キーを押して「save」を選択してreturnキーを押せば設定が保存される。保存したら、Ctrl-C、returnでmenuconfigを終了する。

2.カーネルビルドの実施

Makefileの編集
Makefileを編集しEXTRAVERSIONという設定値に自分だけの特別な名前をつけよう!
$ cd ~/kernel/linux
$ vi Makefile
4行目に「EXTRAVERSION = 」という行があるので、=の後に適当に名前をつける。これが後でカーネルバージョンの確認をしたときに表示される。
EXTRAVERSION = hoteruaucra

カーネルのバックアップをしておいた方が良いらしいが復旧方法知らんので省略(爆

カーネルビルド実行
$ make -j4 zImage modules dtbs
$ sudo make modules_install
$ sudo cp arch/arm/boot/dts/*.dtb /boot/
$ sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
$ sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
$ sudo scripts/mkknlimg arch/arm/boot/zImage /boot/$KERNEL.img
「-j4」オプションを付けるとビルドの際、マルチスレッドで動作するらしいのでRPi3は4コアなのでそれらをフルに使ってビルドさせる。
初回の場合、RPi3で1時間30分ぐらいかかったが、前回すでに実施しているので今回は変更箇所だけだったので早く終わった(体感数分程度)。

カーネル再起動
以下のコマンドで再起動し再構築後のカーネルを起動させる。
$ sudo shutdown -r now

カーネルバージョンの確認
起動したらカーネルのバージョンを確認してみる。
$ uname -a
Linux raspberrypi 4.4.11hoteruaucura-v7+ #888 SMP Mon May 23 20:10:33 BST 2016 armv7l GNU/Linux

3.I2S DACドライバのインストール

カーネルビルドをして再起動しただけではI2Sのドライバは導入されないらしい。ドライバーをロード(起動時にロードされるよう設定)する必要があるらしい。

ドライバーファイルの確認
まず、新カーネルでドライバーファイルがちゃんとあるか確認してみる。
$ cd /lib/modules/4.4.11hoteruaucra-v7+/kernel/sound/soc/bcm
$ ls
snd-soc-adau1977-adc.ko snd-soc-hifiberry-amp.ko snd-soc-raspidac3.ko
snd-soc-audioinjector-pi-soundcard.ko snd-soc-hifiberry-dac.ko snd-soc-rpi-dac.ko
snd-soc-bcm2835-i2s.ko snd-soc-hifiberry-dacplus.ko snd-soc-rpi-proto.ko
snd-soc-boomberry-dac.ko snd-soc-hifiberry-digi.ko
snd-soc-boomberry-digi.ko snd-soc-iqaudio-dac.ko
.koというのがLinuxのドライバーファイルの拡張子らしい。snd-soc-hefiberry-dacplus.koなどが作成されている。
あとはこれをロードし、少しの設定を行う。

HifiBerry DAC+互換カード
購入したI2S DACカード「PiFi DAC+ V2.0」は「HifiBerry DAC+」(「プラス」が付く。プラスなしのドライバでは動かないらしい)の互換カードらしいので、HifiBerry DAC+用のドライバー導入すれば良いらしい。
以降の作業は以下を参考にした。

HiFiBerry software configuration (Linux 3.12)
Upgrading Raspbian to Jessie

ドライバーの起動時ロード設定

OS起動時にドライバーを自動ロードするために以下のコマンドで設定ファイル/etc/modulesを編集する。
$ sudo vi /etc/modules

以下を追記する。
snd_soc_bcm2708
bcm2708_dmaengine
snd_soc_pcm512x
snd_soc_hifiberry_dacplus
おそらくだがsnd_soc_bcm2708, bcm2708_dmaengineはなくても問題ないと思われる。この設定でも動作した。

ALSA設定ファイルの編集
/etc/asound.confを新たに作成する。
$ sudo vi /etc/asound.conf

以下の内容で編集する。
pcm.!default  {
type hw card 0
}
ctl.!default {
type hw card 0
}


BOOT設定ファイルの編集
/boot/config.txtを編集し、dtoverlay設定を行う。
$ sudo vi /boot/config.txt

以下を追記する(一番最後に)。
dtoverlay=hifiberry-dacplus


カーネルのアップデート
参考サイトによればカーネルのアップデートをした方が良いらしいので実行する。
※これを実施後、残念ながらhoteruaucraのバージョン情報は消えてしまった
$ sudo rpi-update


再起動
以上で設定は完了のため再起動を実行する。
$ sudo shutdown -r now


ドライバーのロード確認
再起動したら、以下のコマンドでドライバーがロードされていることを確認する。
$ lsmod

ロードされているドライバーの一覧が表示されるが以下の情報があれば多分問題ない。(抜粋して表示)
Module                  Size  Used by
snd_soc_pcm512x_i2c 2243 1
snd_bcm2835 20511 1
snd_soc_bcm2835_i2s 6354 2
snd_soc_hifiberry_dacplus 3972 1
snd_soc_pcm512x 17268 1 snd_soc_pcm512x_i2c


また以下のコマンドでサウンドデバイスとして認識されていることを確認する。
$ aplay -l
**** ハードウェアデバイス PLAYBACK のリスト ****
カード 0: ALSA [bcm2835 ALSA], デバイス 0: bcm2835 ALSA [bcm2835 ALSA]
サブデバイス: 8/8
サブデバイス #0: subdevice #0
サブデバイス #1: subdevice #1
サブデバイス #2: subdevice #2
サブデバイス #3: subdevice #3
サブデバイス #4: subdevice #4
サブデバイス #5: subdevice #5
サブデバイス #6: subdevice #6
サブデバイス #7: subdevice #7
カード 0: ALSA [bcm2835 ALSA], デバイス 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
サブデバイス: 1/1
サブデバイス #0: subdevice #0
カード 1: sndrpihifiberry [snd_rpi_hifiberry_dacplus], デバイス 0: HiFiBerry DAC+ HiFi pcm512x-hifi-0 []
サブデバイス: 1/1
サブデバイス #0: subdevice #0
カード1にHifiBerry DAC+が見えているのでOK!

4.音楽再生してみる
wavファイル再生
wavファイルであればaplayで出来る。aplayで追加したDACカードで再生させるために以下のようにデバイスを指定して実行する。
$ aplay -D hw:1,0 test.wav

ちゃんと音がでてる!w(゚o゚)w
ちなみに、音を再生中だとこのDACカードは緑色のLED(カード右端)が点灯するようだ。
IMG_0487.jpg

MP3ファイルの再生
aplayではwavファイルしか再生できないので、mp3を再生するには対応のプレーヤーが必要だが、以前に導入したsoxのplayコマンドではデバイス指定の方法がちょっとわからなかったので(判明しました。最後に追記)、別のプレーヤーalsaplayerを導入する。以下のコマンドを実行してalsaplayerをインストールする。
$ sudo apt-get -y install alsa-base
$ sudo apt-get -y install alsa-tools
$ sudo apt-get -y install alsa-utils
$ sudo apt-get -y install alsaplayer-common
$ sudo apt-get -y install alsaplayer-text

alsaplayerでデバイス指定して再生するには以下のようなコマンドを実行する。
$ alsaplayer -i text -d hw:1,0 test.mp3


(2016.6.3追記)
playコマンドでデバイスを指定して実行する方法は以下のとおり
export AUDIODEV=hw:1,0
export AUDIODRIVER=alsa
play test.mp3


(2016.6.3追記)
5.SoC上のサウンドデバイスを無効にする
この設定をすると音質が向上する、らしい。。
sudo vi /etc/modprobe.d/raspi-blacklist.conf
(以下の行を追加)
blacklist snd_bcm2835
保存して再起動する。
aplay -l
**** ハードウェアデバイス PLAYBACK のリスト ****
カード 1: sndrpihifiberry [snd_rpi_hifiberry_dacplus], デバイス 0: HiFiBerry DAC+ HiFi pcm512x-hifi-0 []
サブデバイス: 0/1
サブデバイス #0: subdevice #0
カード0が表示されなくなった。これでSoC内のサウンドデバイスは無効になった。

カーネルビルドの試行

RPiオーディオ関連からスピンオフしてこのブログカテゴリではRaspbian OSにI2S Driverを導入してI2S DACを動かせるかどうかのチャレンジを記録していくことにする。

I2S DriverをRaspbianに導入するにはどうやらカーネルのビルドやらドライバーモジュールのコンパイルなどOSそのもののカスタマイズのようなことをしなければならないようだ。
またLinuxカーネルをビルドするには「セルフコンパイル」という自機でのコンパイルと「クロスコンパイル」という別のLinuxマシンでコンパイルの2つがあるようだ。RPiはPCに比較して非力なマシンなのでセルフコンパイルを行うと非常に時間を要するようだ。ただし、調べた限りクロスコンパイルは環境を構築する、実際にビルドするのに手間がかかるそうなのでちょっと今回は見送ってハマリ度合いが低そうなセルフコンパイルを行うこととし、カーネルビルドを体験してみることにする。

参考にしたサイトはこちら。
Raspberry Pi 2でカーネルをカスタムして構築

Raspbianは教育用のディストリビューションとのことなので、コンパイラなどの開発ツールは最初からインストールされているようで、参考サイトの手順通りで(一部記載ミスがあったようだが、そこはテキトーに読み替えて)うまくいった。参考サイトはRaspberry Pi2を対象にしたものだが、Raspberry Pi 3でも問題ないようだ。
ちなみにコンパイル時間は1時間30分ほどかかった。参考サイトでは4時間以上かかったようだが、追記されていたマルチスレッドモードの方法を採用したので、その分早くなったんだろう。あとはRPi2よりもCPUのクロックが上がっているのも要因としてはあるだろう。それにしてもクロスコンパイラ環境ならさらに劇的に早くなるんだろうな、たぶん。。。でもまあ、2時間弱で終わるなら許容範囲かな?
余裕が出来たら、クロスコンパイラ環境の研究もしてみたいと思う。

さて、カーネルビルドが終了し再起動して参考サイトのとおりバージョンをチェックしたところ
pi@raspberrypi:~$ uname -a
Linux raspberrypi 4.4.11hoteruaucra-v7+ #1 SMP Sat May 28 20:13:19 JST 2016 armv7l GNU/Linux
となっており、「hoteruaucra」は自分が付けたリビジョン名だったため、正しく反映されているようだ。何も手を入れていないリビジョン名だけを変更した自分だけのRaspbianバージョンがこれで完成した。

嬉しいんだか、嬉しくないんだか・・

Home > Raspbian I2S Driver導入チャレンジ Archive

Tag Cloud
Search
Monthly Archive
Feeds

Return to page top

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。