关于STM32的USB设备库DIY机械键盘( 二 )


1.3 接口描述符
0x09,/* bLength: Interface Descriptor size */USB_INTERFACE_DESCRIPTOR_TYPE,/* bDescriptorType: Interface descriptor type */0x00,/* bInterfaceNumber: Number of Interface */0x00,/* bAlternateSetting: Alternate setting */0x02,/* bNumEndpoints,except endpoint 0 */0x03,/* bInterfaceClass: HID */0x01,/* bInterfaceSubClass : 1=BOOT, 0=no boot */0x01,/* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */0,/* iInterface: Index of string descriptor */
关于接口描述符,如果只需要一个接口,直接复制粘贴就能用 。另外注意的是,多接口复合设备中,只能有一个Boot设备,即这个变量,只有一个接口可以为1,其他的为0 。具体为什么,我也不清楚,有知道的朋友可以回复一下,谢谢 。因为我有一次定义了两个Boot接口,设备没有枚举成功 。
1.4 HID描述符
0x09,/* bLength: HID Descriptor size */HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID */0x10,/* bcdHID: HID Class Spec release number */0x01,0x00,/* bCountryCode: Hardware target country */0x01,/* bNumDescriptors: Number of HID class descriptors to follow */0x22,/* bDescriptorType */CUSTOMHID_SIZ_REPORT_DESC,/* wItemLength: Total length of Report descriptor */0x00,
关于HID描述符,_DESC这个值需要根据报告描述符的长度来修改 。
1.5 端点描述符
0x07,/* bLength: Endpoint Descriptor size */USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */0x81,/* bEndpointAddress: Endpoint Address (IN) */0x03,/* bmAttributes: Interrupt endpoint */0x08,/* wMaxPacketSize: 8 Bytes max */0x00,0x05,/* bInterval: Polling Interval (5 ms) */0x07, /* bLength: Endpoint Descriptor size */USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: *//* Endpoint descriptor type */0x02, /* bEndpointAddress:Endpoint Address (OUT) */0x03, /* bmAttributes: Interrupt endpoint */0x01, /* wMaxPacketSize: 1 Bytes max*/0x00,0x05, /* bInterval: Polling Interval (5 ms) */
关于端点描述符,表示端点地址,表示当前这个接口所需要的端点资源,输入(相对于主机而言)端点最高位为1,输出(相对于主机而言)端点最高位为0 。然后说一句,HID设备一般都是使用中断端点进行数据传输 。表示该端点上数据传输的数量 。表示主机查询设备数据的时间间隔,如果设置的太长,则键盘输入延迟很高,深有体会 。
1.6 报告描述符
0x05, 0x01, // USAGE_PAGE (Generic Desktop)0x09, 0x06, // USAGE (Keyboard)0xa1, 0x01, // COLLECTION (Application)0x05, 0x07, // USAGE_PAGE (Keyboard)0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)0x15, 0x00, // LOGICAL_MINIMUM (0)0x25, 0x01, // LOGICAL_MAXIMUM (1)0x75, 0x01, // REPORT_SIZE (1)0x95, 0x08, // REPORT_COUNT (8)0x81, 0x02, // INPUT (Data,Var,Abs)0x95, 0x01, // REPORT_COUNT (1)0x75, 0x08, // REPORT_SIZE (8)0x81, 0x03, // INPUT (Cnst,Var,Abs)0x95, 0x05, // REPORT_COUNT (5)0x75, 0x01, // REPORT_SIZE (1)0x05, 0x08, // USAGE_PAGE (LEDs)0x19, 0x01, // USAGE_MINIMUM (Num Lock)0x29, 0x05, // USAGE_MAXIMUM (Kana)0x91, 0x02, // OUTPUT (Data,Var,Abs)0x95, 0x01, // REPORT_COUNT (1)0x75, 0x03, // REPORT_SIZE (3)0x91, 0x03, // OUTPUT (Cnst,Var,Abs) 0x95, 0x06, // REPORT_COUNT (6)0x75, 0x08, // REPORT_SIZE (8)0x15, 0x00, // LOGICAL_MINIMUM (0)0x25, 0xFF, // LOGICAL_MAXIMUM (255)0x05, 0x07, // USAGE_PAGE (Keyboard)0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)0x81, 0x00, // INPUT (Data,Ary,Abs)0xc0, // END_COLLECTION/* 63 */
关于报告描述符,具体每一个数据什么意思,可以参考前面说的文档HID Usage Table 。这个就是标准6KRO键盘的报告描述符 。
至于还有 字符串 描述符,不说了,有用,用处不大,不修改直接用,没有一点关系 。