Skip to main content
Visitor II
January 14, 2020
Question

Need Help !!!! I am Trying to make one Composite USB device(CDC + HID) by Using STM32F103C8T6.

  • January 14, 2020
  • 1 reply
  • 742 views

When I am connecting my device with laptop. CDC class is getting COM port but my HID(mouse) is not working Although it is showing in Device Manager with Yellow Sign. it means i am doing some thing Wrong here.

I am Sharing few Things.

1: Device Descriptor -->> Please check is it right ?

2: Configuration Descriptor-->> Please check is it right ?

3: Report Descriptor -->> it is correctly working if i am making only Custom Mouse .

/* USB Standard Device Descriptor */
 
__ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
 {
 0x12, /*bLength */
 USB_DESC_TYPE_DEVICE, /*bDescriptorType*/
 0x00, /* bcdUSB */ 
 0x02,
 0xEF, /*bDeviceClass*/ //->> Composite device
 0x02, /*bDeviceSubClass*/ //->> Composite device
 0x01, /*bDeviceProtocol*/ //->> Composite device
 USB_MAX_EP0_SIZE, /*bMaxPacketSize*/
 LOBYTE(USBD_VID), /*idVendor*/
 HIBYTE(USBD_VID), /*idVendor*/
 LOBYTE(USBD_PID_FS), /*idVendor*/
 HIBYTE(USBD_PID_FS), /*idVendor*/
 0x00, /*bcdDevice rel. 2.00*/
 0x02,
 USBD_IDX_MFC_STR, /*Index of manufacturer string*/
 USBD_IDX_PRODUCT_STR, /*Index of product string*/
 USBD_IDX_SERIAL_STR, /*Index of serial number string*/
 USBD_MAX_NUM_CONFIGURATION /*bNumConfigurations*/
 } ; 
/* USB_DeviceDescriptor */
#define USBD_VID 1155//0x0483
#define USBD_LANGID_STRING 0x409
#define USBD_MANUFACTURER_STRING "STMicroelectronics"
#define USBD_PID_FS 0xFFE1//0x5741//0x5750//0x5741
#define USBD_PRODUCT_STRING_FS "STM32 Composite"
#define USBD_SERIALNUMBER_STRING_FS "00000000001A"
#define USBD_CONFIGURATION_STRING_FS "CDC+ HID Config"
#define USBD_INTERFACE_STRING_FS "CDC+ HID Interface"
#define USB_CDC_HID_CONFIG_DESC_SIZ 	100
#define HID_INTERFACE 								0x00
#define CDC_INTERFACE0 								0x01
#define CDC_INTERFACE1 								0x02
#define USB_HID_CONFIG_DESC_SIZ 100
#define HID_DESCRIPTOR_TYPE 0x21
#define HID_MOUSE_REPORT_DESC_SIZE 74
#define HID_EPIN_ADDR 0x81
#define HID_EPIN_SIZE 0x04
#define HID_FS_BINTERVAL 0x0A
 
 
__ALIGN_BEGIN static uint8_t USBD_CDC_HID_CfgDesc[USB_CDC_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 Joystick Mouse 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*/
 0x02, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */
 0, /*iInterface: Index of string descriptor*/
 /******************** Descriptor of Joystick Mouse 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_MOUSE_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/
 0x00,
 /******************** Descriptor of Mouse 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 */
	0x02, /* bFunctionSubClass */
	0x01, /* bFunctionProtocol */
	0x02, /* iFunction (Index of string descriptor describing this function) */
	/*49*/
	
	/************************ CDC interface ********************************/
	0x09, /* bLength: Interface Descriptor size */
	USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */
	/* Interface descriptor type */
	CDC_INTERFACE0, /* 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: */
	/*58*/
	
	/*Header Functional Descriptor*/
	0x05, /* bLength: Endpoint Descriptor size */
	0x24, /* bDescriptorType: CS_INTERFACE */
	0x00, /* bDescriptorSubtype: Header Func Desc */
	0x10, /* bcdCDC: spec release number */
	0x01,
	/*63*/
	
	/*Call Management Functional Descriptor*/
	0x05, /* bFunctionLength */
	0x24, /* bDescriptorType: CS_INTERFACE */
	0x01, /* bDescriptorSubtype: Call Management Func Desc */
	0x00, /* bmCapabilities: D0+D1 */
	0x01, /* bDataInterface: 1 */
	/*68*/
	
	/*ACM Functional Descriptor*/
	0x04, /* bFunctionLength */
	0x24, /* bDescriptorType: CS_INTERFACE */
	0x02, /* bDescriptorSubtype: Abstract Control Management desc */
	0x02, /* bmCapabilities */
	/*72*/
	
	/*Union Functional Descriptor*/
	0x05, /* bFunctionLength */
	0x24, /* bDescriptorType: CS_INTERFACE */
	0x06, /* bDescriptorSubtype: Union func desc */
	0x00, /* bMasterInterface: Communication class interface */
	0x01, /* bSlaveInterface0: Data Class Interface */
	/*77*/
	
	/*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: */ 
	/*84*/
	
	/*---------------------------------------------------------------------------*/
 
	/*Data class interface descriptor*/
	0x09, /* bLength: Endpoint Descriptor size */
	USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */
	CDC_INTERFACE1, /* bInterfaceNumber: Number of Interface */
	0x00, /* bAlternateSetting: Alternate setting */
	0x02, /* bNumEndpoints: Two endpoints used */
	0x0A, /* bInterfaceClass: CDC */
	0x00, /* bInterfaceSubClass: */
	0x00, /* bInterfaceProtocol: */
	0x00, /* iInterface: */
	/*93*/
	
	/*Endpoint OUT Descriptor*/
	0x07, /* bLength: Endpoint Descriptor size */
	USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */
	CDC_OUT_EP, /* bEndpointAddress */
	0x02, /* bmAttributes: Bulk */
	LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */
	HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE),
	0x01, /* bInterval: ignore for Bulk transfer */
	/*100*/
	
	/*Endpoint IN Descriptor*/
	0x07, /* bLength: Endpoint Descriptor size */
	USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */
	CDC_IN_EP, /* bEndpointAddress */
	0x02, /* bmAttributes: Bulk */
	LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */
	HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE),
	0x01, /* bInterval: ignore for Bulk transfer */
	/*107*/
} ;
 
