elantech: fix for newer hardware versions (v7)
Subsystems (2)
PATCH 1/1 elantech: fix for newer hardware versions (v7)
* Fix version recognition in elantech_set_properties
The new hardware reports itself as v7 but the packets' structure is unaltered.
* Fix packet type recognition in elantech_packet_check_v4
The bitmask used for v6 is too wide, only the last three bits of the third byte in a packet (packet[3] & 0x03) are actually used to distinguish between packet types.
Starting from v7, additional information (to be interpreted) is stored in the remaining bits (packets[3] & 0x1c).
In addition, the value stored in (packet[0] & 0x0c) is no longer a constant but contains additional information yet to be deciphered. This change should be backwards compatible with v6 hardware.
Additional-author: Giovanni Frigione <[email protected]>
--- drivers/input/mouse/elantech.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
drivers/input/mouse/elantech.c +0 -0
@@ -677,17 +677,15 @@ static int elantech_packet_check_v3(struct psmouse
*psmouse)
static int elantech_packet_check_v4(struct psmouse *psmouse) {
unsigned char *packet = psmouse->packet;
+ unsigned char packet_type = packet[3] & 0x03;
- if ((packet[0] & 0x0c) == 0x04 &&
- (packet[3] & 0x1f) == 0x11)
+ if (packet_type == 0x01)
return PACKET_V4_HEAD;
- if ((packet[0] & 0x0c) == 0x04 &&
- (packet[3] & 0x1f) == 0x12)
+ if (packet_type == 0x02)
return PACKET_V4_MOTION;
- if ((packet[0] & 0x0c) == 0x04 &&
- (packet[3] & 0x1f) == 0x10)
+ if (packet_type == 0x00)
return PACKET_V4_STATUS;
return PACKET_UNKNOWN;
@@ -1226,6 +1224,7 @@ static int elantech_set_properties(struct elantech_data *etd)
etd->hw_version = 3;
break;
case 6:
+ case 7:
etd->hw_version = 4;
break;
default:
Signature · 1 line
1.7.10.4
Dmitry Torokhov
maintainerHi Matteo,
Quoted 16 lines · Matteo Delfino
* Fix version recognition in
elantech_set_propertiesThe new hardware reports itself as v7 but the packets' structure is unaltered.
* Fix packet type recognition in
elantech_packet_check_v4The bitmask used for v6 is too wide, only the last three bits of the third byte in a packet (packet[3] &
0x03) are actually used to distinguish between packet types.
Starting from v7, additional information (to be interpreted) is stored in the remaining bits (packets[3] &0x1c).
In addition, the value stored in (packet[0] &0x0c) is no longer a constant but contains additional information yet to be deciphered. This change should be backwards compatible with v6 hardware.
Quoted 2 lines
Additional-author: Giovanni Frigione <[email protected]>
Signed-off-by Matteo Delfino <[email protected]>
Thank you for the patch, unfortunately your mailer line-wrapped it and it can't be applied. Could you please resend it using MUA that does not perform line-wrapping?
Also, now that you only use (packet[3] & 0x03) to determine packet type, could you turn series of 'if' statements in elantech_packet_check_v4() into a 'switch'?
Thanks!
Signature · 1 line
Dmitry
Hi Dmitry,
Quoted 4 lines · Dmitry Torokhov
Thank you for the patch, unfortunately your mailer line-wrapped it and it can't be applied. Could you please resend it using MUA that does not perform line-wrapping?
Of course, sorry about that.
Quoted 3 lines
Also, now that you only use (packet[3] &
0x03) to determine packet type, could you turn series of 'if' statements inelantech_packet_check_v4()into a 'switch'?
Sure, i will.
Best regards,
Matteo