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

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

ラズベリーパイB

ラズベリーパイ、volumioカーネル環境2 I2Sドライバのコンパイル

投稿日:2016年5月2日 更新日:

前回の「ラズベリーパイ、volumioカーネル環境をmakeなしクロスコンパイルなしで2時間で立ち上げる。クロスLAN接続」に引き続き、ラズベリーパイ、volumioカーネル環境で、I2Sドライバをコンパイルすることを検討する。
前回、rpi-updateにより、ラズベリーパイのカーネルをアップデートするのは微妙だと申したが、結局やることにした。前回申したように、外部クロックを用いるラズベリーパイ対応の「HiFiBerry DAC+ PRO」のドライバーは、アップデートしたものにしか対応しておらず、それはそれに対応するソースコードを「rpi-source」 というコマンドで一式ダウンロードして(Module.symversもダウンロードできる)、新旧バージョンで比較して分かったからである。つまり前のバージョンでは、「HiFiBerrydacplus.c」は簡素なプログラムで外部クロックの入力などは記述されていないのに対し、アップデートしたものに対応してソースをダウンロードすると、その動作が詳細に記述されているので、その違いが分かった。
ところで、前回申したように、「rpi-source」 を利用すれば、ソースコードをダウンロードするのに、makeは不要と申した。

しかし、そもそもなぜにカーネル(linuxの核、中核)につきmakeが必要かというと、既にコンパイルされているカーネルとダウンローとしたソースの間に、バージョン違いなどの矛盾を解消し組織的一体性を確保するため、OSを動作させる実行可能なカーネルは、そのソースに基づいていなければならないという意味である(と私は理解した)(「Building External Modules – The Linux Kernel Archives」参照)。
したがって、本来はラズベリーパイ上にあるソースをコンパイルするため、makeコマンドを実行させるべきだが、ラズベリーパイは非力なため、そのコンパイルに時間がかかりラズベリーパイ上で実行できる実行ファイルを、PC上で作成するクロスコンパイルなる手段がある。しかし、クロスコンパイルをしてみると、mvプレーヤーという仮想ubuntuを用いた場合、通信速度が遅く、「apt-get upgrade」に意外にも何時間もかかってしまう。ちなみに、Module.symversは、クロスコンパイルにより出来上がり、それをラズベリーパイに移動させる。
しかし、「rpi-source」コマンドをすると、Module.symversを含めてダウンロードできる。
なお、gccのバージョンは、4.8など複数入れて管理するが、その管理方法としては、
「update-alternatives –config gcc」として、優先順位をグラフィカルに変えられる。

話は戻って、rpi-updateをした場合、バージョンの依存性の問題が生じ、
apt-get updateなどをするとエラーが生じる。
そのapt-get updateの過程で入力を求められるが、「N」を選択する。
「N/y」のうち、大文字のほうがデフォルト、お勧めなのか、エンターをするだけで入力される。
エラーは生じるが、「N」を選択した方が比較的少ない。
その後、前回の記事に従い、カーネルソースをダウンロードする。

次にようやく本題に入る。
私の目標は、正確な外部クロックソースで音声信号をラズベリーパイからDACに送るということである。
ラズベリーパイのI2Sは、指摘されているように、デフォルトのマスターモードでは、音声の再生速度とラズベリーパイ内で生成されるパルスの周期と微妙に異なるため、パルス幅が違うのを混ぜて、調整をしているということなので、これでは私の理想とは異なる。そこで、I2Sのカーネルドライバーを改造しようと考えており、当面の目標はI2Sのカーネルドライバーをコンパイルすることである。
そこで前回申したように、HiFiBerry DAC+ PROというDACには、水晶信号発信器が2つ搭載され、外部クロックで動作することが分かっており、それはvolumioに既に含まれているので、コンパイルをより確実に出来やすいのではないかと期待している。

