やまちゃんのオーディオブログ

真空管アンプ、最近は資金調達のためのFX,MetaTrader4ネタもやっています。

ラズベリーパイB

ラズベリーパイ カーネル3 I2Sドライバのコンパイルをあきらめず続ける

投稿日:2016年7月18日 更新日:

以前の記事に引き続き、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 を中心に、外部クロック入力をやっていこうと考えています。

-ラズベリーパイB

執筆者:


  1. 新潟のよし より:

    はじめまして。
    現在、I2S入力仕様に改変致しましたsnd-soc-pcm1794aをMakeして組み込む所でもがいておりまして、御ページにたどり着きました。
    数ヶ月前に組んだ時はJessieで何も考えないでうまく行ったのですが、SDファイルが壊れたのが運のつきでした。構築してもarecordでデバイスが出て来ず、モジュールが入っていないようです。(aplayでは出てきます)JessieからWheezyにしたのですが、うまく行っておりません。難しいものですね・・・

    (※メールアドレス表記の方はどうかご勘弁下さい)

    • yama より:

      お役に立てて光栄です。
      ごめんなさい。1年ぐらい更新していませんでした。今あなたのコメントをアップしました。上記の通り、2014-01-07-wheezy-raspbianでやってもらえますでしょうか。
      ラズパイ2などでは、bcm2708ではなくてbcm2835だったかもしれません。

yama へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

no image

コマンドラインで動く、汎用i2sハイレゾモジュールの作り方(これまでのまとめ)。 (How to make a general i2s hi-resolution play-module with external bck clock using command-line on raspberry pi. And you can use gpio for operation)

これまでののうち、コマンドをまとめました。 <2018.4.28 追記 以下は、24ピンのラズパイBノーマルバージョンかつ当時のカーネルを使うことが前提になります。 今のカーネルには、bcm2708- …

no image

ラズベリーパイのi2s外部クロック、ついに動作確認

やりました! とうとうやりました。 PLLではなく、外部クロックでラズベリーパイを鳴らせることができました! bckも外部クロックで駆動しています。 使ったクロックは、キョーセラの7050k(22.5 …

no image

ラズベリーパイのi2s外部クロック、その後7(2018年度版)

過去記事では、ラズパイ2のi2s方式での音楽再生について、ラズパイ側がクロックスレーブとなる形式(ラズパイの外部からクロックを供給する形式)で再生するためのi2sのドライバーの改造方法、FPGAを用い …

no image

ラズベリーパイ LANクロスケーブル接続を外部ネットへ ネットワークブリッジ 接続トラブル

ラズベリーパイとPCとを直接つないで、かつ、ラズベリーパイを外部ネットワークにつなぐ方法 トラブル対策 ラズベリーパイには、私はvolumioを入れたが、基本はリナックスなので、リナックスベースのプロ …

no image

ラズベリーパイのi2s外部クロック、その後3-1(2018年度版)

前回の続きです。過去の記事にも同じようなことを書いているので、そちらも参照願います。 今回は、カーネルをいじることについて触れます。 <2018.4.30 修正:ファイルが大きくなりすぎたので、3つに …

[最近の記事]
2016年7月
 12
3456789
10111213141516
17181920212223
24252627282930
31