Skip to content

Instantly share code, notes, and snippets.

@tmk

tmk/ProCon.desc Secret

Last active August 26, 2021 02:00
Show Gist options
  • Save tmk/9725596c6726b561ad2bf1f1e07e1523 to your computer and use it in GitHub Desktop.
Save tmk/9725596c6726b561ad2bf1f1e07e1523 to your computer and use it in GitHub Desktop.
Nintendo SWITCH Pro Controller: USB Descriptor
Bus 003 Device 120: ID 057e:2009 Nintendo Co., Ltd
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x057e Nintendo Co., Ltd
idProduct 0x2009
bcdDevice 2.10
iManufacturer 1 Nintendo Co., Ltd.
iProduct 2 Pro Controller
iSerial 3 000000000001
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 0x0029
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xa0
(Bus Powered)
Remote Wakeup
MaxPower 500mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 3 Human Interface Device
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
HID Device Descriptor:
bLength 9
bDescriptorType 33
bcdHID 1.11
bCountryCode 0 Not supported
bNumDescriptors 1
bDescriptorType 34 Report
wDescriptorLength 203
Report Descriptor: (length is 203)
Item(Global): Usage Page, data= [ 0x01 ] 1
Generic Desktop Controls
Item(Global): Logical Minimum, data= [ 0x00 ] 0
Item(Local ): Usage, data= [ 0x04 ] 4
Joystick
Item(Main ): Collection, data= [ 0x01 ] 1
Application
Item(Global): Report ID, data= [ 0x30 ] 48
Item(Global): Usage Page, data= [ 0x01 ] 1
Generic Desktop Controls
Item(Global): Usage Page, data= [ 0x09 ] 9
Buttons
Item(Local ): Usage Minimum, data= [ 0x01 ] 1
Button 1 (Primary)
Item(Local ): Usage Maximum, data= [ 0x0a ] 10
(null)
Item(Global): Logical Minimum, data= [ 0x00 ] 0
Item(Global): Logical Maximum, data= [ 0x01 ] 1
Item(Global): Report Size, data= [ 0x01 ] 1
Item(Global): Report Count, data= [ 0x0a ] 10
Item(Global): Unit Exponent, data= [ 0x00 ] 0
Unit Exponent: 0
Item(Global): Unit, data= [ 0x00 ] 0
System: None, Unit: (None)
Item(Main ): Input, data= [ 0x02 ] 2
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Global): Usage Page, data= [ 0x09 ] 9
Buttons
Item(Local ): Usage Minimum, data= [ 0x0b ] 11
(null)
Item(Local ): Usage Maximum, data= [ 0x0e ] 14
(null)
Item(Global): Logical Minimum, data= [ 0x00 ] 0
Item(Global): Logical Maximum, data= [ 0x01 ] 1
Item(Global): Report Size, data= [ 0x01 ] 1
Item(Global): Report Count, data= [ 0x04 ] 4
Item(Main ): Input, data= [ 0x02 ] 2
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Global): Report Size, data= [ 0x01 ] 1
Item(Global): Report Count, data= [ 0x02 ] 2
Item(Main ): Input, data= [ 0x03 ] 3
Constant Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Local ): Usage, data= [ 0x01 0x00 0x01 0x00 ] 65537
Instance 1
Item(Main ): Collection, data= [ 0x00 ] 0
Physical
Item(Local ): Usage, data= [ 0x30 0x00 0x01 0x00 ] 65584
(null)
Item(Local ): Usage, data= [ 0x31 0x00 0x01 0x00 ] 65585
(null)
Item(Local ): Usage, data= [ 0x32 0x00 0x01 0x00 ] 65586
(null)
Item(Local ): Usage, data= [ 0x35 0x00 0x01 0x00 ] 65589
(null)
Item(Global): Logical Minimum, data= [ 0x00 ] 0
Item(Global): Logical Maximum, data= [ 0xff 0xff 0x00 0x00 ] 65535
Item(Global): Report Size, data= [ 0x10 ] 16
Item(Global): Report Count, data= [ 0x04 ] 4
Item(Main ): Input, data= [ 0x02 ] 2
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Main ): End Collection, data=none
Item(Local ): Usage, data= [ 0x39 0x00 0x01 0x00 ] 65593
(null)
Item(Global): Logical Minimum, data= [ 0x00 ] 0
Item(Global): Logical Maximum, data= [ 0x07 ] 7
Item(Global): Physical Minimum, data= [ 0x00 ] 0
Item(Global): Physical Maximum, data= [ 0x3b 0x01 ] 315
Item(Global): Unit, data= [ 0x14 ] 20
System: English Rotation, Unit: Degrees
Item(Global): Report Size, data= [ 0x04 ] 4
Item(Global): Report Count, data= [ 0x01 ] 1
Item(Main ): Input, data= [ 0x02 ] 2
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Global): Usage Page, data= [ 0x09 ] 9
Buttons
Item(Local ): Usage Minimum, data= [ 0x0f ] 15
(null)
Item(Local ): Usage Maximum, data= [ 0x12 ] 18
(null)
Item(Global): Logical Minimum, data= [ 0x00 ] 0
Item(Global): Logical Maximum, data= [ 0x01 ] 1
Item(Global): Report Size, data= [ 0x01 ] 1
Item(Global): Report Count, data= [ 0x04 ] 4
Item(Main ): Input, data= [ 0x02 ] 2
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Global): Report Size, data= [ 0x08 ] 8
Item(Global): Report Count, data= [ 0x34 ] 52
Item(Main ): Input, data= [ 0x03 ] 3
Constant Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Global): Usage Page, data= [ 0x00 0xff ] 65280
(null)
Item(Global): Report ID, data= [ 0x21 ] 33
Item(Local ): Usage, data= [ 0x01 ] 1
(null)
Item(Global): Report Size, data= [ 0x08 ] 8
Item(Global): Report Count, data= [ 0x3f ] 63
Item(Main ): Input, data= [ 0x03 ] 3
Constant Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Global): Report ID, data= [ 0x81 ] 129
Item(Local ): Usage, data= [ 0x02 ] 2
(null)
Item(Global): Report Size, data= [ 0x08 ] 8
Item(Global): Report Count, data= [ 0x3f ] 63
Item(Main ): Input, data= [ 0x03 ] 3
Constant Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Global): Report ID, data= [ 0x01 ] 1
Item(Local ): Usage, data= [ 0x03 ] 3
(null)
Item(Global): Report Size, data= [ 0x08 ] 8
Item(Global): Report Count, data= [ 0x3f ] 63
Item(Main ): Output, data= [ 0x83 ] 131
Constant Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Volatile Bitfield
Item(Global): Report ID, data= [ 0x10 ] 16
Item(Local ): Usage, data= [ 0x04 ] 4
(null)
Item(Global): Report Size, data= [ 0x08 ] 8
Item(Global): Report Count, data= [ 0x3f ] 63
Item(Main ): Output, data= [ 0x83 ] 131
Constant Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Volatile Bitfield
Item(Global): Report ID, data= [ 0x80 ] 128
Item(Local ): Usage, data= [ 0x05 ] 5
(null)
Item(Global): Report Size, data= [ 0x08 ] 8
Item(Global): Report Count, data= [ 0x3f ] 63
Item(Main ): Output, data= [ 0x83 ] 131
Constant Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Volatile Bitfield
Item(Global): Report ID, data= [ 0x82 ] 130
Item(Local ): Usage, data= [ 0x06 ] 6
(null)
Item(Global): Report Size, data= [ 0x08 ] 8
Item(Global): Report Count, data= [ 0x3f ] 63
Item(Main ): Output, data= [ 0x83 ] 131
Constant Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Volatile Bitfield
Item(Main ): End Collection, data=none
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 8
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 8
Device Status: 0x0001
Self Powered
//////////////////////////////////////////////////////////////////////
// USB_desc_dump
// Address: 01
// Lowspeed: 00
// Devicer dump:
12 01 00 02 00 00 00 40 7E 05 09 20 10 02 01 02
03 01
// Device:
bLength: 12
bDescriptorType: 01
bcdUSB: 0200
bDeviceClass: 00
bDeviceSubClass: 00
bDeviceProtocol: 00
bMaxPacketSize0: 40
idVendor: 057E
idProduct: 2009
bcdDevice: 0210
iManufacturer: 01
iProduct: 02
iSerialNumber: 03
bNumConfigurations: 01
// String Zero: len: 04
// 04 03 09 04
// LangId: 0409
// iManufacturer: String1(0409): len: 26
// 26 03 4E 00 69 00 6E 00 74 00 65 00 6E 00 64 00
// 6F 00 20 00 43 00 6F 00 2E 00 2C 00 20 00 4C 00
// 74 00 64 00 2E 00
// Nintendo Co., Ltd.
// iProduct: String2(0409): len: 1E
// 1E 03 50 00 72 00 6F 00 20 00 43 00 6F 00 6E 00
// 74 00 72 00 6F 00 6C 00 6C 00 65 00 72 00
// Pro Controller
// iSerialNumber: String3(0409): len: 1A
// 1A 03 30 00 30 00 30 00 30 00 30 00 30 00 30 00
// 30 00 30 00 30 00 30 00 31 00
// 000000000001
// Config0 dump: len: 0029
09 02 29 00 01 01 00 A0 FA 09 04 00 00 02 03 00
00 00 09 21 11 01 00 01 22 CB 00 07 05 81 03 40
00 08 07 05 01 03 40 00 08
// Config:
bLength: 09
bDescriptorType: 02
wTotalLength: 0029
bNumInterfaces: 01
bConfigurationValue: 01
iConfiguration: 00
bmAttributes: A0
bMaxPower: FA
// Interface0.0:
bLength: 09
bDescriptorType: 04
bInterfaceNumber: 00
bAlternateSetting: 00
bNumEndpoints: 02
bInterfaceClass: 03
bInterfaceSubClass: 00
bInterfaceProtocol: 00
iInterface: 00
// HID:
bLength: 09
bDescriptorType: 21
bcdHID: 0111
bCountryCode: 00
bNumDescriptors: 01
bDescrType: 22
wDescriptorLength: 00CB
// Report0 dump: len: 00CB
05 01 15 00 09 04 A1 01 85 30 05 01 05 09 19 01
29 0A 15 00 25 01 75 01 95 0A 55 00 65 00 81 02
05 09 19 0B 29 0E 15 00 25 01 75 01 95 04 81 02
75 01 95 02 81 03 0B 01 00 01 00 A1 00 0B 30 00
01 00 0B 31 00 01 00 0B 32 00 01 00 0B 35 00 01
00 15 00 27 FF FF 00 00 75 10 95 04 81 02 C0 0B
39 00 01 00 15 00 25 07 35 00 46 3B 01 65 14 75
04 95 01 81 02 05 09 19 0F 29 12 15 00 25 01 75
01 95 04 81 02 75 08 95 34 81 03 06 00 FF 85 21
09 01 75 08 95 3F 81 03 85 81 09 02 75 08 95 3F
81 03 85 01 09 03 75 08 95 3F 91 83 85 10 09 04
75 08 95 3F 91 83 85 80 09 05 75 08 95 3F 91 83
85 82 09 06 75 08 95 3F 91 83 C0
// Report:
Usage Page Gen Desktop Ctrls(01)
Logical Min(00)
Usage Game Pad
Collection Application
Report Id(30)
Usage Page Gen Desktop Ctrls(01)
Usage Page Button(09)
Usage Min(01)
Usage Max(0A)
Logical Min(00)
Logical Max(01)
Report Size(01)
Report Count(0A)
Unit Exp(00)
Unit(00)
Input(00000010)
Usage Page Button(09)
Usage Min(0B)
Usage Max(0E)
Logical Min(00)
Logical Max(01)
Report Size(01)
Report Count(04)
Input(00000010)
Report Size(01)
Report Count(02)
Input(00000011)
Usage Btn0001
Collection Physical
Usage Btn0030
Usage Btn0031
Usage Btn0032
Usage Btn0035
Logical Min(00)
Logical Max(FFFF0000)
Report Size(10)
Report Count(04)
Input(00000010)
End Collection
Usage Btn0039
Logical Min(00)
Logical Max(07)
Physical Min(00)
Physical Max(3B01)
Unit(14)
Report Size(04)
Report Count(01)
Input(00000010)
Usage Page Button(09)
Usage Min(0F)
Usage Max(12)
Logical Min(00)
Logical Max(01)
Report Size(01)
Report Count(04)
Input(00000010)
Report Size(08)
Report Count(34)
Input(00000011)
Usage Page Undef(00)
Report Id(21)
Usage
Report Size(08)
Report Count(3F)
Input(00000011)
Report Id(81)
Usage
Report Size(08)
Report Count(3F)
Input(00000011)
Report Id(01)
Usage
Report Size(08)
Report Count(3F)
Output(10000011)
Report Id(10)
Usage
Report Size(08)
Report Count(3F)
Output(10000011)
Report Id(80)
Usage
Report Size(08)
Report Count(3F)
Output(10000011)
Report Id(82)
Usage
Report Size(08)
Report Count(3F)
Output(10000011)
End Collection
// Endpoint:
bLength: 07
bDescriptorType: 05
bEndpointAddress: 81
bmAttributes: 03
wMaxPacketSize: 0040
bInterval: 08
// Endpoint:
bLength: 07
bDescriptorType: 05
bEndpointAddress: 01
bmAttributes: 03
wMaxPacketSize: 0040
bInterval: 08
// Parse data here: http://eleccelerator.com/usbdescreqparser/
0x05, 0x01, // Usage Page (Generic Desktop Ctrls)
0x15, 0x00, // Logical Minimum (0)
0x09, 0x04, // Usage (Joystick)
0xA1, 0x01, // Collection (Application)
0x85, 0x30, // Report ID (48)
0x05, 0x01, // Usage Page (Generic Desktop Ctrls)
0x05, 0x09, // Usage Page (Button)
0x19, 0x01, // Usage Minimum (0x01)
0x29, 0x0A, // Usage Maximum (0x0A)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x75, 0x01, // Report Size (1)
0x95, 0x0A, // Report Count (10)
0x55, 0x00, // Unit Exponent (0)
0x65, 0x00, // Unit (None)
0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x05, 0x09, // Usage Page (Button)
0x19, 0x0B, // Usage Minimum (0x0B)
0x29, 0x0E, // Usage Maximum (0x0E)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x75, 0x01, // Report Size (1)
0x95, 0x04, // Report Count (4)
0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x75, 0x01, // Report Size (1)
0x95, 0x02, // Report Count (2)
0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x0B, 0x01, 0x00, 0x01, 0x00, // Usage (0x010001)
0xA1, 0x00, // Collection (Physical)
0x0B, 0x30, 0x00, 0x01, 0x00, // Usage (0x010030)
0x0B, 0x31, 0x00, 0x01, 0x00, // Usage (0x010031)
0x0B, 0x32, 0x00, 0x01, 0x00, // Usage (0x010032)
0x0B, 0x35, 0x00, 0x01, 0x00, // Usage (0x010035)
0x15, 0x00, // Logical Minimum (0)
0x27, 0xFF, 0xFF, 0x00, 0x00, // Logical Maximum (65534)
0x75, 0x10, // Report Size (16)
0x95, 0x04, // Report Count (4)
0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0, // End Collection
0x0B, 0x39, 0x00, 0x01, 0x00, // Usage (0x010039)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x07, // Logical Maximum (7)
0x35, 0x00, // Physical Minimum (0)
0x46, 0x3B, 0x01, // Physical Maximum (315)
0x65, 0x14, // Unit (System: English Rotation, Length: Centimeter)
0x75, 0x04, // Report Size (4)
0x95, 0x01, // Report Count (1)
0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x05, 0x09, // Usage Page (Button)
0x19, 0x0F, // Usage Minimum (0x0F)
0x29, 0x12, // Usage Maximum (0x12)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x75, 0x01, // Report Size (1)
0x95, 0x04, // Report Count (4)
0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x75, 0x08, // Report Size (8)
0x95, 0x34, // Report Count (52)
0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00)
0x85, 0x21, // Report ID (33)
0x09, 0x01, // Usage (0x01)
0x75, 0x08, // Report Size (8)
0x95, 0x3F, // Report Count (63)
0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x85, 0x81, // Report ID (-127)
0x09, 0x02, // Usage (0x02)
0x75, 0x08, // Report Size (8)
0x95, 0x3F, // Report Count (63)
0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x85, 0x01, // Report ID (1)
0x09, 0x03, // Usage (0x03)
0x75, 0x08, // Report Size (8)
0x95, 0x3F, // Report Count (63)
0x91, 0x83, // Output (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Volatile)
0x85, 0x10, // Report ID (16)
0x09, 0x04, // Usage (0x04)
0x75, 0x08, // Report Size (8)
0x95, 0x3F, // Report Count (63)
0x91, 0x83, // Output (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Volatile)
0x85, 0x80, // Report ID (-128)
0x09, 0x05, // Usage (0x05)
0x75, 0x08, // Report Size (8)
0x95, 0x3F, // Report Count (63)
0x91, 0x83, // Output (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Volatile)
0x85, 0x82, // Report ID (-126)
0x09, 0x06, // Usage (0x06)
0x75, 0x08, // Report Size (8)
0x95, 0x3F, // Report Count (63)
0x91, 0x83, // Output (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Volatile)
0xC0, // End Collection
// 203 bytes
// /sys/bus/usb/drivers/usbhid/3-4:1.0/0003:057E:2009.0BD4/report_descriptor:
Usage Page (Desktop), ; Generic desktop controls (01h)
Logical Minimum (0),
Usage (Joystick), ; Joystick (04h, application collection)
Collection (Application),
Report ID (48),
Usage Page (Desktop), ; Generic desktop controls (01h)
Usage Page (Button), ; Button (09h)
Usage Minimum (01h),
Usage Maximum (0Ah),
Logical Minimum (0),
Logical Maximum (1),
Report Size (1),
Report Count (10),
Unit Exponent (0),
Unit,
Input (Variable),
Usage Page (Button), ; Button (09h)
Usage Minimum (0Bh),
Usage Maximum (0Eh),
Logical Minimum (0),
Logical Maximum (1),
Report Size (1),
Report Count (4),
Input (Variable),
Report Size (1),
Report Count (2),
Input (Constant, Variable),
Usage (Desktop Pointer), ; Pointer (01h, physical collection) - generic desktop controls (01h)
Collection (Physical),
Usage (Desktop X), ; X (30h, dynamic value) - generic desktop controls (01h)
Usage (Desktop Y), ; Y (31h, dynamic value) - generic desktop controls (01h)
Usage (Desktop Z), ; Z (32h, dynamic value) - generic desktop controls (01h)
Usage (Desktop Rz), ; Rz (35h, dynamic value) - generic desktop controls (01h)
Logical Minimum (0),
Logical Maximum (65535),
Report Size (16),
Report Count (4),
Input (Variable),
End Collection,
Usage (Desktop Hat Switch), ; Hat switch (39h, dynamic value) - generic desktop controls (01h)
Logical Minimum (0),
Logical Maximum (7),
Physical Minimum (0),
Physical Maximum (315),
Unit (Degrees),
Report Size (4),
Report Count (1),
Input (Variable),
Usage Page (Button), ; Button (09h)
Usage Minimum (0Fh),
Usage Maximum (12h),
Logical Minimum (0),
Logical Maximum (1),
Report Size (1),
Report Count (4),
Input (Variable),
Report Size (8),
Report Count (52),
Input (Constant, Variable),
Usage Page (FF00h), ; FF00h, vendor-defined
Report ID (33),
Usage (01h),
Report Size (8),
Report Count (63),
Input (Constant, Variable),
Report ID (129),
Usage (02h),
Report Size (8),
Report Count (63),
Input (Constant, Variable),
Report ID (1),
Usage (03h),
Report Size (8),
Report Count (63),
Output (Constant, Variable, Volatile),
Report ID (16),
Usage (04h),
Report Size (8),
Report Count (63),
Output (Constant, Variable, Volatile),
Report ID (128),
Usage (05h),
Report Size (8),
Report Count (63),
Output (Constant, Variable, Volatile),
Report ID (130),
Usage (06h),
Report Size (8),
Report Count (63),
Output (Constant, Variable, Volatile),
End Collection
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment