打印
[应用相关]

usb实现两个com口

[复制链接]
9672|43
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dkill|  楼主 | 2008-7-1 19:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

const u8 Virtual_Com_Port_ConfigDescriptor[] =
  {
    /*Configuation Descriptor*/
    0x09,   /* bLength: Configuation Descriptor size */
    USB_CONFIGURATION_DESCRIPTOR_TYPE,      /* bDescriptorType: Configuration */
    VIRTUAL_COM_PORT_SIZ_CONFIG_DESC,       /* wTotalLength:no of returned bytes */
    0x00,
    0x02,   /* bNumInterfaces: 2 interface */
    0x01,   /* bConfigurationValue: Configuration value */
    0x00,   /* iConfiguration: Index of string descriptor describing the configuration */
    0xC0,   /* bmAttributes: self powered */
    0x00,   /* MaxPower 0 mA */
    /*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 */
    0x82,   /* bEndpointAddress: (IN2) */
    0x03,   /* bmAttributes: Interrupt */
    VIRTUAL_COM_PORT_INT_SIZE,      /* wMaxPacketSize: */
    0x00,
    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 */
    0x03,   /* bEndpointAddress: (OUT3) */
    0x02,   /* bmAttributes: Bulk */
    VIRTUAL_COM_PORT_DATA_SIZE,             /* wMaxPacketSize: */
    0x00,
    0x00,   /* bInterval: ignore for Bulk transfer */
    /*Endpoint 1 Descriptor*/
    0x07,   /* bLength: Endpoint Descriptor size */
    USB_ENDPOINT_DESCRIPTOR_TYPE,   /* bDescriptorType: Endpoint */
    0x81,   /* bEndpointAddress: (IN1) */
    0x02,   /* bmAttributes: Bulk */
    VIRTUAL_COM_PORT_DATA_SIZE,             /* wMaxPacketSize: */
    0x00,
    0x00    /* bInterval */
  };
上面的描述  实现了一个usb插上设备中出现一个com口,如果要实现一插上usb设备管理器  出现两个com口  怎么实现?
  学要多定义接口?还是怎么改描述呢?请香主和高手帮忙。
沙发
simon21ic| | 2008-7-1 20:20 | 只看该作者

记得以前有人问过的

可以试一下用HID模拟的串口,需要自己写驱动
用CDC的话,就不清楚怎么实现2个了

使用特权

评论回复
板凳
jeames| | 2008-7-1 20:45 | 只看该作者

要自己写驱动

Windows 自带的CDC驱动只能实现一个接口,
如果想实现一个设备多个接口,
USB的设备描述符中应该定义多个接口描述符

使用特权

评论回复
地板
simon21ic| | 2008-7-1 21:02 | 只看该作者

LS:有个问题请教一下

实现2个串口的话,如果使用2个接口,那么是否可以同时使用?
因为在驱动中,使用一个接口前,需要先调用usb_claim_interface,不知道这个函数能否调用2次,以claim2个接口?

这个和HID的概念上应该是组合设备和复合设备的区别吧(compound device and conposite device)

使用特权

评论回复
5
dkill|  楼主 | 2008-7-1 21:53 | 只看该作者

怎么实现 楼上各位能否 给个具体操作

使用特权

评论回复
6
jeames| | 2008-7-1 22:15 | 只看该作者

接口描述符一个例子


