2020年1月4日土曜日

EZ-USB FX2LP を動かしてみる (34) PCM2704擬態EZUSBをwindowsに接続したときのAudio Control Request解析

すみませんが前置き無しでいかしてもらいます.経緯は前回を参照してください.

(今回の物語)
「PCM2704擬態EZUSB」をwindowsに接続したときwindowsから様々な問い合わせが来ます.それをモニタし解析しました.

(今回の成果)
解析した知見をもとに、EZUSB FX2LPのfirmwareを弄ったところ、windowsがEZUSBを「USBオーディオデバイス」として認識しました.

-------
PCM2704擬態EZUSBをwindowsに接続したときに飛び交うsetup dataは以下です.冗長ですが全部掲載します.
GetDescriptorやSetConfigなどが飛び交っていますが、windowsがCM2704擬態EZUSBを認識するにはA1で始まる行が重要です.(windowsデバドラがそうなっている)

80 06 00 01 00 00 40 00 GetDesc
80 06 00 01 00 00 12 00 GetDesc
80 06 00 02 00 00 FF 00 GetDesc
80 06 00 03 00 00 FF 00 GetDesc
80 06 02 03 09 04 FF 00 GetDesc
80 06 00 01 00 00 12 00 GetDesc
80 06 00 02 00 00 09 00 GetDesc
80 06 00 02 00 00 91 00 GetDesc
00 09 01 00 00 00 00 00 SetConfig
01 0B 00 00 01 00 00 00 SetInter
80 06 02 03 09 04 04 00 GetDesc
80 06 02 03 09 04 16 00 GetDesc
80 06 02 03 09 04 04 00 GetDesc
80 06 02 03 09 04 16 00 GetDesc
80 06 02 03 09 04 04 00 GetDesc
80 06 02 03 09 04 16 00 GetDesc
A1 81 00 01 00 03 01 00 GetInter
A1 81 01 02 00 03 02 00 GetInter
A1 82 01 02 00 03 02 00 GetInter
A1 83 01 02 00 03 02 00 GetInter
A1 84 01 02 00 03 02 00 GetInter
A1 81 02 02 00 03 02 00 GetInter
A1 82 02 02 00 03 02 00 GetInter
A1 83 02 02 00 03 02 00 GetInter
A1 84 02 02 00 03 02 00 GetInter
01 0B 00 00 01 00 00 00 SetInter
21 0A 00 00 02 00 00 00 GetInter
81 06 00 22 02 00 64 00 GetDesc
80 06 00 01 00 00 40 00 GetDesc
80 06 00 01 00 00 12 00 GetDesc
80 06 00 02 00 00 FF 00 GetDesc
00 09 01 00 00 00 00 00 SetConfig
01 0B 00 00 01 00 00 00 SetInter
02 01 00 00 81 00 00 00 ClrFeat
81 06 00 22 02 00 64 00 GetDesc
80 06 00 01 00 00 40 00 GetDesc
80 06 00 01 00 00 12 00 GetDesc
80 06 00 02 00 00 FF 00 GetDesc
00 09 01 00 00 00 00 00 SetConfig
01 0B 00 00 01 00 00 00 SetInter
02 01 00 00 81 00 00 00 ClrFeat
81 06 00 22 02 00 64 00 GetDesc
80 06 00 01 00 00 40 00 GetDesc
80 06 00 01 00 00 12 00 GetDesc
80 06 00 02 00 00 FF 00 GetDesc
00 09 01 00 00 00 00 00 SetConfig
01 0B 00 00 01 00 00 00 SetInter
02 01 00 00 81 00 00 00 ClrFeat

A1で始まる行はStandard RequestではなくてAudioControl Requestというもので、USB Audio Class 1.0で定義されています.
EZUSBのsample programにはAudioControl Request処理は記述されていません.自分で記述する必要があります.
処理とはRequestに対する返答のことです.返答処理をEZUSBのsample programに追加してやればwindowsが「PCM2704擬態EZUSB」を認識してくれます.

以下ではA1で始まる行を詳しく調べてみます.全部で9行あります.

