1
2
3
4
5
6
7
8
9
10
11
12#ifndef _ALPS_H
13#define _ALPS_H
14
15#include <linux/input/mt.h>
16
17#define ALPS_PROTO_V1 0x100
18#define ALPS_PROTO_V2 0x200
19#define ALPS_PROTO_V3 0x300
20#define ALPS_PROTO_V3_RUSHMORE 0x310
21#define ALPS_PROTO_V4 0x400
22#define ALPS_PROTO_V5 0x500
23#define ALPS_PROTO_V6 0x600
24#define ALPS_PROTO_V7 0x700
25#define ALPS_PROTO_V8 0x800
26#define ALPS_PROTO_V9 0x900
27
28#define MAX_TOUCHES 4
29
30#define DOLPHIN_COUNT_PER_ELECTRODE 64
31#define DOLPHIN_PROFILE_XOFFSET 8
32#define DOLPHIN_PROFILE_YOFFSET 1
33
34
35
36
37
38
39
40
41
42
43enum SS4_PACKET_ID {
44 SS4_PACKET_ID_IDLE = 0,
45 SS4_PACKET_ID_ONE,
46 SS4_PACKET_ID_TWO,
47 SS4_PACKET_ID_MULTI,
48 SS4_PACKET_ID_STICK,
49};
50
51#define SS4_COUNT_PER_ELECTRODE 256
52#define SS4_NUMSENSOR_XOFFSET 7
53#define SS4_NUMSENSOR_YOFFSET 7
54#define SS4_MIN_PITCH_MM 50
55
56#define SS4_MASK_NORMAL_BUTTONS 0x07
57
58#define SS4PLUS_COUNT_PER_ELECTRODE 128
59#define SS4PLUS_NUMSENSOR_XOFFSET 16
60#define SS4PLUS_NUMSENSOR_YOFFSET 5
61#define SS4PLUS_MIN_PITCH_MM 37
62
63#define IS_SS4PLUS_DEV(_b) (((_b[0]) == 0x73) && \
64 ((_b[1]) == 0x03) && \
65 ((_b[2]) == 0x28) \
66 )
67
68#define SS4_IS_IDLE_V2(_b) (((_b[0]) == 0x18) && \
69 ((_b[1]) == 0x10) && \
70 ((_b[2]) == 0x00) && \
71 ((_b[3] & 0x88) == 0x08) && \
72 ((_b[4]) == 0x10) && \
73 ((_b[5]) == 0x00) \
74 )
75
76#define SS4_1F_X_V2(_b) (((_b[0]) & 0x0007) | \
77 ((_b[1] << 3) & 0x0078) | \
78 ((_b[1] << 2) & 0x0380) | \
79 ((_b[2] << 5) & 0x1C00) \
80 )
81
82#define SS4_1F_Y_V2(_b) (((_b[2]) & 0x000F) | \
83 ((_b[3] >> 2) & 0x0030) | \
84 ((_b[4] << 6) & 0x03C0) | \
85 ((_b[4] << 5) & 0x0C00) \
86 )
87
88#define SS4_1F_Z_V2(_b) (((_b[5]) & 0x0F) | \
89 ((_b[5] >> 1) & 0x70) | \
90 ((_b[4]) & 0x80) \
91 )
92
93#define SS4_1F_LFB_V2(_b) (((_b[2] >> 4) & 0x01) == 0x01)
94
95#define SS4_MF_LF_V2(_b, _i) ((_b[1 + (_i) * 3] & 0x0004) == 0x0004)
96
97#define SS4_BTN_V2(_b) ((_b[0] >> 5) & SS4_MASK_NORMAL_BUTTONS)
98
99#define SS4_STD_MF_X_V2(_b, _i) (((_b[0 + (_i) * 3] << 5) & 0x00E0) | \
100 ((_b[1 + _i * 3] << 5) & 0x1F00) \
101 )
102
103#define SS4_STD_MF_Y_V2(_b, _i) (((_b[1 + (_i) * 3] << 3) & 0x0010) | \
104 ((_b[2 + (_i) * 3] << 5) & 0x01E0) | \
105 ((_b[2 + (_i) * 3] << 4) & 0x0E00) \
106 )
107
108#define SS4_BTL_MF_X_V2(_b, _i) (SS4_STD_MF_X_V2(_b, _i) | \
109 ((_b[0 + (_i) * 3] >> 3) & 0x0010) \
110 )
111
112#define SS4_BTL_MF_Y_V2(_b, _i) (SS4_STD_MF_Y_V2(_b, _i) | \
113 ((_b[0 + (_i) * 3] >> 3) & 0x0008) \
114 )
115
116#define SS4_MF_Z_V2(_b, _i) (((_b[1 + (_i) * 3]) & 0x0001) | \
117 ((_b[1 + (_i) * 3] >> 1) & 0x0002) \
118 )
119
120#define SS4_IS_MF_CONTINUE(_b) ((_b[2] & 0x10) == 0x10)
121#define SS4_IS_5F_DETECTED(_b) ((_b[2] & 0x10) == 0x10)
122
123#define SS4_TS_X_V2(_b) (s8)( \
124 ((_b[0] & 0x01) << 7) | \
125 (_b[1] & 0x7F) \
126 )
127
128#define SS4_TS_Y_V2(_b) -(s8)( \
129 ((_b[3] & 0x01) << 7) | \
130 (_b[2] & 0x7F) \
131 )
132
133#define SS4_TS_Z_V2(_b) (s8)(_b[4] & 0x7F)
134
135
136#define SS4_MFPACKET_NO_AX 8160
137#define SS4_MFPACKET_NO_AY 4080
138#define SS4_MFPACKET_NO_AX_BL 8176
139#define SS4_MFPACKET_NO_AY_BL 4088
140
141
142
143
144
145
146
147
148
149
150enum V7_PACKET_ID {
151 V7_PACKET_ID_IDLE,
152 V7_PACKET_ID_TWO,
153 V7_PACKET_ID_MULTI,
154 V7_PACKET_ID_NEW,
155 V7_PACKET_ID_UNKNOWN,
156};
157
158
159
160
161
162
163
164
165
166
167struct alps_protocol_info {
168 u16 version;
169 u8 byte0, mask0;
170 unsigned int flags;
171};
172
173
174
175
176
177
178
179
180
181
182struct alps_model_info {
183 u8 signature[3];
184 struct alps_protocol_info protocol_info;
185};
186
187
188
189
190
191
192
193
194
195
196
197
198struct alps_nibble_commands {
199 int command;
200 unsigned char data;
201};
202
203struct alps_bitmap_point {
204 int start_bit;
205 int num_bits;
206};
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225struct alps_fields {
226 unsigned int x_map;
227 unsigned int y_map;
228 unsigned int fingers;
229
230 int pressure;
231 struct input_mt_pos st;
232 struct input_mt_pos mt[MAX_TOUCHES];
233
234 unsigned int first_mp:1;
235 unsigned int is_mp:1;
236
237 unsigned int left:1;
238 unsigned int right:1;
239 unsigned int middle:1;
240
241 unsigned int ts_left:1;
242 unsigned int ts_right:1;
243 unsigned int ts_middle:1;
244};
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279struct alps_data {
280 struct psmouse *psmouse;
281 struct input_dev *dev2;
282 struct input_dev *dev3;
283 char phys2[32];
284 char phys3[32];
285 struct delayed_work dev3_register_work;
286
287
288 const struct alps_nibble_commands *nibble_commands;
289 int addr_command;
290 u16 proto_version;
291 u8 byte0, mask0;
292 u8 dev_id[3];
293 u8 fw_ver[3];
294 int flags;
295 int x_max;
296 int y_max;
297 int x_bits;
298 int y_bits;
299 unsigned int x_res;
300 unsigned int y_res;
301
302 int (*hw_init)(struct psmouse *psmouse);
303 void (*process_packet)(struct psmouse *psmouse);
304 int (*decode_fields)(struct alps_fields *f, unsigned char *p,
305 struct psmouse *psmouse);
306 void (*set_abs_params)(struct alps_data *priv, struct input_dev *dev1);
307
308 int prev_fin;
309 int multi_packet;
310 int second_touch;
311 unsigned char multi_data[6];
312 struct alps_fields f;
313 u8 quirks;
314 struct timer_list timer;
315};
316
317#define ALPS_QUIRK_TRACKSTICK_BUTTONS 1
318
319#ifdef CONFIG_MOUSE_PS2_ALPS
320int alps_detect(struct psmouse *psmouse, bool set_properties);
321int alps_init(struct psmouse *psmouse);
322#else
323inline int alps_detect(struct psmouse *psmouse, bool set_properties)
324{
325 return -ENOSYS;
326}
327inline int alps_init(struct psmouse *psmouse)
328{
329 return -ENOSYS;
330}
331#endif
332
333#endif
334