cancel
Showing results for 
Search instead for 
Did you mean: 

USB composite device CDC+HID

SS.Sagar
Associate III
Posted on April 19, 2018 at 18:11

Hi,

i have working HID example with me. But i was trying to integrate CDC class in the existing HID class. I am using cubemx code. After initializing and flashing i got the error as 'Device Descriptor Request Failed' .

I am confused to initialize the USB driver for HID and CDC as well at the same time.  

Is it fine if i initialize the code for HID and CDC separately? 

Or i will have to initialize both code at the same time. 

Do i have to use different USB structure that is USBD_ClassTypeDef . ?

Here is my usb descriptor file.

/* USB HID device Configuration Descriptor */

__ALIGN_BEGIN static uint8_t USBD_HID_CfgDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN_END =

{

0x09, /* bLength: Configuration Descriptor size */

USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */

USB_HID_CONFIG_DESC_SIZ,

/* wTotalLength: Bytes returned */

0x00,

0x03, /*bNumInterfaces: 1 interface*/

0x01, /*bConfigurationValue: Configuration value*/

0x00, /*iConfiguration: Index of string descriptor describing

the configuration*/

0xE0, /*bmAttributes: bus powered and Support Remote Wake-up */

0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/

/************** Descriptor of Keyboard interface ****************/

/* 09 */

0x09, /*bLength: Interface Descriptor size*/

USB_DESC_TYPE_INTERFACE,/*bDescriptorType: Interface descriptor type*/

0x00, /*bInterfaceNumber: Number of Interface*/

0x00, /*bAlternateSetting: Alternate setting*/

0x01, /*bNumEndpoints*/

0x03, /*bInterfaceClass: HID*/

0x01, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/

0x01, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/ // KEYBOARD

0, /*iInterface: Index of string descriptor*/

/******************** Descriptor of Keyboard HID ********************/

/* 18 */

0x09, /*bLength: HID Descriptor size*/

HID_DESCRIPTOR_TYPE, /*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*/

HID_KEYBOARD_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/

0x00,

/******************** Descriptor of endpoint ********************/

/* 27 */

0x07, /*bLength: Endpoint Descriptor size*/

USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/

HID_EPIN_ADDR, /*bEndpointAddress: Endpoint Address (IN)*/

0x03, /*bmAttributes: Interrupt endpoint*/

HID_EPIN_SIZE, /*wMaxPacketSize: 4 Byte max */

0x00,

HID_FS_BINTERVAL, /*bInterval: Polling Interval (10 ms)*/

/* 34 */

/******** /IAD should be positioned just before the CDC interfaces ******

IAD to associate the two CDC interfaces */

0x08, /* bLength */

0x0B, /* bDescriptorType */

0x01, /* bFirstInterface */

0x02, /* bInterfaceCount */

0x02, /* bFunctionClass */

0x00, /* bFunctionSubClass */

0x01, /* bFunctionProtocol */

0x00, /* iFunction (Index of string descriptor describing this function) */

/*Interface Descriptor */

0x09, /* bLength: Interface Descriptor size */

USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */

/* Interface descriptor type */

0x01, /* bInterfaceNumber: Number of Interface */

0x00, /* bAlternateSetting: Alternate setting */

0x01, /* bNumEndpoints: One endpoints used */

0x02, /* bInterfaceClass: Communication Interface Class */

0x02, /* bInterfaceSubClass: Abstract Control Model */

0x01, /* bInterfaceProtocol: Common AT commands */

0x00, /* iInterface: */

/*Header Functional Descriptor*/

0x05, /* bLength: Endpoint Descriptor size */

0x24, /* bDescriptorType: CS_INTERFACE */

0x00, /* bDescriptorSubtype: Header Func Desc */

0x10, /* bcdCDC: spec release number */

0x01,

/*Call Management Functional Descriptor*/

0x05, /* bFunctionLength */

0x24, /* bDescriptorType: CS_INTERFACE */

0x01, /* bDescriptorSubtype: Call Management Func Desc */

0x00, /* bmCapabilities: D0+D1 */

0x01, /* bDataInterface: 1 */

/*ACM Functional Descriptor*/

0x04, /* bFunctionLength */

0x24, /* bDescriptorType: CS_INTERFACE */

0x02, /* bDescriptorSubtype: Abstract Control Management desc */

0x02, /* bmCapabilities */

/*Union Functional Descriptor*/

0x05, /* bFunctionLength */

0x24, /* bDescriptorType: CS_INTERFACE */

0x06, /* bDescriptorSubtype: Union func desc */

0x00, /* bMasterInterface: Communication class interface */

0x01, /* bSlaveInterface0: Data Class Interface */

/*Endpoint 2 Descriptor*/

0x07, /* bLength: Endpoint Descriptor size */

USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */

CDC_CMD_EP, /* bEndpointAddress */

0x03, /* bmAttributes: Interrupt */

LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */

HIBYTE(CDC_CMD_PACKET_SIZE),

0x10, /* bInterval: */

/*---------------------------------------------------------------------------*/

/*Data class interface descriptor*/

0x09, /* bLength: Endpoint Descriptor size */

USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */

0x02, /* bInterfaceNumber: Number of Interface */

0x00, /* bAlternateSetting: Alternate setting */

0x02, /* bNumEndpoints: Two endpoints used */

0x0A, /* bInterfaceClass: CDC */

0x00, /* bInterfaceSubClass: */

0x00, /* bInterfaceProtocol: */

0x00, /* iInterface: */

/*Endpoint OUT Descriptor*/

0x07, /* bLength: Endpoint Descriptor size */

USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */

CDC_OUT_EP, /* bEndpointAddress */

0x02, /* bmAttributes: Bulk */

LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */

HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE),

