@@ -113,6 +113,11 @@ static void wacom_notify_battery(struct wacom_wac *wacom_wac,
113
113
bool bat_connected , bool ps_connected )
114
114
{
115
115
struct wacom * wacom = container_of (wacom_wac , struct wacom , wacom_wac );
116
+ bool bat_initialized = wacom -> battery .battery ;
117
+ bool has_quirk = wacom_wac -> features .quirks & WACOM_QUIRK_BATTERY ;
118
+
119
+ if (bat_initialized != has_quirk )
120
+ wacom_schedule_work (wacom_wac , WACOM_WORKER_BATTERY );
116
121
117
122
__wacom_notify_battery (& wacom -> battery , bat_status , bat_capacity ,
118
123
bat_charging , bat_connected , ps_connected );
@@ -1308,6 +1313,9 @@ static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom)
1308
1313
1309
1314
struct input_dev * pen_input = wacom -> pen_input ;
1310
1315
unsigned char * data = wacom -> data ;
1316
+ int number_of_valid_frames = 0 ;
1317
+ int time_interval = 15000000 ;
1318
+ ktime_t time_packet_received = ktime_get ();
1311
1319
int i ;
1312
1320
1313
1321
if (wacom -> features .type == INTUOSP2_BT ||
@@ -1328,12 +1336,30 @@ static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom)
1328
1336
wacom -> id [0 ] |= (wacom -> serial [0 ] >> 32 ) & 0xFFFFF ;
1329
1337
}
1330
1338
1339
+ /* number of valid frames */
1331
1340
for (i = 0 ; i < pen_frames ; i ++ ) {
1332
1341
unsigned char * frame = & data [i * pen_frame_len + 1 ];
1333
1342
bool valid = frame [0 ] & 0x80 ;
1343
+
1344
+ if (valid )
1345
+ number_of_valid_frames ++ ;
1346
+ }
1347
+
1348
+ if (number_of_valid_frames ) {
1349
+ if (wacom -> hid_data .time_delayed )
1350
+ time_interval = ktime_get () - wacom -> hid_data .time_delayed ;
1351
+ time_interval /= number_of_valid_frames ;
1352
+ wacom -> hid_data .time_delayed = time_packet_received ;
1353
+ }
1354
+
1355
+ for (i = 0 ; i < number_of_valid_frames ; i ++ ) {
1356
+ unsigned char * frame = & data [i * pen_frame_len + 1 ];
1357
+ bool valid = frame [0 ] & 0x80 ;
1334
1358
bool prox = frame [0 ] & 0x40 ;
1335
1359
bool range = frame [0 ] & 0x20 ;
1336
1360
bool invert = frame [0 ] & 0x10 ;
1361
+ int frames_number_reversed = number_of_valid_frames - i - 1 ;
1362
+ int event_timestamp = time_packet_received - frames_number_reversed * time_interval ;
1337
1363
1338
1364
if (!valid )
1339
1365
continue ;
@@ -1346,6 +1372,7 @@ static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom)
1346
1372
wacom -> tool [0 ] = 0 ;
1347
1373
wacom -> id [0 ] = 0 ;
1348
1374
wacom -> serial [0 ] = 0 ;
1375
+ wacom -> hid_data .time_delayed = 0 ;
1349
1376
return ;
1350
1377
}
1351
1378
@@ -1382,6 +1409,7 @@ static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom)
1382
1409
get_unaligned_le16 (& frame [11 ]));
1383
1410
}
1384
1411
}
1412
+
1385
1413
if (wacom -> tool [0 ]) {
1386
1414
input_report_abs (pen_input , ABS_PRESSURE , get_unaligned_le16 (& frame [5 ]));
1387
1415
if (wacom -> features .type == INTUOSP2_BT ||
@@ -1405,6 +1433,9 @@ static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom)
1405
1433
1406
1434
wacom -> shared -> stylus_in_proximity = prox ;
1407
1435
1436
+ /* add timestamp to unpack the frames */
1437
+ input_set_timestamp (pen_input , event_timestamp );
1438
+
1408
1439
input_sync (pen_input );
1409
1440
}
1410
1441
}
@@ -1895,6 +1926,7 @@ static void wacom_map_usage(struct input_dev *input, struct hid_usage *usage,
1895
1926
int fmax = field -> logical_maximum ;
1896
1927
unsigned int equivalent_usage = wacom_equivalent_usage (usage -> hid );
1897
1928
int resolution_code = code ;
1929
+ int resolution = hidinput_calc_abs_res (field , resolution_code );
1898
1930
1899
1931
if (equivalent_usage == HID_DG_TWIST ) {
1900
1932
resolution_code = ABS_RZ ;
@@ -1915,8 +1947,15 @@ static void wacom_map_usage(struct input_dev *input, struct hid_usage *usage,
1915
1947
switch (type ) {
1916
1948
case EV_ABS :
1917
1949
input_set_abs_params (input , code , fmin , fmax , fuzz , 0 );
1918
- input_abs_set_res (input , code ,
1919
- hidinput_calc_abs_res (field , resolution_code ));
1950
+
1951
+ /* older tablet may miss physical usage */
1952
+ if ((code == ABS_X || code == ABS_Y ) && !resolution ) {
1953
+ resolution = WACOM_INTUOS_RES ;
1954
+ hid_warn (input ,
1955
+ "Wacom usage (%d) missing resolution \n" ,
1956
+ code );
1957
+ }
1958
+ input_abs_set_res (input , code , resolution );
1920
1959
break ;
1921
1960
case EV_KEY :
1922
1961
case EV_MSC :
@@ -1929,18 +1968,7 @@ static void wacom_map_usage(struct input_dev *input, struct hid_usage *usage,
1929
1968
static void wacom_wac_battery_usage_mapping (struct hid_device * hdev ,
1930
1969
struct hid_field * field , struct hid_usage * usage )
1931
1970
{
1932
- struct wacom * wacom = hid_get_drvdata (hdev );
1933
- struct wacom_wac * wacom_wac = & wacom -> wacom_wac ;
1934
- struct wacom_features * features = & wacom_wac -> features ;
1935
- unsigned equivalent_usage = wacom_equivalent_usage (usage -> hid );
1936
-
1937
- switch (equivalent_usage ) {
1938
- case HID_DG_BATTERYSTRENGTH :
1939
- case WACOM_HID_WD_BATTERY_LEVEL :
1940
- case WACOM_HID_WD_BATTERY_CHARGING :
1941
- features -> quirks |= WACOM_QUIRK_BATTERY ;
1942
- break ;
1943
- }
1971
+ return ;
1944
1972
}
1945
1973
1946
1974
static void wacom_wac_battery_event (struct hid_device * hdev , struct hid_field * field ,
@@ -1961,18 +1989,21 @@ static void wacom_wac_battery_event(struct hid_device *hdev, struct hid_field *f
1961
1989
wacom_wac -> hid_data .bat_connected = 1 ;
1962
1990
wacom_wac -> hid_data .bat_status = WACOM_POWER_SUPPLY_STATUS_AUTO ;
1963
1991
}
1992
+ wacom_wac -> features .quirks |= WACOM_QUIRK_BATTERY ;
1964
1993
break ;
1965
1994
case WACOM_HID_WD_BATTERY_LEVEL :
1966
1995
value = value * 100 / (field -> logical_maximum - field -> logical_minimum );
1967
1996
wacom_wac -> hid_data .battery_capacity = value ;
1968
1997
wacom_wac -> hid_data .bat_connected = 1 ;
1969
1998
wacom_wac -> hid_data .bat_status = WACOM_POWER_SUPPLY_STATUS_AUTO ;
1999
+ wacom_wac -> features .quirks |= WACOM_QUIRK_BATTERY ;
1970
2000
break ;
1971
2001
case WACOM_HID_WD_BATTERY_CHARGING :
1972
2002
wacom_wac -> hid_data .bat_charging = value ;
1973
2003
wacom_wac -> hid_data .ps_connected = value ;
1974
2004
wacom_wac -> hid_data .bat_connected = 1 ;
1975
2005
wacom_wac -> hid_data .bat_status = WACOM_POWER_SUPPLY_STATUS_AUTO ;
2006
+ wacom_wac -> features .quirks |= WACOM_QUIRK_BATTERY ;
1976
2007
break ;
1977
2008
}
1978
2009
}
@@ -1988,18 +2019,15 @@ static void wacom_wac_battery_report(struct hid_device *hdev,
1988
2019
{
1989
2020
struct wacom * wacom = hid_get_drvdata (hdev );
1990
2021
struct wacom_wac * wacom_wac = & wacom -> wacom_wac ;
1991
- struct wacom_features * features = & wacom_wac -> features ;
1992
2022
1993
- if (features -> quirks & WACOM_QUIRK_BATTERY ) {
1994
- int status = wacom_wac -> hid_data .bat_status ;
1995
- int capacity = wacom_wac -> hid_data .battery_capacity ;
1996
- bool charging = wacom_wac -> hid_data .bat_charging ;
1997
- bool connected = wacom_wac -> hid_data .bat_connected ;
1998
- bool powered = wacom_wac -> hid_data .ps_connected ;
2023
+ int status = wacom_wac -> hid_data .bat_status ;
2024
+ int capacity = wacom_wac -> hid_data .battery_capacity ;
2025
+ bool charging = wacom_wac -> hid_data .bat_charging ;
2026
+ bool connected = wacom_wac -> hid_data .bat_connected ;
2027
+ bool powered = wacom_wac -> hid_data .ps_connected ;
1999
2028
2000
- wacom_notify_battery (wacom_wac , status , capacity , charging ,
2001
- connected , powered );
2002
- }
2029
+ wacom_notify_battery (wacom_wac , status , capacity , charging ,
2030
+ connected , powered );
2003
2031
}
2004
2032
2005
2033
static void wacom_wac_pad_usage_mapping (struct hid_device * hdev ,
@@ -3365,19 +3393,13 @@ static int wacom_status_irq(struct wacom_wac *wacom_wac, size_t len)
3365
3393
int battery = (data [8 ] & 0x3f ) * 100 / 31 ;
3366
3394
bool charging = !!(data [8 ] & 0x80 );
3367
3395
3396
+ features -> quirks |= WACOM_QUIRK_BATTERY ;
3368
3397
wacom_notify_battery (wacom_wac , WACOM_POWER_SUPPLY_STATUS_AUTO ,
3369
3398
battery , charging , battery || charging , 1 );
3370
-
3371
- if (!wacom -> battery .battery &&
3372
- !(features -> quirks & WACOM_QUIRK_BATTERY )) {
3373
- features -> quirks |= WACOM_QUIRK_BATTERY ;
3374
- wacom_schedule_work (wacom_wac , WACOM_WORKER_BATTERY );
3375
- }
3376
3399
}
3377
3400
else if ((features -> quirks & WACOM_QUIRK_BATTERY ) &&
3378
3401
wacom -> battery .battery ) {
3379
3402
features -> quirks &= ~WACOM_QUIRK_BATTERY ;
3380
- wacom_schedule_work (wacom_wac , WACOM_WORKER_BATTERY );
3381
3403
wacom_notify_battery (wacom_wac , POWER_SUPPLY_STATUS_UNKNOWN , 0 , 0 , 0 , 0 );
3382
3404
}
3383
3405
return 0 ;
0 commit comments