Xbox Input Devices

From xboxdevwiki
Revision as of 09:40, 12 May 2017 by JayFoxRox (talk | contribs) (Controller to Xbox)
Jump to: navigation, search

XID Overview

XIDs are USB devices.


USB Adapters

The Xbox 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
USB-A Xbox Amazon


Wiring

Untested / unverified! Take this with a grain of salt.

Pin Typical cable color Description
1 Green USB D-
2 White USB D+
3 Black GND
4 Red VCC
5 Yellow VBlank signal from video output (for Lightguns)

Protocol

Controller to Xbox

typedef struct XIDGamepadReport {
    uint8_t bReportId;
    uint8_t bLength;
    <Data>
}

Xbox to Controller

typedef struct XIDGamepadOutputReport {
    uint8_t report_id; //FIXME: is this correct?
    uint8_t length;
    <Data>
}


Standard Gamepads

USB Descriptors

Most standard gamepads share the same USB descriptor. Usually the only difference will be the VID / PID. See https://github.com/xboxdrv/xboxdrv/blob/stable/src/xpad_device.cpp for a list of devices.

Controller to Xbox

20 bytes (160 bits)

Field Bits Notes
DPAD_UP 23
DPAD_DOWN 22
DPAD_LEFT 21
DPAD_RIGHT 20
START 19
BACK 18
LEFT_THUMB 17
RIGHT_THUMB 16
A 32-39 Button is analog
B 40-47 Button is analog
X 48-55 Button is analog
Y 56-63 Button is analog
BLACK 64-71 Button is analog
WHITE 72-79 Button is analog
LEFT_TRIGGER 80-87 Trigger is analog
RIGHT_TRIGGER 88-95 Trigger is analog
sThumbLX 96-111
sThumbLY 112-127
sThumbRX 128-143
sThumbRY 144-159

Xbox to Controller

6 bytes (48 bits)

Field Bits Notes
Left actuator strength 16-31
Right actuator strength 32-47

Steering wheels

Light guns

Steel Battalion Controller

USB Descriptors

From http://www.yaronet.com/topics/154490-steel-battalion-controller-homemade#post-15

bcdUSB:             0x0110
bDeviceClass:         0x00
bDeviceSubClass:      0x00
bDeviceProtocol:      0x00
bMaxPacketSize0:      0x08 (8)
idVendor:           0x0A7B
idProduct:          0xD000
bcdDevice:          0x0100
iManufacturer:        0x00
iProduct:             0x00
iSerialNumber:        0x00
bNumConfigurations:   0x01

ConnectionStatus: DeviceConnected
Current Config Value: 0x00
Device Bus Speed:     Full
Device Address:       0x03
Open Pipes:              0

Configuration Descriptor:
wTotalLength:       0x0020
bNumInterfaces:       0x01
bConfigurationValue:  0x01
iConfiguration:       0x00
bmAttributes:         0x80 (Bus Powered )
MaxPower:             0xFA (500 Ma)

Interface Descriptor:
bInterfaceNumber:     0x00
bAlternateSetting:    0x00
bNumEndpoints:        0x02
bInterfaceClass:      0x58
bInterfaceSubClass:   0x42
bInterfaceProtocol:   0x00
iInterface:           0x00

Endpoint Descriptor:
bEndpointAddress:     0x82
Transfer Type:   Interrupt

Controller to Xbox

26 bytes (208 bits)

