Raspberry Pi ALSA I2S ドライバ その2

以前、http://abc002.blogspot.jp/2013/01/raspberry-pi-alsa-i2s.html
の記事で紹介した Raspberry Pi ALSA I2S ドライバですが
5月頭に動きがあったみたいですね。
1月のころはドライバのみ公開されていましたが、今はLinuxカーネルごとgitに登録されています。

それじゃ、さっそく試してみよう~(´∀`)

いくつか失敗したのですが、失敗談は省略しちゃいます。
以下、2013/5/15時点の話になります。
そうそう、バックアップとっといたほうがいいかもね~
作業中何度か /boot のファイルの一部壊れたりしました(>_<)

クロスコンパイルにカーネル設定ファイルが必要になります。
まぁ、一から自分で設定してもいいのですが無理!(;´д`)
だったので、まずRPiのカーネルを3.8にアップデートします。
rpi-update 2c4e92c01ff14d8f3e1ee35b995d430b4e6d1e1b
で3.8.4になります。
BRANCH=next rpi-update
で 3.8.12 になります。
ここで再起動し、3.8.12にRPiを起動します。
起動したら
zcat /proc/config.gz > .config
で、.configを生成。
まずはRPi上の作業はこれで置いときます。

次にソースコードの取得ですね。
gitで直接取得はものすごく遅かったので、
Windows上で https://github.com/koalo/linux からzipでダウンロードします。

TeraTermでクロスコンパイル環境に接続して、TeraTermのメニューの
 ファイル>SSH SCP...
で linux-rpi-3.8.y-asocdev.zip を転送。
適当な場所で
[VirtualBox]$ unzip linux-rpi-3.8.y-asocdev.zip
[VirtualBox]$ cd linux-rpi-3.8.y-asocdev
[VirtualBox]$ scp pi@192.168.xxx.xxx:/home/pi/.config .
[VirtualBox]$ DEB_HOST_ARCH=armhf fakeroot make-kpkg --arch arm --subarch armhf --cross_compile arm-unknown-linux-gnueabi- --revision 0.1 --config menuconfig configure
最後のコマンドはTeraTermの画面が狭いとエラーになるので普通以上のウィンドウサイズにしておきましょう。
カーネル設定メニューが表示されたら以下のオプションに「*」や「M」をつけて有効にします。

Device Drivers -> DMA Engine Support -> BCM2708 DMA engine support
Device Drivers -> Sound card support  -> Advanced Linux Sound Architecture  ->ALSA for SoC audio support  ->SoC Audio support for the Broadcom BCM2708 I2S module 
   Support for AudioCODEC for mbed (TLV320AIC32B)     
   Support for TDA1541A                               
   Support for Audio Codec Board - PROTO (WM8731)     
   Support for ESS9018

でもってコンパイル! (**手順A**
[VirtualBox]$ DEB_HOST_ARCH=armhf fakeroot make-kpkg --arch arm --subarch armhf --cross_compile arm-unknown-linux-gnueabi- --revision 0.1 --us --uc kernel_image modules_image
1個上のディレクトリに linux-image-3.8.10_0.1_armhf.deb ができていれば成功です。
[VirtualBox]$ scp linux-image-3.8.10_0.1_armhf.deb pi@192.168.xxx.xxx:/home/pi
で、RPiに転送します。

次からRPi上での作業になります。
sudo dpkg -i linux-image-3.8.10_0.1_armhf.deb
で新カーネルをインストール。
/boot/config.txt に以下の行を追加してインストールしたカーネルで起動するように設定します。
kernel=vmlinuz-3.8.10
再起動
再起動したら以下のコマンドでドライバを組み込みます。
raspberrypi:~> sudo insmod /lib/modules/3.8.10/kernel/sound/soc/bcm2708/snd-soc-bcm2708-i2s.ko
raspberrypi:~> sudo insmod /lib/modules/3.8.10/kernel/sound/soc/bcm2708/snd-soc-rpi-tda1541a.ko
raspberrypi:~> sudo insmod /lib/modules/3.8.10/kernel/sound/soc//codecs/snd-soc-tda1541a.ko
ふぅ~これで準備完了です。(;´д`)
適当なwavやmp3をRPiに転送して再生してみましょう~
raspberrypi:~> 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 1: sndrpitda1541a [snd_rpi_tda1541a], device 0: TDA1541A HiFi tda1541a-hifi-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
となっている場合は
mpg321 -a hw:1 pppp.mp3
aplay -D hw:1 aaa.wav
aplay -D hw:1 -B10000000 aaa.wav  (underrun!!!と出る場合こうするといいかもしれない)
で再生出来ます。
が!
前回もそうでしたが出力されるデータはI2Sフォーマットです。
オシロの画面を見てみましょう。
黄色い線がLRクロック、左の青い線がビットクロック、右の青い線がシリアルデータです。
 

ふむ、1月頃のと同じ出力ですね~システムクロックが必要なくてI2Sフォーマットを入力できるDAC ICは手軽に手に入らないんですよね~というか売ってるのか?ってレベルです。

ということで、前回と同じように標準フォーマットを出力できるようにいじってみます。

クロスコンパイル環境上で
 linux-rpi-3.8.y-asocdev/sound/soc/bcm2708/bcm2708-i2s.c
を編集します。
492行目(github上だと559行目)の次行辺りに赤文字の1行を足します。
        /*
         * Set format for both streams.
         * We cannot set another frame length (and therefore word length) anyway,
         * so the format will be the same.
         */
format = 0<<31 | 1<<30 | 16 << 20  | 8<<16   |   0<<15 | 1<<14 | 48<<4 | 8 ;
        bcm2708_i2s_write_reg(dev, BCM2708_I2S_RXC_A_REG, format);
        bcm2708_i2s_write_reg(dev, BCM2708_I2S_TXC_A_REG, format);
これで強制的に標準フォーマットを出力するようにします。
前回同様LRクロックは反転しないといけないかもですが音は鳴るはず!(´~`)
RPi上でカーネルを元に戻して起動するため /boot/config.txt を編集します。
#kernel=vmlinuz-3.8.10
コメントアウトするだけです。
一旦再起動
sudo  dpkg -r linux-image-3.8.10
で、linux-image-3.8.10_0.1_armhf.deb からしインストールたカーネルをアンインストール。
でもって(**手順A**)からやり直します。

では出力信号を見てみましょう。
黄色い線がLRクロック、青い線がシリアルデータです。

右詰な標準フォーマットっぽくなっていますね。(´∀`)

前回同様、DACに BU9480F、OPアンプは NJM2114DD を繋いで再生してみると~みごとに鳴ってくれました。(ノ゜o゜)ノ
(ブレッドボード中央のICは関係ありません。)
 



今回のドライバは前回より改良されてますね。
aplayとの相性が悪かったのですが、今回のはaplayで問題なく再生出来ます。
また、前のは瞬断が頻発してましたが、今回のは発生しませんでした。たまにしか起きません。
(起動直後は音飛びしやすいっぽいかな。)
このI2S ALSA ドライバは十分オーディオ再生に使えるドライバだと思われます。





0 件のコメント:

コメントを投稿