前回予想したとおり、このI2Sコントローラに入力するオーディオ系クロックを12.288MHzから倍の24.576MHzに変更するだけで、つまりZYNQプロセッサのペリフェラル・クロックのPLLコンフィギュレーションを変えるだけで、I2Sコントローラの回路やデバイス・ドライバを変更することなく、192kHzまでのサンプリング周波数に対応できることが動作確認できました。
気を良くして、サンプリング周波数が48kHzの倍数 (あるいはやろうと思えば44.1kHzの倍数) にしか対応できないという現行の装置の限界を破るべく、再生オーディオファイルのサンプリング周波数に応じて、このシステムクロックの周波数を、2つのクリスタル発振器、24.576MHzか22.5792MHzのいずれかを切り替えて供給できるようにI2Sコントローラと、そのデバイス・ドライバを改造してみました。
当然、ALSA準拠のアプリ再生で切り替わるようにしてあります。まずはI2Sコントローラに発振器切り換え用のレジスタを追加しました。そして、アプリからALSA経由で再生サンプリング周波数のパラメータを受け取ったデバイス・ドライバが、その追加したレジスタに値をセットすると改造I2Sコントローラが発振器の切り替えセレクタを制御する、という寸法です。なのでデバイス・ドライバにも変更を入れました。
これで、UDAなどと同じように、愚直に原始的に、ではありますが、ピュア・オーディオ品質のクロックが使えるI2Sコントローラができあがりました。 そういうことで必然的にDAC基板も作らざるを得なくなります。
クリスタル発振器はDACが載った基板上に2個置かれることになります。選択されたクロックがDAC ICとZYBOに供給されます。
DAC ICとしてPCM1792Aを載せましたので、CPU(ARM)から設定ができるようになる (する) 予定です。LinuxにはPCM1792Aのデバイス・ドライバも入っていますので、こちらも改造して使うことになると思います。
改造が必要になる理由はDSD対応です。今回の検討で、I2SコントローラにDSD対応の機能を追加すれば普通にNative DSD再生ができるはずであることを確認しました。
最近のALSAライブラリには、”SND_PCM_FORMAT_DSD_U32_LE” というフォーマットが追加されています。調べてみると、元来、一部のUSBオーディオ基板向けに新たに用意された拡張フォーマットのようですが、自作のALSAアプリからARMのAXIバスにぶら下がる形のこのI2Sコントローラに対しても、再生時にデバイス・ドライバ経由でこのフォーマット情報を伝えることが可能であると実験で確認しました。
つまり、アプリが再生開始する直前に、再生信号のフォーマット情報 として “SND_PCM_FORMAT_S32_LE” を送ってくればI2Sモードに、”SND_PCM_FORMAT_DSD_U32_LE” を送ってくればDSDモードへと、I2Sコントローラの機能が切り替わるようにI2Sコントローラのロジック回路とデバイス・ドライバを作りこんでおけば良いというわけです。
おそらくは、最近のMPDではこのフォーマット、”SND_PCM_FORMAT_DSD_U32_LE” がサポートされているはずですので、ZYBOにも組み込んであげることで、出力対象がUSBアダプタではありませんが、Native DSD再生ができるようになるものと思われます。
ちなみにですが、ZYNQプロセッサのベンダであるxilinxや、あるいはZYBO基板をリリースしているDigilentが公開しているramdiskにはALSAのライブラリは組み込まれていませんので、自分で最新版のソースを引っ張ってきて、ノートPCにインストールしたLinux上でクロス・コンパイルして突っ込みました。
ALSAアプリにしても、デバイス・ドライバにしても、もちろんOS本体のカーネルにしても、すべてクロス・コンパイルということになってしまうのは同じですが・・・。