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化でしょうか?

SPI通信追加

今までは、ZYBOにつなげるDAC基板を、設定の不要な “PCM1794A” 基板であると「デバイス・ツリー」に記述することで、実際には”PCM1792A”基板を接続しているにもかかわらず、ZYNQにSPIコントローラを実装しないで済ませていました。SPIとは、DAC ICなどのレジスタ等への通信用バスの一方式です。

DSD対応化にあたって、PCM1792Aの制御 (設定) が不可欠になりますので、今回、ZYNQにSPIコントローラを実装しました。実装しました、といっても、これはもともとZYNQのPS部に組み込まれた機能をハード的に有効にするだけで、回路設計が必要なわけではありません。とはいっても、FPGA設計ツールを立ち上げて回路の再構築をし、回路情報データを再度生成してLinuxの起動時に必要な”BOOT.bin” を作り直す、といったような作業は必要になります。その際にはFPGA設計ツールだけではなく、(Xilinxの) SDKも必要になります。

ZYNQにSPIコントローラを実装して、ZYBOのデバイスツリーからPCM1794Aを削除し、SPIコントローラ直下に新たにPCM1792Aを追加しました。組み込みLinuxはいわゆるPlug & Playではないので、その昔、MS-DOS PCのBIOS設定でメモリ領域を指定してアダプタ・カードを追加していたようなことを、テキスト (デバイス・ツリー) を書いて設定ファイルにし、Linuxブート用のバイナリ一式に含めるという形で、設計者は同様の作業をしなければなりません。

XilinxのWikiによると、ZYNQに組み込まれたSPIコントローラはケイデンス (ご同業の方でしたらご存知の会社ですね) のIPだということですので、Linuxカーネルのブート時に同社のデバイス・ドライバがロードされるようにデバイス・ツリーに記載しています。

再生ソフトが”Play”を開始するタイミングで毎回ZYBO(ZYNQ)からSPI通信で設定データが飛んできます。PCMだけなら不要な設定といえるもので、信号フォーマットがI2SかRJ(右詰)か、そしてそれらの場合にビット数が32(24)か16か、をチェックして切り替え設定をしているだけです。これらはダイナミックに変更する必要がないものといえますので、ソースのこのあたりを改造して、このPCM1792A用のLinuxドライバをDSD対応させてみるつもりです。

もっとも、その前に、今度こそ本当にARMのAXIバス対応DSDコントローラを設計しないといけません。

今のところ、ZYBO上でMPDが普通に動作しています。ちゃんと、PLLによらず発振器によるクロックで動作するようにしましたので、音質的にも、精神衛生上もGoodです。