多功能复合设备¶
概述¶
多功能复合设备(或 g_multi)是一个复合设备,它广泛利用复合框架来提供一个……多功能设备。
在其标准配置中,它提供一个单一的 USB 配置,包含 RNDIS[1](即以太网)、USB CDC[2] ACM(即串行)和 USB 大容量存储功能。
一个 CDC ECM(以太网)功能可以通过 Kconfig 选项开启,RNDIS 可以关闭。如果两者都启用,该设备将有两个配置——一个使用 RNDIS,另一个使用 CDC ECM[3]。
请注意,如果您使用非标准配置(即启用 CDC ECM),您可能需要更改供应商和/或产品 ID。
主机驱动程序¶
要使用此设备,需要在主机端使其工作——否则,该设备将无法实现任何功能。正如所料,不同系统所需的步骤各不相同。
Linux 主机驱动程序¶
由于该设备使用标准复合框架,并以这种方式呈现给 Linux 主机,因此在 Linux 主机端不需要任何额外的驱动程序。所有功能都由为其开发的相应驱动程序处理。
对于以 RNDIS 配置为第一配置的两配置设置,此情况也适用。Linux 主机将使用带有 CDC ECM 的第二个配置,这在 Linux 下应能更好地工作。
Windows 主机驱动程序¶
为了使该设备在 Windows 下工作,必须满足两个条件:
检测为复合设备¶
首先,Windows 需要将该设备检测为 USB 复合设备,这本身有一些条件[4]。如果满足这些条件,Windows 会让 USB 通用父驱动程序[5]处理该设备,然后尝试为每个独立的接口匹配驱动程序(某种程度上,我们不深入太多细节)。
好消息是:您不必担心大多数条件!
唯一需要担心的是该设备必须有一个单一配置,因此一个同时支持 RNDIS 和 CDC ECM 的设备将无法工作,除非您创建一个合适的 INF 文件——当然,如果您创建了,请务必提交!
为每个功能安装驱动程序¶
另一个更棘手的问题是让 Windows 为每个独立功能安装驱动程序。
对于大容量存储来说,这很简单,因为 Windows 会检测到它是一个实现 USB 大容量存储类的接口,并选择相应的驱动程序。
对于 RNDIS 和 CDC ACM,情况则更复杂。
RNDIS¶
要让 Windows 为设备中的第一个功能选择 RNDIS 驱动程序,需要使用本文档提供的 [[file:linux.inf]] 文件。它将 Windows 的 RNDIS 驱动程序“附加”到设备的第一个接口。
请注意,在测试过程中,当 RNDIS 不是第一个接口时,我们遇到了一些问题[6]。除非您正在尝试开发自己的设备,否则您无需担心此问题,在这种情况下请注意此错误。
CDC ACM¶
同样,为 CDC ACM 提供了 [[file:linux-cdc-acm.inf]]。
自定义设备¶
如果您打算修改 g_multi 设备,请注意重新排列功能显然会改变每个功能的接口编号。因此,提供的 INF 文件将无法工作,因为它们的接口编号是硬编码的(尽管更改这些并不难[7])。
这也意味着,在尝试 g_multi 并更改所提供的功能后,应该更改设备的供应商和/或产品 ID,以免与其他自定义设备或原始设备发生冲突。
未能遵守可能会导致数小时的困惑,因为设备未按预期工作,然后才意识到 Windows 缓存了一些驱动程序信息(更改 USB 端口有时可能会有帮助,您也可以尝试使用 USBDeview[8] 来移除虚拟设备)。
INF 测试¶
提供的 INF 文件已在 Windows XP SP3、Windows Vista 和 Windows 7(所有 32 位版本)上进行过测试。它也应该在 64 位版本上工作。它极有可能无法在 Windows XP SP2 之前的 Windows 版本上工作。
其他系统¶
目前,尚未测试任何其他系统的驱动程序。考虑到 MacOS 基于 BSD,而 BSD 是开源的,因此认为它应该(读作:“我不知道它是否会”)开箱即用。
对于更奇特的系统,我能说的就更少了……
欢迎任何测试和驱动程序!
脚注¶
[1] 远程网络驱动程序接口规范,[[https://msdn.microsoft.com/en-us/library/ee484414.aspx]]。
[2] 通信设备类抽象控制模型,此及其他 USB 类的规范可在 [[http://www.usb.org/developers/devclass_docs/]] 找到。
[3] CDC 以太网控制模型。
[4] [[https://msdn.microsoft.com/en-us/library/ff537109(v=VS.85).aspx]]
[5] [[https://msdn.microsoft.com/en-us/library/ff539234(v=VS.85).aspx]]
[6] 换句话说,Windows 未能响应任何用户输入。
[7] 您可能会发现 [[http://www.cygnal.org/ubb/Forum9/HTML/001050.html]] 有用。
[8] https://www.nirsoft.net/utils/usb_devices_view.html
[9] [[https://msdn.microsoft.com/en-us/library/ff570620.aspx]]