そこで、参考にしたのが「三日坊主な私がいつまでブログやれるか...( ̄~ ̄;) 」の「Raspberry Pi I2S 出力 24bit 48kHz 再生 」である。そこに含まれる「linux-rpi-3.8.y-asocdev.zip」は、rpi-3.8つまりラズベリーパイのバージョンが3.8に対応するものであると思われるが、現在バージョン4.4であり、動作させることは私の技術ではできなかった。しかし、その内容をいろいろ試行錯誤して、ネットで調べているうちに見えてきたことがあるので、まとめておく。
今回の私の記事は、その「三日坊主・・・」のサイトの「Raspberry Pi I2S・・・」という記事の説明になってしまう。
https://github.com/koalo/linux
からソースコードの linux-rpi-3.8.y-asocdev.zip をダウンロードし、/usr/src に展開します。」とあるが、そのダウンロードの方法は、
「wget https://github.com/koalo/linux/archive/linux-rpi-3.8.y-asocdev.zip」です。
gitコマンドは、現在のlinuxの環境に対応して、最適なものをダウンロードする仕組みですが、特定バージョンのファイルを指定してダウンロードするには、wgetが便利です。
また、「/usr/srcに展開します。」とあるが、試行錯誤によると、このフォルダは何でもよいのではなくて、linuxカーネルのソースコードがある場所になるので、注意が必要です。
同記事には、
「cd /usr/src/3.8.10+
zcat /proc/config.gz > .config
make oldconfig
make modules_prepare
クロスコンパイル環境から Module.symvers を RPi の /usr/src/3.8.10+ へコピー」
とありますが、
これは、カーネルモジュールのソースのあるディレクトリへ移動し、そこで、configファイルを修正したうえで、「make modules_prepare」によりカーネルモジュール一式全部をコンパイルするという意味です(ラズベリパイ上で8時間かかるところPC上でクロスコンパイルして時間短縮するという意味)。
しかし、「rpi-source」コマンドをすれば、Module.symversを含めて30分でダウンロードできるのでこの4行のコマンドは不要です。make oldconfigはバージョン違いの矛盾を解消するためにあるようですが、大量の「Y/n」等の入力を要求され、かえって矛盾を生じさせる危険があるように思えるので、「rpi-source」コマンドをする場合には、やめた方がいいように思いました。

以下がラズベリーパイにログインしてコマンドを打った画面。
「root@volumio:~# dir       <ディレクトリの一覧表示>
linux
linux.1
linux-36bb5f17fc320d38d4e887aae8ff13806bb0f672
linux-36bb5f17fc320d38d4e887aae8ff13806bb0f672.tar.gz
linux-a6cf3c99bc89e2c010c2f78fbf9e3ed478ccfd46.tar.gz
usr
root@volumio:~# cd linux-36bb5f17fc320d38d4e887aae8ff13806bb0f672
root@volumio:~/linux-36bb5f17fc320d38d4e887aae8ff13806bb0f672#」
ここで、「~」とあるのは、気づきにくいかもしれませんが/rootディレクトリを表しており、
「~/linux-36bb5f17fc320d38d4e887aae8ff13806bb0f672」は、
「/root/linux-36bb5f17fc320d38d4e887aae8ff13806bb0f672」を表しています。
「/root」という風に「/」を付してフォルダを指定するのは絶対参照になり、すでに/rootディレクトリにいる場合には、「/」を付さず
「cd linux-36bb5f17fc320d38d4e887aae8ff13806bb0f672」により、相対参照でそのフォルダ内に入れます。
ここで、「/root/linux-36bb5f17fc320d38d4e887aae8ff13806bb0f672」は、アップデートしたラズベリーパイのカーネルに対応するソースコードの格納場所です。このフォルダは、バージョンの相違によって前回の記事とは異なっています。
この格納部分は、上記「三日坊主・・・」サイトの「/usr/src」に対応する部分であるので、アレンジするには、注意が必要です。この長いフォルダ名は、環境変数(uname /r)で指定されているので、みだりに変えない方がいいかもしれません。

