在 中将设备配置为 RNDIS 小工具时,我无法成功设置 bDeviceClass、bDeviceProtocol 或 bDeviceSubClass /sys/kernel/config/usb_gadget/g1
。
我正在使用以下值配置小工具,并且可以在 Linux 中成功读回它们:
echo 0xef > bDeviceClass
echo 0x02 > bDeviceSubClass
echo 0x01 > bDeviceProtocol
但是,当我将设备插入 Windows 计算机并观察 USB 设备描述符时,我得到以下信息:
bDeviceClass: 0x02
bDeviceSubClass: 0x00
bDeviceProtocol: 0x00
在运行 4.9 内核的不同设备上,相同的过程可以正常工作,并且 Windows 从设备读取正确的值。我当前的设备运行的是 4.14.53。我不确定为什么以前的方法不再有效。
我不确定它是否相关,但为了在我当前的设备上传递产品、制造商和序列号信息,我必须在 modprobing g_ether 时将这些值作为参数传递,而不是填充strings/0x409
.我尝试对 bDeviceClass、bDeviceSubclass 和 bDeviceProtocol 执行相同的操作,但没有任何运气。
有谁知道我做错了什么?
答案1
解决方案是 modprobelibcomposite
模块而不是g_ether
直接进行。这使得 USB 设备描述符可以按预期设置。
这还需要脚本在退出之前将小工具绑定到 UDC。
我已经提供了一个无可否认的最大示例,但这就是我正在使用的并且对我有用的。
VENDORID=0x0430
PRODUCTID=0xa4a2
BCDDEVICE=0x100
BCDUSB=0x200
modprobe libcomposite
# Set up the USB Device
cd /sys/kernel/config/usb_gadget
mkdir g1
cd g1
# Make the necessary directories.
mkdir functions/rndis.usb0
mkdir configs/c.1
mkdir strings/0x409
mkdir configs/c.1/strings/0x409
echo 64 > bMaxPacketSize0
echo $BCDUSB > bcdUSB
echo $BCDDEVICE > bcdDevice
echo $VENDORID > idVendor
echo $PRODUCTID > idProduct
echo 0xef > bDeviceClass
echo 0x02 > bDeviceSubClass
echo 0x01 > bDeviceProtocol
echo $MANUFACTURER > strings/0x409/manufacturer
echo $PRODUCT > strings/0x409/product
echo $CONF > configs/c.1/strings/0x409/configuration
echo $SERNO > strings/0x409/serialnumber
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
mkdir functions/rndis.usb0/os_desc/interface.rndis/Icons
echo 2 > functions/rndis.usb0/os_desc/interface.rndis/Icons/type
echo "%SystemRoot%\system32\ddores.dll,-134" > functions/rndis.usb0/os_desc/interface.rndis/Icons/data
mkdir functions/rndis.usb0/os_desc/interface.rndis/Label
echo 1 > functions/rndis.usb0/os_desc/interface.rndis/Label/type
echo $PRODUCT > functions/rndis.usb0/os_desc/interface.rndis/Label/data
ln -s configs/c.1 os_desc
ln -s functions/rndis.usb0 configs/c.1
echo 7600000.dwc3 > UDC