1)A1 81 00 01 00 03 01 00
 A1  デバイス→ホストの方向、ベンダ用件、interfaceについて
 81  GET_CUR   今の状態を返答してくれ
 00  (下位)
 01  (上位) control selector  -->MUTE_CONTROL
 00  (下位)
 03  (上位) terminal ID   -->ここでは3番はFeature Unitを指すようだ
 01  (下位) length 1 BYTE  -->返答BYTE数1
 00  (上位)
質問:Feature UnitはMUTE中かどうかの問い合わせ
返答:1BYTEで、MUTE/TRUE/1またはNo MUTE/FALSE/0
返答:0がいいんじゃね?

EZUSB sample codeではSetupCommand()の中にこんなcodeを追加しました.
if(SETUPDAT[0]==0xA1 && SETUPDAT[1]==0x81 && SETUPDAT[3]==1) {
      EP0BUF[0] = 0;
      EP0BUF[1] = 0; // FALSE No-MUTE
      EP0BCH = 0;
      EP0BCL = 1;   // 1BYTE
      break;
 }

2)A1 81 01 02 00 03 02 00
 A1  同上
 81  GET_CUR   今の状態を返答してくれ
 01  (下位) channel number 1
 02  (上位) control selector  -->VOLUME_CONTROL
 00  (下位)
 03  (上位) terminal ID   -->ここでは3番はFeature Unitを指すようだ
 02  (下位) length 2 BYTE  -->返答BYTE数2
 00  (上位)
質問:Feature Unitのvolume現在値の問い合わせ
返答:2BYTEで、0x8000(MIN)~0x7FFF(MAX)
返答:0x7FFFがいいんじゃね?

3)A1 82 01 02 00 03 02 00
 A1  同上
 82  GET_MIN   最小値を返答してくれ
 01  (下位) channel number 1
 02  (上位) control selector  -->VOLUME_CONTROL
 00  (下位)
 03  (上位) terminal ID   -->ここでは3番はFeature Unitを指すようだ
 02  (下位) length 2 BYTE  -->返答BYTE数2
 00  (上位)
質問:Feature Unitのvolume最小値の問い合わせ
返答:2BYTEで、0x8000(MIN)~0x7FFF(MAX)
返答:0x8000がいいんじゃね?

4)A1 83 01 02 00 03 02 00
 A1  同上
 83  GET_MAX   最大値を返答してくれ
 01  (下位) channel number 1
 02  (上位) control selector  -->VOLUME_CONTROL
 00  (下位)
 03  (上位) terminal ID   -->ここでは3番はFeature Unitを指すようだ
 02  (下位) length 2 BYTE  -->返答BYTE数2
 00  (上位)
質問:Feature Unitのvolume最大値の問い合わせ
返答:2BYTEで、0x8000(MIN)~0x7FFF(MAX)
返答:0x7FFFがいいんじゃね?

5)A1 84 01 02 00 03 02 00
 A1  同上
 84  GET_RES   分解能を返答してくれ
 01  (下位) channel number 1
 02  (上位) control selector  -->VOLUME_CONTROL
 00  (下位)
 03  (上位) terminal ID   -->ここでは3番はFeature Unitを指すようだ
 02  (下位) length 2 BYTE  -->返答BYTE数2
 00  (上位)
質問:Feature Unitのvolume分解能の問い合わせ
返答:2BYTEで、0x8000(MIN)~0x7FFF(MAX)
返答:0x007Fがいいんじゃね?
ここのresolutionとは16bitや32bitのコトではなく、volume[MAN,MIN,RES]のことである

以下はchannel number 2についてCUR/MIN/MAX/RESを問うているところが違うだけなので返答は同じでよいでしょう.
6)A1 81 02 02 00 03 02 00 GetInter
7)A1 82 02 02 00 03 02 00 GetInter
8)A1 83 02 02 00 03 02 00 GetInter
9)A1 84 02 02 00 03 02 00 GetInter

------
以上9つのAudioControl Requestへの返答をEZUSB firmwareに追加したら、windowsが「USB オーディオデバイス」としてEZUSBを認識してくれるようになりました.ひとまずめでたいです.

しかし再生デバイス→プロパティを見ると、残念ながら16bitしか選択肢が表示されません.24bitや32bitも選択肢として表示されると期待したのでしたが、descriptorに何か問題があるように思います.

今宵は此処までにしとう御座います.

かしこ

→INDEXページへ

0 件のコメント:

コメントを投稿