STM32F4 USB Composite CDC + MSC

I'm in the process of building a USB composite CDC + MSC device on the STM32F4 Discovery board but am having trouble getting windows to recognise it.

Using USBlyzer all the descriptor info seems ok but windows will only recognise the CDC (virtual com port). The port gets enumerated and I can open and close it but data goes to the wrong endpoint no matter how I swap them around. Also, windows completely ignores the MSC unless I disable the CDC and then it works fine.

Is there some trick to the descriptors to get both drivers to load (virtual com port + mass storage) or do I need a custom driver or .inf file. I've tried disabling the devices using USBDeview and reinstalling as well as different PIDs but no luck.

I've posted my descriptors below but am happy to post code or the whole project if it will help.

Thanks.

#define USBD_VID                     0x0483
#define USBD_PID 0x5000
#define USBD_LANGID_STRING 0x409
#define USBD_MANUFACTURER_STRING "STMicroelectronics"
#define USBD_PRODUCT_HS_STRING "Composite Device HS Mode"
#define USBD_SERIALNUMBER_HS_STRING "000000000001"
#define USBD_PRODUCT_FS_STRING "Composite Device FS Mode"
#define USBD_SERIALNUMBER_FS_STRING "000000000001"
#define USBD_CONFIGURATION_HS_STRING "CDC/MSC Config"
#define USBD_INTERFACE_HS_STRING "CDC/MSC Interface"
#define USBD_CONFIGURATION_FS_STRING "CDC/MSC Config"
#define USBD_INTERFACE_FS_STRING "CDC/MSC Interface" __ALIGN_BEGIN uint8_t USBD_DeviceDesc[USB_SIZ_DEVICE_DESC] __ALIGN_END =
{
0x12, /*bLength */
USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/
0x00, /*bcdUSB */
0x02,
0xEF, /*bDeviceClass*/
0x02, /*bDeviceSubClass*/
0x01, /*bDeviceProtocol*/
USB_OTG_MAX_EP0_SIZE, /*bMaxPacketSize*/
LOBYTE(USBD_VID), /*idVendor*/
HIBYTE(USBD_VID), /*idVendor*/
LOBYTE(USBD_PID), /*idVendor*/
HIBYTE(USBD_PID), /*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_CFG_MAX_NUM /*bNumConfigurations*/
} ; /* USB_DeviceDescriptor */ /* USB device Configuration Descriptor */
__ALIGN_BEGIN static uint8_t USBD_CDC_MSC_CfgDesc[DESCRIPTOR_TOTAL_LENGTH] __ALIGN_END =
{
/* Generic part */
// CONFIGURATION DESCRIPTOR (9 bytes)
0x09, // bLength
USB_CONFIGURATION_DESCRIPTOR_TYPE, // bDescriptorType
DESCRIPTOR_TOTAL_LENGTH, 0x00, // wTotalLength
0x03, // bNumInterfaces
0x01, // bConfigurationvalue
0x00, // iConfiguration Description offset
0xC0, // bmAttributes, self powered
0x32, // Max. Power Consumption // IAD
0x08, // bLength: Interface Descriptor size
0x0B, // bDescriptorType: IAD
0x00, // bFirstInterface
0x03, // bInterfaceCount
0x02, // bFunctionClass: CDC
0x02, // bFunctionSubClass
0x01, // bFunctionProtocol
0x02, // iFunction /*Interface Descriptor*/
0x09, /* bLength: Interface Descriptor size */
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface */
/* Interface descriptor type */
0x00, /* 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 Managment 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_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */
CDC_CMD_EP, /* bEndpointAddress: (IN2) */
0x03, /* bmAttributes: Interrupt */
0x08, 0x00, /* wMaxPacketSize: */
0xFF, /* bInterval: */ /*Data class interface descriptor*/
0x09, /* bLength: Endpoint Descriptor size */
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: */
0x01, /* bInterfaceNumber: Number of Interface */
0x00, /* bAlternateSetting: Alternate setting */
0x02, /* bNumEndpoints: Two endpoints used */
0x0A, /* bInterfaceClass: CDC */
0x00, /* bInterfaceSubClass: */
0x00, /* bInterfaceProtocol: */
0x00, /* iInterface: */ /*Endpoint 3 Descriptor*/
0x07, /* bLength: Endpoint Descriptor size */
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */
CDC_OUT_EP, /* bEndpointAddress: (OUT3) */
0x02, /* bmAttributes: Bulk */
0x40, 0x00, /* wMaxPacketSize: */
0x00, /* bInterval: ignore for Bulk transfer */ /*Endpoint 1 Descriptor*/
0x07, /* bLength: Endpoint Descriptor size */
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */
CDC_IN_EP, /* bEndpointAddress: (IN1) */
0x02, /* bmAttributes: Bulk */
0x40, 0x00, /* wMaxPacketSize: */
0x00, /* bInterval */ // -------- Descriptor for MSC class device ------------------------
// INTERFACE DESCRIPTOR (9 bytes)
0x09, // bLength
USB_INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType: 4
0x02, // bInterfaceNumber
0x00, // bAlternateSetting
0x02, // bNumEndpoints
0x08, // bInterfaceClass: 8 = MSC Device
0x06, // bInterfaceSubClass:
0x50, // bInterfaceProtocol:
0x01, // iInterface:1 0x07, // bLength
USB_ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType
MSC_IN_EP, // bEndpointAddress; bit7=1 for IN, bits 3-0=1 for ep1
0x02, // *** bmAttributes, bulk
0x40, 0x00, // wMaxPacketSize, 64 bytes
0X00, // bInterval, ms 0x07, // bLength
USB_ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType
MSC_OUT_EP, // bEndpointAddress; bit7=1 for IN, bits 3-0=1 for ep1
0x02, // *** bmAttributes, bulk
0x40, 0x00, // wMaxPacketSize, 64 bytes
0x00 // bInterval, ms
};

