How do I get two VCPs with only one USB connector?

和自甴很熟 提交于 2019-12-13 22:00:19

问题


I've tried to emulate two virtual COM ports with only one USB connector (CN5 in the STM32F4 Discovery Board), but in vain.

I know that I have to configure the composite CDC class to have multiple interfaces using an ACM functional descriptor (abstract control model) for virtual COM ports communications, but how do I make them two VCPs?

I've done one CCI (communications class interface) and one DCI (data class interface), and that allowed me to have only one VCP in Device Manager.

I've tried to do two CCIs and two DCIs, but it didn't work!

This is my device descriptor for interface association descriptors:

/* USB Standard Device Descriptor */
__ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
  {
    0x12,                       /* bLength */
    USB_DESC_TYPE_DEVICE,       /* bDescriptorType */

    #if (USBD_LPM_ENABLED == 1)
        0x01,                   /* bcdUSB */ /* changed to USB version 2.01
                                               in order to support LPM L1 suspend
                                               resume test of USBCV3.0*/
    #else
        0x00,                   /* bcdUSB */
    #endif

    0x02,
    0xEF,                       /* bDeviceClass */
    0x02,                       /* bDeviceSubClass */
    0x01,                       /* bDeviceProtocol */
    USB_MAX_EP0_SIZE,           /* bMaxPacketSize */

    LOBYTE(USBD_VID),           /* idVendor */
    HIBYTE(USBD_VID),           /* idVendor */

    LOBYTE(USBD_PID_HS),        /* idVendor */
    HIBYTE(USBD_PID_HS),        /* 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 */
  } ;

And my CDC configuration with two IADs one CCI and one DCI each:

/* USB CDC device Configuration Descriptor */
__ALIGN_BEGIN uint8_t USBD_CDC_CfgFSDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END =
{
  /*Configuration Descriptor*/
  0x09,                         /* bLength: Configuration Descriptor size */
  USB_DESC_TYPE_CONFIGURATION,  /* bDescriptorType: Configuration */
  USB_CDC_CONFIG_DESC_SIZ,      /* wTotalLength:no of returned bytes */
  0x00,
  0x04,                         /* bNumInterfaces: 4 interface */
  0x01,                         /* bConfigurationValue: Configuration value */
  0x00,                         /* iConfiguration: Index of string descriptor describing the configuration */
  0xC0,                         /* bmAttributes: self powered */
  0x32,                         /* MaxPower 0 mA */

  /*---------------------------------------------------------------------------*/

  // IAD0
  0x08,   // bLength: Interface Descriptor size
  0x0B,   // bDescriptorType: IAD
  0x00,   // bFirstInterface
  0x02,   // bInterfaceCount
  0x02,   // bFunctionClass: CDC
  0x02,   // bFunctionSubClass
  0x01,   // bFunctionProtocol
  0x02,   // iFunction

  /*Interface0 Descriptor */
  0x09,                     /* bLength: Interface Descriptor size */
  USB_DESC_TYPE_INTERFACE,  /* 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 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: */
  0x01,                     /* 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_FS_MAX_PACKET_SIZE),  /* wMaxPacketSize: */
  HIBYTE(CDC_DATA_FS_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_FS_MAX_PACKET_SIZE),  /* wMaxPacketSize: */
  HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE),
  0x00,                                 /* bInterval: ignore for Bulk transfer */


  /*---------------------------------------------------------------------------*/

  // IAD1

  0x08,   // bLength: Interface Descriptor size
  0x0B,   // bDescriptorType: IAD
  0x02,   // bFirstInterface
  0x02,   // bInterfaceCount
  0x02,   // bFunctionClass: CDC
  0x02,   // bFunctionSubClass
  0x01,   // bFunctionProtocol
  0x02,   // iFunction

  /*Interface1 Descriptor */
  0x09,                     /* bLength: Interface Descriptor size */
  USB_DESC_TYPE_INTERFACE,  /* bDescriptorType: Interface */

  /* Interface descriptor type */
  0x02,   /* 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 */
  0x02,   /* bMasterInterface: Communication class interface */
  0x03,   /* bSlaveInterface0: Data Class Interface */

  /*Endpoint 2 Descriptor*/
  0x07,                         /* bLength: Endpoint Descriptor size */
  USB_DESC_TYPE_ENDPOINT,       /* bDescriptorType: Endpoint */
  CDC_CMD_EP4,                  /* 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: */
  0x03,                     /* 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_EP3,                          /* bEndpointAddress */
  0x02,                                 /* bmAttributes: Bulk */
  LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE),  /* wMaxPacketSize: */
  HIBYTE(CDC_DATA_FS_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_EP3,                           /* bEndpointAddress */
  0x02,                                 /* bmAttributes: Bulk */
  LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE),  /* wMaxPacketSize: */
  HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE),
  0x00                                  /* bInterval: ignore for Bulk transfer */
} ;

How do I configure the CDC Class to have two VCPs? What's wrong with these configurations?


回答1:


There is an error in the second Call Management Functional Descriptor - the bDataInterface is set to 1 (the first Call Management Functional Descriptor also set to use Interface 1 as the data interface). The correct values are 1 for the first descriptor and 3 for the second one.



来源:https://stackoverflow.com/questions/37341506/how-do-i-get-two-vcps-with-only-one-usb-connector

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!