2024年05月15日
PINE A64+ でSPDIF出力ができた(半分だけ?)
PINE A64(ラズパイみたいなもの)をオーディオ用途(MPDをUPNP+USBDACでネットワークプレイヤー)として使っているのですが、A64にはSPDIF出力(資料にわOWA)が有るのでそれに挑戦してみました。 理由の2つ目は昔作ったFN1242使用のDACがあるのでシンプルにSPDIFにしたかった事。
やってみてえらいハマりました。結局ソースコードを読んで検討する事3週間(^^;
先日ようやく16bit/96KHz(多分192KHzまでOKなはず、でも再生ファイルがないので未検証)で再生ができました。
結論は「armbian(というかdebianやubuntu)のsun4i-spdif.koではA64のspdifは正常に動作しない。使用しているカーネルに合ったソースコードよりディバイスドライバをビルドしてインストールの必要あり。」 また、24bitは再生速度が半分で変なのでソースコードも完全でないのかも(linux6.6.)
私の再生するファイルはCDリッピング物が殆どなので16bitで困らないんですが、チップは24bit対応ってなってるので動作させたいですね・・・
ちなみにOSはarmbian(jammyとbookworm両方)とdietPI(bookworm)の3種全部やったけど、最終的にarmbianのbookwormで実施
以下やった事をダラダラと忘備録
1.まず最初に試した(調べた)こと。
SPDIFはデバイスツリーでspdif@1c21000(spdifドライバー)の項目のの内、status="disabled";となっている → ディバイスオーバーツリー(本体のディバイスツリーを後から上書き修正できる方法)でokayに変えること。 又、サウンドの設定としてドライバーとcodecの設定をすること。
------オーバーレイファイル------
/dts-v1/;
/plugin/;
/ {
compatible = "allwinner,sun50i-a64-spdif\0allwinner,sun8i-h3-spdif";
fragment@0 {
target = <&spdif>;
__overlay__ {
pinctrl-names = "default";
pinctrl-0 = <&spdif_tx_pin>;
status = "okay";
};
};
fragment@1 {
target-path = "/";
__overlay__ {
spdif-sound {
compatible = "simple-audio-card";
simple-audio-card,name = "On-board SPDIF";
simple-audio-card,cpu {
sound-dai = <&spdif>;
};
simple-audio-card,codec {
sound-dai = <&spdif_out>;
};
};
spdif_out: spdif-out {
#sound-dai-cells = <0>;
compatible = "linux,spdif-dit";
};
};
};
};
------ここまで------
結果は惨敗。再生できるけど再生速度が半分位のゆっくりで低い音が出てくる。
しかも24bitを再生(aplayにて)すると16bitしか再生出来ないとのエラーまで・・・
2.次にやったこと。gitHubのソースコードを見て色々検証。
どうもarmbianというか、元になるDebian自体sun4i-spdif.koというallwinner用SPDIFのドライバーは有るが古いのでは? という事でソースコードからビルドすることに(デバイスのビルド方法は下のサイトで勉強しました。)
https://qiita.com/iwatake2222/items/1fdd2e0faaaa868a2db2
https://www.aps-web.jp/academy/23638/
ここでつまづきポイント。ソースコードからのビルドにはヘッダーファイルが必要ですが、allwinner,sun50i-a64のチップ用にはsunxi用のが必要で(私の実施したときは6.6.16-current)その時のソースコードが必要。最初GitHubからsunxi-spdif.cとかダウンロードしてビルドして大量のエラー発生。何でかと思ったらlinux3の古いコードでした、エラー発生して当然。
結局6.6.16のコードを下の所からコピーして使いました。これは大元のlinuxのソースコードですね。armbianでもDebianでもないので、dietpiとか他のlinux系でも流用できそうですね。
(ファイルはGitHubでもあるんですが、下のサイトの方がバージョン毎に探せて便利だったので)
https://elixir.bootlin.com/linux/v6.6.16/source/sound/soc/codecs/spdif_transmitter.c
https://elixir.bootlin.com/linux/v6.6.16/source/sound/soc/sunxi/sun4i-spdif.c
最初はlinux-ditが駄目だと思ってspdif_transmitter.cをビルド→標準のcodecドライバーのspdif-dit.koを削除してspdif_transmitter.koをインストールして確認→症状変わらず。
次にsun4i-spdif.cをビルドして標準のsun4i-spdif.koと入れ替えて確認→16bitなら音出し成功となったので、spdif_transmitterは要らなかったかも? もう元のを消した後なので未検証ですが・・・まあ次やる時にはsun4i-spdifからやります。
この3週間長かった・・・(まあ夜だけしか出来ないから3週間かかったんだけど)
linuxのドライバービルドを1から勉強が出来たから良いとしますか(^^;
今はusb-ddcから自作FN1242DACにしてた時と同じ音が出ています。spdif接続なんだから当たり前ですが、余計な機器が無くなった分「物理的」にすっきりしてやったかいがありました。
最後にSPDIFの電子工作について。
こっちは簡単にPH8端子→2SC1815のベース → エミッタ → 抵抗による分圧回路+コンデンサというシンプル設計。 本来は色々やらないといけないんですが、接続の相手が自作で分かってたのもあって、簡易接続です。
ここでもはまったことが一つ。PH8って電流吐出し専用ピンなんですね。PNPトランジスタでスイッチング動作しないんで悩んだ後にチップの取説を探したら答えが書いてあった・・・いや、プルダウン抵抗使ってもトランジスタから出力しないとは思わなかった。
ブログ一覧 |
オーディオ | パソコン/インターネット
Posted at
2024/05/15 23:55:35
今、あなたにおすすめ