Field Bits Notes
AimingX 72-79 (Maybe 72-87 ?!) Corresponds to the "Aiming Lever" joystick on the right. X Axis value.
AimingY 88-95 (Maybe 88-103 ?!) Corresponds to the "Aiming Lever" joystick on the right. Y Axis value.
RotationLever 104-111 (Maybe 104-119 ?!) Corresponds to the "Rotation Lever" joystick on the left.
SightChangeX 120-127 (Maybe 120-135 ?!) Corresponds to the "Sight Change" analog stick on the "Rotation Lever" joystick. X Axis value.
SightChangeY 136-143 (Maybe 136-151 ?!) Corresponds to the "Sight Change" analog stick on the "Rotation Lever" joystick. Y Axis value.
LeftPedal 152-159 (Maybe 152-167 ?!) Corresponds to the left pedal on the pedal block
MiddlePedal 168-175 (Maybe 168-192 ?!) Corresponds to the middle pedal on the pedal block
RightPedal 184-191 Corresponds to the right pedal on the pedal block
192-195
TunerDial 196-199 Corresponds to the tuner dial position. 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.
GearLever 200-207 Corresponds to the gear lever on the left block.
// Based on http://steelbattalionnet.codeplex.com/SourceControl/latest#SBC/SteelBattalionController.cs
// See http://steelbattalionnet.codeplex.com/SourceControl/latest#SBC/lgpl-3.0.txt

  RightJoyMainWeapon       = BUTTON_MASK( 2, 0x01),
  RightJoyFire             = BUTTON_MASK( 2, 0x03), //FIXME: WTF?!
  RightJoyLockOn           = BUTTON_MASK( 2, 0x04),
  CockpitHatch             = BUTTON_MASK( 2, 0x10),
  Ignition                 = BUTTON_MASK( 2, 0x20),
  Start                    = BUTTON_MASK( 2, 0x40),
  Eject                    = BUTTON_MASK( 2, 0x08),
  MultiMonOpenClose        = BUTTON_MASK( 2, 0x80),
  MultiMonMapZoomInOut     = BUTTON_MASK( 3, 0x01),
  MultiMonModeSelect       = BUTTON_MASK( 3, 0x02),
  MultiMonSubMonitor       = BUTTON_MASK( 3, 0x04),
  MainMonZoomIn            = BUTTON_MASK( 3, 0x08),
  MainMonZoomOut           = BUTTON_MASK( 3, 0x10),
  FunctionFSS              = BUTTON_MASK( 3, 0x20),
  FunctionManipulator      = BUTTON_MASK( 3, 0x40),
  FunctionLineColorChange  = BUTTON_MASK( 3, 0x80),
  Washing                  = BUTTON_MASK( 4, 0x01),
  Extinguisher             = BUTTON_MASK( 4, 0x02),
  Chaff                    = BUTTON_MASK( 4, 0x04),
  FunctionTankDetach       = BUTTON_MASK( 4, 0x08),
  FunctionOverride         = BUTTON_MASK( 4, 0x10),
  FunctionNightScope       = BUTTON_MASK( 4, 0x20),
  FunctionF1               = BUTTON_MASK( 4, 0x40),
  FunctionF2               = BUTTON_MASK( 4, 0x80),
  FunctionF3               = BUTTON_MASK( 5, 0x01),
  WeaponConMain            = BUTTON_MASK( 5, 0x02),
  WeaponConSub             = BUTTON_MASK( 5, 0x04),
  WeaponConMagazine        = BUTTON_MASK( 5, 0x08),
  Comm1                    = BUTTON_MASK( 5, 0x10),
  Comm2                    = BUTTON_MASK( 5, 0x20),
  Comm3                    = BUTTON_MASK( 5, 0x40),
  Comm4                    = BUTTON_MASK( 5, 0x80),
  Comm5                    = BUTTON_MASK( 6, 0x01),
  LeftJoySightChange       = BUTTON_MASK( 6, 0x02),
  ToggleFilterControl      = BUTTON_MASK( 6, 0x04),
  ToggleOxygenSupply       = BUTTON_MASK( 6, 0x08),
  ToggleFuelFlowRate       = BUTTON_MASK( 6, 0x10),
  ToggleBuffreMaterial     = BUTTON_MASK( 6, 0x20),
  ToggleVTLocation         = BUTTON_MASK( 6, 0x40),

Xbox to Controller

34 bytes

  EmergencyEject            = FIELD_MASK(2, 0x0F),
  CockpitHatch              = FIELD_MASK(2, 0xF0),
  Ignition                  = FIELD_MASK(3, 0x0F),
  Start                     = FIELD_MASK(3, 0xF0),
  OpenClose                 = FIELD_MASK(4, 0x0F),
  MapZoomInOut              = FIELD_MASK(4, 0xF0),
  ModeSelect                = FIELD_MASK(5, 0x0F),
  SubMonitorModeSelect      = FIELD_MASK(5, 0xF0),
  MainMonitorZoomIn         = FIELD_MASK(6, 0x0F),
  MainMonitorZoomOut        = FIELD_MASK(6, 0xF0),
  ForecastShootingSystem    = FIELD_MASK(7, 0x0F),
  Manipulator               = FIELD_MASK(7, 0xF0),
  LineColorChange           = FIELD_MASK(8, 0x0F),
  Washing                   = FIELD_MASK(8, 0xF0),
  Extinguisher              = FIELD_MASK(9, 0x0F),
  Chaff                     = FIELD_MASK(9, 0xF0),
  TankDetach                = FIELD_MASK(10, 0x0F),
  Override                  = FIELD_MASK(10, 0xF0),
  NightScope                = FIELD_MASK(11, 0x0F),
  F1                        = FIELD_MASK(11, 0xF0),
  F2                        = FIELD_MASK(12, 0x0F),
  F3                        = FIELD_MASK(12, 0xF0),
  MainWeaponControl         = FIELD_MASK(13, 0x0F),
  SubWeaponControl          = FIELD_MASK(13, 0xF0),
  MagazineChange            = FIELD_MASK(14, 0x0F),
  Comm1                     = FIELD_MASK(14, 0xF0),
  Comm2                     = FIELD_MASK(15, 0x0F),
  Comm3                     = FIELD_MASK(15, 0xF0),
  Comm4                     = FIELD_MASK(16, 0x0F),
  Comm5                     = FIELD_MASK(16, 0xF0),

  GearR                     = FIELD_MASK(17, 0xF0),
  GearN                     = FIELD_MASK(18, 0x0F),
  Gear1                     = FIELD_MASK(18, 0xF0),
  Gear2                     = FIELD_MASK(19, 0x0F),
  Gear3                     = FIELD_MASK(19, 0xF0),
  Gear4                     = FIELD_MASK(20, 0x0F),
  Gear5                     = FIELD_MASK(20, 0xF0),