2011-04-01 80 views
7

我们有嵌入式设备,通过USB连接到PC,并具有多个虚拟串行端口(CDC-ACM)。具有多个串行端口的USB通信设备,可在所有平台上工作

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

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

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

回答

3

我能想到的一种方式就是将设备呈现为一个USB集线器,并将多个单独的串行端口设备连接到该集线器上。这不是很好,但非常防弹。

+0

感谢您的选择“框外”。这对嵌入式设备来说是一个更大的实现负担,但是在PC上肯定会顺利运行。 – 2011-04-06 07:56:40

2

由于苹果的驱动程序不支持复合CDC设备,我建议或者让设备以某种方式重新配置,并使您的备用描述符简单CDC,或坚持使用复合材料并使用第三方驱动程序(我的公司生产CDC ACM驱动程序对于可能会支持您的设备的OS X)。

也可以用无代码kext强制该问题。

+0

重新配置对用户来说不是一个好的解决方案。它应该“适用于”所有主机操作系统。但是感谢指向OS X驱动程序的指针。将研究它。 – 2011-04-06 11:42:42

+0

什么是“无人驾驶kext”? – 2011-05-10 00:59:33

+0

@Craig麦昆:本来应该是“无代码内核扩展”。 kext通常包含一个包含各种驱动程序特性的plist和一个二进制文件。可以制作只包含Info.plist文件的kext,并提供预装驱动程序的个性 – Hasturkun 2011-05-11 06:58:52

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位上为我工作。

我已经做了有限的测试,到目前为止,所以我很想听听如何工作的,或不为别人着想。

相关问题