问题 模拟物理USB设备Linux


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

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


5612
2017-07-12 22:11


起源



答案:


最好的方法是使用Linux小工具驱动程序和硬件,使您成为USB设备。小工具驱动程序允许计算机“假装”为任何类型的设备。然后,您测试的系统只有一条USB OTG电缆连接到小工具盒。如果您的小工具箱有合适的硬件,您甚至不需要拔掉电缆。 “小工具盒”可能是运行Linux的桌面/笔记本电脑(如果它支持USB OTG),甚至是Android手机或Raspberry Pi。 (请注意USB电缆很糟糕。仅仅因为电缆适合并不意味着USB OTG正确接线。)

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

1)如果您的被测设备支持OTG,请确保您的小工具箱不会尝试成为USB主机。 (然后您的被测设备将成为USB客户端。)I。确保这样的事情 usb_storage 不会自动加载。

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

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

大量的设备真的是“USB串口”,因为制造商懒得理解USB。

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

4)对于尚未在内核中的设备类型(即WiFi或其他设备),您可以自己动手。有足够的血汗和眼泪,您可以使用自己的小工具类型。 (理想情况下,尽可能保留用户空间,并且只处理内核中的性能关键部分..)

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


9
2017-07-14 15:31



如果我有物理访问测试系统,这将是完美的;不幸的是,我没有。但是,Linux小工具驱动程序可以派上用场......我计划编写一个USB驱动程序,在初始化时自动注册一个虚拟USB设备,该设备镜像Linux小工具源中的设备,配置和接口描述符。这可行吗? - Matt Dorsett
看起来内核模块已重命名为 usb_f_mass_storage.ko。看到 链接 - netvope


答案:


最好的方法是使用Linux小工具驱动程序和硬件,使您成为USB设备。小工具驱动程序允许计算机“假装”为任何类型的设备。然后,您测试的系统只有一条USB OTG电缆连接到小工具盒。如果您的小工具箱有合适的硬件,您甚至不需要拔掉电缆。 “小工具盒”可能是运行Linux的桌面/笔记本电脑(如果它支持USB OTG),甚至是Android手机或Raspberry Pi。 (请注意USB电缆很糟糕。仅仅因为电缆适合并不意味着USB OTG正确接线。)

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

1)如果您的被测设备支持OTG,请确保您的小工具箱不会尝试成为USB主机。 (然后您的被测设备将成为USB客户端。)I。确保这样的事情 usb_storage 不会自动加载。

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

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

大量的设备真的是“USB串口”,因为制造商懒得理解USB。

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

4)对于尚未在内核中的设备类型(即WiFi或其他设备),您可以自己动手。有足够的血汗和眼泪,您可以使用自己的小工具类型。 (理想情况下,尽可能保留用户空间,并且只处理内核中的性能关键部分..)

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


9
2017-07-14 15:31



如果我有物理访问测试系统,这将是完美的;不幸的是,我没有。但是,Linux小工具驱动程序可以派上用场......我计划编写一个USB驱动程序,在初始化时自动注册一个虚拟USB设备,该设备镜像Linux小工具源中的设备,配置和接口描述符。这可行吗? - Matt Dorsett
看起来内核模块已重命名为 usb_f_mass_storage.ko。看到 链接 - netvope


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


0
2017-07-12 23:07



不,不幸的是,我没有那种对代码的访问,我所能做的就是添加内核模块并运行测试应用程序。测试在远程服务器上运行 - Matt Dorsett