![Matteo Delfino](/assets/img/avatar_default.png)
The signatures of v3 and v4 packets change depending on the value of a
hardware flag called 'crc_enabled'. The packet type detection must change
accordingly.
This patch also restores a consistency check for v4 packets inadvertently
removed by commit:
9eebed7de6
Input: elantech - fix for newer hardware versions (v7)
A note about the naming convention: v3 hardware is associated with IC body
v5 while v4 hardware is associated with IC body v6 and v7. The above commit
refers to IC body v7, not to v7 hardware.
Tested on Samsung NP730U3E (fw = 0x675f05, ICv7, crc_enabled = 1)
Tested-by: Giovanni Frigione <gio.frigione@gmail.com>
Signed-off-by: Matteo Delfino <kendatsuba@gmail.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
158 lines
3.6 KiB
C
158 lines
3.6 KiB
C
/*
|
|
* Elantech Touchpad driver (v6)
|
|
*
|
|
* Copyright (C) 2007-2009 Arjan Opmeer <arjan@opmeer.net>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License version 2 as published
|
|
* by the Free Software Foundation.
|
|
*
|
|
* Trademarks are the property of their respective owners.
|
|
*/
|
|
|
|
#ifndef _ELANTECH_H
|
|
#define _ELANTECH_H
|
|
|
|
/*
|
|
* Command values for Synaptics style queries
|
|
*/
|
|
#define ETP_FW_ID_QUERY 0x00
|
|
#define ETP_FW_VERSION_QUERY 0x01
|
|
#define ETP_CAPABILITIES_QUERY 0x02
|
|
#define ETP_SAMPLE_QUERY 0x03
|
|
#define ETP_RESOLUTION_QUERY 0x04
|
|
|
|
/*
|
|
* Command values for register reading or writing
|
|
*/
|
|
#define ETP_REGISTER_READ 0x10
|
|
#define ETP_REGISTER_WRITE 0x11
|
|
#define ETP_REGISTER_READWRITE 0x00
|
|
|
|
/*
|
|
* Hardware version 2 custom PS/2 command value
|
|
*/
|
|
#define ETP_PS2_CUSTOM_COMMAND 0xf8
|
|
|
|
/*
|
|
* Times to retry a ps2_command and millisecond delay between tries
|
|
*/
|
|
#define ETP_PS2_COMMAND_TRIES 3
|
|
#define ETP_PS2_COMMAND_DELAY 500
|
|
|
|
/*
|
|
* Times to try to read back a register and millisecond delay between tries
|
|
*/
|
|
#define ETP_READ_BACK_TRIES 5
|
|
#define ETP_READ_BACK_DELAY 2000
|
|
|
|
/*
|
|
* Register bitmasks for hardware version 1
|
|
*/
|
|
#define ETP_R10_ABSOLUTE_MODE 0x04
|
|
#define ETP_R11_4_BYTE_MODE 0x02
|
|
|
|
/*
|
|
* Capability bitmasks
|
|
*/
|
|
#define ETP_CAP_HAS_ROCKER 0x04
|
|
|
|
/*
|
|
* One hard to find application note states that X axis range is 0 to 576
|
|
* and Y axis range is 0 to 384 for harware version 1.
|
|
* Edge fuzz might be necessary because of bezel around the touchpad
|
|
*/
|
|
#define ETP_EDGE_FUZZ_V1 32
|
|
|
|
#define ETP_XMIN_V1 ( 0 + ETP_EDGE_FUZZ_V1)
|
|
#define ETP_XMAX_V1 (576 - ETP_EDGE_FUZZ_V1)
|
|
#define ETP_YMIN_V1 ( 0 + ETP_EDGE_FUZZ_V1)
|
|
#define ETP_YMAX_V1 (384 - ETP_EDGE_FUZZ_V1)
|
|
|
|
/*
|
|
* The resolution for older v2 hardware doubled.
|
|
* (newer v2's firmware provides command so we can query)
|
|
*/
|
|
#define ETP_XMIN_V2 0
|
|
#define ETP_XMAX_V2 1152
|
|
#define ETP_YMIN_V2 0
|
|
#define ETP_YMAX_V2 768
|
|
|
|
#define ETP_PMIN_V2 0
|
|
#define ETP_PMAX_V2 255
|
|
#define ETP_WMIN_V2 0
|
|
#define ETP_WMAX_V2 15
|
|
|
|
/*
|
|
* v3 hardware has 2 kinds of packet types,
|
|
* v4 hardware has 3.
|
|
*/
|
|
#define PACKET_UNKNOWN 0x01
|
|
#define PACKET_DEBOUNCE 0x02
|
|
#define PACKET_V3_HEAD 0x03
|
|
#define PACKET_V3_TAIL 0x04
|
|
#define PACKET_V4_HEAD 0x05
|
|
#define PACKET_V4_MOTION 0x06
|
|
#define PACKET_V4_STATUS 0x07
|
|
|
|
/*
|
|
* track up to 5 fingers for v4 hardware
|
|
*/
|
|
#define ETP_MAX_FINGERS 5
|
|
|
|
/*
|
|
* weight value for v4 hardware
|
|
*/
|
|
#define ETP_WEIGHT_VALUE 5
|
|
|
|
/*
|
|
* The base position for one finger, v4 hardware
|
|
*/
|
|
struct finger_pos {
|
|
unsigned int x;
|
|
unsigned int y;
|
|
};
|
|
|
|
struct elantech_data {
|
|
unsigned char reg_07;
|
|
unsigned char reg_10;
|
|
unsigned char reg_11;
|
|
unsigned char reg_20;
|
|
unsigned char reg_21;
|
|
unsigned char reg_22;
|
|
unsigned char reg_23;
|
|
unsigned char reg_24;
|
|
unsigned char reg_25;
|
|
unsigned char reg_26;
|
|
unsigned char debug;
|
|
unsigned char capabilities[3];
|
|
bool paritycheck;
|
|
bool jumpy_cursor;
|
|
bool reports_pressure;
|
|
bool crc_enabled;
|
|
unsigned char hw_version;
|
|
unsigned int fw_version;
|
|
unsigned int single_finger_reports;
|
|
unsigned int y_max;
|
|
unsigned int width;
|
|
struct finger_pos mt[ETP_MAX_FINGERS];
|
|
unsigned char parity[256];
|
|
int (*send_cmd)(struct psmouse *psmouse, unsigned char c, unsigned char *param);
|
|
};
|
|
|
|
#ifdef CONFIG_MOUSE_PS2_ELANTECH
|
|
int elantech_detect(struct psmouse *psmouse, bool set_properties);
|
|
int elantech_init(struct psmouse *psmouse);
|
|
#else
|
|
static inline int elantech_detect(struct psmouse *psmouse, bool set_properties)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
static inline int elantech_init(struct psmouse *psmouse)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
#endif /* CONFIG_MOUSE_PS2_ELANTECH */
|
|
|
|
#endif
|