STM32F4 HAL Composite USB Device Example : CDC + MSC

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.

时间: 2024-12-18 00:34:59

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

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 operating systems rely on a unique device path to uniquely identify each USB device/interface connected to the system. A device path string is used to

USB device & USB controller & USB passthrough

近期往 openstack 里倒腾 USB passthrough[1],遂把 USB 知识做较为全面的整理,以供分享. USB device 什么是 USB device, 上图机智的小萌狗就是 USB device,你的鼠标是 USB device, 键盘是 USB device,U 盘更是典型的 USB device.说了这么多例子,还是得用一个专业的名词一语概之,所谓 USB,即是 Universal Serial Bus(通用串行总线),它是用来连接 USB device 和计算机,从

USB Device Finder

http://www.velleman.eu/images/tmp/usbfind.c #ifdef __cplusplus extern "C" { #endif #include <windows.h> #include <tchar.h> #include <setupapi.h> #include <initguid.h> #include <stdio.h> // This is the GUID for the U

usb host和usb device

S3C2440的数据手册将USB功能分为两章--usb host和usb device.具体什么意思呢? usb host: 微处理器作为usb主设备,可以挂接U盘之类的从属设备. usb device: 微处理器作为usb从属设备,其常用作接受PC机发送的命令. 参考网页:USB Host和USB Device的区别 usb host和usb device,布布扣,bubuko.com

U盘做为系统盘安装系统,出现start booting from usb device和boot failed解决方案

最近在旧机子上安装Centos系统的时候,用大白菜或者是UltraISO制作完U盘的系统盘后,出现了start booting from usb device和boot failed,一直很郁闷,以为是系统的原因.网上说把syslinux那个文件修改或者是替换,这些都不管用.最后发现是制作U启动的时候的格式,与bios启动U盘的格式不相符. BOIS启动USB有几种形式:USB-HDD,USB-FDD,USB-ZIP,USB-CDROM 1. ZIP模式是指把U盘模拟成ZIP驱动器模式,启动后U

Android Studio关于USB device not found的解决办法

Android Studio关于USB device not found的解决办法 我们使用Android Studio进行Android开发时,当我们使用真机进行调试时,很可能会出现USB device not found的问题.网上提出了很多决解办法,很多都是错误的.现给出正确的解决方法: 1. If yon don't have Android SDK installed, please install it first. 2. Open Start menu. Select Androi

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 installed in Fedora 15. Will first show how to do this manually, and second how to do it using the virt-manager tool. This HOWTO is limited to UHCI devices

【转载】How to Reset USB Device in Linux

USB devices are anywhere nowadays, even many embedded devices replace the traditional serial devices with usb devices. However, I experienced that USB devices hang from time to time. In most cases, a manual unplug and replug will solve the issue. Act

西部数据出现“WD SES Device USB Device”怎么办,而且说明书全是英文。

您好.wd ses device driver这个驱动程序可以在baidu中输入关键词找到,什么驱动之家.驱动人生之类的专业驱动网站也都是有的. western digital的移动硬盘驱动程序安装步骤请见下图: 西部数据出现"WD SES Device USB Device"怎么办,而且说明书全是英文.