Skip to main content
SS.Sagar
Associate III
April 19, 2018
Question

USB composite device CDC+HID

  • April 19, 2018
  • 3 replies
  • 6345 views
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
This topic has been closed for replies.

3 replies

SS.Sagar
SS.SagarAuthor
Associate III
April 19, 2018
Posted on April 19, 2018 at 20:39

Is this descriptor part correct?

Pavel A.
Super User
April 19, 2018
Posted on April 19, 2018 at 23:16

No, the descriptors don't look entirely correct. But what is more important, we don't get any support for composite devices in the ST USB library. People

http://www.cnblogs.com/shangdawei/archive/2012/10/24/2737053.html

 or use a 3rd party USB library. There are also other opensource projects that have USB driver with composite support for STM32, such as Nuttx.

-- pa

Senior III
April 20, 2018
Posted on April 20, 2018 at 08:33

Why would you say that ? At least the library for the F0x2 and for the F30x have support for CDC+HID (with examples). I must admit that I did not try their composite examples, but they exist and the peripheral has enough endpoints to support it.

hobb.epy

‌ what part are you using ?

SS.Sagar
SS.SagarAuthor
Associate III
May 6, 2018
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?

Pavel A.
Super User
May 6, 2018
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

Tomas Long
Associate
July 13, 2018
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!

Ben K
Senior III
July 13, 2018
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.