Multifunction Composite Gadget

概述

 Multifunction Composite Gadget(或g_multi)是一种复合gadget,它广泛使用复合框架来提供一个…多功能gadget。

在它的标准配置中,它提供了一个单一的USB配置与RNDIS[1](即以太网),USB CDC[2] ACM(即串行)和USB大容量存储功能。

可以通过Kconfig选项打开CDC ECM(以太网)功能,并关闭RNDIS。如果它们都启用了,那么gadget将具有两种配置—一种是RNDIS配置,另一种是CDC ECM[3]配置。

请注意,如果您使用非标准配置(即启用CDC ECM),您可能需要更改供应商和/或产品ID。

主机驱动程序

要想使用这个gadget,就需要让它在主机端工作——否则这个gadget就没有实现任何目标的希望。正如人们所期望的,每个系统都需要做一些事情。

Linux主机驱动程序

由于该gadget使用标准的组合框架,并且在Linux主机上显示为标准的组合框架,因此在Linux主机端不需要任何额外的驱动程序。所有的功能都由各自的驱动程序来处理。

对于两种配置设置也是如此,第一种是RNDIS配置。Linux主机将使用CDC ECM的第二种配置,它应该在Linux下工作得更好。

Windows主机驱动程序

要让这个gadget在Windows下工作,必须满足两个条件:

一、检测为复合gadget

首先,Windows需要将gadget检测为USB复合gadget,它本身有一些条件[4]。如果它们被满足,Windows让USB通用父驱动[5]处理设备,然后尝试为每个单独的接口匹配驱动(sort,不要进入太多的细节)。

好消息是:你不必担心大部分的条件!

唯一需要担心的是这个gadget必须只有一个配置,因此双重RNDIS和CDC ECM gadget将无法工作,除非您创建了正确的INF—当然,如果您提交了它!

二、为每个功能安装驱动程序

另一件棘手的事情是让Windows为每个单独的功能安装驱动程序。

对于大容量存储,这是微不足道的,因为Windows检测它是一个实现USB大容量存储类的接口,并选择适当的驱动程序。

RDNIS和CDC ACM的事情更困难。

RNDIS

要使Windows为gadget中的第一个功能选择RNDIS驱动程序,需要使用[[file:linux.inf]]。随本文档提供的文件。它将windows的RNDIS驱动程序“附加”到gadget的第一个接口上。

请注意,在测试时,当RNDIS不是第一个接口时,我们遇到了[6]问题。您不需要担心它,除非您试图开发自己的gadget,在这种情况下,请注意这个bug。

CDC ACM

同样,[[file:linux-cdc-acm.inf]] 为CDC ACM提供。

定制 gadget

如果您打算破解g_multi gadget,请注意重新排列函数显然会改变每个功能的接口编号。作为一种效果,inf无法工作,因为它们有硬编码的接口编号(通过[7]更改这些编号并不困难)。

这也意味着,在试用g_multi并更改提供的功能后,应该更改gadget的供应商和/或产品ID,这样就不会与其他定制gadget或原始gadget发生冲突。

在意识到Windows已经缓存了一些驱动程序信息(改变USB端口有时可能会有帮助,而且你可能会尝试使用USBDeview[8]来移除幻影设备)之前,如果不遵守可能会导致cpu损伤。

INF testing

提供的INF文件已在Windows XP SP3, Windows Vista和Windows 7上测试,所有32位版本。它应该也可以在64位版本上工作。它很可能无法在Windows XP SP2之前的Windows上运行。

Other systems

目前,任何其他系统的驱动程序都还没有经过测试。知道MacOS是如何基于BSD的,并且BSD是一个开源的,人们相信它应该(读:“我不知道它是否会”)开箱即用。

对于更奇特的系统,我甚至没有什么可说的……

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

posted @ 2021-08-23 18:05  闹闹爸爸  阅读(883)  评论(0编辑  收藏  举报