elantech.h 3.6 KB
Newer Older
1
/*
2
 * Elantech Touchpad driver (v6)
3
 *
4
 * Copyright (C) 2007-2009 Arjan Opmeer <arjan@opmeer.net>
5 6 7 8 9 10 11 12 13 14 15 16 17 18
 *
 * 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
 */
19
#define ETP_FW_ID_QUERY			0x00
20 21
#define ETP_FW_VERSION_QUERY		0x01
#define ETP_CAPABILITIES_QUERY		0x02
22
#define ETP_SAMPLE_QUERY		0x03
23
#define ETP_RESOLUTION_QUERY		0x04
24 25 26 27 28 29

/*
 * Command values for register reading or writing
 */
#define ETP_REGISTER_READ		0x10
#define ETP_REGISTER_WRITE		0x11
30
#define ETP_REGISTER_READWRITE		0x00
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72

/*
 * 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)

/*
73 74
 * The resolution for older v2 hardware doubled.
 * (newer v2's firmware provides command so we can query)
75
 */
76 77 78 79
#define ETP_XMIN_V2			0
#define ETP_XMAX_V2			1152
#define ETP_YMIN_V2			0
#define ETP_YMAX_V2			768
80

81 82 83 84 85
#define ETP_PMIN_V2			0
#define ETP_PMAX_V2			255
#define ETP_WMIN_V2			0
#define ETP_WMAX_V2			15

86
/*
87 88
 * v3 hardware has 2 kinds of packet types,
 * v4 hardware has 3.
89 90 91 92 93
 */
#define PACKET_UNKNOWN			0x01
#define PACKET_DEBOUNCE			0x02
#define PACKET_V3_HEAD			0x03
#define PACKET_V3_TAIL			0x04
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
#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;
};
115

116
struct elantech_data {
117
	unsigned char reg_07;
118 119 120 121 122 123 124 125 126 127
	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;
128
	unsigned char capabilities[3];
129 130
	bool paritycheck;
	bool jumpy_cursor;
131
	bool reports_pressure;
132
	bool crc_enabled;
133
	bool set_hw_resolution;
134
	unsigned char hw_version;
135 136
	unsigned int fw_version;
	unsigned int single_finger_reports;
137
	unsigned int y_max;
138 139
	unsigned int width;
	struct finger_pos mt[ETP_MAX_FINGERS];
140
	unsigned char parity[256];
141
	int (*send_cmd)(struct psmouse *psmouse, unsigned char c, unsigned char *param);
142 143 144
};

#ifdef CONFIG_MOUSE_PS2_ELANTECH
145
int elantech_detect(struct psmouse *psmouse, bool set_properties);
146 147
int elantech_init(struct psmouse *psmouse);
#else
148
static inline int elantech_detect(struct psmouse *psmouse, bool set_properties)
149 150 151 152 153 154 155 156 157 158
{
	return -ENOSYS;
}
static inline int elantech_init(struct psmouse *psmouse)
{
	return -ENOSYS;
}
#endif /* CONFIG_MOUSE_PS2_ELANTECH */

#endif