の記事で紹介した 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最後のコマンドはTeraTermの画面が狭いとエラーになるので普通以上のウィンドウサイズにしておきましょう。
[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
カーネル設定メニューが表示されたら以下のオプションに「*」や「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_image1個上のディレクトリに 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 を編集します。
一旦再起動!
でもって(**手順A**)からやり直します。
では出力信号を見てみましょう。
黄色い線がLRクロック、青い線がシリアルデータです。
右詰な標準フォーマットっぽくなっていますね。(´∀`)
前回同様、DACに BU9480F、OPアンプは NJM2114DD を繋いで再生してみると~みごとに鳴ってくれました。(ノ゜o゜)ノ
(ブレッドボード中央のICは関係ありません。)
今回のドライバは前回より改良されてますね。
aplayとの相性が悪かったのですが、今回のはaplayで問題なく再生出来ます。
また、前のは瞬断が頻発してましたが、今回のは発生しませんでした。たまにしか起きません。
(起動直後は音飛びしやすいっぽいかな。)
このI2S ALSA ドライバは十分オーディオ再生に使えるドライバだと思われます。
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 件のコメント:
コメントを投稿