14 #include <linux/slab.h>
15 #include <linux/module.h>
16 #include <linux/input.h>
18 #include <linux/serio.h>
23 #define elantech_debug(fmt, ...) \
26 psmouse_printk(KERN_DEBUG, psmouse, \
27 fmt, ##__VA_ARGS__); \
38 psmouse_err(psmouse,
"%s query 0x%02x failed.\n", __func__, c);
56 psmouse_err(psmouse,
"%s query 0x%02x failed.\n", __func__, c);
66 static int elantech_ps2_command(
struct psmouse *psmouse,
67 unsigned char *param,
int command)
69 struct ps2dev *ps2dev = &psmouse->
ps2dev;
85 psmouse_err(psmouse,
"ps2 command 0x%02x failed.\n", command);
93 static int elantech_read_reg(
struct psmouse *psmouse,
unsigned char reg,
97 unsigned char param[3];
103 if (reg > 0x11 && reg < 0x20)
119 elantech_ps2_command(psmouse,
NULL, reg) ||
129 elantech_ps2_command(psmouse,
NULL, reg) ||
137 psmouse_err(psmouse,
"failed to read register 0x%02x.\n", reg);
149 static int elantech_write_reg(
struct psmouse *psmouse,
unsigned char reg,
158 if (reg > 0x11 && reg < 0x20)
175 elantech_ps2_command(psmouse,
NULL, reg) ||
177 elantech_ps2_command(psmouse,
NULL, val) ||
187 elantech_ps2_command(psmouse,
NULL, reg) ||
189 elantech_ps2_command(psmouse,
NULL, val) ||
199 elantech_ps2_command(psmouse,
NULL, reg) ||
203 elantech_ps2_command(psmouse,
NULL, val) ||
212 "failed to write register 0x%02x with value 0x%02x.\n",
221 static void elantech_packet_dump(
struct psmouse *psmouse)
226 for (i = 0; i < psmouse->
pktsize; i++)
227 printk(
"%s0x%02x ", i ?
", " :
" ", psmouse->
packet[i]);
235 static void elantech_report_absolute_v1(
struct psmouse *psmouse)
237 struct input_dev *
dev = psmouse->
dev;
247 fingers = ((packet[1] & 0x80) >> 7) +
248 ((packet[1] & 0x30) >> 4);
254 fingers = (packet[0] & 0xc0) >> 6;
268 input_report_key(dev,
BTN_TOUCH, fingers != 0);
275 input_report_abs(dev,
ABS_X,
276 ((packet[1] & 0x0c) << 6) | packet[2]);
277 input_report_abs(dev,
ABS_Y,
278 etd->
y_max - (((packet[1] & 0x03) << 8) | packet[3]));
284 input_report_key(dev,
BTN_LEFT, packet[0] & 0x01);
285 input_report_key(dev,
BTN_RIGHT, packet[0] & 0x02);
290 input_report_key(dev,
BTN_FORWARD, packet[0] & 0x40);
292 input_report_key(dev,
BTN_BACK, packet[0] & 0x80);
298 static void elantech_set_slot(
struct input_dev *dev,
int slot,
bool active,
299 unsigned int x,
unsigned int y)
310 static void elantech_report_semi_mt_data(
struct input_dev *dev,
311 unsigned int num_fingers,
312 unsigned int x1,
unsigned int y1,
313 unsigned int x2,
unsigned int y2)
315 elantech_set_slot(dev, 0, num_fingers != 0, x1, y1);
316 elantech_set_slot(dev, 1, num_fingers == 2, x2, y2);
323 static void elantech_report_absolute_v2(
struct psmouse *psmouse)
326 struct input_dev *dev = psmouse->
dev;
327 unsigned char *packet = psmouse->
packet;
328 unsigned int fingers, x1 = 0, y1 = 0, x2 = 0, y2 = 0;
329 unsigned int width = 0, pres = 0;
332 fingers = (packet[0] & 0xc0) >> 6;
340 if (packet[3] & 0x80)
348 x1 = ((packet[1] & 0x0f) << 8) | packet[2];
353 y1 = etd->
y_max - (((packet[4] & 0x0f) << 8) | packet[5]);
355 pres = (packet[1] & 0xf0) | ((packet[4] & 0xf0) >> 4);
356 width = ((packet[0] & 0x30) >> 2) | ((packet[3] & 0x30) >> 4);
366 x1 = (((packet[0] & 0x10) << 4) | packet[1]) << 2;
369 ((((packet[0] & 0x20) << 3) | packet[2]) << 2);
374 x2 = (((packet[3] & 0x10) << 4) | packet[4]) << 2;
377 ((((packet[3] & 0x20) << 3) | packet[5]) << 2);
385 input_report_key(dev,
BTN_TOUCH, fingers != 0);
387 input_report_abs(dev,
ABS_X, x1);
388 input_report_abs(dev,
ABS_Y, y1);
390 elantech_report_semi_mt_data(dev, fingers, x1, y1, x2, y2);
395 input_report_key(dev,
BTN_LEFT, packet[0] & 0x01);
396 input_report_key(dev,
BTN_RIGHT, packet[0] & 0x02);
409 static void elantech_report_absolute_v3(
struct psmouse *psmouse,
412 struct input_dev *dev = psmouse->
dev;
414 unsigned char *packet = psmouse->
packet;
415 unsigned int fingers = 0, x1 = 0, y1 = 0, x2 = 0, y2 = 0;
416 unsigned int width = 0, pres = 0;
419 fingers = (packet[0] & 0xc0) >> 6;
428 x1 = ((packet[1] & 0x0f) << 8) | packet[2];
433 y1 = etd->
y_max - (((packet[4] & 0x0f) << 8) | packet[5]);
442 etd->
mt[0].x = ((packet[1] & 0x0f) << 8) | packet[2];
448 (((packet[4] & 0x0f) << 8) | packet[5]);
458 x2 = ((packet[1] & 0x0f) << 8) | packet[2];
459 y2 = etd->
y_max - (((packet[4] & 0x0f) << 8) | packet[5]);
463 pres = (packet[1] & 0xf0) | ((packet[4] & 0xf0) >> 4);
464 width = ((packet[0] & 0x30) >> 2) | ((packet[3] & 0x30) >> 4);
466 input_report_key(dev,
BTN_TOUCH, fingers != 0);
468 input_report_abs(dev,
ABS_X, x1);
469 input_report_abs(dev,
ABS_Y, y1);
471 elantech_report_semi_mt_data(dev, fingers, x1, y1, x2, y2);
475 input_report_key(dev,
BTN_LEFT, packet[0] & 0x01);
476 input_report_key(dev,
BTN_RIGHT, packet[0] & 0x02);
483 static void elantech_input_sync_v4(
struct psmouse *psmouse)
485 struct input_dev *dev = psmouse->
dev;
486 unsigned char *packet = psmouse->
packet;
488 input_report_key(dev,
BTN_LEFT, packet[0] & 0x01);
493 static void process_packet_status_v4(
struct psmouse *psmouse)
495 struct input_dev *dev = psmouse->
dev;
496 unsigned char *packet = psmouse->
packet;
501 fingers = packet[1] & 0x1f;
503 if ((fingers & (1 << i)) == 0) {
509 elantech_input_sync_v4(psmouse);
512 static void process_packet_head_v4(
struct psmouse *psmouse)
514 struct input_dev *dev = psmouse->
dev;
516 unsigned char *packet = psmouse->
packet;
517 int id = ((packet[3] & 0xe0) >> 5) - 1;
523 etd->
mt[
id].x = ((packet[1] & 0x0f) << 8) | packet[2];
524 etd->
mt[
id].y = etd->
y_max - (((packet[4] & 0x0f) << 8) | packet[5]);
525 pres = (packet[1] & 0xf0) | ((packet[4] & 0xf0) >> 4);
526 traces = (packet[0] & 0xf0) >> 4;
538 elantech_input_sync_v4(psmouse);
541 static void process_packet_motion_v4(
struct psmouse *psmouse)
543 struct input_dev *dev = psmouse->
dev;
545 unsigned char *packet = psmouse->
packet;
546 int weight, delta_x1 = 0, delta_y1 = 0, delta_x2 = 0, delta_y2 = 0;
549 id = ((packet[0] & 0xe0) >> 5) - 1;
553 sid = ((packet[3] & 0xe0) >> 5) - 1;
560 delta_x1 = (
signed char)packet[1];
561 delta_y1 = (
signed char)packet[2];
562 delta_x2 = (
signed char)packet[4];
563 delta_y2 = (
signed char)packet[5];
579 elantech_input_sync_v4(psmouse);
582 static void elantech_report_absolute_v4(
struct psmouse *psmouse,
585 switch (packet_type) {
587 process_packet_status_v4(psmouse);
591 process_packet_head_v4(psmouse);
595 process_packet_motion_v4(psmouse);
605 static int elantech_packet_check_v1(
struct psmouse *psmouse)
608 unsigned char *packet = psmouse->
packet;
609 unsigned char p1, p2, p3;
614 p1 = (packet[0] & 0x20) >> 5;
615 p2 = (packet[0] & 0x10) >> 4;
618 p1 = (packet[0] & 0x10) >> 4;
619 p2 = (packet[0] & 0x20) >> 5;
622 p3 = (packet[0] & 0x04) >> 2;
624 return etd->
parity[packet[1]] == p1 &&
625 etd->
parity[packet[2]] == p2 &&
626 etd->
parity[packet[3]] == p3;
629 static int elantech_debounce_check_v2(
struct psmouse *psmouse)
635 const u8 debounce_packet[] = { 0x84, 0xff, 0xff, 0x02, 0xff, 0xff };
636 unsigned char *packet = psmouse->
packet;
638 return !
memcmp(packet, debounce_packet,
sizeof(debounce_packet));
641 static int elantech_packet_check_v2(
struct psmouse *psmouse)
644 unsigned char *packet = psmouse->
packet;
656 return (packet[0] & 0x0c) == 0x04 &&
657 (packet[3] & 0x0f) == 0x02;
659 if ((packet[0] & 0xc0) == 0x80)
660 return (packet[0] & 0x0c) == 0x0c &&
661 (packet[3] & 0x0e) == 0x08;
663 return (packet[0] & 0x3c) == 0x3c &&
664 (packet[1] & 0xf0) == 0x00 &&
665 (packet[3] & 0x3e) == 0x38 &&
666 (packet[4] & 0xf0) == 0x00;
673 static int elantech_packet_check_v3(
struct psmouse *psmouse)
675 const u8 debounce_packet[] = { 0xc4, 0xff, 0xff, 0x02, 0xff, 0xff };
676 unsigned char *packet = psmouse->
packet;
682 if (!
memcmp(packet, debounce_packet,
sizeof(debounce_packet)))
685 if ((packet[0] & 0x0c) == 0x04 && (packet[3] & 0xcf) == 0x02)
688 if ((packet[0] & 0x0c) == 0x0c && (packet[3] & 0xce) == 0x0c)
694 static int elantech_packet_check_v4(
struct psmouse *psmouse)
696 unsigned char *packet = psmouse->
packet;
698 if ((packet[0] & 0x0c) == 0x04 &&
699 (packet[3] & 0x1f) == 0x11)
702 if ((packet[0] & 0x0c) == 0x04 &&
703 (packet[3] & 0x1f) == 0x12)
706 if ((packet[0] & 0x0c) == 0x04 &&
707 (packet[3] & 0x1f) == 0x10)
716 static psmouse_ret_t elantech_process_byte(
struct psmouse *psmouse)
725 elantech_packet_dump(psmouse);
729 if (etd->
paritycheck && !elantech_packet_check_v1(psmouse))
732 elantech_report_absolute_v1(psmouse);
737 if (elantech_debounce_check_v2(psmouse))
740 if (etd->
paritycheck && !elantech_packet_check_v2(psmouse))
743 elantech_report_absolute_v2(psmouse);
747 packet_type = elantech_packet_check_v3(psmouse);
755 elantech_report_absolute_v3(psmouse, packet_type);
759 packet_type = elantech_packet_check_v4(psmouse);
763 elantech_report_absolute_v4(psmouse, packet_type);
773 static int elantech_set_absolute_mode(
struct psmouse *psmouse)
784 if (elantech_write_reg(psmouse, 0x10, etd->
reg_10) ||
785 elantech_write_reg(psmouse, 0x11, etd->
reg_11)) {
795 if (elantech_write_reg(psmouse, 0x10, etd->
reg_10) ||
796 elantech_write_reg(psmouse, 0x11, etd->
reg_11) ||
797 elantech_write_reg(psmouse, 0x21, etd->
reg_21)) {
804 if (elantech_write_reg(psmouse, 0x10, etd->
reg_10))
811 if (elantech_write_reg(psmouse, 0x07, etd->
reg_07))
814 goto skip_readback_reg_10;
825 rc = elantech_read_reg(psmouse, 0x10, &val);
835 "failed to read back register 0x10.\n");
839 "touchpad refuses to switch to absolute mode.\n");
844 skip_readback_reg_10:
846 psmouse_err(psmouse,
"failed to initialise registers.\n");
851 static int elantech_set_range(
struct psmouse *psmouse,
852 unsigned int *x_min,
unsigned int *y_min,
853 unsigned int *x_max,
unsigned int *
y_max,
857 unsigned char param[3];
858 unsigned char traces;
886 fixed_dpi = param[1] & 0x10;
888 if (((etd->
fw_version >> 16) == 0x14) && fixed_dpi) {
911 *x_max = (0x0f & param[0]) << 8 | param[1];
912 *y_max = (0xf0 & param[0]) << 4 | param[2];
919 *x_max = (0x0f & param[0]) << 8 | param[1];
920 *y_max = (0xf0 & param[0]) << 4 | param[2];
922 if ((traces < 2) || (traces > *x_max))
925 *width = *x_max / (traces - 1);
936 static unsigned int elantech_convert_res(
unsigned int val)
938 return (val * 10 + 790) * 10 / 254;
941 static int elantech_get_resolution_v4(
struct psmouse *psmouse,
945 unsigned char param[3];
950 *x_res = elantech_convert_res(param[1] & 0x0f);
951 *y_res = elantech_convert_res((param[1] & 0xf0) >> 4);
959 static int elantech_set_input_params(
struct psmouse *psmouse)
961 struct input_dev *dev = psmouse->
dev;
963 unsigned int x_min = 0, y_min = 0, x_max = 0, y_max = 0, width = 0;
964 unsigned int x_res = 0, y_res = 0;
966 if (elantech_set_range(psmouse, &x_min, &y_min, &x_max, &y_max, &width))
990 input_set_abs_params(dev,
ABS_X, x_min, x_max, 0, 0);
991 input_set_abs_params(dev,
ABS_Y, y_min, y_max, 0, 0);
999 input_set_abs_params(dev,
ABS_X, x_min, x_max, 0, 0);
1000 input_set_abs_params(dev,
ABS_Y, y_min, y_max, 0, 0);
1013 if (elantech_get_resolution_v4(psmouse, &x_res, &y_res)) {
1018 psmouse_warn(psmouse,
"couldn't query resolution data.\n");
1025 input_set_abs_params(dev,
ABS_X, x_min, x_max, 0, 0);
1026 input_set_abs_params(dev,
ABS_Y, y_min, y_max, 0, 0);
1027 input_abs_set_res(dev,
ABS_X, x_res);
1028 input_abs_set_res(dev,
ABS_Y, y_res);
1068 static ssize_t elantech_show_int_attr(
struct psmouse *psmouse,
void *
data,
1073 unsigned char *reg = (
unsigned char *) etd + attr->
field_offset;
1077 rc = elantech_read_reg(psmouse, attr->
reg, reg);
1079 return sprintf(buf,
"0x%02x\n", (attr->
reg && rc) ? -1 : *reg);
1085 static ssize_t elantech_set_int_attr(
struct psmouse *psmouse,
1090 unsigned char *reg = (
unsigned char *) etd + attr->
field_offset;
1091 unsigned char value;
1100 if (attr->
reg == 0x10)
1103 else if (attr->
reg == 0x11)
1108 if (!attr->
reg || elantech_write_reg(psmouse, attr->
reg,
value) == 0)
1114 #define ELANTECH_INT_ATTR(_name, _register) \
1115 static struct elantech_attr_data elantech_attr_##_name = { \
1116 .field_offset = offsetof(struct elantech_data, _name), \
1119 PSMOUSE_DEFINE_ATTR(_name, S_IWUSR | S_IRUGO, \
1120 &elantech_attr_##_name, \
1121 elantech_show_int_attr, \
1122 elantech_set_int_attr)
1137 static struct attribute *elantech_attrs[] = {
1138 &psmouse_attr_reg_07.dattr.attr,
1139 &psmouse_attr_reg_10.dattr.attr,
1140 &psmouse_attr_reg_11.dattr.attr,
1141 &psmouse_attr_reg_20.dattr.attr,
1142 &psmouse_attr_reg_21.dattr.attr,
1143 &psmouse_attr_reg_22.dattr.attr,
1144 &psmouse_attr_reg_23.dattr.attr,
1145 &psmouse_attr_reg_24.dattr.attr,
1146 &psmouse_attr_reg_25.dattr.attr,
1147 &psmouse_attr_reg_26.dattr.attr,
1148 &psmouse_attr_debug.dattr.attr,
1149 &psmouse_attr_paritycheck.dattr.attr,
1154 .attrs = elantech_attrs,
1157 static bool elantech_is_signature_valid(
const unsigned char *param)
1159 static const unsigned char rates[] = { 200, 100, 80, 60, 40, 20, 10 };
1169 if (param[2] == rates[i])
1180 struct ps2dev *ps2dev = &psmouse->
ps2dev;
1181 unsigned char param[3];
1190 psmouse_dbg(psmouse,
"sending Elantech magic knock failed.\n");
1198 if (param[0] != 0x3c || param[1] != 0x03 ||
1199 (param[2] != 0xc8 && param[2] != 0x00)) {
1201 "unexpected magic knock result 0x%02x, 0x%02x, 0x%02x.\n",
1202 param[0], param[1], param[2]);
1212 psmouse_dbg(psmouse,
"failed to query firmware version.\n");
1217 "Elantech version query result 0x%02x, 0x%02x, 0x%02x.\n",
1218 param[0], param[1], param[2]);
1220 if (!elantech_is_signature_valid(param)) {
1222 "Probably not a real Elantech touchpad. Aborting.\n");
1226 if (set_properties) {
1227 psmouse->
vendor =
"Elantech";
1228 psmouse->
name =
"Touchpad";
1237 static void elantech_disconnect(
struct psmouse *psmouse)
1240 &elantech_attr_group);
1248 static int elantech_reconnect(
struct psmouse *psmouse)
1255 if (elantech_set_absolute_mode(psmouse)) {
1257 "failed to put touchpad back into absolute mode.\n");
1267 static int elantech_set_properties(
struct elantech_data *etd)
1325 unsigned char param[3];
1334 for (i = 1; i < 256; i++)
1341 psmouse_err(psmouse,
"failed to query firmware version.\n");
1344 etd->
fw_version = (param[0] << 16) | (param[1] << 8) | param[2];
1346 if (elantech_set_properties(etd)) {
1347 psmouse_err(psmouse,
"unknown hardware version, aborting...\n");
1351 "assuming hardware version %d (with firmware version 0x%02x%02x%02x)\n",
1352 etd->
hw_version, param[0], param[1], param[2]);
1356 psmouse_err(psmouse,
"failed to query capabilities.\n");
1360 "Synaptics capabilities query result 0x%02x, 0x%02x, 0x%02x.\n",
1364 if (elantech_set_absolute_mode(psmouse)) {
1366 "failed to put touchpad into absolute mode.\n");
1370 if (elantech_set_input_params(psmouse)) {
1371 psmouse_err(psmouse,
"failed to query touchpad range.\n");
1376 &elantech_attr_group);
1379 "failed to create sysfs attributes, error: %d.\n",
1386 psmouse->
reconnect = elantech_reconnect;