14

我有一个 Linux 应用程序,我想自动化一些测试,它的状态应该根据某些设备的状态而改变,即 USB 设备、WLAN 设备、WAN 设备。但是,我们不再有物理 USB、WLAN、WAN 等设备可供我们使用,所以我需要找到一种方法来测试这个程序,而无需实际插入物理设备、打开/关闭它们等。

我从简单地创建一个我可以从用户空间控制的虚拟 USB 设备开始,但是我根本缺乏知识,这使我无法在这些论坛上讨论任何类似的主题并将它们应用到我的项目中。我觉得我需要创建某种虚拟 USB 驱动程序,然后让它与一些用户级程序而不是 usbfs 通信。但是,即使我创建了这个虚拟驱动程序,我如何从用户空间“插入”这个设备并让我的程序注册到这个特定的驱动程序?我想要做的甚至可能吗?

4

2 回答 2

12

最好的方法是使用 Linux Gadget Drivers 和硬件,让您成为 USB 设备。小工具驱动程序允许计算机“假装”为任何类型的设备。然后,您的被测系统有一根 USB OTG 电缆连接到小工具盒。如果您的小工具盒具有正确的硬件,您甚至不需要拔下电缆。“gadget box”可以是运行 Linux 的台式机/笔记本电脑(如果它支持 USB OTG),甚至可以是 Android 手机或 Raspberry Pi。(请注意 USB 电缆很烂。仅仅因为电缆适合并不意味着它已正确连接到 USB OTG。)

一旦您拥有正确的 USB OTG 硬件,您的小工具盒就是所有软件:

1) 如果您的被测设备支持 OTG,请确保您的小工具盒不会尝试成为 USB 主机。(然后您的被测设备将成为 USB 客户端。)即确保usb_storage不会自动加载诸如此类的内容。

2) 开箱即用,内核支持 USB 集线器、USB 以太网、USB 串行端口和 USB 记忆棒的小工具。只需在您的小工具盒上加载正确的模块,它就会“正常工作”。例如,要创建 U 盘,请执行以下操作:“ insmod g_file_storage.ko file=/dev/ram0”。远端会认为您插入了 U 盘。

对于串行设备,您的小工具可以在 /dev/USBx 上运行“拿起电话”的用户空间代码并与您的被测设备对话。(可能模拟 4G 调制解调器或其他。)

大量设备实际上是“USB 串行”,因为制造商懒得理解 USB。

3)稍微重新编译或配置,您可以让那些通用小工具设备伪装成各种 USB ID 或返回各种供应商字符串等。这与“针对真实硬件进行测试”不同,但至少您正在使用这些设备的通用版本进行测试。

4) 对于内核中尚不存在的设备类型(即 WiFi 或其他),您需要自行处理。有了足够的血汗和泪水,您就可以使用编写自己的小工具类型。(理想情况下,尽可能多地保留在用户空间中,并且只处理内核中的性能关键部分..)

注意:同时理解和欣赏 USB 是不可能的。

于 2013-07-14T15:31:57.483 回答
0

您可以使用 VMWare 在虚拟环境中测试您的应用程序吗?然后,您可以将主机上的任何虚拟设备“插入”到您的来宾 VM 并以这种方式测试您的应用程序。

于 2013-07-12T23:07:07.393 回答