Skip to contentSkip to conversation

elantech: fix for newer hardware versions (v7)

PATCH Superseded Matteo Delfino 2 participants 3 messages Jul 5, 2013 – Jul 6, 2013

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

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
index e2a9867..4d54773 100644
@@ -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
maintainer
#1 lore raw

Hi Matteo,

Quoted 16 lines · Matteo Delfino

* 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.

Quoted 2 lines

Additional-author: Giovanni Frigione <[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
#2 lore raw

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 in elantech_packet_check_v4() into a 'switch'?

Sure, i will.

Best regards,
Matteo