我正在尝试在具有 USB OTG 的 Raspberry Pi 上模拟 HID 和网络设备。要求如下:
- 网络需要在Windows下工作
- HID 和网络应同时工作
我浏览了很多帖子,但找不到 Linux 小工具的文档来解释一切是如何工作的。
我发现并且在 Linux 上真正有效的是这个解决方案来自 USB 军械库项目。该解决方案对网络使用ECM模式。 Windows 以某种方式识别该设备,但无法获取正确的驱动程序。我能找到的唯一驱动程序需要购买并且非常昂贵。根据这个帖子如果只使用一种配置,它应该可以工作。
因此,据我所知,有两种可能的解决方案:
- 让 Windows 安装并使用适用于 ECM 模式的正确驱动程序
- 让 RNDIS 模式与同时启用的 HID 一起工作
我已经尝试让这两种解决方案都起作用。具有 RNDIS 的单个网络可以工作(请参见下面的代码),并且单个 HID 也可以工作。
#!/bin/bash -e
modprobe libcomposite
cd /sys/kernel/config/usb_gadget/
mkdir g && cd g
echo 0x1d6b > idVendor # Linux Foundation
echo 0x0104 > idProduct # Multifunction Composite Gadget
echo 0x0100 > bcdDevice # v1.0.0
echo 0x0200 > bcdUSB # USB 2.0
echo 0xEF > bDeviceClass
echo 0x02 > bDeviceSubClass
echo 0x01 > bDeviceProtocol
mkdir -p strings/0x409
echo "affeaffe" > strings/0x409/serialnumber
echo "myself" > strings/0x409/manufacturer
echo "myproduct" > strings/0x409/product
mkdir -p functions/rndis.usb0 # network
mkdir -p configs/c.1
echo 250 > configs/c.1/MaxPower
ln -s functions/rndis.usb0 configs/c.1/
echo 1 > os_desc/use
echo 0xcd > os_desc/b_vendor_code
echo MSFT100 > os_desc/qw_sign
echo RNDIS > functions/rndis.usb0/os_desc/interface.rndis/compatible_id
echo 5162001 > functions/rndis.usb0/os_desc/interface.rndis/sub_compatible_id
ln -s configs/c.1 os_desc
udevadm settle -t 5 || :
ls /sys/class/udc/ > UDC
ip link set usb0 up