我从来没有对 Linux USB 堆栈做过太多的事情,它总是能工作。但我正在读关于USB 动态设备映射并想知道这是否可能。
例如,我可以将鼠标插入 Linux 计算机上的一个 USB 端口并发出命令以使其动态地将设备映射到 Linux 上的另一个 USB 端口吗?如果是这样,我应该研究什么命令或工具集?
出于此问题的目的,假设我有一个可以处于主机模式的 USB 端口,另一个可以处于设备模式。我想知道如果我有合适的硬件,我将如何做到这一点。
答案1
我过去做过类似的事情:
- 使用USB 配置文件创建所需的 USB 小工具配置,包括 HID 设备
(一个小工具可以有多个设备“功能”) - 使用
uinput
和intercept
来自拦截工具框架按需将 HID 事件从真实设备转移到虚拟设备
对于类似于音频和视频流、大容量存储设备以及“行为”类似于串行端口的设备,可以在用户空间中执行类似的“传递”。
对于音频和视频,您可以使用例如ffmpeg
在真实设备和模拟(alsa/v4l2)设备之间中继流。例如,socat
用于从串行端口设备中继数据。
请注意,这并不是真正使用 USB 控制器硬件或内核驱动程序“通过 USB 设备”,而是使用用户空间工具和一些编排“只是”转发/桥接来自 USB 设备的“有效负载数据”使用脚本、udev 和/或 systemd。
您可能会感兴趣的其他资源:
- https://www.kernel.org/doc/Documentation/usb/gadget-testing.txt
- https://www.collabora.com/news-and-blog/blog/2019/02/18/modern-usb-gadget-on-linux-and-how-to-integrate-it-with-systemd-part- 1/
- https://developer.ridgerun.com/wiki/index.php/How_to_use_the_UVC_gadget_driver_in_Linux
- https://www.kernel.org/doc/html/latest/usb/functionfs.html
我今天没有太多时间进一步阐述,但如果在使用上述信息作为起始种子进行谷歌搜索后有任何不清楚的地方,请给我留言。