以前の記事に引き続き、I2Sドライバのコンパイルをあきらめず続ける。
「三日坊主な私がいつまでブログやれるか...( ̄~ ̄;) 」のラズベリーパイの記事を参考にさせていただいています。
volumio+hifiberry PRO+ ラズベリーパイ1B+自作変換ケーブルでやってみたところ、すぐに異常なシャットダウンしてしまい、一瞬で潰してしまったのか、hifiberry PRO+のI2Cが認識せず、デバイスが認識されないという苦しい事態になってしまいました。I2Cで認識されないと、デバイスとして登録されない仕組みになっているようです。その後、直刺しできるラズベリーパイ2Bを購入したものの、I2Cが認識しない状況は変わらず、ICを付け替えようと思っています。ちなみに、ICの付け替えは、まずICの根元を全部ニッパで切ってしまえば、特別の機械を使わなくても簡単に除去できます(「RaspberryPiを改造してみましょう。UPI-1を使ったリニア電源」参照。ちなみにここでは、RaspberryPiの電源のリニア化の改造のため、スイッチング電源ICの除去が書かれています)。根元にニッパを入れるのがコツです。
<2018.3.25 結局壊してしまいました。。>
<2018.3.25 削除 試行錯誤を書いているだけだったなので、削除しました。>
<2018.3.25 > 以下のbcm2708-i2c.cは、現在ラズベリーパイが40ピンになりbcm2835-i2c.cになっているので、読み替えてください。
その後、サウンドモジュールをコンパイルして、insmodでモジュールを登録します。
rpi-updateのサイト内の「Examples on how to build various modules」を参考に、
まず、cd /root/xxxxxx/sound/soc/bcmで、ソースのフォルダへ移動します。xxxxxは、そのバージョンのカーネルソースのフォルダです。
その後、 コンパイルとしてinsmodコマンドで、モジュールを登録します。soc2708-i2c.cは、「snd-soc」が付いた名前に変更になりオブジェクトファイルが生成されます。そのファイル名称は、/root/xxxxxx/sound/soc/bcm内のmakefileにより定められています。
「make -C /lib/modules/$(uname -r)/build M=$(pwd) modules <コンパイル>
sudo insmod snd-soc2708-i2c.ko <単にモジュールを登録するだけ>
sudo insmod snd-soc-rpi-dac.ko <単にモジュールを登録するだけ>
sudo make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install
sudo depmod <依存関係を考慮して登録する>
ここで、$(pwd)はルートフォルダの環境変数、uname -rは現行カーネルのバージョン名です。おそらく。
次に、cd /root/xxxxxx/sound/soc/codecs (各DAC固有のコードの記述がある)についても、同様に、
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules <コンパイル>
snd-soc-pcm1794a.koにつき、
sudo insmod snd-soc-pcm1794a.ko
sudo make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install
sudo depmod
次に、
同サイト内の「Raspberry Pi 最近のI2S出力事情」を参考に、
/etc/modulesに
「snd_soc_bcm2708_i2s
bcm2708_dmaengine
snd-soc-pcm1794a
snd_soc_rpi_dac 」を追加します。
その後、rebootで再起動して、aplay -lで、デバイスが登録されているか確認・・・
しかし。。。。デバイスは登録されていません。あれー?
ラズパイは難しいですねえ。また、インストールとかダウンロードとかに、やたら時間を取られる。
モジュールが登録されたからといって、それを包括したデバイスが登録されるとは限らない。
(あと、github内の「 SatoruKawase/SabreBerry32」のmakefileが参考になる。同makefileでは、.koファイルのコピー先を具体的に指定している。もしかすると、modules_installのコピー先が怪しいかもしれないし、modprobe snd-soc-rpi-dacコマンドをやっていないのが、まずいのかもしれない。)
しかたないので、同サイトの「最近のI2S出力事情」にはデバイスが登録されたとあるので、追試すべく、
ラズビアンの2014-01-07-wheezy-raspbianをインストールすることにしました。
しかし、・・・win32diskImagerを使ってみましたが、・・・・起動しません。
2014-01-07-・・・を疑い、その次のバージョンをインストールしました。でもやっぱり起動しないので、
sdカードを疑いました。直すのはどうしたらいいのだろう??
exfatで検索して、SD Formatterなるソフトを発見しインストールしました。win7上で、100MBとなっていたのが、16Gバイトへ復活しました。再度、当該次のバージョンをインストールして、
/etc/modulesに
「snd_soc_bcm2708_i2s
bcm2708_dmaengine
snd-soc-pcm1794a
snd_soc_rpi_dac 」を追加し、再起動してみると、
aplay -lをすると、簡単にデバイスが登録されました。
このことから、モジュール群を/etc/modulesに書き込むと、デバイスが自動的に登録されるようです。
ちなみに、ラズビアンで、rootでログインすると、パスワードがいらないという記事が多くありましたが、このバージョンでは、そのようなログインはできず、piアカウント、パスワードraspberryでログインし、
sudo suで、スーパーユーザーになりました。スーパーユーザーにならないと、カーネルソースを見ることができません。
<2018.3.25 追記>
現在の最新のラズビアンをインストールすると、
/etc/modulesに追加するのは、「snd_soc_rpi_dac 」だけでよく、
当該追加に加えて、/boot/overlaysというフォルダに含まれる.dtbo”というファイル群の中の1つのファイル名を選んで、
sudo nano /boot/config.txt
で、当該config.txtというファイルを開き、「dtoverlay=rpi-dac.dtbo」を一行書き加え、
lsmod
をすると、現在のカーネルでは、bcm2708-i2sの代わりとなっているsnd_soc_bcm2835_i2sや、snd_soc_pcm1794aが以下の通り勝手に登録されています。(bcm2708-i2sは、24ピン時代のラズベリーパイ初代A,Bのピン配置に有効であると思われます。40ピンの初代B+,ラズベリーパイ2以降の場合、おそらくbcm2835-i2s.cを修正することになります。
もっとも、bcm2708-i2sで必要だった2835-i2sのソースでの772行、773行では、24ピット、32ビットの記載がすでに追加されており、
| SNDRV_PCM_FMTBIT_S24_LE
| SNDRV_PCM_FMTBIT_S32_LE
従前必要だった修正は不要と考えられます。)
snd_soc_pcm1794a 2310 1
uio_pdrv_genirq 3923 0
uio 10204 1 uio_pdrv_genirq
fixed 3285 0
snd_soc_rpi_dac 3036 0
snd_soc_core 180471 3 snd_soc_pcm1794a,snd_soc_rpi_dac,snd_soc_bcm2835_i2s
その後、rpi-sourceコマンドで、カーネルソースをインストールし、snd_soc_bcm2708_i2sを部分的に修正したのち、上記のコンパイルして、insmodをすると、「既にあります」というエラー。
「Error: could not insert module snd-soc-bcm2708-i2s.ko: File exists」
remmod snd-soc-bcm2708-i2sとして、現状のモジュールを削除しようとすると、「使われています。」というエラー。つまり依存関係があるというエラー。
「Error: Module snd_soc_bcm2708_i2s is in use」
lsmodコマンドでモジュール一覧を確認すると、左から3列目に個数があり、
「snd_soc_bcm2708_i2s 5486 2」
これが左のモジュールにぶら下がっているモジュールの数。おそらく。
snd-soc-bcm2708-i2sを除去するには、snd_soc_rpi_dacなどを除去する必要があり、その後、改めてinsmodをする。
新しいモジュールが作動しているかは、gpioコマンドを埋め込みチェックする予定です(上記「三日坊主~」様の「Raspberry Pi i2s出力とPCM1716でノイズ対策 」参照)。
とりあえず、snd-soc-pcm1794a を中心に、外部クロック入力をやっていこうと考えています。
はじめまして。
現在、I2S入力仕様に改変致しましたsnd-soc-pcm1794aをMakeして組み込む所でもがいておりまして、御ページにたどり着きました。
数ヶ月前に組んだ時はJessieで何も考えないでうまく行ったのですが、SDファイルが壊れたのが運のつきでした。構築してもarecordでデバイスが出て来ず、モジュールが入っていないようです。(aplayでは出てきます)JessieからWheezyにしたのですが、うまく行っておりません。難しいものですね・・・
(※メールアドレス表記の方はどうかご勘弁下さい)
お役に立てて光栄です。
ごめんなさい。1年ぐらい更新していませんでした。今あなたのコメントをアップしました。上記の通り、2014-01-07-wheezy-raspbianでやってもらえますでしょうか。
ラズパイ2などでは、bcm2708ではなくてbcm2835だったかもしれません。