0x00, /* bInterval: ignore for Bulk transfer */

/*Endpoint IN Descriptor*/

0x07, /* bLength: Endpoint Descriptor size */

USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */

CDC_IN_EP, /* bEndpointAddress */

0x02, /* bmAttributes: Bulk */

LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */

HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE),

0x00 /* bInterval: ignore for Bulk transfer */

} ;

/* USB HID device Configuration Descriptor */

__ALIGN_BEGIN static uint8_t USBD_HID_Desc[USB_HID_DESC_SIZ] __ALIGN_END =

{

/* 18 */

0x09, /*bLength: HID Descriptor size*/

HID_DESCRIPTOR_TYPE, /*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*/

HID_KEYBOARD_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/

0x00,

};

/* USB Standard Device Descriptor */

__ALIGN_BEGIN static uint8_t USBD_HID_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END =

{

USB_LEN_DEV_QUALIFIER_DESC,

USB_DESC_TYPE_DEVICE_QUALIFIER,

0x00,

0x02,

0x00,

0x00,

0x00,

0x40,

0x01,

0x00,

};

#cubemx-stm32f103c8t6 #2-usb-descriptors #usb-composite
15 REPLIES 15
Posted on April 22, 2018 at 19:45

I am using STM32F103C8T6. 

SS.Sagar
Associate III
Posted on May 06, 2018 at 21:34

Is USB IAD interface is required for composite device? 

Is it possible to use HID and CDC interface without use of IAD?

Posted on May 06, 2018 at 23:22

Generally, not. A composite device can be defined without any IAD. AFAIK, only some specific classes make use of IAD.

-- pa

Posted on May 07, 2018 at 16:03

CDC uses two interfaces (comm + data) for a single functionality, therefore these two need to be associated with an IAD in every case. The exception is when the device descriptor's {Class, Subclass, Protocol} are set the same as the comm interface: {2,2,1}.

Tomas Long
Associate II
Posted on July 13, 2018 at 05:25

I'm also writing USB composite device CDC+HID(keyboard),but have some error, I used USB FS Lib 4.0.0,and STM32 StdPeriph Lib V3.5.0 .Have you solved that problem now,Can you give me your rountine for reference.Think you!

Posted on July 13, 2018 at 10:59

First of all, reviving 5 year old posts where all of the participants are inactive in the new forum isn't likely to help, so please avoid this in the future.

As I said above, the libraries you are using aren't really suitable for customization, so I suggest you try different ones, such as one of the above suggestions.