具有多个串行端口的USB通信设备,可在所有平台上运行

时间:2011-04-01 01:28:14

标签: embedded usb serial-port

我们有一个嵌入式设备通过USB连接到PC,它有多个虚拟串口(CDC-ACM)。

我们在Windows上工作。在嵌入式设备上,我们有多个CDC-ACM接口。 USB描述符将其声明为复合设备(class = 0xEF,sub-class = 2,protocol = 1),并且每个虚拟串行端口都有一个“Interface Association Descriptor”。在Windows上,我们使用INF文件为每个CDC-ACM控制接口(MI_00,MI_02等)安装usbser.sys。

然而,正如我们发现的,这种方法似乎不适用于Mac。我发现我可以通过将其更改为“通信”类(类= 2,子类= 0,协议= 0)并删除IAD来使其适用于Mac和Linux。 (对于Linux,使用Ubuntu进行测试,我发现这适用于Ubuntu Linux内核2.6.35-28或更新。使用早期内核,只有第一个串口工作。)但是,这种方法不适用于Windows。

可以使用哪种方法制作具有多个虚拟串行端口的USB设备,适用于Windows,Mac和Linux?我想我更喜欢尽可能使用CDC-ACM标准的解决方案,并尽可能避免使用自己编写驱动程序的选项。

3 个答案:

答案 0 :(得分:3)

我能想到的一种方式就是设备本身就是一个USB集线器,它附带了多个独立的单串口设备。这不是很漂亮,但非常防弹。

答案 1 :(得分:2)

由于Apple的驱动程序不支持复合CDC设备,我建议您以某种方式重新配置设备并使备用描述符显示为CDC,或者坚持使用第三方驱动程序(我公司制作{{3 OS X的驱动程序可能会支持你的设备)。

也可以使用无代码kext强制解决问题。

答案 2 :(得分:2)

我发现的一个解决方案,我认为可以使用(需要在Windows上进行进一步测试):

让设备以适用于Mac的方式进行枚举:

  • 使其成为“通信”类(class = 2,sub-class = 0,protocol = 0),而不是复合设备。
  • 删除IAD。

在此配置中,设备应该在Mac和最近的Linux上“正常工作”。 (对于Linux,使用Ubuntu进行测试,我发现这适用于Ubuntu Linux内核2.6.35-28或更新。使用早期内核,只有第一个串口工作。)

然后,对于Windows,修改设备的INF文件,以显式加载复合设备驱动程序usbccgp.sys。我是Windows INF文件的新手,但这里是我到目前为止所知的相关片段:

[CCGPDriverInstall.NT]
Include=usb.inf
Needs=Composite.Dev.NT
AddReg=CCGPDriverInstall.AddReg

[CCGPDriverInstall.NT.Services]
Include=usb.inf
Needs=Composite.Dev.NT.Services

[CCGPDriverInstall.AddReg]
HKR,,EnumeratorClass, 0x00000001,02,00,00

...

[DeviceList]
%DESCRIPTION_DEVICE%=CCGPDriverInstall, USB\VID_FFFF&PID_0001
%DESCRIPTION_AT%=DriverInstall, USB\VID_FFFF&PID_0001&MI_00 
%DESCRIPTION_MENU%=DriverInstall, USB\VID_FFFF&PID_0001&MI_02 

[DeviceList.NTamd64] 
%DESCRIPTION_DEVICE%=CCGPDriverInstall, USB\VID_FFFF&PID_0001
%DESCRIPTION_AT%=DriverInstall, USB\VID_FFFF&PID_0001&MI_00 
%DESCRIPTION_MENU%=DriverInstall, USB\VID_FFFF&PID_0001&MI_02 

[DeviceList.NTx86...1]
%DESCRIPTION_DEVICE%=CCGPDriverInstall, USB\VID_FFFF&PID_0001
%DESCRIPTION_AT%=DriverInstall, USB\VID_FFFF&PID_0001&MI_00 
%DESCRIPTION_MENU%=DriverInstall, USB\VID_FFFF&PID_0001&MI_02 

INF文件显式加载usbccgp.sys驱动程序,两个USB串口在Windows XP SP3 32位上为我工作。

到目前为止,我只进行了有限的测试,所以我很想知道其他人是否有效。