先を越されました

先ずは実用的な状態でLinux のUSB Native 転送の動作確認をしようと思い、ZYBOにMPDを導入しました。https://github.com/lintweaker/mpd-dsd-018

ZYBOで同じような事をしていて、SDカードイメージを公開しているケースが見あたりませんでしたので、自分でソースファイルからクロスコンパイルしてZYNQ (ARM) 用 のMPDを作りました。FLACや各種AUDIOファイルアクセス用のライブラリも仕方なく全てソースからARM用にビルドしました。

まだシリアルコンソールから操作しないとIPアドレスの設定やSDカードのマウントなどができませんが、とりあえずMPODからSDカード内のFLACファイルやDSDファイルを選択して再生することができるようになりました。

ZYNQのUSBは、USB-シリアル変換用と、USB On-The-Go の2通り搭載していて、USBDACはOn-The-Goの方につなぎます。ですから、On-The-GoケーブルでつないでおかないとHOSTモードにならず、USBDACを認識しません。On-The-Goケーブルをつないでおけば、きちんとPnP動作をしてくれます。

予想通り、DSD Native転送になっています。ここでいうNativeというのは、DSD-PCM変換された信号ではなくてオリジナルのDSD信号を転送する、という次元の話ではなく、USBを使ったDSD転送において、DoP方式ではなくDSDのために定義された転送モードで送り出す、という意味です。

上のキャプチャはDSD256のファイルを転送中のUSBアナライザの画面です。1uフレーム期間(125us)に平均して352.8バイトのデータをUSDA_MINI基板へ送り込んでいます。

重要なのは、DSD256に対応できるということよりも、DSD64/128の場合も含めて、DoP転送よりも転送に必要な負荷が少ないことが期待できる、ということになります。

ただ、DoP転送、Native転送にかかわらずDSD転送の場合には少し問題があります。というのは、再生開始直後に、少しの期間”ゼロ”を送ってくるため、再生の頭でノイズが出てしまいます。ゼロではなくて”0x96,0x69,0x96,0x69,….” などを送ってくれれば良いのですが、そうはなっていません。

0x96,0x69,…ならば、1bitに展開すると”10010110….”といった1bit列になり、フィルタするとDCになりますが、”0x0,0x0,0x0,0x0,…”を送られると、bit列は”00000000….”となり、フィルタすると負のフルスケールに張り付いた値になりますので、どうしても再生の頭でノイズになってしまいます。

再生の頭だけはアンプのボリュームで回避して、アルバム単位で聴いていれば実用上問題はないのですが。Linuxのソースのどこを修正すればよいのかまだ調べていません。

ちなみに、lightMPDはすでにBBB用にDSD Native転送対応のバージョンがUPされています(先を越されました:笑)。対象のDDCをお持ちの方はお試しになる価値はあると思います。UDA2はうまく動作するか未確認なので多少不安ですが、USDA_MINIではとりあえずNative転送で動作しています。

USBなら本当はraspberry pi 2で動作すればクアッドコアですし一番コスパが高くて良さそうなのですが、何事も思った通りには行かないものです・・・。それともDoPはNGでもNativeはOKということなのでしょうか?

さて、 ひとまずUSBは置いておいて、I2Sを試してからAXIバスにぶら下がるDSDインターフェース設計を始めたいと考えています。