summary refs log tree commit diff
path: root/drivers/hid
diff options
context:
space:
mode:
authorVicki Pfau <vi@endrift.com>2022-11-29 18:32:58 -0800
committerVicki Pfau <vi@endrift.com>2023-06-02 16:47:48 -0700
commit89fb71df3aa96222b476ad2d1665abfb3c1fbd47 (patch)
tree0e4da686ca4f57509de65fdb2019f6fadb0bf0b7 /drivers/hid
parent64efacc6a7462a18bccc9616c9695ca9bcaffb6b (diff)
downloadlinux-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.c156
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);
 	}