
デバイスを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を実行しています。なぜ以前の方法がもう機能しないのかわかりません。
関連があるかどうかはわかりませんが、現在使用しているデバイスの製品、メーカー、シリアル番号情報を渡すためにpaddingの代わりにg_etherをmodprobingするときにその値をパラメータとして渡す必要がありますが、strings/0x409
bDeviceClassを試してみました。 bDeviceSubclassとbDeviceProtocolは同じことをしましたが、運がありませんでした。
私が間違っていることを知っている人はいますか?
答え1
解決策は、モジュールを直接実行するlibcomposite
のではなく、モジュールをモードプローブすることです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