关于复合hid设备后出现设备一直发送Standard Request string2到主机
KeyMagicHorse opened this issue · comments
// ************************************* 6kro键盘描述符数据 *************************************
#define KEYBOARD_HID_EP_ARRAY 0x81 // 6kro键盘端点地址
#define KEYBOARD_HID_EP_ARRAY_SIZE 8 // 6kro键盘端点发送数据长度
#define KEYBOARD_HID_EP_ARRAY_INTERVAL 10 // 6kro键盘端点中断间隔
#define KEYBOARD_REPORT_DESC_SIZE 64 // 6kro键盘端点 hid 描述符大小
// ************************************* 6kro键盘描述符数据 *************************************
// *********************************** CONSUMER and system描述符 ***********************************
#define CONSUMER_AND_SYSTEM_HID_EP_ARRAY 0x82 //端点地址
#define CONSUMER_AND_SYSTEM_HID_EP_ARRAY_SIZE 3 // 端点发送数据长度
#define CONSUMER_AND_SYSTEM_HID_EP_ARRAY_INTERVAL 10 // 端点中断间隔
#define CONSUMER_AND_SYSTEM_REPORT_DESC_SIZE 49 // 端点 hid 描述符大小
// *********************************** CONSUMER and system描述符 ***********************************
#define CONFIGURATION_DESCRIPTOR_SIZ (9+ 9+9+7 + 9+9+7) // CONFIGURATION_DESCRIPTOR整个这个配置描述符大小 除开设备描述符和string
// 配置描述符
static const uint8_t CONFIGURATION_DESCRIPTOR[] = {
// 设备描述符 使用usb1.1协议
USB_DEVICE_DESCRIPTOR_INIT(USB_1_1, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0002, 0x01),
// 配置描述符 usb总线供电 最大500ma size = 09.!!!!!!!!!!!这个第二个参数是使用了多少端点!!!
USB_CONFIG_DESCRIPTOR_INIT(CONFIGURATION_DESCRIPTOR_SIZ, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER),
/**************************** 0x81号接口描述符 ******************************/
0x09, /* bLength: 描述符大小.固定为0x09 */
USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: 接口描述符类型.固定为0x04 */
0x00, /* bInterfaceNumber: 该接口的编号 */
0x00, /* bAlternateSetting: 不用管写0 */
0x01, /* bNumEndpoints: 该接口使用端点数,不能是0 */
0x03, /* bInterfaceClass: HID */
0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */
0x01, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */
0, /* iInterface: 描述该接口的字符串索引值*/
/**************************** 0x81号接口描述符 ******************************/
/******************** 0x81号接口识别HID通信所使用的描述符 ********************/
0x09, /* bLength: HID Descriptor size */
HID_DESCRIPTOR_TYPE_HID, /* bDescriptorType: HID */
0x11, /* bcdHID: HID Class Spec release number */
0x01,
0x00, /* bCountryCode: Hardware target country */
0x01, /* bNumDescriptors: Number of HID class descriptors to follow */
0x22, /* bDescriptorType */
KEYBOARD_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */
0x00,
/******************** 0x81号接口识别HID通信所使用的描述符 ********************/
/******************** 0x81号接口6kro端点描述符 ********************/
0x07, // bLength
USB_DESCRIPTOR_TYPE_ENDPOINT, // bDescriptorType (Endpoint)
KEYBOARD_HID_EP_ARRAY, // bEndpointAddress (IN/D1H) 端点地址81
0x03, // bmAttributes (Interrupt)
KEYBOARD_HID_EP_ARRAY_SIZE, 0x00, // wMaxPacketSize 8
KEYBOARD_HID_EP_ARRAY_INTERVAL, // bInterval 10 (unit depends on device speed)
/******************** 0x81号接口6kro端点描述符 ********************/
/**************************** 0x82号接口描述符 ******************************/
0x09, /* bLength: 描述符大小.固定为0x09 */
USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: 接口描述符类型.固定为0x04 */
0x01, /* bInterfaceNumber: 该接口的编号 */
0x00, /* bAlternateSetting: 不用管写0 */
0x01, /* bNumEndpoints: 该接口使用端点数,不能是0 */
0x03, /* bInterfaceClass: HID */
0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */
0x01, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */
0, /* iInterface: 描述该接口的字符串索引值*/
/**************************** 0x81号接口描述符 ******************************/
/******************** 0x82号接口识别HID通信所使用的描述符 ********************/
0x09, /* bLength: HID Descriptor size */
HID_DESCRIPTOR_TYPE_HID, /* bDescriptorType: HID */
0x11, /* bcdHID: HID Class Spec release number */
0x01,
0x00, /* bCountryCode: Hardware target country */
0x01, /* bNumDescriptors: Number of HID class descriptors to follow */
0x22, /* bDescriptorType */
CONSUMER_AND_SYSTEM_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */
0x00,
/******************** 0x81号接口识别HID通信所使用的描述符 ********************/
/******************** CONSUMER and system端点描述符 ********************/
0x07, // bLength
USB_DESCRIPTOR_TYPE_ENDPOINT, // bDescriptorType (Endpoint)
CONSUMER_AND_SYSTEM_HID_EP_ARRAY, // bEndpointAddress (IN/D2H) 端点地址82
0x03, // bmAttributes (Interrupt)
CONSUMER_AND_SYSTEM_HID_EP_ARRAY_SIZE, 0x00, // wMaxPacketSize 2
CONSUMER_AND_SYSTEM_HID_EP_ARRAY_INTERVAL, // bInterval 10 (unit depends on device speed)
/******************** CONSUMER and system端点描述符 ********************/
///////////////////////////////////////
/// string0 descriptor
///////////////////////////////////////
USB_LANGID_INIT(USBD_LANGID_STRING),
///////////////////////////////////////
/// string1 descriptor
///////////////////////////////////////
0x14, /* bLength */
USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */
'C', 0x00, /* wcChar0 */
'h', 0x00, /* wcChar1 */
'e', 0x00, /* wcChar2 */
'r', 0x00, /* wcChar3 */
'r', 0x00, /* wcChar4 */
'y', 0x00, /* wcChar5 */
'U', 0x00, /* wcChar6 */
'S', 0x00, /* wcChar7 */
'B', 0x00, /* wcChar8 */
///////////////////////////////////////
/// string2 descriptor
///////////////////////////////////////
0x26, /* bLength */
USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */
'C', 0x00, /* wcChar0 */
'h', 0x00, /* wcChar1 */
'e', 0x00, /* wcChar2 */
'r', 0x00, /* wcChar3 */
'r', 0x00, /* wcChar4 */
'y', 0x00, /* wcChar5 */
'U', 0x00, /* wcChar6 */
'S', 0x00, /* wcChar7 */
'B', 0x00, /* wcChar8 */
' ', 0x00, /* wcChar9 */
'H', 0x00, /* wcChar10 */
'I', 0x00, /* wcChar11 */
'D', 0x00, /* wcChar12 */
' ', 0x00, /* wcChar13 */
'D', 0x00, /* wcChar14 */
'E', 0x00, /* wcChar15 */
'M', 0x00, /* wcChar16 */
'O', 0x00, /* wcChar17 */
///////////////////////////////////////
/// string3 descriptor
///////////////////////////////////////
0x16, /* bLength */
USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */
'2', 0x00, /* wcChar0 */
'0', 0x00, /* wcChar1 */
'2', 0x00, /* wcChar2 */
'2', 0x00, /* wcChar3 */
'1', 0x00, /* wcChar4 */
'2', 0x00, /* wcChar5 */
'3', 0x00, /* wcChar6 */
'4', 0x00, /* wcChar7 */
'5', 0x00, /* wcChar8 */
'6', 0x00, /* wcChar9 */
0x00
};
static const uint8_t hid_keyboard_report_desc[KEYBOARD_REPORT_DESC_SIZE] = {
0x05, 0x01, // Usage Page (Generic Desktop Ctrls)
0x09, 0x06, // Usage (Keyboard)
0xA1, 0x01, // Collection (Application)
0x75, 0x01, // Report Size (1)
0x95, 0x08, // Report Count (8)
0x05, 0x07, // Usage Page (Kbrd/Keypad)
0x19, 0xE0, // Usage Minimum (0xE0)
0x29, 0xE7, // Usage Maximum (0xE7)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x95, 0x01, // Report Count (1)
0x75, 0x08, // Report Size (8)
0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
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,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x95, 0x01, // Report Count (1)
0x75, 0x03, // Report Size (3)
0x91, 0x03, // Output (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x95, 0xBD, // Report Count (-67)
0x75, 0x08, // Report Size (8)
0x15, 0x00, // Logical Minimum (0)
0x26, 0xFF, 0x00, // Logical Maximum (255)
0x05, 0x07, // Usage Page (Kbrd/Keypad)
0x19, 0x00, // Usage Minimum (0x00)
0x29, 0xFF, // Usage Maximum (0xFF)
0x81, 0x00, // Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0, // End Collection
// 64 bytes
};
// consumer controls & system controls.
static const uint8_t hid_consumer_and_system_report_desc[CONSUMER_AND_SYSTEM_REPORT_DESC_SIZE] = {
/* system control */
0x05, 0x01, // Usage Page (Generic Desktop Ctrls)
0x09, 0x80, // Usage (Sys Control)
0xA1, 0x01, // Collection (Application)
0x85, 0x02, // Report ID (2)
0x15, 0x01, // Logical Minimum (1)
0x26, 0xB7, 0x00, // Logical Maximum (183)
0x19, 0x01, // Usage Minimum (Pointer)
0x29, 0xB7, // Usage Maximum (Sys Display LCD Autoscale)
0x75, 0x10, // Report Size (16)
0x95, 0x01, // Report Count (1)
0x81, 0x00, // Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0, // End Collection
/* consumer */
0x05, 0x0C, // Usage Page (Consumer)
0x09, 0x01, // Usage (Consumer Control)
0xA1, 0x01, // Collection (Application)
0x85, 0x03, // Report ID (3)
0x15, 0x01, // Logical Minimum (1)
0x26, 0x9C, 0x02, // Logical Maximum (668)
0x19, 0x01, // Usage Minimum (Consumer Control)
0x2A, 0x9C, 0x02, // Usage Maximum (AC Distribute Vertically)
0x75, 0x10, // Report Size (16)
0x95, 0x01, // Report Count (1)
0x81, 0x00, // Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0, // End Collection
// 49 bytes
};
static struct usbd_endpoint hid_keyboard_in_ep = {
.ep_cb = usbd_hid_int_callback,
.ep_addr = KEYBOARD_HID_EP_ARRAY
};
static struct usbd_endpoint hid_consumer_and_system_in_ep = {
.ep_cb = usbd_hid_int_callback,
.ep_addr = CONSUMER_AND_SYSTEM_HID_EP_ARRAY
};
struct usbd_interface intf1;
struct usbd_interface intf2;
void hid_keyboard_init(void)
{
usbd_desc_register(CONFIGURATION_DESCRIPTOR);// 放入配置描述符
usbd_add_interface(usbd_hid_init_intf(&intf1, hid_keyboard_report_desc, KEYBOARD_REPORT_DESC_SIZE));
usbd_add_interface(usbd_hid_init_intf(&intf2, hid_consumer_and_system_report_desc, CONSUMER_AND_SYSTEM_REPORT_DESC_SIZE));
usbd_add_endpoint(&hid_keyboard_in_ep);
usbd_add_endpoint(&hid_consumer_and_system_in_ep);
usbd_initialize();
}
// 键盘测试
void hid_keyboard_test(void)
{
uint8_t sendbuffer[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; //A
usbd_ep_start_write(KEYBOARD_HID_EP_ARRAY, sendbuffer, 8);
hid_state = HID_STATE_BUSY;
while (hid_state == HID_STATE_BUSY) {
}
}
// 多媒体测试
void hid_consumer_test(void){
uint8_t consumer_report_id = 0x03;
// uint8_t reportData[3] = {consumer_report_id, 0xE9, 0x00};// 音量up
uint8_t reportData[3] = {consumer_report_id, 0x00, 0x00};
usbd_ep_start_write(CONSUMER_AND_SYSTEM_HID_EP_ARRAY, reportData, 3);
hid_state = HID_STATE_BUSY;
while (hid_state == HID_STATE_BUSY) {
}
}
没看出问题,自己解决吧