aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/mouse/cypress_ps2.h
blob: 1eaddd81800460be0157cbcc71545dc0f6f31e7d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _CYPRESS_PS2_H
#define _CYPRESS_PS2_H

#include "psmouse.h"

#define CMD_BITS_MASK 0x03
#define COMPOSIT(x, s) (((x) & CMD_BITS_MASK) << (s))

#define ENCODE_CMD(aa, bb, cc, dd) \
	(COMPOSIT((aa), 6) | COMPOSIT((bb), 4) | COMPOSIT((cc), 2) | COMPOSIT((dd), 0))
#define CYTP_CMD_ABS_NO_PRESSURE_MODE       ENCODE_CMD(0, 1, 0, 0)
#define CYTP_CMD_ABS_WITH_PRESSURE_MODE     ENCODE_CMD(0, 1, 0, 1)
#define CYTP_CMD_SMBUS_MODE                 ENCODE_CMD(0, 1, 1, 0)
#define CYTP_CMD_STANDARD_MODE              ENCODE_CMD(0, 2, 0, 0)  /* not implemented yet. */
#define CYTP_CMD_CYPRESS_REL_MODE           ENCODE_CMD(1, 1, 1, 1)  /* not implemented yet. */
#define CYTP_CMD_READ_CYPRESS_ID            ENCODE_CMD(0, 0, 0, 0)
#define CYTP_CMD_READ_TP_METRICS            ENCODE_CMD(0, 0, 0, 1)
#define CYTP_CMD_SET_HSCROLL_WIDTH(w)       ENCODE_CMD(1, 1, 0, (w))
#define     CYTP_CMD_SET_HSCROLL_MASK       ENCODE_CMD(1, 1, 0, 0)
#define CYTP_CMD_SET_VSCROLL_WIDTH(w)       ENCODE_CMD(1, 2, 0, (w))
#define     CYTP_CMD_SET_VSCROLL_MASK       ENCODE_CMD(1, 2, 0, 0)
#define CYTP_CMD_SET_PALM_GEOMETRY(e)       ENCODE_CMD(1, 2, 1, (e))
#define     CYTP_CMD_PALM_GEMMETRY_MASK     ENCODE_CMD(1, 2, 1, 0)
#define CYTP_CMD_SET_PALM_SENSITIVITY(s)    ENCODE_CMD(1, 2, 2, (s))
#define     CYTP_CMD_PALM_SENSITIVITY_MASK  ENCODE_CMD(1, 2, 2, 0)
#define CYTP_CMD_SET_MOUSE_SENSITIVITY(s)   ENCODE_CMD(1, 3, ((s) >> 2), (s))
#define     CYTP_CMD_MOUSE_SENSITIVITY_MASK ENCODE_CMD(1, 3, 0, 0)
#define CYTP_CMD_REQUEST_BASELINE_STATUS    ENCODE_CMD(2, 0, 0, 1)
#define CYTP_CMD_REQUEST_RECALIBRATION      ENCODE_CMD(2, 0, 0, 3)

#define DECODE_CMD_AA(x) (((x) >> 6) & CMD_BITS_MASK)
#define DECODE_CMD_BB(x) (((x) >> 4) & CMD_BITS_MASK)
#define DECODE_CMD_CC(x) (((x) >> 2) & CMD_BITS_MASK)
#define DECODE_CMD_DD(x) ((x) & CMD_BITS_MASK)

/* Cypress trackpad working mode. */
#define CYTP_BIT_ABS_PRESSURE    (1 << 3)
#define CYTP_BIT_ABS_NO_PRESSURE (1 << 2)
#define CYTP_BIT_CYPRESS_REL     (1 << 1)
#define CYTP_BIT_STANDARD_REL    (1 << 0)
#define CYTP_BIT_REL_MASK (CYTP_BIT_CYPRESS_REL | CYTP_BIT_STANDARD_REL)
#define CYTP_BIT_ABS_MASK (CYTP_BIT_ABS_PRESSURE | CYTP_BIT_ABS_NO_PRESSURE)
#define CYTP_BIT_ABS_REL_MASK (CYTP_BIT_ABS_MASK | CYTP_BIT_REL_MASK)

#define CYTP_BIT_HIGH_RATE       (1 << 4)
/*
 * report mode bit is set, firmware working in Remote Mode.
 * report mode bit is cleared, firmware working in Stream Mode.
 */
#define CYTP_BIT_REPORT_MODE     (1 << 5)

/* scrolling width values for set HSCROLL and VSCROLL width command. */
#define SCROLL_WIDTH_NARROW 1
#define SCROLL_WIDTH_NORMAL 2
#define SCROLL_WIDTH_WIDE   3

#define PALM_GEOMETRY_ENABLE  1
#define PALM_GEOMETRY_DISABLE 0

#define TP_METRICS_MASK  0x80
#define FW_VERSION_MASX    0x7f
#define FW_VER_HIGH_MASK 0x70
#define FW_VER_LOW_MASK  0x0f

