PCからPCM streamがUSB deviceへ送られる.そのレートが多過ぎでも少な過ぎても音声がプツッと途切れてしまう.そうならないような転送レート調節機能がfeedbackだ.
feedbackって言ったってなにを測定してfeedbackすりゃいいの? 仕様が不明.
推測で進めるしかないので、CM6631の動作をUSB protocol analyzerで観測してみたところ、feedback data = 0x00180000 なのであった.
この0x00180000は何の数字だろうか?
上下8bitを切り捨てて0x1800=6144を考えてみると、Fsと関連する数値なのだ.
Fs=384kHz、USB micro frame 125uSec の関係から6144が出てくる.
こんなカラクリだ.
・384kHz=48kHz * 8 384kHzは8倍オーバーサンプルHiResの意味がある
・48kHz * 1024 = 49.152MHz 実際にこの周波数のXTALを使う
・49.152MHz * 125uSec = 6144 6144が出てきた
すなわち6144とは、USB micro frame間隔を、1024Fsでカウントした数値なのだ.
PC側の時間基準たるUSB micro frameと、USB device側の時間基準たるFsとを結びつける計測値6144は、転送レート調節の根拠数値として意味深長である.
もちろん常にピッタリ6144なはずはない.6143.875とか小数点以下がポロポロ出てくるだろうし、変動もするだろう.0x00180000の下8桁は1800.00のような小数点未満の数値なのだろうと推測する.
↓SOF割り込みでIOをトグルしてみた.125uSecなので4000Hzで動く.
↓SOF割り込みのジッターを拡大してみると、約3uSecもブレブレである.
「わたしにもできる!」と信じてEZ-USBへの実装を進めた.
------
細かい解説は今は省くが、EZ-USB DCCで「USB micro frame間隔を1024Fsでカウントする回路」を作り、PCへ0x00180000近辺の数値が送信されるようにした.
だが、転送レート調節機能が働いている気配はなく、相変わらず2~3秒毎に音がプツッと切れる.
何が起きているんだろうねぇ?
そもそも、CM6631のwin10デバドラと、EZ-USBのwin10デバドラは別である.
↓CM6631のデバドラはこうなっている.CMUSBDACASIO.dllはwin10標準搭載ではあるがCMedia社専用であることをうかがわせる.
↓EZ-USB DCCのデバドラはこうなっている.usbaudio2.sysがwin10標準のUAC2.0汎用デバドラであると推測している.
「USB micro frame間隔を1024Fsでカウントする」
「USB micro frame間隔を512Fsでカウントする」
「USB micro frame間隔を256Fsでカウントする」
というわけで、調査フェーズに戻る.
追記:XMOS208を調べた.
ドライバはXMOS専用っぽい.
feedback値は、0x0017FFE8と0x0017FFE0を交互に繰り返している.CM6631の0x00180000とほぼ同じと言えるだろう.
かしこ
→INDEXページへ
0 件のコメント:
コメントを投稿