如何仅使用一个 USB 连接器获得两个 VCP? [英] How do I get two VCPs with only one USB connector?

查看:59
本文介绍了如何仅使用一个 USB 连接器获得两个 VCP?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我曾尝试仅使用一个 USB 连接器(STM32F4 探索板中的 CN5)来模拟两个虚拟 COM 端口,但徒劳无功.

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

我知道我必须使用 ACM 功能描述符(抽象控制模型)将复合 CDC 类配置为具有多个接口以进行虚拟 COM 端口通信,但是如何使它们成为两个 VCP?

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?

我已经完成了一个 CCI(通信类接口)和一个 DCI(数据类接口),这让我在 设备管理器.

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.

我试过做两个 CCI 和两个 DCI,但没有成功!

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 */
  } ;

我的 CDC 配置有两个 IAD,一个 CCI 一个 DCI:

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 */
} ;

如何将 CDC 类配置为具有两个 VCP?这些配置有什么问题?

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

推荐答案

第二个呼叫管理功能描述符中存在错误 - bDataInterface 设置为 1(第一个呼叫管理功能描述符也设置为使用接口 1 作为数据接口).第一个描述符的正确值为 1,第二个描述符为 3.

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.

这篇关于如何仅使用一个 USB 连接器获得两个 VCP?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