/* USB Configuration Descriptor */
/*   All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */
const BYTE USB_ConfigDescriptor[] = {
/* Configuration 1 */
  USB_CONFIGUARTION_DESC_SIZE,       /* bLength */
  USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType */
  WBVAL(                             /* wTotalLength */
    USB_CONFIGUARTION_DESC_SIZE +
    USB_INTERFACE_DESC_SIZE     +
    NUM_ENDPOINTS * USB_ENDPOINT_DESC_SIZE +
    USB_INTERFACE_DESC_SIZE     +
    NUM_ENDPOINTS * USB_ENDPOINT_DESC_SIZE
  ),
  0x02,                              /* bNumInterfaces */
  0x01,                              /* bConfigurationValue */
  0x00,                              /* iConfiguration */
  USB_CONFIG_BUS_POWERED |           /* bmAttributes */
  USB_CONFIG_REMOTE_WAKEUP,
  USB_CONFIG_POWER_MA(100),          /* bMaxPower */
/* Interface 0, Alternate Setting 0, Class Code Unknown */  ----->  接口 0
  USB_INTERFACE_DESC_SIZE,           /* bLength */
  USB_INTERFACE_DESCRIPTOR_TYPE,     /* bDescriptorType */
  0x00,                              /* bInterfaceNumber */
  0x00,                              /* bAlternateSetting */
  NUM_ENDPOINTS,                     /* bNumEndpoints */
  USB_DEVICE_CLASS_VENDOR_SPECIFIC,  /* bInterfaceClass, USB_CLASS_VENDOR_SPECIFIC */
  0xFF,                              /* bInterfaceSubClass, USB_SUBCLASS_CODE_UNKNOWN */
  0xFF,                              /* bInterfaceProtocol, USB_PROTOCOL_CODE_UNKNOWN */
  0x00,                              /* iInterface, STR_INDEX_INTERFACE = no_string */
/* Endpoint, EP1 Interrupt In */
  USB_ENDPOINT_DESC_SIZE,            /* bLength */
  USB_ENDPOINT_DESCRIPTOR_TYPE,      /* bDescriptorType */
  USB_ENDPOINT_IN(1),                /* bEndpointAddress */
  USB_ENDPOINT_TYPE_INTERRUPT,       /* bmAttributes */
  WBVAL(0x0004),                     /* wMaxPacketSize */
  0x20,          /* 32ms */          /* bInterval */
/* Endpoint, EP2 Bulk Out */
  USB_ENDPOINT_DESC_SIZE,            /* bLength */
  USB_ENDPOINT_DESCRIPTOR_TYPE,      /* bDescriptorType */
  USB_ENDPOINT_OUT(2),               /* bEndpointAddress */
  USB_ENDPOINT_TYPE_BULK,            /* bmAttributes */
  WBVAL(0x0040),                     /* wMaxPacketSize */
  0x20,          /* 32ms */
/* Endpoint, EP2 Bulk In */
  USB_ENDPOINT_DESC_SIZE,            /* bLength */
  USB_ENDPOINT_DESCRIPTOR_TYPE,      /* bDescriptorType */
  USB_ENDPOINT_IN(2),                /* bEndpointAddress */
  USB_ENDPOINT_TYPE_BULK,            /* bmAttributes */
  WBVAL(0x0040),                     /* wMaxPacketSize */
  0x20,          /* 32ms */
/* Interface 1, Alternate Setting 0, Class Code Unknown */  ----->  接口 1
  USB_INTERFACE_DESC_SIZE,           /* bLength */
  USB_INTERFACE_DESCRIPTOR_TYPE,     /* bDescriptorType */
  0x01,                              /* bInterfaceNumber */
  0x00,                              /* bAlternateSetting */
  NUM_ENDPOINTS,                     /* bNumEndpoints */
  USB_DEVICE_CLASS_VENDOR_SPECIFIC,  /* bInterfaceClass, USB_CLASS_CODE_UNKNOWN */
  0xFF,                              /* bInterfaceSubClass, USB_SUBCLASS_CODE_UNKNOWN */
  0xFF,                              /* bInterfaceProtocol, USB_PROTOCOL_CODE_UNKNOWN */
  0x00,                              /* iInterface, STR_INDEX_INTERFACE = no_string */
/* Endpoint, EP4 Interrupt In */
  USB_ENDPOINT_DESC_SIZE,            /* bLength */
  USB_ENDPOINT_DESCRIPTOR_TYPE,      /* bDescriptorType */
  USB_ENDPOINT_IN(4),                /* bEndpointAddress */
  USB_ENDPOINT_TYPE_INTERRUPT,       /* bmAttributes */
  WBVAL(0x0004),                     /* wMaxPacketSize */
  0x20,          /* 32ms */          /* bInterval */
/* Endpoint, EP5 Bulk Out */
  USB_ENDPOINT_DESC_SIZE,            /* bLength */
  USB_ENDPOINT_DESCRIPTOR_TYPE,      /* bDescriptorType */
  USB_ENDPOINT_OUT(5),               /* bEndpointAddress */
  USB_ENDPOINT_TYPE_BULK,            /* bmAttributes */
  WBVAL(0x0040),                     /* wMaxPacketSize */
  0x20,          /* 32ms */
/* Endpoint, EP5 Bulk In */
  USB_ENDPOINT_DESC_SIZE,            /* bLength */
  USB_ENDPOINT_DESCRIPTOR_TYPE,      /* bDescriptorType */
  USB_ENDPOINT_IN(5),                /* bEndpointAddress */
  USB_ENDPOINT_TYPE_BULK,            /* bmAttributes */
  WBVAL(0x0040),                     /* wMaxPacketSize */
  0x20,          /* 32ms */
/* Terminator */
  0                                  /* bLength */
};

