장치를 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