cherry-embedded / CherryUSB

CherryUSB is a tiny and portable USB Stack (device & host) for embedded system with USB IP

Home Page:https://cherryusb.readthedocs.io/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

关于复合hid设备后出现设备一直发送Standard Request string2到主机

KeyMagicHorse opened this issue · comments

commented

e72b64f582c411f550bac10ea98fb8e
下面是我截取的部分代码。

// ************************************* 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) {
    }
}

没看出问题,自己解决吧