2020年4月9日木曜日

EZ-USB FX2LP を動かしてみる (42) feedback経路完成、しかし不調

戒厳令下、EZ-USB DCCを動かそうとしているわたくし.

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汎用デバドラであると推測している.
この2者が同じ動作をしているかどうかは不明だ.下記のいずれの可能性もありうる.
 「USB micro frame間隔を1024Fsでカウントする」
 「USB micro frame間隔を512Fsでカウントする」
 「USB micro frame間隔を256Fsでカウントする」

というわけで、調査フェーズに戻る.


追記:XMOS208を調べた.
ドライバはXMOS専用っぽい.
feedback値は、0x0017FFE8と0x0017FFE0を交互に繰り返している.CM6631の0x00180000とほぼ同じと言えるだろう.

かしこ

→INDEXページへ

0 件のコメント:

コメントを投稿