次に同サイトの記事の下の方に、
「cd /usr/src/3.8.10+/sound/soc/bcm2708
make -C /usr/src/3.8.10+ M=/usr/src/3.8.10+/sound/soc/bcm2708 modules」とありますが、ここでメークコマンドの解説をしておきます。
要するに「make -C フォルダ1 M=フォルダ2 modules」という構造になっており、
フォルダ1は、カーネルのソースの格納場所、フォルダ2は、部分的にコンパイルしたいソースの格納場所です。そのmakeの実行の前提として、cd(チェンジディレクトリ)のコマンドで、カーネルのソースの格納場所に移動しておく必要があります。
上記の例では、「/root/linux-36bb5f17fc320d38d4e887aae8ff13806bb0f672」が、カーネルソースの格納場所であって、上記の「三日坊主~」のサイトの「/usr/src」にあたります。36bb…は、カーネルのバージョンで異なります。
「modules」を付すると、フォルダ2内のすべての.cファイルをコンパイルしますが、日付を見て既にコンパイルされたものは対象外です。

面倒なので、環境変数を登録しておきます(電源を切ると忘れます)。
「export linuxbcm=~/linux-36bb5f17fc320d38d4e887aae8ff13806bb0f672/sound/soc/bcm」とすると、linuxbcmという環境変数を登録できます。なお、上記「/root/linux-36bb5f17fc320d38d4e887aae8ff13806bb0f672」というカーネルソースの場所は、PWDという環境変数で登録されています。
したがって、
「cd $PWD
make $PWD M=linuxbcm modules」とします。
このモジュールをカーネルへインストールするには、「insmod」コマンドを使えばいいはずですが、エラーが出て蹴られます。i2cのドライバーは、独立のモジュールではなく依存関係がありますから、だめなのかと思いました。
そこで、「new_western_elec」というサイトの「SabreBerry32のドライバのコンパイル方法(SABRE9018Q2C)」や、上記「三日坊主・・・」というサイトの「Raspberry Pi I2S・・・」で引用されたkaolaさんのブログ「koalo’s blog」の「I2S Audio Support for Raspberry Pi 」を参考にして、・・・・
<修正:間違いが分かったので削除します。2016.7.18→同日の記事へ>

なお、「nano /etc/modprobe.d/raspi-blacklist.conf」によりファイルを開いて
禁止を解除するとありますが、現在のバージョンではブラックリストに入っておらず、解除が必要ないようでしたし、raspi-blacklist.confは名称が「fbdev-blacklist.conf」へ変わっています。
「root@volumio:/# cd /etc/modprobe.d/
root@volumio:/etc/modprobe.d# dir
alsa-base.conf.dpkg-bak fbdev-blacklist.conf local.conf」

<間違いが分かったので、削除しました。2016.7.18>

とりあえず、今回はここで終了しました。ラズパイは難しい・・・
ダウンロードとか、アップデートとかに、やたら時間がかかる。

もっと汎用的なドライバーにするべく、
i2cで命令すべきことを別ファイルに記述し、このファイルを読み込むようにすれば
DACごとのコンパイルも不要になるように思うので、そのように改造したいです。

-ラズベリーパイB

執筆者:


comment

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

CAPTCHA


関連記事

no image

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

11 カーネルソースの編集 編集すべきは、以下の3つ。 (1) rpi-dac.c  (snd_soc_rpi_dac) (2) bcm2835-i2s.c (snd_soc_bcm2835_i2s) …

no image

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

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

no image

ラズベリーパイ、volumioカーネル環境をmakeなしクロスコンパイルなしで2時間で立ち上げる。クロスLAN接続

私は、ラズベリーパイをリニア電源(スイッチング電源でなくノイズが少ない)で動作するノーマルBモデル、rev2(過去記事「ラズベリーパイモデルBの入手と設定1」)をaliexpressで入手し、あえてこ …

no image

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

とりあえず、デバイス:de0-soc、DAC:wm8731用のクロックジェネレータのプロジェクトを公開。de0-socの開発CDに含まれているmy first fpgaを参考にした。 (図をクリックす …

no image

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

以前の記事に引き続き、I2Sドライバのコンパイルをあきらめず続ける。 「三日坊主な私がいつまでブログやれるか...( ̄~ ̄;) 」のラズベリーパイの記事を参考にさせていただいています。 volumio …

[最近の記事]
2016年5月
1234567
891011121314
15161718192021
22232425262728
293031