2020年3月9日月曜日

EZ-USB FX2LP を動かしてみる (37) USB Audio Class 2.0の実装について

皆さんこんにちは.今日はフィットを車検に出しました.

EZ-USBシリーズは1月8日以来の久しぶりとなる.その時点ではUSB Audio Class 1.0を扱っていたのだが今更感があるのと、WIN10がUAC2.0対応らしいので2.0で再スタートすることにした.しかしその直後から、老人ホーム問題や自称コロナ問題があってあまり時間を割くことができなかった.

自称コロナから回復して再び時間を割けるようになってきたので、EZ-USB FX2LPをUSB Audio Class 2.0(UAC2)のDCCにしたいとあれこれと触っているこの頃だ.

source codeはグダグダであろうともとにかく一度動かしてみたい.音を出してみたい.


さて、USBのデバイス開発者にとっての一般認識はこうだろう.
・PCにUAC2のデバドラが入っている
・USBデバイスにはdescriptorが焼かれている
・PCはdescriptorを読み、descriptorを解析し、よしなに制御してくれる
・descriptorの書式と、requestとreplyはUSB規格書に網羅されている
・結果として、USBデバイス固有のデバドラは不要となる(=バラ色の世界)

なのだが実際にやってみるとなんだかなーな場面に悩まされるわけだっちゅうの.

現状の取り組みとしては、UAC2.0の理解のため、CM6631 DCCがUSBバスでどんな通信をしているのかを調査しているところである.win10+UAC2.0+CM6631という環境だ.


CM6631のUAC2.0 winデバドラはvendor固有の動作
CM6631が載ったDCCは中華通販でよく見かける.そしてwindows10にはCM6631のデバドラがOS標準でインストされている.CM6631をwin10に接続したときのデバドラがこれだ.
これの一番下のCMUSBDACASIO.dllがC-Media社提供のデバドラだと想像するのだが、こいつの挙動をUSB protocol analyzerでモニタすると、エグイことやってるんだよ.

どう考えてもUAC2.0標準動作ではないリクエストを飛ばして、そのreplyをデバドラがチェックしているみたいなんだ.

謎の挙動は数種類ある.
1)string discriptorの、ありえないINDEXを読もうとする.たしかINDEX=50番だったか.それに対してCM6631は”6631"とreplyするんだ.そうゆう秘密の通信やめてよね、と言いたい.

2)先頭バイトが40Hの謎のリクエストが飛ぶ.40HはUSB標準リクエストにもUAC2.0にもHIDにも無いと思うのだが、40Hから始まるリクエストをPCが送信するんだ.40Hほにゃららは何種類かあって、そのうちの一つは、先行してPCが送信した8BYTEsをそのままreplyしていたりする.
他の40Hほにゃらかでは、replyの法則性を見出せない.
こんなリクエストをしてるようでは解析なんか不可能である.

というわけで、win10におけるCM6631のUSB protocol調査はとん挫したのであった.

LinuxではCM6631のUAC2.0対応に謎のリクエストは無いようだ
同じCM6631 DCCをLinuxに接続してUSB protocol analyzerでチェックしているところである.
今のところ、"6631"だとか40Hのような非日常的USBリクエストは飛び交っていない様子で平和(ピンフ)である.

やってみなくちゃ判らないサンプリング周波数設定
UAC1.0におけるサンプリング周波数(Fs)の制御はどうなっていたか?
control interfaceに紐づけされたEndPointへ192000を打つような仕組みだった.
無理やり実装した印象がある. →こちら

UAC2.0のサンプリング周波数制御は?
clock source entityという名のFs発振器が新設され、こいつに向かって何Hzにしろと命令するような仕組みに改善された.clock source descriptorも新設された.エレガントでイイ感じ~

ところが面白いことに、clock source descriptorにFsリストは無いのである.
ではどうやってUSBデバイスのFsをPCに報告するのか?
FsのMIN/MAX/RESを報告せよ、というリクエストがUAC2.0に設けられたのだ.

なのだがこれがUSB仕様書を読んだだけでは理解し難い代物だった.
USB protocol analyzerで判った仕組みはこうだった.
・Fsリクエストが連続して2度行われる
・1度目は、何種類のFsを持つかだけを返信する     ex.8種類
・2度目は、MIN/MAX/RESを8個返信する.各数値はunsigned longの4BYTEs.例えば192kHzだと2EE00Hになる.MIN/MAX/RES=0002EE00,0002EE00,00000000で1つのFsを表現する.8種類であればこれが8個だ.

これを知ったとき、、、常にRES=0で運用するのかよとうめいてしまったわたしだった.
MIN/MAX/RES=44.1kHz/384kHz/1Hz にするのかと思ってたのにな.


地雷が多くて、まだまだ先は長い.

かしこ

→INDEXページへ

4 件のコメント:

  1. 最近ほぼ毎日、Aliから買い物してくれMailが来ます。
    本日3点ほど注文してみましたが、ホントに到着するのかしら^^;)。

    返信削除
    返信
    1. 鍛冶屋さんこんばんは.
      わたしにも来ます.近頃になってプロモーションがお盛んですね.
      あれはなんなんですかねぇ?

      ちなみにより一層来る気がしないこの頃です.

      削除
  2. もしも(まかり間違って?)到着した折には、開封前に
    ”殺菌・除菌・滅菌” 処理をお忘れなく!。

    返信削除
    返信
    1. 船便を生き残ったコロナは強靭ですからね、きをつけまーす

      削除