多功能复合设备

概述

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

对于更奇特的系统,我能说的就更少了……

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

作者

本文档由 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]]