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_QUERY3 0x02
|
||||||
#define WACOM_CMD_THROW0 0x05
|
#define WACOM_CMD_THROW0 0x05
|
||||||
#define WACOM_CMD_THROW1 0x00
|
#define WACOM_CMD_THROW1 0x00
|
||||||
#define WACOM_QUERY_SIZE 19
|
#define WACOM_QUERY_SIZE 22
|
||||||
|
|
||||||
struct wacom_features {
|
struct wacom_features {
|
||||||
int x_max;
|
int x_max;
|
||||||
int y_max;
|
int y_max;
|
||||||
int pressure_max;
|
int pressure_max;
|
||||||
|
int distance_max;
|
||||||
|
int distance_physical_max;
|
||||||
|
int tilt_x_max;
|
||||||
|
int tilt_y_max;
|
||||||
char fw_version;
|
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->y_max = get_unaligned_le16(&data[5]);
|
||||||
features->pressure_max = get_unaligned_le16(&data[11]);
|
features->pressure_max = get_unaligned_le16(&data[11]);
|
||||||
features->fw_version = get_unaligned_le16(&data[13]);
|
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,
|
dev_dbg(&client->dev,
|
||||||
"x_max:%d, y_max:%d, pressure:%d, fw:%d\n",
|
"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;
|
u8 *data = wac_i2c->data;
|
||||||
unsigned int x, y, pressure;
|
unsigned int x, y, pressure;
|
||||||
unsigned char tsw, f1, f2, ers;
|
unsigned char tsw, f1, f2, ers;
|
||||||
|
short tilt_x, tilt_y, distance;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
error = i2c_master_recv(wac_i2c->client,
|
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]);
|
x = le16_to_cpup((__le16 *)&data[4]);
|
||||||
y = le16_to_cpup((__le16 *)&data[6]);
|
y = le16_to_cpup((__le16 *)&data[6]);
|
||||||
pressure = le16_to_cpup((__le16 *)&data[8]);
|
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)
|
if (!wac_i2c->prox)
|
||||||
wac_i2c->tool = (data[3] & 0x0c) ?
|
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_STYLUS, f1);
|
||||||
input_report_key(input, BTN_STYLUS2, f2);
|
input_report_key(input, BTN_STYLUS2, f2);
|
||||||
input_report_abs(input, ABS_PRESSURE, pressure);
|
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);
|
input_sync(input);
|
||||||
|
|
||||||
out:
|
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_Y, 0, features.y_max, 0, 0);
|
||||||
input_set_abs_params(input, ABS_PRESSURE,
|
input_set_abs_params(input, ABS_PRESSURE,
|
||||||
0, features.pressure_max, 0, 0);
|
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);
|
input_set_drvdata(input, wac_i2c);
|
||||||
|
|
||||||
error = request_threaded_irq(client->irq, NULL, wacom_i2c_irq,
|
error = request_threaded_irq(client->irq, NULL, wacom_i2c_irq,
|
||||||
|
|
Loading…
Reference in New Issue