多功能复合设备¶
概述¶
多功能复合设备(或 g_multi)是一个复合设备,它广泛使用复合框架来提供...多功能设备。
在其标准配置中,它提供具有 RNDIS[1](即以太网)、USB CDC[2] ACM(即串行)和 USB 大容量存储功能的单个 USB 配置。
可以通过 Kconfig 选项启用 CDC ECM(以太网)功能,并且可以关闭 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 大容量存储类的接口,并选择合适的驱动程序。
RDNIS 和 CDC ACM 的情况更困难。
RNDIS¶
为了使 Windows 为设备中的第一个功能选择 RNDIS 驱动程序,需要使用本文档提供的 [[file:linux.inf]] 文件。 它将 Window 的 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]]