Raspberry Pi ALSA I2S ドライバ

※Raspberry Pi ALSA I2S ドライバ その2 UPしました。※


今回は前々回チラッっと書いた I2S ネタです。
以下のスレッドで公開されているドライバーを組み込んでみます。
http://www.raspberrypi.org/phpBB3/viewtopic.php?f=44&t=8496&p=257874

I2SはIC間でオーディオ系データをやりとりする規格らしいです。
Rasspberry Pi でそれが出力されると何が出来るのかというと、
マイコンのように DAC IC を直接接続することが出来ます。

ドライバのコンパイルはうまくいかなし、電子回路は素人だし...
で、音が鳴るまでには結構時間かかっちゃいました。(;´д`)

まずはドライバのコンパイルですね。
rootで作業します。
ドライバのソースコードは
で公開されていますので、/root/i2s 辺りにダウンロードしておきます。

ドライバコンパイルにはカーネルソースも必要なのでダウンロードします。
カーネルのバージョンは3.6.11my+だと仮定します。
cd /usr/src
git clone -b rpi-3.6.y https://github.com/raspberrypi/linux.git
mv linux 3.6.11my+
cd 3.6.11my+
zcat /proc/config.gz > .config
make oldconfig
Makefile編集(4行目 EXTRAVERSION = my)
make modules_prepare
クロスコンパイル環境から Module.symvers を RPi の /usr/src/3.6.11my+/ へコピー
※Module.symvers はカーネルをコンパイルしないと生成されません。
cd /root/i2s
make -C /usr/src/3.6.11my+ M=/root/i2s modules
depmod -a
makeでエラーでなければOK。snd_pcm_pi_i2s.ko というファイルが出来ていると思います。
insmod snd_pcm_pi_i2s.ko
でドライバーを組み込めます。

mpg123 や aplay は相性が悪い?ようなので、他のプレイヤーをインストールします。
apt-get install alsaplayer alsaplayer-text
おっと、忘れてました。

I2Sの信号は以下のピンから出力されます。
参考HP
http://elinux.org/RPi_BCM2835_GPIOs
http://www.raspberrypi-spy.co.uk/2012/09/raspberry-pi-p5-header/
GPIO28 PCM_CLK
GPIO29 PCM_FS
GPIO30 PCM_DIN
GPIO31 PCM_DOUT
 


Rev2のRPiだと赤丸の所にヘッダーピンを取り付けやすくなっているので半田付けします。

それでは再生~(ノ゜o゜)ノ
root@raspberrypi:~/i2s# 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: I2s [Pi I2s], device 0: Dummy PCM [Raspberry Pi PCM I2S]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
となっている場合は
alsaplayer -i text -d hw:1,0 test.mp3

で、I2Sの方に出力してくれます。
終了は別ターミナルから
alsaplayer --quit

ここでどんな信号が出ているのか見ておきます。

 


左詰になっていますね~これはI2Sフォーマットかな。
手軽に扱える DAC IC は BU9480F しか持っていなくて、
これは右詰の標準フォーマットでないといけないんですよね~。

I2Sフォーマットを入力出来る PCM1716 を買ってきたのですが、
組んでるうちにシステムクロックの出力がないので使えないことに気付いた~ ( ̄~ ̄;)

何か手軽な方法ないかと bcm2835 のデータシートPDFを眺めていると、
信号の出力フォーマットを変えられそうなことに気付きました。(・∀・)
最初に何度か見ていたんだけど、英語なので気付かなかったわ~(;´д`)

snd_pcm_pi_i2s.c の632行目を以下のように変更します。
//    *(i2s_registers+TXC_A) = 0<<31 | 1<<30 | 1 << 20  | 8<<16   |   0<<15 | 1<<14 | 33<<4 | 8 ;
    *(i2s_registers+TXC_A) = 0<<31 | 1<<30 | 16 << 20  | 8<<16   |   0<<15 | 1<<14 | 48<<4 | 8 ;
これで右詰っぽくなります。
LRクロックも反転しないといけないみたいですが、音は鳴るでしょう(タブン...
信号を見てみます。




それっぽくなっていますね。(・∀・)
DAC、アンプを繋いでヘッドホンで聴いてみると...
(写真の真ん中のICは関係ありません)


鳴った~!(ノ゜o゜)ノ
でも、たまに音が瞬断みたいな感じになりますね~
ドライバーの今後の修正に期待ってところでしょうか。

にしても Raspberry Pi はいろいろできて、おもしろいですな~(=´∇`=)
部品があればハイレゾ音源も試してみたいですわ。



0 件のコメント:

コメントを投稿