|
@@ -35,6 +35,8 @@ struct wacom_data {
|
|
|
__u16 tool;
|
|
|
unsigned char butstate;
|
|
|
__u8 features;
|
|
|
+ __u32 id;
|
|
|
+ __u32 serial;
|
|
|
unsigned char high_speed;
|
|
|
#ifdef CONFIG_HID_WACOM_POWER_SUPPLY
|
|
|
int battery_capacity;
|
|
@@ -318,26 +320,30 @@ static void wacom_i4_parse_pen_report(struct wacom_data *wdata,
|
|
|
struct input_dev *input, unsigned char *data)
|
|
|
{
|
|
|
__u16 x, y, pressure;
|
|
|
- __u32 id;
|
|
|
|
|
|
switch (data[1]) {
|
|
|
case 0x80: /* Out of proximity report */
|
|
|
input_report_key(input, BTN_TOUCH, 0);
|
|
|
input_report_abs(input, ABS_PRESSURE, 0);
|
|
|
input_report_key(input, wdata->tool, 0);
|
|
|
+ input_report_abs(input, ABS_MISC, 0);
|
|
|
+ input_event(input, EV_MSC, MSC_SERIAL, wdata->serial);
|
|
|
wdata->tool = 0;
|
|
|
input_sync(input);
|
|
|
break;
|
|
|
case 0xC2: /* Tool report */
|
|
|
- id = ((data[2] << 4) | (data[3] >> 4) |
|
|
|
+ wdata->id = ((data[2] << 4) | (data[3] >> 4) |
|
|
|
((data[7] & 0x0f) << 20) |
|
|
|
- ((data[8] & 0xf0) << 12)) & 0xfffff;
|
|
|
+ ((data[8] & 0xf0) << 12));
|
|
|
+ wdata->serial = ((data[3] & 0x0f) << 28) +
|
|
|
+ (data[4] << 20) + (data[5] << 12) +
|
|
|
+ (data[6] << 4) + (data[7] >> 4);
|
|
|
|
|
|
- switch (id) {
|
|
|
- case 0x802:
|
|
|
+ switch (wdata->id) {
|
|
|
+ case 0x100802:
|
|
|
wdata->tool = BTN_TOOL_PEN;
|
|
|
break;
|
|
|
- case 0x80A:
|
|
|
+ case 0x10080A:
|
|
|
wdata->tool = BTN_TOOL_RUBBER;
|
|
|
break;
|
|
|
}
|
|
@@ -356,6 +362,9 @@ static void wacom_i4_parse_pen_report(struct wacom_data *wdata,
|
|
|
input_report_abs(input, ABS_X, x);
|
|
|
input_report_abs(input, ABS_Y, y);
|
|
|
input_report_abs(input, ABS_PRESSURE, pressure);
|
|
|
+ input_report_abs(input, ABS_MISC, wdata->id);
|
|
|
+ input_event(input, EV_MSC, MSC_SERIAL, wdata->serial);
|
|
|
+ input_report_key(input, wdata->tool, 1);
|
|
|
input_sync(input);
|
|
|
break;
|
|
|
}
|