2016-05-20 18 views
0

Я попытался подражать двум виртуальным COM-портам с одним USB-разъемом (CN5 в STM32F4 Discovery Board), но напрасно.Как получить два VCP с одним разъемом USB?

Я знаю, что мне нужно настроить составной класс CDC на наличие нескольких интерфейсов, используя функциональный дескриптор ACM (абстрактную модель управления) для обмена виртуальными COM-портами, но как мне сделать их двумя VCP?

Я сделал один CCI (интерфейс класса связи) и один DCI (интерфейс класса данных), и это позволило мне иметь только один VCP в Device Manager.

Я попытался сделать две CCI и два DCI, но это не сработало!

Это мой дескриптор устройства для интерфейса объединения дескрипторов:

/* 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 с двумя IADs один CCI и один DCI каждый:

/* 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? Что не так с этими конфигурациями?

+0

Здравствуйте, вы решили проблему? – Bremen

ответ

0

Во втором функциональном дескрипторе управления вызовами есть ошибка - для bDataInterface установлено значение 1 (первый дескриптор управления вызовами также настроен на использование интерфейса 1 в качестве интерфейса данных). Правильные значения: 1 для первого дескриптора и 3 для второго.