【问题标题】:USB Communications device with multiple serial ports, working on all platforms具有多个串行端口的 USB 通信设备,适用于所有平台
【发布时间】:2011-07-27 08:52:38
【问题描述】:

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

我们可以在 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。

什么方法可以用来制作一个可以在 Windows、Mac 和 Linux 上运行的具有多个虚拟串行端口的 USB 设备?我想我更喜欢尽可能使用 CDC-ACM 标准的解决方案,并尽可能避免 write-your-own-drivers 选项。

【问题讨论】:

    标签: embedded usb serial-port


    【解决方案1】:

    我能想到的一种方法是,该设备将自己呈现为一个 USB 集线器,并附有多个单独的单串行端口设备。这不是很漂亮,但非常防弹。

    【讨论】:

    • 感谢“开箱即用”选项。这对嵌入式设备来说是一个更大的实施负担,但肯定会在 PC 上顺利运行。
    【解决方案2】:

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

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

    【讨论】:

    • 重新配置对用户来说不是一个好的解决方案。它应该与所有主机操作系统“正常工作”。但感谢指向 OS X 驱动程序的指针。会调查的。
    • @Craig McQueen:应该是“无代码 kext”。一个 kext 通常包含一个包含各种驱动程序个性的 plist 和一个二进制文件。可以制作一个只包含 Info.plist 文件的 kext,其中包含预装驱动程序的个性
    【解决方案3】:

    我发现了一个我认为可行的解决方案(需要在 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 文件的新手,但以下是我目前所能了解的相关 sn-ps:

    [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 位。

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

    【讨论】:

      猜你喜欢
      • 2013-11-02
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多