/* USB Standard Device Descriptor */
__ALIGN_BEGIN static uint8_t USBD_CDC_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,
};
 
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
/* USER CODE BEGIN 0 */ 
	 0x05, 0x01,
 0x09, 0x02,
 0xA1, 0x01,
 0x09, 0x01,
 
 0xA1, 0x00,
 0x05, 0x09,
 0x19, 0x01,
 0x29, 0x03,
 
 0x15, 0x00,
 0x25, 0x01,
 0x95, 0x03,
 0x75, 0x01,
 
 0x81, 0x02,
 0x95, 0x01,
 0x75, 0x05,
 0x81, 0x01,
 
 0x05, 0x01,
 0x09, 0x30,
 0x09, 0x31,
 0x09, 0x38,
 
 0x15, 0x81,
 0x25, 0x7F,
 0x75, 0x08,
 0x95, 0x03,
 
 0x81, 0x06,
 0xC0, 0x09,
 0x3c, 0x05,
 0xff, 0x09,
 
 0x01, 0x15,
 0x00, 0x25,
 0x01, 0x75,
 0x01, 0x95,
 
 0x02, 0xb1,
 0x22, 0x75,
 0x06, 0x95,
 0x01, 0xb1,
 
 0x01, 0xc0
/* USER CODE END 0 */ 
/* END_COLLECTION	 */ 
}; 

Regards

@Vivek yadav​ 

    This topic has been closed for replies.

    1 reply

    Visitor II
    January 14, 2020

    If you don't get help here, you may want to try using the library described at https://community.st.com/s/question/0D50X0000BytFjMSQU/announcement-new-opensource-usb-library-for-stm32f103xx-mcus

    to see if your problem is in the descriptors themselves or in their inclusion in the library (HAL? you didn't say which) you're using. I find it very difficult to implement new USB device classes in HAL, and easy in my library. I'd also be very interested in seeing if it can handle a composite device -- that's on my "TO DO" list at https://github.com/thanks4opensource/papoon_usb#further_development

    Sorry, I can't help with the descriptors themselves -- I find particularly HID descriptors to be absolutely incomprehensible. You may want to compare yours to the ones in https://github.com/thanks4opensource/papoon_usb/blob/master/usb/usb_dev_hid_mouse.cxx

    and https://github.com/thanks4opensource/papoon_usb/blob/master/usb/usb_dev_cdc_acm.cxx which I know work, but again as separate devices, not combined into a composite one.