I want to modify the Micro-B USB port on the board to make the board behave as an HID device. I can connect the NX board and the target host through the Micro-B USB port and let the target host recognize the NX as a gamepad. So that I can run the AI video program on the Xavier NX board to generate a gamepad signal and control the target host.
Note that the kernel default does not support the HID device. So I rebuild the kernel and set the HID support.
After that, I stop the " nv-l4t-usb-device-mode" so that I can make an HID gamepad usb_gadget. But I meet the âINVALIDARGUMENTâ error when I try to bind â3550000.xudcâ to the gamepad usb_gadget UDC.
Is there something wrong?
.
Hi,
The USB micro B port on Xavier NX default board works in device mode only. It does not support OTG. Your case may not work on the default board and need to use/design a custom board.
Sorry for the misslead. I revised my question to be more precise.
How can I bind the xudc to the custom usb_gadget?
You may find this useful:
https://www.kernel.org/doc/html/latest/usb/gadget_hid.html
A general URL on gadget:
https://www.kernel.org/doc/html/latest/search.html?q=gadget&check_keywords=yes&area=default
With that port already being in device mode the implication is that the ID pin is more or less doing what it should, but wired to always detect as device. What remains is the âgadgetâ setup. There is more or less a template of features for describing your virtual device, and the URL above should give you a starting point.
Keep in mind that you may need kernel features, but probably this is already set up. To see what is already enabled:
zcat /proc/config.gz | grep 'USB_GADGET'
Mainly you just need CONFIG_USB_GADGET
, which should already be â=y
â. You wonât need Xilinx, and although debug features can be useful, you donât need those either. You can look up the individual kernel symbols from kernel.org if you are in doubt.
Thank you for your reply.
The "zcat /proc/config.gz | grep âUSB_GADGETâ â outputs:
CONFIG_USB_GADGET=y
CONFIG_USB_GADGET_VBUS_DRAW=2
CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2
Other lines start with â#â.
The Micro-B on the NX is always device mode
I try to set up the Micro-B to be HID device through "Kernel USB Gadget
Configfs Interface ".
But I failed when " Attach the created gadget device to
the UDC driver. " Do I need to set a custom UDC driver?
Follow by this steps, I set the Micro-B to be recognized as a GamePad.
The âINVALIDARGUMENTâ error is because I do not set a function in the USB_GADGET.
I use "dmesg --follow " to find the error message. The next step is to send the control information. By the way, The target win10 host says the gamepad driver is wrong.
It is already set up as device mode on the NX and Nano. I donât know if there might be some other required setting which is specific to Jetson hardware.
I know some about mouse and keyboard and joystick, and all of these, when using gadget, are standard class devices. What I donât know is if a gamepad is just a name difference to a standard class HID, or if it has something âcustomâ. Gadget is only able to work as a framework to a subset of the standard class (non-custom) devices. I do not have a gamepad to test, but if you look at lsusb
on a regular Linux host PC, it will have an âID
â. That ID will look something like â0123:4567
â. Substitute your actual ID, but what does your host PC say from:
sudo lsusb -d 0123:4567 -vvv 2>&1 | tee log_gamepad.txt
(you can attach âlog_gamepad.txt
â to the forum)
âŠwhich should say more about its class.
Thank you.
The information about the gamepad:
log_gamepad.txt (1.9 KB)
Bus 001 Device 008: ID 0079:0011 DragonRise Inc. Gamepad
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 8
idVendor 0x0079 DragonRise Inc.
idProduct 0x0011 Gamepad
bcdDevice 1.06
iManufacturer 0
iProduct 2 USB Gamepad
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 34
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 3 Human Interface Device
bInterfaceSubClass 0 No Subclass
bInterfaceProtocol 0 None
iInterface 0
HID Device Descriptor:
bLength 9
bDescriptorType 33
bcdHID 1.10
bCountryCode 33 US
bNumDescriptors 1
bDescriptorType 34 Report
wDescriptorLength 101
Report Descriptors:
** UNAVAILABLE **
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0008 1x 8 bytes
bInterval 10
Device Status: 0x0000
(Bus Powered)
Pleae note that the bcdUSB is 1.00 so that it is a 1.0 USB. However, I can not set the bcdUSB value in the USB_GADGET. Itâs a 2.1 USB port.
The information about the fake gamepad (by setting the Micro-B port on the NX ) information:
Bus 001 Device 009: ID 0079:0011 DragonRise Inc. Gamepad
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.10
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x0079 DragonRise Inc.
idProduct 0x0011 Gamepad
bcdDevice 1.00
iManufacturer 1 DragonRise Inc.
iProduct 2 Gamepad
iSerial 3 0x0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 41
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 4
bmAttributes 0x80
(Bus Powered)
MaxPower 50mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 3 Human Interface Device
bInterfaceSubClass 0 No Subclass
bInterfaceProtocol 0 None
iInterface 5 HID Interface
HID Device Descriptor:
bLength 9
bDescriptorType 33
bcdHID 1.01
bCountryCode 0 Not supported
bNumDescriptors 1
bDescriptorType 34 Report
wDescriptorLength 9
Report Descriptors:
** UNAVAILABLE **
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0008 1x 8 bytes
bInterval 4
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0008 1x 8 bytes
bInterval 4
Binary Object Store Descriptor:
bLength 5
bDescriptorType 15
wTotalLength 22
bNumDeviceCaps 2
USB 2.0 Extension Device Capability:
bLength 7
bDescriptorType 16
bDevCapabilityType 2
bmAttributes 0x00000006
Link Power Management (LPM) Supported
SuperSpeed USB Device Capability:
bLength 10
bDescriptorType 16
bDevCapabilityType 3
bmAttributes 0x00
wSpeedsSupported 0x000f
Device can operate at Low Speed (1Mbps)
Device can operate at Full Speed (12Mbps)
Device can operate at High Speed (480Mbps)
Device can operate at SuperSpeed (5Gbps)
bFunctionalitySupport 1
Lowest fully-functional device speed is Full Speed (12Mbps)
bU1DevExitLat 1 micro seconds
bU2DevExitLat 500 micro seconds
Device Status: 0x0001
Self Powered
When I plug the real gamepad, the dmesg shows:
[88825.040543] usb 1-2.2: new low-speed USB device number 12 using tegra-xusb
[88825.064116] usb 1-2.2: New USB device found, idVendor=0079, idProduct=0011
[88825.064130] usb 1-2.2: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[88825.064136] usb 1-2.2: Product: USB Gamepad
[88825.068453] input: USB Gamepad as /devices/3610000.xhci/usb1/1-2/1-2.2/1-2.2:1.0/0003:0079:0011.0009/input/input10
[88825.069039] dragonrise 0003:0079:0011.0009: input,hidraw4: USB HID v1.10 Joystick [USB Gamepad ] on usb-3610000.xhci-2.2/input0
However, when I plug the Micro-B, the dmesg shows:
[88787.408882] usb 1-2.2: new high-speed USB device number 11 using tegra-xusb
[88787.429116] android_work: sent uevent USB_STATE=CONNECTED
[88787.430056] usb 1-2.2: New USB device found, idVendor=0079, idProduct=0011
[88787.430066] usb 1-2.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[88787.430071] usb 1-2.2: Product: Gamepad
[88787.430076] usb 1-2.2: Manufacturer: DragonRise Inc.
[88787.430080] usb 1-2.2: SerialNumber: 0x0
[88787.430855] configfs-gadget gadget: high-speed config #1: c
[88787.430881] tegra-xudc-new 3550000.xudc: ep 3 (type: 3, dir: in) enabled
[88787.430896] tegra-xudc-new 3550000.xudc: ep 2 (type: 3, dir: out) enabled
[88787.431023] android_work: sent uevent USB_STATE=CONFIGURED
[88787.431614] tegra-xudc-new 3550000.xudc: setup request failed: -95
[88787.432301] dragonrise 0003:0079:0011.0008: unbalanced collection at end of report description
[88787.432517] dragonrise 0003:0079:0011.0008: parse failed
[88787.432653] dragonrise: probe of 0003:0079:0011.0008 failed with error -22
There is something wrong with the report_desc. After I correct it, the target host recognizes the NX the same as the gamepad. Thank you all very much!
Hi linuxdev, thank you very much for sharing guidance/suggestion.