这一次使用 CH567 制作一个USB键盘,参考的对象是Dostyle的MK60 机械键盘。
同样的,使用 USBlyzer 抓取描述符信息: USB Composite Device Connection Status | Device connected | Current Configuration | 1 | Speed | Full (12 Mbit/s) | Device Address | 8 | Number Of Open Pipes | 2 |
Device Descriptor GamingKB Offset | Field | Size | Value | Description | 0 | bLength | 1 | 12h | | 1 | bDescriptorType | 1 | 01h | Device | 2 | bcdUSB | 2 | 0110h | USB Spec 1.1 | 4 | bDeviceClass | 1 | 00h | Class info in Ifc Descriptors | 5 | bDeviceSubClass | 1 | 00h | | 6 | bDeviceProtocol | 1 | 00h | | 7 | bMaxPacketSize0 | 1 | 08h | 8 bytes | 8 | idVendor | 2 | 258Ah | | 10 | idProduct | 2 | 002Ah | | 12 | bcdDevice | 2 | 1201h | 12.01 | 14 | iManufacturer | 1 | 01h | "SINO WEALTH" | 15 | iProduct | 1 | 02h | "Gaming KB " | 16 | iSerialNumber | 1 | 00h | | 17 | bNumConfigurations | 1 | 01h | |
Configuration Descriptor1 Bus Powered, 500 mA Offset | Field | Size | Value | Description | 0 | bLength | 1 | 09h | | 1 | bDescriptorType | 1 | 02h | Configuration | 2 | wTotalLength | 2 | 003Bh | | 4 | bNumInterfaces | 1 | 02h | | 5 | bConfigurationValue | 1 | 01h | | 6 | iConfiguration | 1 | 00h | | 7 | bmAttributes | 1 | A0h | Bus Powered, Remote Wakeup | | 4..0: Reserved | | ...00000 | | | 5: Remote Wakeup | | ..1..... | Yes | | 6: Self Powered | | .0...... | No, Bus Powered | | 7: Reserved (set to one)
(bus-powered for 1.0) | | 1....... | | 8 | bMaxPower | 1 | FAh | 500 mA |
Interface Descriptor 0/0 HID,1 Endpoint Offset | Field | Size | Value | Description | 0 | bLength | 1 | 09h | | 1 | bDescriptorType | 1 | 04h | Interface | 2 | bInterfaceNumber | 1 | 00h | | 3 | bAlternateSetting | 1 | 00h | | 4 | bNumEndpoints | 1 | 01h | | 5 | bInterfaceClass | 1 | 03h | HID | 6 | bInterfaceSubClass | 1 | 01h | Boot Interface | 7 | bInterfaceProtocol | 1 | 01h | Keyboard | 8 | iInterface | 1 | 00h | |
HID Descriptor Offset | Field | Size | Value | Description | 0 | bLength | 1 | 09h | | 1 | bDescriptorType | 1 | 21h | HID | 2 | bcdHID | 2 | 0111h | 1.11 | 4 | bCountryCode | 1 | 00h | | 5 | bNumDescriptors | 1 | 01h | | 6 | bDescriptorType | 1 | 22h | Report | 7 | wDescriptorLength | 2 | 0043h | 67 bytes |
Endpoint Descriptor 81 1In, Interrupt, 1 ms Offset | Field | Size | Value | Description | 0 | bLength | 1 | 07h | | 1 | bDescriptorType | 1 | 05h | Endpoint | 2 | bEndpointAddress | 1 | 81h | 1 In | 3 | bmAttributes | 1 | 03h | Interrupt | | 1..0: Transfer Type | | ......11 | Interrupt | | 7..2: Reserved | | 000000.. | | 4 | wMaxPacketSize | 2 | 0008h | 8 bytes | 6 | bInterval | 1 | 01h | 1 ms |
Interface Descriptor 1/0 HID,1 Endpoint Offset | Field | Size | Value | Description | 0 | bLength | 1 | 09h | | 1 | bDescriptorType | 1 | 04h | Interface | 2 | bInterfaceNumber | 1 | 01h | | 3 | bAlternateSetting | 1 | 00h | | 4 | bNumEndpoints | 1 | 01h | | 5 | bInterfaceClass | 1 | 03h | HID | 6 | bInterfaceSubClass | 1 | 00h | | 7 | bInterfaceProtocol | 1 | 00h | | 8 | iInterface | 1 | 00h | |
HID Descriptor Offset | Field | Size | Value | Description | 0 | bLength | 1 | 09h | | 1 | bDescriptorType | 1 | 21h | HID | 2 | bcdHID | 2 | 0111h | 1.11 | 4 | bCountryCode | 1 | 00h | | 5 | bNumDescriptors | 1 | 01h | | 6 | bDescriptorType | 1 | 22h | Report | 7 | wDescriptorLength | 2 | 00CCh | 204 bytes |
Endpoint Descriptor 82 2In, Interrupt, 1 ms Offset | Field | Size | Value | Description | 0 | bLength | 1 | 07h | | 1 | bDescriptorType | 1 | 05h | Endpoint | 2 | bEndpointAddress | 1 | 82h | 2 In | 3 | bmAttributes | 1 | 03h | Interrupt | | 1..0: Transfer Type | | ......11 | Interrupt | | 7..2: Reserved | | 000000.. | | 4 | wMaxPacketSize | 2 | 0010h | 16 bytes | 6 | bInterval | 1 | 01h | 1 ms |
Interface 0 HID ReportDescriptor Keyboard Item Tag (Value) | Raw Data | Usage Page (Generic Desktop) | 05 01 | Usage (Keyboard) | 09 06 | Collection (Application) | A1 01 | Usage Page (Keyboard/Keypad) | 05 07 | Usage Minimum (Keyboard Left Control) | 19 E0 | Usage Maximum (Keyboard Right GUI) | 29 E7 | Logical Minimum (0) | 15 00 | Logical Maximum (1) | 25 01 | Report Count (8) | 95 08 | Report Size (1) | 75 01 | Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) | 81 02 | Report Count (1) | 95 01 | Report Size (8) | 75 08 | Input (Cnst,Var,Abs,NWrp,Lin,Pref,NNul,Bit) | 81 03 | Report Count (6) | 95 06 | Report Size (8) | 75 08 | Logical Minimum (0) | 15 00 | Logical Maximum (255) | 26 FF 00 | Usage Page (Keyboard/Keypad) | 05 07 | Usage Minimum (Undefined) | 19 00 | Usage Maximum | 2A FF 00 | Input (Data,Ary,Abs) | 81 00 | Logical Maximum (1) | 25 01 | Report Count (5) | 95 05 | Report Size (1) | 75 01 | Usage Page (LEDs) | 05 08 | Usage Minimum (Num Lock) | 19 01 | Usage Maximum (Kana) | 29 05 | Output (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) | 91 02 | Report Count (1) | 95 01 | Report Size (3) | 75 03 | Output (Cnst,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) | 91 03 | End Collection | C0 |
Interface 1 HID ReportDescriptor System Control Item Tag (Value) | Raw Data | Usage Page (Generic Desktop) | 05 01 | Usage (System Control) | 09 80 | Collection (Application) | A1 01 | Report ID (1) | 85 01 | Usage Minimum (System Power Down) | 19 81 | Usage Maximum (System Wake Up) | 29 83 | Logical Minimum (0) | 15 00 | Logical Maximum (1) | 25 01 | Report Size (1) | 75 01 | Report Count (3) | 95 03 | Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) | 81 02 | Report Count (5) | 95 05 | Input (Cnst,Ary,Abs) | 81 01 | End Collection | C0 | Usage Page (Consumer Devices) | 05 0C | Usage (Consumer Control) | 09 01 | Collection (Application) | A1 01 | Report ID (2) | 85 02 | Usage Minimum (Undefined) | 19 00 | Usage Maximum (AC Format) | 2A 3C 02 | Logical Minimum (0) | 15 00 | Logical Maximum (572) | 26 3C 02 | Report Count (1) | 95 01 | Report Size (16) | 75 10 | Input (Data,Ary,Abs) | 81 00 | End Collection | C0 | Usage Page (Vendor-Defined 1) | 06 00 FF | Usage (Vendor-Defined 1) | 09 01 | Collection (Application) | A1 01 | Report ID (5) | 85 05 | Logical Minimum (0) | 15 00 | Logical Maximum (255) | 26 FF 00 | Usage Minimum (Vendor-Defined 1) | 19 01 | Usage Maximum (Vendor-Defined 2) | 29 02 | Report Size (8) | 75 08 | Report Count (5) | 95 05 | Feature (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) | B1 02 | End Collection | C0 | Usage Page (Generic Desktop) | 05 01 | Usage (Keyboard) | 09 06 | Collection (Application) | A1 01 | Report ID (6) | 85 06 | Logical Minimum (0) | 15 00 | Logical Maximum (1) | 25 01 | Report Size (1) | 75 01 | Report Count (112) | 95 70 | Usage Page (Keyboard/Keypad) | 05 07 | Usage Minimum (Keyboard Left Control) | 19 E0 | Usage Maximum (Keyboard Right GUI) | 29 E7 | Usage Minimum (Undefined) | 19 00 | Usage Maximum (Keypad =) | 29 67 | Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) | 81 02 | Report Count (8) | 95 08 | Input (Cnst,Ary,Abs) | 81 01 | End Collection | C0 | Usage Page (Vendor-Defined 1) | 06 00 FF | Usage (Vendor-Defined 1) | 09 01 | Collection (Application) | A1 01 | Report ID (9) | 85 09 | Logical Minimum (0) | 15 00 | Logical Maximum (255) | 26 FF 00 | Usage (Undefined) | 09 00 | Report Size (8) | 75 08 | Report Count (504) | 96 F8 01 | Feature (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) | B1 02 | End Collection | C0 | Usage Page (Vendor-Defined 1) | 06 00 FF | Usage (Vendor-Defined 1) | 09 01 | Collection (Application) | A1 01 | Report ID (10) | 85 0A | Logical Minimum (0) | 15 00 | Logical Maximum (255) | 26 FF 00 | Usage (Undefined) | 09 00 | Report Size (8) | 75 08 | Report Count (41) | 95 29 | Feature (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) | B1 02 | End Collection | C0 | Usage Page (Vendor-Defined 1) | 06 00 FF | Usage (Vendor-Defined 1) | 09 01 | Collection (Application) | A1 01 | Report ID (11) | 85 0B | Logical Minimum (0) | 15 00 | Logical Maximum (255) | 26 FF 00 | Usage (Undefined) | 09 00 | Report Size (8) | 75 08 | Report Count (126) | 95 7E | Feature (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) | B1 02 | End Collection | C0 | Usage Page (Vendor-Defined 1) | 06 00 FF | Usage (Vendor-Defined 1) | 09 01 | Collection (Application) | A1 01 | Report ID (12) | 85 0C | Logical Minimum (0) | 15 00 | Logical Maximum (255) | 26 FF 00 | Usage (Undefined) | 09 00 | Report Size (8) | 75 08 | Report Count (1920) | 96 80 07 | Feature (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) | B1 02 | End Collection | C0 |
需要特别注意的是:这个设备是 USB Full Speed(12Mbits/s)的,必须在文件头部设置为 Full Speed,如果继续使用 Low Speed,插入之后读取描述符后 Host就会停止继续发送数据(Windows行为,我不知道原因)。 除此之外,和之前的鼠标代码相比还增加了一个HID描述符,另外,在 Main 中定时发送打开Windows菜单(Win按键)。
USB1_Keyboard.zip
(379.23 KB, 下载次数: 1)
|