多功能复合设备

概述

多功能复合设备(或 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 是开源的,因此人们认为它应该(读取:“我不知道它是否会”)开箱即用。

对于更奇特的系统,我更无话可说...

欢迎任何测试和驱动程序!

作者

本文档由 Michal Nazarewicz (([[mailto:mina86@mina86.com]])撰写。INF 文件在 Marek Szyprowski (([[mailto:m.szyprowski@samsung.com]]) 和 Xiaofan Chen (([[mailto:xiaofanc@gmail.com]]) 的支持下,基于 MS RNDIS 模板[9]、Microchip 的 CDC ACM INF 文件和 David Brownell (([[mailto:dbrownell@users.sourceforge.net]]) 的原始 INF 文件进行了破解。

脚注

[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]]