diff options
author | Vicki Pfau <vi@endrift.com> | 2022-11-29 18:32:58 -0800 |
---|---|---|
committer | Vicki Pfau <vi@endrift.com> | 2023-06-02 16:47:48 -0700 |
commit | 89fb71df3aa96222b476ad2d1665abfb3c1fbd47 (patch) | |
tree | 0e4da686ca4f57509de65fdb2019f6fadb0bf0b7 /drivers/hid | |
parent | 64efacc6a7462a18bccc9616c9695ca9bcaffb6b (diff) | |
download | linux-89fb71df3aa96222b476ad2d1665abfb3c1fbd47.tar.gz |
HID: hid-steam: Update list of identifiers from SDL
SDL includes a list of settings (registers), reports (cmds), and various other identifiers that were provided by Valve. This commit imports a significant chunk of that list as well as updating the guessed names and replacing a handful of magic constants. It also replaces bitmask definitions that used hex with the BIT macro. Signed-off-by: Vicki Pfau <vi@endrift.com>
Diffstat (limited to 'drivers/hid')
-rw-r--r-- | drivers/hid/hid-steam.c | 156 |
1 files changed, 121 insertions, 35 deletions
diff --git a/drivers/hid/hid-steam.c b/drivers/hid/hid-steam.c index aaca390ca299..4f10694c0fff 100644 --- a/drivers/hid/hid-steam.c +++ b/drivers/hid/hid-steam.c @@ -71,7 +71,7 @@ static LIST_HEAD(steam_devices); /* * Commands that can be sent in a feature report. - * Thanks to Valve for some valuable hints. + * Thanks to Valve and SDL for some valuable hints. */ #define STEAM_CMD_SET_MAPPINGS 0x80 #define STEAM_CMD_CLEAR_MAPPINGS 0x81 @@ -80,27 +80,98 @@ static LIST_HEAD(steam_devices); #define STEAM_CMD_GET_ATTRIB_LABEL 0x84 #define STEAM_CMD_DEFAULT_MAPPINGS 0x85 #define STEAM_CMD_FACTORY_RESET 0x86 -#define STEAM_CMD_WRITE_REGISTER 0x87 +#define STEAM_CMD_SET_REGISTER 0x87 #define STEAM_CMD_CLEAR_REGISTER 0x88 -#define STEAM_CMD_READ_REGISTER 0x89 +#define STEAM_CMD_GET_REGISTER 0x89 #define STEAM_CMD_GET_REGISTER_LABEL 0x8a #define STEAM_CMD_GET_REGISTER_MAX 0x8b #define STEAM_CMD_GET_REGISTER_DEFAULT 0x8c #define STEAM_CMD_SET_MODE 0x8d -#define STEAM_CMD_DEFAULT_MOUSE 0x8e -#define STEAM_CMD_FORCEFEEDBAK 0x8f -#define STEAM_CMD_REQUEST_COMM_STATUS 0xb4 -#define STEAM_CMD_GET_SERIAL 0xae +#define STEAM_CMD_DEFAULT_REGISTER 0x8e +#define STEAM_CMD_HAPTIC_PULSE 0x8f +#define STEAM_CMD_TURN_OFF_CONTROLLER 0x9f +#define STEAM_CMD_GET_DEVICE_IFNO 0xa1 +#define STEAM_CMD_CALIBRATE_TRACKPADS 0xa7 +#define STEAM_CMD_SET_SERIAL 0xa9 +#define STEAM_CMD_GET_TRACKPAD_CALIB 0xaa +#define STEAM_CMD_GET_TRACKPAD_FACTORY_CALIB 0xab +#define STEAM_CMD_GET_TRACKPAD_RAW_DATA 0xac +#define STEAM_CMD_ENABLE_PAIRING 0xad +#define STEAM_CMD_GET_STRING_ATTRIB 0xae +#define STEAM_CMD_RADIO_ERASE_RECORDS 0xaf +#define STEAM_CMD_RADIO_WRITE_RECORD 0xb0 +#define STEAM_CMD_SET_DONGLE_SETTING 0xb1 +#define STEAM_CMD_DONGLE_DISCONNECT_DEV 0xb2 +#define STEAM_CMD_DONGLE_COMMIT_DEV 0xb3 +#define STEAM_CMD_DONGLE_GET_STATE 0xb4 +#define STEAM_CMD_CALIBRATE_GYRO 0xb5 +#define STEAM_CMD_PLAY_AUDIO 0xb6 +#define STEAM_CMD_AUDIO_UPDATE_START 0xb7 +#define STEAM_CMD_AUDIO_UPDATE_DATA 0xb8 +#define STEAM_CMD_AUDIO_UPDATE_COMPLETE 0xb9 +#define STEAM_CMD_GET_CHIPID 0xba +#define STEAM_CMD_CALIBRATE_JOYSTICK 0xbf +#define STEAM_CMD_CALIBRATE_TRIGGERS 0xc0 +#define STEAM_CMD_SET_AUDIO_MAPPING 0xc1 +#define STEAM_CMD_CHECK_GYRO_FW_LOAD 0xc2 +#define STEAM_CMD_CALIBRATE_ANALOG 0xc3 +#define STEAM_CMD_DONGLE_GET_CONN_SLOTS 0xc4 +#define STEAM_CMD_HAPTIC_CMD 0xea #define STEAM_CMD_HAPTIC_RUMBLE 0xeb /* Some useful register ids */ -#define STEAM_REG_LPAD_MODE 0x07 -#define STEAM_REG_RPAD_MODE 0x08 -#define STEAM_REG_RPAD_MARGIN 0x18 -#define STEAM_REG_LED 0x2d -#define STEAM_REG_GYRO_MODE 0x30 -#define STEAM_REG_LPAD_CLICK_PRESSURE 0x34 -#define STEAM_REG_RPAD_CLICK_PRESSURE 0x35 +#define STEAM_REG_MOUSE_SENSITIVITY 0x00 +#define STEAM_REG_MOUSE_ACCELERATION 0x01 +#define STEAM_REG_TRACKBALL_ROTATION_ANGLE 0x02 +#define STEAM_REG_HAPTIC_INTENSITY 0x03 +#define STEAM_REG_LEFT_GAMEPAD_STICK_ENABLED 0x04 +#define STEAM_REG_RIGHT_GAMEPAD_STICK_ENABLED 0x05 +#define STEAM_REG_USB_DEBUG_MODE 0x06 +#define STEAM_REG_LEFT_TRACKPAD_MODE 0x07 +#define STEAM_REG_RIGHT_TRACKPAD_MODE 0x08 +#define STEAM_REG_MOUSE_POINTER_ENABLED 0x09 +#define STEAM_REG_DPAD_DEADZONE 0x0a +#define STEAM_REG_MINIMUM_MOMENTUM_VEL 0x0b +#define STEAM_REG_MOMENTUM_DECAY_AMOUNT 0x0c +#define STEAM_REG_PAD_REL_MODE_TICKS_PER_PIXEL 0x0d +#define STEAM_REG_HAPTIC_INCREMENT 0x0e +#define STEAM_REG_DPAD_ANGLE_SIN 0x0f +#define STEAM_REG_DPAD_ANGLE_COS 0x10 +#define STEAM_REG_MOMENTUM_VERTICAL_DIVISOR 0x11 +#define STEAM_REG_MOMENTUM_MAXIMUM_VELOCITY 0x12 +#define STEAM_REG_TRACKPAD_Z_ON 0x13 +#define STEAM_REG_TRACKPAD_Z_OFF 0x14 +#define STEAM_REG_SENSITIVY_SCALE_AMOUNT 0x15 +#define STEAM_REG_LEFT_TRACKPAD_SECONDARY_MODE 0x16 +#define STEAM_REG_RIGHT_TRACKPAD_SECONDARY_MODE 0x17 +#define STEAM_REG_SMOOTH_ABSOLUTE_MOUSE 0x18 +#define STEAM_REG_STEAMBUTTON_POWEROFF_TIME 0x19 +#define STEAM_REG_TRACKPAD_OUTER_RADIUS 0x1b +#define STEAM_REG_TRACKPAD_Z_ON_LEFT 0x1c +#define STEAM_REG_TRACKPAD_Z_OFF_LEFT 0x1d +#define STEAM_REG_TRACKPAD_OUTER_SPIN_VEL 0x1e +#define STEAM_REG_TRACKPAD_OUTER_SPIN_RADIUS 0x1f +#define STEAM_REG_TRACKPAD_OUTER_SPIN_HORIZONTAL_ONLY 0x20 +#define STEAM_REG_TRACKPAD_RELATIVE_MODE_DEADZONE 0x21 +#define STEAM_REG_TRACKPAD_RELATIVE_MODE_MAX_VEL 0x22 +#define STEAM_REG_TRACKPAD_RELATIVE_MODE_INVERT_Y 0x23 +#define STEAM_REG_TRACKPAD_DOUBLE_TAP_BEEP_ENABLED 0x24 +#define STEAM_REG_TRACKPAD_DOUBLE_TAP_BEEP_PERIOD 0x25 +#define STEAM_REG_TRACKPAD_DOUBLE_TAP_BEEP_COUNT 0x26 +#define STEAM_REG_TRACKPAD_OUTER_RADIUS_RELEASE_ON_TRANSITION 0x27 +#define STEAM_REG_RADIAL_MODE_ANGLE 0x28 +#define STEAM_REG_HAPTIC_INTENSITY_MOUSE_MODE 0x29 +#define STEAM_REG_LEFT_DPAD_REQUIRES_CLICK 0x2a +#define STEAM_REG_RIGHT_DPAD_REQUIRES_CLICK 0x2b +#define STEAM_REG_LED_BASELINE_BRIGHTNESS 0x2c +#define STEAM_REG_LED_USER_BRIGHTNESS 0x2d +#define STEAM_REG_ENABLE_RAW_JOYSTICK 0x2e +#define STEAM_REG_ENABLE_FAST_SCAN 0x2f +#define STEAM_REG_GYRO_MODE 0x30 +#define STEAM_REG_WIRELESS_PACKET_VERSION 0x31 +#define STEAM_REG_SLEEP_INACTIVITY_TIMEOUT 0x32 +#define STEAM_REG_LEFT_TRACKPAD_CLICK_PRESSURE 0x34 +#define STEAM_REG_RIGHT_TRACKPAD_CLICK_PRESSURE 0x35 /* Raw event identifiers */ #define STEAM_EV_INPUT_DATA 0x01 @@ -108,13 +179,28 @@ static LIST_HEAD(steam_devices); #define STEAM_EV_BATTERY 0x04 #define STEAM_EV_DECK_INPUT_DATA 0x09 +/* String attribute idenitifiers */ +#define STEAM_ATTRIB_STR_BOARD_SERIAL 0x00 +#define STEAM_ATTRIB_STR_UNIT_SERIAL 0x01 + /* Values for GYRO_MODE (bitmask) */ -#define STEAM_GYRO_MODE_OFF 0x0000 -#define STEAM_GYRO_MODE_STEERING 0x0001 -#define STEAM_GYRO_MODE_TILT 0x0002 -#define STEAM_GYRO_MODE_SEND_ORIENTATION 0x0004 -#define STEAM_GYRO_MODE_SEND_RAW_ACCEL 0x0008 -#define STEAM_GYRO_MODE_SEND_RAW_GYRO 0x0010 +#define STEAM_GYRO_MODE_OFF 0 +#define STEAM_GYRO_MODE_STEERING BIT(0) +#define STEAM_GYRO_MODE_TILT BIT(1) +#define STEAM_GYRO_MODE_SEND_ORIENTATION BIT(2) +#define STEAM_GYRO_MODE_SEND_RAW_ACCEL BIT(3) +#define STEAM_GYRO_MODE_SEND_RAW_GYRO BIT(4) + +/* Trackpad modes */ +#define STEAM_TRACKPAD_ABSOLUTE_MOUSE 0x00 +#define STEAM_TRACKPAD_RELATIVE_MOUSE 0x01 +#define STEAM_TRACKPAD_DPAD_FOUR_WAY_DISCRETE 0x02 +#define STEAM_TRACKPAD_DPAD_FOUR_WAY_OVERLAP 0x03 +#define STEAM_TRACKPAD_DPAD_EIGHT_WAY 0x04 +#define STEAM_TRACKPAD_RADIAL_MODE 0x05 +#define STEAM_TRACKPAD_ABSOLUTE_DPAD 0x06 +#define STEAM_TRACKPAD_NONE 0x07 +#define STEAM_TRACKPAD_GESTURE_KEYBOARD 0x08 /* Other random constants */ #define STEAM_SERIAL_LEN 10 @@ -232,7 +318,7 @@ static int steam_write_registers(struct steam_device *steam, /* Send: 0x87 len (reg valLo valHi)* */ u8 reg; u16 val; - u8 cmd[64] = {STEAM_CMD_WRITE_REGISTER, 0x00}; + u8 cmd[64] = {STEAM_CMD_SET_REGISTER, 0x00}; int ret; va_list args; @@ -268,7 +354,7 @@ static int steam_get_serial(struct steam_device *steam) * Recv: 0xae 0x15 0x01 serialnumber (10 chars) */ int ret; - u8 cmd[] = {STEAM_CMD_GET_SERIAL, 0x15, 0x01}; + u8 cmd[] = {STEAM_CMD_GET_STRING_ATTRIB, 0x15, STEAM_ATTRIB_STR_UNIT_SERIAL}; u8 reply[3 + STEAM_SERIAL_LEN + 1]; ret = steam_send_report(steam, cmd, sizeof(cmd)); @@ -277,7 +363,7 @@ static int steam_get_serial(struct steam_device *steam) ret = steam_recv_report(steam, reply, sizeof(reply)); if (ret < 0) return ret; - if (reply[0] != 0xae || reply[1] != 0x15 || reply[2] != 0x01) + if (reply[0] != 0xae || reply[1] != 0x15 || reply[2] != STEAM_ATTRIB_STR_UNIT_SERIAL) return -EIO; reply[3 + STEAM_SERIAL_LEN] = 0; strscpy(steam->serial_no, reply + 3, sizeof(steam->serial_no)); @@ -291,7 +377,7 @@ static int steam_get_serial(struct steam_device *steam) */ static inline int steam_request_conn_status(struct steam_device *steam) { - return steam_send_report_byte(steam, STEAM_CMD_REQUEST_COMM_STATUS); + return steam_send_report_byte(steam, STEAM_CMD_DONGLE_GET_STATE); } static inline int steam_haptic_rumble(struct steam_device *steam, @@ -339,9 +425,9 @@ static void steam_set_lizard_mode(struct steam_device *steam, bool enable) /* enable esc, enter, cursors */ steam_send_report_byte(steam, STEAM_CMD_DEFAULT_MAPPINGS); /* enable mouse */ - steam_send_report_byte(steam, STEAM_CMD_DEFAULT_MOUSE); + steam_send_report_byte(steam, STEAM_CMD_DEFAULT_REGISTER); steam_write_registers(steam, - STEAM_REG_RPAD_MARGIN, 0x01, /* enable margin */ + STEAM_REG_SMOOTH_ABSOLUTE_MOUSE, 0x01, /* enable smooth */ 0); cancel_delayed_work_sync(&steam->heartbeat); @@ -351,11 +437,11 @@ static void steam_set_lizard_mode(struct steam_device *steam, bool enable) if (steam->quirks & STEAM_QUIRK_DECK) { steam_write_registers(steam, - STEAM_REG_RPAD_MARGIN, 0x00, /* disable margin */ - STEAM_REG_LPAD_MODE, 0x07, /* disable mouse */ - STEAM_REG_RPAD_MODE, 0x07, /* disable mouse */ - STEAM_REG_LPAD_CLICK_PRESSURE, 0xFFFF, /* disable clicky pad */ - STEAM_REG_RPAD_CLICK_PRESSURE, 0xFFFF, /* disable clicky pad */ + STEAM_REG_SMOOTH_ABSOLUTE_MOUSE, 0x00, /* disable smooth */ + STEAM_REG_LEFT_TRACKPAD_MODE, STEAM_TRACKPAD_NONE, /* disable mouse */ + STEAM_REG_RIGHT_TRACKPAD_MODE, STEAM_TRACKPAD_NONE, /* disable mouse */ + STEAM_REG_LEFT_TRACKPAD_CLICK_PRESSURE, 0xFFFF, /* disable clicky pad */ + STEAM_REG_RIGHT_TRACKPAD_CLICK_PRESSURE, 0xFFFF, /* disable clicky pad */ 0); /* * The Steam Deck has a watchdog that automatically enables @@ -365,9 +451,9 @@ static void steam_set_lizard_mode(struct steam_device *steam, bool enable) schedule_delayed_work(&steam->heartbeat, 5 * HZ); } else { steam_write_registers(steam, - STEAM_REG_RPAD_MARGIN, 0x00, /* disable margin */ - STEAM_REG_LPAD_MODE, 0x07, /* disable mouse */ - STEAM_REG_RPAD_MODE, 0x07, /* disable mouse */ + STEAM_REG_SMOOTH_ABSOLUTE_MOUSE, 0x00, /* disable smooth */ + STEAM_REG_LEFT_TRACKPAD_MODE, STEAM_TRACKPAD_NONE, /* disable mouse */ + STEAM_REG_RIGHT_TRACKPAD_MODE, STEAM_TRACKPAD_NONE, /* disable mouse */ 0); } } @@ -747,7 +833,7 @@ static void steam_lizard_mode_heartbeat(struct work_struct *work) if (!steam->client_opened && steam->client_hdev) { steam_send_report_byte(steam, STEAM_CMD_CLEAR_MAPPINGS); steam_write_registers(steam, - STEAM_REG_RPAD_MODE, 0x07, /* disable mouse */ + STEAM_REG_RIGHT_TRACKPAD_MODE, STEAM_TRACKPAD_NONE, /* disable mouse */ 0); schedule_delayed_work(&steam->heartbeat, 5 * HZ); } |