ラズパイI2Sドライバ改造

ラズパイに、外部からBCK/LRCKを与えて、それにロックしたSDATAを取り出して、SPDIF/AES EBUで取り出す基板向けのドライバ改造方法。

・全体方針
いろいろ考慮して、bcm2835-i2s(alsa) -> rpi-dac(I2S) -> pcm1794a-hifi(codec)の構成で動かす。

・GPIOの扱い
アプリケーションからだと、楽にアクセスできる関数があるが、デバイスドライバだと、その操作結果が残らないので、基板側にラッチを持つとかしないといけなくなる。それは使いにくいので、デバイスツリーを使って、GPIOの操作用データを取得し、それを使ってGPIOを変更する。

Device Tree についてのまとめ
よくまとまっている。参考にはしていないが、自分で調べて、納得した内容がそのまま整理されているので、こちらを参照することを推奨する。

・/boot/config.txt の改変。
デフォルトだと、hifiberryあたりが動くようになっているので、それを変更し rpi-dac が動くようにする。
<詳細なコードは別途>

・linux/arch/arm/boot/dts/overlays/rpi-dac-overlay.dts の改変
この基板は、以下のGPIO出力を必要とする。これにあわせて、GPIOを定義しておく。
FS22M : 44.1/88.2/176.4kHzの音源
FS24M : 48/96/192kHzの音源
RESET : FS切り替え時のリセット
DITFS0 : 44.1/48kHzの音源
DITFS1 : 44.1/48/88.2/96kHzの音源
<詳細なコードは別途>

・https://github.com/raspberrypi/linux/blob/rpi-4.4.y/sound/soc/bcm/rpi-dac.c の改変
snd_rpi_rpi_dac_probeの際に、上記GPIOを探し、静的変数へ保持しておく。
<詳細なコードは別途>

snd_rpi_rpi_dac_hw_paramsの際に、サンプリング周波数を得て、GPIOに必要な値を出力する。
<詳細なコードは別途>

snd_rpi_rpi_dac_daiの中の定義を、マスターモードに変更する。
SND_SOC_DAIFMT_CBS_CFS, (オリジナル)
SND_SOC_DAIFMT_CBM_CFM,  (変更後)

以上の修正を行った上で、カーネルのリビルド・インストール・再起動を行えば、外部クロックベースで動作させられるようになる。

テストはmpdで行っているが、おそらくVolumioでも、ドライバ入れて、それを選択できるように設定を追加すれば使えるのでは
ないかと思われる。

0 件のコメント: