Difference between revisions of "Xbox Input Devices"
(Created page with "== Standard Gamepads == == Steering wheels == == Light guns ==") |
(Add Chihiro baseboard) |
||
(111 intermediate revisions by 14 users not shown) | |||
Line 1: | Line 1: | ||
+ | == XID Overview == | ||
+ | |||
+ | XIDs are USB devices. | ||
+ | |||
+ | The hardware side is USB with a different plug while the software side is USB without HID-descriptors. | ||
+ | Technicly a XID is a USB-hub for the Memory-Units and the XBL Communicator. | ||
+ | The logical XID gamepad USB device is internally connected to that hub. | ||
+ | |||
+ | |||
+ | === USB Adapters === | ||
+ | The Xbox's Input devices are USB devices. As such, you can connect a keyboard to the Xbox, or a gamepad to your PC. In fact, Linux already has drivers for the gamepad. In order to preserve Xbox hardware, please do not cut OEM Xbox cables to make an adapter; decent adapters can be acquired cheaply (~$10 USD ea. on 2017.04.30). | ||
+ | |||
+ | [[File:Xboxmaletousbfemale.png|thumb|right|Wiring diagram to show how male Xbox controller plug maps to standard female USB connector. White cable color is depicted as gray for better visibility. The yellow cable is not connected to the USB side, as it's exclusive to Xbox.]] | ||
+ | |||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | ! Port (From) | ||
+ | ! Plug (To) | ||
+ | ! Link | ||
+ | |- | ||
+ | | Xbox | ||
+ | | USB-A | ||
+ | | [https://www.amazon.com/gp/product/B000RT2868 Amazon] [https://www.aliexpress.com/item/32948906701.html Aliexpress] | ||
+ | |- | ||
+ | | USB-A | ||
+ | | Xbox | ||
+ | | [https://www.amazon.com/gp/product/B00F52LQHO Amazon] [https://www.aliexpress.com/item/4000452932782.html Aliexpress] | ||
+ | |} | ||
+ | |||
+ | === Wiring === | ||
+ | |||
+ | Untested / unverified! Take this with a grain of salt. | ||
+ | |||
+ | {| class="wikitable" | ||
+ | !Pin | ||
+ | !Typical cable color | ||
+ | !Description | ||
+ | |- | ||
+ | |1 | ||
+ | |Red | ||
+ | |VCC | ||
+ | |- | ||
+ | |2 | ||
+ | |White | ||
+ | |USB D+ | ||
+ | |- | ||
+ | |3 | ||
+ | |Green | ||
+ | |USB D- | ||
+ | |- | ||
+ | |4 | ||
+ | |Yellow | ||
+ | |VBlank signal from video output (for Lightguns) | ||
+ | |- | ||
+ | |5 | ||
+ | |Black | ||
+ | |GND | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | === Protocol === | ||
+ | |||
+ | XID are similar to HID but have custom Vendor requests | ||
+ | |||
+ | ==== Control Transfers ==== | ||
+ | |||
+ | ===== GET_DESCRIPTOR ===== | ||
+ | |||
+ | * bmRequestType: 0xC1 | ||
+ | * bRequest: 6 | ||
+ | * wValue: 0x4200 | ||
+ | * wIndex: Interface number | ||
+ | * wLength: <length of respective report; typically 16> | ||
+ | |||
+ | Actual length is truncated to size of descriptor or wLength. Whichever is smaller. | ||
+ | |||
+ | <pre> | ||
+ | typedef struct XIDDescriptor { | ||
+ | uint8_t bLength; | ||
+ | uint8_t bDescriptorType; | ||
+ | uint16_t bcdXid; | ||
+ | uint8_t bType; | ||
+ | uint8_t bSubType; | ||
+ | uint8_t bMaxInputReportSize; | ||
+ | uint8_t bMaxOutputReportSize; | ||
+ | uint16_t wAlternateProductIds[4]; | ||
+ | }; | ||
+ | </pre> | ||
+ | |||
+ | bDescriptorType is probably always 0x42. | ||
+ | |||
+ | ====== bType = 1: Xbox Gamecontroller ====== | ||
+ | |||
+ | * bSubType: | ||
+ | ** 0x01 = Gamepad (Duke) | ||
+ | ** 0x02 = Gamepad (Controller-S) | ||
+ | ** 0x10 = Steering wheel | ||
+ | ** 0x20 = Arcade Stick | ||
+ | ** 0x50 = Light gun | ||
+ | |||
+ | ====== bType = 3: Xbox DVD Movie Playback IR Dongle====== | ||
+ | |||
+ | * bSubType: | ||
+ | ** 0x00 | ||
+ | |||
+ | ====== bType = 128: Steel Battalion ====== | ||
+ | |||
+ | * bSubType: | ||
+ | ** 0x01 | ||
+ | |||
+ | ====== Example XID reports ====== | ||
+ | |||
+ | This is an example XID descriptor taken from a Controller-S (VID 0x045E / PID 0x0289). | ||
+ | <pre> | ||
+ | bLength 0x10 (16 bytes) | ||
+ | bDescriptorType 0x42 | ||
+ | bcdXid 0x0100 (USB 1.0) | ||
+ | bType 0x01 | ||
+ | bSubType 0x02 | ||
+ | bMaxInputReportSize 0x14 (20 bytes) | ||
+ | bMaxOutputReportSize 0x06 (6 bytes) | ||
+ | wAlternateProductIds 4 x 0xFFFF | ||
+ | </pre> | ||
+ | |||
+ | This is an example XID descriptor taken from a Steel Battalion controller. | ||
+ | <pre> | ||
+ | bLength 0x10 (16 bytes) | ||
+ | bDescriptorType 0x42 | ||
+ | bcdXid 0x0100 (USB 1.0) | ||
+ | bType 0x80 | ||
+ | bSubType 0x01 | ||
+ | bMaxInputReportSize 0x1A (26 bytes) | ||
+ | bMaxOutputReportSize 0x16 (22 bytes) | ||
+ | wAlternateProductIds 4 x 0xFFFF | ||
+ | </pre> | ||
+ | |||
+ | This is an example XID descriptor taken from an official Microsoft DVD Movie Playback IR dongle. | ||
+ | <pre> | ||
+ | bLength 0x08 (8 bytes) | ||
+ | bDescriptorType 0x42 | ||
+ | bcdXid 0x0100 (USB 1.0) | ||
+ | bType 0x03 | ||
+ | bSubType 0x00 | ||
+ | bMaxInputReportSize 0x06 (6 bytes) | ||
+ | bMaxOutputReportSize 0x00 (0 bytes) | ||
+ | </pre> | ||
+ | |||
+ | ===== GET_CAPABILITIES ===== | ||
+ | |||
+ | * bmRequestType: 0xC1 | ||
+ | * bRequest: 1 | ||
+ | * wValue: | ||
+ | ** 0x0100 for input | ||
+ | ** 0x0200 for output | ||
+ | * wIndex: Interface number | ||
+ | * wLength: <length of respective report> | ||
+ | |||
+ | |||
+ | * STALL if wValue not supported. | ||
+ | |||
+ | Actual length is truncated to size of report or wLength. Whichever is smaller. | ||
+ | |||
+ | <pre>typedef struct XIDGamepadCapabilities { | ||
+ | uint8_t bReportId; | ||
+ | uint8_t bLength; | ||
+ | <Data> | ||
+ | }</pre> | ||
+ | |||
+ | The data will be similar to the GET_REPORT, but instead of storing actual values, it will have bits set (1) where the bit is valid in the respective report. | ||
+ | If the bit is auto-generated, it will be cleared (0). | ||
+ | |||
+ | ===== SET_REPORT ===== | ||
+ | |||
+ | * bmRequestType: 0x21 | ||
+ | * bRequest: 9 | ||
+ | * wValue: 0x0200 | ||
+ | * wIndex: Interface number | ||
+ | * wLength: <length of report; typically 6> | ||
+ | |||
+ | |||
+ | * STALL if wValue not supported. | ||
+ | |||
+ | ====== Typical report ====== | ||
+ | |||
+ | <pre>typedef struct XIDGamepadReport { | ||
+ | uint8_t bReportId; | ||
+ | uint8_t bLength; | ||
+ | <Data> | ||
+ | }</pre> | ||
+ | |||
+ | ===== GET_REPORT ===== | ||
+ | |||
+ | * bmRequestType: 0xA1 | ||
+ | * bRequest: 1 | ||
+ | * wValue: 0x0100 | ||
+ | * wIndex: Interface number | ||
+ | * wLength: <length of report; typically 20> | ||
+ | |||
+ | |||
+ | * STALL if wValue not supported or if wLength is greater than report size. | ||
+ | * ACK if supported. | ||
+ | |||
+ | ====== Typical report ====== | ||
+ | |||
+ | <pre>typedef struct XIDGamepadOutputReport { | ||
+ | uint8_t report_id; //FIXME: is this correct? | ||
+ | uint8_t length; | ||
+ | <Data> | ||
+ | }</pre> | ||
+ | |||
+ | ==== Interrupt transfers ==== | ||
+ | |||
+ | Alternatively interrupt-in and interrupt-out transfers can be used for GET_REPORT and SET_REPORT respectively. | ||
+ | |||
+ | In case of the interrupt-in, there is another status which can occur now: | ||
+ | |||
+ | * NAK if supported but no changes since last ACK. | ||
+ | |||
== Standard Gamepads == | == Standard Gamepads == | ||
+ | |||
+ | === Microsoft Hardware Variants === | ||
+ | |||
+ | There are a few hardware re-designs of the Microsoft Gamepad. | ||
+ | |||
+ | {| class="wikitable" | ||
+ | !Controller Name | ||
+ | !Part Number | ||
+ | !Board Model | ||
+ | !Notes | ||
+ | !Datasheets | ||
+ | |- | ||
+ | |Xbox Game Controller (AKA "Duke") | ||
+ | |X08-17160 | ||
+ | |23-0819B | ||
+ | |Earliest known model{{FIXME|Reason=Small sample size (5), can't confirm}}. 3 IC's: Dedicated ST 92163/JFL Micro Controller, dedicated AT43USB401 USB Controller, 4 Channel Analog Mux LW052A. | ||
+ | |[https://archive.org/details/ST92163 ST 92163/JFL], AT43USB401{{FIXME|Reason=Can't find datasheet}}, [https://web.archive.org/web/20191230174412/https://www.rockbox.org/wiki/pub/Main/DataSheets/TexasInstrumentsLW052ADataSheet.pdf LW052A] | ||
+ | |- | ||
+ | |Xbox Game Controller (AKA "Duke") | ||
+ | |X08-17160 | ||
+ | |K023B121 | ||
+ | |Same as 23-0819B, but manufactured in China. Only Board Model that does not follow naming conventions. Hardware identical. Easily identified by a serial number that starts with "KD". | ||
+ | |[https://archive.org/details/ST92163 ST 92163/JFL], AT43USB401{{FIXME|Reason=Can't find datasheet}}, [https://web.archive.org/web/20191230174412/https://www.rockbox.org/wiki/pub/Main/DataSheets/TexasInstrumentsLW052ADataSheet.pdf LW052A] | ||
+ | |- | ||
+ | |Xbox Game Controller (AKA "Duke") | ||
+ | |X08-17160 | ||
+ | |23-0819C | ||
+ | |Last known Duke model.{{FIXME|Reason=Small sample size (5), can't confirm}}. Identical to 23-0819B in hardware, new silkscreen markings show this model is [https://en.wikipedia.org/wiki/UL_94 UL-94 V-0 compliant]. All boards after this are V-0 compliant. | ||
+ | |[https://archive.org/details/ST92163 ST 92163/JFL], AT43USB401{{FIXME|Reason=Can't find datasheet}}, [https://web.archive.org/web/20191230174412/https://www.rockbox.org/wiki/pub/Main/DataSheets/TexasInstrumentsLW052ADataSheet.pdf LW052A] | ||
+ | |- | ||
+ | |Xbox Game Controller (Looks like an S, with green Xbox jewel) | ||
+ | |X08-19383 | ||
+ | |23-0923A | ||
+ | |Japan and Australia exclusive model{{FIXME|Reason=Speculation, no hard source for this}}.Minification of "Duke" PCB Design. Has exact same IC's as the Duke, only in an S controller design. | ||
+ | |[https://archive.org/details/ST92163 ST 92163/JFL], AT43USB401{{FIXME|Reason=Can't find datasheet}}, [https://web.archive.org/web/20191230174412/https://www.rockbox.org/wiki/pub/Main/DataSheets/TexasInstrumentsLW052ADataSheet.pdf LW052A] | ||
+ | |- | ||
+ | |Xbox Controller S | ||
+ | |X08-69873 | ||
+ | |23-0923B | ||
+ | |Minification of "Duke" PCB Design. Has exact same IC's as the Duke, only in an S controller design | ||
+ | |[https://archive.org/details/ST92163 ST 92163/JFL], AT43USB401{{FIXME|Reason=Can't find datasheet}}, [https://web.archive.org/web/20191230174412/https://www.rockbox.org/wiki/pub/Main/DataSheets/TexasInstrumentsLW052ADataSheet.pdf LW052A] | ||
+ | |- | ||
+ | |Xbox Controller S | ||
+ | |X08-69873 | ||
+ | |23-0923H | ||
+ | |Entirely new PCB design. Single IC on the board, AT43USB355M-AC | ||
+ | |[https://archive.org/details/AT43USB355 AT43USB355M-AC] | ||
+ | |- | ||
+ | |Xbox Controller S | ||
+ | |X08-69873 | ||
+ | |23-0923I | ||
+ | |PCB Design almost exactly the same as H revision. Only difference is the IC is smaller: AT43USB353M-AC | ||
+ | |[https://archive.org/details/AT43USB353M-AC AT43USB353M-AC] | ||
+ | |} | ||
+ | |||
+ | There are also dedicated Part Numbers for color variants: | ||
+ | {| class="wikitable" | ||
+ | !Controller Part Number | ||
+ | !Controller Description | ||
+ | !Board Model | ||
+ | |- | ||
+ | |X02332-001 | ||
+ | |Crystal S Controller | ||
+ | |23-0923I | ||
+ | |- | ||
+ | |X09-64240-01 | ||
+ | |Transparent Green Controller | ||
+ | |23-0923I | ||
+ | |- | ||
+ | |X800679-100 | ||
+ | |Black S With Halo Jewel | ||
+ | |23-0923I | ||
+ | |} | ||
+ | |||
+ | === USB Descriptors === | ||
+ | |||
+ | See https://github.com/xboxdrv/xboxdrv/blob/stable/src/xpad_device.cpp for a list of devices. | ||
+ | |||
+ | ==== 23-0819B ==== | ||
+ | |||
+ | <pre> | ||
+ | Device Descriptor: | ||
+ | bLength 18 | ||
+ | bDescriptorType 1 | ||
+ | bcdUSB 1.10 | ||
+ | bDeviceClass 0 | ||
+ | bDeviceSubClass 0 | ||
+ | bDeviceProtocol 0 | ||
+ | bMaxPacketSize0 64 | ||
+ | idVendor 0x045e Microsoft Corp. | ||
+ | idProduct 0x0202 Xbox Controller | ||
+ | bcdDevice 1.00 | ||
+ | iManufacturer 0 | ||
+ | iProduct 0 | ||
+ | iSerial 0 | ||
+ | bNumConfigurations 1 | ||
+ | Configuration Descriptor: | ||
+ | bLength 9 | ||
+ | bDescriptorType 2 | ||
+ | wTotalLength 32 | ||
+ | bNumInterfaces 1 | ||
+ | bConfigurationValue 1 | ||
+ | iConfiguration 0 | ||
+ | bmAttributes 0x80 | ||
+ | (Bus Powered) | ||
+ | MaxPower 100mA | ||
+ | Interface Descriptor: | ||
+ | bLength 9 | ||
+ | bDescriptorType 4 | ||
+ | bInterfaceNumber 0 | ||
+ | bAlternateSetting 0 | ||
+ | bNumEndpoints 2 | ||
+ | bInterfaceClass 88 Xbox | ||
+ | bInterfaceSubClass 66 Controller | ||
+ | bInterfaceProtocol 0 | ||
+ | iInterface 0 | ||
+ | Endpoint Descriptor: | ||
+ | bLength 7 | ||
+ | bDescriptorType 5 | ||
+ | bEndpointAddress 0x82 EP 2 IN | ||
+ | bmAttributes 3 | ||
+ | Transfer Type Interrupt | ||
+ | Synch Type None | ||
+ | Usage Type Data | ||
+ | wMaxPacketSize 0x0020 1x 32 bytes | ||
+ | bInterval 4 | ||
+ | Endpoint Descriptor: | ||
+ | bLength 7 | ||
+ | bDescriptorType 5 | ||
+ | bEndpointAddress 0x02 EP 2 OUT | ||
+ | bmAttributes 3 | ||
+ | Transfer Type Interrupt | ||
+ | Synch Type None | ||
+ | Usage Type Data | ||
+ | wMaxPacketSize 0x0020 1x 32 bytes | ||
+ | bInterval 4 | ||
+ | </pre> | ||
+ | |||
+ | ==== K023B121 ==== | ||
+ | |||
+ | Identical to 23-0819B {{FIXME|Reason=Confirm with xid-dumper tool}} | ||
+ | |||
+ | ==== 23-0819C ==== | ||
+ | |||
+ | Identical to 23-0819B {{FIXME|Reason=Confirm with xid-dumper tool}} | ||
+ | |||
+ | ==== 23-0923A ==== | ||
+ | |||
+ | Changes from 23-0819B | ||
+ | |||
+ | <pre> | ||
+ | Device Descriptor: | ||
+ | idProduct: 0x0285 | ||
+ | </pre> | ||
+ | |||
+ | ==== 23-0923B ==== | ||
+ | |||
+ | {{FIXME|Reason=No Descriptor Dump}} | ||
+ | |||
+ | ==== 23-0923H ==== | ||
+ | |||
+ | Changes from 23-0819B | ||
+ | |||
+ | <pre> | ||
+ | Device Descriptor | ||
+ | bMaxPacketSize0: 8 | ||
+ | idProduct: 0x0289 | ||
+ | bcdDevice: 1.20 | ||
+ | Configuration Descriptor | ||
+ | Interface Descriptor | ||
+ | Endpoint Descriptor | ||
+ | bEndpointAddress: 0x81 | ||
+ | </pre> | ||
+ | |||
+ | ==== 23-0923I ==== | ||
+ | |||
+ | Changes from 23-0923H | ||
+ | |||
+ | <pre> | ||
+ | Device Descriptor | ||
+ | bcdDevice: 1.21 | ||
+ | </pre> | ||
+ | |||
+ | === Controller to Xbox === | ||
+ | |||
+ | 20 bytes | ||
+ | |||
+ | {| class="wikitable" | ||
+ | !Field | ||
+ | !Offset (Bytes) | ||
+ | !Mask | ||
+ | !Notes | ||
+ | |- | ||
+ | |{{input-dy+}} | ||
+ | |2 | ||
+ | |0x01 | ||
+ | | | ||
+ | |- | ||
+ | |{{input-dy-}} | ||
+ | |2 | ||
+ | |0x02 | ||
+ | | | ||
+ | |- | ||
+ | |{{input-dx-}} | ||
+ | |2 | ||
+ | |0x04 | ||
+ | | | ||
+ | |- | ||
+ | |{{input-dx+}} | ||
+ | |2 | ||
+ | |0x08 | ||
+ | | | ||
+ | |- | ||
+ | |{{input-start}} | ||
+ | |2 | ||
+ | |0x10 | ||
+ | | | ||
+ | |- | ||
+ | |{{input-back}} | ||
+ | |2 | ||
+ | |0x20 | ||
+ | | | ||
+ | |- | ||
+ | |{{input-ls}} | ||
+ | |2 | ||
+ | |0x40 | ||
+ | | | ||
+ | |- | ||
+ | |{{input-rs}} | ||
+ | |2 | ||
+ | |0x80 | ||
+ | | | ||
+ | |- | ||
+ | |{{input-a}} | ||
+ | |4 | ||
+ | |0xFF | ||
+ | |Button is analog | ||
+ | |- | ||
+ | |{{input-b}} | ||
+ | |5 | ||
+ | |0xFF | ||
+ | |Button is analog | ||
+ | |- | ||
+ | |{{input-x}} | ||
+ | |6 | ||
+ | |0xFF | ||
+ | |Button is analog | ||
+ | |- | ||
+ | |{{input-y}} | ||
+ | |7 | ||
+ | |0xFF | ||
+ | |Button is analog | ||
+ | |- | ||
+ | |{{input-black}} | ||
+ | |8 | ||
+ | |0xFF | ||
+ | |Button is analog | ||
+ | |- | ||
+ | |{{input-white}} | ||
+ | |9 | ||
+ | |0xFF | ||
+ | |Button is analog | ||
+ | |- | ||
+ | |{{input-lt}} | ||
+ | |10 | ||
+ | |0xFF | ||
+ | |Trigger is analog | ||
+ | |- | ||
+ | |{{input-rt}} | ||
+ | |11 | ||
+ | |0xFF | ||
+ | |Trigger is analog | ||
+ | |- | ||
+ | |{{input-lx}} | ||
+ | |12 | ||
+ | |0xFFFF | ||
+ | |Negative = Left; Positive = Right | ||
+ | |- | ||
+ | |{{input-ly}} | ||
+ | |14 | ||
+ | |0xFFFF | ||
+ | |Negative = Down; Positive = Up | ||
+ | |- | ||
+ | |{{input-rx}} | ||
+ | |16 | ||
+ | |0xFFFF | ||
+ | |Negative = Left; Positive = Right | ||
+ | |- | ||
+ | |{{input-ry}} | ||
+ | |18 | ||
+ | |0xFFFF | ||
+ | |Negative = Down; Positive = Up | ||
+ | |} | ||
+ | |||
+ | === Xbox to Controller === | ||
+ | |||
+ | 6 bytes | ||
+ | |||
+ | {| class="wikitable" | ||
+ | !Field | ||
+ | !Offset (Bytes) | ||
+ | !Mask | ||
+ | !Notes | ||
+ | |- | ||
+ | |Left actuator strength | ||
+ | |2 | ||
+ | |0xFFFF | ||
+ | | | ||
+ | |- | ||
+ | |Right actuator strength | ||
+ | |4 | ||
+ | |0xFFFF | ||
+ | | | ||
+ | |} | ||
+ | |||
+ | The Microsoft Controller S will not react to packets which don't have a value of 6 in the <code>length</code> field of the header. | ||
+ | The Fanatec Speedster 3 ForceShock will still react to those. Further testing is necessary with other gamepads. | ||
+ | |||
== Steering wheels == | == Steering wheels == | ||
+ | |||
+ | === MadCatz Wheel === | ||
+ | |||
+ | {{FIXME}} | ||
+ | |||
+ | === Fanatec Speedster 3 ForceShock === | ||
+ | |||
+ | ==== Pedals ==== | ||
+ | |||
+ | The Pedals are ''not'' a USB device. | ||
+ | |||
+ | Note that the cable going to the pedals is also ''not'' a USB port despite using the Xbox controller breakaway plug. | ||
+ | Likewise, plugging the pedals to a PC / Xbox won't provide a USB / XID (it is detected as garbage): | ||
+ | |||
+ | <pre> | ||
+ | new full-speed USB device number 14 using xhci_hcd | ||
+ | device descriptor read/64, error -71 | ||
+ | device descriptor read/64, error -71 | ||
+ | new full-speed USB device number 15 using xhci_hcd | ||
+ | device descriptor read/64, error -71 | ||
+ | device descriptor read/64, error -71 | ||
+ | new full-speed USB device number 16 using xhci_hcd | ||
+ | Device not responding to setup address. | ||
+ | Device not responding to setup address. | ||
+ | device not accepting address 16, error -71 | ||
+ | new full-speed USB device number 17 using xhci_hcd | ||
+ | Device not responding to setup address. | ||
+ | Device not responding to setup address. | ||
+ | device not accepting address 17, error -71 | ||
+ | unable to enumerate USB device | ||
+ | </pre> | ||
+ | |||
+ | ==== Internal HUB ==== | ||
+ | |||
+ | ===== USB Descriptors ===== | ||
+ | |||
+ | Power not connected, pedals not connected, not in Tuning mode: | ||
+ | |||
+ | <pre> | ||
+ | Device Descriptor: | ||
+ | bLength 18 | ||
+ | bDescriptorType 1 | ||
+ | bcdUSB 1.10 | ||
+ | bDeviceClass 9 Hub | ||
+ | bDeviceSubClass 0 | ||
+ | bDeviceProtocol 0 Full speed (or root) hub | ||
+ | bMaxPacketSize0 8 | ||
+ | idVendor 0x3767 | ||
+ | idProduct 0x0102 | ||
+ | bcdDevice 0.01 | ||
+ | iManufacturer 0 | ||
+ | iProduct 1 End | ||
+ | iSerial 0 | ||
+ | bNumConfigurations 1 | ||
+ | Configuration Descriptor: | ||
+ | bLength 9 | ||
+ | bDescriptorType 2 | ||
+ | wTotalLength 25 | ||
+ | bNumInterfaces 1 | ||
+ | bConfigurationValue 1 | ||
+ | iConfiguration 0 | ||
+ | bmAttributes 0xa0 | ||
+ | (Bus Powered) | ||
+ | Remote Wakeup | ||
+ | MaxPower 64mA | ||
+ | Interface Descriptor: | ||
+ | bLength 9 | ||
+ | bDescriptorType 4 | ||
+ | bInterfaceNumber 0 | ||
+ | bAlternateSetting 0 | ||
+ | bNumEndpoints 1 | ||
+ | bInterfaceClass 9 Hub | ||
+ | bInterfaceSubClass 0 | ||
+ | bInterfaceProtocol 0 Full speed (or root) hub | ||
+ | iInterface 0 | ||
+ | Endpoint Descriptor: | ||
+ | bLength 7 | ||
+ | bDescriptorType 5 | ||
+ | bEndpointAddress 0x81 EP 1 IN | ||
+ | bmAttributes 3 | ||
+ | Transfer Type Interrupt | ||
+ | Synch Type None | ||
+ | Usage Type Data | ||
+ | wMaxPacketSize 0x0001 1x 1 bytes | ||
+ | bInterval 255 | ||
+ | Hub Descriptor: | ||
+ | bLength 9 | ||
+ | bDescriptorType 41 | ||
+ | nNbrPorts 3 | ||
+ | wHubCharacteristic 0x000d | ||
+ | Per-port power switching | ||
+ | Compound device | ||
+ | Per-port overcurrent protection | ||
+ | bPwrOn2PwrGood 50 * 2 milli seconds | ||
+ | bHubContrCurrent 64 milli Ampere | ||
+ | DeviceRemovable 0x02 | ||
+ | PortPwrCtrlMask 0xff | ||
+ | Hub Port Status: | ||
+ | Port 1: 0000.0103 power enable connect | ||
+ | Port 2: 0000.0100 power | ||
+ | Port 3: 0000.0100 power | ||
+ | can't get debug descriptor: Resource temporarily unavailable | ||
+ | Device Status: 0x0003 | ||
+ | Self Powered | ||
+ | Remote Wakeup Enabled | ||
+ | </pre> | ||
+ | |||
+ | ==== Steering wheel (and Pedals) ==== | ||
+ | |||
+ | Always connected to port 1 of the internal HUB | ||
+ | |||
+ | ===== USB Descriptors ===== | ||
+ | |||
+ | <pre> | ||
+ | Device Descriptor: | ||
+ | bLength 18 | ||
+ | bDescriptorType 1 | ||
+ | bcdUSB 1.10 | ||
+ | bDeviceClass 0 | ||
+ | bDeviceSubClass 0 | ||
+ | bDeviceProtocol 0 | ||
+ | bMaxPacketSize0 8 | ||
+ | idVendor 0x3767 | ||
+ | idProduct 0x0101 | ||
+ | bcdDevice 2.80 | ||
+ | iManufacturer 0 | ||
+ | iProduct 0 | ||
+ | iSerial 0 | ||
+ | bNumConfigurations 1 | ||
+ | Configuration Descriptor: | ||
+ | bLength 9 | ||
+ | bDescriptorType 2 | ||
+ | wTotalLength 32 | ||
+ | bNumInterfaces 1 | ||
+ | bConfigurationValue 1 | ||
+ | iConfiguration 0 | ||
+ | bmAttributes 0x80 | ||
+ | (Bus Powered) | ||
+ | MaxPower 100mA | ||
+ | Interface Descriptor: | ||
+ | bLength 9 | ||
+ | bDescriptorType 4 | ||
+ | bInterfaceNumber 0 | ||
+ | bAlternateSetting 0 | ||
+ | bNumEndpoints 2 | ||
+ | bInterfaceClass 88 Xbox | ||
+ | bInterfaceSubClass 66 Controller | ||
+ | bInterfaceProtocol 0 | ||
+ | iInterface 0 | ||
+ | Endpoint Descriptor: | ||
+ | bLength 7 | ||
+ | bDescriptorType 5 | ||
+ | bEndpointAddress 0x82 EP 2 IN | ||
+ | bmAttributes 3 | ||
+ | Transfer Type Interrupt | ||
+ | Synch Type None | ||
+ | Usage Type Data | ||
+ | wMaxPacketSize 0x0020 1x 32 bytes | ||
+ | bInterval 4 | ||
+ | Endpoint Descriptor: | ||
+ | bLength 7 | ||
+ | bDescriptorType 5 | ||
+ | bEndpointAddress 0x02 EP 2 OUT | ||
+ | bmAttributes 3 | ||
+ | Transfer Type Interrupt | ||
+ | Synch Type None | ||
+ | Usage Type Data | ||
+ | wMaxPacketSize 0x0020 1x 32 bytes | ||
+ | bInterval 4 | ||
+ | can't get debug descriptor: Resource temporarily unavailable | ||
+ | Device Status: 0x0000 | ||
+ | (Bus Powered) | ||
+ | </pre> | ||
+ | |||
+ | == Arcade Sticks == | ||
+ | |||
+ | === Xbox TECMO Dead or Alive 3 ARCADE Stick Joystick Controller Japan === | ||
+ | |||
+ | {{FIXME}} | ||
+ | |||
+ | === Street Fighter 15th Anniversary Edition Arcade Stick === | ||
+ | |||
+ | {{FIXME}} | ||
+ | |||
+ | === Gamester Xbox Arcade Stick === | ||
+ | |||
+ | {{FIXME}} | ||
+ | |||
+ | === Nuby Xbox Fighter Arcade Stick === | ||
+ | |||
+ | {{FIXME}} | ||
+ | |||
+ | === Nuby Xbox Arcade Super Stick === | ||
+ | |||
+ | {{FIXME}} | ||
+ | |||
+ | The source image of the box and on device has item<nowiki>#:</nowiki>36020. | ||
+ | |||
+ | === Naki Ultimate Fighting Stick === | ||
+ | |||
+ | {{FIXME}} | ||
+ | |||
+ | [https://www.youtube.com/watch?v=4GphUsTzgds YouTube reviewer] report this joystick to have rumble support. | ||
+ | |||
== Light guns == | == Light guns == | ||
+ | |||
+ | Light guns use similar input and output reports to standard gamepads. Their bSubType is set to 0x50. They report where they are aimed in place of the left stick coordinates, and an extra bit at offset 3 in their input reports flags whether the light gun is currently pointed at the screen or not. Light guns may not function properly if they are not supplied with a video sync signal (they may not populate their input reports correctly, or even fail to enumerate as USB devices entirely). | ||
+ | |||
+ | === Controller to Xbox === | ||
+ | |||
+ | 20 bytes | ||
+ | |||
+ | {| class="wikitable" | ||
+ | !Field | ||
+ | !Offset (Bytes) | ||
+ | !Mask | ||
+ | !Notes | ||
+ | |- | ||
+ | |{{input-dy+}} | ||
+ | |2 | ||
+ | |0x01 | ||
+ | | | ||
+ | |- | ||
+ | |{{input-dy-}} | ||
+ | |2 | ||
+ | |0x02 | ||
+ | | | ||
+ | |- | ||
+ | |{{input-dx-}} | ||
+ | |2 | ||
+ | |0x04 | ||
+ | | | ||
+ | |- | ||
+ | |{{input-dx+}} | ||
+ | |2 | ||
+ | |0x08 | ||
+ | | | ||
+ | |- | ||
+ | |{{input-start}} | ||
+ | |2 | ||
+ | |0x10 | ||
+ | | | ||
+ | |- | ||
+ | |{{input-back}} | ||
+ | |2 | ||
+ | |0x20 | ||
+ | | | ||
+ | |- | ||
+ | |Light visible | ||
+ | |3 | ||
+ | |0x20 | ||
+ | |Set to 1 if the gun is pointed to a bright screen, 0 if no light visible. | ||
+ | |- | ||
+ | |Unknown 1 | ||
+ | |3 | ||
+ | |0x40 | ||
+ | |rowspan="2" | Light guns from different manufacturers include these two bits in their GET_CAPABILITIES reports, but they always seem to read back as 0 in GET_REPORT. | ||
+ | |- | ||
+ | |Unknown 2 | ||
+ | |3 | ||
+ | |0x80 | ||
+ | |- | ||
+ | |{{input-a}} Trigger | ||
+ | |4 | ||
+ | |0xFF | ||
+ | |rowspan="6" | Digital only, either 0 or 255 | ||
+ | |- | ||
+ | |{{input-b}} | ||
+ | |5 | ||
+ | |0xFF | ||
+ | |- | ||
+ | |{{input-x}} | ||
+ | |6 | ||
+ | |0xFF | ||
+ | |- | ||
+ | |{{input-y}} | ||
+ | |7 | ||
+ | |0xFF | ||
+ | |- | ||
+ | |{{input-black}} | ||
+ | |8 | ||
+ | |0xFF | ||
+ | |- | ||
+ | |{{input-white}} | ||
+ | |9 | ||
+ | |0xFF | ||
+ | |- | ||
+ | |{{input-lx}} | ||
+ | |12 | ||
+ | |0xFFFF | ||
+ | |rowspan="2" | Absolute position using the full stick range. | ||
+ | (0, 0) is the center of the screen and is also reported if the light gun is pointed off-screen. | ||
+ | |- | ||
+ | |{{input-ly}} | ||
+ | |14 | ||
+ | |0xFFFF | ||
+ | |} | ||
+ | |||
+ | === Xbox to Controller === | ||
+ | |||
+ | ==== Force feedback: wValue: 0x0200, wLength: 6 ==== | ||
+ | |||
+ | 6 bytes | ||
+ | |||
+ | {| class="wikitable" | ||
+ | !Field | ||
+ | !Offset (Bytes) | ||
+ | !Mask | ||
+ | !Notes | ||
+ | |- | ||
+ | |Actuator strength | ||
+ | |2 | ||
+ | |0xFFFF | ||
+ | | | ||
+ | |- | ||
+ | |(Unused) | ||
+ | |4 | ||
+ | |0x0000 | ||
+ | | | ||
+ | |} | ||
+ | |||
+ | The 4Gamers-branded gun (which appears to be sold by a number of different manufacturers) only reports it has the left actuator, however it only responds to force feedback output reports for the ''right'' actuator. Games appear to always enable both actuators, whether the controller reports it has both or not. | ||
+ | |||
+ | ==== Calibration: wValue: 0x0201, wLength: 10 ==== | ||
+ | |||
+ | 10 bytes | ||
+ | |||
+ | {| class="wikitable" | ||
+ | !Field | ||
+ | !Offset (Bytes) | ||
+ | !Mask | ||
+ | !Notes | ||
+ | |- | ||
+ | |Center calibration X | ||
+ | |2 | ||
+ | |0xFFFF | ||
+ | |rowspan="2"|Gun's reported value subtracted from (0,0) | ||
+ | |- | ||
+ | |Center calibration Y | ||
+ | |4 | ||
+ | |0xFFFF | ||
+ | |- | ||
+ | |Top left calibration X | ||
+ | |6 | ||
+ | |0xFFFF | ||
+ | |rowspan="2"|Gun's reported value subtracted from (-25000,25000) | ||
+ | |- | ||
+ | |Top left calibration Y | ||
+ | |8 | ||
+ | |0xFFFF | ||
+ | |} | ||
+ | |||
+ | Light guns are expected to handle their own calibration, i.e. the game will tell the gun the offsets between its reported position and the expected position and then expect the gun to offset and scale its output to compensate. The calibration process runs as follows: | ||
+ | |||
+ | # The game will first send a calibration report with all four offsets reset to (0, 0), (0, 0) to reset any offsets and scaling. | ||
+ | # The game will now display a target in the centre of the screen and ask you to shoot it. This will tell it how "wrong" the gun is when aimed at where it thinks (0, 0) should be on the screen. If the gun normally shoots slightly too high and further to the right, it might report (1000, 3000) for example. | ||
+ | # The game sends a calibration report to the gun to negate the offset, e.g. (-1000, -3000), (0, 0) using our example of (1000, 3000) from before. | ||
+ | # The game will now display a target in at (-25000, 25000) on the screen and ask you to shoot it. This will tell it how "wrong" the gun is when aimed at the top left of the screen. | ||
+ | # The coordinates received from the gun will be subtracted from the expected (-25000, 25000) and sent back to the gun in the second part of the calibration report along with the values previously determined for the centre position. If the first calibration was enough to adjust the screen offset we might have seen the "perfect" coordinates of (-25000, 25000) in which case the report would be (-1000, -3000), (0, 0) again. However, if our gun read the coordinates slightly closer the the middle of the screen at (-20000, 22000) then the report would be (-1000, -3000), (5000, -3000). | ||
+ | |||
+ | If the light gun does not handle the calibration output report then you will not be able to get past the calibration screen in ''The House of the Dead III''. | ||
+ | |||
+ | === EMS TopGun II === | ||
+ | |||
+ | ''This is an unlicensed / unofficial Xbox accessory.'' | ||
+ | |||
+ | The website for this product can be found at http://www.hkems.com/product/xbox/EMSTopGun2.htm | ||
+ | |||
+ | The gun presents itself as a standard Xbox gamepad. It uses a different USB descriptor for Xbox (X) and the other mode (P). | ||
+ | There is no internal hub in this device. | ||
+ | |||
+ | {| class="wikitable" | ||
+ | ! EMS TopGun II !! Xbox Gamepad !! Notes | ||
+ | |- | ||
+ | | Stick || {{input-d}} || | ||
+ | |- | ||
+ | | Trigger || {{input-a}} || rowspan="4" | Digital only, either 0 or 255 | ||
+ | |- | ||
+ | | Grip || {{input-b}} | ||
+ | |- | ||
+ | | A || {{input-x}} | ||
+ | |- | ||
+ | | B || {{input-y}} | ||
+ | |- | ||
+ | | START || {{input-start}} || | ||
+ | |- | ||
+ | | SE/BA || {{input-back}} || | ||
+ | |- | ||
+ | | Aim Left / Right || {{input-lx}} || rowspan="2" | Absolute position using the full stick range | ||
+ | |- | ||
+ | | Aim Up / Down || {{input-ly}} | ||
+ | |} | ||
+ | |||
+ | There is no right thumbstick, thumbstick presses, black/white button or trigger buttons (All of those read constant zeros). | ||
+ | |||
+ | ===== Turbo Mode ===== | ||
+ | |||
+ | * Turbo mode 0 keeps {{input-a}} pressed while trigger is held | ||
+ | * Turbo mode 1 toggles {{input-a}} rapidly while trigger is held | ||
+ | * Turbo mode 2 toggles {{input-a}} rapidly and once in a while {{input-b}} while trigger is held | ||
+ | |||
+ | ===== Force Feedback ===== | ||
+ | |||
+ | The upper part of the gun is moveable and should push back to simulate recoil (possibly hurting your thumb while you are using the stick). | ||
+ | I could not get the force feedback working, but I'm sure I've had it working in the past on PC.{{citation needed}} | ||
+ | |||
+ | ==== USB Descriptors ==== | ||
+ | |||
+ | This is the descriptor in the Xbox mode (X). | ||
+ | |||
+ | <pre> | ||
+ | Bus 003 Device 016: ID 0b9a:016b | ||
+ | Device Descriptor: | ||
+ | bLength 18 | ||
+ | bDescriptorType 1 | ||
+ | bcdUSB 1.10 | ||
+ | bDeviceClass 0 | ||
+ | bDeviceSubClass 0 | ||
+ | bDeviceProtocol 0 | ||
+ | bMaxPacketSize0 64 | ||
+ | idVendor 0x0b9a | ||
+ | idProduct 0x016b | ||
+ | bcdDevice 4.57 | ||
+ | iManufacturer 1 EMS̖E | ||
+ | iProduct 2 EMS TopGun | ||
+ | iSerial 0 | ||
+ | bNumConfigurations 1 | ||
+ | Configuration Descriptor: | ||
+ | bLength 9 | ||
+ | bDescriptorType 2 | ||
+ | wTotalLength 32 | ||
+ | bNumInterfaces 1 | ||
+ | bConfigurationValue 1 | ||
+ | iConfiguration 0 | ||
+ | bmAttributes 0x80 | ||
+ | (Bus Powered) | ||
+ | MaxPower 100mA | ||
+ | Interface Descriptor: | ||
+ | bLength 9 | ||
+ | bDescriptorType 4 | ||
+ | bInterfaceNumber 0 | ||
+ | bAlternateSetting 0 | ||
+ | bNumEndpoints 2 | ||
+ | bInterfaceClass 88 Xbox | ||
+ | bInterfaceSubClass 66 Controller | ||
+ | bInterfaceProtocol 0 | ||
+ | iInterface 0 | ||
+ | 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 4 | ||
+ | Endpoint Descriptor: | ||
+ | bLength 7 | ||
+ | bDescriptorType 5 | ||
+ | bEndpointAddress 0x02 EP 2 OUT | ||
+ | bmAttributes 3 | ||
+ | Transfer Type Interrupt | ||
+ | Synch Type None | ||
+ | Usage Type Data | ||
+ | wMaxPacketSize 0x0040 1x 64 bytes | ||
+ | bInterval 8 | ||
+ | can't get debug descriptor: Resource temporarily unavailable | ||
+ | Device Status: 0x0000 | ||
+ | (Bus Powered) | ||
+ | </pre> | ||
+ | |||
+ | === Joytech Sharp Shooter === | ||
+ | |||
+ | ''This is an unlicensed / unofficial Xbox accessory.'' | ||
+ | |||
+ | The third party light gun from Joytech reports itself as 2 devices and mentions pattent [http://www.google.com/patents/US6287198 US6287198] | ||
+ | it came with a detachable viewfinder scope without any magnification. a red dot apears in the viewfinder, its a reflection of a red led, powered by the gun over usb. | ||
+ | |||
+ | model numer: JS-901D | ||
+ | |||
+ | {| class="wikitable" | ||
+ | ! Joytech Sharp Shooter !! Xbox Gamepad !! Notes | ||
+ | |- | ||
+ | | Stick || {{input-d}} || | ||
+ | |- | ||
+ | | Trigger || {{input-a}} || rowspan="6" | Digital only, either 0 or 255 {{citation needed}} | ||
+ | |- | ||
+ | | B (Left side) || rowspan="3" | {{input-b}} | ||
+ | |- | ||
+ | | B (Right side) | ||
+ | |- | ||
+ | | B (Magazine button) | ||
+ | |- | ||
+ | | x || {{input-x}} | ||
+ | |- | ||
+ | | y || {{input-y}} | ||
+ | |- | ||
+ | | START || {{input-start}} || | ||
+ | |- | ||
+ | | BACK || {{input-back}} || | ||
+ | |- | ||
+ | | Aim Left / Right || {{input-lx}} || {{citation needed}} | ||
+ | |- | ||
+ | | Aim Up / Down || {{input-ly}} || {{citation needed}} | ||
+ | |} | ||
+ | |||
+ | There is no right thumbstick, thumbstick presses, black/white button or trigger buttons {{citation needed}} | ||
+ | |||
+ | ===== Fire/Reload Mode ===== | ||
+ | |||
+ | * Normal mode does nothing, normal operation | ||
+ | * Auto reload mode toggles {{input-b}} rapidly to rappidly reload {{citation needed}} | ||
+ | * Auto fire+reload mode toggles {{input-a}} + {{input-b}} rapidly {{citation needed}} | ||
+ | |||
+ | ==== USB Descriptors ==== | ||
+ | |||
+ | <pre> | ||
+ | |||
+ | Bus 003 Device 025: ID 1292:3006 Innomedia | ||
+ | Device Descriptor: | ||
+ | bLength 18 | ||
+ | bDescriptorType 1 | ||
+ | bcdUSB 1.10 | ||
+ | bDeviceClass 0 | ||
+ | bDeviceSubClass 0 | ||
+ | bDeviceProtocol 0 | ||
+ | bMaxPacketSize0 8 | ||
+ | idVendor 0x1292 Innomedia | ||
+ | idProduct 0x3006 | ||
+ | bcdDevice 1.50 | ||
+ | iManufacturer 0 | ||
+ | iProduct 0 | ||
+ | iSerial 0 | ||
+ | bNumConfigurations 1 | ||
+ | Configuration Descriptor: | ||
+ | bLength 9 | ||
+ | bDescriptorType 2 | ||
+ | wTotalLength 32 | ||
+ | bNumInterfaces 1 | ||
+ | bConfigurationValue 1 | ||
+ | iConfiguration 1 (error) | ||
+ | bmAttributes 0x80 | ||
+ | (Bus Powered) | ||
+ | MaxPower 100mA | ||
+ | Interface Descriptor: | ||
+ | bLength 9 | ||
+ | bDescriptorType 4 | ||
+ | bInterfaceNumber 0 | ||
+ | bAlternateSetting 0 | ||
+ | bNumEndpoints 2 | ||
+ | bInterfaceClass 88 Xbox | ||
+ | bInterfaceSubClass 66 Controller | ||
+ | bInterfaceProtocol 0 | ||
+ | iInterface 2 (error) | ||
+ | Endpoint Descriptor: | ||
+ | bLength 7 | ||
+ | bDescriptorType 5 | ||
+ | bEndpointAddress 0x81 EP 1 IN | ||
+ | bmAttributes 3 | ||
+ | Transfer Type Interrupt | ||
+ | Synch Type None | ||
+ | Usage Type Data | ||
+ | wMaxPacketSize 0x0020 1x 32 bytes | ||
+ | bInterval 4 | ||
+ | Endpoint Descriptor: | ||
+ | bLength 7 | ||
+ | bDescriptorType 5 | ||
+ | bEndpointAddress 0x02 EP 2 OUT | ||
+ | bmAttributes 3 | ||
+ | Transfer Type Interrupt | ||
+ | Synch Type None | ||
+ | Usage Type Data | ||
+ | wMaxPacketSize 0x0020 1x 32 bytes | ||
+ | bInterval 4 | ||
+ | |||
+ | Bus 003 Device 024: ID 1292:3006 Innomedia | ||
+ | Device Descriptor: | ||
+ | bLength 18 | ||
+ | bDescriptorType 1 | ||
+ | bcdUSB 1.10 | ||
+ | bDeviceClass 9 Hub | ||
+ | bDeviceSubClass 0 | ||
+ | bDeviceProtocol 0 Full speed (or root) hub | ||
+ | bMaxPacketSize0 8 | ||
+ | idVendor 0x1292 Innomedia | ||
+ | idProduct 0x3006 | ||
+ | bcdDevice 1.50 | ||
+ | iManufacturer 1 (c) 2004 R0R3 Inc. | ||
+ | iProduct 2 US Patent 6,287,198 | ||
+ | iSerial 0 | ||
+ | bNumConfigurations 1 | ||
+ | Configuration Descriptor: | ||
+ | bLength 9 | ||
+ | bDescriptorType 2 | ||
+ | wTotalLength 25 | ||
+ | bNumInterfaces 1 | ||
+ | bConfigurationValue 1 | ||
+ | iConfiguration 4 (c) R0R3 Devices Inc. US Patent 6,287,19Ē | ||
+ | bmAttributes 0xa0 | ||
+ | (Bus Powered) | ||
+ | Remote Wakeup | ||
+ | MaxPower 64mA | ||
+ | Interface Descriptor: | ||
+ | bLength 9 | ||
+ | bDescriptorType 4 | ||
+ | bInterfaceNumber 0 | ||
+ | bAlternateSetting 0 | ||
+ | bNumEndpoints 1 | ||
+ | bInterfaceClass 9 Hub | ||
+ | bInterfaceSubClass 0 | ||
+ | bInterfaceProtocol 0 Full speed (or root) hub | ||
+ | iInterface 5 (error) | ||
+ | Endpoint Descriptor: | ||
+ | bLength 7 | ||
+ | bDescriptorType 5 | ||
+ | bEndpointAddress 0x81 EP 1 IN | ||
+ | bmAttributes 3 | ||
+ | Transfer Type Interrupt | ||
+ | Synch Type None | ||
+ | Usage Type Data | ||
+ | wMaxPacketSize 0x0001 1x 1 bytes | ||
+ | bInterval 255 | ||
+ | Hub Descriptor: | ||
+ | bLength 9 | ||
+ | bDescriptorType 41 | ||
+ | nNbrPorts 3 | ||
+ | wHubCharacteristic 0x000d | ||
+ | Per-port power switching | ||
+ | Compound device | ||
+ | Per-port overcurrent protection | ||
+ | bPwrOn2PwrGood 32 * 2 milli seconds | ||
+ | bHubContrCurrent 64 milli Ampere | ||
+ | DeviceRemovable 0x02 | ||
+ | PortPwrCtrlMask 0x0e | ||
+ | Hub Port Status: | ||
+ | Port 1: 0000.0103 power enable connect | ||
+ | Port 2: 0000.0100 power | ||
+ | Port 3: 0100.0100 power | ||
+ | Device Status: 0x0000 | ||
+ | (Bus Powered) | ||
+ | </pre> | ||
+ | |||
+ | == Microphones == | ||
+ | |||
+ | === Xbox Communicator === | ||
+ | |||
+ | ==== USB Descriptor ==== | ||
+ | |||
+ | <pre> | ||
+ | Device Descriptor: | ||
+ | bLength 18 | ||
+ | bDescriptorType 1 | ||
+ | bcdUSB 1.10 | ||
+ | bDeviceClass 0 | ||
+ | bDeviceSubClass 0 | ||
+ | bDeviceProtocol 0 | ||
+ | bMaxPacketSize0 8 | ||
+ | idVendor 0x045e Microsoft Corp. | ||
+ | idProduct 0x0283 Xbox Communicator | ||
+ | bcdDevice 1.58 | ||
+ | iManufacturer 0 | ||
+ | iProduct 0 | ||
+ | iSerial 0 | ||
+ | bNumConfigurations 1 | ||
+ | Configuration Descriptor: | ||
+ | bLength 9 | ||
+ | bDescriptorType 2 | ||
+ | wTotalLength 0x002d | ||
+ | bNumInterfaces 2 | ||
+ | bConfigurationValue 1 | ||
+ | iConfiguration 0 | ||
+ | bmAttributes 0x80 | ||
+ | (Bus Powered) | ||
+ | MaxPower 100mA | ||
+ | Interface Descriptor: | ||
+ | bLength 9 | ||
+ | bDescriptorType 4 | ||
+ | bInterfaceNumber 0 | ||
+ | bAlternateSetting 0 | ||
+ | bNumEndpoints 1 | ||
+ | bInterfaceClass 120 | ||
+ | bInterfaceSubClass 0 | ||
+ | bInterfaceProtocol 0 | ||
+ | iInterface 0 | ||
+ | Endpoint Descriptor: | ||
+ | bLength 9 | ||
+ | bDescriptorType 5 | ||
+ | bEndpointAddress 0x04 EP 4 OUT | ||
+ | bmAttributes 5 | ||
+ | Transfer Type Isochronous | ||
+ | Synch Type Asynchronous | ||
+ | Usage Type Data | ||
+ | wMaxPacketSize 0x0030 1x 48 bytes | ||
+ | bInterval 1 | ||
+ | bRefresh 0 | ||
+ | bSynchAddress 0 | ||
+ | Interface Descriptor: | ||
+ | bLength 9 | ||
+ | bDescriptorType 4 | ||
+ | bInterfaceNumber 1 | ||
+ | bAlternateSetting 0 | ||
+ | bNumEndpoints 1 | ||
+ | bInterfaceClass 120 | ||
+ | bInterfaceSubClass 0 | ||
+ | bInterfaceProtocol 0 | ||
+ | iInterface 0 | ||
+ | Endpoint Descriptor: | ||
+ | bLength 9 | ||
+ | bDescriptorType 5 | ||
+ | bEndpointAddress 0x85 EP 5 IN | ||
+ | bmAttributes 5 | ||
+ | Transfer Type Isochronous | ||
+ | Synch Type Asynchronous | ||
+ | Usage Type Data | ||
+ | wMaxPacketSize 0x0030 1x 48 bytes | ||
+ | bInterval 1 | ||
+ | bRefresh 0 | ||
+ | bSynchAddress 0 | ||
+ | </pre> | ||
+ | |||
+ | === Xbox Karaoke === | ||
+ | |||
+ | ==== USB Descriptor ==== | ||
+ | |||
+ | <pre> | ||
+ | Device Descriptor: | ||
+ | bLength 18 | ||
+ | bDescriptorType 1 | ||
+ | bcdUSB 1.10 | ||
+ | bDeviceClass 0 | ||
+ | bDeviceSubClass 0 | ||
+ | bDeviceProtocol 0 | ||
+ | bMaxPacketSize0 8 | ||
+ | idVendor 0x045e Microsoft Corp. | ||
+ | idProduct 0x0501 | ||
+ | bcdDevice 1.00 | ||
+ | iManufacturer 1 Licensed 3PP Vendor | ||
+ | iProduct 2 Karaoke Microphone Module | ||
+ | iSerial 0 | ||
+ | bNumConfigurations 1 | ||
+ | Configuration Descriptor: | ||
+ | bLength 9 | ||
+ | bDescriptorType 2 | ||
+ | wTotalLength 0x001b | ||
+ | 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 121 | ||
+ | bInterfaceSubClass 1 | ||
+ | bInterfaceProtocol 0 | ||
+ | iInterface 0 | ||
+ | Endpoint Descriptor: | ||
+ | bLength 9 | ||
+ | bDescriptorType 5 | ||
+ | bEndpointAddress 0x81 EP 1 IN | ||
+ | bmAttributes 5 | ||
+ | Transfer Type Isochronous | ||
+ | Synch Type Asynchronous | ||
+ | Usage Type Data | ||
+ | wMaxPacketSize 0x0060 1x 96 bytes | ||
+ | bInterval 1 | ||
+ | bRefresh 0 | ||
+ | bSynchAddress 0 | ||
+ | </pre> | ||
+ | |||
+ | == Steel Battalion Controller == | ||
+ | |||
+ | [[File:SBC.jpg|thumb|200px|Steel Battalion Controller Layout]] | ||
+ | |||
+ | === USB Descriptors === | ||
+ | |||
+ | <pre> | ||
+ | Device Descriptor: | ||
+ | bLength 18 | ||
+ | bDescriptorType 1 | ||
+ | bcdUSB 1.10 | ||
+ | bDeviceClass 0 (Defined at Interface level) | ||
+ | bDeviceSubClass 0 | ||
+ | bDeviceProtocol 0 | ||
+ | bMaxPacketSize0 8 | ||
+ | idVendor 0x0a7b | ||
+ | idProduct 0xd000 | ||
+ | bcdDevice 1.00 | ||
+ | iManufacturer 0 | ||
+ | iProduct 0 | ||
+ | iSerial 0 | ||
+ | bNumConfigurations 1 | ||
+ | Configuration Descriptor: | ||
+ | bLength 9 | ||
+ | bDescriptorType 2 | ||
+ | wTotalLength 32 | ||
+ | bNumInterfaces 1 | ||
+ | bConfigurationValue 1 | ||
+ | iConfiguration 0 | ||
+ | bmAttributes 0x80 | ||
+ | (Bus Powered) | ||
+ | MaxPower 500mA | ||
+ | Interface Descriptor: | ||
+ | bLength 9 | ||
+ | bDescriptorType 4 | ||
+ | bInterfaceNumber 0 | ||
+ | bAlternateSetting 0 | ||
+ | bNumEndpoints 2 | ||
+ | bInterfaceClass 88 Xbox | ||
+ | bInterfaceSubClass 66 Controller | ||
+ | bInterfaceProtocol 0 | ||
+ | iInterface 0 | ||
+ | Endpoint Descriptor: | ||
+ | bLength 7 | ||
+ | bDescriptorType 5 | ||
+ | bEndpointAddress 0x82 EP 2 IN | ||
+ | bmAttributes 3 | ||
+ | Transfer Type Interrupt | ||
+ | Synch Type None | ||
+ | Usage Type Data | ||
+ | wMaxPacketSize 0x0020 1x 32 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 0x0020 1x 32 bytes | ||
+ | bInterval 4 | ||
+ | </pre> | ||
+ | |||
+ | === Controller to Xbox === | ||
+ | |||
+ | From http://steelbattalionnet.codeplex.com/SourceControl/latest#SBC/SteelBattalionController.cs | ||
+ | |||
+ | 26 bytes | ||
+ | |||
+ | {| class="wikitable" | ||
+ | !Field | ||
+ | !Offset (Bytes) | ||
+ | !Mask | ||
+ | !Notes | ||
+ | |- | ||
+ | |RightJoyMainWeapon | ||
+ | |2 | ||
+ | |0x01 | ||
+ | | | ||
+ | |- | ||
+ | |RightJoyFire | ||
+ | |2 | ||
+ | |0x02 | ||
+ | | | ||
+ | |- | ||
+ | |RightJoyLockOn | ||
+ | |2 | ||
+ | |0x04 | ||
+ | | | ||
+ | |- | ||
+ | |Eject | ||
+ | |2 | ||
+ | |0x08 | ||
+ | | | ||
+ | |- | ||
+ | |CockpitHatch | ||
+ | |2 | ||
+ | |0x10 | ||
+ | | | ||
+ | |- | ||
+ | |Ignition | ||
+ | |2 | ||
+ | |0x20 | ||
+ | | | ||
+ | |- | ||
+ | |Start | ||
+ | |2 | ||
+ | |0x40 | ||
+ | | | ||
+ | |- | ||
+ | |MultiMonOpenClose | ||
+ | |2 | ||
+ | |0x80 | ||
+ | | | ||
+ | |- | ||
+ | |MultiMonMapZoomInOut | ||
+ | |3 | ||
+ | |0x01 | ||
+ | | | ||
+ | |- | ||
+ | |MultiMonModeSelect | ||
+ | |3 | ||
+ | |0x02 | ||
+ | | | ||
+ | |- | ||
+ | |MultiMonSubMonitor | ||
+ | |3 | ||
+ | |0x04 | ||
+ | | | ||
+ | |- | ||
+ | |MainMonZoomIn | ||
+ | |3 | ||
+ | |0x08 | ||
+ | | | ||
+ | |- | ||
+ | |MainMonZoomOut | ||
+ | |3 | ||
+ | |0x10 | ||
+ | | | ||
+ | |- | ||
+ | |FunctionFSS | ||
+ | |3 | ||
+ | |0x20 | ||
+ | | | ||
+ | |- | ||
+ | |FunctionManipulator | ||
+ | |3 | ||
+ | |0x40 | ||
+ | | | ||
+ | |- | ||
+ | |FunctionLineColorChange | ||
+ | |3 | ||
+ | |0x80 | ||
+ | | | ||
+ | |- | ||
+ | |Washing | ||
+ | |4 | ||
+ | |0x01 | ||
+ | | | ||
+ | |- | ||
+ | |Extinguisher | ||
+ | |4 | ||
+ | |0x02 | ||
+ | | | ||
+ | |- | ||
+ | |Chaff | ||
+ | |4 | ||
+ | |0x04 | ||
+ | | | ||
+ | |- | ||
+ | |FunctionTankDetach | ||
+ | |4 | ||
+ | |0x08 | ||
+ | | | ||
+ | |- | ||
+ | |FunctionOverride | ||
+ | |4 | ||
+ | |0x10 | ||
+ | | | ||
+ | |- | ||
+ | |FunctionNightScope | ||
+ | |4 | ||
+ | |0x20 | ||
+ | | | ||
+ | |- | ||
+ | |FunctionF1 | ||
+ | |4 | ||
+ | |0x40 | ||
+ | | | ||
+ | |- | ||
+ | |FunctionF2 | ||
+ | |4 | ||
+ | |0x80 | ||
+ | | | ||
+ | |- | ||
+ | |FunctionF3 | ||
+ | |5 | ||
+ | |0x01 | ||
+ | | | ||
+ | |- | ||
+ | |WeaponConMain | ||
+ | |5 | ||
+ | |0x02 | ||
+ | | | ||
+ | |- | ||
+ | |WeaponConSub | ||
+ | |5 | ||
+ | |0x04 | ||
+ | | | ||
+ | |- | ||
+ | |WeaponConMagazine | ||
+ | |5 | ||
+ | |0x08 | ||
+ | | | ||
+ | |- | ||
+ | |Comm1 | ||
+ | |5 | ||
+ | |0x10 | ||
+ | | | ||
+ | |- | ||
+ | |Comm2 | ||
+ | |5 | ||
+ | |0x20 | ||
+ | | | ||
+ | |- | ||
+ | |Comm3 | ||
+ | |5 | ||
+ | |0x40 | ||
+ | | | ||
+ | |- | ||
+ | |Comm4 | ||
+ | |5 | ||
+ | |0x80 | ||
+ | | | ||
+ | |- | ||
+ | |Comm5 | ||
+ | |6 | ||
+ | |0x01 | ||
+ | | | ||
+ | |- | ||
+ | |LeftJoySightChange | ||
+ | |6 | ||
+ | |0x02 | ||
+ | | | ||
+ | |- | ||
+ | |ToggleFilterControl | ||
+ | |6 | ||
+ | |0x04 | ||
+ | | | ||
+ | |- | ||
+ | |ToggleOxygenSupply | ||
+ | |6 | ||
+ | |0x08 | ||
+ | | | ||
+ | |- | ||
+ | |ToggleFuelFlowRate | ||
+ | |6 | ||
+ | |0x10 | ||
+ | | | ||
+ | |- | ||
+ | |ToggleBuffreMaterial | ||
+ | |6 | ||
+ | |0x20 | ||
+ | | | ||
+ | |- | ||
+ | |ToggleVTLocation | ||
+ | |6 | ||
+ | |0x40 | ||
+ | | | ||
+ | |- | ||
+ | | | ||
+ | |6 | ||
+ | |0x80 | ||
+ | | | ||
+ | |- | ||
+ | | | ||
+ | |7 | ||
+ | |0xFF | ||
+ | | | ||
+ | |- | ||
+ | | | ||
+ | |8 | ||
+ | |0xFF | ||
+ | | | ||
+ | |- | ||
+ | |AimingX | ||
+ | |9 | ||
+ | |0xFFFF | ||
+ | |"Aiming Lever" joystick on the right. Unsigned X Axis value: 0 (Left) to 0xFFFF (Right). | ||
+ | |- | ||
+ | |AimingY | ||
+ | |11 | ||
+ | |0xFFFF | ||
+ | |"Aiming Lever" joystick on the right. Unsigned Y Axis value: 0 (Top) to 0xFFFF (Bottom). | ||
+ | |- | ||
+ | |RotationLever | ||
+ | |13 | ||
+ | |0xFFFF | ||
+ | |"Rotation Lever" joystick on the left. Signed X Axis value: -0x7FFF (Left) to 0x7FFF (Right) | ||
+ | |- | ||
+ | |SightChangeX | ||
+ | |15 | ||
+ | |0xFFFF | ||
+ | |"Sight Change" analog stick on the "Rotation Lever" joystick. Signed X Axis value: -0x7FFF (Left) to 0x7FFF (Right) | ||
+ | |- | ||
+ | |SightChangeY | ||
+ | |17 | ||
+ | |0xFFFF | ||
+ | |"Sight Change" analog stick on the "Rotation Lever" joystick. Signed Y Axis value: -0x7FFF (Top) to 0x7FFF (Bottom) | ||
+ | |- | ||
+ | |LeftPedal | ||
+ | |19 | ||
+ | |0xFFFF | ||
+ | | | ||
+ | |- | ||
+ | |MiddlePedal | ||
+ | |21 | ||
+ | |0xFFFF | ||
+ | | | ||
+ | |- | ||
+ | |RightPedal | ||
+ | |23 | ||
+ | |0xFFFF | ||
+ | | | ||
+ | |- | ||
+ | |TunerDial | ||
+ | |24 | ||
+ | |0x0F | ||
+ | |The 9 o'clock postion is 0, and the 6 o'clock position is 12. The blank area between the 6 and 9 o'clock positions is 13, 14, and 15 clockwise. | ||
+ | |- | ||
+ | | | ||
+ | |24 | ||
+ | |0xF0 | ||
+ | | | ||
+ | |- | ||
+ | |GearLever | ||
+ | |25 | ||
+ | |0xFF | ||
+ | |The gear lever on the left block. R = -2, N = -1, 1st = 1, 2nd = 2, 3rd = 3, 4th = 4, 5th = 5. If the shifter is between two gears this value will be 0. | ||
+ | |} | ||
+ | |||
+ | === Xbox to Controller === | ||
+ | |||
+ | From http://steelbattalionnet.codeplex.com/SourceControl/latest#SBC/SteelBattalionController.cs | ||
+ | |||
+ | 22 bytes | ||
+ | |||
+ | {| class="wikitable" | ||
+ | !Field | ||
+ | !Offset (Bytes) | ||
+ | !Mask | ||
+ | !Notes | ||
+ | |- | ||
+ | |Start | ||
+ | |0 | ||
+ | |0x00 | ||
+ | |This will always be 0x00 | ||
+ | |- | ||
+ | |bLen | ||
+ | |1 | ||
+ | |0x16 | ||
+ | |This will always be 0x16 (22 bytes) | ||
+ | |- | ||
+ | |EmergencyEject | ||
+ | |2 | ||
+ | |0x0F | ||
+ | | | ||
+ | |- | ||
+ | |CockpitHatch | ||
+ | |2 | ||
+ | |0xF0 | ||
+ | | | ||
+ | |- | ||
+ | |Ignition | ||
+ | |3 | ||
+ | |0x0F | ||
+ | | | ||
+ | |- | ||
+ | |Start | ||
+ | |3 | ||
+ | |0xF0 | ||
+ | | | ||
+ | |- | ||
+ | |OpenClose | ||
+ | |4 | ||
+ | |0x0F | ||
+ | | | ||
+ | |- | ||
+ | |MapZoomInOut | ||
+ | |4 | ||
+ | |0xF0 | ||
+ | | | ||
+ | |- | ||
+ | |ModeSelect | ||
+ | |5 | ||
+ | |0x0F | ||
+ | | | ||
+ | |- | ||
+ | |SubMonitorModeSelect | ||
+ | |5 | ||
+ | |0xF0 | ||
+ | | | ||
+ | |- | ||
+ | |MainMonitorZoomIn | ||
+ | |6 | ||
+ | |0x0F | ||
+ | | | ||
+ | |- | ||
+ | |MainMonitorZoomOut | ||
+ | |6 | ||
+ | |0xF0 | ||
+ | | | ||
+ | |- | ||
+ | |ForecastShootingSystem | ||
+ | |7 | ||
+ | |0x0F | ||
+ | | | ||
+ | |- | ||
+ | |Manipulator | ||
+ | |7 | ||
+ | |0xF0 | ||
+ | | | ||
+ | |- | ||
+ | |LineColorChange | ||
+ | |8 | ||
+ | |0x0F | ||
+ | | | ||
+ | |- | ||
+ | |Washing | ||
+ | |8 | ||
+ | |0xF0 | ||
+ | | | ||
+ | |- | ||
+ | |Extinguisher | ||
+ | |9 | ||
+ | |0x0F | ||
+ | | | ||
+ | |- | ||
+ | |Chaff | ||
+ | |9 | ||
+ | |0xF0 | ||
+ | | | ||
+ | |- | ||
+ | |TankDetach | ||
+ | |10 | ||
+ | |0x0F | ||
+ | | | ||
+ | |- | ||
+ | |Override | ||
+ | |10 | ||
+ | |0xF0 | ||
+ | | | ||
+ | |- | ||
+ | |NightScope | ||
+ | |11 | ||
+ | |0x0F | ||
+ | | | ||
+ | |- | ||
+ | |F1 | ||
+ | |11 | ||
+ | |0xF0 | ||
+ | | | ||
+ | |- | ||
+ | |F2 | ||
+ | |12 | ||
+ | |0x0F | ||
+ | | | ||
+ | |- | ||
+ | |F3 | ||
+ | |12 | ||
+ | |0xF0 | ||
+ | | | ||
+ | |- | ||
+ | |MainWeaponControl | ||
+ | |13 | ||
+ | |0x0F | ||
+ | | | ||
+ | |- | ||
+ | |SubWeaponControl | ||
+ | |13 | ||
+ | |0xF0 | ||
+ | | | ||
+ | |- | ||
+ | |MagazineChange | ||
+ | |14 | ||
+ | |0x0F | ||
+ | | | ||
+ | |- | ||
+ | |Comm1 | ||
+ | |14 | ||
+ | |0xF0 | ||
+ | | | ||
+ | |- | ||
+ | |Comm2 | ||
+ | |15 | ||
+ | |0x0F | ||
+ | | | ||
+ | |- | ||
+ | |Comm3 | ||
+ | |15 | ||
+ | |0xF0 | ||
+ | | | ||
+ | |- | ||
+ | |Comm4 | ||
+ | |16 | ||
+ | |0x0F | ||
+ | | | ||
+ | |- | ||
+ | |Comm5 | ||
+ | |16 | ||
+ | |0xF0 | ||
+ | | | ||
+ | |- | ||
+ | | | ||
+ | |17 | ||
+ | |0x0F | ||
+ | | | ||
+ | |- | ||
+ | |GearR | ||
+ | |17 | ||
+ | |0xF0 | ||
+ | | | ||
+ | |- | ||
+ | |GearN | ||
+ | |18 | ||
+ | |0x0F | ||
+ | | | ||
+ | |- | ||
+ | |Gear1 | ||
+ | |18 | ||
+ | |0xF0 | ||
+ | | | ||
+ | |- | ||
+ | |Gear2 | ||
+ | |19 | ||
+ | |0x0F | ||
+ | | | ||
+ | |- | ||
+ | |Gear3 | ||
+ | |19 | ||
+ | |0xF0 | ||
+ | | | ||
+ | |- | ||
+ | |Gear4 | ||
+ | |20 | ||
+ | |0x0F | ||
+ | | | ||
+ | |- | ||
+ | |Gear5 | ||
+ | |20 | ||
+ | |0xF0 | ||
+ | | | ||
+ | |- | ||
+ | |Unused? | ||
+ | |21 | ||
+ | | | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | == SEGA Chihiro Baseboard == | ||
+ | |||
+ | Contains 2 USB devices which directly attach to USB ports 3 & 4 (player 0, 1) | ||
+ | |||
+ | === USB Descriptors === | ||
+ | |||
+ | <pre> | ||
+ | [Device Descriptor] | ||
+ | ---------------------------------------------- | ||
+ | Length = 18 | ||
+ | DescriptorType = 0x01 | ||
+ | USB version = 1.00 | ||
+ | Vendor:Product = 0ca3:0003 | ||
+ | MaxPacketSize0 = 64 | ||
+ | NumConfigurations = 1 | ||
+ | Device version = 1.03 | ||
+ | Device Class:SubClass:Protocol = 60:01:00 | ||
+ | |||
+ | [Configuration Descriptor] | ||
+ | ---------------------------------------------- | ||
+ | Length = 9 | ||
+ | DescriptorType = 02 | ||
+ | wTotalLength = 60 | ||
+ | bNumInterfaces = 1 | ||
+ | bConfigurationValue = 1 | ||
+ | iConfiguration = 0 | ||
+ | bmAttributes = 0x80 | ||
+ | MaxPower = 150 | ||
+ | |||
+ | [Interface Descriptor] | ||
+ | ---------------------------------------------- | ||
+ | Length = 9 | ||
+ | DescriptorType = 04 | ||
+ | bInterfaceNumber = 0 | ||
+ | bAlternateSetting = 0 | ||
+ | bNumEndpoints = 6 | ||
+ | bInterfaceClass = 0xff | ||
+ | bInterfaceSubClass = 0x00 | ||
+ | bInterfaceProtocol = 0x00 | ||
+ | iInterface = 0 | ||
+ | |||
+ | [Endpoint Descriptor] | ||
+ | ---------------------------------------------- | ||
+ | Length = 7 | ||
+ | DescriptorType = 05 | ||
+ | bEndpointAddress = 0x01 | ||
+ | bmAttributes = 0x02 | ||
+ | wMaxPacketSize = 64 | ||
+ | bInterval = 0 | ||
+ | bRefresh = 7 | ||
+ | bSynchAddress = 5 | ||
+ | |||
+ | [Endpoint Descriptor] | ||
+ | ---------------------------------------------- | ||
+ | Length = 7 | ||
+ | DescriptorType = 05 | ||
+ | bEndpointAddress = 0x02 | ||
+ | bmAttributes = 0x02 | ||
+ | wMaxPacketSize = 64 | ||
+ | bInterval = 0 | ||
+ | bRefresh = 7 | ||
+ | bSynchAddress = 5 | ||
+ | |||
+ | [Endpoint Descriptor] | ||
+ | ---------------------------------------------- | ||
+ | Length = 7 | ||
+ | DescriptorType = 05 | ||
+ | bEndpointAddress = 0x03 | ||
+ | bmAttributes = 0x02 | ||
+ | wMaxPacketSize = 64 | ||
+ | bInterval = 0 | ||
+ | bRefresh = 7 | ||
+ | bSynchAddress = 5 | ||
+ | |||
+ | [Endpoint Descriptor] | ||
+ | ---------------------------------------------- | ||
+ | Length = 7 | ||
+ | DescriptorType = 05 | ||
+ | bEndpointAddress = 0x81 | ||
+ | bmAttributes = 0x02 | ||
+ | wMaxPacketSize = 64 | ||
+ | bInterval = 0 | ||
+ | bRefresh = 7 | ||
+ | bSynchAddress = 5 | ||
+ | |||
+ | [Endpoint Descriptor] | ||
+ | ---------------------------------------------- | ||
+ | Length = 7 | ||
+ | DescriptorType = 05 | ||
+ | bEndpointAddress = 0x82 | ||
+ | bmAttributes = 0x02 | ||
+ | wMaxPacketSize = 64 | ||
+ | bInterval = 0 | ||
+ | bRefresh = 7 | ||
+ | bSynchAddress = 5 | ||
+ | |||
+ | [Endpoint Descriptor] | ||
+ | ---------------------------------------------- | ||
+ | Length = 7 | ||
+ | DescriptorType = 05 | ||
+ | bEndpointAddress = 0x83 | ||
+ | bmAttributes = 0x02 | ||
+ | wMaxPacketSize = 64 | ||
+ | bInterval = 0 | ||
+ | bRefresh = 0 | ||
+ | bSynchAddress = 0 | ||
+ | </pre> | ||
+ | <pre> | ||
+ | [Device Descriptor] | ||
+ | ---------------------------------------------- | ||
+ | Length = 18 | ||
+ | DescriptorType = 0x01 | ||
+ | USB version = 1.00 | ||
+ | Vendor:Product = 0ca3:0002 | ||
+ | MaxPacketSize0 = 64 | ||
+ | NumConfigurations = 1 | ||
+ | Device version = 1.03 | ||
+ | Device Class:SubClass:Protocol = 60:00:00 | ||
+ | |||
+ | [Configuration Descriptor] | ||
+ | ---------------------------------------------- | ||
+ | Length = 9 | ||
+ | DescriptorType = 02 | ||
+ | wTotalLength = 88 | ||
+ | bNumInterfaces = 1 | ||
+ | bConfigurationValue = 1 | ||
+ | iConfiguration = 0 | ||
+ | bmAttributes = 0x80 | ||
+ | MaxPower = 150 | ||
+ | |||
+ | [Interface Descriptor] | ||
+ | ---------------------------------------------- | ||
+ | Length = 9 | ||
+ | DescriptorType = 04 | ||
+ | bInterfaceNumber = 0 | ||
+ | bAlternateSetting = 0 | ||
+ | bNumEndpoints = 10 | ||
+ | bInterfaceClass = 0xff | ||
+ | bInterfaceSubClass = 0x00 | ||
+ | bInterfaceProtocol = 0x00 | ||
+ | iInterface = 0 | ||
+ | |||
+ | [Endpoint Descriptor] | ||
+ | ---------------------------------------------- | ||
+ | Length = 7 | ||
+ | DescriptorType = 05 | ||
+ | bEndpointAddress = 0x01 | ||
+ | bmAttributes = 0x02 | ||
+ | wMaxPacketSize = 64 | ||
+ | bInterval = 0 | ||
+ | bRefresh = 7 | ||
+ | bSynchAddress = 5 | ||
+ | |||
+ | [Endpoint Descriptor] | ||
+ | ---------------------------------------------- | ||
+ | Length = 7 | ||
+ | DescriptorType = 05 | ||
+ | bEndpointAddress = 0x02 | ||
+ | bmAttributes = 0x02 | ||
+ | wMaxPacketSize = 64 | ||
+ | bInterval = 0 | ||
+ | bRefresh = 7 | ||
+ | bSynchAddress = 5 | ||
+ | |||
+ | [Endpoint Descriptor] | ||
+ | ---------------------------------------------- | ||
+ | Length = 7 | ||
+ | DescriptorType = 05 | ||
+ | bEndpointAddress = 0x03 | ||
+ | bmAttributes = 0x02 | ||
+ | wMaxPacketSize = 64 | ||
+ | bInterval = 0 | ||
+ | bRefresh = 7 | ||
+ | bSynchAddress = 5 | ||
+ | |||
+ | [Endpoint Descriptor] | ||
+ | ---------------------------------------------- | ||
+ | Length = 7 | ||
+ | DescriptorType = 05 | ||
+ | bEndpointAddress = 0x04 | ||
+ | bmAttributes = 0x02 | ||
+ | wMaxPacketSize = 64 | ||
+ | bInterval = 0 | ||
+ | bRefresh = 7 | ||
+ | bSynchAddress = 5 | ||
+ | |||
+ | [Endpoint Descriptor] | ||
+ | ---------------------------------------------- | ||
+ | Length = 7 | ||
+ | DescriptorType = 05 | ||
+ | bEndpointAddress = 0x05 | ||
+ | bmAttributes = 0x02 | ||
+ | wMaxPacketSize = 64 | ||
+ | bInterval = 0 | ||
+ | bRefresh = 7 | ||
+ | bSynchAddress = 5 | ||
+ | |||
+ | [Endpoint Descriptor] | ||
+ | ---------------------------------------------- | ||
+ | Length = 7 | ||
+ | DescriptorType = 05 | ||
+ | bEndpointAddress = 0x81 | ||
+ | bmAttributes = 0x02 | ||
+ | wMaxPacketSize = 64 | ||
+ | bInterval = 0 | ||
+ | bRefresh = 7 | ||
+ | bSynchAddress = 5 | ||
+ | |||
+ | [Endpoint Descriptor] | ||
+ | ---------------------------------------------- | ||
+ | Length = 7 | ||
+ | DescriptorType = 05 | ||
+ | bEndpointAddress = 0x82 | ||
+ | bmAttributes = 0x02 | ||
+ | wMaxPacketSize = 64 | ||
+ | bInterval = 0 | ||
+ | bRefresh = 7 | ||
+ | bSynchAddress = 5 | ||
+ | |||
+ | [Endpoint Descriptor] | ||
+ | ---------------------------------------------- | ||
+ | Length = 7 | ||
+ | DescriptorType = 05 | ||
+ | bEndpointAddress = 0x83 | ||
+ | bmAttributes = 0x02 | ||
+ | wMaxPacketSize = 64 | ||
+ | bInterval = 0 | ||
+ | bRefresh = 7 | ||
+ | bSynchAddress = 5 | ||
+ | |||
+ | [Endpoint Descriptor] | ||
+ | ---------------------------------------------- | ||
+ | Length = 7 | ||
+ | DescriptorType = 05 | ||
+ | bEndpointAddress = 0x84 | ||
+ | bmAttributes = 0x02 | ||
+ | wMaxPacketSize = 64 | ||
+ | bInterval = 0 | ||
+ | bRefresh = 7 | ||
+ | bSynchAddress = 5 | ||
+ | |||
+ | [Endpoint Descriptor] | ||
+ | ---------------------------------------------- | ||
+ | Length = 7 | ||
+ | DescriptorType = 05 | ||
+ | bEndpointAddress = 0x85 | ||
+ | bmAttributes = 0x02 | ||
+ | wMaxPacketSize = 64 | ||
+ | bInterval = 0 | ||
+ | bRefresh = 0 | ||
+ | bSynchAddress = 0 | ||
+ | </pre> | ||
+ | |||
+ | == Related links == | ||
+ | [https://github.com/xqemu/xqemu/blob/xbox/hw/xbox/xid.c XID emulation in XQEMU] | ||
+ | |||
+ | [https://docs.google.com/spreadsheets/d/1-c1tXfOMvaWuno3ixQyI_rPCQVAZA24N4v9OPZUSrCk/edit?usp=sharing Compilation of Xbox Controller Hardware Research] |
Latest revision as of 13:26, 7 August 2024
Contents
- 1 XID Overview
- 2 Standard Gamepads
- 3 Steering wheels
- 4 Arcade Sticks
- 5 Light guns
- 6 Microphones
- 7 Steel Battalion Controller
- 8 SEGA Chihiro Baseboard
- 9 Related links
XID Overview
XIDs are USB devices.
The hardware side is USB with a different plug while the software side is USB without HID-descriptors. Technicly a XID is a USB-hub for the Memory-Units and the XBL Communicator. The logical XID gamepad USB device is internally connected to that hub.
USB Adapters
The Xbox's Input devices are USB devices. As such, you can connect a keyboard to the Xbox, or a gamepad to your PC. In fact, Linux already has drivers for the gamepad. In order to preserve Xbox hardware, please do not cut OEM Xbox cables to make an adapter; decent adapters can be acquired cheaply (~$10 USD ea. on 2017.04.30).
Port (From) | Plug (To) | Link |
---|---|---|
Xbox | USB-A | Amazon Aliexpress |
USB-A | Xbox | Amazon Aliexpress |
Wiring
Untested / unverified! Take this with a grain of salt.
Pin | Typical cable color | Description |
---|---|---|
1 | Red | VCC |
2 | White | USB D+ |
3 | Green | USB D- |
4 | Yellow | VBlank signal from video output (for Lightguns) |
5 | Black | GND |
Protocol
XID are similar to HID but have custom Vendor requests
Control Transfers
GET_DESCRIPTOR
- bmRequestType: 0xC1
- bRequest: 6
- wValue: 0x4200
- wIndex: Interface number
- wLength: <length of respective report; typically 16>
Actual length is truncated to size of descriptor or wLength. Whichever is smaller.
typedef struct XIDDescriptor { uint8_t bLength; uint8_t bDescriptorType; uint16_t bcdXid; uint8_t bType; uint8_t bSubType; uint8_t bMaxInputReportSize; uint8_t bMaxOutputReportSize; uint16_t wAlternateProductIds[4]; };
bDescriptorType is probably always 0x42.
bType = 1: Xbox Gamecontroller
- bSubType:
- 0x01 = Gamepad (Duke)
- 0x02 = Gamepad (Controller-S)
- 0x10 = Steering wheel
- 0x20 = Arcade Stick
- 0x50 = Light gun
bType = 3: Xbox DVD Movie Playback IR Dongle
- bSubType:
- 0x00
bType = 128: Steel Battalion
- bSubType:
- 0x01
Example XID reports
This is an example XID descriptor taken from a Controller-S (VID 0x045E / PID 0x0289).
bLength 0x10 (16 bytes) bDescriptorType 0x42 bcdXid 0x0100 (USB 1.0) bType 0x01 bSubType 0x02 bMaxInputReportSize 0x14 (20 bytes) bMaxOutputReportSize 0x06 (6 bytes) wAlternateProductIds 4 x 0xFFFF
This is an example XID descriptor taken from a Steel Battalion controller.
bLength 0x10 (16 bytes) bDescriptorType 0x42 bcdXid 0x0100 (USB 1.0) bType 0x80 bSubType 0x01 bMaxInputReportSize 0x1A (26 bytes) bMaxOutputReportSize 0x16 (22 bytes) wAlternateProductIds 4 x 0xFFFF
This is an example XID descriptor taken from an official Microsoft DVD Movie Playback IR dongle.
bLength 0x08 (8 bytes) bDescriptorType 0x42 bcdXid 0x0100 (USB 1.0) bType 0x03 bSubType 0x00 bMaxInputReportSize 0x06 (6 bytes) bMaxOutputReportSize 0x00 (0 bytes)
GET_CAPABILITIES
- bmRequestType: 0xC1
- bRequest: 1
- wValue:
- 0x0100 for input
- 0x0200 for output
- wIndex: Interface number
- wLength: <length of respective report>
- STALL if wValue not supported.
Actual length is truncated to size of report or wLength. Whichever is smaller.
typedef struct XIDGamepadCapabilities { uint8_t bReportId; uint8_t bLength; <Data> }
The data will be similar to the GET_REPORT, but instead of storing actual values, it will have bits set (1) where the bit is valid in the respective report. If the bit is auto-generated, it will be cleared (0).
SET_REPORT
- bmRequestType: 0x21
- bRequest: 9
- wValue: 0x0200
- wIndex: Interface number
- wLength: <length of report; typically 6>
- STALL if wValue not supported.
Typical report
typedef struct XIDGamepadReport { uint8_t bReportId; uint8_t bLength; <Data> }
GET_REPORT
- bmRequestType: 0xA1
- bRequest: 1
- wValue: 0x0100
- wIndex: Interface number
- wLength: <length of report; typically 20>
- STALL if wValue not supported or if wLength is greater than report size.
- ACK if supported.
Typical report
typedef struct XIDGamepadOutputReport { uint8_t report_id; //FIXME: is this correct? uint8_t length; <Data> }
Interrupt transfers
Alternatively interrupt-in and interrupt-out transfers can be used for GET_REPORT and SET_REPORT respectively.
In case of the interrupt-in, there is another status which can occur now:
- NAK if supported but no changes since last ACK.
Standard Gamepads
Microsoft Hardware Variants
There are a few hardware re-designs of the Microsoft Gamepad.
Controller Name | Part Number | Board Model | Notes | Datasheets |
---|---|---|---|---|
Xbox Game Controller (AKA "Duke") | X08-17160 | 23-0819B | Earliest known model[FIXME]. 3 IC's: Dedicated ST 92163/JFL Micro Controller, dedicated AT43USB401 USB Controller, 4 Channel Analog Mux LW052A. | ST 92163/JFL, AT43USB401[FIXME], LW052A |
Xbox Game Controller (AKA "Duke") | X08-17160 | K023B121 | Same as 23-0819B, but manufactured in China. Only Board Model that does not follow naming conventions. Hardware identical. Easily identified by a serial number that starts with "KD". | ST 92163/JFL, AT43USB401[FIXME], LW052A |
Xbox Game Controller (AKA "Duke") | X08-17160 | 23-0819C | Last known Duke model.[FIXME]. Identical to 23-0819B in hardware, new silkscreen markings show this model is UL-94 V-0 compliant. All boards after this are V-0 compliant. | ST 92163/JFL, AT43USB401[FIXME], LW052A |
Xbox Game Controller (Looks like an S, with green Xbox jewel) | X08-19383 | 23-0923A | Japan and Australia exclusive model[FIXME].Minification of "Duke" PCB Design. Has exact same IC's as the Duke, only in an S controller design. | ST 92163/JFL, AT43USB401[FIXME], LW052A |
Xbox Controller S | X08-69873 | 23-0923B | Minification of "Duke" PCB Design. Has exact same IC's as the Duke, only in an S controller design | ST 92163/JFL, AT43USB401[FIXME], LW052A |
Xbox Controller S | X08-69873 | 23-0923H | Entirely new PCB design. Single IC on the board, AT43USB355M-AC | AT43USB355M-AC |
Xbox Controller S | X08-69873 | 23-0923I | PCB Design almost exactly the same as H revision. Only difference is the IC is smaller: AT43USB353M-AC | AT43USB353M-AC |
There are also dedicated Part Numbers for color variants:
Controller Part Number | Controller Description | Board Model |
---|---|---|
X02332-001 | Crystal S Controller | 23-0923I |
X09-64240-01 | Transparent Green Controller | 23-0923I |
X800679-100 | Black S With Halo Jewel | 23-0923I |
USB Descriptors
See https://github.com/xboxdrv/xboxdrv/blob/stable/src/xpad_device.cpp for a list of devices.
23-0819B
Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 0 bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x045e Microsoft Corp. idProduct 0x0202 Xbox Controller bcdDevice 1.00 iManufacturer 0 iProduct 0 iSerial 0 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 32 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 (Bus Powered) MaxPower 100mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 88 Xbox bInterfaceSubClass 66 Controller bInterfaceProtocol 0 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x82 EP 2 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0020 1x 32 bytes bInterval 4 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x02 EP 2 OUT bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0020 1x 32 bytes bInterval 4
K023B121
Identical to 23-0819B [FIXME]
23-0819C
Identical to 23-0819B [FIXME]
23-0923A
Changes from 23-0819B
Device Descriptor: idProduct: 0x0285
23-0923B
[FIXME]
23-0923H
Changes from 23-0819B
Device Descriptor bMaxPacketSize0: 8 idProduct: 0x0289 bcdDevice: 1.20 Configuration Descriptor Interface Descriptor Endpoint Descriptor bEndpointAddress: 0x81
23-0923I
Changes from 23-0923H
Device Descriptor bcdDevice: 1.21
Controller to Xbox
20 bytes
Xbox to Controller
6 bytes
Field | Offset (Bytes) | Mask | Notes |
---|---|---|---|
Left actuator strength | 2 | 0xFFFF | |
Right actuator strength | 4 | 0xFFFF |
The Microsoft Controller S will not react to packets which don't have a value of 6 in the length
field of the header.
The Fanatec Speedster 3 ForceShock will still react to those. Further testing is necessary with other gamepads.
Steering wheels
MadCatz Wheel
[FIXME]
Fanatec Speedster 3 ForceShock
Pedals
The Pedals are not a USB device.
Note that the cable going to the pedals is also not a USB port despite using the Xbox controller breakaway plug. Likewise, plugging the pedals to a PC / Xbox won't provide a USB / XID (it is detected as garbage):
new full-speed USB device number 14 using xhci_hcd device descriptor read/64, error -71 device descriptor read/64, error -71 new full-speed USB device number 15 using xhci_hcd device descriptor read/64, error -71 device descriptor read/64, error -71 new full-speed USB device number 16 using xhci_hcd Device not responding to setup address. Device not responding to setup address. device not accepting address 16, error -71 new full-speed USB device number 17 using xhci_hcd Device not responding to setup address. Device not responding to setup address. device not accepting address 17, error -71 unable to enumerate USB device
Internal HUB
USB Descriptors
Power not connected, pedals not connected, not in Tuning mode:
Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 9 Hub bDeviceSubClass 0 bDeviceProtocol 0 Full speed (or root) hub bMaxPacketSize0 8 idVendor 0x3767 idProduct 0x0102 bcdDevice 0.01 iManufacturer 0 iProduct 1 End iSerial 0 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 25 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0xa0 (Bus Powered) Remote Wakeup MaxPower 64mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 9 Hub bInterfaceSubClass 0 bInterfaceProtocol 0 Full speed (or root) hub iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0001 1x 1 bytes bInterval 255 Hub Descriptor: bLength 9 bDescriptorType 41 nNbrPorts 3 wHubCharacteristic 0x000d Per-port power switching Compound device Per-port overcurrent protection bPwrOn2PwrGood 50 * 2 milli seconds bHubContrCurrent 64 milli Ampere DeviceRemovable 0x02 PortPwrCtrlMask 0xff Hub Port Status: Port 1: 0000.0103 power enable connect Port 2: 0000.0100 power Port 3: 0000.0100 power can't get debug descriptor: Resource temporarily unavailable Device Status: 0x0003 Self Powered Remote Wakeup Enabled
Steering wheel (and Pedals)
Always connected to port 1 of the internal HUB
USB Descriptors
Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 0 bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 8 idVendor 0x3767 idProduct 0x0101 bcdDevice 2.80 iManufacturer 0 iProduct 0 iSerial 0 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 32 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 (Bus Powered) MaxPower 100mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 88 Xbox bInterfaceSubClass 66 Controller bInterfaceProtocol 0 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x82 EP 2 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0020 1x 32 bytes bInterval 4 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x02 EP 2 OUT bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0020 1x 32 bytes bInterval 4 can't get debug descriptor: Resource temporarily unavailable Device Status: 0x0000 (Bus Powered)
Arcade Sticks
Xbox TECMO Dead or Alive 3 ARCADE Stick Joystick Controller Japan
[FIXME]
Street Fighter 15th Anniversary Edition Arcade Stick
[FIXME]
Gamester Xbox Arcade Stick
[FIXME]
Nuby Xbox Fighter Arcade Stick
[FIXME]
Nuby Xbox Arcade Super Stick
[FIXME]
The source image of the box and on device has item#:36020.
Naki Ultimate Fighting Stick
[FIXME]
YouTube reviewer report this joystick to have rumble support.
Light guns
Light guns use similar input and output reports to standard gamepads. Their bSubType is set to 0x50. They report where they are aimed in place of the left stick coordinates, and an extra bit at offset 3 in their input reports flags whether the light gun is currently pointed at the screen or not. Light guns may not function properly if they are not supplied with a video sync signal (they may not populate their input reports correctly, or even fail to enumerate as USB devices entirely).
Controller to Xbox
20 bytes
Xbox to Controller
Force feedback: wValue: 0x0200, wLength: 6
6 bytes
Field | Offset (Bytes) | Mask | Notes |
---|---|---|---|
Actuator strength | 2 | 0xFFFF | |
(Unused) | 4 | 0x0000 |
The 4Gamers-branded gun (which appears to be sold by a number of different manufacturers) only reports it has the left actuator, however it only responds to force feedback output reports for the right actuator. Games appear to always enable both actuators, whether the controller reports it has both or not.
Calibration: wValue: 0x0201, wLength: 10
10 bytes
Field | Offset (Bytes) | Mask | Notes |
---|---|---|---|
Center calibration X | 2 | 0xFFFF | Gun's reported value subtracted from (0,0) |
Center calibration Y | 4 | 0xFFFF | |
Top left calibration X | 6 | 0xFFFF | Gun's reported value subtracted from (-25000,25000) |
Top left calibration Y | 8 | 0xFFFF |
Light guns are expected to handle their own calibration, i.e. the game will tell the gun the offsets between its reported position and the expected position and then expect the gun to offset and scale its output to compensate. The calibration process runs as follows:
- The game will first send a calibration report with all four offsets reset to (0, 0), (0, 0) to reset any offsets and scaling.
- The game will now display a target in the centre of the screen and ask you to shoot it. This will tell it how "wrong" the gun is when aimed at where it thinks (0, 0) should be on the screen. If the gun normally shoots slightly too high and further to the right, it might report (1000, 3000) for example.
- The game sends a calibration report to the gun to negate the offset, e.g. (-1000, -3000), (0, 0) using our example of (1000, 3000) from before.
- The game will now display a target in at (-25000, 25000) on the screen and ask you to shoot it. This will tell it how "wrong" the gun is when aimed at the top left of the screen.
- The coordinates received from the gun will be subtracted from the expected (-25000, 25000) and sent back to the gun in the second part of the calibration report along with the values previously determined for the centre position. If the first calibration was enough to adjust the screen offset we might have seen the "perfect" coordinates of (-25000, 25000) in which case the report would be (-1000, -3000), (0, 0) again. However, if our gun read the coordinates slightly closer the the middle of the screen at (-20000, 22000) then the report would be (-1000, -3000), (5000, -3000).
If the light gun does not handle the calibration output report then you will not be able to get past the calibration screen in The House of the Dead III.
EMS TopGun II
This is an unlicensed / unofficial Xbox accessory.
The website for this product can be found at http://www.hkems.com/product/xbox/EMSTopGun2.htm
The gun presents itself as a standard Xbox gamepad. It uses a different USB descriptor for Xbox (X) and the other mode (P). There is no internal hub in this device.
EMS TopGun II | Xbox Gamepad | Notes |
---|---|---|
Stick | ||
Trigger | Digital only, either 0 or 255 | |
Grip | ||
A | ||
B | ||
START | ||
SE/BA | ||
Aim Left / Right | -Horizontal | Absolute position using the full stick range |
Aim Up / Down | -Vertical |
There is no right thumbstick, thumbstick presses, black/white button or trigger buttons (All of those read constant zeros).
Turbo Mode
- Turbo mode 0 keeps pressed while trigger is held
- Turbo mode 1 toggles rapidly while trigger is held
- Turbo mode 2 toggles rapidly and once in a while while trigger is held
Force Feedback
The upper part of the gun is moveable and should push back to simulate recoil (possibly hurting your thumb while you are using the stick). I could not get the force feedback working, but I'm sure I've had it working in the past on PC.[citation needed]
USB Descriptors
This is the descriptor in the Xbox mode (X).
Bus 003 Device 016: ID 0b9a:016b Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 0 bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x0b9a idProduct 0x016b bcdDevice 4.57 iManufacturer 1 EMS̖E iProduct 2 EMS TopGun iSerial 0 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 32 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 (Bus Powered) MaxPower 100mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 88 Xbox bInterfaceSubClass 66 Controller bInterfaceProtocol 0 iInterface 0 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 4 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x02 EP 2 OUT bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0040 1x 64 bytes bInterval 8 can't get debug descriptor: Resource temporarily unavailable Device Status: 0x0000 (Bus Powered)
Joytech Sharp Shooter
This is an unlicensed / unofficial Xbox accessory.
The third party light gun from Joytech reports itself as 2 devices and mentions pattent US6287198 it came with a detachable viewfinder scope without any magnification. a red dot apears in the viewfinder, its a reflection of a red led, powered by the gun over usb.
model numer: JS-901D
Joytech Sharp Shooter | Xbox Gamepad | Notes |
---|---|---|
Stick | ||
Trigger | Digital only, either 0 or 255 [citation needed] | |
B (Left side) | ||
B (Right side) | ||
B (Magazine button) | ||
x | ||
y | ||
START | ||
BACK | ||
Aim Left / Right | -Horizontal | [citation needed] |
Aim Up / Down | -Vertical | [citation needed] |
There is no right thumbstick, thumbstick presses, black/white button or trigger buttons [citation needed]
Fire/Reload Mode
- Normal mode does nothing, normal operation
- Auto reload mode toggles rapidly to rappidly reload [citation needed]
- Auto fire+reload mode toggles + rapidly [citation needed]
USB Descriptors
Bus 003 Device 025: ID 1292:3006 Innomedia Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 0 bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 8 idVendor 0x1292 Innomedia idProduct 0x3006 bcdDevice 1.50 iManufacturer 0 iProduct 0 iSerial 0 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 32 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 1 (error) bmAttributes 0x80 (Bus Powered) MaxPower 100mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 88 Xbox bInterfaceSubClass 66 Controller bInterfaceProtocol 0 iInterface 2 (error) Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0020 1x 32 bytes bInterval 4 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x02 EP 2 OUT bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0020 1x 32 bytes bInterval 4 Bus 003 Device 024: ID 1292:3006 Innomedia Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 9 Hub bDeviceSubClass 0 bDeviceProtocol 0 Full speed (or root) hub bMaxPacketSize0 8 idVendor 0x1292 Innomedia idProduct 0x3006 bcdDevice 1.50 iManufacturer 1 (c) 2004 R0R3 Inc. iProduct 2 US Patent 6,287,198 iSerial 0 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 25 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 4 (c) R0R3 Devices Inc. US Patent 6,287,19Ē bmAttributes 0xa0 (Bus Powered) Remote Wakeup MaxPower 64mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 9 Hub bInterfaceSubClass 0 bInterfaceProtocol 0 Full speed (or root) hub iInterface 5 (error) Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0001 1x 1 bytes bInterval 255 Hub Descriptor: bLength 9 bDescriptorType 41 nNbrPorts 3 wHubCharacteristic 0x000d Per-port power switching Compound device Per-port overcurrent protection bPwrOn2PwrGood 32 * 2 milli seconds bHubContrCurrent 64 milli Ampere DeviceRemovable 0x02 PortPwrCtrlMask 0x0e Hub Port Status: Port 1: 0000.0103 power enable connect Port 2: 0000.0100 power Port 3: 0100.0100 power Device Status: 0x0000 (Bus Powered)
Microphones
Xbox Communicator
USB Descriptor
Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 0 bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 8 idVendor 0x045e Microsoft Corp. idProduct 0x0283 Xbox Communicator bcdDevice 1.58 iManufacturer 0 iProduct 0 iSerial 0 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 0x002d bNumInterfaces 2 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 (Bus Powered) MaxPower 100mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 120 bInterfaceSubClass 0 bInterfaceProtocol 0 iInterface 0 Endpoint Descriptor: bLength 9 bDescriptorType 5 bEndpointAddress 0x04 EP 4 OUT bmAttributes 5 Transfer Type Isochronous Synch Type Asynchronous Usage Type Data wMaxPacketSize 0x0030 1x 48 bytes bInterval 1 bRefresh 0 bSynchAddress 0 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 120 bInterfaceSubClass 0 bInterfaceProtocol 0 iInterface 0 Endpoint Descriptor: bLength 9 bDescriptorType 5 bEndpointAddress 0x85 EP 5 IN bmAttributes 5 Transfer Type Isochronous Synch Type Asynchronous Usage Type Data wMaxPacketSize 0x0030 1x 48 bytes bInterval 1 bRefresh 0 bSynchAddress 0
Xbox Karaoke
USB Descriptor
Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 0 bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 8 idVendor 0x045e Microsoft Corp. idProduct 0x0501 bcdDevice 1.00 iManufacturer 1 Licensed 3PP Vendor iProduct 2 Karaoke Microphone Module iSerial 0 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 0x001b 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 121 bInterfaceSubClass 1 bInterfaceProtocol 0 iInterface 0 Endpoint Descriptor: bLength 9 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 5 Transfer Type Isochronous Synch Type Asynchronous Usage Type Data wMaxPacketSize 0x0060 1x 96 bytes bInterval 1 bRefresh 0 bSynchAddress 0
Steel Battalion Controller
USB Descriptors
Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 8 idVendor 0x0a7b idProduct 0xd000 bcdDevice 1.00 iManufacturer 0 iProduct 0 iSerial 0 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 32 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 (Bus Powered) MaxPower 500mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 88 Xbox bInterfaceSubClass 66 Controller bInterfaceProtocol 0 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x82 EP 2 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0020 1x 32 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 0x0020 1x 32 bytes bInterval 4
Controller to Xbox
From http://steelbattalionnet.codeplex.com/SourceControl/latest#SBC/SteelBattalionController.cs
26 bytes
Field | Offset (Bytes) | Mask | Notes |
---|---|---|---|
RightJoyMainWeapon | 2 | 0x01 | |
RightJoyFire | 2 | 0x02 | |
RightJoyLockOn | 2 | 0x04 | |
Eject | 2 | 0x08 | |
CockpitHatch | 2 | 0x10 | |
Ignition | 2 | 0x20 | |
Start | 2 | 0x40 | |
MultiMonOpenClose | 2 | 0x80 | |
MultiMonMapZoomInOut | 3 | 0x01 | |
MultiMonModeSelect | 3 | 0x02 | |
MultiMonSubMonitor | 3 | 0x04 | |
MainMonZoomIn | 3 | 0x08 | |
MainMonZoomOut | 3 | 0x10 | |
FunctionFSS | 3 | 0x20 | |
FunctionManipulator | 3 | 0x40 | |
FunctionLineColorChange | 3 | 0x80 | |
Washing | 4 | 0x01 | |
Extinguisher | 4 | 0x02 | |
Chaff | 4 | 0x04 | |
FunctionTankDetach | 4 | 0x08 | |
FunctionOverride | 4 | 0x10 | |
FunctionNightScope | 4 | 0x20 | |
FunctionF1 | 4 | 0x40 | |
FunctionF2 | 4 | 0x80 | |
FunctionF3 | 5 | 0x01 | |
WeaponConMain | 5 | 0x02 | |
WeaponConSub | 5 | 0x04 | |
WeaponConMagazine | 5 | 0x08 | |
Comm1 | 5 | 0x10 | |
Comm2 | 5 | 0x20 | |
Comm3 | 5 | 0x40 | |
Comm4 | 5 | 0x80 | |
Comm5 | 6 | 0x01 | |
LeftJoySightChange | 6 | 0x02 | |
ToggleFilterControl | 6 | 0x04 | |
ToggleOxygenSupply | 6 | 0x08 | |
ToggleFuelFlowRate | 6 | 0x10 | |
ToggleBuffreMaterial | 6 | 0x20 | |
ToggleVTLocation | 6 | 0x40 | |
6 | 0x80 | ||
7 | 0xFF | ||
8 | 0xFF | ||
AimingX | 9 | 0xFFFF | "Aiming Lever" joystick on the right. Unsigned X Axis value: 0 (Left) to 0xFFFF (Right). |
AimingY | 11 | 0xFFFF | "Aiming Lever" joystick on the right. Unsigned Y Axis value: 0 (Top) to 0xFFFF (Bottom). |
RotationLever | 13 | 0xFFFF | "Rotation Lever" joystick on the left. Signed X Axis value: -0x7FFF (Left) to 0x7FFF (Right) |
SightChangeX | 15 | 0xFFFF | "Sight Change" analog stick on the "Rotation Lever" joystick. Signed X Axis value: -0x7FFF (Left) to 0x7FFF (Right) |
SightChangeY | 17 | 0xFFFF | "Sight Change" analog stick on the "Rotation Lever" joystick. Signed Y Axis value: -0x7FFF (Top) to 0x7FFF (Bottom) |
LeftPedal | 19 | 0xFFFF | |
MiddlePedal | 21 | 0xFFFF | |
RightPedal | 23 | 0xFFFF | |
TunerDial | 24 | 0x0F | The 9 o'clock postion is 0, and the 6 o'clock position is 12. The blank area between the 6 and 9 o'clock positions is 13, 14, and 15 clockwise. |
24 | 0xF0 | ||
GearLever | 25 | 0xFF | The gear lever on the left block. R = -2, N = -1, 1st = 1, 2nd = 2, 3rd = 3, 4th = 4, 5th = 5. If the shifter is between two gears this value will be 0. |
Xbox to Controller
From http://steelbattalionnet.codeplex.com/SourceControl/latest#SBC/SteelBattalionController.cs
22 bytes
Field | Offset (Bytes) | Mask | Notes |
---|---|---|---|
Start | 0 | 0x00 | This will always be 0x00 |
bLen | 1 | 0x16 | This will always be 0x16 (22 bytes) |
EmergencyEject | 2 | 0x0F | |
CockpitHatch | 2 | 0xF0 | |
Ignition | 3 | 0x0F | |
Start | 3 | 0xF0 | |
OpenClose | 4 | 0x0F | |
MapZoomInOut | 4 | 0xF0 | |
ModeSelect | 5 | 0x0F | |
SubMonitorModeSelect | 5 | 0xF0 | |
MainMonitorZoomIn | 6 | 0x0F | |
MainMonitorZoomOut | 6 | 0xF0 | |
ForecastShootingSystem | 7 | 0x0F | |
Manipulator | 7 | 0xF0 | |
LineColorChange | 8 | 0x0F | |
Washing | 8 | 0xF0 | |
Extinguisher | 9 | 0x0F | |
Chaff | 9 | 0xF0 | |
TankDetach | 10 | 0x0F | |
Override | 10 | 0xF0 | |
NightScope | 11 | 0x0F | |
F1 | 11 | 0xF0 | |
F2 | 12 | 0x0F | |
F3 | 12 | 0xF0 | |
MainWeaponControl | 13 | 0x0F | |
SubWeaponControl | 13 | 0xF0 | |
MagazineChange | 14 | 0x0F | |
Comm1 | 14 | 0xF0 | |
Comm2 | 15 | 0x0F | |
Comm3 | 15 | 0xF0 | |
Comm4 | 16 | 0x0F | |
Comm5 | 16 | 0xF0 | |
17 | 0x0F | ||
GearR | 17 | 0xF0 | |
GearN | 18 | 0x0F | |
Gear1 | 18 | 0xF0 | |
Gear2 | 19 | 0x0F | |
Gear3 | 19 | 0xF0 | |
Gear4 | 20 | 0x0F | |
Gear5 | 20 | 0xF0 | |
Unused? | 21 |
SEGA Chihiro Baseboard
Contains 2 USB devices which directly attach to USB ports 3 & 4 (player 0, 1)
USB Descriptors
[Device Descriptor] ---------------------------------------------- Length = 18 DescriptorType = 0x01 USB version = 1.00 Vendor:Product = 0ca3:0003 MaxPacketSize0 = 64 NumConfigurations = 1 Device version = 1.03 Device Class:SubClass:Protocol = 60:01:00 [Configuration Descriptor] ---------------------------------------------- Length = 9 DescriptorType = 02 wTotalLength = 60 bNumInterfaces = 1 bConfigurationValue = 1 iConfiguration = 0 bmAttributes = 0x80 MaxPower = 150 [Interface Descriptor] ---------------------------------------------- Length = 9 DescriptorType = 04 bInterfaceNumber = 0 bAlternateSetting = 0 bNumEndpoints = 6 bInterfaceClass = 0xff bInterfaceSubClass = 0x00 bInterfaceProtocol = 0x00 iInterface = 0 [Endpoint Descriptor] ---------------------------------------------- Length = 7 DescriptorType = 05 bEndpointAddress = 0x01 bmAttributes = 0x02 wMaxPacketSize = 64 bInterval = 0 bRefresh = 7 bSynchAddress = 5 [Endpoint Descriptor] ---------------------------------------------- Length = 7 DescriptorType = 05 bEndpointAddress = 0x02 bmAttributes = 0x02 wMaxPacketSize = 64 bInterval = 0 bRefresh = 7 bSynchAddress = 5 [Endpoint Descriptor] ---------------------------------------------- Length = 7 DescriptorType = 05 bEndpointAddress = 0x03 bmAttributes = 0x02 wMaxPacketSize = 64 bInterval = 0 bRefresh = 7 bSynchAddress = 5 [Endpoint Descriptor] ---------------------------------------------- Length = 7 DescriptorType = 05 bEndpointAddress = 0x81 bmAttributes = 0x02 wMaxPacketSize = 64 bInterval = 0 bRefresh = 7 bSynchAddress = 5 [Endpoint Descriptor] ---------------------------------------------- Length = 7 DescriptorType = 05 bEndpointAddress = 0x82 bmAttributes = 0x02 wMaxPacketSize = 64 bInterval = 0 bRefresh = 7 bSynchAddress = 5 [Endpoint Descriptor] ---------------------------------------------- Length = 7 DescriptorType = 05 bEndpointAddress = 0x83 bmAttributes = 0x02 wMaxPacketSize = 64 bInterval = 0 bRefresh = 0 bSynchAddress = 0
[Device Descriptor] ---------------------------------------------- Length = 18 DescriptorType = 0x01 USB version = 1.00 Vendor:Product = 0ca3:0002 MaxPacketSize0 = 64 NumConfigurations = 1 Device version = 1.03 Device Class:SubClass:Protocol = 60:00:00 [Configuration Descriptor] ---------------------------------------------- Length = 9 DescriptorType = 02 wTotalLength = 88 bNumInterfaces = 1 bConfigurationValue = 1 iConfiguration = 0 bmAttributes = 0x80 MaxPower = 150 [Interface Descriptor] ---------------------------------------------- Length = 9 DescriptorType = 04 bInterfaceNumber = 0 bAlternateSetting = 0 bNumEndpoints = 10 bInterfaceClass = 0xff bInterfaceSubClass = 0x00 bInterfaceProtocol = 0x00 iInterface = 0 [Endpoint Descriptor] ---------------------------------------------- Length = 7 DescriptorType = 05 bEndpointAddress = 0x01 bmAttributes = 0x02 wMaxPacketSize = 64 bInterval = 0 bRefresh = 7 bSynchAddress = 5 [Endpoint Descriptor] ---------------------------------------------- Length = 7 DescriptorType = 05 bEndpointAddress = 0x02 bmAttributes = 0x02 wMaxPacketSize = 64 bInterval = 0 bRefresh = 7 bSynchAddress = 5 [Endpoint Descriptor] ---------------------------------------------- Length = 7 DescriptorType = 05 bEndpointAddress = 0x03 bmAttributes = 0x02 wMaxPacketSize = 64 bInterval = 0 bRefresh = 7 bSynchAddress = 5 [Endpoint Descriptor] ---------------------------------------------- Length = 7 DescriptorType = 05 bEndpointAddress = 0x04 bmAttributes = 0x02 wMaxPacketSize = 64 bInterval = 0 bRefresh = 7 bSynchAddress = 5 [Endpoint Descriptor] ---------------------------------------------- Length = 7 DescriptorType = 05 bEndpointAddress = 0x05 bmAttributes = 0x02 wMaxPacketSize = 64 bInterval = 0 bRefresh = 7 bSynchAddress = 5 [Endpoint Descriptor] ---------------------------------------------- Length = 7 DescriptorType = 05 bEndpointAddress = 0x81 bmAttributes = 0x02 wMaxPacketSize = 64 bInterval = 0 bRefresh = 7 bSynchAddress = 5 [Endpoint Descriptor] ---------------------------------------------- Length = 7 DescriptorType = 05 bEndpointAddress = 0x82 bmAttributes = 0x02 wMaxPacketSize = 64 bInterval = 0 bRefresh = 7 bSynchAddress = 5 [Endpoint Descriptor] ---------------------------------------------- Length = 7 DescriptorType = 05 bEndpointAddress = 0x83 bmAttributes = 0x02 wMaxPacketSize = 64 bInterval = 0 bRefresh = 7 bSynchAddress = 5 [Endpoint Descriptor] ---------------------------------------------- Length = 7 DescriptorType = 05 bEndpointAddress = 0x84 bmAttributes = 0x02 wMaxPacketSize = 64 bInterval = 0 bRefresh = 7 bSynchAddress = 5 [Endpoint Descriptor] ---------------------------------------------- Length = 7 DescriptorType = 05 bEndpointAddress = 0x85 bmAttributes = 0x02 wMaxPacketSize = 64 bInterval = 0 bRefresh = 0 bSynchAddress = 0