2011-04-01 81 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位上爲我工作。

我已經做了有限的測試,到目前爲止,所以我很想聽聽如何工作的,或不爲別人着想。

相關問題