This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Issues with composite VCP+MSC: VCP not working (L1)

Hello,

I am stuck in implementing USB composite (VCP+MSC) using FS-Device_Lib_V4.0.0 (STM32L151). Individually both works but when I try composite VCP+MSC, MSC works well but PC can't communicate via VCP (although it can recognize as COM port).

I've edited .inf file and updated device descriptions. What else I am missing to config?
I request your suggestion how to fix this issue. I posted same query in ST forum, didnt have any clue there.

Thank you in advance.

NB: I'm using ENDP1 in+out for MSC, ENDP3 in+out for VCP, ENDP2 in for VCP interrupt. End point address combined as:

#define BTABLE_ADDRESS        (0x00)
#define ENDP0_RXADDR        (0x0040)
#define ENDP0_TXADDR        (0x0080)
/* EP1 MSC  */
#define ENDP1_TXADDR        (0x0150)
#define ENDP1_RXADDR        (0x0190)
/* EP2 VCP Int*/
#define ENDP2_TXADDR        (0x0100)
/* EP3  VCP*/
#define ENDP3_TXADDR        (0x00C0)
#define ENDP3_RXADDR        (0x0110)

To include VCP interfaces (interface 0 for MSC, 1 and 2 for VCP int), I've edited stmcdc.inf file of virtual com port driver like this:

[Version]
Signature="$Windows NT$"
Class=Ports
ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318}
Provider=%PRVDR%
CatalogFile=stmcdc.cat
DriverVer=04/25/2010,1.3.1

;[SourceDisksNames]
;1=%DriversDisk%,,,
;[SourceDisksFiles]

[Manufacturer]
%MFGNAME%=DeviceList,NT,NTamd64

;[DestinationDirs]
;DefaultDestDir = 12

; ========== VID PID ===========

[DeviceList.NT]
%DESCRIPTION%=DriverInstall,USB\VID_0483&PID_5741&MI_00
%DESCRIPTION%=DriverInstall,USB\VID_0483&PID_5741&MI_01
%DESCRIPTION%=DriverInstall,USB\VID_0483&PID_5741&MI_02

[DeviceList.NTamd64]
%DESCRIPTION%=DriverInstall,USB\VID_0483&PID_5741&MI_00
%DESCRIPTION%=DriverInstall,USB\VID_0483&PID_5741&MI_01
%DESCRIPTION%=DriverInstall,USB\VID_0483&PID_5741&MI_02

; ========== Class definition ===========

[ClassInstall32]
AddReg = ClassInstall_AddReg

[ClassInstall_AddReg]
HKR,,,,%ClassName%
HKR,,NoInstallClass,,1
HKR,,IconPath,%REG_MULTI_SZ%,"%systemroot%\system32\setupapi.dll,-20"
HKR,,LowerLogoVersion,,5.2

; =================== Installation ===================

[DriverInstall.NT]
Include=mdmcpq.inf
CopyFiles=FakeModemCopyFileSection
AddReg=DriverInstall.NT.AddReg

