Input: wacom_i2c - Add support for distance and tilt x/y
This is based on the out of tree rM2 driver. Signed-off-by: Alistair Francis <alistair@alistair23.me>rM2-mainline
parent
d389912489
commit
0debcb38ad
|
@ -22,12 +22,16 @@
|
|||
#define WACOM_CMD_QUERY3 0x02
|
||||
#define WACOM_CMD_THROW0 0x05
|
||||
#define WACOM_CMD_THROW1 0x00
|
||||
#define WACOM_QUERY_SIZE 19
|
||||
#define WACOM_QUERY_SIZE 22
|
||||
|
||||
struct wacom_features {
|
||||
int x_max;
|
||||
int y_max;
|
||||
int pressure_max;
|
||||
int distance_max;
|
||||
int distance_physical_max;
|
||||
int tilt_x_max;
|
||||
int tilt_y_max;
|
||||
char fw_version;
|
||||
};
|
||||
|
||||
|
@ -79,6 +83,10 @@ static int wacom_query_device(struct i2c_client *client,
|
|||
features->y_max = get_unaligned_le16(&data[5]);
|
||||
features->pressure_max = get_unaligned_le16(&data[11]);
|
||||
features->fw_version = get_unaligned_le16(&data[13]);
|
||||
features->distance_max = data[15];
|
||||
features->distance_physical_max = data[16];
|
||||
features->tilt_x_max = get_unaligned_le16(&data[17]);
|
||||
features->tilt_y_max = get_unaligned_le16(&data[19]);
|
||||
|
||||
dev_dbg(&client->dev,
|
||||
"x_max:%d, y_max:%d, pressure:%d, fw:%d\n",
|
||||
|
@ -95,6 +103,7 @@ static irqreturn_t wacom_i2c_irq(int irq, void *dev_id)
|
|||
u8 *data = wac_i2c->data;
|
||||
unsigned int x, y, pressure;
|
||||
unsigned char tsw, f1, f2, ers;
|
||||
short tilt_x, tilt_y, distance;
|
||||
int error;
|
||||
|
||||
error = i2c_master_recv(wac_i2c->client,
|
||||
|
@ -109,6 +118,11 @@ static irqreturn_t wacom_i2c_irq(int irq, void *dev_id)
|
|||
x = le16_to_cpup((__le16 *)&data[4]);
|
||||
y = le16_to_cpup((__le16 *)&data[6]);
|
||||
pressure = le16_to_cpup((__le16 *)&data[8]);
|
||||
distance = data[10];
|
||||
|
||||
/* Signed */
|
||||
tilt_x = le16_to_cpup((__le16 *)&data[11]);
|
||||
tilt_y = le16_to_cpup((__le16 *)&data[13]);
|
||||
|
||||
if (!wac_i2c->prox)
|
||||
wac_i2c->tool = (data[3] & 0x0c) ?
|
||||
|
@ -123,6 +137,9 @@ static irqreturn_t wacom_i2c_irq(int irq, void *dev_id)
|
|||
input_report_key(input, BTN_STYLUS, f1);
|
||||
input_report_key(input, BTN_STYLUS2, f2);
|
||||
input_report_abs(input, ABS_PRESSURE, pressure);
|
||||
input_report_abs(input, ABS_DISTANCE, distance);
|
||||
input_report_abs(input, ABS_TILT_X, tilt_x);
|
||||
input_report_abs(input, ABS_TILT_Y, tilt_y);
|
||||
input_sync(input);
|
||||
|
||||
out:
|
||||
|
@ -195,7 +212,11 @@ static int wacom_i2c_probe(struct i2c_client *client,
|
|||
input_set_abs_params(input, ABS_Y, 0, features.y_max, 0, 0);
|
||||
input_set_abs_params(input, ABS_PRESSURE,
|
||||
0, features.pressure_max, 0, 0);
|
||||
|
||||
input_set_abs_params(input, ABS_DISTANCE, 0, features.distance_max, 0, 0);
|
||||
input_set_abs_params(input, ABS_TILT_X, -features.tilt_x_max,
|
||||
features.tilt_x_max, 0, 0);
|
||||
input_set_abs_params(input, ABS_TILT_Y, -features.tilt_y_max,
|
||||
features.tilt_y_max, 0, 0);
|
||||
input_set_drvdata(input, wac_i2c);
|
||||
|
||||
error = request_threaded_irq(client->irq, NULL, wacom_i2c_irq,
|
||||
|
|
Loading…
Reference in New Issue