xref: /freebsd/sys/dev/usb/input/atp.c (revision aa64588d28258aef88cc33b8043112e8856948d0)
1 /*-
2  * Copyright (c) 2009 Rohit Grover
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  */
26 
27 #include <sys/cdefs.h>
28 __FBSDID("$FreeBSD$");
29 
30 #include <sys/param.h>
31 #include <sys/systm.h>
32 #include <sys/kernel.h>
33 #include <sys/malloc.h>
34 #include <sys/module.h>
35 #include <sys/lock.h>
36 #include <sys/mutex.h>
37 #include <sys/bus.h>
38 #include <sys/conf.h>
39 #include <sys/fcntl.h>
40 #include <sys/file.h>
41 #include <sys/selinfo.h>
42 #include <sys/poll.h>
43 #include <sys/sysctl.h>
44 #include <sys/uio.h>
45 
46 #include <dev/usb/usb.h>
47 #include <dev/usb/usbdi.h>
48 #include <dev/usb/usbdi_util.h>
49 #include <dev/usb/usbhid.h>
50 #include "usbdevs.h"
51 
52 #define USB_DEBUG_VAR atp_debug
53 #include <dev/usb/usb_debug.h>
54 
55 #include <sys/mouse.h>
56 
57 #define ATP_DRIVER_NAME "atp"
58 
59 /*
60  * Driver specific options: the following options may be set by
61  * `options' statements in the kernel configuration file.
62  */
63 
64 /* The multiplier used to translate sensor reported positions to mickeys. */
65 #ifndef ATP_SCALE_FACTOR
66 #define ATP_SCALE_FACTOR 48
67 #endif
68 
69 /*
70  * This is the age (in microseconds) beyond which a touch is
71  * considered to be a slide; and therefore a tap event isn't registered.
72  */
73 #ifndef ATP_TOUCH_TIMEOUT
74 #define ATP_TOUCH_TIMEOUT 125000
75 #endif
76 
77 /*
78  * A double-tap followed by a single-finger slide is treated as a
79  * special gesture. The driver responds to this gesture by assuming a
80  * virtual button-press for the lifetime of the slide. The following
81  * threshold is the maximum time gap (in microseconds) between the two
82  * tap events preceding the slide for such a gesture.
83  */
84 #ifndef ATP_DOUBLE_TAP_N_DRAG_THRESHOLD
85 #define ATP_DOUBLE_TAP_N_DRAG_THRESHOLD 200000
86 #endif
87 
88 /*
89  * The device provides us only with pressure readings from an array of
90  * X and Y sensors; for our algorithms, we need to interpret groups
91  * (typically pairs) of X and Y readings as being related to a single
92  * finger stroke. We can relate X and Y readings based on their times
93  * of incidence. The coincidence window should be at least 10000us
94  * since it is used against values from getmicrotime(), which has a
95  * precision of around 10ms.
96  */
97 #ifndef ATP_COINCIDENCE_THRESHOLD
98 #define ATP_COINCIDENCE_THRESHOLD  40000 /* unit: microseconds */
99 #if ATP_COINCIDENCE_THRESHOLD > 100000
100 #error "ATP_COINCIDENCE_THRESHOLD too large"
101 #endif
102 #endif /* #ifndef ATP_COINCIDENCE_THRESHOLD */
103 
104 /*
105  * The wait duration (in microseconds) after losing a touch contact
106  * before zombied strokes are reaped and turned into button events.
107  */
108 #define ATP_ZOMBIE_STROKE_REAP_WINDOW   50000
109 #if ATP_ZOMBIE_STROKE_REAP_WINDOW > 100000
110 #error "ATP_ZOMBIE_STROKE_REAP_WINDOW too large"
111 #endif
112 
113 /* end of driver specific options */
114 
115 
116 /* Tunables */
117 SYSCTL_NODE(_hw_usb, OID_AUTO, atp, CTLFLAG_RW, 0, "USB atp");
118 
119 #ifdef USB_DEBUG
120 enum atp_log_level {
121 	ATP_LLEVEL_DISABLED = 0,
122 	ATP_LLEVEL_ERROR,
123 	ATP_LLEVEL_DEBUG,       /* for troubleshooting */
124 	ATP_LLEVEL_INFO,        /* for diagnostics */
125 };
126 static int atp_debug = ATP_LLEVEL_ERROR; /* the default is to only log errors */
127 SYSCTL_INT(_hw_usb_atp, OID_AUTO, debug, CTLFLAG_RW,
128     &atp_debug, ATP_LLEVEL_ERROR, "ATP debug level");
129 #endif /* USB_DEBUG */
130 
131 static u_int atp_touch_timeout = ATP_TOUCH_TIMEOUT;
132 SYSCTL_INT(_hw_usb_atp, OID_AUTO, touch_timeout, CTLFLAG_RW, &atp_touch_timeout,
133     125000, "age threshold (in micros) for a touch");
134 
135 static u_int atp_double_tap_threshold = ATP_DOUBLE_TAP_N_DRAG_THRESHOLD;
136 SYSCTL_INT(_hw_usb_atp, OID_AUTO, double_tap_threshold, CTLFLAG_RW,
137     &atp_double_tap_threshold, ATP_DOUBLE_TAP_N_DRAG_THRESHOLD,
138     "maximum time (in micros) between a double-tap");
139 
140 static u_int atp_mickeys_scale_factor = ATP_SCALE_FACTOR;
141 static int atp_sysctl_scale_factor_handler(SYSCTL_HANDLER_ARGS);
142 SYSCTL_PROC(_hw_usb_atp, OID_AUTO, scale_factor, CTLTYPE_UINT | CTLFLAG_RW,
143     &atp_mickeys_scale_factor, sizeof(atp_mickeys_scale_factor),
144     atp_sysctl_scale_factor_handler, "IU", "movement scale factor");
145 
146 static u_int atp_small_movement_threshold = ATP_SCALE_FACTOR >> 3;
147 SYSCTL_UINT(_hw_usb_atp, OID_AUTO, small_movement, CTLFLAG_RW,
148     &atp_small_movement_threshold, ATP_SCALE_FACTOR >> 3,
149     "the small movement black-hole for filtering noise");
150 /*
151  * The movement threshold for a stroke; this is the maximum difference
152  * in position which will be resolved as a continuation of a stroke
153  * component.
154  */
155 static u_int atp_max_delta_mickeys = ((3 * ATP_SCALE_FACTOR) >> 1);
156 SYSCTL_UINT(_hw_usb_atp, OID_AUTO, max_delta_mickeys, CTLFLAG_RW,
157     &atp_max_delta_mickeys, ((3 * ATP_SCALE_FACTOR) >> 1),
158     "max. mickeys-delta which will match against an existing stroke");
159 /*
160  * Strokes which accumulate at least this amount of absolute movement
161  * from the aggregate of their components are considered as
162  * slides. Unit: mickeys.
163  */
164 static u_int atp_slide_min_movement = (ATP_SCALE_FACTOR >> 3);
165 SYSCTL_UINT(_hw_usb_atp, OID_AUTO, slide_min_movement, CTLFLAG_RW,
166     &atp_slide_min_movement, (ATP_SCALE_FACTOR >> 3),
167     "strokes with at least this amt. of movement are considered slides");
168 
169 /*
170  * The minimum age of a stroke for it to be considered mature; this
171  * helps filter movements (noise) from immature strokes. Units: interrupts.
172  */
173 static u_int atp_stroke_maturity_threshold = 2;
174 SYSCTL_UINT(_hw_usb_atp, OID_AUTO, stroke_maturity_threshold, CTLFLAG_RW,
175     &atp_stroke_maturity_threshold, 2,
176     "the minimum age of a stroke for it to be considered mature");
177 
178 /* Accept pressure readings from sensors only if above this value. */
179 static u_int atp_sensor_noise_threshold = 2;
180 SYSCTL_UINT(_hw_usb_atp, OID_AUTO, sensor_noise_threshold, CTLFLAG_RW,
181     &atp_sensor_noise_threshold, 2,
182     "accept pressure readings from sensors only if above this value");
183 
184 /* Ignore pressure spans with cumulative press. below this value. */
185 static u_int atp_pspan_min_cum_pressure = 10;
186 SYSCTL_UINT(_hw_usb_atp, OID_AUTO, pspan_min_cum_pressure, CTLFLAG_RW,
187     &atp_pspan_min_cum_pressure, 10,
188     "ignore pressure spans with cumulative press. below this value");
189 
190 /* Maximum allowed width for pressure-spans.*/
191 static u_int atp_pspan_max_width = 4;
192 SYSCTL_UINT(_hw_usb_atp, OID_AUTO, pspan_max_width, CTLFLAG_RW,
193     &atp_pspan_max_width, 4,
194     "maximum allowed width (in sensors) for pressure-spans");
195 
196 /* We support three payload protocols */
197 typedef enum {
198 	ATP_PROT_GEYSER1,
199 	ATP_PROT_GEYSER2,
200 	ATP_PROT_GEYSER3,
201 } atp_protocol;
202 
203 /* Define the various flavours of devices supported by this driver. */
204 enum {
205 	ATP_DEV_PARAMS_0,
206 	ATP_DEV_PARAMS_PBOOK,
207 	ATP_DEV_PARAMS_PBOOK_15A,
208 	ATP_DEV_PARAMS_PBOOK_17,
209 	ATP_N_DEV_PARAMS
210 };
211 struct atp_dev_params {
212 	u_int            data_len;   /* for sensor data */
213 	u_int            n_xsensors;
214 	u_int            n_ysensors;
215 	atp_protocol     prot;
216 } atp_dev_params[ATP_N_DEV_PARAMS] = {
217 	[ATP_DEV_PARAMS_0] = {
218 		.data_len   = 64,
219 		.n_xsensors = 20,
220 		.n_ysensors = 10,
221 		.prot       = ATP_PROT_GEYSER3
222 	},
223 	[ATP_DEV_PARAMS_PBOOK] = {
224 		.data_len   = 81,
225 		.n_xsensors = 16,
226 		.n_ysensors = 16,
227 		.prot       = ATP_PROT_GEYSER1
228 	},
229 	[ATP_DEV_PARAMS_PBOOK_15A] = {
230 		.data_len   = 64,
231 		.n_xsensors = 15,
232 		.n_ysensors = 9,
233 		.prot       = ATP_PROT_GEYSER2
234 	},
235 	[ATP_DEV_PARAMS_PBOOK_17] = {
236 		.data_len   = 81,
237 		.n_xsensors = 26,
238 		.n_ysensors = 16,
239 		.prot       = ATP_PROT_GEYSER1
240 	},
241 };
242 
243 static const struct usb_device_id atp_devs[] = {
244 	/* Core Duo MacBook & MacBook Pro */
245 	{ USB_VPI(USB_VENDOR_APPLE, 0x0217, ATP_DEV_PARAMS_0) },
246 	{ USB_VPI(USB_VENDOR_APPLE, 0x0218, ATP_DEV_PARAMS_0) },
247 	{ USB_VPI(USB_VENDOR_APPLE, 0x0219, ATP_DEV_PARAMS_0) },
248 
249 	/* Core2 Duo MacBook & MacBook Pro */
250 	{ USB_VPI(USB_VENDOR_APPLE, 0x021a, ATP_DEV_PARAMS_0) },
251 	{ USB_VPI(USB_VENDOR_APPLE, 0x021b, ATP_DEV_PARAMS_0) },
252 	{ USB_VPI(USB_VENDOR_APPLE, 0x021c, ATP_DEV_PARAMS_0) },
253 
254 	/* Core2 Duo MacBook3,1 */
255 	{ USB_VPI(USB_VENDOR_APPLE, 0x0229, ATP_DEV_PARAMS_0) },
256 	{ USB_VPI(USB_VENDOR_APPLE, 0x022a, ATP_DEV_PARAMS_0) },
257 	{ USB_VPI(USB_VENDOR_APPLE, 0x022b, ATP_DEV_PARAMS_0) },
258 
259 	/* 12 inch PowerBook and iBook */
260 	{ USB_VPI(USB_VENDOR_APPLE, 0x030a, ATP_DEV_PARAMS_PBOOK) },
261 	{ USB_VPI(USB_VENDOR_APPLE, 0x030b, ATP_DEV_PARAMS_PBOOK) },
262 
263 	/* 15 inch PowerBook */
264 	{ USB_VPI(USB_VENDOR_APPLE, 0x020e, ATP_DEV_PARAMS_PBOOK) },
265 	{ USB_VPI(USB_VENDOR_APPLE, 0x020f, ATP_DEV_PARAMS_PBOOK) },
266 	{ USB_VPI(USB_VENDOR_APPLE, 0x0215, ATP_DEV_PARAMS_PBOOK_15A) },
267 
268 	/* 17 inch PowerBook */
269 	{ USB_VPI(USB_VENDOR_APPLE, 0x020d, ATP_DEV_PARAMS_PBOOK_17) },
270 
271 };
272 
273 /*
274  * The following structure captures the state of a pressure span along
275  * an axis. Each contact with the touchpad results in separate
276  * pressure spans along the two axes.
277  */
278 typedef struct atp_pspan {
279 	u_int width;   /* in units of sensors */
280 	u_int cum;     /* cumulative compression (from all sensors) */
281 	u_int cog;     /* center of gravity */
282 	u_int loc;     /* location (scaled using the mickeys factor) */
283 	boolean_t matched; /* to track pspans as they match against strokes. */
284 } atp_pspan;
285 
286 typedef enum atp_stroke_type {
287 	ATP_STROKE_TOUCH,
288 	ATP_STROKE_SLIDE,
289 } atp_stroke_type;
290 
291 #define ATP_MAX_PSPANS_PER_AXIS 3
292 
293 typedef struct atp_stroke_component {
294 	/* Fields encapsulating the pressure-span. */
295 	u_int loc;              /* location (scaled) */
296 	u_int cum_pressure;     /* cumulative compression */
297 	u_int max_cum_pressure; /* max cumulative compression */
298 	boolean_t matched; /*to track components as they match against pspans.*/
299 
300 	/* Fields containing information about movement. */
301 	int   delta_mickeys;    /* change in location (un-smoothened movement)*/
302 	int   pending;          /* cum. of pending short movements */
303 	int   movement;         /* current smoothened movement */
304 } atp_stroke_component;
305 
306 typedef enum atp_axis {
307 	X = 0,
308 	Y = 1
309 } atp_axis;
310 
311 #define ATP_MAX_STROKES         (2 * ATP_MAX_PSPANS_PER_AXIS)
312 
313 /*
314  * The following structure captures a finger contact with the
315  * touchpad. A stroke comprises two p-span components and some state.
316  */
317 typedef struct atp_stroke {
318 	atp_stroke_type      type;
319 	struct timeval       ctime; /* create time; for coincident siblings. */
320 	u_int                age;   /*
321 				     * Unit: interrupts; we maintain
322 				     * this value in addition to
323 				     * 'ctime' in order to avoid the
324 				     * expensive call to microtime()
325 				     * at every interrupt.
326 				     */
327 
328 	atp_stroke_component components[2];
329 	u_int                velocity_squared; /*
330 						* Average magnitude (squared)
331 						* of recent velocity.
332 						*/
333 	u_int                cum_movement; /* cum. absolute movement so far */
334 
335 	uint32_t             flags;  /* the state of this stroke */
336 #define ATSF_ZOMBIE          0x1
337 } atp_stroke;
338 
339 #define ATP_FIFO_BUF_SIZE        8 /* bytes */
340 #define ATP_FIFO_QUEUE_MAXLEN   50 /* units */
341 
342 enum {
343 	ATP_INTR_DT,
344 	ATP_RESET,
345 	ATP_N_TRANSFER,
346 };
347 
348 struct atp_softc {
349 	device_t               sc_dev;
350 	struct usb_device     *sc_usb_device;
351 #define MODE_LENGTH 8
352 	char                   sc_mode_bytes[MODE_LENGTH]; /* device mode */
353 	struct mtx             sc_mutex; /* for synchronization */
354 	struct usb_xfer       *sc_xfer[ATP_N_TRANSFER];
355 	struct usb_fifo_sc     sc_fifo;
356 
357 	struct atp_dev_params *sc_params;
358 
359 	mousehw_t              sc_hw;
360 	mousemode_t            sc_mode;
361 	u_int                  sc_pollrate;
362 	mousestatus_t          sc_status;
363 	u_int                  sc_state;
364 #define ATP_ENABLED            0x01
365 #define ATP_ZOMBIES_EXIST      0x02
366 #define ATP_DOUBLE_TAP_DRAG    0x04
367 #define ATP_VALID              0x08
368 
369 	u_int                  sc_left_margin;
370 	u_int                  sc_right_margin;
371 
372 	atp_stroke             sc_strokes[ATP_MAX_STROKES];
373 	u_int                  sc_n_strokes;
374 
375 	int8_t                *sensor_data; /* from interrupt packet */
376 	int                   *base_x;      /* base sensor readings */
377 	int                   *base_y;
378 	int                   *cur_x;       /* current sensor readings */
379 	int                   *cur_y;
380 	int                   *pressure_x;  /* computed pressures */
381 	int                   *pressure_y;
382 
383 	u_int                  sc_idlecount; /* preceding idle interrupts */
384 #define ATP_IDLENESS_THRESHOLD 10
385 
386 	struct timeval         sc_reap_time;
387 	struct timeval         sc_reap_ctime; /*ctime of siblings to be reaped*/
388 };
389 
390 /*
391  * The last byte of the sensor data contains status bits; the
392  * following values define the meanings of these bits.
393  */
394 enum atp_status_bits {
395 	ATP_STATUS_BUTTON      = (uint8_t)0x01, /* The button was pressed */
396 	ATP_STATUS_BASE_UPDATE = (uint8_t)0x04, /* Data from an untouched pad.*/
397 };
398 
399 typedef enum interface_mode {
400 	RAW_SENSOR_MODE = (uint8_t)0x04,
401 	HID_MODE        = (uint8_t)0x08
402 } interface_mode;
403 
404 /*
405  * function prototypes
406  */
407 static usb_fifo_cmd_t   atp_start_read;
408 static usb_fifo_cmd_t   atp_stop_read;
409 static usb_fifo_open_t  atp_open;
410 static usb_fifo_close_t atp_close;
411 static usb_fifo_ioctl_t atp_ioctl;
412 
413 static struct usb_fifo_methods atp_fifo_methods = {
414 	.f_open       = &atp_open,
415 	.f_close      = &atp_close,
416 	.f_ioctl      = &atp_ioctl,
417 	.f_start_read = &atp_start_read,
418 	.f_stop_read  = &atp_stop_read,
419 	.basename[0]  = ATP_DRIVER_NAME,
420 };
421 
422 /* device initialization and shutdown */
423 static usb_error_t   atp_req_get_report(struct usb_device *udev, void *data);
424 static int           atp_set_device_mode(device_t dev, interface_mode mode);
425 static void          atp_reset_callback(struct usb_xfer *, usb_error_t);
426 static int           atp_enable(struct atp_softc *sc);
427 static void          atp_disable(struct atp_softc *sc);
428 static int           atp_softc_populate(struct atp_softc *);
429 static void          atp_softc_unpopulate(struct atp_softc *);
430 
431 /* sensor interpretation */
432 static __inline void atp_interpret_sensor_data(const int8_t *, u_int, atp_axis,
433 			 int *, atp_protocol);
434 static __inline void atp_get_pressures(int *, const int *, const int *, int);
435 static void          atp_detect_pspans(int *, u_int, u_int, atp_pspan *,
436 			 u_int *);
437 
438 /* movement detection */
439 static boolean_t     atp_match_stroke_component(atp_stroke_component *,
440                          const atp_pspan *, atp_stroke_type);
441 static void          atp_match_strokes_against_pspans(struct atp_softc *,
442 			 atp_axis, atp_pspan *, u_int, u_int);
443 static boolean_t     atp_update_strokes(struct atp_softc *,
444 			 atp_pspan *, u_int, atp_pspan *, u_int);
445 static __inline void atp_add_stroke(struct atp_softc *, const atp_pspan *,
446 			 const atp_pspan *);
447 static void          atp_add_new_strokes(struct atp_softc *, atp_pspan *,
448 			 u_int, atp_pspan *, u_int);
449 static void          atp_advance_stroke_state(struct atp_softc *,
450 			 atp_stroke *, boolean_t *);
451 static void          atp_terminate_stroke(struct atp_softc *, u_int);
452 static __inline boolean_t atp_stroke_has_small_movement(const atp_stroke *);
453 static __inline void atp_update_pending_mickeys(atp_stroke_component *);
454 static void          atp_compute_smoothening_scale_ratio(atp_stroke *, int *,
455 			 int *);
456 static boolean_t     atp_compute_stroke_movement(atp_stroke *);
457 
458 /* tap detection */
459 static __inline void atp_setup_reap_time(struct atp_softc *, struct timeval *);
460 static void          atp_reap_zombies(struct atp_softc *, u_int *, u_int *);
461 static void          atp_convert_to_slide(struct atp_softc *, atp_stroke *);
462 
463 /* updating fifo */
464 static void          atp_reset_buf(struct atp_softc *sc);
465 static void          atp_add_to_queue(struct atp_softc *, int, int, uint32_t);
466 
467 
468 usb_error_t
469 atp_req_get_report(struct usb_device *udev, void *data)
470 {
471 	struct usb_device_request req;
472 
473 	req.bmRequestType = UT_READ_CLASS_INTERFACE;
474 	req.bRequest = UR_GET_REPORT;
475 	USETW2(req.wValue, (uint8_t)0x03 /* type */, (uint8_t)0x00 /* id */);
476 	USETW(req.wIndex, 0);
477 	USETW(req.wLength, MODE_LENGTH);
478 
479 	return (usbd_do_request(udev, NULL /* mutex */, &req, data));
480 }
481 
482 static int
483 atp_set_device_mode(device_t dev, interface_mode mode)
484 {
485 	struct atp_softc     *sc;
486 	usb_device_request_t  req;
487 	usb_error_t           err;
488 
489 	if ((mode != RAW_SENSOR_MODE) && (mode != HID_MODE))
490 		return (ENXIO);
491 
492 	sc = device_get_softc(dev);
493 
494 	sc->sc_mode_bytes[0] = mode;
495 	req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
496 	req.bRequest = UR_SET_REPORT;
497 	USETW2(req.wValue, (uint8_t)0x03 /* type */, (uint8_t)0x00 /* id */);
498 	USETW(req.wIndex, 0);
499 	USETW(req.wLength, MODE_LENGTH);
500 	err = usbd_do_request(sc->sc_usb_device, NULL, &req, sc->sc_mode_bytes);
501 	if (err != USB_ERR_NORMAL_COMPLETION)
502 		return (ENXIO);
503 
504 	return (0);
505 }
506 
507 void
508 atp_reset_callback(struct usb_xfer *xfer, usb_error_t error)
509 {
510 	usb_device_request_t   req;
511 	struct usb_page_cache *pc;
512 	struct atp_softc      *sc = usbd_xfer_softc(xfer);
513 
514 	switch (USB_GET_STATE(xfer)) {
515 	case USB_ST_SETUP:
516 		sc->sc_mode_bytes[0] = RAW_SENSOR_MODE;
517 		req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
518 		req.bRequest = UR_SET_REPORT;
519 		USETW2(req.wValue,
520 		    (uint8_t)0x03 /* type */, (uint8_t)0x00 /* id */);
521 		USETW(req.wIndex, 0);
522 		USETW(req.wLength, MODE_LENGTH);
523 
524 		pc = usbd_xfer_get_frame(xfer, 0);
525 		usbd_copy_in(pc, 0, &req, sizeof(req));
526 		pc = usbd_xfer_get_frame(xfer, 1);
527 		usbd_copy_in(pc, 0, sc->sc_mode_bytes, MODE_LENGTH);
528 
529 		usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
530 		usbd_xfer_set_frame_len(xfer, 1, MODE_LENGTH);
531 		usbd_xfer_set_frames(xfer, 2);
532 		usbd_transfer_submit(xfer);
533 		break;
534 
535 	case USB_ST_TRANSFERRED:
536 	default:
537 		break;
538 	}
539 }
540 
541 static int
542 atp_enable(struct atp_softc *sc)
543 {
544 	/* Allocate the dynamic buffers */
545 	if (atp_softc_populate(sc) != 0) {
546 		atp_softc_unpopulate(sc);
547 		return (ENOMEM);
548 	}
549 
550 	/* reset status */
551 	memset(sc->sc_strokes, 0, sizeof(sc->sc_strokes));
552 	sc->sc_n_strokes = 0;
553 	memset(&sc->sc_status, 0, sizeof(sc->sc_status));
554 	sc->sc_idlecount = 0;
555 	sc->sc_state |= ATP_ENABLED;
556 
557 	DPRINTFN(ATP_LLEVEL_INFO, "enabled atp\n");
558 	return (0);
559 }
560 
561 static void
562 atp_disable(struct atp_softc *sc)
563 {
564 	atp_softc_unpopulate(sc);
565 
566 	sc->sc_state &= ~(ATP_ENABLED | ATP_VALID);
567 	DPRINTFN(ATP_LLEVEL_INFO, "disabled atp\n");
568 }
569 
570 /* Allocate dynamic memory for some fields in softc. */
571 static int
572 atp_softc_populate(struct atp_softc *sc)
573 {
574 	const struct atp_dev_params *params = sc->sc_params;
575 
576 	if (params == NULL) {
577 		DPRINTF("params uninitialized!\n");
578 		return (ENXIO);
579 	}
580 	if (params->data_len) {
581 		sc->sensor_data = malloc(params->data_len * sizeof(int8_t),
582 		    M_USB, M_WAITOK);
583 		if (sc->sensor_data == NULL) {
584 			DPRINTF("mem for sensor_data\n");
585 			return (ENXIO);
586 		}
587 	}
588 
589 	if (params->n_xsensors != 0) {
590 		sc->base_x = malloc(params->n_xsensors * sizeof(*(sc->base_x)),
591 		    M_USB, M_WAITOK);
592 		if (sc->base_x == NULL) {
593 			DPRINTF("mem for sc->base_x\n");
594 			return (ENXIO);
595 		}
596 
597 		sc->cur_x = malloc(params->n_xsensors * sizeof(*(sc->cur_x)),
598 		    M_USB, M_WAITOK);
599 		if (sc->cur_x == NULL) {
600 			DPRINTF("mem for sc->cur_x\n");
601 			return (ENXIO);
602 		}
603 
604 		sc->pressure_x =
605 			malloc(params->n_xsensors * sizeof(*(sc->pressure_x)),
606 			    M_USB, M_WAITOK);
607 		if (sc->pressure_x == NULL) {
608 			DPRINTF("mem. for pressure_x\n");
609 			return (ENXIO);
610 		}
611 	}
612 
613 	if (params->n_ysensors != 0) {
614 		sc->base_y = malloc(params->n_ysensors * sizeof(*(sc->base_y)),
615 		    M_USB, M_WAITOK);
616 		if (sc->base_y == NULL) {
617 			DPRINTF("mem for base_y\n");
618 			return (ENXIO);
619 		}
620 
621 		sc->cur_y = malloc(params->n_ysensors * sizeof(*(sc->cur_y)),
622 		    M_USB, M_WAITOK);
623 		if (sc->cur_y == NULL) {
624 			DPRINTF("mem for cur_y\n");
625 			return (ENXIO);
626 		}
627 
628 		sc->pressure_y =
629 			malloc(params->n_ysensors * sizeof(*(sc->pressure_y)),
630 			    M_USB, M_WAITOK);
631 		if (sc->pressure_y == NULL) {
632 			DPRINTF("mem. for pressure_y\n");
633 			return (ENXIO);
634 		}
635 	}
636 
637 	return (0);
638 }
639 
640 /* Free dynamic memory allocated for some fields in softc. */
641 static void
642 atp_softc_unpopulate(struct atp_softc *sc)
643 {
644 	const struct atp_dev_params *params = sc->sc_params;
645 
646 	if (params == NULL) {
647 		return;
648 	}
649 	if (params->n_xsensors != 0) {
650 		if (sc->base_x != NULL) {
651 			free(sc->base_x, M_USB);
652 			sc->base_x = NULL;
653 		}
654 
655 		if (sc->cur_x != NULL) {
656 			free(sc->cur_x, M_USB);
657 			sc->cur_x = NULL;
658 		}
659 
660 		if (sc->pressure_x != NULL) {
661 			free(sc->pressure_x, M_USB);
662 			sc->pressure_x = NULL;
663 		}
664 	}
665 	if (params->n_ysensors != 0) {
666 		if (sc->base_y != NULL) {
667 			free(sc->base_y, M_USB);
668 			sc->base_y = NULL;
669 		}
670 
671 		if (sc->cur_y != NULL) {
672 			free(sc->cur_y, M_USB);
673 			sc->cur_y = NULL;
674 		}
675 
676 		if (sc->pressure_y != NULL) {
677 			free(sc->pressure_y, M_USB);
678 			sc->pressure_y = NULL;
679 		}
680 	}
681 	if (sc->sensor_data != NULL) {
682 		free(sc->sensor_data, M_USB);
683 		sc->sensor_data = NULL;
684 	}
685 }
686 
687 /*
688  * Interpret the data from the X and Y pressure sensors. This function
689  * is called separately for the X and Y sensor arrays. The data in the
690  * USB packet is laid out in the following manner:
691  *
692  * sensor_data:
693  *            --,--,Y1,Y2,--,Y3,Y4,--,Y5,...,Y10, ... X1,X2,--,X3,X4
694  *  indices:   0  1  2  3  4  5  6  7  8 ...  15  ... 20 21 22 23 24
695  *
696  * '--' (in the above) indicates that the value is unimportant.
697  *
698  * Information about the above layout was obtained from the
699  * implementation of the AppleTouch driver in Linux.
700  *
701  * parameters:
702  *   sensor_data
703  *       raw sensor data from the USB packet.
704  *   num
705  *       The number of elements in the array 'arr'.
706  *   axis
707  *       Axis of data to fetch
708  *   arr
709  *       The array to be initialized with the readings.
710  *   prot
711  *       The protocol to use to interpret the data
712  */
713 static __inline void
714 atp_interpret_sensor_data(const int8_t *sensor_data, u_int num, atp_axis axis,
715     int	*arr, atp_protocol prot)
716 {
717 	u_int i;
718 	u_int di;   /* index into sensor data */
719 
720 	switch (prot) {
721 	case ATP_PROT_GEYSER1:
722 		/*
723 		 * For Geyser 1, the sensors are laid out in pairs
724 		 * every 5 bytes.
725 		 */
726 		for (i = 0, di = (axis == Y) ? 1 : 2; i < 8; di += 5, i++) {
727 			arr[i] = sensor_data[di];
728 			arr[i+8] = sensor_data[di+2];
729 			if (axis == X && num > 16)
730 				arr[i+16] = sensor_data[di+40];
731 		}
732 
733 		break;
734 	case ATP_PROT_GEYSER2:
735 	case ATP_PROT_GEYSER3:
736 		for (i = 0, di = (axis == Y) ? 2 : 20; i < num; /* empty */ ) {
737 			arr[i++] = sensor_data[di++];
738 			arr[i++] = sensor_data[di++];
739 			di++;
740 		}
741 		break;
742 	}
743 }
744 
745 static __inline void
746 atp_get_pressures(int *p, const int *cur, const int *base, int n)
747 {
748 	int i;
749 
750 	for (i = 0; i < n; i++) {
751 		p[i] = cur[i] - base[i];
752 		if (p[i] > 127)
753 			p[i] -= 256;
754 		if (p[i] < -127)
755 			p[i] += 256;
756 		if (p[i] < 0)
757 			p[i] = 0;
758 
759 		/*
760 		 * Shave off pressures below the noise-pressure
761 		 * threshold; this will reduce the contribution from
762 		 * lower pressure readings.
763 		 */
764 		if (p[i] <= atp_sensor_noise_threshold)
765 			p[i] = 0; /* filter away noise */
766 		else
767 			p[i] -= atp_sensor_noise_threshold;
768 	}
769 }
770 
771 static void
772 atp_detect_pspans(int *p, u_int num_sensors,
773     u_int       max_spans, /* max # of pspans permitted */
774     atp_pspan  *spans,     /* finger spans */
775     u_int      *nspans_p)  /* num spans detected */
776 {
777 	u_int i;
778 	int   maxp;             /* max pressure seen within a span */
779 	u_int num_spans = 0;
780 
781 	enum atp_pspan_state {
782 		ATP_PSPAN_INACTIVE,
783 		ATP_PSPAN_INCREASING,
784 		ATP_PSPAN_DECREASING,
785 	} state; /* state of the pressure span */
786 
787 	/*
788 	 * The following is a simple state machine to track
789 	 * the phase of the pressure span.
790 	 */
791 	memset(spans, 0, max_spans * sizeof(atp_pspan));
792 	maxp = 0;
793 	state = ATP_PSPAN_INACTIVE;
794 	for (i = 0; i < num_sensors; i++) {
795 		if (num_spans >= max_spans)
796 			break;
797 
798 		if (p[i] == 0) {
799 			if (state == ATP_PSPAN_INACTIVE) {
800 				/*
801 				 * There is no pressure information for this
802 				 * sensor, and we aren't tracking a finger.
803 				 */
804 				continue;
805 			} else {
806 				state = ATP_PSPAN_INACTIVE;
807 				maxp = 0;
808 				num_spans++;
809 			}
810 		} else {
811 			switch (state) {
812 			case ATP_PSPAN_INACTIVE:
813 				state = ATP_PSPAN_INCREASING;
814 				maxp  = p[i];
815 				break;
816 
817 			case ATP_PSPAN_INCREASING:
818 				if (p[i] > maxp)
819 					maxp = p[i];
820 				else if (p[i] <= (maxp >> 1))
821 					state = ATP_PSPAN_DECREASING;
822 				break;
823 
824 			case ATP_PSPAN_DECREASING:
825 				if (p[i] > p[i - 1]) {
826 					/*
827 					 * This is the beginning of
828 					 * another span; change state
829 					 * to give the appearance that
830 					 * we're starting from an
831 					 * inactive span, and then
832 					 * re-process this reading in
833 					 * the next iteration.
834 					 */
835 					num_spans++;
836 					state = ATP_PSPAN_INACTIVE;
837 					maxp  = 0;
838 					i--;
839 					continue;
840 				}
841 				break;
842 			}
843 
844 			/* Update the finger span with this reading. */
845 			spans[num_spans].width++;
846 			spans[num_spans].cum += p[i];
847 			spans[num_spans].cog += p[i] * (i + 1);
848 		}
849 	}
850 	if (state != ATP_PSPAN_INACTIVE)
851 		num_spans++;    /* close the last finger span */
852 
853 	/* post-process the spans */
854 	for (i = 0; i < num_spans; i++) {
855 		/* filter away unwanted pressure spans */
856 		if ((spans[i].cum < atp_pspan_min_cum_pressure) ||
857 		    (spans[i].width > atp_pspan_max_width)) {
858 			if ((i + 1) < num_spans) {
859 				memcpy(&spans[i], &spans[i + 1],
860 				    (num_spans - i - 1) * sizeof(atp_pspan));
861 				i--;
862 			}
863 			num_spans--;
864 			continue;
865 		}
866 
867 		/* compute this span's representative location */
868 		spans[i].loc = spans[i].cog * atp_mickeys_scale_factor /
869 			spans[i].cum;
870 
871 		spans[i].matched = FALSE; /* not yet matched against a stroke */
872 	}
873 
874 	*nspans_p = num_spans;
875 }
876 
877 /*
878  * Match a pressure-span against a stroke-component. If there is a
879  * match, update the component's state and return TRUE.
880  */
881 static boolean_t
882 atp_match_stroke_component(atp_stroke_component *component,
883     const atp_pspan *pspan, atp_stroke_type stroke_type)
884 {
885 	int   delta_mickeys;
886 	u_int min_pressure;
887 
888 	delta_mickeys = pspan->loc - component->loc;
889 
890 	if (abs(delta_mickeys) > atp_max_delta_mickeys)
891 		return (FALSE); /* the finger span is too far out; no match */
892 
893 	component->loc          = pspan->loc;
894 
895 	/*
896 	 * A sudden and significant increase in a pspan's cumulative
897 	 * pressure indicates the incidence of a new finger
898 	 * contact. This usually revises the pspan's
899 	 * centre-of-gravity, and hence the location of any/all
900 	 * matching stroke component(s). But such a change should
901 	 * *not* be interpreted as a movement.
902 	 */
903         if (pspan->cum > ((3 * component->cum_pressure) >> 1))
904 		delta_mickeys = 0;
905 
906 	component->cum_pressure = pspan->cum;
907 	if (pspan->cum > component->max_cum_pressure)
908 		component->max_cum_pressure = pspan->cum;
909 
910 	/*
911 	 * Disregard the component's movement if its cumulative
912 	 * pressure drops below a fraction of the maximum; this
913 	 * fraction is determined based on the stroke's type.
914 	 */
915 	if (stroke_type == ATP_STROKE_TOUCH)
916 		min_pressure = (3 * component->max_cum_pressure) >> 2;
917 	else
918 		min_pressure = component->max_cum_pressure >> 2;
919 	if (component->cum_pressure < min_pressure)
920 		delta_mickeys = 0;
921 
922 	component->delta_mickeys = delta_mickeys;
923 	return (TRUE);
924 }
925 
926 static void
927 atp_match_strokes_against_pspans(struct atp_softc *sc, atp_axis axis,
928     atp_pspan *pspans, u_int n_pspans, u_int repeat_count)
929 {
930 	u_int i, j;
931 	u_int repeat_index = 0;
932 
933 	/* Determine the index of the multi-span. */
934 	if (repeat_count) {
935 		u_int cum = 0;
936 		for (i = 0; i < n_pspans; i++) {
937 			if (pspans[i].cum > cum) {
938 				repeat_index = i;
939 				cum = pspans[i].cum;
940 			}
941 		}
942 	}
943 
944 	for (i = 0; i < sc->sc_n_strokes; i++) {
945 		atp_stroke *stroke  = &sc->sc_strokes[i];
946 		if (stroke->components[axis].matched)
947 			continue; /* skip matched components */
948 
949 		for (j = 0; j < n_pspans; j++) {
950 			if (pspans[j].matched)
951 				continue; /* skip matched pspans */
952 
953 			if (atp_match_stroke_component(
954 				    &stroke->components[axis], &pspans[j],
955 				    stroke->type)) {
956 				/* There is a match. */
957 				stroke->components[axis].matched = TRUE;
958 
959 				/* Take care to repeat at the multi-span. */
960 				if ((repeat_count > 0) && (j == repeat_index))
961 					repeat_count--;
962 				else
963 					pspans[j].matched = TRUE;
964 
965 				break; /* skip to the next stroke */
966 			}
967 		} /* loop over pspans */
968 	} /* loop over strokes */
969 }
970 
971 /*
972  * Update strokes by matching against current pressure-spans.
973  * Return TRUE if any movement is detected.
974  */
975 static boolean_t
976 atp_update_strokes(struct atp_softc *sc, atp_pspan *pspans_x,
977     u_int n_xpspans, atp_pspan *pspans_y, u_int n_ypspans)
978 {
979 	u_int       i, j;
980 	atp_stroke *stroke;
981 	boolean_t   movement = FALSE;
982 	u_int       repeat_count = 0;
983 
984 	/* Reset X and Y components of all strokes as unmatched. */
985 	for (i = 0; i < sc->sc_n_strokes; i++) {
986 		stroke = &sc->sc_strokes[i];
987 		stroke->components[X].matched = FALSE;
988 		stroke->components[Y].matched = FALSE;
989 	}
990 
991 	/*
992 	 * Usually, the X and Y pspans come in pairs (the common case
993 	 * being a single pair). It is possible, however, that
994 	 * multiple contacts resolve to a single pspan along an
995 	 * axis, as illustrated in the following:
996 	 *
997 	 *   F = finger-contact
998 	 *
999 	 *                pspan  pspan
1000 	 *        +-----------------------+
1001 	 *        |         .      .      |
1002 	 *        |         .      .      |
1003 	 *        |         .      .      |
1004 	 *        |         .      .      |
1005 	 *  pspan |.........F......F      |
1006 	 *        |                       |
1007 	 *        |                       |
1008 	 *        |                       |
1009 	 *        +-----------------------+
1010 	 *
1011 	 *
1012 	 * The above case can be detected by a difference in the
1013 	 * number of X and Y pspans. When this happens, X and Y pspans
1014 	 * aren't easy to pair or match against strokes.
1015 	 *
1016 	 * When X and Y pspans differ in number, the axis with the
1017 	 * smaller number of pspans is regarded as having a repeating
1018 	 * pspan (or a multi-pspan)--in the above illustration, the
1019 	 * Y-axis has a repeating pspan. Our approach is to try to
1020 	 * match the multi-pspan repeatedly against strokes. The
1021 	 * difference between the number of X and Y pspans gives us a
1022 	 * crude repeat_count for matching multi-pspans--i.e. the
1023 	 * multi-pspan along the Y axis (above) has a repeat_count of 1.
1024 	 */
1025 	repeat_count = abs(n_xpspans - n_ypspans);
1026 
1027 	atp_match_strokes_against_pspans(sc, X, pspans_x, n_xpspans,
1028 	    (((repeat_count != 0) && ((n_xpspans < n_ypspans))) ?
1029 		repeat_count : 0));
1030 	atp_match_strokes_against_pspans(sc, Y, pspans_y, n_ypspans,
1031 	    (((repeat_count != 0) && (n_ypspans < n_xpspans)) ?
1032 		repeat_count : 0));
1033 
1034 	/* Update the state of strokes based on the above pspan matches. */
1035 	for (i = 0; i < sc->sc_n_strokes; i++) {
1036 		stroke = &sc->sc_strokes[i];
1037 		if (stroke->components[X].matched &&
1038 		    stroke->components[Y].matched) {
1039 			atp_advance_stroke_state(sc, stroke, &movement);
1040 		} else {
1041 			/*
1042 			 * At least one component of this stroke
1043 			 * didn't match against current pspans;
1044 			 * terminate it.
1045 			 */
1046 			atp_terminate_stroke(sc, i);
1047 		}
1048 	}
1049 
1050 	/* Add new strokes for pairs of unmatched pspans */
1051 	for (i = 0; i < n_xpspans; i++) {
1052 		if (pspans_x[i].matched == FALSE) break;
1053 	}
1054 	for (j = 0; j < n_ypspans; j++) {
1055 		if (pspans_y[j].matched == FALSE) break;
1056 	}
1057 	if ((i < n_xpspans) && (j < n_ypspans)) {
1058 #ifdef USB_DEBUG
1059 		if (atp_debug >= ATP_LLEVEL_INFO) {
1060 			printf("unmatched pspans:");
1061 			for (; i < n_xpspans; i++) {
1062 				if (pspans_x[i].matched)
1063 					continue;
1064 				printf(" X:[loc:%u,cum:%u]",
1065 				    pspans_x[i].loc, pspans_x[i].cum);
1066 			}
1067 			for (; j < n_ypspans; j++) {
1068 				if (pspans_y[j].matched)
1069 					continue;
1070 				printf(" Y:[loc:%u,cum:%u]",
1071 				    pspans_y[j].loc, pspans_y[j].cum);
1072 			}
1073 			printf("\n");
1074 		}
1075 #endif /* USB_DEBUG */
1076 		if ((n_xpspans == 1) && (n_ypspans == 1))
1077 			/* The common case of a single pair of new pspans. */
1078 			atp_add_stroke(sc, &pspans_x[0], &pspans_y[0]);
1079 		else
1080 			atp_add_new_strokes(sc,
1081 			    pspans_x, n_xpspans,
1082 			    pspans_y, n_ypspans);
1083 	}
1084 
1085 #ifdef USB_DEBUG
1086 	if (atp_debug >= ATP_LLEVEL_INFO) {
1087 		for (i = 0; i < sc->sc_n_strokes; i++) {
1088 			atp_stroke *stroke = &sc->sc_strokes[i];
1089 
1090 			printf(" %s%clc:%u,dm:%d,pnd:%d,cum:%d,max:%d,mv:%d%c"
1091 			    ",%clc:%u,dm:%d,pnd:%d,cum:%d,max:%d,mv:%d%c",
1092 			    (stroke->flags & ATSF_ZOMBIE) ? "zomb:" : "",
1093 			    (stroke->type == ATP_STROKE_TOUCH) ? '[' : '<',
1094 			    stroke->components[X].loc,
1095 			    stroke->components[X].delta_mickeys,
1096 			    stroke->components[X].pending,
1097 			    stroke->components[X].cum_pressure,
1098 			    stroke->components[X].max_cum_pressure,
1099 			    stroke->components[X].movement,
1100 			    (stroke->type == ATP_STROKE_TOUCH) ? ']' : '>',
1101 			    (stroke->type == ATP_STROKE_TOUCH) ? '[' : '<',
1102 			    stroke->components[Y].loc,
1103 			    stroke->components[Y].delta_mickeys,
1104 			    stroke->components[Y].pending,
1105 			    stroke->components[Y].cum_pressure,
1106 			    stroke->components[Y].max_cum_pressure,
1107 			    stroke->components[Y].movement,
1108 			    (stroke->type == ATP_STROKE_TOUCH) ? ']' : '>');
1109 		}
1110 		if (sc->sc_n_strokes)
1111 			printf("\n");
1112 	}
1113 #endif /* USB_DEBUG */
1114 
1115 	return (movement);
1116 }
1117 
1118 /* Initialize a stroke using a pressure-span. */
1119 static __inline void
1120 atp_add_stroke(struct atp_softc *sc, const atp_pspan *pspan_x,
1121     const atp_pspan *pspan_y)
1122 {
1123 	atp_stroke *stroke;
1124 
1125 	if (sc->sc_n_strokes >= ATP_MAX_STROKES)
1126 		return;
1127 	stroke = &sc->sc_strokes[sc->sc_n_strokes];
1128 
1129 	memset(stroke, 0, sizeof(atp_stroke));
1130 
1131 	/*
1132 	 * Strokes begin as potential touches. If a stroke survives
1133 	 * longer than a threshold, or if it records significant
1134 	 * cumulative movement, then it is considered a 'slide'.
1135 	 */
1136 	stroke->type = ATP_STROKE_TOUCH;
1137 	microtime(&stroke->ctime);
1138 	stroke->age  = 1;       /* Unit: interrupts */
1139 
1140 	stroke->components[X].loc              = pspan_x->loc;
1141 	stroke->components[X].cum_pressure     = pspan_x->cum;
1142 	stroke->components[X].max_cum_pressure = pspan_x->cum;
1143 	stroke->components[X].matched          = TRUE;
1144 
1145 	stroke->components[Y].loc              = pspan_y->loc;
1146 	stroke->components[Y].cum_pressure     = pspan_y->cum;
1147 	stroke->components[Y].max_cum_pressure = pspan_y->cum;
1148 	stroke->components[Y].matched          = TRUE;
1149 
1150 	sc->sc_n_strokes++;
1151 	if (sc->sc_n_strokes > 1) {
1152 		/* Reset double-tap-n-drag if we have more than one strokes. */
1153 		sc->sc_state &= ~ATP_DOUBLE_TAP_DRAG;
1154 	}
1155 
1156 	DPRINTFN(ATP_LLEVEL_INFO, "[%u,%u], time: %u,%ld\n",
1157 	    stroke->components[X].loc,
1158 	    stroke->components[Y].loc,
1159 	    (unsigned int)stroke->ctime.tv_sec,
1160 	    (unsigned long int)stroke->ctime.tv_usec);
1161 }
1162 
1163 static void
1164 atp_add_new_strokes(struct atp_softc *sc, atp_pspan *pspans_x,
1165     u_int n_xpspans, atp_pspan *pspans_y, u_int n_ypspans)
1166 {
1167 	int       i, j;
1168 	atp_pspan spans[2][ATP_MAX_PSPANS_PER_AXIS];
1169 	u_int     nspans[2];
1170 
1171 	/* Copy unmatched pspans into the local arrays. */
1172 	for (i = 0, nspans[X] = 0; i < n_xpspans; i++) {
1173 		if (pspans_x[i].matched == FALSE) {
1174 			spans[X][nspans[X]] = pspans_x[i];
1175 			nspans[X]++;
1176 		}
1177 	}
1178 	for (j = 0, nspans[Y] = 0; j < n_ypspans; j++) {
1179 		if (pspans_y[j].matched == FALSE) {
1180 			spans[Y][nspans[Y]] = pspans_y[j];
1181 			nspans[Y]++;
1182 		}
1183 	}
1184 
1185 	if (nspans[X] == nspans[Y]) {
1186 		/* Create new strokes from pairs of unmatched pspans */
1187 		for (i = 0, j = 0; (i < nspans[X]) && (j < nspans[Y]); i++, j++)
1188 			atp_add_stroke(sc, &spans[X][i], &spans[Y][j]);
1189 	} else {
1190 		u_int    cum = 0;
1191 		atp_axis repeat_axis;      /* axis with multi-pspans */
1192 		u_int    repeat_count;     /* repeat count for the multi-pspan*/
1193 		u_int    repeat_index = 0; /* index of the multi-span */
1194 
1195 		repeat_axis  = (nspans[X] > nspans[Y]) ? Y : X;
1196 		repeat_count = abs(nspans[X] - nspans[Y]);
1197 		for (i = 0; i < nspans[repeat_axis]; i++) {
1198 			if (spans[repeat_axis][i].cum > cum) {
1199 				repeat_index = i;
1200 				cum = spans[repeat_axis][i].cum;
1201 			}
1202 		}
1203 
1204 		/* Create new strokes from pairs of unmatched pspans */
1205 		i = 0, j = 0;
1206 		for (; (i < nspans[X]) && (j < nspans[Y]); i++, j++) {
1207 			atp_add_stroke(sc, &spans[X][i], &spans[Y][j]);
1208 
1209 			/* Take care to repeat at the multi-pspan. */
1210 			if (repeat_count > 0) {
1211 				if ((repeat_axis == X) &&
1212 				    (repeat_index == i)) {
1213 					i--; /* counter loop increment */
1214 					repeat_count--;
1215 				} else if ((repeat_axis == Y) &&
1216 				    (repeat_index == j)) {
1217 					j--; /* counter loop increment */
1218 					repeat_count--;
1219 				}
1220 			}
1221 		}
1222 	}
1223 }
1224 
1225 /*
1226  * Advance the state of this stroke--and update the out-parameter
1227  * 'movement' as a side-effect.
1228  */
1229 void
1230 atp_advance_stroke_state(struct atp_softc *sc, atp_stroke *stroke,
1231     boolean_t *movement)
1232 {
1233 	stroke->age++;
1234 	if (stroke->age <= atp_stroke_maturity_threshold) {
1235 		/* Avoid noise from immature strokes. */
1236 		stroke->components[X].delta_mickeys = 0;
1237 		stroke->components[Y].delta_mickeys = 0;
1238 	}
1239 
1240 	/* Revitalize stroke if it had previously been marked as a zombie. */
1241 	if (stroke->flags & ATSF_ZOMBIE)
1242 		stroke->flags &= ~ATSF_ZOMBIE;
1243 
1244 	if (atp_compute_stroke_movement(stroke))
1245 		*movement = TRUE;
1246 
1247 	if (stroke->type != ATP_STROKE_TOUCH)
1248 		return;
1249 
1250 	/* Convert touch strokes to slides upon detecting movement or age. */
1251 	if (stroke->cum_movement >= atp_slide_min_movement) {
1252 		atp_convert_to_slide(sc, stroke);
1253 	} else {
1254 		/* If a touch stroke is found to be older than the
1255 		 * touch-timeout threshold, it should be converted to
1256 		 * a slide; except if there is a co-incident sibling
1257 		 * with a later creation time.
1258 		 *
1259 		 * When multiple fingers make contact with the
1260 		 * touchpad, they are likely to be separated in their
1261 		 * times of incidence.  During a multi-finger tap,
1262 		 * therefore, the last finger to make
1263 		 * contact--i.e. the one with the latest
1264 		 * 'ctime'--should be used to determine how the
1265 		 * touch-siblings get treated; otherwise older
1266 		 * siblings may lapse the touch-timeout and get
1267 		 * converted into slides prematurely.  The following
1268 		 * loop determines if there exists another touch
1269 		 * stroke with a larger 'ctime' than the current
1270 		 * stroke (NOTE: zombies with a larger 'ctime' are
1271 		 * also considered) .
1272 		 */
1273 
1274 		u_int i;
1275 		for (i = 0; i < sc->sc_n_strokes; i++) {
1276 			if ((&sc->sc_strokes[i] == stroke) ||
1277 			    (sc->sc_strokes[i].type != ATP_STROKE_TOUCH))
1278 				continue;
1279 
1280 			if (timevalcmp(&sc->sc_strokes[i].ctime,
1281 				&stroke->ctime, >))
1282 				break;
1283 		}
1284 		if (i == sc->sc_n_strokes) {
1285 			/* Found no other touch stroke with a larger 'ctime'. */
1286 			struct timeval tdiff;
1287 
1288 			/* Compute the stroke's age. */
1289 			getmicrotime(&tdiff);
1290 			if (timevalcmp(&tdiff, &stroke->ctime, >))
1291 				timevalsub(&tdiff, &stroke->ctime);
1292 			else {
1293 				/*
1294 				 * If we are here, it is because getmicrotime
1295 				 * reported the current time as being behind
1296 				 * the stroke's start time; getmicrotime can
1297 				 * be imprecise.
1298 				 */
1299 				tdiff.tv_sec  = 0;
1300 				tdiff.tv_usec = 0;
1301 			}
1302 
1303 			if ((tdiff.tv_sec > (atp_touch_timeout / 1000000)) ||
1304 			    ((tdiff.tv_sec == (atp_touch_timeout / 1000000)) &&
1305 				(tdiff.tv_usec >=
1306 				    (atp_touch_timeout % 1000000))))
1307 				atp_convert_to_slide(sc, stroke);
1308 		}
1309 	}
1310 }
1311 
1312 /* Switch a given touch stroke to being a slide. */
1313 void
1314 atp_convert_to_slide(struct atp_softc *sc, atp_stroke *stroke)
1315 {
1316 	stroke->type = ATP_STROKE_SLIDE;
1317 
1318 	/* Are we at the beginning of a double-click-n-drag? */
1319 	if ((sc->sc_n_strokes == 1) &&
1320 	    ((sc->sc_state & ATP_ZOMBIES_EXIST) == 0) &&
1321 	    timevalcmp(&stroke->ctime, &sc->sc_reap_time, >)) {
1322 		struct timeval delta;
1323 		struct timeval window = {
1324 			atp_double_tap_threshold / 1000000,
1325 			atp_double_tap_threshold % 1000000
1326 		};
1327 
1328 		delta = stroke->ctime;
1329 		timevalsub(&delta, &sc->sc_reap_time);
1330 		if (timevalcmp(&delta, &window, <=))
1331 			sc->sc_state |= ATP_DOUBLE_TAP_DRAG;
1332 	}
1333 }
1334 
1335 /*
1336  * Terminate a stroke. While SLIDE strokes are dropped, TOUCH strokes
1337  * are retained as zombies so as to reap all their siblings together;
1338  * this helps establish the number of fingers involved in the tap.
1339  */
1340 static void
1341 atp_terminate_stroke(struct atp_softc *sc,
1342     u_int index) /* index of the stroke to be terminated */
1343 {
1344 	atp_stroke *s = &sc->sc_strokes[index];
1345 
1346 	if (s->flags & ATSF_ZOMBIE) {
1347 		return;
1348 	}
1349 
1350 	if ((s->type == ATP_STROKE_TOUCH) &&
1351 	    (s->age > atp_stroke_maturity_threshold)) {
1352 		s->flags |= ATSF_ZOMBIE;
1353 
1354 		/* If no zombies exist, then prepare to reap zombies later. */
1355 		if ((sc->sc_state & ATP_ZOMBIES_EXIST) == 0) {
1356 			atp_setup_reap_time(sc, &s->ctime);
1357 			sc->sc_state |= ATP_ZOMBIES_EXIST;
1358 		}
1359 	} else {
1360 		/* Drop this stroke. */
1361 		memcpy(&sc->sc_strokes[index], &sc->sc_strokes[index + 1],
1362 		    (sc->sc_n_strokes - index - 1) * sizeof(atp_stroke));
1363 		sc->sc_n_strokes--;
1364 
1365 		/*
1366 		 * Reset the double-click-n-drag at the termination of
1367 		 * any slide stroke.
1368 		 */
1369 		sc->sc_state &= ~ATP_DOUBLE_TAP_DRAG;
1370 	}
1371 }
1372 
1373 static __inline boolean_t
1374 atp_stroke_has_small_movement(const atp_stroke *stroke)
1375 {
1376 	return ((abs(stroke->components[X].delta_mickeys) <=
1377 		atp_small_movement_threshold) &&
1378 	    (abs(stroke->components[Y].delta_mickeys) <=
1379 		atp_small_movement_threshold));
1380 }
1381 
1382 /*
1383  * Accumulate delta_mickeys into the component's 'pending' bucket; if
1384  * the aggregate exceeds the small_movement_threshold, then retain
1385  * delta_mickeys for later.
1386  */
1387 static __inline void
1388 atp_update_pending_mickeys(atp_stroke_component *component)
1389 {
1390 	component->pending += component->delta_mickeys;
1391 	if (abs(component->pending) <= atp_small_movement_threshold)
1392 		component->delta_mickeys = 0;
1393 	else {
1394 		/*
1395 		 * Penalise pending mickeys for having accumulated
1396 		 * over short deltas. This operation has the effect of
1397 		 * scaling down the cumulative contribution of short
1398 		 * movements.
1399 		 */
1400 		component->pending -= (component->delta_mickeys << 1);
1401 	}
1402 }
1403 
1404 
1405 static void
1406 atp_compute_smoothening_scale_ratio(atp_stroke *stroke, int *numerator,
1407     int *denominator)
1408 {
1409 	int   dxdt;
1410 	int   dydt;
1411 	u_int vel_squared; /* Square of the velocity vector's magnitude. */
1412 	u_int vel_squared_smooth;
1413 
1414 	/* Table holding (10 * sqrt(x)) for x between 1 and 256. */
1415 	static uint8_t sqrt_table[256] = {
1416 		10, 14, 17, 20, 22, 24, 26, 28,
1417 		30, 31, 33, 34, 36, 37, 38, 40,
1418 		41, 42, 43, 44, 45, 46, 47, 48,
1419 		50, 50, 51, 52, 53, 54, 55, 56,
1420 		57, 58, 59, 60, 60, 61, 62, 63,
1421 		64, 64, 65, 66, 67, 67, 68, 69,
1422 		70, 70, 71, 72, 72, 73, 74, 74,
1423 		75, 76, 76, 77, 78, 78, 79, 80,
1424 		80, 81, 81, 82, 83, 83, 84, 84,
1425 		85, 86, 86, 87, 87, 88, 88, 89,
1426 		90, 90, 91, 91, 92, 92, 93, 93,
1427 		94, 94, 95, 95, 96, 96, 97, 97,
1428 		98, 98, 99, 100, 100, 100, 101, 101,
1429 		102, 102, 103, 103, 104, 104, 105, 105,
1430 		106, 106, 107, 107, 108, 108, 109, 109,
1431 		110, 110, 110, 111, 111, 112, 112, 113,
1432 		113, 114, 114, 114, 115, 115, 116, 116,
1433 		117, 117, 117, 118, 118, 119, 119, 120,
1434 		120, 120, 121, 121, 122, 122, 122, 123,
1435 		123, 124, 124, 124, 125, 125, 126, 126,
1436 		126, 127, 127, 128, 128, 128, 129, 129,
1437 		130, 130, 130, 131, 131, 131, 132, 132,
1438 		133, 133, 133, 134, 134, 134, 135, 135,
1439 		136, 136, 136, 137, 137, 137, 138, 138,
1440 		138, 139, 139, 140, 140, 140, 141, 141,
1441 		141, 142, 142, 142, 143, 143, 143, 144,
1442 		144, 144, 145, 145, 145, 146, 146, 146,
1443 		147, 147, 147, 148, 148, 148, 149, 149,
1444 		150, 150, 150, 150, 151, 151, 151, 152,
1445 		152, 152, 153, 153, 153, 154, 154, 154,
1446 		155, 155, 155, 156, 156, 156, 157, 157,
1447 		157, 158, 158, 158, 159, 159, 159, 160
1448 	};
1449 	const u_int N = sizeof(sqrt_table) / sizeof(sqrt_table[0]);
1450 
1451 	dxdt = stroke->components[X].delta_mickeys;
1452 	dydt = stroke->components[Y].delta_mickeys;
1453 
1454 	*numerator = 0, *denominator = 0; /* default values. */
1455 
1456 	/* Compute a smoothened magnitude_squared of the stroke's velocity. */
1457 	vel_squared = dxdt * dxdt + dydt * dydt;
1458 	vel_squared_smooth = (3 * stroke->velocity_squared + vel_squared) >> 2;
1459 	stroke->velocity_squared = vel_squared_smooth; /* retained as history */
1460 	if ((vel_squared == 0) || (vel_squared_smooth == 0))
1461 		return; /* returning (numerator == 0) will imply zero movement*/
1462 
1463 	/*
1464 	 * In order to determine the overall movement scale factor,
1465 	 * we're actually interested in the effect of smoothening upon
1466 	 * the *magnitude* of velocity; i.e. we need to compute the
1467 	 * square-root of (vel_squared_smooth / vel_squared) in the
1468 	 * form of a numerator and denominator.
1469 	 */
1470 
1471 	/* Keep within the bounds of the square-root table. */
1472 	while ((vel_squared > N) || (vel_squared_smooth > N)) {
1473 		/* Dividing uniformly by 2 won't disturb the final ratio. */
1474 		vel_squared        >>= 1;
1475 		vel_squared_smooth >>= 1;
1476 	}
1477 
1478 	*numerator   = sqrt_table[vel_squared_smooth - 1];
1479 	*denominator = sqrt_table[vel_squared - 1];
1480 }
1481 
1482 /*
1483  * Compute a smoothened value for the stroke's movement from
1484  * delta_mickeys in the X and Y components.
1485  */
1486 static boolean_t
1487 atp_compute_stroke_movement(atp_stroke *stroke)
1488 {
1489 	int   num;              /* numerator of scale ratio */
1490 	int   denom;            /* denominator of scale ratio */
1491 
1492 	/*
1493 	 * Short movements are added first to the 'pending' bucket,
1494 	 * and then acted upon only when their aggregate exceeds a
1495 	 * threshold. This has the effect of filtering away movement
1496 	 * noise.
1497 	 */
1498 	if (atp_stroke_has_small_movement(stroke)) {
1499 		atp_update_pending_mickeys(&stroke->components[X]);
1500 		atp_update_pending_mickeys(&stroke->components[Y]);
1501 	} else {                /* large movement */
1502 		/* clear away any pending mickeys if there are large movements*/
1503 		stroke->components[X].pending = 0;
1504 		stroke->components[Y].pending = 0;
1505 	}
1506 
1507 	/* Get the scale ratio and smoothen movement. */
1508 	atp_compute_smoothening_scale_ratio(stroke, &num, &denom);
1509 	if ((num == 0) || (denom == 0)) {
1510 		stroke->components[X].movement = 0;
1511 		stroke->components[Y].movement = 0;
1512 		stroke->velocity_squared >>= 1; /* Erode velocity_squared. */
1513 	} else {
1514 		stroke->components[X].movement =
1515 			(stroke->components[X].delta_mickeys * num) / denom;
1516 		stroke->components[Y].movement =
1517 			(stroke->components[Y].delta_mickeys * num) / denom;
1518 
1519 		stroke->cum_movement +=
1520 			abs(stroke->components[X].movement) +
1521 			abs(stroke->components[Y].movement);
1522 	}
1523 
1524 	return ((stroke->components[X].movement != 0) ||
1525 	    (stroke->components[Y].movement != 0));
1526 }
1527 
1528 static __inline void
1529 atp_setup_reap_time(struct atp_softc *sc, struct timeval *tvp)
1530 {
1531 	struct timeval reap_window = {
1532 		ATP_ZOMBIE_STROKE_REAP_WINDOW / 1000000,
1533 		ATP_ZOMBIE_STROKE_REAP_WINDOW % 1000000
1534 	};
1535 
1536 	microtime(&sc->sc_reap_time);
1537 	timevaladd(&sc->sc_reap_time, &reap_window);
1538 
1539 	sc->sc_reap_ctime = *tvp; /* ctime to reap */
1540 }
1541 
1542 static void
1543 atp_reap_zombies(struct atp_softc *sc, u_int *n_reaped, u_int *reaped_xlocs)
1544 {
1545 	u_int       i;
1546 	atp_stroke *stroke;
1547 
1548 	*n_reaped = 0;
1549 	for (i = 0; i < sc->sc_n_strokes; i++) {
1550 		struct timeval  tdiff;
1551 
1552 		stroke = &sc->sc_strokes[i];
1553 
1554 		if ((stroke->flags & ATSF_ZOMBIE) == 0)
1555 			continue;
1556 
1557 		/* Compare this stroke's ctime with the ctime being reaped. */
1558 		if (timevalcmp(&stroke->ctime, &sc->sc_reap_ctime, >=)) {
1559 			tdiff = stroke->ctime;
1560 			timevalsub(&tdiff, &sc->sc_reap_ctime);
1561 		} else {
1562 			tdiff = sc->sc_reap_ctime;
1563 			timevalsub(&tdiff, &stroke->ctime);
1564 		}
1565 
1566 		if ((tdiff.tv_sec > (ATP_COINCIDENCE_THRESHOLD / 1000000)) ||
1567 		    ((tdiff.tv_sec == (ATP_COINCIDENCE_THRESHOLD / 1000000)) &&
1568 		     (tdiff.tv_usec > (ATP_COINCIDENCE_THRESHOLD % 1000000)))) {
1569 			continue; /* Skip non-siblings. */
1570 		}
1571 
1572 		/*
1573 		 * Reap this sibling zombie stroke.
1574 		 */
1575 
1576 		if (reaped_xlocs != NULL)
1577 			reaped_xlocs[*n_reaped] = stroke->components[X].loc;
1578 
1579 		/* Erase the stroke from the sc. */
1580 		memcpy(&stroke[i], &stroke[i + 1],
1581 		    (sc->sc_n_strokes - i - 1) * sizeof(atp_stroke));
1582 		sc->sc_n_strokes--;
1583 
1584 		*n_reaped += 1;
1585 		--i; /* Decr. i to keep it unchanged for the next iteration */
1586 	}
1587 
1588 	DPRINTFN(ATP_LLEVEL_INFO, "reaped %u zombies\n", *n_reaped);
1589 
1590 	/* There could still be zombies remaining in the system. */
1591 	for (i = 0; i < sc->sc_n_strokes; i++) {
1592 		stroke = &sc->sc_strokes[i];
1593 		if (stroke->flags & ATSF_ZOMBIE) {
1594 			DPRINTFN(ATP_LLEVEL_INFO, "zombies remain!\n");
1595 			atp_setup_reap_time(sc, &stroke->ctime);
1596 			return;
1597 		}
1598 	}
1599 
1600 	/* If we reach here, then no more zombies remain. */
1601 	sc->sc_state &= ~ATP_ZOMBIES_EXIST;
1602 }
1603 
1604 
1605 /* Device methods. */
1606 static device_probe_t  atp_probe;
1607 static device_attach_t atp_attach;
1608 static device_detach_t atp_detach;
1609 static usb_callback_t  atp_intr;
1610 
1611 static const struct usb_config atp_config[ATP_N_TRANSFER] = {
1612 	[ATP_INTR_DT] = {
1613 		.type      = UE_INTERRUPT,
1614 		.endpoint  = UE_ADDR_ANY,
1615 		.direction = UE_DIR_IN,
1616 		.flags = {
1617 			.pipe_bof = 1,
1618 			.short_xfer_ok = 1,
1619 		},
1620 		.bufsize   = 0, /* use wMaxPacketSize */
1621 		.callback  = &atp_intr,
1622 	},
1623 	[ATP_RESET] = {
1624 		.type      = UE_CONTROL,
1625 		.endpoint  = 0, /* Control pipe */
1626 		.direction = UE_DIR_ANY,
1627 		.bufsize = sizeof(struct usb_device_request) + MODE_LENGTH,
1628 		.callback  = &atp_reset_callback,
1629 		.interval = 0,  /* no pre-delay */
1630 	},
1631 };
1632 
1633 static int
1634 atp_probe(device_t self)
1635 {
1636 	struct usb_attach_arg *uaa = device_get_ivars(self);
1637 
1638 	if (uaa->usb_mode != USB_MODE_HOST)
1639 		return (ENXIO);
1640 
1641 	if ((uaa->info.bInterfaceClass != UICLASS_HID) ||
1642 	    (uaa->info.bInterfaceProtocol != UIPROTO_MOUSE))
1643 		return (ENXIO);
1644 
1645 	return (usbd_lookup_id_by_uaa(atp_devs, sizeof(atp_devs), uaa));
1646 }
1647 
1648 static int
1649 atp_attach(device_t dev)
1650 {
1651 	struct atp_softc      *sc = device_get_softc(dev);
1652 	struct usb_attach_arg *uaa = device_get_ivars(dev);
1653 	usb_error_t            err;
1654 
1655 	DPRINTFN(ATP_LLEVEL_INFO, "sc=%p\n", sc);
1656 
1657 	sc->sc_dev        = dev;
1658 	sc->sc_usb_device = uaa->device;
1659 
1660 	/*
1661 	 * By default the touchpad behaves like an HID device, sending
1662 	 * packets with reportID = 2. Such reports contain only
1663 	 * limited information--they encode movement deltas and button
1664 	 * events,--but do not include data from the pressure
1665 	 * sensors. The device input mode can be switched from HID
1666 	 * reports to raw sensor data using vendor-specific USB
1667 	 * control commands; but first the mode must be read.
1668 	 */
1669 	err = atp_req_get_report(sc->sc_usb_device, sc->sc_mode_bytes);
1670 	if (err != USB_ERR_NORMAL_COMPLETION) {
1671 		DPRINTF("failed to read device mode (%d)\n", err);
1672 		return (ENXIO);
1673 	}
1674 
1675 	if (atp_set_device_mode(dev, RAW_SENSOR_MODE) != 0) {
1676 		DPRINTF("failed to set mode to 'RAW_SENSOR' (%d)\n", err);
1677 		return (ENXIO);
1678 	}
1679 
1680 	mtx_init(&sc->sc_mutex, "atpmtx", NULL, MTX_DEF | MTX_RECURSE);
1681 
1682 	err = usbd_transfer_setup(uaa->device,
1683 	    &uaa->info.bIfaceIndex, sc->sc_xfer, atp_config,
1684 	    ATP_N_TRANSFER, sc, &sc->sc_mutex);
1685 
1686 	if (err) {
1687 		DPRINTF("error=%s\n", usbd_errstr(err));
1688 		goto detach;
1689 	}
1690 
1691 	if (usb_fifo_attach(sc->sc_usb_device, sc, &sc->sc_mutex,
1692 		&atp_fifo_methods, &sc->sc_fifo,
1693 		device_get_unit(dev), 0 - 1, uaa->info.bIfaceIndex,
1694 		UID_ROOT, GID_OPERATOR, 0644)) {
1695 		goto detach;
1696 	}
1697 
1698 	device_set_usb_desc(dev);
1699 
1700 	sc->sc_params           = &atp_dev_params[uaa->driver_info];
1701 
1702 	sc->sc_hw.buttons       = 3;
1703 	sc->sc_hw.iftype        = MOUSE_IF_USB;
1704 	sc->sc_hw.type          = MOUSE_PAD;
1705 	sc->sc_hw.model         = MOUSE_MODEL_GENERIC;
1706 	sc->sc_hw.hwid          = 0;
1707 	sc->sc_mode.protocol    = MOUSE_PROTO_MSC;
1708 	sc->sc_mode.rate        = -1;
1709 	sc->sc_mode.resolution  = MOUSE_RES_UNKNOWN;
1710 	sc->sc_mode.accelfactor = 0;
1711 	sc->sc_mode.level       = 0;
1712 	sc->sc_mode.packetsize  = MOUSE_MSC_PACKETSIZE;
1713 	sc->sc_mode.syncmask[0] = MOUSE_MSC_SYNCMASK;
1714 	sc->sc_mode.syncmask[1] = MOUSE_MSC_SYNC;
1715 
1716 	sc->sc_state            = 0;
1717 
1718 	sc->sc_left_margin  = atp_mickeys_scale_factor;
1719 	sc->sc_right_margin = (sc->sc_params->n_xsensors - 1) *
1720 		atp_mickeys_scale_factor;
1721 
1722 	return (0);
1723 
1724 detach:
1725 	atp_detach(dev);
1726 	return (ENOMEM);
1727 }
1728 
1729 static int
1730 atp_detach(device_t dev)
1731 {
1732 	struct atp_softc *sc;
1733 
1734 	sc = device_get_softc(dev);
1735 	if (sc->sc_state & ATP_ENABLED) {
1736 		mtx_lock(&sc->sc_mutex);
1737 		atp_disable(sc);
1738 		mtx_unlock(&sc->sc_mutex);
1739 	}
1740 
1741 	usb_fifo_detach(&sc->sc_fifo);
1742 
1743 	usbd_transfer_unsetup(sc->sc_xfer, ATP_N_TRANSFER);
1744 
1745 	mtx_destroy(&sc->sc_mutex);
1746 
1747 	return (0);
1748 }
1749 
1750 static void
1751 atp_intr(struct usb_xfer *xfer, usb_error_t error)
1752 {
1753 	struct atp_softc      *sc = usbd_xfer_softc(xfer);
1754 	int                    len;
1755 	struct usb_page_cache *pc;
1756 	uint8_t                status_bits;
1757 	atp_pspan  pspans_x[ATP_MAX_PSPANS_PER_AXIS];
1758 	atp_pspan  pspans_y[ATP_MAX_PSPANS_PER_AXIS];
1759 	u_int      n_xpspans = 0, n_ypspans = 0;
1760 	u_int      reaped_xlocs[ATP_MAX_STROKES];
1761 	u_int      tap_fingers = 0;
1762 
1763 	usbd_xfer_status(xfer, &len, NULL, NULL, NULL);
1764 
1765 	switch (USB_GET_STATE(xfer)) {
1766 	case USB_ST_TRANSFERRED:
1767 		if (len > sc->sc_params->data_len) {
1768 			DPRINTFN(ATP_LLEVEL_ERROR,
1769 			    "truncating large packet from %u to %u bytes\n",
1770 			    len, sc->sc_params->data_len);
1771 			len = sc->sc_params->data_len;
1772 		}
1773 		if (len < sc->sc_params->data_len)
1774 			goto tr_setup;
1775 
1776 		pc = usbd_xfer_get_frame(xfer, 0);
1777 		usbd_copy_out(pc, 0, sc->sensor_data, sc->sc_params->data_len);
1778 
1779 		/* Interpret sensor data */
1780 		atp_interpret_sensor_data(sc->sensor_data,
1781 		    sc->sc_params->n_xsensors, X, sc->cur_x,
1782 		    sc->sc_params->prot);
1783 		atp_interpret_sensor_data(sc->sensor_data,
1784 		    sc->sc_params->n_ysensors, Y,  sc->cur_y,
1785 		    sc->sc_params->prot);
1786 
1787 		/*
1788 		 * If this is the initial update (from an untouched
1789 		 * pad), we should set the base values for the sensor
1790 		 * data; deltas with respect to these base values can
1791 		 * be used as pressure readings subsequently.
1792 		 */
1793 		status_bits = sc->sensor_data[sc->sc_params->data_len - 1];
1794 		if ((sc->sc_params->prot == ATP_PROT_GEYSER3 &&
1795 		    (status_bits & ATP_STATUS_BASE_UPDATE)) ||
1796 		    !(sc->sc_state & ATP_VALID)) {
1797 			memcpy(sc->base_x, sc->cur_x,
1798 			    sc->sc_params->n_xsensors * sizeof(*(sc->base_x)));
1799 			memcpy(sc->base_y, sc->cur_y,
1800 			    sc->sc_params->n_ysensors * sizeof(*(sc->base_y)));
1801 			sc->sc_state |= ATP_VALID;
1802 			goto tr_setup;
1803 		}
1804 
1805 		/* Get pressure readings and detect p-spans for both axes. */
1806 		atp_get_pressures(sc->pressure_x, sc->cur_x, sc->base_x,
1807 		    sc->sc_params->n_xsensors);
1808 		atp_detect_pspans(sc->pressure_x, sc->sc_params->n_xsensors,
1809 		    ATP_MAX_PSPANS_PER_AXIS,
1810 		    pspans_x, &n_xpspans);
1811 		atp_get_pressures(sc->pressure_y, sc->cur_y, sc->base_y,
1812 		    sc->sc_params->n_ysensors);
1813 		atp_detect_pspans(sc->pressure_y, sc->sc_params->n_ysensors,
1814 		    ATP_MAX_PSPANS_PER_AXIS,
1815 		    pspans_y, &n_ypspans);
1816 
1817 		/* Update strokes with new pspans to detect movements. */
1818 		sc->sc_status.flags &= ~MOUSE_POSCHANGED;
1819 		if (atp_update_strokes(sc,
1820 			pspans_x, n_xpspans,
1821 			pspans_y, n_ypspans))
1822 			sc->sc_status.flags |= MOUSE_POSCHANGED;
1823 
1824 		/* Reap zombies if it is time. */
1825 		if (sc->sc_state & ATP_ZOMBIES_EXIST) {
1826 			struct timeval now;
1827 
1828 			getmicrotime(&now);
1829 			if (timevalcmp(&now, &sc->sc_reap_time, >=))
1830 				atp_reap_zombies(sc, &tap_fingers,
1831 				    reaped_xlocs);
1832 		}
1833 
1834 		sc->sc_status.flags &= ~MOUSE_STDBUTTONSCHANGED;
1835 		sc->sc_status.obutton = sc->sc_status.button;
1836 
1837 		/* Get the state of the physical buttton. */
1838 		sc->sc_status.button = (status_bits & ATP_STATUS_BUTTON) ?
1839 			MOUSE_BUTTON1DOWN : 0;
1840 		if (sc->sc_status.button != 0) {
1841 			/* Reset DOUBLE_TAP_N_DRAG if the button is pressed. */
1842 			sc->sc_state &= ~ATP_DOUBLE_TAP_DRAG;
1843 		} else if (sc->sc_state & ATP_DOUBLE_TAP_DRAG) {
1844 			/* Assume a button-press with DOUBLE_TAP_N_DRAG. */
1845 			sc->sc_status.button = MOUSE_BUTTON1DOWN;
1846 		}
1847 
1848 		sc->sc_status.flags |=
1849 			sc->sc_status.button ^ sc->sc_status.obutton;
1850 		if (sc->sc_status.flags & MOUSE_STDBUTTONSCHANGED) {
1851 			DPRINTFN(ATP_LLEVEL_INFO, "button %s\n",
1852 			    ((sc->sc_status.button & MOUSE_BUTTON1DOWN) ?
1853 				"pressed" : "released"));
1854 		} else if ((sc->sc_status.obutton == 0) &&
1855 		    (sc->sc_status.button == 0) &&
1856 		    (tap_fingers != 0)) {
1857 			/* Ignore single-finger taps at the edges. */
1858 			if ((tap_fingers == 1) &&
1859 			    ((reaped_xlocs[0] <= sc->sc_left_margin) ||
1860 				(reaped_xlocs[0] > sc->sc_right_margin))) {
1861 				tap_fingers = 0;
1862 			}
1863 			DPRINTFN(ATP_LLEVEL_INFO,
1864 			    "tap_fingers: %u\n", tap_fingers);
1865 		}
1866 
1867 		if (sc->sc_status.flags &
1868 		    (MOUSE_POSCHANGED | MOUSE_STDBUTTONSCHANGED)) {
1869 			int   dx, dy;
1870 			u_int n_movements;
1871 
1872 			dx = 0, dy = 0, n_movements = 0;
1873 			for (u_int i = 0; i < sc->sc_n_strokes; i++) {
1874 				atp_stroke *stroke = &sc->sc_strokes[i];
1875 
1876 				if ((stroke->components[X].movement) ||
1877 				    (stroke->components[Y].movement)) {
1878 					dx += stroke->components[X].movement;
1879 					dy += stroke->components[Y].movement;
1880 					n_movements++;
1881 				}
1882 			}
1883 			/*
1884 			 * Disregard movement if multiple
1885 			 * strokes record motion.
1886 			 */
1887 			if (n_movements != 1)
1888 				dx = 0, dy = 0;
1889 
1890 			sc->sc_status.dx += dx;
1891 			sc->sc_status.dy += dy;
1892 			atp_add_to_queue(sc, dx, -dy, sc->sc_status.button);
1893 		}
1894 
1895 		if (tap_fingers != 0) {
1896 			/* Add a pair of events (button-down and button-up). */
1897 			switch (tap_fingers) {
1898 			case 1: atp_add_to_queue(sc, 0, 0, MOUSE_BUTTON1DOWN);
1899 				break;
1900 			case 2: atp_add_to_queue(sc, 0, 0, MOUSE_BUTTON2DOWN);
1901 				break;
1902 			case 3: atp_add_to_queue(sc, 0, 0, MOUSE_BUTTON3DOWN);
1903 				break;
1904 			default: break;/* handle taps of only up to 3 fingers */
1905 			}
1906 			atp_add_to_queue(sc, 0, 0, 0); /* button release */
1907 		}
1908 
1909 		/*
1910 		 * The device continues to trigger interrupts at a
1911 		 * fast rate even after touchpad activity has
1912 		 * stopped. Upon detecting that the device has
1913 		 * remained idle beyond a threshold, we reinitialize
1914 		 * it to silence the interrupts.
1915 		 */
1916 		if ((sc->sc_status.flags  == 0) &&
1917 		    (sc->sc_n_strokes     == 0) &&
1918 		    (sc->sc_status.button == 0)) {
1919 			sc->sc_idlecount++;
1920 			if (sc->sc_idlecount >= ATP_IDLENESS_THRESHOLD) {
1921 				DPRINTFN(ATP_LLEVEL_INFO, "idle\n");
1922 
1923 				/*
1924 				 * Use the last frame before we go idle for
1925 				 * calibration on pads which do not send
1926 				 * calibration frames.
1927 				 */
1928 				if (sc->sc_params->prot < ATP_PROT_GEYSER3) {
1929 					memcpy(sc->base_x, sc->cur_x,
1930 					    sc->sc_params->n_xsensors *
1931 					    sizeof(*(sc->base_x)));
1932 					memcpy(sc->base_y, sc->cur_y,
1933 					    sc->sc_params->n_ysensors *
1934 					    sizeof(*(sc->base_y)));
1935 				}
1936 
1937 				sc->sc_idlecount = 0;
1938 				usbd_transfer_start(sc->sc_xfer[ATP_RESET]);
1939 			}
1940 		} else {
1941 			sc->sc_idlecount = 0;
1942 		}
1943 
1944 	case USB_ST_SETUP:
1945 	tr_setup:
1946 		/* check if we can put more data into the FIFO */
1947 		if (usb_fifo_put_bytes_max(
1948 			    sc->sc_fifo.fp[USB_FIFO_RX]) != 0) {
1949 			usbd_xfer_set_frame_len(xfer, 0,
1950 			    sc->sc_params->data_len);
1951 			usbd_transfer_submit(xfer);
1952 		}
1953 		break;
1954 
1955 	default:                        /* Error */
1956 		if (error != USB_ERR_CANCELLED) {
1957 			/* try clear stall first */
1958 			usbd_xfer_set_stall(xfer);
1959 			goto tr_setup;
1960 		}
1961 		break;
1962 	}
1963 
1964 	return;
1965 }
1966 
1967 static void
1968 atp_add_to_queue(struct atp_softc *sc, int dx, int dy, uint32_t buttons_in)
1969 {
1970 	uint32_t buttons_out;
1971 	uint8_t  buf[8];
1972 
1973 	dx = imin(dx,  254); dx = imax(dx, -256);
1974 	dy = imin(dy,  254); dy = imax(dy, -256);
1975 
1976 	buttons_out = MOUSE_MSC_BUTTONS;
1977 	if (buttons_in & MOUSE_BUTTON1DOWN)
1978 		buttons_out &= ~MOUSE_MSC_BUTTON1UP;
1979 	else if (buttons_in & MOUSE_BUTTON2DOWN)
1980 		buttons_out &= ~MOUSE_MSC_BUTTON2UP;
1981 	else if (buttons_in & MOUSE_BUTTON3DOWN)
1982 		buttons_out &= ~MOUSE_MSC_BUTTON3UP;
1983 
1984 	DPRINTFN(ATP_LLEVEL_INFO, "dx=%d, dy=%d, buttons=%x\n",
1985 	    dx, dy, buttons_out);
1986 
1987 	/* Encode the mouse data in standard format; refer to mouse(4) */
1988 	buf[0] = sc->sc_mode.syncmask[1];
1989 	buf[0] |= buttons_out;
1990 	buf[1] = dx >> 1;
1991 	buf[2] = dy >> 1;
1992 	buf[3] = dx - (dx >> 1);
1993 	buf[4] = dy - (dy >> 1);
1994 	/* Encode extra bytes for level 1 */
1995 	if (sc->sc_mode.level == 1) {
1996 		buf[5] = 0;                    /* dz */
1997 		buf[6] = 0;                    /* dz - (dz / 2) */
1998 		buf[7] = MOUSE_SYS_EXTBUTTONS; /* Extra buttons all up. */
1999 	}
2000 
2001 	usb_fifo_put_data_linear(sc->sc_fifo.fp[USB_FIFO_RX], buf,
2002 	    sc->sc_mode.packetsize, 1);
2003 }
2004 
2005 static void
2006 atp_reset_buf(struct atp_softc *sc)
2007 {
2008 	/* reset read queue */
2009 	usb_fifo_reset(sc->sc_fifo.fp[USB_FIFO_RX]);
2010 }
2011 
2012 static void
2013 atp_start_read(struct usb_fifo *fifo)
2014 {
2015 	struct atp_softc *sc = usb_fifo_softc(fifo);
2016 	int rate;
2017 
2018 	/* Check if we should override the default polling interval */
2019 	rate = sc->sc_pollrate;
2020 	/* Range check rate */
2021 	if (rate > 1000)
2022 		rate = 1000;
2023 	/* Check for set rate */
2024 	if ((rate > 0) && (sc->sc_xfer[ATP_INTR_DT] != NULL)) {
2025 		/* Stop current transfer, if any */
2026 		usbd_transfer_stop(sc->sc_xfer[ATP_INTR_DT]);
2027 		/* Set new interval */
2028 		usbd_xfer_set_interval(sc->sc_xfer[ATP_INTR_DT], 1000 / rate);
2029 		/* Only set pollrate once */
2030 		sc->sc_pollrate = 0;
2031 	}
2032 
2033 	usbd_transfer_start(sc->sc_xfer[ATP_INTR_DT]);
2034 }
2035 
2036 static void
2037 atp_stop_read(struct usb_fifo *fifo)
2038 {
2039 	struct atp_softc *sc = usb_fifo_softc(fifo);
2040 
2041 	usbd_transfer_stop(sc->sc_xfer[ATP_INTR_DT]);
2042 }
2043 
2044 
2045 static int
2046 atp_open(struct usb_fifo *fifo, int fflags)
2047 {
2048 	DPRINTFN(ATP_LLEVEL_INFO, "\n");
2049 
2050 	if (fflags & FREAD) {
2051 		struct atp_softc *sc = usb_fifo_softc(fifo);
2052 		int rc;
2053 
2054 		if (sc->sc_state & ATP_ENABLED)
2055 			return (EBUSY);
2056 
2057 		if (usb_fifo_alloc_buffer(fifo,
2058 			ATP_FIFO_BUF_SIZE, ATP_FIFO_QUEUE_MAXLEN)) {
2059 			return (ENOMEM);
2060 		}
2061 
2062 		rc = atp_enable(sc);
2063 		if (rc != 0) {
2064 			usb_fifo_free_buffer(fifo);
2065 			return (rc);
2066 		}
2067 	}
2068 
2069 	return (0);
2070 }
2071 
2072 static void
2073 atp_close(struct usb_fifo *fifo, int fflags)
2074 {
2075 	if (fflags & FREAD) {
2076 		struct atp_softc *sc = usb_fifo_softc(fifo);
2077 
2078 		atp_disable(sc);
2079 		usb_fifo_free_buffer(fifo);
2080 	}
2081 }
2082 
2083 int
2084 atp_ioctl(struct usb_fifo *fifo, u_long cmd, void *addr, int fflags)
2085 {
2086 	struct atp_softc *sc = usb_fifo_softc(fifo);
2087 	mousemode_t mode;
2088 	int error = 0;
2089 
2090 	mtx_lock(&sc->sc_mutex);
2091 
2092 	switch(cmd) {
2093 	case MOUSE_GETHWINFO:
2094 		*(mousehw_t *)addr = sc->sc_hw;
2095 		break;
2096 	case MOUSE_GETMODE:
2097 		*(mousemode_t *)addr = sc->sc_mode;
2098 		break;
2099 	case MOUSE_SETMODE:
2100 		mode = *(mousemode_t *)addr;
2101 
2102 		if (mode.level == -1)
2103 			/* Don't change the current setting */
2104 			;
2105 		else if ((mode.level < 0) || (mode.level > 1)) {
2106 			error = EINVAL;
2107 			goto done;
2108 		}
2109 		sc->sc_mode.level = mode.level;
2110 		sc->sc_pollrate   = mode.rate;
2111 		sc->sc_hw.buttons = 3;
2112 
2113 		if (sc->sc_mode.level == 0) {
2114 			sc->sc_mode.protocol = MOUSE_PROTO_MSC;
2115 			sc->sc_mode.packetsize = MOUSE_MSC_PACKETSIZE;
2116 			sc->sc_mode.syncmask[0] = MOUSE_MSC_SYNCMASK;
2117 			sc->sc_mode.syncmask[1] = MOUSE_MSC_SYNC;
2118 		} else if (sc->sc_mode.level == 1) {
2119 			sc->sc_mode.protocol = MOUSE_PROTO_SYSMOUSE;
2120 			sc->sc_mode.packetsize = MOUSE_SYS_PACKETSIZE;
2121 			sc->sc_mode.syncmask[0] = MOUSE_SYS_SYNCMASK;
2122 			sc->sc_mode.syncmask[1] = MOUSE_SYS_SYNC;
2123 		}
2124 		atp_reset_buf(sc);
2125 		break;
2126 	case MOUSE_GETLEVEL:
2127 		*(int *)addr = sc->sc_mode.level;
2128 		break;
2129 	case MOUSE_SETLEVEL:
2130 		if (*(int *)addr < 0 || *(int *)addr > 1) {
2131 			error = EINVAL;
2132 			goto done;
2133 		}
2134 		sc->sc_mode.level = *(int *)addr;
2135 		sc->sc_hw.buttons = 3;
2136 
2137 		if (sc->sc_mode.level == 0) {
2138 			sc->sc_mode.protocol = MOUSE_PROTO_MSC;
2139 			sc->sc_mode.packetsize = MOUSE_MSC_PACKETSIZE;
2140 			sc->sc_mode.syncmask[0] = MOUSE_MSC_SYNCMASK;
2141 			sc->sc_mode.syncmask[1] = MOUSE_MSC_SYNC;
2142 		} else if (sc->sc_mode.level == 1) {
2143 			sc->sc_mode.protocol = MOUSE_PROTO_SYSMOUSE;
2144 			sc->sc_mode.packetsize = MOUSE_SYS_PACKETSIZE;
2145 			sc->sc_mode.syncmask[0] = MOUSE_SYS_SYNCMASK;
2146 			sc->sc_mode.syncmask[1] = MOUSE_SYS_SYNC;
2147 		}
2148 		atp_reset_buf(sc);
2149 		break;
2150 	case MOUSE_GETSTATUS: {
2151 		mousestatus_t *status = (mousestatus_t *)addr;
2152 
2153 		*status = sc->sc_status;
2154 		sc->sc_status.obutton = sc->sc_status.button;
2155 		sc->sc_status.button  = 0;
2156 		sc->sc_status.dx = 0;
2157 		sc->sc_status.dy = 0;
2158 		sc->sc_status.dz = 0;
2159 
2160 		if (status->dx || status->dy || status->dz)
2161 			status->flags |= MOUSE_POSCHANGED;
2162 		if (status->button != status->obutton)
2163 			status->flags |= MOUSE_BUTTONSCHANGED;
2164 		break;
2165 	}
2166 	default:
2167 		error = ENOTTY;
2168 	}
2169 
2170 done:
2171 	mtx_unlock(&sc->sc_mutex);
2172 	return (error);
2173 }
2174 
2175 static int
2176 atp_sysctl_scale_factor_handler(SYSCTL_HANDLER_ARGS)
2177 {
2178 	int error;
2179 	u_int tmp;
2180 	u_int prev_mickeys_scale_factor;
2181 
2182 	prev_mickeys_scale_factor = atp_mickeys_scale_factor;
2183 
2184 	tmp = atp_mickeys_scale_factor;
2185 	error = sysctl_handle_int(oidp, &tmp, 0, req);
2186 	if (error != 0 || req->newptr == NULL)
2187 		return (error);
2188 
2189 	if (tmp == prev_mickeys_scale_factor)
2190 		return (0);     /* no change */
2191 
2192 	atp_mickeys_scale_factor = tmp;
2193 	DPRINTFN(ATP_LLEVEL_INFO, "%s: resetting mickeys_scale_factor to %u\n",
2194 	    ATP_DRIVER_NAME, tmp);
2195 
2196 	/* Update dependent thresholds. */
2197 	if (atp_small_movement_threshold == (prev_mickeys_scale_factor >> 3))
2198 		atp_small_movement_threshold = atp_mickeys_scale_factor >> 3;
2199 	if (atp_max_delta_mickeys == ((3 * prev_mickeys_scale_factor) >> 1))
2200 		atp_max_delta_mickeys = ((3 * atp_mickeys_scale_factor) >>1);
2201 	if (atp_slide_min_movement == (prev_mickeys_scale_factor >> 3))
2202 		atp_slide_min_movement = atp_mickeys_scale_factor >> 3;
2203 
2204 	return (0);
2205 }
2206 
2207 static device_method_t atp_methods[] = {
2208 	/* Device interface */
2209 	DEVMETHOD(device_probe,  atp_probe),
2210 	DEVMETHOD(device_attach, atp_attach),
2211 	DEVMETHOD(device_detach, atp_detach),
2212 	{ 0, 0 }
2213 };
2214 
2215 static driver_t atp_driver = {
2216 	ATP_DRIVER_NAME,
2217 	atp_methods,
2218 	sizeof(struct atp_softc)
2219 };
2220 
2221 static devclass_t atp_devclass;
2222 
2223 DRIVER_MODULE(atp, uhub, atp_driver, atp_devclass, NULL, 0);
2224 MODULE_DEPEND(atp, usb, 1, 1, 1);
2225