[DriverInstall.NT.AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,usbser.sys
HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"

[DriverInstall.NT.Services]
AddService=usbser, 0x00000002, DriverServiceInst

[DriverServiceInst]
DisplayName=%SERVICE%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 3 ; SERVICE_DEMAND_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary= %12%\usbser.sys
LoadOrderGroup = Base

[Strings]
PRVDR = "STMicroelectronics"
MFGNAME = "STMicroelectronics."
DESCRIPTION = "STMicroelectronics Virtual COM Port"
SERVICE = "STM Virtual COM Port"
DriversDisk = "STM Drivers Disk"
REG_MULTI_SZ = 0x00010000
ClassName="Universal Serial Bus devices"

Parents
  • Device Descriptor:
    ------------------

    const uint8_t Composite_DeviceDescriptor[] = {
            0x12,                           // bLength
            USB_DEVICE_DESCRIPTOR_TYPE,     // bDescriptorType=01
            0x00,
            0x02,                           // bcdUSB = 2.00
            0xEF,                           // bDeviceClass // Base Class 0x00 previously
            0x02,                           // bDeviceSubClass  //0x00 previously
            0x01,                           // bDeviceProtocol  //0x00 previously
            0x40,                           // bMaxPacketSize0
            0x83,                           // idVendor = 0x0483 (STMicroelectronics)
            0x04,
            0x41,                           // idProduct = 0x5741 New
            0x57,
            0x00,
            0x02,                           // bcdDevice = 2.00
               1,                           // Index of string descriptor describing manufacturer
               2,                           // Index of string descriptor describing product
               3,                           // Index of string descriptor describing the device's serial number
            0x01                            // bNumConfigurations
    };
    
    const uint8_t Composite_ConfigDescriptor[] = {
            0x09,                              // bLength: Configuration Descriptor size
            USB_CONFIGURATION_DESCRIPTOR_TYPE, // bDescriptorType: Configuration = 02
            Composite_SIZ_CONFIG_DESC,  // wTotalLength: no of returned bytes= 108
            0x00,
            0x03,                           // bNumInterfaces: 3 interface-----2 VCP, 1 MSC
            0x01,                           // bConfigurationValue: Configuration value
            0x00,                           // iConfiguration: Index of string descriptor describing the configuration
            0x80,                           // bmAttributes: bus powered, for Self powered 0xC0
            0xFA,                           // MaxPower 500mA. 0x7D for 250mA, 0x32 for 100mA
    
                /*    IAD to associate the two CDC interfaces */
             0x08, /* bLength */
            0x0B, /* bDescriptorType */
            0x01, /* bFirstInterface */
            0x02, /* bInterfaceCount */
            0x02, /* bFunctionClass */
             0x02, /* bFunctionSubClass */
            0x01, /* bFunctionProtocol */
            0x04, /* iFunction (Index of string descriptor describing this function) */
    
            0x09,                           // bLength: Interface Descriptor size
            USB_INTERFACE_DESCRIPTOR_TYPE,  // bDescriptorType: Interface= 04
            0x01,                           // bInterfaceNumber: Number of Interface
            0x00,                           // bAlternateSetting: Alternate setting
            0x01,                           // bNumEndpoints: One endpoint used
            0x02,                           // bInterfaceClass: Communication Interface Class
            0x02,                           // bInterfaceSubClass: Abstract Control Model
            0x01,                           // bInterfaceProtocol: Common AT commands
            0x05,                           // 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_ENDPOINT_DESCRIPTOR_TYPE,   // bDescriptorType: Endpoint=05
            0x82,                           // bEndpointAddress: (IN2)
            0x03,                           // bmAttributes: Interrupt
            Composite_INT_SIZE,      // wMaxPacketSize= 08
            0x00,
            0xFF,                           // bInterval:
    
        // Data class interface descriptor
            0x09,                           // bLength: Endpoint Descriptor size
            USB_INTERFACE_DESCRIPTOR_TYPE,  // bDescriptorType=04
            0x02,                           // bInterfaceNumber: Number of Interface
            0x00,                           // bAlternateSetting: Alternate setting
            0x02,                           // bNumEndpoints: Two endpoints used
            0x0A,                           // bInterfaceClass: CDC
            0x00,                           // bInterfaceSubClass:
            0x00,                           // bInterfaceProtocol:
            0x05,                           // iInterface:
    
            // Endpoint 3 out Descriptor
            0x07,                           // bLength: Endpoint Descriptor size
            USB_ENDPOINT_DESCRIPTOR_TYPE,   // bDescriptorType: Endpoint=05
            0x03,                           // bEndpointAddress: (OUT3)
            0x02,                           // bmAttributes: Bulk
            Composite_DATA_SIZE,     // wMaxPacketSize: 64
            0x00,
            0x00,                           // bInterval: ignore for Bulk transfer
    
            // Endpoint 3 in Descriptor
            0x07,                           // bLength: Endpoint Descriptor size
            USB_ENDPOINT_DESCRIPTOR_TYPE,   // bDescriptorType: Endpoint=05
            0x83,                           // bEndpointAddress: (IN3)
            0x02,                           // bmAttributes: Bulk
            Composite_DATA_SIZE,     // wMaxPacketSize: 64
            0x00,
            0x00,                            // bInterval
    
    
    

Reply
  • Device Descriptor:
    ------------------

    const uint8_t Composite_DeviceDescriptor[] = {
            0x12,                           // bLength
            USB_DEVICE_DESCRIPTOR_TYPE,     // bDescriptorType=01
            0x00,
            0x02,                           // bcdUSB = 2.00
            0xEF,                           // bDeviceClass // Base Class 0x00 previously
            0x02,                           // bDeviceSubClass  //0x00 previously
            0x01,                           // bDeviceProtocol  //0x00 previously
            0x40,                           // bMaxPacketSize0
            0x83,                           // idVendor = 0x0483 (STMicroelectronics)
            0x04,
            0x41,                           // idProduct = 0x5741 New
            0x57,
            0x00,
            0x02,                           // bcdDevice = 2.00
               1,                           // Index of string descriptor describing manufacturer
               2,                           // Index of string descriptor describing product
               3,                           // Index of string descriptor describing the device's serial number
            0x01                            // bNumConfigurations
    };
    
    const uint8_t Composite_ConfigDescriptor[] = {
            0x09,                              // bLength: Configuration Descriptor size
            USB_CONFIGURATION_DESCRIPTOR_TYPE, // bDescriptorType: Configuration = 02
            Composite_SIZ_CONFIG_DESC,  // wTotalLength: no of returned bytes= 108
            0x00,
            0x03,                           // bNumInterfaces: 3 interface-----2 VCP, 1 MSC
            0x01,                           // bConfigurationValue: Configuration value
            0x00,                           // iConfiguration: Index of string descriptor describing the configuration
            0x80,                           // bmAttributes: bus powered, for Self powered 0xC0
            0xFA,                           // MaxPower 500mA. 0x7D for 250mA, 0x32 for 100mA
    
                /*    IAD to associate the two CDC interfaces */
             0x08, /* bLength */
            0x0B, /* bDescriptorType */
            0x01, /* bFirstInterface */
            0x02, /* bInterfaceCount */
            0x02, /* bFunctionClass */
             0x02, /* bFunctionSubClass */
            0x01, /* bFunctionProtocol */
            0x04, /* iFunction (Index of string descriptor describing this function) */
    
            0x09,                           // bLength: Interface Descriptor size
            USB_INTERFACE_DESCRIPTOR_TYPE,  // bDescriptorType: Interface= 04
            0x01,                           // bInterfaceNumber: Number of Interface
            0x00,                           // bAlternateSetting: Alternate setting
            0x01,                           // bNumEndpoints: One endpoint used
            0x02,                           // bInterfaceClass: Communication Interface Class
            0x02,                           // bInterfaceSubClass: Abstract Control Model
            0x01,                           // bInterfaceProtocol: Common AT commands
            0x05,                           // 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_ENDPOINT_DESCRIPTOR_TYPE,   // bDescriptorType: Endpoint=05
            0x82,                           // bEndpointAddress: (IN2)
            0x03,                           // bmAttributes: Interrupt
            Composite_INT_SIZE,      // wMaxPacketSize= 08
            0x00,
            0xFF,                           // bInterval:
    
        // Data class interface descriptor
            0x09,                           // bLength: Endpoint Descriptor size
            USB_INTERFACE_DESCRIPTOR_TYPE,  // bDescriptorType=04
            0x02,                           // bInterfaceNumber: Number of Interface
            0x00,                           // bAlternateSetting: Alternate setting
            0x02,                           // bNumEndpoints: Two endpoints used
            0x0A,                           // bInterfaceClass: CDC
            0x00,                           // bInterfaceSubClass:
            0x00,                           // bInterfaceProtocol:
            0x05,                           // iInterface:
    
            // Endpoint 3 out Descriptor
            0x07,                           // bLength: Endpoint Descriptor size
            USB_ENDPOINT_DESCRIPTOR_TYPE,   // bDescriptorType: Endpoint=05
            0x03,                           // bEndpointAddress: (OUT3)
            0x02,                           // bmAttributes: Bulk
            Composite_DATA_SIZE,     // wMaxPacketSize: 64
            0x00,
            0x00,                           // bInterval: ignore for Bulk transfer
    
            // Endpoint 3 in Descriptor
            0x07,                           // bLength: Endpoint Descriptor size
            USB_ENDPOINT_DESCRIPTOR_TYPE,   // bDescriptorType: Endpoint=05
            0x83,                           // bEndpointAddress: (IN3)
            0x02,                           // bmAttributes: Bulk
            Composite_DATA_SIZE,     // wMaxPacketSize: 64
            0x00,
            0x00,                            // bInterval
    
    
    

Children