使用特权

评论回复
7
jeames| | 2008-7-1 22:19 | 只看该作者

用在STM32上需要做些改动

比如端点的设置
STM32最多有5个UART

是不是可以实现一个USB转5COM
还要仔细读USB的协议

使用特权

评论回复
8
notalklu| | 2008-7-1 22:19 | 只看该作者

好东西

好东西

使用特权

评论回复
9
jeames| | 2008-7-1 22:42 | 只看该作者

有一个驱动的例子

事先声明:
是从网上下载的,我还没试过

是NXP为LPC214X写的,可以拿来做参考

如果有哪位大侠修改为用于STM32的话,

望也能共享给大家,少走些弯路

相关链接:https://bbs.21ic.com/upfiles/img/20078/2007816225829664.rar

使用特权

评论回复
10
dkill|  楼主 | 2008-7-1 22:59 | 只看该作者

jems 能否加我qq 我想当面请教

邮箱  chenjinb03@163.com
  

使用特权

评论回复
11
dkill|  楼主 | 2008-7-2 09:10 | 只看该作者

顶上来

使用特权

评论回复
12
dkill|  楼主 | 2008-7-2 10:36 | 只看该作者

usb转串口 崩溃了 多加了几个接口 运行插上usb

 usb转串口 崩溃了  多加了几个接口    运行插上usb 
电脑就从启   谁能帮帮我

使用特权

评论回复
13
dkill|  楼主 | 2008-7-2 11:17 | 只看该作者

怎么虚拟com口呢

使用特权

评论回复
14
dkill|  楼主 | 2008-7-2 11:34 | 只看该作者

香主呢

使用特权

评论回复
15
香水城| | 2008-7-2 11:45 | 只看该作者

别看我,这活儿我不会

可惜PC里面没有STM32~~~~~~~~

使用特权

评论回复
16
dkill|  楼主 | 2008-7-2 11:52 | 只看该作者

这就是stm32的开发板的例子

使用特权

评论回复
17
香水城| | 2008-7-2 12:02 | 只看该作者

例子是正常的,问题是你要在一个USB口上实现多个COM口

这活儿我不会。

这不是STM32的问题,这是如何通过USB在Windows系统下实现的问题,ST不是做PC软件的。

如果你有方案而不知道如何在STM32下实现,我们可以帮你。谢谢

使用特权

评论回复
18
dkill|  楼主 | 2008-7-2 12:18 | 只看该作者

对不起香主 还是打扰一下

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

这些描述的信息 不知道在什么地方   谁能够帮忙解释一下
对不起 香主  
 您的意思是在开发板上实现usb插上后  会出现两个com口  利用stm32  实现不了吗?
  对不起 我是st代理的技术支持  因为由客户有这个要求
 我的要求 就是
    现有的例程插上usb电脑会多出一个com4口  我想实现插上usb时  电脑会多出两个com口(比如多出com3和com4)
谢谢  希望能给与帮助  或者告诉我可行性

使用特权

评论回复
19
香水城| | 2008-7-2 12:38 | 只看该作者

关于这个描述符的信息,请查阅usb.org有关CDC的文档

这个文档可以在usb.org的网站上下载:http://www.usb.org/developers/devclass_docs#approved

现在这个USB转COM口的Demo是使用了微软的驱动,Demo中实现了一个COM口。至于是否能够实现多个COM口,这个问题与STM32无关,如果微软的驱动能够支持这样的功能,自然STM32可以实现。现在的问题是我们不知道微软的驱动是否有这样的功能,如果有此功能,我们也不知道如何配合驱动来实现这个功能。

如果谁知道微软的驱动能够实现这样的功能,并且知道如何操作USB设备配合这个功能,但不知道如何使用STM32实现,我可以帮忙解决。


做个比喻,我会开车,但不知道是否有路或哪条路可以到达你的目标,如果你有地图而不会开车,我可以教你开STM32这辆车。

使用特权

评论回复
20
dkill|  楼主 | 2008-7-2 12:51 | 只看该作者

我在原有的描述符做了 以下修改

将接口描述符以下的复制一遍,然后修改相应的接口号、端点描述符、配置描述符中的总长度、配置描述符指定的接口数量等等等。

但是改完后 一查usb电脑就从启  只要插着usb电脑就一直从启

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

201

帖子

0

粉丝