ラズパイ+Volumioで運用しているLAN DACにFPGAを追加しDSD64までは対応することができていた。
ラズパイからI2Sで352kHzのPCMが出力できれば、DoPによりDSD128が出せるはずなので、その方策を調べてみた。
volumioのI2SのPCM出力は192kHzで上限されるという記事をいくつか見たが、moode audioならばAdvanced Kernelというものを用いると384kHzまで出せるという記事をいくつか見かけた。
そこでmoode audioを導入してみることにした。
2024/4現在で最新のものは8.3.9というバージョンなのでこちらをRaspberry Pi Imagerを用いて焼きこんでみた。
ところが、設定画面を見てもAdvanced Kernelを選択できるような画面が存在しない。そのまま使ってみると、やはり192kHzで制限されてしまう。
どうすればいいんだと悩み調べること数週間。
少し視野を広げて、ほかのところで192kHzに制約されていないかも調べていたところで、pcm1794a.cを修正して作成したcodecファイルのところで制約されているのを発見した。オリジナルでいうところの、以下の構造体部分。
snd_soc_dai_driver pcm1794a_dai
ここの上限を384k, 32bitに記述修正してドライバを作り直したところ、ラズパイI2SからのPCM 352kHzの出力に成功した。
それで、準備していたDSD128対応のFPGAソースコードと組み合わせて動かしてみたところ、音が出ない。dmsegで見ると、sampling rateは352kHzになっているのだがI2S Errorが出ている。
オシロで観測すると、BCKがFPGAから出ておらず1に固定されている。
そこでFPGAのソースコードを見返してみた。
BCKの出力は水晶発振器の出力をsampling rateにあわせて分周比をラズパイからの制御で変えられるように回路を構成している。単純なfunction文で、simulationではちゃんと動いている。
verilogでありがちな論理記載抜けもないつもりであったが、いろいろと記載方法を変えてみてもどうしても動かなかった。
これまで、論理合成ツールはLattice LSEを用いてきたが、Lattice DiamondからはSynplify Proも選択できるので、こちらを試してみたところ、無事にBCK出力が出るようになった。
これで、以下のバリエーションに対応することができた。PCM1792でサポートできるすべてと言って良いだろうか。
DSD64, DSD128
PCM44, 48, 88, 96, 176, 192kHz
また、同じことをvolumio3.631で実施してみたところ、moode audioと同じ結果を得ることができた。