I2S/DSDコントーラ動作しました

ZYBOにつないだI2S/DSD接続のDAC基板にて、MPDでDSDが再生できるようになりました。

本来、アプリ(本件の場合、mpd) から SNDRV_PCM_FORMAT_DSD_U32_LE を指定してもらえばよいと思っていたのですが、MPDのNative DSD対応パッチ版では SNDRV_PCM_FORMAT_DSD_U32_BE しか今のところ対応されていません。

これだとエンディアンがひっくり返ってしまってサンプルの前後関係が逆になってしまいます。MPDのソースに、新規の dsd_native_type を「勝手に」追加してできないことはないのですが、それも将来の互換性を考えるとうまくないので、ZYNQに実装したI2S/DSDコントローラとそのデバイス・ドライバ側で対処することにしました。

アプリから SNDRV_PCM_FORMAT_DSD_U32_LE を指定された場合には転送されたデータをそのままシリアル化してDSD信号とし、SNDRV_PCM_FORMAT_DSD_U32_BE を指定された場合には、AXIバスから転送された4bytesデータのエンディアンをスワップしてDSDのシリアル信号に変換しています。

こうしておけば、USDA_MINI基板をつないでいた場合から、DSD転送モードは変更せずに出力先を hw:0,1 から hw:0,0 に変更するだけで、楽に (たいした事ない?) 移行 (行ったり来たり) できます。

細かい修正希望項目はいくつかありますが、これでひとまず動作確認終了です。

次はMPDのDLNA化でしょうか?