2017-01-07

作業メモ

Raspberry Pi を使い、外部クロック同期で、SPDIFを出す基板に対応するために、いろいろとカーネルに手を入れたのでそのメモ残し。

・環境
 Raspberry Pi 3
 Raspbian OS
 mpd

Volumioでやろうかとも思ったのですが、エディタすら入ってなかったのであきらめました。
Raspbian OS を GitHub から持ってきて、カーネルを一度ビルドかけておきます。
放熱しないと、時々熱で処理速度が落ちるので、その際は息を吹きかけて、とかやってると1時間ちょっとくらいでビルドが終わります。
ビルドが終わったら、カーネル差し替えて、動くよね、と確認しておきます。
#ここらの手順は、Raspberry Pi のサイトにあります。

・ドライバの組み込み。
bcm2835-i2s と、Rpi-dac およびpcm1794a-hifiの組み合わせで利用。
/boot/config.txt にどいつを組み込むかが書いてあるので、そこに rpi-dac を記述。
参考
rebootかけて、lsmodすると、rpi-dac周りが入ってるはず。入ってなければ rmmod とかで不要なドライバを抜いて、insmod でrpi-dacとかを入れておく。

・ドライバの改造
GPIOでいろいろ情報を渡す(サンプルレートとか)ので、それができるように設定する必要がある。
カーネルビルドを行った環境で、以下を参照。
linux/arch/arm/boot/dts/overlays/rpi-dac-overlay.dts
fragment@2 {
target = <&sound>;
__overlay__ {
compatible = "rpi,rpi-dac";
i2s-controller = <&i2s>;
status = "okay";
};
};
この _overlay_ の内側に、gpioの識別名-gpio = <&gpio ポート番号 値> ; とかいう形で記述しておくと、後ほどドライバからこの設定を読み込んで、指定のgpioの値の書き換えが可能となる。これが最初どこにあるかさっぱりわからなかった…

ここにgpioの設定を書き込んだ後に、linux/sound/soc/bcm/bcm2835-i2s.cを書き換える。

bcm2835_i2s_probeの中で、devm_gpiod_get を使って、上記の「gpioの識別名」に対応する情報が得られる。この情報を使って、gpiod_set_value_cansleepで値をセットすると、きちんと反映されるようになった。

後はスレーブモードになるように設定値を変えれば、大体終了。

カーネルをビルドしなおして、差し替えをしてrebootすれば、これらの設定が生きるようになるはず。

あとは、mpd入れて、適当なファイルを再生すれば、きちんと鳴ることが確認できました。

gpioの設定を理解するまでが長かった…判りやすく解説している情報がなかったので、clock44 という文字列で、カーネル中をすべて検索してよーやく…

0 件のコメント: