2019年12月4日水曜日

擬態PCM2704(EZUSB)のdescriptor 詳細

擬態PCM2704(EZUSB)のdescriptor 詳細


EZUSBをPCM2704に擬態させる例としてこちらのサイトに記載されているdescriptorを勉強のネタとさせてもらっている.
Audio Class のドキュメントと照らし合わせてどんな設定にしているのかを確認してみた.

なお、擬態PC2704における割り当てはこうなっている.
・Control endpoint (EP0)
・Isochronous-out audio data-stream endpoint (EP2)
・HID endpoint (EP1)


---------------------- Device Descriptor ----------------------
bLength                  : 0x12 (18 bytes)
bDescriptorType          : 0x01 (Device Descriptor)
bcdUSB                   : 0x110 (USB Version 1.10)
bDeviceClass             : 0x00 (defined by the interface descriptors)
bDeviceSubClass          : 0x00
bDeviceProtocol          : 0x00
bMaxPacketSize0          : 0x40 (64 bytes)
idVendor                 : 0x08BB
idProduct                : 0x2704
bcdDevice                : 0x0100
iManufacturer            : 0x01 (String Descriptor 1)
 Language 0x0409         : "Cypress"
iProduct                 : 0x02 (String Descriptor 2)
 Language 0x0409         : "EZ-USB DCC"
iSerialNumber            : 0x00 (No String Descriptor)
bNumConfigurations       : 0x01 (1 Configuration)
Audio classの宣言はここではやらないのが作法なんだって

------------------ Configuration Descriptor -------------------
bLength                  : 0x09 (9 bytes)
bDescriptorType          : 0x02 (Configuration Descriptor)
wTotalLength             : 0x0091 (145 bytes)
bNumInterfaces           : 0x03 (3 Interfaces)
bConfigurationValue      : 0x01 (Configuration 1)
iConfiguration           : 0x00 (No String Descriptor)
bmAttributes             : 0x80
 D7: Reserved, set 1     : 0x01
 D6: Self Powered        : 0x00 (no)
 D5: Remote Wakeup       : 0x00 (no)
 D4..0: Reserved, set 0  : 0x00
MaxPower                 : 0x32 (100 mA)
Interface=3というのは、EP0/EP2/EP5を指していると思う.


Audio control interfaceのdescriptorここから
--------------- Interface Descriptor -----------------
bLength                  : 0x09 (9 bytes)
bDescriptorType          : 0x04 (Interface Descriptor)
bInterfaceNumber         : 0x00   (A)
bAlternateSetting        : 0x00
bNumEndpoints            : 0x00 (Default Control Pipe only) (B)
bInterfaceClass          : 0x01 (Audio)  (C)
bInterfaceSubClass       : 0x01 (Audio Control)  (D)
bInterfaceProtocol       : 0x00
iInterface               : 0x00 (No String Descriptor)
(A)interface#0         後続のPCMとHIDは#1と#2になっている
(B)EP接続は無しであるが、defaultのEP0のみ接続されている
(CD) Audio Control interface を以下に記述する

------ Audio Control Interface Header Descriptor ------
bLength                  : 0x09 (9 bytes)
bDescriptorType          : 0x24 (Audio Interface Descriptor)
bDescriptorSubtype       : 0x01 (Header)   (A)
bcdADC                   : 0x0100    (B)
wTotalLength             : 0x0028 (40 bytes)  (C)
bInCollection            : 0x01
baInterfaceNr[1]         : 0x01
(A)
0x01 HEADER    ←これ
0x02 INPUT_TERMINAL
0x03 OUTPUT_TERMINAL
0x04 Mixer Unit
0x05 SELECTOR_UNIT
0x06 Feature Unit
0x07 Processing Unit
(B)Audio Device Class Revision   (今では1だけじゃなくて2も3もある)
(C)40bytesの意味は、後続のTerminal2ヶとUnit1ヶを含んだbyte数で、一気読みで使うのだろう

------- Audio Control Input Terminal Descriptor -------

bLength                  : 0x0C (12 bytes)
bDescriptorType          : 0x24 (Audio Interface Descriptor)
bDescriptorSubtype       : 0x02 (Input Terminal)  (A)
bTerminalID              : 0x01  (B)
wTerminalType            : 0x0101 (USB streaming)  (C)
bAssocTerminal           : 0x00
bNrChannels              : 0x02 (2 channels)
wChannelConfig           : 0x0003 (L, R)    (D)
iChannelNames            : 0x00 (No String Descriptor)
iTerminal                : 0x00 (No String Descriptor)
(A)
0x01 HEADER
0x02 INPUT_TERMINAL    ←これ
0x03 OUTPUT_TERMINAL
0x04 Mixer Unit
0x05 SELECTOR_UNIT
0x06 Feature Unit
0x07 Processing Unit
(B)制御情報の入力ターミナル  No.1
(C)ターミナルタイプ
0x0101 Terminal is USB Streaming In/Out     ←これ
0x0201 Terminal is Microphone
0x0301 Terminal is Speaker
0x0401 Terminal is Handset In/Out
0x0501 Terminal is Phone Line In/Out
(D)どのチャンネルか?
 D0: Left Front (L)          ←これと
 D1: Right Front (R)         ←これ
 D2: Center Front (C)
 D3: Low Frequency Enhancement (LFE)
 D4: Left Surround (LS)
 D5: Right Surround (RS)
 D6: Left of Center (LC)
 D7: Right of Center (RC)
 D8: Surround (S)
 D9: Side Left (SL)
 D10: Side Right (SR)
 D11: Top (T)
 D15..12: Reserved

------- Audio Control Output Terminal Descriptor ------
bLength                  : 0x09 (9 bytes)
bDescriptorType          : 0x24 (Audio Interface Descriptor)
bDescriptorSubtype       : 0x03 (Output Terminal)  (A)
bTerminalID              : 0x02    (B)
wTerminalType            : 0x0301 (Speaker)
bAssocTerminal           : 0x00 (0)
bSourceID                : 0x03 (3)   (C)
iTerminal                : 0x00 (No String Descriptor)
(A)
0x01 HEADER
0x02 INPUT_TERMINAL
0x03 OUTPUT_TERMINAL    ←これ
0x04 Mixer Unit
0x05 SELECTOR_UNIT
0x06 Feature Unit
0x07 Processing Unit
(B)制御情報の出力ターミナル  No.2
(C)No.3と名付けられた物がソースである   →No.3は後で出てくる

-------- Audio Control Feature Unit Descriptor --------
bLength                  : 0x0A (10 bytes)
bDescriptorType          : 0x24 (Audio Interface Descriptor)
bDescriptorSubtype       : 0x06 (Feature Unit)   (A)
bUnitID                  : 0x03 (3)   (B)
bSourceID                : 0x01 (1)   (C)
bControlSize             : 0x01 (1 byte per control)
bmaControls[0]           : 0x01
 D0: Mute                : 1
 D1: Volume              : 0
 D2: Bass                : 0
 D3: Mid                 : 0
 D4: Treble              : 0
 D5: Graphic Equalizer   : 0
 D6: Automatic Gain      : 0
 D7: Delay               : 0
bmaControls[1]           : 0x02
 D0: Mute                : 0
 D1: Volume              : 1
 D2: Bass                : 0
 D3: Mid                 : 0
 D4: Treble              : 0
 D5: Graphic Equalizer   : 0
 D6: Automatic Gain      : 0
 D7: Delay               : 0
bmaControls[2]           : 0x02
 D0: Mute                : 0
 D1: Volume              : 1
 D2: Bass                : 0
 D3: Mid                 : 0
 D4: Treble              : 0
 D5: Graphic Equalizer   : 0
 D6: Automatic Gain      : 0
 D7: Delay               : 0
iFeature                 : 0x00 (No String Descriptor)
(A)
0x01 HEADER
0x02 INPUT_TERMINAL
0x03 OUTPUT_TERMINAL
0x04 Mixer Unit
0x05 SELECTOR_UNIT
0x06 Feature Unit      ←これ
0x07 Processing Unit
(B)機能ユニット No.3
(C)No.1がソース.No.1は入力ターミナル

ここまでの情報によると、下図の順で接続されていると宣言しているのがAudio control interface descriptorなのだった.
Audio control interfaceのdescriptorここまで


Audio stream interfaceのdescriptorここから

停止時(Alt0)ここから
---------------- Interface Descriptor -----------------
bLength                  : 0x09 (9 bytes)
bDescriptorType          : 0x04 (Interface Descriptor)
bInterfaceNumber         : 0x01    (A)
bAlternateSetting        : 0x00    (B)
bNumEndpoints            : 0x00 (Default Control Pipe only)
bInterfaceClass          : 0x01 (Audio)   (C)
bInterfaceSubClass       : 0x02 (Audio Streaming)   (D)
bInterfaceProtocol       : 0x00
iInterface               : 0x00 (No String Descriptor)
(A)interface#1         既出のcontrolと後述のHIDは#0と#2になっている
(B)alternate#0の意味は、停止時のなにもしない状態である
(CD)Streaming interfaceである
停止時(Alt0)ここまで

ステレオ(Alt1)ここから
---------------- Interface Descriptor -----------------
bLength                  : 0x09 (9 bytes)
bDescriptorType          : 0x04 (Interface Descriptor)
bInterfaceNumber         : 0x01   (A)
bAlternateSetting        : 0x01   (B)
bNumEndpoints            : 0x01 (1 Endpoint)  (C)
bInterfaceClass          : 0x01 (Audio)   (D)
bInterfaceSubClass       : 0x02 (Audio Streaming)  (E)
bInterfaceProtocol       : 0x00
iInterface               : 0x00 (No String Descriptor)
(AB)interface#1  alternate#1
(C)end pointが1つの意味であって、EP1のことではない
(DE)Streaming interfaceである


-------- Audio Streaming Interface Descriptor ---------
bLength                  : 0x07 (7 bytes)
bDescriptorType          : 0x24 (Audio Interface Descriptor)
bDescriptorSubtype       : 0x01   (A)
bTerminalLink            : 0x01   (B)
bDelay                   : 0x00
wFormatTag               : 0x0001 (PCM)   (C)
(A)Audio Streaming General
(B)ターミナルNo.1に接続されている
(C)0x0001 PCM   他の定義は不明

------- Audio Streaming Format Type Descriptor --------
bLength                  : 0x17 (23 bytes)
bDescriptorType          : 0x24 (Audio Interface Descriptor)
bDescriptorSubtype       : 0x02 (Format Type)
bFormatType              : 0x01 (FORMAT_TYPE_I)
bNrChannels              : 0x02 (2 channels)
bSubframeSize            : 0x02 (2 bytes per subframe)
bBitResolution           : 0x20 (32 bits per sample)
bSamFreqType             : 0x05 (supports 5 sample frequencies)
tSamFreq[1]              : 0x07D00 (32000 Hz)
tSamFreq[2]              : 0x0AC44 (44100 Hz)
tSamFreq[3]              : 0x0BB80 (48000 Hz)
tSamFreq[4]              : 0x17700 (96000 Hz)
tSamFreq[5]              : 0x2EE00 (192000 Hz)
これは判りやすい

----------------- Endpoint Descriptor -----------------

bLength                  : 0x07 (7 bytes)
bDescriptorType          : 0x05 (Endpoint Descriptor)
bEndpointAddress         : 0x02 (Direction=OUT EndpointID=2)
bmAttributes             : 0x09 (TransferType=Isochronous  SyncType=Adaptive  EndpointType=Data)
wMaxPacketSize           : 0x00C0
 Bits 15..13             : 0x00 (reserved, must be zero)
 Bits 12..11             : 0x00 (0 additional transactions per microframe -> allows 1..1024 bytes per packet)
 Bits 10..0              : 0xC0 (192 bytes per packet)
bInterval                : 0x04 (4 ms)
PCMはEP2から出てくる.パケットサイズは192bytes.

----------- Audio Data Endpoint Descriptor ------------
bLength                  : 0x07 (7 bytes)
bDescriptorType          : 0x25 (Audio Endpoint Descriptor)
bDescriptorSubtype       : 0x01 (General)
bmAttributes             : 0x00
bLockDelayUnits          : 0x02  (A)
wLockDelay               : 0x0200  (B)
(A)PCM sample単位
(B)512 sample delay
同期および適応エンドポイントに適用可能。非同期エンドポイントの場合、クロックはオーディオ機能の内部で生成され、完全に独立しています。この場合、bLockDelayUnitsとwLockDelayをゼロに設定する必要がある。
ステレオ(Alt1)ここまで

モノラル(Alt2)ここから
AlternateSetting2は割愛されている.
モノラル(Alt2)ここまで

ここまでで定義された結線はこうなっている.
Audio stream interfaceのdescriptorここまで

HID interfaceのdescriptorここから

---------------- Interface Descriptor -----------------
bLength                  : 0x09 (9 bytes)
bDescriptorType          : 0x04 (Interface Descriptor)
bInterfaceNumber         : 0x02  (A)
bAlternateSetting        : 0x00  (B)
bNumEndpoints            : 0x01 (1 Endpoint)  (C)
bInterfaceClass          : 0x03 (Human Interface Device) (D)
bInterfaceSubClass       : 0x00 (None)
bInterfaceProtocol       : 0x00 (None)
iInterface               : 0x00 (No String Descriptor)
(AB)interface#2  alternate#0
(C)end pointが1つの意味であって、EP1のことではない
(D)HIDである

------------------- HID Descriptor --------------------
bLength                  : 0x09 (9 bytes)
bDescriptorType          : 0x21 (HID Descriptor)
bcdHID                   : 0x0100 (HID Version 1.00)
bCountryCode             : 0x00 (00 = not localized)
bNumDescriptors          : 0x01
Descriptor 1:
bDescriptorType          : 0x22 (Class=Report)
wDescriptorLength        : 0x0024 (36 bytes)
Error reading descriptor : ERROR_GEN_FAILURE
HID report descriptorを正常に読めていない.それもそのはずでbinaryでここに書かれているはずのREPORTが存在しないからだ.それでもEZUSBでvolumeだのplay/stopだのを使う気は無いのでHIDがどうなろうとも知ったこっちゃ無いので放置しとく.

----------------- Endpoint Descriptor -----------------
bLength                  : 0x07 (7 bytes)
bDescriptorType          : 0x05 (Endpoint Descriptor)
bEndpointAddress         : 0x81 (Direction=IN EndpointID=1) (1)
bmAttributes             : 0x03 (TransferType=Interrupt)
wMaxPacketSize           : 0x0001
 Bits 15..13             : 0x00 (reserved, must be zero)
 Bits 12..11             : 0x00 (0 additional transactions per microframe -> allows 1..1024 bytes per packet)
 Bits 10..0              : 0x01 (1 byte per packet)
bInterval                : 0x0A (10 ms)
(1)EP1に接続されている

ここまでで、HIDがFeature UnitのHIDを司っていると想像されるのだが、残念ながらREPORTが存在しないのでHIDとFeature Unitの繋がりについては解明できていない.推測の域を出ない.

HID interfaceのdescriptorここまで



----------------- Device Qualifier Descriptor -----------------

bLength                  : 0x0A (10 bytes)
bDescriptorType          : 0x06 (Device_qualifier Descriptor)
bcdUSB                   : 0x200 (USB Version 2.00)
bDeviceClass             : 0xFF (Vendor Specific)
bDeviceSubClass          : 0xFF
bDeviceProtocol          : 0xFF
bMaxPacketSize0          : 0x40 (64 Bytes)
bNumConfigurations       : 0x01 (1 other-speed configuration)
bReserved                : 0x00
あらまこんな場所にQualifierがいる.
これはHIGH SPEED接続専用のdescriptorである.




-------------------- String Descriptors -------------------

             ------ String Descriptor 0 ------
bLength                  : 0x04 (4 bytes)
bDescriptorType          : 0x03 (String Descriptor)
Language ID[0]           : 0x0409 (English - United States)
             ------ String Descriptor 1 ------
bLength                  : 0x10 (16 bytes)
bDescriptorType          : 0x03 (String Descriptor)
Language 0x0409          : "Cypress"
             ------ String Descriptor 2 ------
bLength                  : 0x16 (22 bytes)
bDescriptorType          : 0x03 (String Descriptor)
Language 0x0409          : "EZ-USB DCC"