Support game controllers by LHLaurini · Pull Request #2130 · Genymobile/scrcpy (original) (raw)

This simulates an Xbox One controller:

Descriptor:

[
  0x05, 0x01,                    // Usage Page (Generic Desktop)
  0x09, 0x05,                    // Usage (Game Pad)
  0xa1, 0x01,                    // Collection (Application)
  0x09, 0x30,                    //   Usage (X)
  0x09, 0x31,                    //   Usage (Y)
  0x09, 0x32,                    //   Usage (Z)
  0x09, 0x35,                    //   Usage (Rz)
  0x15, 0x00,                    //   Logical Minimum (0)
  0x27, 0xFF, 0xFF, 0x00, 0x00,  //   Logical Maximum (65535)
  0x75, 0x10,                    //   Report Size (16)
  0x95, 0x04,                    //   Report Count (4)
  0x81, 0x02,                    //   Input (Data,Var,Abs)

  0x05, 0x02,                    //   Usage Page (Sim Controls)
  0x09, 0xC5,                    //   Usage (Brake)
  0x09, 0xC4,                    //   Usage (Accelerator)
  0x15, 0x00,                    //   Logical Minimum (0)
  0x27, 0xFF, 0xFF, 0x00, 0x00,  //   Logical Maximum (65535)
  0x75, 0x10,                    //   Report Size (16)
  0x95, 0x02,                    //   Report Count (2)
  0x81, 0x02,                    //   Input (Data,Var,Abs)

  0x05, 0x01,                    //   Usage Page (Generic Desktop Controls)
  0x09, 0x39,                    //   Usage (Hat switch)
  0x15, 0x01,                    //   Logical Minimum (1)
  0x25, 0x08,                    //   Logical Maximum (8)
  0x35, 0x00,                    //   Physical Minimum (0)
  0x46, 0x3B, 0x01,              //   Physical Maximum (315)
  0x66, 0x14, 0x00,              //   Unit (System: English Rotation, Length: Centimeter)
  0x75, 0x04,                    //   Report Size (4)
  0x95, 0x01,                    //   Report Count (1)
  0x81, 0x42,                    //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,Null State)
  0x75, 0x04,                    //   Report Size (4)
  0x95, 0x01,                    //   Report Count (1)
  0x15, 0x00,                    //   Logical Minimum (0)
  0x25, 0x00,                    //   Logical Maximum (0)
  0x35, 0x00,                    //   Physical Minimum (0)
  0x45, 0x00,                    //   Physical Maximum (0)
  0x65, 0x00,                    //   Unit (None)
  0x81, 0x03,                    //   Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)

  0x05, 0x09,                    //   Usage Page (Button)
  0x19, 0x01,                    //   Usage Minimum (Button 1)
  0x29, 0x0F,                    //   Usage Maximum (Button 15)
  0x15, 0x00,                    //   Logical Minium (0)
  0x25, 0x01,                    //   Logical Maximum (1)
  0x75, 0x01,                    //   Report Size (1)
  0x95, 0x0F,                    //   Report Count (15)
  0x81, 0x02,                    //   Input (Data,Var,Abs)
  0x75, 0x01,                    //   Report Size (1)
  0x95, 0x01,                    //   Report Count (1)
  0x81, 0x03,                    //   Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)

  0x05, 0x0C,                    //   Usage Page (Consumer)
  0x0A, 0x24, 0x02,              //   Usage (AC Back)
  0x0A, 0x23, 0x02,              //   Usage (AC Home)
  0x15, 0x00,                    //   Logical Minimum (0)
  0x25, 0x01,                    //   Logical Maximum (1)
  0x75, 0x01,                    //   Report Size (1)
  0x95, 0x02,                    //   Report Count (2)
  0x81, 0x02,                    //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
  0x15, 0x00,                    //   Logical Minimum (0)
  0x25, 0x00,                    //   Logical Maximum (0)
  0x75, 0x06,                    //   Report Size (6)
  0x95, 0x01,                    //   Report Count (1)
  0x81, 0x03,                    //   Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)

  0x05, 0x0F,                    //   Usage Page (Physical Input Device)
  0x09, 0x21,                    //   Usage (Set Effect Report)
  0xA1, 0x02,                    //   Collection (Logical)
  0x09, 0x97,                    //     Usage (DC Enable Actuators)
  0x15, 0x00,                    //     Logical Minimum (0)
  0x25, 0x01,                    //     Logical Maximum (1)
  0x75, 0x04,                    //     Report Size (4)
  0x95, 0x01,                    //     Report Count (1)
  0x91, 0x02,                    //     Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
  0x15, 0x00,                    //     Logical Minimum (0)
  0x25, 0x00,                    //     Logical Maximum (0)
  0x75, 0x04,                    //     Report Size (4)
  0x95, 0x01,                    //     Report Count (1)
  0x91, 0x03,                    //     Output (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
  0x09, 0x70,                    //     Usage (Magnitude)
  0x15, 0x00,                    //     Logical Minimum (0)
  0x25, 0x64,                    //     Logical Maximum (100)
  0x75, 0x08,                    //     Report Size (8)
  0x95, 0x04,                    //     Report Count (4)
  0x91, 0x02,                    //     Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
  0x09, 0x50,                    //     Usage (Duration)
  0x66, 0x01, 0x10,              //     Unit (System: SI Linear, Time: Seconds)
  0x55, 0x0E,                    //     Unit Exponent (-2)
  0x15, 0x00,                    //     Logical Minimum (0)
  0x26, 0xFF, 0x00,              //     Logical Maximum (255)
  0x75, 0x08,                    //     Report Size (8)
  0x95, 0x01,                    //     Report Count (1)
  0x91, 0x02,                    //     Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
  0x09, 0xA7,                    //     Usage (Start Delay)
  0x15, 0x00,                    //     Logical Minimum (0)
  0x26, 0xFF, 0x00,              //     Logical Maximum (255)
  0x75, 0x08,                    //     Report Size (8)
  0x95, 0x01,                    //     Report Count (1)
  0x91, 0x02,                    //     Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
  0x65, 0x00,                    //     Unit (None)
  0x55, 0x00,                    //     Unit Exponent (0)
  0x09, 0x7C,                    //     Usage (Loop Count)
  0x15, 0x00,                    //     Logical Minimum (0)
  0x26, 0xFF, 0x00,              //     Logical Maximum (255)
  0x75, 0x08,                    //     Report Size (8)
  0x95, 0x01,                    //     Report Count (1)
  0x91, 0x02,                    //     Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
  0xC0,                          //   End Collection

  0xc0,                          // End Collection
]

Input report format:

image

To enable rumble (vibration), the vendor ID and product ID must be 0x045e and 0x02fd for a special driver to load, it sends output reports for rumble:

image