STM32F4 HAL Composite USB Device Example

Hi,

The STM32Cube FW package includes examples based on elementary USB classes (MSC, HID, CDC,...). 
Multi-interface applications (composite) are not yet developed. We’ll notify our development team about this subject.

Regards,
Heisenberg.

Thank you.

Could you please tell me if it is currently possible to achieve a composite USB device using the current version of STM32CubeF4 HAL library (so it is just lacking an example demonstration) or the libraries should be changed first (hopefully in the near future) to do that?

And, thank you for the STM32Cube initiative, it's still not as mature as the StdPeriph libraries, but I'm sure it will be, soon enough.

Hi,

It is possible to achieve your own composite USB Device, by combining the desired classes' drivers into one class, under your own folder within: Middlewares\ST\STM32_USB Device Library\Class

Regards,
Heisenberg.

STM32F4 HAL Composite USB Device Example : CDC + MSC的更多相关文章

  1. What is a Windows USB device path and how is it formatted?

    http://community.silabs.com/t5/Interface-Knowledge-Base/Windows-USB-Device-Path/ta-p/114059 Windows ...

  2. Power OFF and ON USB device in linux (ubuntu)

    Power OFF and ON USB device in linux (ubuntu) http://loginroot.com/power-off-and-on-usb-device-in-li ...

  3. Install Slax on USB device (Slax U 盘安装)

    Slax is a modern, portable, small and fast Linux operating system with a modular approach and outsta ...

  4. USB Device Finder

    http://www.velleman.eu/images/tmp/usbfind.c #ifdef __cplusplus extern "C" { #endif #includ ...

  5. Assigning Host USB device to a Guest VM

    Example Assigning Host USB device to a Guest VM This example is based on qemu-kvm (0.15.0) as instal ...

  6. usb host和usb device

    S3C2440的数据手册将USB功能分为两章--usb host和usb device.具体什么意思呢? usb host: 微处理器作为usb主设备,可以挂接U盘之类的从属设备. usb devic ...

  7. "The connection for the USB device '###' was unsuccessful. The device is currently in use"

    一.问题描述 1.情景描述 笔者的物理主机系统是“windows7 64位”,想使用“摄像头录像大师”.这个软件在录制视频的过程中,需要调用windows自带的"windows media ...

  8. USB device & USB controller & USB passthrough

    目录 USB device USB controller Linux 相关命令 Python 相关库 Libvirt USB passthrough 参考资料 近期往 openstack 里倒腾 US ...

  9. usb device address error 110

    ubuntu失灵了,怎么都起不来,报一堆错误usb device descriptor read/64, error 110......重启,换kvm的接口,usb键盘鼠标...终于在试了下面这个方法 ...

随机推荐

  1. Hive笔记之Fetch Task

    在使用Hive的时候,有时候只是想取表中某个分区的前几条的记录看下数据格式,比如一个很常用的查询: select * from foo where partition_column=bar limit ...

  2. Unity3d 常用代码

    //创建一个名为"Player"的游戏物体 //并给他添加刚体和立方体碰撞器. player=new GameObject("Player"); player. ...

  3. python 入门基础4 --数据类型及内置方法

    今日目录: 零.解压赋值+for循环 一. 可变/不可变和有序/无序 二.基本数据类型及内置方法 1.整型 int 2.浮点型float 3.字符串类型 4.列表类型 三.后期补充内容 零.解压赋值+ ...

  4. python 获取二进制文件

    import requests response = requests.get('https://www.baidu.com/aladdin/img/tools/ip.png')with open(' ...

  5. 【逆向知识】裸函数(Naked函数)

    1 说明 指定裸函数编写的函数,编译器生成不带任何多余代码. 利用此功能,可以使用内联汇编程序代码编写自己的 prolog/epilog 代码序列. 裸函数对于编写虚拟设备驱动程序特别有用. 2 练习 ...

  6. C# UDP广播消息

    首先是发送端: /// <summary> /// 发送UDP消息 /// </summary> /// <param name="msg">消 ...

  7. Tesseract-OCR 3.05 多过语言文字识别(运行程序+中英日韩语言包)

    最新版本 静态编译 tesseract 3.05.00dev leptonica-1.73 libgif 5.1.3 : libjpeg 8c : libpng 1.6.16 : libtiff 3. ...

  8. 页面跳转时中间参数保存(memcache/cookie)

    2014年1月19日 17:30:27 我这篇文章就说了一句话:用cookie保存页面间跳转时的参数 情景: 客服在后台操作的时候,经常从列表页进入到编辑页,编辑完信息后,还要自动返回之前的列表页 问 ...

  9. 最完整的PS快捷键大全(绝对经典)

    快速恢复默认值 有些不擅长Photoshop的朋友为了调整出满意的效果真是几经周折,结果发现还是原来的默认效果最好,这下傻了眼,后悔不该当初呀!怎么恢复到默认值呀?试着轻轻点按选项栏上的工具图标,然后 ...

  10. Network Principle Course Summary 001

    1.物理层 物理层 协议:RJ45.CLOCK.IEEE802.3 (中继器,集线器) 作用:通过媒介传输比特,确定机械及电气规范(比特Bit) 1.1 通信基础 数据 (data) —— 运送消息的 ...