/* Times to retry a ps2_command and millisecond delay between tries. */
#define CYTP_PS2_CMD_TRIES 3
#define CYTP_PS2_CMD_DELAY 500

/* time out for PS/2 command only in milliseconds. */
#define CYTP_CMD_TIMEOUT  200
#define CYTP_DATA_TIMEOUT 30

#define CYTP_EXT_CMD   0xe8
#define CYTP_PS2_RETRY 0xfe
#define CYTP_PS2_ERROR 0xfc

#define CYTP_RESP_RETRY 0x01
#define CYTP_RESP_ERROR 0xfe


#define CYTP_105001_WIDTH  97   /* Dell XPS 13 */
#define CYTP_105001_HIGH   59
#define CYTP_DEFAULT_WIDTH (CYTP_105001_WIDTH)
#define CYTP_DEFAULT_HIGH  (CYTP_105001_HIGH)

#define CYTP_ABS_MAX_X     1600
#define CYTP_ABS_MAX_Y     900
#define CYTP_MAX_PRESSURE  255
#define CYTP_MIN_PRESSURE  0

/* header byte bits of relative package. */
#define BTN_LEFT_BIT   0x01
#define BTN_RIGHT_BIT  0x02
#define BTN_MIDDLE_BIT 0x04
#define REL_X_SIGN_BIT 0x10
#define REL_Y_SIGN_BIT 0x20

/* header byte bits of absolute package. */
#define ABS_VSCROLL_BIT 0x10
#define ABS_HSCROLL_BIT 0x20
#define ABS_MULTIFINGER_TAP 0x04
#define ABS_EDGE_MOTION_MASK 0x80

#define DFLT_RESP_BITS_VALID     0x88  /* SMBus bit should not be set. */
#define DFLT_RESP_SMBUS_BIT      0x80
#define   DFLT_SMBUS_MODE        0x80
#define   DFLT_PS2_MODE          0x00
#define DFLT_RESP_BIT_MODE       0x40
#define   DFLT_RESP_REMOTE_MODE  0x40
#define   DFLT_RESP_STREAM_MODE  0x00
#define DFLT_RESP_BIT_REPORTING  0x20
#define DFLT_RESP_BIT_SCALING    0x10

#define TP_METRICS_BIT_PALM               0x80
#define TP_METRICS_BIT_STUBBORN           0x40
#define TP_METRICS_BIT_2F_JITTER          0x30
#define TP_METRICS_BIT_1F_JITTER          0x0c
#define TP_METRICS_BIT_APA                0x02
#define TP_METRICS_BIT_MTG                0x01
#define TP_METRICS_BIT_ABS_PKT_FORMAT_SET 0xf0
#define TP_METRICS_BIT_2F_SPIKE           0x0c
#define TP_METRICS_BIT_1F_SPIKE           0x03

/* bits of first byte response of E9h-Status Request command. */
#define RESP_BTN_RIGHT_BIT  0x01
#define RESP_BTN_MIDDLE_BIT 0x02
#define RESP_BTN_LEFT_BIT   0x04
#define RESP_SCALING_BIT    0x10
#define RESP_ENABLE_BIT     0x20
#define RESP_REMOTE_BIT     0x40
#define RESP_SMBUS_BIT      0x80

#define CYTP_MAX_MT_SLOTS 2

struct cytp_contact {
	int x;
	int y;
	int z;  /* also named as touch pressure. */
};

/* The structure of Cypress Trackpad event data. */
struct cytp_report_data {
	int contact_cnt;
	struct cytp_contact contacts[CYTP_MAX_MT_SLOTS];
	unsigned int left:1;
	unsigned int right:1;
	unsigned int middle:1;
	unsigned int tap:1;  /* multi-finger tap detected. */
};

/* The structure of Cypress Trackpad device private data. */
struct cytp_data {
	int fw_version;

	int pkt_size;
	int mode;

	int tp_min_pressure;
	int tp_max_pressure;
	int tp_width;  /* X direction physical size in mm. */
	int tp_high;  /* Y direction physical size in mm. */
	int tp_max_abs_x;  /* Max X absolute units that can be reported. */
	int tp_max_abs_y;  /* Max Y absolute units that can be reported. */

	int tp_res_x;  /* X resolution in units/mm. */
	int tp_res_y;  /* Y resolution in units/mm. */

	int tp_metrics_supported;
};


#ifdef CONFIG_MOUSE_PS2_CYPRESS
int cypress_detect(struct psmouse *psmouse, bool set_properties);
int cypress_init(struct psmouse *psmouse);
#else
inline int cypress_detect(struct psmouse *psmouse, bool set_properties)
{
	return -ENOSYS;
}
inline int cypress_init(struct psmouse *psmouse)
{
	return -ENOSYS;
}
#endif /* CONFIG_MOUSE_PS2_CYPRESS */

#endif  /* _CYPRESS_PS2_H */