1 1.31 riastrad /* $NetBSD: uatp.c,v 1.31 2022/03/28 12:45:04 riastradh Exp $ */ 2 1.1 riastrad 3 1.1 riastrad /*- 4 1.7 riastrad * Copyright (c) 2011-2014 The NetBSD Foundation, Inc. 5 1.1 riastrad * All rights reserved. 6 1.1 riastrad * 7 1.7 riastrad * This code is derived from software contributed to The NetBSD Foundation 8 1.7 riastrad * by Taylor R. Campbell. 9 1.7 riastrad * 10 1.1 riastrad * Redistribution and use in source and binary forms, with or without 11 1.1 riastrad * modification, are permitted provided that the following conditions 12 1.1 riastrad * are met: 13 1.1 riastrad * 1. Redistributions of source code must retain the above copyright 14 1.1 riastrad * notice, this list of conditions and the following disclaimer. 15 1.1 riastrad * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 riastrad * notice, this list of conditions and the following disclaimer in the 17 1.1 riastrad * documentation and/or other materials provided with the distribution. 18 1.1 riastrad * 19 1.7 riastrad * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.7 riastrad * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.7 riastrad * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.7 riastrad * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.7 riastrad * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.7 riastrad * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.7 riastrad * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.7 riastrad * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.7 riastrad * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.7 riastrad * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.7 riastrad * POSSIBILITY OF SUCH DAMAGE. 30 1.1 riastrad */ 31 1.1 riastrad 32 1.1 riastrad /* 33 1.1 riastrad * uatp(4) - USB Apple Trackpad 34 1.1 riastrad * 35 1.1 riastrad * The uatp driver talks the protocol of the USB trackpads found in 36 1.1 riastrad * Apple laptops since 2005, including PowerBooks, iBooks, MacBooks, 37 1.1 riastrad * and MacBook Pros. Some of these also present generic USB HID mice 38 1.1 riastrad * on another USB report id, which the ums(4) driver can handle, but 39 1.1 riastrad * Apple's protocol gives more detailed sensor data that lets us detect 40 1.1 riastrad * multiple fingers to emulate multi-button mice and scroll wheels. 41 1.1 riastrad */ 42 1.12 skrll 43 1.1 riastrad /* 44 1.1 riastrad * Protocol 45 1.1 riastrad * 46 1.1 riastrad * The device has a set of horizontal sensors, each being a column at a 47 1.1 riastrad * particular position on the x axis that tells you whether there is 48 1.1 riastrad * pressure anywhere on that column, and vertical sensors, each being a 49 1.1 riastrad * row at a particular position on the y axis that tells you whether 50 1.1 riastrad * there is pressure anywhere on that row. 51 1.1 riastrad * 52 1.1 riastrad * Whenever the device senses anything, it emits a readout of all of 53 1.1 riastrad * the sensors, in some model-dependent order. (For the order, see 54 1.1 riastrad * read_sample_1 and read_sample_2.) Each sensor datum is an unsigned 55 1.1 riastrad * eight-bit quantity representing some measure of pressure. (Of 56 1.1 riastrad * course, it really measures capacitance, not pressure, but we'll call 57 1.1 riastrad * it `pressure' here.) 58 1.1 riastrad */ 59 1.1 riastrad 60 1.1 riastrad /* 61 1.1 riastrad * Interpretation 62 1.1 riastrad * 63 1.1 riastrad * To interpret the finger's position on the trackpad, the driver 64 1.1 riastrad * computes a weighted average over all possible positions, weighted by 65 1.1 riastrad * the pressure at that position. The weighted average is computed in 66 1.1 riastrad * the dimensions of the screen, rather than the trackpad, in order to 67 1.1 riastrad * admit a finer resolution of positions than the trackpad grid. 68 1.1 riastrad * 69 1.1 riastrad * To update the finger's position smoothly on the trackpad, the driver 70 1.1 riastrad * computes a weighted average of the old raw position, the old 71 1.1 riastrad * smoothed position, and the new smoothed position. The weights are 72 1.1 riastrad * given by the old_raw_weight, old_smoothed_weight, and new_raw_weight 73 1.1 riastrad * sysctl knobs. 74 1.1 riastrad * 75 1.1 riastrad * Finally, to move the cursor, the driver takes the difference between 76 1.1 riastrad * the old and new positions and accelerates it according to some 77 1.1 riastrad * heuristic knobs that need to be reworked. 78 1.1 riastrad * 79 1.1 riastrad * Finally, there are some bells & whistles to detect tapping and to 80 1.1 riastrad * emulate a three-button mouse by leaving two or three fingers on the 81 1.1 riastrad * trackpad while pressing the button. 82 1.1 riastrad */ 83 1.1 riastrad 84 1.1 riastrad /* 85 1.1 riastrad * Future work 86 1.1 riastrad * 87 1.1 riastrad * With the raw sensor data available, we could implement fancier bells 88 1.1 riastrad * & whistles too, such as pinch-to-zoom. However, wsmouse supports 89 1.1 riastrad * only four-dimensional mice with buttons, and we already use two 90 1.1 riastrad * dimensions for mousing and two dimensions for scrolling, so there's 91 1.1 riastrad * no straightforward way to report zooming and other gestures to the 92 1.1 riastrad * operating system. Probably a better way to do this would be just to 93 1.1 riastrad * attach uhid(4) instead of uatp(4) and to read the raw sensors data 94 1.1 riastrad * yourself -- but that requires hairy mode switching for recent models 95 1.1 riastrad * (see geyser34_enable_raw_mode). 96 1.1 riastrad * 97 1.1 riastrad * XXX Rework the acceleration knobs. 98 1.1 riastrad * XXX Implement edge scrolling. 99 1.1 riastrad * XXX Fix sysctl setup; preserve knobs across suspend/resume. 100 1.1 riastrad * (uatp0 detaches and reattaches across suspend/resume, so as 101 1.1 riastrad * written, the sysctl tree is torn down and rebuilt, losing any 102 1.1 riastrad * state the user may have set.) 103 1.1 riastrad * XXX Refactor motion state so I can understand it again. 104 1.1 riastrad * Should make a struct uatp_motion for all that state. 105 1.1 riastrad * XXX Add hooks for ignoring trackpad input while typing. 106 1.1 riastrad */ 107 1.12 skrll 108 1.1 riastrad /* 109 1.1 riastrad * Classifying devices 110 1.1 riastrad * 111 1.1 riastrad * I have only one MacBook to test this driver, but the driver should 112 1.1 riastrad * be applicable to almost every Apple laptop made since the beginning 113 1.1 riastrad * of 2005, so the driver reports lots of debugging output to help to 114 1.1 riastrad * classify devices. Boot with `boot -v' (verbose) and check the 115 1.1 riastrad * output of `dmesg | grep uatp' to answer the following questions: 116 1.1 riastrad * 117 1.1 riastrad * - What devices (vendor, product, class, subclass, proto, USB HID 118 1.1 riastrad * report dump) fail to attach when you think they should work? 119 1.1 riastrad * (vendor not apple, class not hid, proto not mouse) 120 1.1 riastrad * 121 1.1 riastrad * - What devices have an unknown product id? 122 1.1 riastrad * `unknown vendor/product id' 123 1.1 riastrad * 124 1.1 riastrad * - What devices have the wrong screen-to-trackpad ratios? 125 1.1 riastrad * `... x sensors, scaled by ... for ... points on screen' 126 1.1 riastrad * `... y sensors, scaled by ... for ... points on screen' 127 1.1 riastrad * You can tweak hw.uatp0.x_ratio and hw.uatp0.y_ratio to adjust 128 1.1 riastrad * this, up to a maximum of 384 for each value. 129 1.1 riastrad * 130 1.1 riastrad * - What devices have the wrong input size? 131 1.1 riastrad * `expected input size ... but got ... for Apple trackpad' 132 1.1 riastrad * 133 1.1 riastrad * - What devices give wrong-sized packets? 134 1.1 riastrad * `discarding ...-byte input' 135 1.1 riastrad * 136 1.1 riastrad * - What devices split packets in chunks? 137 1.1 riastrad * `partial packet: ... bytes' 138 1.1 riastrad * 139 1.1 riastrad * - What devices develop large sensor readouts? 140 1.1 riastrad * `large sensor readout: ...' 141 1.1 riastrad * 142 1.1 riastrad * - What devices have the wrong number of sensors? Are there parts of 143 1.1 riastrad * your trackpad that the system doesn't seem to notice? You can 144 1.1 riastrad * tweak hw.uatp0.x_sensors and hw.uatp0.y_sensors, up to a maximum 145 1.1 riastrad * of 32 for each value. 146 1.1 riastrad */ 147 1.12 skrll 148 1.1 riastrad #include <sys/cdefs.h> 149 1.31 riastrad __KERNEL_RCSID(0, "$NetBSD: uatp.c,v 1.31 2022/03/28 12:45:04 riastradh Exp $"); 150 1.13 skrll 151 1.13 skrll #ifdef _KERNEL_OPT 152 1.13 skrll #include "opt_usb.h" 153 1.13 skrll #endif 154 1.1 riastrad 155 1.6 riastrad #include <sys/types.h> 156 1.6 riastrad #include <sys/param.h> 157 1.1 riastrad #include <sys/atomic.h> 158 1.1 riastrad #include <sys/device.h> 159 1.1 riastrad #include <sys/errno.h> 160 1.1 riastrad #include <sys/ioctl.h> 161 1.6 riastrad #include <sys/kernel.h> 162 1.9 riastrad #include <sys/module.h> 163 1.1 riastrad #include <sys/sysctl.h> 164 1.1 riastrad #include <sys/systm.h> 165 1.1 riastrad #include <sys/time.h> 166 1.1 riastrad 167 1.1 riastrad /* Order is important here...sigh... */ 168 1.1 riastrad #include <dev/usb/usb.h> 169 1.1 riastrad #include <dev/usb/usbdi.h> 170 1.1 riastrad #include <dev/usb/usbdi_util.h> 171 1.1 riastrad #include <dev/usb/usbdevs.h> 172 1.1 riastrad #include <dev/usb/uhidev.h> 173 1.1 riastrad #include <dev/usb/usbhid.h> 174 1.15 bouyer #include <dev/hid/hid.h> 175 1.1 riastrad 176 1.1 riastrad #include <dev/wscons/wsconsio.h> 177 1.1 riastrad #include <dev/wscons/wsmousevar.h> 178 1.1 riastrad 179 1.1 riastrad #define CHECK(condition, fail) do { \ 180 1.1 riastrad if (! (condition)) { \ 181 1.1 riastrad aprint_error_dev(uatp_dev(sc), "%s: check failed: %s\n",\ 182 1.1 riastrad __func__, #condition); \ 183 1.1 riastrad fail; \ 184 1.1 riastrad } \ 185 1.1 riastrad } while (0) 186 1.12 skrll 187 1.23 riastrad #define UATP_DEBUG_ATTACH __BIT(0) 188 1.23 riastrad #define UATP_DEBUG_MISC __BIT(1) 189 1.23 riastrad #define UATP_DEBUG_WSMOUSE __BIT(2) 190 1.23 riastrad #define UATP_DEBUG_IOCTL __BIT(3) 191 1.23 riastrad #define UATP_DEBUG_RESET __BIT(4) 192 1.23 riastrad #define UATP_DEBUG_INTR __BIT(5) 193 1.23 riastrad #define UATP_DEBUG_PARSE __BIT(6) 194 1.23 riastrad #define UATP_DEBUG_TAP __BIT(7) 195 1.23 riastrad #define UATP_DEBUG_EMUL_BUTTON __BIT(8) 196 1.23 riastrad #define UATP_DEBUG_ACCUMULATE __BIT(9) 197 1.23 riastrad #define UATP_DEBUG_STATUS __BIT(10) 198 1.23 riastrad #define UATP_DEBUG_SPURINTR __BIT(11) 199 1.23 riastrad #define UATP_DEBUG_MOVE __BIT(12) 200 1.23 riastrad #define UATP_DEBUG_ACCEL __BIT(13) 201 1.23 riastrad #define UATP_DEBUG_TRACK_DIST __BIT(14) 202 1.23 riastrad #define UATP_DEBUG_PALM __BIT(15) 203 1.1 riastrad 204 1.22 riastrad /* 205 1.22 riastrad * Unconditionally enable the debug output so you don't have to 206 1.22 riastrad * recompile the kernel to diagnose it. This is not a high-throughput 207 1.22 riastrad * NIC driver or anything that will be hurt by a few conditionals. 208 1.22 riastrad */ 209 1.22 riastrad #define UATP_DEBUG 1 210 1.22 riastrad 211 1.1 riastrad #if UATP_DEBUG 212 1.1 riastrad # define DPRINTF(sc, flags, format) do { \ 213 1.1 riastrad if ((flags) & (sc)->sc_debug_flags) { \ 214 1.1 riastrad printf("%s: %s: ", device_xname(uatp_dev(sc)), __func__); \ 215 1.1 riastrad printf format; \ 216 1.1 riastrad } \ 217 1.1 riastrad } while (0) 218 1.1 riastrad #else 219 1.1 riastrad # define DPRINTF(sc, flags, format) do {} while (0) 220 1.1 riastrad #endif 221 1.1 riastrad 222 1.1 riastrad /* Maximum number of bytes in an incoming packet of sensor data. */ 223 1.1 riastrad #define UATP_MAX_INPUT_SIZE 81 224 1.1 riastrad 225 1.1 riastrad /* Maximum number of sensors in each dimension. */ 226 1.1 riastrad #define UATP_MAX_X_SENSORS 32 227 1.1 riastrad #define UATP_MAX_Y_SENSORS 32 228 1.1 riastrad #define UATP_MAX_SENSORS 32 229 1.1 riastrad #define UATP_SENSORS (UATP_MAX_X_SENSORS + UATP_MAX_Y_SENSORS) 230 1.1 riastrad 231 1.1 riastrad /* Maximum accumulated sensor value. */ 232 1.1 riastrad #define UATP_MAX_ACC 0xff 233 1.1 riastrad 234 1.1 riastrad /* Maximum screen dimension to sensor dimension ratios. */ 235 1.1 riastrad #define UATP_MAX_X_RATIO 0x180 236 1.1 riastrad #define UATP_MAX_Y_RATIO 0x180 237 1.1 riastrad #define UATP_MAX_RATIO 0x180 238 1.1 riastrad 239 1.1 riastrad /* Maximum weight for positions in motion calculation. */ 240 1.1 riastrad #define UATP_MAX_WEIGHT 0x7f 241 1.1 riastrad 242 1.1 riastrad /* Maximum possible trackpad position in a single dimension. */ 243 1.1 riastrad #define UATP_MAX_POSITION (UATP_MAX_SENSORS * UATP_MAX_RATIO) 244 1.1 riastrad 245 1.1 riastrad /* Bounds on acceleration. */ 246 1.1 riastrad #define UATP_MAX_MOTION_MULTIPLIER 16 247 1.1 riastrad 248 1.1 riastrad /* Status bits transmitted in the last byte of an input packet. */ 249 1.23 riastrad #define UATP_STATUS_BUTTON __BIT(0) /* Button pressed */ 250 1.23 riastrad #define UATP_STATUS_BASE __BIT(2) /* Base sensor data */ 251 1.23 riastrad #define UATP_STATUS_POST_RESET __BIT(4) /* Post-reset */ 252 1.12 skrll 253 1.1 riastrad /* Forward declarations */ 254 1.1 riastrad 255 1.1 riastrad struct uatp_softc; /* Device driver state. */ 256 1.1 riastrad struct uatp_descriptor; /* Descriptor for a particular model. */ 257 1.1 riastrad struct uatp_parameters; /* Parameters common to a set of models. */ 258 1.1 riastrad struct uatp_knobs; /* User-settable configuration knobs. */ 259 1.1 riastrad enum uatp_tap_state { 260 1.1 riastrad TAP_STATE_INITIAL, 261 1.1 riastrad TAP_STATE_TAPPING, 262 1.1 riastrad TAP_STATE_TAPPED, 263 1.1 riastrad TAP_STATE_DOUBLE_TAPPING, 264 1.1 riastrad TAP_STATE_DRAGGING_DOWN, 265 1.1 riastrad TAP_STATE_DRAGGING_UP, 266 1.1 riastrad TAP_STATE_TAPPING_IN_DRAG, 267 1.1 riastrad }; 268 1.1 riastrad 269 1.1 riastrad static const struct uatp_descriptor *find_uatp_descriptor 270 1.1 riastrad (const struct uhidev_attach_arg *); 271 1.1 riastrad static device_t uatp_dev(const struct uatp_softc *); 272 1.1 riastrad static uint8_t *uatp_x_sample(struct uatp_softc *); 273 1.1 riastrad static uint8_t *uatp_y_sample(struct uatp_softc *); 274 1.1 riastrad static int *uatp_x_acc(struct uatp_softc *); 275 1.1 riastrad static int *uatp_y_acc(struct uatp_softc *); 276 1.1 riastrad static void uatp_clear_position(struct uatp_softc *); 277 1.1 riastrad static unsigned int uatp_x_sensors(const struct uatp_softc *); 278 1.1 riastrad static unsigned int uatp_y_sensors(const struct uatp_softc *); 279 1.1 riastrad static unsigned int uatp_x_ratio(const struct uatp_softc *); 280 1.1 riastrad static unsigned int uatp_y_ratio(const struct uatp_softc *); 281 1.1 riastrad static unsigned int uatp_old_raw_weight(const struct uatp_softc *); 282 1.1 riastrad static unsigned int uatp_old_smoothed_weight(const struct uatp_softc *); 283 1.1 riastrad static unsigned int uatp_new_raw_weight(const struct uatp_softc *); 284 1.1 riastrad static int scale_motion(const struct uatp_softc *, int, int *, 285 1.1 riastrad const unsigned int *, const unsigned int *); 286 1.1 riastrad static int uatp_scale_motion(const struct uatp_softc *, int, int *); 287 1.1 riastrad static int uatp_scale_fast_motion(const struct uatp_softc *, int, int *); 288 1.1 riastrad static int uatp_match(device_t, cfdata_t, void *); 289 1.1 riastrad static void uatp_attach(device_t, device_t, void *); 290 1.1 riastrad static void uatp_setup_sysctl(struct uatp_softc *); 291 1.1 riastrad static bool uatp_setup_sysctl_knob(struct uatp_softc *, int *, const char *, 292 1.1 riastrad const char *); 293 1.1 riastrad static void uatp_childdet(device_t, device_t); 294 1.1 riastrad static int uatp_detach(device_t, int); 295 1.1 riastrad static int uatp_activate(device_t, enum devact); 296 1.1 riastrad static int uatp_enable(void *); 297 1.1 riastrad static void uatp_disable(void *); 298 1.1 riastrad static int uatp_ioctl(void *, unsigned long, void *, int, struct lwp *); 299 1.1 riastrad static void geyser34_enable_raw_mode(struct uatp_softc *); 300 1.1 riastrad static void geyser34_initialize(struct uatp_softc *); 301 1.30 riastrad static void geyser34_finalize(struct uatp_softc *); 302 1.1 riastrad static void geyser34_deferred_reset(struct uatp_softc *); 303 1.8 riastrad static void geyser34_reset_task(void *); 304 1.29 riastrad static void uatp_intr(void *, void *, unsigned int); 305 1.1 riastrad static bool base_sample_softc_flag(const struct uatp_softc *, const uint8_t *); 306 1.1 riastrad static bool base_sample_input_flag(const struct uatp_softc *, const uint8_t *); 307 1.1 riastrad static void read_sample_1(uint8_t *, uint8_t *, const uint8_t *); 308 1.1 riastrad static void read_sample_2(uint8_t *, uint8_t *, const uint8_t *); 309 1.1 riastrad static void accumulate_sample_1(struct uatp_softc *); 310 1.1 riastrad static void accumulate_sample_2(struct uatp_softc *); 311 1.1 riastrad static void uatp_input(struct uatp_softc *, uint32_t, int, int, int, int); 312 1.1 riastrad static uint32_t uatp_tapped_buttons(struct uatp_softc *); 313 1.1 riastrad static bool interpret_input(struct uatp_softc *, int *, int *, int *, int *, 314 1.1 riastrad uint32_t *); 315 1.1 riastrad static unsigned int interpret_dimension(struct uatp_softc *, const int *, 316 1.1 riastrad unsigned int, unsigned int, unsigned int *, unsigned int *); 317 1.1 riastrad static void tap_initialize(struct uatp_softc *); 318 1.1 riastrad static void tap_finalize(struct uatp_softc *); 319 1.1 riastrad static void tap_enable(struct uatp_softc *); 320 1.1 riastrad static void tap_disable(struct uatp_softc *); 321 1.1 riastrad static void tap_transition(struct uatp_softc *, enum uatp_tap_state, 322 1.1 riastrad const struct timeval *, unsigned int, unsigned int); 323 1.1 riastrad static void tap_transition_initial(struct uatp_softc *); 324 1.1 riastrad static void tap_transition_tapping(struct uatp_softc *, const struct timeval *, 325 1.1 riastrad unsigned int); 326 1.1 riastrad static void tap_transition_double_tapping(struct uatp_softc *, 327 1.1 riastrad const struct timeval *, unsigned int); 328 1.1 riastrad static void tap_transition_dragging_down(struct uatp_softc *); 329 1.1 riastrad static void tap_transition_tapping_in_drag(struct uatp_softc *, 330 1.1 riastrad const struct timeval *, unsigned int); 331 1.1 riastrad static void tap_transition_tapped(struct uatp_softc *, const struct timeval *); 332 1.1 riastrad static void tap_transition_dragging_up(struct uatp_softc *); 333 1.1 riastrad static void tap_reset(struct uatp_softc *); 334 1.1 riastrad static void tap_reset_wait(struct uatp_softc *); 335 1.1 riastrad static void tap_touched(struct uatp_softc *, unsigned int); 336 1.1 riastrad static bool tap_released(struct uatp_softc *); 337 1.1 riastrad static void schedule_untap(struct uatp_softc *); 338 1.1 riastrad static void untap_callout(void *); 339 1.1 riastrad static uint32_t emulated_buttons(struct uatp_softc *, unsigned int); 340 1.1 riastrad static void update_position(struct uatp_softc *, unsigned int, 341 1.1 riastrad unsigned int, unsigned int, int *, int *, int *, int *); 342 1.1 riastrad static void move_mouse(struct uatp_softc *, unsigned int, unsigned int, 343 1.1 riastrad int *, int *); 344 1.1 riastrad static void scroll_wheel(struct uatp_softc *, unsigned int, unsigned int, 345 1.1 riastrad int *, int *); 346 1.1 riastrad static void move(struct uatp_softc *, const char *, unsigned int, unsigned int, 347 1.1 riastrad int *, int *, int *, int *, unsigned int *, unsigned int *, int *, int *); 348 1.1 riastrad static int smooth(struct uatp_softc *, unsigned int, unsigned int, 349 1.1 riastrad unsigned int); 350 1.1 riastrad static bool motion_below_threshold(struct uatp_softc *, unsigned int, 351 1.1 riastrad int, int); 352 1.1 riastrad static int accelerate(struct uatp_softc *, unsigned int, unsigned int, 353 1.1 riastrad unsigned int, unsigned int, bool, int *); 354 1.12 skrll 355 1.1 riastrad struct uatp_knobs { 356 1.1 riastrad /* 357 1.1 riastrad * Button emulation. What do we do when two or three fingers 358 1.1 riastrad * are on the trackpad when the user presses the button? 359 1.1 riastrad */ 360 1.1 riastrad unsigned int two_finger_buttons; 361 1.1 riastrad unsigned int three_finger_buttons; 362 1.1 riastrad 363 1.1 riastrad #if 0 364 1.1 riastrad /* 365 1.1 riastrad * Edge scrolling. 366 1.1 riastrad * 367 1.1 riastrad * XXX Implement this. What units should these be in? 368 1.1 riastrad */ 369 1.1 riastrad unsigned int top_edge; 370 1.1 riastrad unsigned int bottom_edge; 371 1.1 riastrad unsigned int left_edge; 372 1.1 riastrad unsigned int right_edge; 373 1.1 riastrad #endif 374 1.1 riastrad 375 1.1 riastrad /* 376 1.1 riastrad * Multifinger tracking. What do we do with multiple fingers? 377 1.1 riastrad * 0. Ignore them. 378 1.1 riastrad * 1. Try to interpret them as ordinary mousing. 379 1.1 riastrad * 2. Act like a two-dimensional scroll wheel. 380 1.1 riastrad */ 381 1.1 riastrad unsigned int multifinger_track; 382 1.1 riastrad 383 1.1 riastrad /* 384 1.1 riastrad * Sensor parameters. 385 1.1 riastrad */ 386 1.1 riastrad unsigned int x_sensors; 387 1.1 riastrad unsigned int x_ratio; 388 1.1 riastrad unsigned int y_sensors; 389 1.1 riastrad unsigned int y_ratio; 390 1.1 riastrad unsigned int sensor_threshold; 391 1.1 riastrad unsigned int sensor_normalizer; 392 1.1 riastrad unsigned int palm_width; 393 1.1 riastrad unsigned int old_raw_weight; 394 1.1 riastrad unsigned int old_smoothed_weight; 395 1.1 riastrad unsigned int new_raw_weight; 396 1.1 riastrad 397 1.1 riastrad /* 398 1.1 riastrad * Motion parameters. 399 1.1 riastrad * 400 1.1 riastrad * XXX There should be a more principled model of acceleration. 401 1.1 riastrad */ 402 1.1 riastrad unsigned int motion_remainder; 403 1.1 riastrad unsigned int motion_threshold; 404 1.1 riastrad unsigned int motion_multiplier; 405 1.1 riastrad unsigned int motion_divisor; 406 1.1 riastrad unsigned int fast_motion_threshold; 407 1.1 riastrad unsigned int fast_motion_multiplier; 408 1.1 riastrad unsigned int fast_motion_divisor; 409 1.1 riastrad unsigned int fast_per_direction; 410 1.1 riastrad unsigned int motion_delay; 411 1.1 riastrad 412 1.1 riastrad /* 413 1.1 riastrad * Tapping. 414 1.1 riastrad */ 415 1.1 riastrad unsigned int tap_limit_msec; 416 1.1 riastrad unsigned int double_tap_limit_msec; 417 1.1 riastrad unsigned int one_finger_tap_buttons; 418 1.1 riastrad unsigned int two_finger_tap_buttons; 419 1.1 riastrad unsigned int three_finger_tap_buttons; 420 1.1 riastrad unsigned int tap_track_distance_limit; 421 1.1 riastrad }; 422 1.12 skrll 423 1.1 riastrad static const struct uatp_knobs default_knobs = { 424 1.1 riastrad /* 425 1.1 riastrad * Button emulation. Fingers on the trackpad don't change it 426 1.1 riastrad * by default -- it's still the left button. 427 1.1 riastrad * 428 1.1 riastrad * XXX The left button should have a name. 429 1.1 riastrad */ 430 1.1 riastrad .two_finger_buttons = 1, 431 1.1 riastrad .three_finger_buttons = 1, 432 1.1 riastrad 433 1.1 riastrad #if 0 434 1.1 riastrad /* 435 1.1 riastrad * Edge scrolling. Off by default. 436 1.1 riastrad */ 437 1.1 riastrad .top_edge = 0, 438 1.1 riastrad .bottom_edge = 0, 439 1.1 riastrad .left_edge = 0, 440 1.1 riastrad .right_edge = 0, 441 1.1 riastrad #endif 442 1.1 riastrad 443 1.1 riastrad /* 444 1.1 riastrad * Multifinger tracking. Ignore by default. 445 1.1 riastrad */ 446 1.1 riastrad .multifinger_track = 0, 447 1.1 riastrad 448 1.1 riastrad /* 449 1.1 riastrad * Sensor parameters. 450 1.1 riastrad */ 451 1.1 riastrad .x_sensors = 0, /* default for model */ 452 1.1 riastrad .x_ratio = 0, /* default for model */ 453 1.1 riastrad .y_sensors = 0, /* default for model */ 454 1.1 riastrad .y_ratio = 0, /* default for model */ 455 1.1 riastrad .sensor_threshold = 5, 456 1.1 riastrad .sensor_normalizer = 5, 457 1.1 riastrad .palm_width = 0, /* palm detection disabled */ 458 1.1 riastrad .old_raw_weight = 0, 459 1.1 riastrad .old_smoothed_weight = 5, 460 1.1 riastrad .new_raw_weight = 1, 461 1.1 riastrad 462 1.1 riastrad /* 463 1.1 riastrad * Motion parameters. 464 1.1 riastrad */ 465 1.1 riastrad .motion_remainder = 1, 466 1.1 riastrad .motion_threshold = 0, 467 1.1 riastrad .motion_multiplier = 1, 468 1.1 riastrad .motion_divisor = 1, 469 1.1 riastrad .fast_motion_threshold = 10, 470 1.1 riastrad .fast_motion_multiplier = 3, 471 1.1 riastrad .fast_motion_divisor = 2, 472 1.1 riastrad .fast_per_direction = 0, 473 1.1 riastrad .motion_delay = 4, 474 1.1 riastrad 475 1.1 riastrad /* 476 1.1 riastrad * Tapping. Disabled by default, with a reasonable time set 477 1.1 riastrad * nevertheless so that you can just set the buttons to enable 478 1.1 riastrad * it. 479 1.1 riastrad */ 480 1.1 riastrad .tap_limit_msec = 100, 481 1.1 riastrad .double_tap_limit_msec = 200, 482 1.1 riastrad .one_finger_tap_buttons = 0, 483 1.1 riastrad .two_finger_tap_buttons = 0, 484 1.1 riastrad .three_finger_tap_buttons = 0, 485 1.1 riastrad .tap_track_distance_limit = 200, 486 1.1 riastrad }; 487 1.12 skrll 488 1.1 riastrad struct uatp_softc { 489 1.29 riastrad device_t sc_dev; 490 1.29 riastrad struct uhidev *sc_hdev; /* uhidev(9) parent. */ 491 1.28 riastrad struct usbd_device *sc_udev; /* USB device. */ 492 1.31 riastrad struct usbd_interface *sc_iface0; /* Geyser 3/4 reset interface. */ 493 1.1 riastrad device_t sc_wsmousedev; /* Attached wsmouse device. */ 494 1.1 riastrad const struct uatp_parameters *sc_parameters; 495 1.1 riastrad struct uatp_knobs sc_knobs; 496 1.1 riastrad struct sysctllog *sc_log; /* Log for sysctl knobs. */ 497 1.1 riastrad const struct sysctlnode *sc_node; /* Our sysctl node. */ 498 1.1 riastrad unsigned int sc_input_size; /* Input packet size. */ 499 1.1 riastrad uint8_t sc_input[UATP_MAX_INPUT_SIZE]; /* Buffer for a packet. */ 500 1.1 riastrad unsigned int sc_input_index; /* Current index into sc_input. */ 501 1.1 riastrad int sc_acc[UATP_SENSORS]; /* Accumulated sensor state. */ 502 1.1 riastrad uint8_t sc_base[UATP_SENSORS]; /* Base sample. */ 503 1.1 riastrad uint8_t sc_sample[UATP_SENSORS];/* Current sample. */ 504 1.1 riastrad unsigned int sc_motion_timer; /* XXX describe; motion_delay */ 505 1.1 riastrad int sc_x_raw; /* Raw horiz. mouse position. */ 506 1.1 riastrad int sc_y_raw; /* Raw vert. mouse position. */ 507 1.1 riastrad int sc_z_raw; /* Raw horiz. scroll position. */ 508 1.1 riastrad int sc_w_raw; /* Raw vert. scroll position. */ 509 1.1 riastrad int sc_x_smoothed; /* Smoothed horiz. mouse position. */ 510 1.1 riastrad int sc_y_smoothed; /* Smoothed vert. mouse position. */ 511 1.1 riastrad int sc_z_smoothed; /* Smoothed horiz. scroll position. */ 512 1.1 riastrad int sc_w_smoothed; /* Smoothed vert. scroll position. */ 513 1.1 riastrad int sc_x_remainder; /* Remainders from acceleration. */ 514 1.1 riastrad int sc_y_remainder; 515 1.1 riastrad int sc_z_remainder; 516 1.1 riastrad int sc_w_remainder; 517 1.1 riastrad unsigned int sc_track_distance; /* Distance^2 finger has tracked, 518 1.1 riastrad * squared to avoid sqrt in kernel. */ 519 1.1 riastrad uint32_t sc_status; /* Status flags: */ 520 1.23 riastrad #define UATP_ENABLED __BIT(0) /* . Is the wsmouse enabled? */ 521 1.23 riastrad #define UATP_DYING __BIT(1) /* . Have we been deactivated? */ 522 1.23 riastrad #define UATP_VALID __BIT(2) /* . Do we have valid sensor data? */ 523 1.8 riastrad struct usb_task sc_reset_task; /* Task for resetting device. */ 524 1.1 riastrad 525 1.1 riastrad callout_t sc_untap_callout; /* Releases button after tap. */ 526 1.1 riastrad kmutex_t sc_tap_mutex; /* Protects the following fields. */ 527 1.1 riastrad enum uatp_tap_state sc_tap_state; /* Current tap state. */ 528 1.1 riastrad unsigned int sc_tapping_fingers; /* No. fingers tapping. */ 529 1.1 riastrad unsigned int sc_tapped_fingers; /* No. fingers of last tap. */ 530 1.1 riastrad struct timeval sc_tap_timer; /* Timer for tap state transitions. */ 531 1.1 riastrad uint32_t sc_buttons; /* Physical buttons pressed. */ 532 1.1 riastrad uint32_t sc_all_buttons; /* Buttons pressed or tapped. */ 533 1.1 riastrad 534 1.1 riastrad #if UATP_DEBUG 535 1.1 riastrad uint32_t sc_debug_flags; /* Debugging output enabled. */ 536 1.1 riastrad #endif 537 1.1 riastrad }; 538 1.12 skrll 539 1.1 riastrad struct uatp_descriptor { 540 1.1 riastrad uint16_t vendor; 541 1.1 riastrad uint16_t product; 542 1.1 riastrad const char *description; 543 1.1 riastrad const struct uatp_parameters *parameters; 544 1.1 riastrad }; 545 1.1 riastrad 546 1.1 riastrad struct uatp_parameters { 547 1.1 riastrad unsigned int x_ratio; /* Screen width / trackpad width. */ 548 1.1 riastrad unsigned int x_sensors; /* Number of horizontal sensors. */ 549 1.1 riastrad unsigned int x_sensors_17; /* XXX Same, on a 17" laptop. */ 550 1.1 riastrad unsigned int y_ratio; /* Screen height / trackpad height. */ 551 1.1 riastrad unsigned int y_sensors; /* Number of vertical sensors. */ 552 1.1 riastrad unsigned int input_size; /* Size in bytes of input packets. */ 553 1.1 riastrad 554 1.1 riastrad /* Device-specific initialization routine. May be null. */ 555 1.1 riastrad void (*initialize)(struct uatp_softc *); 556 1.1 riastrad 557 1.30 riastrad /* Device-specific finalization routine. May be null. */ 558 1.30 riastrad void (*finalize)(struct uatp_softc *); 559 1.1 riastrad 560 1.1 riastrad /* Tests whether this is a base sample. Second argument is 561 1.1 riastrad * input_size bytes long. */ 562 1.1 riastrad bool (*base_sample)(const struct uatp_softc *, const uint8_t *); 563 1.1 riastrad 564 1.1 riastrad /* Reads a sensor sample from an input packet. First argument 565 1.1 riastrad * is UATP_MAX_X_SENSORS bytes long; second, UATP_MAX_Y_SENSORS 566 1.1 riastrad * bytes; third, input_size bytes. */ 567 1.1 riastrad void (*read_sample)(uint8_t *, uint8_t *, const uint8_t *); 568 1.1 riastrad 569 1.1 riastrad /* Accumulates sensor state in sc->sc_acc. */ 570 1.1 riastrad void (*accumulate)(struct uatp_softc *); 571 1.1 riastrad 572 1.1 riastrad /* Called on spurious interrupts to reset. May be null. */ 573 1.1 riastrad void (*reset)(struct uatp_softc *); 574 1.1 riastrad }; 575 1.12 skrll 576 1.1 riastrad /* Known device parameters */ 577 1.1 riastrad 578 1.1 riastrad static const struct uatp_parameters fountain_parameters = { 579 1.1 riastrad .x_ratio = 64, .x_sensors = 16, .x_sensors_17 = 26, 580 1.1 riastrad .y_ratio = 43, .y_sensors = 16, 581 1.1 riastrad .input_size = 81, 582 1.1 riastrad .initialize = NULL, 583 1.1 riastrad .finalize = NULL, 584 1.1 riastrad .base_sample = base_sample_softc_flag, 585 1.1 riastrad .read_sample = read_sample_1, 586 1.1 riastrad .accumulate = accumulate_sample_1, 587 1.1 riastrad .reset = NULL, 588 1.1 riastrad }; 589 1.1 riastrad 590 1.1 riastrad static const struct uatp_parameters geyser_1_parameters = { 591 1.1 riastrad .x_ratio = 64, .x_sensors = 16, .x_sensors_17 = 26, 592 1.1 riastrad .y_ratio = 43, .y_sensors = 16, 593 1.1 riastrad .input_size = 81, 594 1.1 riastrad .initialize = NULL, 595 1.1 riastrad .finalize = NULL, 596 1.1 riastrad .base_sample = base_sample_softc_flag, 597 1.1 riastrad .read_sample = read_sample_1, 598 1.1 riastrad .accumulate = accumulate_sample_1, 599 1.1 riastrad .reset = NULL, 600 1.1 riastrad }; 601 1.1 riastrad 602 1.1 riastrad static const struct uatp_parameters geyser_2_parameters = { 603 1.1 riastrad .x_ratio = 64, .x_sensors = 15, .x_sensors_17 = 20, 604 1.1 riastrad .y_ratio = 43, .y_sensors = 9, 605 1.1 riastrad .input_size = 64, 606 1.1 riastrad .initialize = NULL, 607 1.1 riastrad .finalize = NULL, 608 1.1 riastrad .base_sample = base_sample_softc_flag, 609 1.1 riastrad .read_sample = read_sample_2, 610 1.1 riastrad .accumulate = accumulate_sample_1, 611 1.1 riastrad .reset = NULL, 612 1.1 riastrad }; 613 1.1 riastrad 614 1.1 riastrad /* 615 1.1 riastrad * The Geyser 3 and Geyser 4 share parameters. They also present 616 1.1 riastrad * generic USB HID mice on a different report id, so we have smaller 617 1.1 riastrad * packets by one byte (uhidev handles multiplexing report ids) and 618 1.1 riastrad * extra initialization work to switch the mode from generic USB HID 619 1.1 riastrad * mouse to Apple trackpad. 620 1.1 riastrad */ 621 1.1 riastrad 622 1.1 riastrad static const struct uatp_parameters geyser_3_4_parameters = { 623 1.1 riastrad .x_ratio = 64, .x_sensors = 20, /* XXX */ .x_sensors_17 = 0, 624 1.1 riastrad .y_ratio = 64, .y_sensors = 9, 625 1.1 riastrad .input_size = 63, /* 64, minus one for the report id. */ 626 1.1 riastrad .initialize = geyser34_initialize, 627 1.1 riastrad .finalize = geyser34_finalize, 628 1.1 riastrad .base_sample = base_sample_input_flag, 629 1.1 riastrad .read_sample = read_sample_2, 630 1.1 riastrad .accumulate = accumulate_sample_2, 631 1.1 riastrad .reset = geyser34_deferred_reset, 632 1.1 riastrad }; 633 1.12 skrll 634 1.1 riastrad /* Known device models */ 635 1.1 riastrad 636 1.1 riastrad #define APPLE_TRACKPAD(PRODUCT, DESCRIPTION, PARAMETERS) \ 637 1.1 riastrad { \ 638 1.1 riastrad .vendor = USB_VENDOR_APPLE, \ 639 1.1 riastrad .product = (PRODUCT), \ 640 1.1 riastrad .description = "Apple " DESCRIPTION " trackpad", \ 641 1.1 riastrad .parameters = (& (PARAMETERS)), \ 642 1.1 riastrad } 643 1.1 riastrad 644 1.1 riastrad #define POWERBOOK_TRACKPAD(PRODUCT, PARAMETERS) \ 645 1.1 riastrad APPLE_TRACKPAD(PRODUCT, "PowerBook/iBook", PARAMETERS) 646 1.1 riastrad #define MACBOOK_TRACKPAD(PRODUCT, PARAMETERS) \ 647 1.1 riastrad APPLE_TRACKPAD(PRODUCT, "MacBook/MacBook Pro", PARAMETERS) 648 1.1 riastrad 649 1.1 riastrad static const struct uatp_descriptor uatp_descriptors[] = 650 1.1 riastrad { 651 1.1 riastrad POWERBOOK_TRACKPAD(0x020e, fountain_parameters), 652 1.1 riastrad POWERBOOK_TRACKPAD(0x020f, fountain_parameters), 653 1.1 riastrad POWERBOOK_TRACKPAD(0x030a, fountain_parameters), 654 1.1 riastrad 655 1.1 riastrad POWERBOOK_TRACKPAD(0x030b, geyser_1_parameters), 656 1.1 riastrad 657 1.1 riastrad POWERBOOK_TRACKPAD(0x0214, geyser_2_parameters), 658 1.1 riastrad POWERBOOK_TRACKPAD(0x0215, geyser_2_parameters), 659 1.1 riastrad POWERBOOK_TRACKPAD(0x0216, geyser_2_parameters), 660 1.1 riastrad 661 1.1 riastrad MACBOOK_TRACKPAD(0x0217, geyser_3_4_parameters), /* 3 */ 662 1.1 riastrad MACBOOK_TRACKPAD(0x0218, geyser_3_4_parameters), /* 3 */ 663 1.1 riastrad MACBOOK_TRACKPAD(0x0219, geyser_3_4_parameters), /* 3 */ 664 1.1 riastrad 665 1.1 riastrad MACBOOK_TRACKPAD(0x021a, geyser_3_4_parameters), /* 4 */ 666 1.1 riastrad MACBOOK_TRACKPAD(0x021b, geyser_3_4_parameters), /* 4 */ 667 1.1 riastrad MACBOOK_TRACKPAD(0x021c, geyser_3_4_parameters), /* 4 */ 668 1.1 riastrad 669 1.1 riastrad MACBOOK_TRACKPAD(0x0229, geyser_3_4_parameters), /* 4 */ 670 1.1 riastrad MACBOOK_TRACKPAD(0x022a, geyser_3_4_parameters), /* 4 */ 671 1.1 riastrad MACBOOK_TRACKPAD(0x022b, geyser_3_4_parameters), /* 4 */ 672 1.1 riastrad }; 673 1.1 riastrad 674 1.1 riastrad #undef MACBOOK_TRACKPAD 675 1.1 riastrad #undef POWERBOOK_TRACKPAD 676 1.1 riastrad #undef APPLE_TRACKPAD 677 1.12 skrll 678 1.1 riastrad /* Miscellaneous utilities */ 679 1.1 riastrad 680 1.1 riastrad static const struct uatp_descriptor * 681 1.1 riastrad find_uatp_descriptor(const struct uhidev_attach_arg *uha) 682 1.1 riastrad { 683 1.1 riastrad unsigned int i; 684 1.1 riastrad 685 1.1 riastrad for (i = 0; i < __arraycount(uatp_descriptors); i++) 686 1.12 skrll if ((uha->uiaa->uiaa_vendor == uatp_descriptors[i].vendor) && 687 1.12 skrll (uha->uiaa->uiaa_product == uatp_descriptors[i].product)) 688 1.1 riastrad return &uatp_descriptors[i]; 689 1.1 riastrad 690 1.1 riastrad return NULL; 691 1.1 riastrad } 692 1.1 riastrad 693 1.1 riastrad static device_t 694 1.1 riastrad uatp_dev(const struct uatp_softc *sc) 695 1.1 riastrad { 696 1.29 riastrad return sc->sc_dev; 697 1.1 riastrad } 698 1.1 riastrad 699 1.1 riastrad static uint8_t * 700 1.1 riastrad uatp_x_sample(struct uatp_softc *sc) 701 1.1 riastrad { 702 1.1 riastrad return &sc->sc_sample[0]; 703 1.1 riastrad } 704 1.1 riastrad 705 1.1 riastrad static uint8_t * 706 1.1 riastrad uatp_y_sample(struct uatp_softc *sc) 707 1.1 riastrad { 708 1.1 riastrad return &sc->sc_sample[UATP_MAX_X_SENSORS]; 709 1.1 riastrad } 710 1.1 riastrad 711 1.1 riastrad static int * 712 1.1 riastrad uatp_x_acc(struct uatp_softc *sc) 713 1.1 riastrad { 714 1.1 riastrad return &sc->sc_acc[0]; 715 1.1 riastrad } 716 1.1 riastrad 717 1.1 riastrad static int * 718 1.1 riastrad uatp_y_acc(struct uatp_softc *sc) 719 1.1 riastrad { 720 1.1 riastrad return &sc->sc_acc[UATP_MAX_X_SENSORS]; 721 1.1 riastrad } 722 1.1 riastrad 723 1.1 riastrad static void 724 1.1 riastrad uatp_clear_position(struct uatp_softc *sc) 725 1.1 riastrad { 726 1.1 riastrad memset(sc->sc_acc, 0, sizeof(sc->sc_acc)); 727 1.1 riastrad sc->sc_motion_timer = 0; 728 1.1 riastrad sc->sc_x_raw = sc->sc_x_smoothed = -1; 729 1.1 riastrad sc->sc_y_raw = sc->sc_y_smoothed = -1; 730 1.1 riastrad sc->sc_z_raw = sc->sc_z_smoothed = -1; 731 1.1 riastrad sc->sc_w_raw = sc->sc_w_smoothed = -1; 732 1.1 riastrad sc->sc_x_remainder = 0; 733 1.1 riastrad sc->sc_y_remainder = 0; 734 1.1 riastrad sc->sc_z_remainder = 0; 735 1.1 riastrad sc->sc_w_remainder = 0; 736 1.1 riastrad sc->sc_track_distance = 0; 737 1.1 riastrad } 738 1.12 skrll 739 1.1 riastrad static unsigned int 740 1.1 riastrad uatp_x_sensors(const struct uatp_softc *sc) 741 1.1 riastrad { 742 1.1 riastrad if ((0 < sc->sc_knobs.x_sensors) && 743 1.1 riastrad (sc->sc_knobs.x_sensors <= UATP_MAX_X_SENSORS)) 744 1.1 riastrad return sc->sc_knobs.x_sensors; 745 1.1 riastrad else 746 1.1 riastrad return sc->sc_parameters->x_sensors; 747 1.1 riastrad } 748 1.1 riastrad 749 1.1 riastrad static unsigned int 750 1.1 riastrad uatp_y_sensors(const struct uatp_softc *sc) 751 1.1 riastrad { 752 1.1 riastrad if ((0 < sc->sc_knobs.y_sensors) && 753 1.1 riastrad (sc->sc_knobs.y_sensors <= UATP_MAX_Y_SENSORS)) 754 1.1 riastrad return sc->sc_knobs.y_sensors; 755 1.1 riastrad else 756 1.1 riastrad return sc->sc_parameters->y_sensors; 757 1.1 riastrad } 758 1.1 riastrad 759 1.1 riastrad static unsigned int 760 1.1 riastrad uatp_x_ratio(const struct uatp_softc *sc) 761 1.1 riastrad { 762 1.1 riastrad /* XXX Reject bogus values in sysctl. */ 763 1.1 riastrad if ((0 < sc->sc_knobs.x_ratio) && 764 1.1 riastrad (sc->sc_knobs.x_ratio <= UATP_MAX_X_RATIO)) 765 1.1 riastrad return sc->sc_knobs.x_ratio; 766 1.1 riastrad else 767 1.1 riastrad return sc->sc_parameters->x_ratio; 768 1.1 riastrad } 769 1.1 riastrad 770 1.1 riastrad static unsigned int 771 1.1 riastrad uatp_y_ratio(const struct uatp_softc *sc) 772 1.1 riastrad { 773 1.1 riastrad /* XXX Reject bogus values in sysctl. */ 774 1.1 riastrad if ((0 < sc->sc_knobs.y_ratio) && 775 1.1 riastrad (sc->sc_knobs.y_ratio <= UATP_MAX_Y_RATIO)) 776 1.1 riastrad return sc->sc_knobs.y_ratio; 777 1.1 riastrad else 778 1.1 riastrad return sc->sc_parameters->y_ratio; 779 1.1 riastrad } 780 1.12 skrll 781 1.1 riastrad static unsigned int 782 1.1 riastrad uatp_old_raw_weight(const struct uatp_softc *sc) 783 1.1 riastrad { 784 1.1 riastrad /* XXX Reject bogus values in sysctl. */ 785 1.1 riastrad if (sc->sc_knobs.old_raw_weight <= UATP_MAX_WEIGHT) 786 1.1 riastrad return sc->sc_knobs.old_raw_weight; 787 1.1 riastrad else 788 1.1 riastrad return 0; 789 1.1 riastrad } 790 1.1 riastrad 791 1.1 riastrad static unsigned int 792 1.1 riastrad uatp_old_smoothed_weight(const struct uatp_softc *sc) 793 1.1 riastrad { 794 1.1 riastrad /* XXX Reject bogus values in sysctl. */ 795 1.1 riastrad if (sc->sc_knobs.old_smoothed_weight <= UATP_MAX_WEIGHT) 796 1.1 riastrad return sc->sc_knobs.old_smoothed_weight; 797 1.1 riastrad else 798 1.1 riastrad return 0; 799 1.1 riastrad } 800 1.1 riastrad 801 1.1 riastrad static unsigned int 802 1.1 riastrad uatp_new_raw_weight(const struct uatp_softc *sc) 803 1.1 riastrad { 804 1.1 riastrad /* XXX Reject bogus values in sysctl. */ 805 1.1 riastrad if ((0 < sc->sc_knobs.new_raw_weight) && 806 1.1 riastrad (sc->sc_knobs.new_raw_weight <= UATP_MAX_WEIGHT)) 807 1.1 riastrad return sc->sc_knobs.new_raw_weight; 808 1.1 riastrad else 809 1.1 riastrad return 1; 810 1.1 riastrad } 811 1.12 skrll 812 1.1 riastrad static int 813 1.1 riastrad scale_motion(const struct uatp_softc *sc, int delta, int *remainder, 814 1.1 riastrad const unsigned int *multiplier, const unsigned int *divisor) 815 1.1 riastrad { 816 1.1 riastrad int product; 817 1.1 riastrad 818 1.1 riastrad /* XXX Limit the divisor? */ 819 1.1 riastrad if (((*multiplier) == 0) || 820 1.1 riastrad ((*multiplier) > UATP_MAX_MOTION_MULTIPLIER) || 821 1.1 riastrad ((*divisor) == 0)) 822 1.1 riastrad DPRINTF(sc, UATP_DEBUG_ACCEL, 823 1.1 riastrad ("bad knobs; %d (+ %d) --> %d, rem 0\n", 824 1.1 riastrad delta, *remainder, (delta + (*remainder)))); 825 1.1 riastrad else 826 1.1 riastrad DPRINTF(sc, UATP_DEBUG_ACCEL, 827 1.1 riastrad ("scale %d (+ %d) by %u/%u --> %d, rem %d\n", 828 1.1 riastrad delta, *remainder, 829 1.1 riastrad (*multiplier), (*divisor), 830 1.1 riastrad (((delta + (*remainder)) * ((int) (*multiplier))) 831 1.1 riastrad / ((int) (*divisor))), 832 1.1 riastrad (((delta + (*remainder)) * ((int) (*multiplier))) 833 1.1 riastrad % ((int) (*divisor))))); 834 1.1 riastrad 835 1.1 riastrad if (sc->sc_knobs.motion_remainder) 836 1.1 riastrad delta += *remainder; 837 1.1 riastrad *remainder = 0; 838 1.1 riastrad 839 1.1 riastrad if (((*multiplier) == 0) || 840 1.1 riastrad ((*multiplier) > UATP_MAX_MOTION_MULTIPLIER) || 841 1.1 riastrad ((*divisor) == 0)) 842 1.1 riastrad return delta; 843 1.1 riastrad 844 1.1 riastrad product = (delta * ((int) (*multiplier))); 845 1.1 riastrad *remainder = (product % ((int) (*divisor))); 846 1.19 skrll return product / ((int) (*divisor)); 847 1.1 riastrad } 848 1.1 riastrad 849 1.1 riastrad static int 850 1.1 riastrad uatp_scale_motion(const struct uatp_softc *sc, int delta, int *remainder) 851 1.1 riastrad { 852 1.1 riastrad return scale_motion(sc, delta, remainder, 853 1.1 riastrad &sc->sc_knobs.motion_multiplier, 854 1.1 riastrad &sc->sc_knobs.motion_divisor); 855 1.1 riastrad } 856 1.1 riastrad 857 1.1 riastrad static int 858 1.1 riastrad uatp_scale_fast_motion(const struct uatp_softc *sc, int delta, int *remainder) 859 1.1 riastrad { 860 1.1 riastrad return scale_motion(sc, delta, remainder, 861 1.1 riastrad &sc->sc_knobs.fast_motion_multiplier, 862 1.1 riastrad &sc->sc_knobs.fast_motion_divisor); 863 1.1 riastrad } 864 1.12 skrll 865 1.1 riastrad /* Driver goop */ 866 1.1 riastrad 867 1.1 riastrad CFATTACH_DECL2_NEW(uatp, sizeof(struct uatp_softc), uatp_match, uatp_attach, 868 1.1 riastrad uatp_detach, uatp_activate, NULL, uatp_childdet); 869 1.1 riastrad 870 1.1 riastrad static const struct wsmouse_accessops uatp_accessops = { 871 1.1 riastrad .enable = uatp_enable, 872 1.1 riastrad .disable = uatp_disable, 873 1.1 riastrad .ioctl = uatp_ioctl, 874 1.1 riastrad }; 875 1.1 riastrad 876 1.1 riastrad static int 877 1.1 riastrad uatp_match(device_t parent, cfdata_t match, void *aux) 878 1.1 riastrad { 879 1.1 riastrad const struct uhidev_attach_arg *uha = aux; 880 1.1 riastrad void *report_descriptor; 881 1.1 riastrad int report_size, input_size; 882 1.1 riastrad const struct uatp_descriptor *uatp_descriptor; 883 1.1 riastrad 884 1.25 christos aprint_debug("%s: vendor 0x%04x, product 0x%04x\n", __func__, 885 1.12 skrll (unsigned int)uha->uiaa->uiaa_vendor, 886 1.12 skrll (unsigned int)uha->uiaa->uiaa_product); 887 1.25 christos aprint_debug("%s: class 0x%04x, subclass 0x%04x, proto 0x%04x\n", 888 1.1 riastrad __func__, 889 1.12 skrll (unsigned int)uha->uiaa->uiaa_class, 890 1.12 skrll (unsigned int)uha->uiaa->uiaa_subclass, 891 1.12 skrll (unsigned int)uha->uiaa->uiaa_proto); 892 1.1 riastrad 893 1.1 riastrad uhidev_get_report_desc(uha->parent, &report_descriptor, &report_size); 894 1.1 riastrad input_size = hid_report_size(report_descriptor, report_size, 895 1.1 riastrad hid_input, uha->reportid); 896 1.1 riastrad aprint_debug("%s: reportid %d, input size %d\n", __func__, 897 1.1 riastrad (int)uha->reportid, input_size); 898 1.1 riastrad 899 1.1 riastrad /* 900 1.1 riastrad * Keyboards, trackpads, and eject buttons share common vendor 901 1.1 riastrad * and product ids, but not protocols: only the trackpad 902 1.1 riastrad * reports a mouse protocol. 903 1.1 riastrad */ 904 1.12 skrll if (uha->uiaa->uiaa_proto != UIPROTO_MOUSE) 905 1.1 riastrad return UMATCH_NONE; 906 1.1 riastrad 907 1.1 riastrad /* Check for a known vendor/product id. */ 908 1.1 riastrad uatp_descriptor = find_uatp_descriptor(uha); 909 1.1 riastrad if (uatp_descriptor == NULL) { 910 1.1 riastrad aprint_debug("%s: unknown vendor/product id\n", __func__); 911 1.1 riastrad return UMATCH_NONE; 912 1.1 riastrad } 913 1.1 riastrad 914 1.1 riastrad /* Check for the expected input size. */ 915 1.1 riastrad if ((input_size < 0) || 916 1.1 riastrad ((unsigned int)input_size != 917 1.1 riastrad uatp_descriptor->parameters->input_size)) { 918 1.1 riastrad aprint_debug("%s: expected input size %u\n", __func__, 919 1.1 riastrad uatp_descriptor->parameters->input_size); 920 1.1 riastrad return UMATCH_NONE; 921 1.1 riastrad } 922 1.1 riastrad 923 1.1 riastrad return UMATCH_VENDOR_PRODUCT_CONF_IFACE; 924 1.1 riastrad } 925 1.12 skrll 926 1.1 riastrad static void 927 1.1 riastrad uatp_attach(device_t parent, device_t self, void *aux) 928 1.1 riastrad { 929 1.1 riastrad struct uatp_softc *sc = device_private(self); 930 1.1 riastrad const struct uhidev_attach_arg *uha = aux; 931 1.1 riastrad const struct uatp_descriptor *uatp_descriptor; 932 1.1 riastrad void *report_descriptor; 933 1.1 riastrad int report_size, input_size; 934 1.1 riastrad struct wsmousedev_attach_args a; 935 1.1 riastrad 936 1.29 riastrad sc->sc_dev = self; 937 1.29 riastrad sc->sc_hdev = uha->parent; 938 1.28 riastrad sc->sc_udev = uha->uiaa->uiaa_device; 939 1.28 riastrad 940 1.1 riastrad /* Identify ourselves to dmesg. */ 941 1.1 riastrad uatp_descriptor = find_uatp_descriptor(uha); 942 1.1 riastrad KASSERT(uatp_descriptor != NULL); 943 1.1 riastrad aprint_normal(": %s\n", uatp_descriptor->description); 944 1.1 riastrad aprint_naive(": %s\n", uatp_descriptor->description); 945 1.1 riastrad aprint_verbose_dev(self, 946 1.25 christos "vendor 0x%04x, product 0x%04x, report id %d\n", 947 1.12 skrll (unsigned int)uha->uiaa->uiaa_vendor, 948 1.12 skrll (unsigned int)uha->uiaa->uiaa_product, 949 1.29 riastrad uha->reportid); 950 1.1 riastrad 951 1.1 riastrad uhidev_get_report_desc(uha->parent, &report_descriptor, &report_size); 952 1.1 riastrad input_size = hid_report_size(report_descriptor, report_size, hid_input, 953 1.1 riastrad uha->reportid); 954 1.1 riastrad KASSERT(0 < input_size); 955 1.1 riastrad sc->sc_input_size = input_size; 956 1.1 riastrad 957 1.1 riastrad /* Initialize model-specific parameters. */ 958 1.1 riastrad sc->sc_parameters = uatp_descriptor->parameters; 959 1.4 christos KASSERT((int)sc->sc_parameters->input_size == input_size); 960 1.1 riastrad KASSERT(sc->sc_parameters->x_sensors <= UATP_MAX_X_SENSORS); 961 1.1 riastrad KASSERT(sc->sc_parameters->x_ratio <= UATP_MAX_X_RATIO); 962 1.1 riastrad KASSERT(sc->sc_parameters->y_sensors <= UATP_MAX_Y_SENSORS); 963 1.1 riastrad KASSERT(sc->sc_parameters->y_ratio <= UATP_MAX_Y_RATIO); 964 1.1 riastrad aprint_verbose_dev(self, 965 1.1 riastrad "%u x sensors, scaled by %u for %u points on screen\n", 966 1.1 riastrad sc->sc_parameters->x_sensors, sc->sc_parameters->x_ratio, 967 1.1 riastrad sc->sc_parameters->x_sensors * sc->sc_parameters->x_ratio); 968 1.1 riastrad aprint_verbose_dev(self, 969 1.1 riastrad "%u y sensors, scaled by %u for %u points on screen\n", 970 1.1 riastrad sc->sc_parameters->y_sensors, sc->sc_parameters->y_ratio, 971 1.1 riastrad sc->sc_parameters->y_sensors * sc->sc_parameters->y_ratio); 972 1.1 riastrad if (sc->sc_parameters->initialize) 973 1.1 riastrad sc->sc_parameters->initialize(sc); 974 1.1 riastrad 975 1.1 riastrad /* Register with pmf. Nothing special for suspend/resume. */ 976 1.1 riastrad if (!pmf_device_register(self, NULL, NULL)) 977 1.1 riastrad aprint_error_dev(self, "couldn't establish power handler\n"); 978 1.1 riastrad 979 1.1 riastrad /* Initialize knobs and create sysctl subtree to tweak them. */ 980 1.1 riastrad sc->sc_knobs = default_knobs; 981 1.1 riastrad uatp_setup_sysctl(sc); 982 1.1 riastrad 983 1.1 riastrad /* Initialize tapping. */ 984 1.1 riastrad tap_initialize(sc); 985 1.1 riastrad 986 1.1 riastrad /* Attach wsmouse. */ 987 1.1 riastrad a.accessops = &uatp_accessops; 988 1.1 riastrad a.accesscookie = sc; 989 1.27 thorpej sc->sc_wsmousedev = config_found(self, &a, wsmousedevprint, CFARGS_NONE); 990 1.1 riastrad } 991 1.12 skrll 992 1.1 riastrad /* Sysctl setup */ 993 1.1 riastrad 994 1.1 riastrad static void 995 1.1 riastrad uatp_setup_sysctl(struct uatp_softc *sc) 996 1.1 riastrad { 997 1.1 riastrad int error; 998 1.1 riastrad 999 1.1 riastrad error = sysctl_createv(&sc->sc_log, 0, NULL, &sc->sc_node, 0, 1000 1.1 riastrad CTLTYPE_NODE, device_xname(uatp_dev(sc)), 1001 1.1 riastrad SYSCTL_DESCR("uatp configuration knobs"), 1002 1.1 riastrad NULL, 0, NULL, 0, 1003 1.1 riastrad CTL_HW, CTL_CREATE, CTL_EOL); 1004 1.1 riastrad if (error != 0) { 1005 1.1 riastrad aprint_error_dev(uatp_dev(sc), 1006 1.1 riastrad "unable to set up sysctl tree hw.%s: %d\n", 1007 1.1 riastrad device_xname(uatp_dev(sc)), error); 1008 1.1 riastrad goto err; 1009 1.1 riastrad } 1010 1.1 riastrad 1011 1.1 riastrad #if UATP_DEBUG 1012 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_debug_flags, "debug", 1013 1.1 riastrad "uatp(4) debug flags")) 1014 1.1 riastrad goto err; 1015 1.1 riastrad #endif 1016 1.1 riastrad 1017 1.1 riastrad /* 1018 1.1 riastrad * Button emulation. 1019 1.1 riastrad */ 1020 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.two_finger_buttons, 1021 1.1 riastrad "two_finger_buttons", 1022 1.1 riastrad "buttons to emulate with two fingers on trackpad")) 1023 1.1 riastrad goto err; 1024 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.three_finger_buttons, 1025 1.1 riastrad "three_finger_buttons", 1026 1.1 riastrad "buttons to emulate with three fingers on trackpad")) 1027 1.1 riastrad goto err; 1028 1.1 riastrad 1029 1.1 riastrad #if 0 1030 1.1 riastrad /* 1031 1.1 riastrad * Edge scrolling. 1032 1.1 riastrad */ 1033 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.top_edge, "top_edge", 1034 1.1 riastrad "width of top edge for edge scrolling")) 1035 1.1 riastrad goto err; 1036 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.bottom_edge, 1037 1.1 riastrad "bottom_edge", "width of bottom edge for edge scrolling")) 1038 1.1 riastrad goto err; 1039 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.left_edge, "left_edge", 1040 1.1 riastrad "width of left edge for edge scrolling")) 1041 1.1 riastrad goto err; 1042 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.right_edge, "right_edge", 1043 1.1 riastrad "width of right edge for edge scrolling")) 1044 1.1 riastrad goto err; 1045 1.1 riastrad #endif 1046 1.12 skrll 1047 1.1 riastrad /* 1048 1.1 riastrad * Multifinger tracking. 1049 1.1 riastrad */ 1050 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.multifinger_track, 1051 1.1 riastrad "multifinger_track", 1052 1.1 riastrad "0 to ignore multiple fingers, 1 to reset, 2 to scroll")) 1053 1.1 riastrad goto err; 1054 1.1 riastrad 1055 1.1 riastrad /* 1056 1.1 riastrad * Sensor parameters. 1057 1.1 riastrad */ 1058 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.x_sensors, "x_sensors", 1059 1.1 riastrad "number of x sensors")) 1060 1.1 riastrad goto err; 1061 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.x_ratio, "x_ratio", 1062 1.1 riastrad "screen width to trackpad width ratio")) 1063 1.1 riastrad goto err; 1064 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.y_sensors, "y_sensors", 1065 1.1 riastrad "number of y sensors")) 1066 1.1 riastrad goto err; 1067 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.y_ratio, "y_ratio", 1068 1.1 riastrad "screen height to trackpad height ratio")) 1069 1.1 riastrad goto err; 1070 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.sensor_threshold, 1071 1.1 riastrad "sensor_threshold", "sensor threshold")) 1072 1.1 riastrad goto err; 1073 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.sensor_normalizer, 1074 1.1 riastrad "sensor_normalizer", "sensor normalizer")) 1075 1.1 riastrad goto err; 1076 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.palm_width, 1077 1.1 riastrad "palm_width", "lower bound on width/height of palm")) 1078 1.1 riastrad goto err; 1079 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.old_raw_weight, 1080 1.1 riastrad "old_raw_weight", "weight of old raw position")) 1081 1.1 riastrad goto err; 1082 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.old_smoothed_weight, 1083 1.1 riastrad "old_smoothed_weight", "weight of old smoothed position")) 1084 1.1 riastrad goto err; 1085 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.new_raw_weight, 1086 1.1 riastrad "new_raw_weight", "weight of new raw position")) 1087 1.1 riastrad goto err; 1088 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.motion_remainder, 1089 1.1 riastrad "motion_remainder", "remember motion division remainder")) 1090 1.1 riastrad goto err; 1091 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.motion_threshold, 1092 1.1 riastrad "motion_threshold", "threshold before finger moves cursor")) 1093 1.1 riastrad goto err; 1094 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.motion_multiplier, 1095 1.1 riastrad "motion_multiplier", "numerator of motion scale")) 1096 1.1 riastrad goto err; 1097 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.motion_divisor, 1098 1.1 riastrad "motion_divisor", "divisor of motion scale")) 1099 1.1 riastrad goto err; 1100 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.fast_motion_threshold, 1101 1.1 riastrad "fast_motion_threshold", "threshold before fast motion")) 1102 1.1 riastrad goto err; 1103 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.fast_motion_multiplier, 1104 1.1 riastrad "fast_motion_multiplier", "numerator of fast motion scale")) 1105 1.1 riastrad goto err; 1106 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.fast_motion_divisor, 1107 1.1 riastrad "fast_motion_divisor", "divisor of fast motion scale")) 1108 1.1 riastrad goto err; 1109 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.fast_per_direction, 1110 1.1 riastrad "fast_per_direction", "don't frobnitz the veeblefitzer!")) 1111 1.1 riastrad goto err; 1112 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.motion_delay, 1113 1.1 riastrad "motion_delay", "number of packets before motion kicks in")) 1114 1.1 riastrad goto err; 1115 1.12 skrll 1116 1.1 riastrad /* 1117 1.1 riastrad * Tapping. 1118 1.1 riastrad */ 1119 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.tap_limit_msec, 1120 1.1 riastrad "tap_limit_msec", "milliseconds before a touch is not a tap")) 1121 1.1 riastrad goto err; 1122 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.double_tap_limit_msec, 1123 1.1 riastrad "double_tap_limit_msec", 1124 1.1 riastrad "milliseconds before a second tap keeps the button down")) 1125 1.1 riastrad goto err; 1126 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.one_finger_tap_buttons, 1127 1.1 riastrad "one_finger_tap_buttons", "buttons for one-finger taps")) 1128 1.1 riastrad goto err; 1129 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.two_finger_tap_buttons, 1130 1.1 riastrad "two_finger_tap_buttons", "buttons for two-finger taps")) 1131 1.1 riastrad goto err; 1132 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.three_finger_tap_buttons, 1133 1.1 riastrad "three_finger_tap_buttons", "buttons for three-finger taps")) 1134 1.1 riastrad goto err; 1135 1.1 riastrad if (!uatp_setup_sysctl_knob(sc, &sc->sc_knobs.tap_track_distance_limit, 1136 1.1 riastrad "tap_track_distance_limit", 1137 1.1 riastrad "maximum distance^2 of tracking during tap")) 1138 1.1 riastrad goto err; 1139 1.1 riastrad 1140 1.1 riastrad return; 1141 1.1 riastrad 1142 1.1 riastrad err: 1143 1.1 riastrad sysctl_teardown(&sc->sc_log); 1144 1.1 riastrad sc->sc_node = NULL; 1145 1.1 riastrad } 1146 1.1 riastrad 1147 1.1 riastrad static bool 1148 1.1 riastrad uatp_setup_sysctl_knob(struct uatp_softc *sc, int *ptr, const char *name, 1149 1.1 riastrad const char *description) 1150 1.1 riastrad { 1151 1.1 riastrad int error; 1152 1.1 riastrad 1153 1.1 riastrad error = sysctl_createv(&sc->sc_log, 0, NULL, NULL, CTLFLAG_READWRITE, 1154 1.1 riastrad CTLTYPE_INT, name, SYSCTL_DESCR(description), 1155 1.1 riastrad NULL, 0, ptr, 0, 1156 1.1 riastrad CTL_HW, sc->sc_node->sysctl_num, CTL_CREATE, CTL_EOL); 1157 1.1 riastrad if (error != 0) { 1158 1.1 riastrad aprint_error_dev(uatp_dev(sc), 1159 1.1 riastrad "unable to setup sysctl node hw.%s.%s: %d\n", 1160 1.1 riastrad device_xname(uatp_dev(sc)), name, error); 1161 1.1 riastrad return false; 1162 1.1 riastrad } 1163 1.1 riastrad 1164 1.1 riastrad return true; 1165 1.1 riastrad } 1166 1.12 skrll 1167 1.1 riastrad /* More driver goop */ 1168 1.1 riastrad 1169 1.1 riastrad static void 1170 1.1 riastrad uatp_childdet(device_t self, device_t child) 1171 1.1 riastrad { 1172 1.1 riastrad struct uatp_softc *sc = device_private(self); 1173 1.1 riastrad 1174 1.1 riastrad DPRINTF(sc, UATP_DEBUG_MISC, ("detaching child %s\n", 1175 1.1 riastrad device_xname(child))); 1176 1.1 riastrad 1177 1.1 riastrad /* Our only child is the wsmouse device. */ 1178 1.1 riastrad if (child == sc->sc_wsmousedev) 1179 1.1 riastrad sc->sc_wsmousedev = NULL; 1180 1.1 riastrad } 1181 1.1 riastrad 1182 1.1 riastrad static int 1183 1.1 riastrad uatp_detach(device_t self, int flags) 1184 1.1 riastrad { 1185 1.1 riastrad struct uatp_softc *sc = device_private(self); 1186 1.30 riastrad int error; 1187 1.1 riastrad 1188 1.1 riastrad DPRINTF(sc, UATP_DEBUG_MISC, ("detaching with flags %d\n", flags)); 1189 1.1 riastrad 1190 1.30 riastrad error = config_detach_children(self, flags); 1191 1.30 riastrad if (error) 1192 1.30 riastrad return error; 1193 1.30 riastrad 1194 1.30 riastrad KASSERT((sc->sc_status & UATP_ENABLED) == 0); 1195 1.1 riastrad 1196 1.30 riastrad if (sc->sc_parameters->finalize) 1197 1.30 riastrad sc->sc_parameters->finalize(sc); 1198 1.1 riastrad 1199 1.1 riastrad pmf_device_deregister(self); 1200 1.1 riastrad 1201 1.1 riastrad sysctl_teardown(&sc->sc_log); 1202 1.1 riastrad sc->sc_node = NULL; 1203 1.1 riastrad 1204 1.1 riastrad tap_finalize(sc); 1205 1.1 riastrad 1206 1.30 riastrad return 0; 1207 1.1 riastrad } 1208 1.1 riastrad 1209 1.1 riastrad static int 1210 1.1 riastrad uatp_activate(device_t self, enum devact act) 1211 1.1 riastrad { 1212 1.1 riastrad struct uatp_softc *sc = device_private(self); 1213 1.1 riastrad 1214 1.1 riastrad DPRINTF(sc, UATP_DEBUG_MISC, ("act %d\n", (int)act)); 1215 1.1 riastrad 1216 1.1 riastrad if (act != DVACT_DEACTIVATE) 1217 1.1 riastrad return EOPNOTSUPP; 1218 1.1 riastrad 1219 1.1 riastrad sc->sc_status |= UATP_DYING; 1220 1.1 riastrad 1221 1.1 riastrad return 0; 1222 1.1 riastrad } 1223 1.12 skrll 1224 1.1 riastrad /* wsmouse routines */ 1225 1.1 riastrad 1226 1.1 riastrad static int 1227 1.1 riastrad uatp_enable(void *v) 1228 1.1 riastrad { 1229 1.1 riastrad struct uatp_softc *sc = v; 1230 1.1 riastrad 1231 1.1 riastrad DPRINTF(sc, UATP_DEBUG_WSMOUSE, ("enabling wsmouse\n")); 1232 1.1 riastrad 1233 1.1 riastrad /* Refuse to enable if we've been deactivated. */ 1234 1.1 riastrad if (sc->sc_status & UATP_DYING) { 1235 1.1 riastrad DPRINTF(sc, UATP_DEBUG_WSMOUSE, ("busy dying\n")); 1236 1.1 riastrad return EIO; 1237 1.1 riastrad } 1238 1.1 riastrad 1239 1.1 riastrad /* Refuse to enable if we already are enabled. */ 1240 1.1 riastrad if (sc->sc_status & UATP_ENABLED) { 1241 1.1 riastrad DPRINTF(sc, UATP_DEBUG_WSMOUSE, ("already enabled\n")); 1242 1.1 riastrad return EBUSY; 1243 1.1 riastrad } 1244 1.1 riastrad 1245 1.1 riastrad sc->sc_status |= UATP_ENABLED; 1246 1.1 riastrad sc->sc_status &=~ UATP_VALID; 1247 1.1 riastrad sc->sc_input_index = 0; 1248 1.1 riastrad tap_enable(sc); 1249 1.1 riastrad uatp_clear_position(sc); 1250 1.1 riastrad 1251 1.29 riastrad DPRINTF(sc, UATP_DEBUG_MISC, ("uhidev_open(%p)\n", sc->sc_hdev)); 1252 1.29 riastrad return uhidev_open(sc->sc_hdev, &uatp_intr, sc); 1253 1.1 riastrad } 1254 1.1 riastrad 1255 1.1 riastrad static void 1256 1.1 riastrad uatp_disable(void *v) 1257 1.1 riastrad { 1258 1.1 riastrad struct uatp_softc *sc = v; 1259 1.1 riastrad 1260 1.1 riastrad DPRINTF(sc, UATP_DEBUG_WSMOUSE, ("disabling wsmouse\n")); 1261 1.1 riastrad 1262 1.1 riastrad if (!(sc->sc_status & UATP_ENABLED)) { 1263 1.1 riastrad DPRINTF(sc, UATP_DEBUG_WSMOUSE, ("not enabled\n")); 1264 1.1 riastrad return; 1265 1.1 riastrad } 1266 1.1 riastrad 1267 1.1 riastrad tap_disable(sc); 1268 1.1 riastrad sc->sc_status &=~ UATP_ENABLED; 1269 1.1 riastrad 1270 1.29 riastrad DPRINTF(sc, UATP_DEBUG_MISC, ("uhidev_close(%p)\n", sc->sc_hdev)); 1271 1.29 riastrad uhidev_close(sc->sc_hdev); 1272 1.1 riastrad } 1273 1.1 riastrad 1274 1.1 riastrad static int 1275 1.1 riastrad uatp_ioctl(void *v, unsigned long cmd, void *data, int flag, struct lwp *p) 1276 1.1 riastrad { 1277 1.1 riastrad 1278 1.3 martin DPRINTF((struct uatp_softc*)v, UATP_DEBUG_IOCTL, 1279 1.1 riastrad ("cmd %lx, data %p, flag %x, lwp %p\n", cmd, data, flag, p)); 1280 1.1 riastrad 1281 1.1 riastrad /* XXX Implement any relevant wsmouse(4) ioctls. */ 1282 1.1 riastrad return EPASSTHROUGH; 1283 1.1 riastrad } 1284 1.12 skrll 1285 1.1 riastrad /* 1286 1.1 riastrad * The Geyser 3 and 4 models talk the generic USB HID mouse protocol by 1287 1.1 riastrad * default. This mode switch makes them give raw sensor data instead 1288 1.1 riastrad * so that we can implement tapping, two-finger scrolling, &c. 1289 1.1 riastrad */ 1290 1.1 riastrad 1291 1.1 riastrad #define GEYSER34_RAW_MODE 0x04 1292 1.1 riastrad #define GEYSER34_MODE_REPORT_ID 0 1293 1.1 riastrad #define GEYSER34_MODE_INTERFACE 0 1294 1.1 riastrad #define GEYSER34_MODE_PACKET_SIZE 8 1295 1.1 riastrad 1296 1.1 riastrad static void 1297 1.1 riastrad geyser34_enable_raw_mode(struct uatp_softc *sc) 1298 1.1 riastrad { 1299 1.31 riastrad uint8_t report[GEYSER34_MODE_PACKET_SIZE]; 1300 1.1 riastrad usbd_status status; 1301 1.1 riastrad 1302 1.1 riastrad DPRINTF(sc, UATP_DEBUG_RESET, ("get feature report\n")); 1303 1.31 riastrad status = usbd_get_report(sc->sc_iface0, UHID_FEATURE_REPORT, 1304 1.31 riastrad GEYSER34_MODE_REPORT_ID, report, sizeof(report)); 1305 1.1 riastrad if (status != USBD_NORMAL_COMPLETION) { 1306 1.1 riastrad aprint_error_dev(uatp_dev(sc), 1307 1.1 riastrad "error reading feature report: %s\n", usbd_errstr(status)); 1308 1.1 riastrad return; 1309 1.1 riastrad } 1310 1.12 skrll 1311 1.1 riastrad #if UATP_DEBUG 1312 1.1 riastrad if (sc->sc_debug_flags & UATP_DEBUG_RESET) { 1313 1.1 riastrad unsigned int i; 1314 1.1 riastrad DPRINTF(sc, UATP_DEBUG_RESET, ("old feature report:")); 1315 1.1 riastrad for (i = 0; i < GEYSER34_MODE_PACKET_SIZE; i++) 1316 1.1 riastrad printf(" %02x", (unsigned int)report[i]); 1317 1.1 riastrad printf("\n"); 1318 1.1 riastrad /* Doing this twice is harmless here and lets this be 1319 1.1 riastrad * one ifdef. */ 1320 1.1 riastrad report[0] = GEYSER34_RAW_MODE; 1321 1.1 riastrad DPRINTF(sc, UATP_DEBUG_RESET, ("new feature report:")); 1322 1.1 riastrad for (i = 0; i < GEYSER34_MODE_PACKET_SIZE; i++) 1323 1.1 riastrad printf(" %02x", (unsigned int)report[i]); 1324 1.1 riastrad printf("\n"); 1325 1.1 riastrad } 1326 1.1 riastrad #endif 1327 1.1 riastrad 1328 1.1 riastrad report[0] = GEYSER34_RAW_MODE; 1329 1.1 riastrad 1330 1.1 riastrad DPRINTF(sc, UATP_DEBUG_RESET, ("set feature report\n")); 1331 1.31 riastrad status = usbd_set_report(sc->sc_iface0, UHID_FEATURE_REPORT, 1332 1.31 riastrad GEYSER34_MODE_REPORT_ID, report, sizeof(report)); 1333 1.1 riastrad if (status != USBD_NORMAL_COMPLETION) { 1334 1.1 riastrad aprint_error_dev(uatp_dev(sc), 1335 1.1 riastrad "error writing feature report: %s\n", usbd_errstr(status)); 1336 1.1 riastrad return; 1337 1.1 riastrad } 1338 1.1 riastrad } 1339 1.12 skrll 1340 1.1 riastrad /* 1341 1.1 riastrad * The Geyser 3 and 4 need to be reset periodically after we detect a 1342 1.8 riastrad * continual flow of spurious interrupts. We use a USB task for this. 1343 1.1 riastrad */ 1344 1.1 riastrad 1345 1.1 riastrad static void 1346 1.1 riastrad geyser34_initialize(struct uatp_softc *sc) 1347 1.1 riastrad { 1348 1.31 riastrad usbd_status err __diagused; 1349 1.8 riastrad 1350 1.1 riastrad DPRINTF(sc, UATP_DEBUG_MISC, ("initializing\n")); 1351 1.31 riastrad err = usbd_device2interface_handle(sc->sc_udev, 0, &sc->sc_iface0); 1352 1.31 riastrad KASSERT(err == 0); /* always an interface 0 if attached */ 1353 1.1 riastrad geyser34_enable_raw_mode(sc); 1354 1.11 mrg usb_init_task(&sc->sc_reset_task, &geyser34_reset_task, sc, 0); 1355 1.1 riastrad } 1356 1.1 riastrad 1357 1.30 riastrad static void 1358 1.1 riastrad geyser34_finalize(struct uatp_softc *sc) 1359 1.1 riastrad { 1360 1.8 riastrad 1361 1.1 riastrad DPRINTF(sc, UATP_DEBUG_MISC, ("finalizing\n")); 1362 1.28 riastrad usb_rem_task_wait(sc->sc_udev, &sc->sc_reset_task, USB_TASKQ_DRIVER, 1363 1.28 riastrad NULL); 1364 1.1 riastrad } 1365 1.1 riastrad 1366 1.1 riastrad static void 1367 1.1 riastrad geyser34_deferred_reset(struct uatp_softc *sc) 1368 1.1 riastrad { 1369 1.8 riastrad 1370 1.1 riastrad DPRINTF(sc, UATP_DEBUG_RESET, ("deferring reset\n")); 1371 1.28 riastrad usb_add_task(sc->sc_udev, &sc->sc_reset_task, USB_TASKQ_DRIVER); 1372 1.1 riastrad } 1373 1.1 riastrad 1374 1.1 riastrad static void 1375 1.8 riastrad geyser34_reset_task(void *arg) 1376 1.1 riastrad { 1377 1.1 riastrad struct uatp_softc *sc = arg; 1378 1.1 riastrad 1379 1.1 riastrad DPRINTF(sc, UATP_DEBUG_RESET, ("resetting\n")); 1380 1.1 riastrad 1381 1.1 riastrad /* Reset by putting it into raw mode. Not sure why. */ 1382 1.1 riastrad geyser34_enable_raw_mode(sc); 1383 1.1 riastrad } 1384 1.12 skrll 1385 1.1 riastrad /* Interrupt handler */ 1386 1.1 riastrad 1387 1.1 riastrad static void 1388 1.29 riastrad uatp_intr(void *cookie, void *ibuf, unsigned int len) 1389 1.1 riastrad { 1390 1.29 riastrad struct uatp_softc *sc = cookie; 1391 1.1 riastrad uint8_t *input; 1392 1.1 riastrad int dx, dy, dz, dw; 1393 1.1 riastrad uint32_t buttons; 1394 1.1 riastrad 1395 1.1 riastrad DPRINTF(sc, UATP_DEBUG_INTR, ("softc %p, ibuf %p, len %u\n", 1396 1.29 riastrad sc, ibuf, len)); 1397 1.1 riastrad 1398 1.1 riastrad /* 1399 1.1 riastrad * Some devices break packets up into chunks, so we accumulate 1400 1.1 riastrad * input up to the expected packet length, or if it would 1401 1.1 riastrad * overflow, discard the whole packet and start over. 1402 1.1 riastrad */ 1403 1.1 riastrad if (sc->sc_input_size < len) { 1404 1.1 riastrad aprint_error_dev(uatp_dev(sc), 1405 1.1 riastrad "discarding %u-byte input packet\n", len); 1406 1.1 riastrad sc->sc_input_index = 0; 1407 1.1 riastrad return; 1408 1.1 riastrad } else if (sc->sc_input_size < (sc->sc_input_index + len)) { 1409 1.1 riastrad aprint_error_dev(uatp_dev(sc), "discarding %u-byte input\n", 1410 1.1 riastrad (sc->sc_input_index + len)); 1411 1.1 riastrad sc->sc_input_index = 0; 1412 1.1 riastrad return; 1413 1.20 riastrad } else if (sc->sc_input_size == 81 && len == 17 && 1414 1.20 riastrad sc->sc_input_index != 64) { 1415 1.20 riastrad /* 1416 1.20 riastrad * Quirk of Fountain and Geyser 1 devices: a 17-byte 1417 1.20 riastrad * packet seems to mean the last one, but sometimes we 1418 1.20 riastrad * get desynchronized, so drop this one and start over 1419 1.20 riastrad * if we see a 17-byte packet that's not at the end. 1420 1.20 riastrad */ 1421 1.20 riastrad aprint_error_dev(uatp_dev(sc), 1422 1.20 riastrad "discarding 17-byte nonterminal input at %u\n", 1423 1.20 riastrad sc->sc_input_index); 1424 1.20 riastrad sc->sc_input_index = 0; 1425 1.20 riastrad return; 1426 1.1 riastrad } 1427 1.1 riastrad 1428 1.1 riastrad #if UATP_DEBUG 1429 1.1 riastrad if (sc->sc_debug_flags & UATP_DEBUG_INTR) { 1430 1.1 riastrad unsigned int i; 1431 1.1 riastrad uint8_t *bytes = ibuf; 1432 1.1 riastrad DPRINTF(sc, UATP_DEBUG_INTR, ("raw")); 1433 1.1 riastrad for (i = 0; i < len; i++) 1434 1.1 riastrad printf(" %02x", (unsigned int)bytes[i]); 1435 1.1 riastrad printf("\n"); 1436 1.1 riastrad } 1437 1.1 riastrad #endif 1438 1.1 riastrad 1439 1.1 riastrad memcpy(&sc->sc_input[sc->sc_input_index], ibuf, len); 1440 1.1 riastrad sc->sc_input_index += len; 1441 1.1 riastrad if (sc->sc_input_index != sc->sc_input_size) { 1442 1.1 riastrad /* Wait until packet is complete. */ 1443 1.21 riastrad DPRINTF(sc, UATP_DEBUG_INTR, ("partial packet: %u bytes\n", 1444 1.21 riastrad len)); 1445 1.1 riastrad return; 1446 1.1 riastrad } 1447 1.1 riastrad 1448 1.1 riastrad /* Clear the buffer and process the now complete packet. */ 1449 1.1 riastrad sc->sc_input_index = 0; 1450 1.1 riastrad input = sc->sc_input; 1451 1.1 riastrad 1452 1.1 riastrad /* The last byte's first bit is set iff the button is pressed. 1453 1.1 riastrad * XXX Left button should have a name. */ 1454 1.1 riastrad buttons = ((input[sc->sc_input_size - 1] & UATP_STATUS_BUTTON) 1455 1.1 riastrad ? 1 : 0); 1456 1.1 riastrad 1457 1.1 riastrad /* Read the sample. */ 1458 1.1 riastrad memset(uatp_x_sample(sc), 0, UATP_MAX_X_SENSORS); 1459 1.1 riastrad memset(uatp_y_sample(sc), 0, UATP_MAX_Y_SENSORS); 1460 1.1 riastrad sc->sc_parameters->read_sample(uatp_x_sample(sc), uatp_y_sample(sc), 1461 1.1 riastrad input); 1462 1.12 skrll 1463 1.1 riastrad #if UATP_DEBUG 1464 1.1 riastrad if (sc->sc_debug_flags & UATP_DEBUG_INTR) { 1465 1.1 riastrad unsigned int i; 1466 1.1 riastrad DPRINTF(sc, UATP_DEBUG_INTR, ("x sensors")); 1467 1.1 riastrad for (i = 0; i < uatp_x_sensors(sc); i++) 1468 1.1 riastrad printf(" %02x", (unsigned int)uatp_x_sample(sc)[i]); 1469 1.1 riastrad printf("\n"); 1470 1.1 riastrad DPRINTF(sc, UATP_DEBUG_INTR, ("y sensors")); 1471 1.1 riastrad for (i = 0; i < uatp_y_sensors(sc); i++) 1472 1.1 riastrad printf(" %02x", (unsigned int)uatp_y_sample(sc)[i]); 1473 1.1 riastrad printf("\n"); 1474 1.1 riastrad } else if ((sc->sc_debug_flags & UATP_DEBUG_STATUS) && 1475 1.1 riastrad (input[sc->sc_input_size - 1] &~ 1476 1.1 riastrad (UATP_STATUS_BUTTON | UATP_STATUS_BASE | 1477 1.1 riastrad UATP_STATUS_POST_RESET))) 1478 1.1 riastrad DPRINTF(sc, UATP_DEBUG_STATUS, ("status byte: %02x\n", 1479 1.1 riastrad input[sc->sc_input_size - 1])); 1480 1.1 riastrad #endif 1481 1.1 riastrad 1482 1.1 riastrad /* 1483 1.1 riastrad * If this is a base sample, initialize the state to interpret 1484 1.1 riastrad * subsequent samples relative to it, and stop here. 1485 1.1 riastrad */ 1486 1.1 riastrad if (sc->sc_parameters->base_sample(sc, input)) { 1487 1.1 riastrad DPRINTF(sc, UATP_DEBUG_PARSE, 1488 1.1 riastrad ("base sample, buttons %"PRIx32"\n", buttons)); 1489 1.1 riastrad /* XXX Should the valid bit ever be reset? */ 1490 1.1 riastrad sc->sc_status |= UATP_VALID; 1491 1.1 riastrad uatp_clear_position(sc); 1492 1.1 riastrad memcpy(sc->sc_base, sc->sc_sample, sizeof(sc->sc_base)); 1493 1.1 riastrad /* XXX Perform 17" size detection like Linux? */ 1494 1.1 riastrad return; 1495 1.1 riastrad } 1496 1.1 riastrad 1497 1.1 riastrad /* If not, accumulate the change in the sensors. */ 1498 1.1 riastrad sc->sc_parameters->accumulate(sc); 1499 1.1 riastrad 1500 1.1 riastrad #if UATP_DEBUG 1501 1.1 riastrad if (sc->sc_debug_flags & UATP_DEBUG_ACCUMULATE) { 1502 1.1 riastrad unsigned int i; 1503 1.1 riastrad DPRINTF(sc, UATP_DEBUG_ACCUMULATE, ("accumulated x state:")); 1504 1.1 riastrad for (i = 0; i < uatp_x_sensors(sc); i++) 1505 1.1 riastrad printf(" %02x", (unsigned int)uatp_x_acc(sc)[i]); 1506 1.1 riastrad printf("\n"); 1507 1.1 riastrad DPRINTF(sc, UATP_DEBUG_ACCUMULATE, ("accumulated y state:")); 1508 1.1 riastrad for (i = 0; i < uatp_y_sensors(sc); i++) 1509 1.1 riastrad printf(" %02x", (unsigned int)uatp_y_acc(sc)[i]); 1510 1.1 riastrad printf("\n"); 1511 1.1 riastrad } 1512 1.1 riastrad #endif 1513 1.1 riastrad 1514 1.1 riastrad /* Compute the change in coordinates and buttons. */ 1515 1.1 riastrad dx = dy = dz = dw = 0; 1516 1.1 riastrad if ((!interpret_input(sc, &dx, &dy, &dz, &dw, &buttons)) && 1517 1.1 riastrad /* If there's no input because we're releasing a button, 1518 1.1 riastrad * then it's not spurious. XXX Mutex? */ 1519 1.1 riastrad (sc->sc_buttons == 0)) { 1520 1.1 riastrad DPRINTF(sc, UATP_DEBUG_SPURINTR, ("spurious interrupt\n")); 1521 1.1 riastrad if (sc->sc_parameters->reset) 1522 1.1 riastrad sc->sc_parameters->reset(sc); 1523 1.1 riastrad return; 1524 1.1 riastrad } 1525 1.1 riastrad 1526 1.1 riastrad /* Report to wsmouse. */ 1527 1.1 riastrad DPRINTF(sc, UATP_DEBUG_INTR, 1528 1.1 riastrad ("buttons %"PRIx32", dx %d, dy %d, dz %d, dw %d\n", 1529 1.1 riastrad buttons, dx, dy, dz, dw)); 1530 1.1 riastrad mutex_enter(&sc->sc_tap_mutex); 1531 1.1 riastrad uatp_input(sc, buttons, dx, dy, dz, dw); 1532 1.1 riastrad mutex_exit(&sc->sc_tap_mutex); 1533 1.1 riastrad } 1534 1.12 skrll 1535 1.1 riastrad /* 1536 1.1 riastrad * Different ways to discern the base sample initializing the state. 1537 1.1 riastrad * `base_sample_softc_flag' uses a state flag stored in the softc; 1538 1.1 riastrad * `base_sample_input_flag' checks a flag at the end of the input 1539 1.1 riastrad * packet. 1540 1.1 riastrad */ 1541 1.1 riastrad 1542 1.1 riastrad static bool 1543 1.1 riastrad base_sample_softc_flag(const struct uatp_softc *sc, const uint8_t *input) 1544 1.1 riastrad { 1545 1.1 riastrad return !(sc->sc_status & UATP_VALID); 1546 1.1 riastrad } 1547 1.1 riastrad 1548 1.1 riastrad static bool 1549 1.1 riastrad base_sample_input_flag(const struct uatp_softc *sc, const uint8_t *input) 1550 1.1 riastrad { 1551 1.1 riastrad /* XXX Should we also check the valid flag? */ 1552 1.1 riastrad return !!(input[sc->sc_input_size - 1] & UATP_STATUS_BASE); 1553 1.1 riastrad } 1554 1.1 riastrad 1555 1.1 riastrad /* 1556 1.1 riastrad * Pick apart the horizontal sensors from the vertical sensors. 1557 1.1 riastrad * Different models interleave them in different orders. 1558 1.1 riastrad */ 1559 1.1 riastrad 1560 1.1 riastrad static void 1561 1.1 riastrad read_sample_1(uint8_t *x, uint8_t *y, const uint8_t *input) 1562 1.1 riastrad { 1563 1.1 riastrad unsigned int i; 1564 1.1 riastrad 1565 1.1 riastrad for (i = 0; i < 8; i++) { 1566 1.1 riastrad x[i] = input[5 * i + 2]; 1567 1.1 riastrad x[i + 8] = input[5 * i + 4]; 1568 1.1 riastrad x[i + 16] = input[5 * i + 42]; 1569 1.1 riastrad if (i < 2) 1570 1.1 riastrad x[i + 24] = input[5 * i + 44]; 1571 1.1 riastrad 1572 1.1 riastrad y[i] = input[5 * i + 1]; 1573 1.1 riastrad y[i + 8] = input[5 * i + 3]; 1574 1.1 riastrad } 1575 1.1 riastrad } 1576 1.1 riastrad 1577 1.1 riastrad static void 1578 1.1 riastrad read_sample_2(uint8_t *x, uint8_t *y, const uint8_t *input) 1579 1.1 riastrad { 1580 1.1 riastrad unsigned int i, j; 1581 1.1 riastrad 1582 1.1 riastrad for (i = 0, j = 19; i < 20; i += 2, j += 3) { 1583 1.1 riastrad x[i] = input[j]; 1584 1.1 riastrad x[i + 1] = input[j + 1]; 1585 1.1 riastrad } 1586 1.1 riastrad 1587 1.1 riastrad for (i = 0, j = 1; i < 9; i += 2, j += 3) { 1588 1.1 riastrad y[i] = input[j]; 1589 1.1 riastrad y[i + 1] = input[j + 1]; 1590 1.1 riastrad } 1591 1.1 riastrad } 1592 1.12 skrll 1593 1.1 riastrad static void 1594 1.1 riastrad accumulate_sample_1(struct uatp_softc *sc) 1595 1.1 riastrad { 1596 1.1 riastrad unsigned int i; 1597 1.1 riastrad 1598 1.1 riastrad for (i = 0; i < UATP_SENSORS; i++) { 1599 1.1 riastrad sc->sc_acc[i] += (int8_t)(sc->sc_sample[i] - sc->sc_base[i]); 1600 1.1 riastrad if (sc->sc_acc[i] < 0) { 1601 1.1 riastrad sc->sc_acc[i] = 0; 1602 1.1 riastrad } else if (UATP_MAX_ACC < sc->sc_acc[i]) { 1603 1.1 riastrad DPRINTF(sc, UATP_DEBUG_ACCUMULATE, 1604 1.1 riastrad ("overflow %d\n", sc->sc_acc[i])); 1605 1.1 riastrad sc->sc_acc[i] = UATP_MAX_ACC; 1606 1.1 riastrad } 1607 1.1 riastrad } 1608 1.1 riastrad 1609 1.1 riastrad memcpy(sc->sc_base, sc->sc_sample, sizeof(sc->sc_base)); 1610 1.1 riastrad } 1611 1.1 riastrad 1612 1.1 riastrad static void 1613 1.1 riastrad accumulate_sample_2(struct uatp_softc *sc) 1614 1.1 riastrad { 1615 1.1 riastrad unsigned int i; 1616 1.1 riastrad 1617 1.1 riastrad for (i = 0; i < UATP_SENSORS; i++) { 1618 1.1 riastrad sc->sc_acc[i] = (int8_t)(sc->sc_sample[i] - sc->sc_base[i]); 1619 1.1 riastrad if (sc->sc_acc[i] < -0x80) { 1620 1.1 riastrad DPRINTF(sc, UATP_DEBUG_ACCUMULATE, 1621 1.1 riastrad ("underflow %u - %u = %d\n", 1622 1.1 riastrad (unsigned int)sc->sc_sample[i], 1623 1.1 riastrad (unsigned int)sc->sc_base[i], 1624 1.1 riastrad sc->sc_acc[i])); 1625 1.1 riastrad sc->sc_acc[i] += 0x100; 1626 1.1 riastrad } 1627 1.1 riastrad if (0x7f < sc->sc_acc[i]) { 1628 1.1 riastrad DPRINTF(sc, UATP_DEBUG_ACCUMULATE, 1629 1.1 riastrad ("overflow %u - %u = %d\n", 1630 1.1 riastrad (unsigned int)sc->sc_sample[i], 1631 1.1 riastrad (unsigned int)sc->sc_base[i], 1632 1.1 riastrad sc->sc_acc[i])); 1633 1.1 riastrad sc->sc_acc[i] -= 0x100; 1634 1.1 riastrad } 1635 1.1 riastrad if (sc->sc_acc[i] < 0) 1636 1.1 riastrad sc->sc_acc[i] = 0; 1637 1.1 riastrad } 1638 1.1 riastrad } 1639 1.12 skrll 1640 1.1 riastrad /* 1641 1.1 riastrad * Report input to wsmouse, if there is anything interesting to report. 1642 1.1 riastrad * We must take into consideration the current tap-and-drag button 1643 1.1 riastrad * state. 1644 1.1 riastrad */ 1645 1.1 riastrad 1646 1.1 riastrad static void 1647 1.1 riastrad uatp_input(struct uatp_softc *sc, uint32_t buttons, 1648 1.1 riastrad int dx, int dy, int dz, int dw) 1649 1.1 riastrad { 1650 1.1 riastrad uint32_t all_buttons; 1651 1.1 riastrad 1652 1.1 riastrad KASSERT(mutex_owned(&sc->sc_tap_mutex)); 1653 1.1 riastrad all_buttons = buttons | uatp_tapped_buttons(sc); 1654 1.1 riastrad 1655 1.1 riastrad if ((sc->sc_wsmousedev != NULL) && 1656 1.1 riastrad ((dx != 0) || (dy != 0) || (dz != 0) || (dw != 0) || 1657 1.1 riastrad (all_buttons != sc->sc_all_buttons))) { 1658 1.1 riastrad int s = spltty(); 1659 1.1 riastrad DPRINTF(sc, UATP_DEBUG_WSMOUSE, ("wsmouse input:" 1660 1.1 riastrad " buttons %"PRIx32", dx %d, dy %d, dz %d, dw %d\n", 1661 1.1 riastrad all_buttons, dx, -dy, dz, -dw)); 1662 1.1 riastrad wsmouse_input(sc->sc_wsmousedev, all_buttons, dx, -dy, dz, -dw, 1663 1.1 riastrad WSMOUSE_INPUT_DELTA); 1664 1.1 riastrad splx(s); 1665 1.1 riastrad } 1666 1.1 riastrad sc->sc_buttons = buttons; 1667 1.1 riastrad sc->sc_all_buttons = all_buttons; 1668 1.1 riastrad } 1669 1.1 riastrad 1670 1.1 riastrad /* 1671 1.1 riastrad * Interpret the current tap state to decide whether the tap buttons 1672 1.1 riastrad * are currently pressed. 1673 1.1 riastrad */ 1674 1.1 riastrad 1675 1.1 riastrad static uint32_t 1676 1.1 riastrad uatp_tapped_buttons(struct uatp_softc *sc) 1677 1.1 riastrad { 1678 1.1 riastrad KASSERT(mutex_owned(&sc->sc_tap_mutex)); 1679 1.1 riastrad switch (sc->sc_tap_state) { 1680 1.1 riastrad case TAP_STATE_INITIAL: 1681 1.1 riastrad case TAP_STATE_TAPPING: 1682 1.1 riastrad return 0; 1683 1.1 riastrad 1684 1.1 riastrad case TAP_STATE_TAPPED: 1685 1.1 riastrad case TAP_STATE_DOUBLE_TAPPING: 1686 1.1 riastrad case TAP_STATE_DRAGGING_DOWN: 1687 1.1 riastrad case TAP_STATE_DRAGGING_UP: 1688 1.1 riastrad case TAP_STATE_TAPPING_IN_DRAG: 1689 1.1 riastrad CHECK((0 < sc->sc_tapped_fingers), return 0); 1690 1.1 riastrad switch (sc->sc_tapped_fingers) { 1691 1.1 riastrad case 1: return sc->sc_knobs.one_finger_tap_buttons; 1692 1.1 riastrad case 2: return sc->sc_knobs.two_finger_tap_buttons; 1693 1.1 riastrad case 3: 1694 1.1 riastrad default: return sc->sc_knobs.three_finger_tap_buttons; 1695 1.1 riastrad } 1696 1.1 riastrad 1697 1.1 riastrad default: 1698 1.1 riastrad aprint_error_dev(uatp_dev(sc), "%s: invalid tap state: %d\n", 1699 1.1 riastrad __func__, sc->sc_tap_state); 1700 1.1 riastrad return 0; 1701 1.1 riastrad } 1702 1.1 riastrad } 1703 1.12 skrll 1704 1.1 riastrad /* 1705 1.1 riastrad * Interpret the current input state to find a difference in all the 1706 1.1 riastrad * relevant coordinates and buttons to pass on to wsmouse, and update 1707 1.1 riastrad * any internal driver state necessary to interpret subsequent input 1708 1.1 riastrad * relative to this one. 1709 1.1 riastrad */ 1710 1.1 riastrad 1711 1.1 riastrad static bool 1712 1.1 riastrad interpret_input(struct uatp_softc *sc, int *dx, int *dy, int *dz, int *dw, 1713 1.1 riastrad uint32_t *buttons) 1714 1.1 riastrad { 1715 1.1 riastrad unsigned int x_pressure, x_raw, x_fingers; 1716 1.1 riastrad unsigned int y_pressure, y_raw, y_fingers; 1717 1.1 riastrad unsigned int fingers; 1718 1.1 riastrad 1719 1.1 riastrad x_pressure = interpret_dimension(sc, uatp_x_acc(sc), 1720 1.1 riastrad uatp_x_sensors(sc), uatp_x_ratio(sc), &x_raw, &x_fingers); 1721 1.1 riastrad y_pressure = interpret_dimension(sc, uatp_y_acc(sc), 1722 1.1 riastrad uatp_y_sensors(sc), uatp_y_ratio(sc), &y_raw, &y_fingers); 1723 1.1 riastrad 1724 1.1 riastrad DPRINTF(sc, UATP_DEBUG_PARSE, 1725 1.1 riastrad ("x %u @ %u, %uf; y %u @ %u, %uf; buttons %"PRIx32"\n", 1726 1.1 riastrad x_pressure, x_raw, x_fingers, 1727 1.1 riastrad y_pressure, y_raw, y_fingers, 1728 1.1 riastrad *buttons)); 1729 1.1 riastrad 1730 1.1 riastrad if ((x_pressure == 0) && (y_pressure == 0)) { 1731 1.1 riastrad bool ok; 1732 1.1 riastrad /* No fingers: clear position and maybe report a tap. */ 1733 1.1 riastrad DPRINTF(sc, UATP_DEBUG_INTR, 1734 1.1 riastrad ("no position detected; clearing position\n")); 1735 1.1 riastrad if (*buttons == 0) { 1736 1.1 riastrad ok = tap_released(sc); 1737 1.1 riastrad } else { 1738 1.1 riastrad tap_reset(sc); 1739 1.1 riastrad /* Button pressed: interrupt is not spurious. */ 1740 1.1 riastrad ok = true; 1741 1.1 riastrad } 1742 1.1 riastrad /* 1743 1.1 riastrad * Don't clear the position until after tap_released, 1744 1.1 riastrad * which needs to know the track distance. 1745 1.1 riastrad */ 1746 1.1 riastrad uatp_clear_position(sc); 1747 1.1 riastrad return ok; 1748 1.1 riastrad } else if ((x_pressure == 0) || (y_pressure == 0)) { 1749 1.1 riastrad /* XXX What to do here? */ 1750 1.1 riastrad DPRINTF(sc, UATP_DEBUG_INTR, 1751 1.1 riastrad ("pressure in only one dimension; ignoring\n")); 1752 1.1 riastrad return true; 1753 1.1 riastrad } else if ((x_pressure == 1) && (y_pressure == 1)) { 1754 1.18 riastrad fingers = uimax(x_fingers, y_fingers); 1755 1.1 riastrad CHECK((0 < fingers), return false); 1756 1.1 riastrad if (*buttons == 0) 1757 1.1 riastrad tap_touched(sc, fingers); 1758 1.1 riastrad else if (fingers == 1) 1759 1.1 riastrad tap_reset(sc); 1760 1.1 riastrad else /* Multiple fingers, button pressed. */ 1761 1.1 riastrad *buttons = emulated_buttons(sc, fingers); 1762 1.1 riastrad update_position(sc, fingers, x_raw, y_raw, dx, dy, dz, dw); 1763 1.1 riastrad return true; 1764 1.1 riastrad } else { 1765 1.1 riastrad /* Palm detected in either or both of the dimensions. */ 1766 1.1 riastrad DPRINTF(sc, UATP_DEBUG_INTR, ("palm detected; ignoring\n")); 1767 1.1 riastrad return true; 1768 1.1 riastrad } 1769 1.1 riastrad } 1770 1.12 skrll 1771 1.1 riastrad /* 1772 1.1 riastrad * Interpret the accumulated sensor state along one dimension to find 1773 1.1 riastrad * the number, mean position, and pressure of fingers. Returns 0 to 1774 1.1 riastrad * indicate no pressure, returns 1 and sets *position and *fingers to 1775 1.1 riastrad * indicate fingers, and returns 2 to indicate palm. 1776 1.1 riastrad * 1777 1.1 riastrad * XXX Give symbolic names to the return values. 1778 1.1 riastrad */ 1779 1.1 riastrad 1780 1.1 riastrad static unsigned int 1781 1.1 riastrad interpret_dimension(struct uatp_softc *sc, const int *acc, 1782 1.1 riastrad unsigned int n_sensors, unsigned int ratio, 1783 1.1 riastrad unsigned int *position, unsigned int *fingers) 1784 1.1 riastrad { 1785 1.1 riastrad unsigned int i, v, n_fingers, sum; 1786 1.1 riastrad unsigned int total[UATP_MAX_SENSORS]; 1787 1.1 riastrad unsigned int weighted[UATP_MAX_SENSORS]; 1788 1.1 riastrad unsigned int sensor_threshold = sc->sc_knobs.sensor_threshold; 1789 1.1 riastrad unsigned int sensor_normalizer = sc->sc_knobs.sensor_normalizer; 1790 1.1 riastrad unsigned int width = 0; /* GCC is not smart enough. */ 1791 1.1 riastrad unsigned int palm_width = sc->sc_knobs.palm_width; 1792 1.1 riastrad enum { none, nondecreasing, decreasing } state = none; 1793 1.1 riastrad 1794 1.1 riastrad if (sensor_threshold < sensor_normalizer) 1795 1.1 riastrad sensor_normalizer = sensor_threshold; 1796 1.1 riastrad if (palm_width == 0) /* Effectively disable palm detection. */ 1797 1.1 riastrad palm_width = UATP_MAX_POSITION; 1798 1.1 riastrad 1799 1.1 riastrad #define CHECK_(condition) CHECK(condition, return 0) 1800 1.1 riastrad 1801 1.1 riastrad /* 1802 1.1 riastrad * Arithmetic bounds: 1803 1.1 riastrad * . n_sensors is at most UATP_MAX_SENSORS, 1804 1.1 riastrad * . n_fingers is at most UATP_MAX_SENSORS, 1805 1.1 riastrad * . i is at most UATP_MAX_SENSORS, 1806 1.1 riastrad * . sc->sc_acc[i] is at most UATP_MAX_ACC, 1807 1.1 riastrad * . i * sc->sc_acc[i] is at most UATP_MAX_SENSORS * UATP_MAX_ACC, 1808 1.1 riastrad * . each total[j] is at most UATP_MAX_SENSORS * UATP_MAX_ACC, 1809 1.1 riastrad * . each weighted[j] is at most UATP_MAX_SENSORS^2 * UATP_MAX_ACC, 1810 1.1 riastrad * . ratio is at most UATP_MAX_RATIO, 1811 1.1 riastrad * . each weighted[j] * ratio is at most 1812 1.1 riastrad * UATP_MAX_SENSORS^2 * UATP_MAX_ACC * UATP_MAX_RATIO, 1813 1.1 riastrad * which is #x5fa0000 with the current values of the constants, 1814 1.1 riastrad * and 1815 1.1 riastrad * . the sum of the positions is at most 1816 1.1 riastrad * UATP_MAX_SENSORS * UATP_MAX_POSITION, 1817 1.1 riastrad * which is #x60000 with the current values of the constants. 1818 1.1 riastrad * Hence all of the arithmetic here fits in int (and thus also 1819 1.1 riastrad * unsigned int). If you change the constants, though, you 1820 1.1 riastrad * must update the analysis. 1821 1.1 riastrad */ 1822 1.1 riastrad __CTASSERT(0x5fa0000 == (UATP_MAX_SENSORS * UATP_MAX_SENSORS * 1823 1.1 riastrad UATP_MAX_ACC * UATP_MAX_RATIO)); 1824 1.1 riastrad __CTASSERT(0x60000 == (UATP_MAX_SENSORS * UATP_MAX_POSITION)); 1825 1.1 riastrad CHECK_(n_sensors <= UATP_MAX_SENSORS); 1826 1.1 riastrad CHECK_(ratio <= UATP_MAX_RATIO); 1827 1.1 riastrad 1828 1.1 riastrad /* 1829 1.1 riastrad * Detect each finger by looking for a consecutive sequence of 1830 1.1 riastrad * increasing and then decreasing pressures above the sensor 1831 1.1 riastrad * threshold. Compute the finger's position as the weighted 1832 1.1 riastrad * average of positions, weighted by the pressure at that 1833 1.1 riastrad * position. Finally, return the average finger position. 1834 1.1 riastrad */ 1835 1.1 riastrad 1836 1.1 riastrad n_fingers = 0; 1837 1.12 skrll memset(weighted, 0, sizeof(weighted)); 1838 1.12 skrll memset(total, 0, sizeof(total)); 1839 1.12 skrll 1840 1.1 riastrad for (i = 0; i < n_sensors; i++) { 1841 1.1 riastrad CHECK_(0 <= acc[i]); 1842 1.1 riastrad v = acc[i]; 1843 1.1 riastrad 1844 1.1 riastrad /* Ignore values outside a sensible interval. */ 1845 1.1 riastrad if (v <= sensor_threshold) { 1846 1.1 riastrad state = none; 1847 1.1 riastrad continue; 1848 1.1 riastrad } else if (UATP_MAX_ACC < v) { 1849 1.1 riastrad aprint_verbose_dev(uatp_dev(sc), 1850 1.1 riastrad "ignoring large accumulated sensor state: %u\n", 1851 1.1 riastrad v); 1852 1.1 riastrad continue; 1853 1.1 riastrad } 1854 1.1 riastrad 1855 1.1 riastrad switch (state) { 1856 1.1 riastrad case none: 1857 1.1 riastrad n_fingers += 1; 1858 1.1 riastrad CHECK_(n_fingers <= n_sensors); 1859 1.1 riastrad state = nondecreasing; 1860 1.1 riastrad width = 1; 1861 1.1 riastrad break; 1862 1.1 riastrad 1863 1.1 riastrad case nondecreasing: 1864 1.1 riastrad case decreasing: 1865 1.1 riastrad CHECK_(0 < i); 1866 1.1 riastrad CHECK_(0 <= acc[i - 1]); 1867 1.1 riastrad width += 1; 1868 1.1 riastrad if (palm_width <= (width * ratio)) { 1869 1.1 riastrad DPRINTF(sc, UATP_DEBUG_PALM, 1870 1.1 riastrad ("palm detected\n")); 1871 1.1 riastrad return 2; 1872 1.1 riastrad } else if ((state == nondecreasing) && 1873 1.1 riastrad ((unsigned int)acc[i - 1] > v)) { 1874 1.1 riastrad state = decreasing; 1875 1.1 riastrad } else if ((state == decreasing) && 1876 1.1 riastrad ((unsigned int)acc[i - 1] < v)) { 1877 1.1 riastrad n_fingers += 1; 1878 1.1 riastrad CHECK_(n_fingers <= n_sensors); 1879 1.1 riastrad state = nondecreasing; 1880 1.1 riastrad width = 1; 1881 1.1 riastrad } 1882 1.1 riastrad break; 1883 1.1 riastrad 1884 1.1 riastrad default: 1885 1.1 riastrad aprint_error_dev(uatp_dev(sc), 1886 1.1 riastrad "bad finger detection state: %d", state); 1887 1.1 riastrad return 0; 1888 1.1 riastrad } 1889 1.1 riastrad 1890 1.1 riastrad v -= sensor_normalizer; 1891 1.1 riastrad total[n_fingers - 1] += v; 1892 1.1 riastrad weighted[n_fingers - 1] += (i * v); 1893 1.1 riastrad CHECK_(total[n_fingers - 1] <= 1894 1.1 riastrad (UATP_MAX_SENSORS * UATP_MAX_ACC)); 1895 1.1 riastrad CHECK_(weighted[n_fingers - 1] <= 1896 1.1 riastrad (UATP_MAX_SENSORS * UATP_MAX_SENSORS * UATP_MAX_ACC)); 1897 1.1 riastrad } 1898 1.1 riastrad 1899 1.1 riastrad if (n_fingers == 0) 1900 1.1 riastrad return 0; 1901 1.1 riastrad 1902 1.1 riastrad sum = 0; 1903 1.1 riastrad for (i = 0; i < n_fingers; i++) { 1904 1.1 riastrad DPRINTF(sc, UATP_DEBUG_PARSE, 1905 1.1 riastrad ("finger at %u\n", ((weighted[i] * ratio) / total[i]))); 1906 1.1 riastrad sum += ((weighted[i] * ratio) / total[i]); 1907 1.1 riastrad CHECK_(sum <= UATP_MAX_SENSORS * UATP_MAX_POSITION); 1908 1.1 riastrad } 1909 1.1 riastrad 1910 1.1 riastrad *fingers = n_fingers; 1911 1.1 riastrad *position = (sum / n_fingers); 1912 1.1 riastrad return 1; 1913 1.1 riastrad 1914 1.1 riastrad #undef CHECK_ 1915 1.1 riastrad } 1916 1.12 skrll 1917 1.1 riastrad /* Tapping */ 1918 1.1 riastrad 1919 1.1 riastrad /* 1920 1.1 riastrad * There is a very hairy state machine for detecting taps. At every 1921 1.1 riastrad * touch, we record the maximum number of fingers touched, and don't 1922 1.1 riastrad * reset it to zero until the finger is released. 1923 1.1 riastrad * 1924 1.1 riastrad * INITIAL STATE 1925 1.1 riastrad * (no tapping fingers; no tapped fingers) 1926 1.1 riastrad * - On touch, go to TAPPING STATE. 1927 1.1 riastrad * - On any other input, remain in INITIAL STATE. 1928 1.1 riastrad * 1929 1.1 riastrad * TAPPING STATE: Finger touched; might be tap. 1930 1.1 riastrad * (tapping fingers; no tapped fingers) 1931 1.1 riastrad * - On release within the tap limit, go to TAPPED STATE. 1932 1.1 riastrad * - On release after the tap limit, go to INITIAL STATE. 1933 1.1 riastrad * - On any other input, remain in TAPPING STATE. 1934 1.1 riastrad * 1935 1.1 riastrad * TAPPED STATE: Finger recently tapped, and might double-tap. 1936 1.1 riastrad * (no tapping fingers; tapped fingers) 1937 1.1 riastrad * - On touch within the double-tap limit, go to DOUBLE-TAPPING STATE. 1938 1.1 riastrad * - On touch after the double-tap limit, go to TAPPING STATE. 1939 1.1 riastrad * - On no event after the double-tap limit, go to INITIAL STATE. 1940 1.1 riastrad * - On any other input, remain in TAPPED STATE. 1941 1.1 riastrad * 1942 1.1 riastrad * DOUBLE-TAPPING STATE: Finger touched soon after tap; might be double-tap. 1943 1.1 riastrad * (tapping fingers; tapped fingers) 1944 1.1 riastrad * - On release within the tap limit, release button and go to TAPPED STATE. 1945 1.1 riastrad * - On release after the tap limit, go to DRAGGING UP STATE. 1946 1.1 riastrad * - On touch after the tap limit, go to DRAGGING DOWN STATE. 1947 1.1 riastrad * - On any other input, remain in DOUBLE-TAPPING STATE. 1948 1.1 riastrad * 1949 1.1 riastrad * DRAGGING DOWN STATE: Finger has double-tapped and is dragging, not tapping. 1950 1.1 riastrad * (no tapping fingers; tapped fingers) 1951 1.1 riastrad * - On release, go to DRAGGING UP STATE. 1952 1.1 riastrad * - On any other input, remain in DRAGGING DOWN STATE. 1953 1.1 riastrad * 1954 1.1 riastrad * DRAGGING UP STATE: Finger has double-tapped and is up. 1955 1.1 riastrad * (no tapping fingers; tapped fingers) 1956 1.1 riastrad * - On touch, go to TAPPING IN DRAG STATE. 1957 1.1 riastrad * - On any other input, remain in DRAGGING UP STATE. 1958 1.1 riastrad * 1959 1.1 riastrad * TAPPING IN DRAG STATE: Tap-dancing while cross-dressed. 1960 1.1 riastrad * (tapping fingers; tapped fingers) 1961 1.1 riastrad * - On release within the tap limit, go to TAPPED STATE. 1962 1.1 riastrad * - On release after the tap limit, go to DRAGGING UP STATE. 1963 1.1 riastrad * - On any other input, remain in TAPPING IN DRAG STATE. 1964 1.1 riastrad * 1965 1.1 riastrad * Warning: The graph of states is split into two components, those 1966 1.1 riastrad * with tapped fingers and those without. The only path from any state 1967 1.1 riastrad * without tapped fingers to a state with tapped fingers must pass 1968 1.1 riastrad * through TAPPED STATE. Also, the only transitions into TAPPED STATE 1969 1.1 riastrad * must be from states with tapping fingers, which become the tapped 1970 1.1 riastrad * fingers. If you edit the state machine, you must either preserve 1971 1.1 riastrad * these properties, or globally transform the state machine to avoid 1972 1.1 riastrad * the bad consequences of violating these properties. 1973 1.1 riastrad */ 1974 1.12 skrll 1975 1.1 riastrad static void 1976 1.1 riastrad uatp_tap_limit(const struct uatp_softc *sc, struct timeval *limit) 1977 1.1 riastrad { 1978 1.1 riastrad unsigned int msec = sc->sc_knobs.tap_limit_msec; 1979 1.1 riastrad limit->tv_sec = 0; 1980 1.1 riastrad limit->tv_usec = ((msec < 1000) ? (1000 * msec) : 100000); 1981 1.1 riastrad } 1982 1.1 riastrad 1983 1.1 riastrad #if UATP_DEBUG 1984 1.1 riastrad 1985 1.1 riastrad # define TAP_DEBUG_PRE(sc) tap_debug((sc), __func__, "") 1986 1.1 riastrad # define TAP_DEBUG_POST(sc) tap_debug((sc), __func__, " ->") 1987 1.1 riastrad 1988 1.1 riastrad static void 1989 1.1 riastrad tap_debug(struct uatp_softc *sc, const char *caller, const char *prefix) 1990 1.1 riastrad { 1991 1.1 riastrad char buffer[128]; 1992 1.1 riastrad const char *state; 1993 1.1 riastrad 1994 1.1 riastrad KASSERT(mutex_owned(&sc->sc_tap_mutex)); 1995 1.1 riastrad switch (sc->sc_tap_state) { 1996 1.1 riastrad case TAP_STATE_INITIAL: state = "initial"; break; 1997 1.1 riastrad case TAP_STATE_TAPPING: state = "tapping"; break; 1998 1.1 riastrad case TAP_STATE_TAPPED: state = "tapped"; break; 1999 1.1 riastrad case TAP_STATE_DOUBLE_TAPPING: state = "double-tapping"; break; 2000 1.1 riastrad case TAP_STATE_DRAGGING_DOWN: state = "dragging-down"; break; 2001 1.1 riastrad case TAP_STATE_DRAGGING_UP: state = "dragging-up"; break; 2002 1.1 riastrad case TAP_STATE_TAPPING_IN_DRAG: state = "tapping-in-drag"; break; 2003 1.1 riastrad default: 2004 1.12 skrll snprintf(buffer, sizeof(buffer), "unknown (%d)", 2005 1.1 riastrad sc->sc_tap_state); 2006 1.1 riastrad state = buffer; 2007 1.1 riastrad break; 2008 1.1 riastrad } 2009 1.1 riastrad 2010 1.1 riastrad DPRINTF(sc, UATP_DEBUG_TAP, 2011 1.1 riastrad ("%s:%s state %s, %u tapping, %u tapped\n", 2012 1.1 riastrad caller, prefix, state, 2013 1.1 riastrad sc->sc_tapping_fingers, sc->sc_tapped_fingers)); 2014 1.1 riastrad } 2015 1.1 riastrad 2016 1.1 riastrad #else /* !UATP_DEBUG */ 2017 1.1 riastrad 2018 1.1 riastrad # define TAP_DEBUG_PRE(sc) do {} while (0) 2019 1.1 riastrad # define TAP_DEBUG_POST(sc) do {} while (0) 2020 1.1 riastrad 2021 1.1 riastrad #endif 2022 1.12 skrll 2023 1.1 riastrad static void 2024 1.1 riastrad tap_initialize(struct uatp_softc *sc) 2025 1.1 riastrad { 2026 1.11 mrg callout_init(&sc->sc_untap_callout, 0); 2027 1.1 riastrad callout_setfunc(&sc->sc_untap_callout, untap_callout, sc); 2028 1.12 skrll mutex_init(&sc->sc_tap_mutex, MUTEX_DEFAULT, IPL_SOFTUSB); 2029 1.1 riastrad } 2030 1.1 riastrad 2031 1.1 riastrad static void 2032 1.1 riastrad tap_finalize(struct uatp_softc *sc) 2033 1.1 riastrad { 2034 1.1 riastrad /* XXX Can the callout still be scheduled here? */ 2035 1.1 riastrad callout_destroy(&sc->sc_untap_callout); 2036 1.1 riastrad mutex_destroy(&sc->sc_tap_mutex); 2037 1.1 riastrad } 2038 1.1 riastrad 2039 1.1 riastrad static void 2040 1.1 riastrad tap_enable(struct uatp_softc *sc) 2041 1.1 riastrad { 2042 1.1 riastrad mutex_enter(&sc->sc_tap_mutex); 2043 1.1 riastrad tap_transition_initial(sc); 2044 1.1 riastrad sc->sc_buttons = 0; /* XXX Not the right place? */ 2045 1.1 riastrad sc->sc_all_buttons = 0; 2046 1.1 riastrad mutex_exit(&sc->sc_tap_mutex); 2047 1.1 riastrad } 2048 1.1 riastrad 2049 1.1 riastrad static void 2050 1.1 riastrad tap_disable(struct uatp_softc *sc) 2051 1.1 riastrad { 2052 1.1 riastrad /* Reset tapping, and wait for any callouts to complete. */ 2053 1.1 riastrad tap_reset_wait(sc); 2054 1.1 riastrad } 2055 1.1 riastrad 2056 1.1 riastrad /* 2057 1.1 riastrad * Reset tap state. If the untap callout has just fired, it may signal 2058 1.1 riastrad * a harmless button release event before this returns. 2059 1.1 riastrad */ 2060 1.1 riastrad 2061 1.1 riastrad static void 2062 1.1 riastrad tap_reset(struct uatp_softc *sc) 2063 1.1 riastrad { 2064 1.14 riastrad 2065 1.1 riastrad callout_stop(&sc->sc_untap_callout); 2066 1.1 riastrad mutex_enter(&sc->sc_tap_mutex); 2067 1.1 riastrad tap_transition_initial(sc); 2068 1.1 riastrad mutex_exit(&sc->sc_tap_mutex); 2069 1.1 riastrad } 2070 1.1 riastrad 2071 1.1 riastrad /* Reset, but don't return until the callout is done running. */ 2072 1.1 riastrad 2073 1.1 riastrad static void 2074 1.1 riastrad tap_reset_wait(struct uatp_softc *sc) 2075 1.1 riastrad { 2076 1.1 riastrad 2077 1.14 riastrad callout_halt(&sc->sc_untap_callout, NULL); 2078 1.1 riastrad mutex_enter(&sc->sc_tap_mutex); 2079 1.1 riastrad tap_transition_initial(sc); 2080 1.1 riastrad mutex_exit(&sc->sc_tap_mutex); 2081 1.1 riastrad } 2082 1.12 skrll 2083 1.1 riastrad static const struct timeval zero_timeval; 2084 1.1 riastrad 2085 1.1 riastrad static void 2086 1.1 riastrad tap_transition(struct uatp_softc *sc, enum uatp_tap_state tap_state, 2087 1.1 riastrad const struct timeval *start_time, 2088 1.1 riastrad unsigned int tapping_fingers, unsigned int tapped_fingers) 2089 1.1 riastrad { 2090 1.1 riastrad KASSERT(mutex_owned(&sc->sc_tap_mutex)); 2091 1.1 riastrad sc->sc_tap_state = tap_state; 2092 1.1 riastrad sc->sc_tap_timer = *start_time; 2093 1.1 riastrad sc->sc_tapping_fingers = tapping_fingers; 2094 1.1 riastrad sc->sc_tapped_fingers = tapped_fingers; 2095 1.1 riastrad } 2096 1.1 riastrad 2097 1.1 riastrad static void 2098 1.1 riastrad tap_transition_initial(struct uatp_softc *sc) 2099 1.1 riastrad { 2100 1.1 riastrad /* 2101 1.1 riastrad * No checks. This state is always kosher, and sometimes a 2102 1.1 riastrad * fallback in case of failure. 2103 1.1 riastrad */ 2104 1.1 riastrad tap_transition(sc, TAP_STATE_INITIAL, &zero_timeval, 0, 0); 2105 1.1 riastrad } 2106 1.1 riastrad 2107 1.1 riastrad /* Touch transitions */ 2108 1.1 riastrad 2109 1.1 riastrad static void 2110 1.1 riastrad tap_transition_tapping(struct uatp_softc *sc, const struct timeval *start_time, 2111 1.1 riastrad unsigned int fingers) 2112 1.1 riastrad { 2113 1.1 riastrad CHECK((sc->sc_tapping_fingers <= fingers), 2114 1.1 riastrad do { tap_transition_initial(sc); return; } while (0)); 2115 1.1 riastrad tap_transition(sc, TAP_STATE_TAPPING, start_time, fingers, 0); 2116 1.1 riastrad } 2117 1.1 riastrad 2118 1.1 riastrad static void 2119 1.1 riastrad tap_transition_double_tapping(struct uatp_softc *sc, 2120 1.1 riastrad const struct timeval *start_time, unsigned int fingers) 2121 1.1 riastrad { 2122 1.1 riastrad CHECK((sc->sc_tapping_fingers <= fingers), 2123 1.1 riastrad do { tap_transition_initial(sc); return; } while (0)); 2124 1.1 riastrad CHECK((0 < sc->sc_tapped_fingers), 2125 1.1 riastrad do { tap_transition_initial(sc); return; } while (0)); 2126 1.1 riastrad tap_transition(sc, TAP_STATE_DOUBLE_TAPPING, start_time, fingers, 2127 1.1 riastrad sc->sc_tapped_fingers); 2128 1.1 riastrad } 2129 1.12 skrll 2130 1.1 riastrad static void 2131 1.1 riastrad tap_transition_dragging_down(struct uatp_softc *sc) 2132 1.1 riastrad { 2133 1.1 riastrad CHECK((0 < sc->sc_tapped_fingers), 2134 1.1 riastrad do { tap_transition_initial(sc); return; } while (0)); 2135 1.1 riastrad tap_transition(sc, TAP_STATE_DRAGGING_DOWN, &zero_timeval, 0, 2136 1.1 riastrad sc->sc_tapped_fingers); 2137 1.1 riastrad } 2138 1.1 riastrad 2139 1.1 riastrad static void 2140 1.1 riastrad tap_transition_tapping_in_drag(struct uatp_softc *sc, 2141 1.1 riastrad const struct timeval *start_time, unsigned int fingers) 2142 1.1 riastrad { 2143 1.1 riastrad CHECK((sc->sc_tapping_fingers <= fingers), 2144 1.1 riastrad do { tap_transition_initial(sc); return; } while (0)); 2145 1.1 riastrad CHECK((0 < sc->sc_tapped_fingers), 2146 1.1 riastrad do { tap_transition_initial(sc); return; } while (0)); 2147 1.1 riastrad tap_transition(sc, TAP_STATE_TAPPING_IN_DRAG, start_time, fingers, 2148 1.1 riastrad sc->sc_tapped_fingers); 2149 1.1 riastrad } 2150 1.1 riastrad 2151 1.1 riastrad /* Release transitions */ 2152 1.1 riastrad 2153 1.1 riastrad static void 2154 1.1 riastrad tap_transition_tapped(struct uatp_softc *sc, const struct timeval *start_time) 2155 1.1 riastrad { 2156 1.1 riastrad /* 2157 1.1 riastrad * The fingers that were tapping -- of which there must have 2158 1.1 riastrad * been at least one -- are now the fingers that have tapped, 2159 1.1 riastrad * and there are no longer fingers tapping. 2160 1.1 riastrad */ 2161 1.1 riastrad CHECK((0 < sc->sc_tapping_fingers), 2162 1.1 riastrad do { tap_transition_initial(sc); return; } while (0)); 2163 1.1 riastrad tap_transition(sc, TAP_STATE_TAPPED, start_time, 0, 2164 1.1 riastrad sc->sc_tapping_fingers); 2165 1.1 riastrad schedule_untap(sc); 2166 1.1 riastrad } 2167 1.1 riastrad 2168 1.1 riastrad static void 2169 1.1 riastrad tap_transition_dragging_up(struct uatp_softc *sc) 2170 1.1 riastrad { 2171 1.1 riastrad CHECK((0 < sc->sc_tapped_fingers), 2172 1.1 riastrad do { tap_transition_initial(sc); return; } while (0)); 2173 1.1 riastrad tap_transition(sc, TAP_STATE_DRAGGING_UP, &zero_timeval, 0, 2174 1.1 riastrad sc->sc_tapped_fingers); 2175 1.1 riastrad } 2176 1.12 skrll 2177 1.1 riastrad static void 2178 1.1 riastrad tap_touched(struct uatp_softc *sc, unsigned int fingers) 2179 1.1 riastrad { 2180 1.1 riastrad struct timeval now, diff, limit; 2181 1.1 riastrad 2182 1.1 riastrad CHECK((0 < fingers), return); 2183 1.1 riastrad callout_stop(&sc->sc_untap_callout); 2184 1.1 riastrad mutex_enter(&sc->sc_tap_mutex); 2185 1.1 riastrad TAP_DEBUG_PRE(sc); 2186 1.1 riastrad /* 2187 1.1 riastrad * Guarantee that the number of tapping fingers never decreases 2188 1.1 riastrad * except when it is reset to zero on release. 2189 1.1 riastrad */ 2190 1.1 riastrad if (fingers < sc->sc_tapping_fingers) 2191 1.1 riastrad fingers = sc->sc_tapping_fingers; 2192 1.1 riastrad switch (sc->sc_tap_state) { 2193 1.1 riastrad case TAP_STATE_INITIAL: 2194 1.1 riastrad getmicrouptime(&now); 2195 1.1 riastrad tap_transition_tapping(sc, &now, fingers); 2196 1.1 riastrad break; 2197 1.1 riastrad 2198 1.1 riastrad case TAP_STATE_TAPPING: 2199 1.1 riastrad /* 2200 1.1 riastrad * Number of fingers may have increased, so transition 2201 1.1 riastrad * even though we're already in TAPPING. 2202 1.1 riastrad */ 2203 1.1 riastrad tap_transition_tapping(sc, &sc->sc_tap_timer, fingers); 2204 1.1 riastrad break; 2205 1.1 riastrad 2206 1.1 riastrad case TAP_STATE_TAPPED: 2207 1.1 riastrad getmicrouptime(&now); 2208 1.1 riastrad /* 2209 1.1 riastrad * If the double-tap time limit has passed, it's the 2210 1.1 riastrad * callout's responsibility to handle that event, so we 2211 1.1 riastrad * assume the limit has not passed yet. 2212 1.1 riastrad */ 2213 1.1 riastrad tap_transition_double_tapping(sc, &now, fingers); 2214 1.1 riastrad break; 2215 1.1 riastrad 2216 1.1 riastrad case TAP_STATE_DOUBLE_TAPPING: 2217 1.1 riastrad getmicrouptime(&now); 2218 1.1 riastrad timersub(&now, &sc->sc_tap_timer, &diff); 2219 1.1 riastrad uatp_tap_limit(sc, &limit); 2220 1.1 riastrad if (timercmp(&diff, &limit, >) || 2221 1.1 riastrad (sc->sc_track_distance > 2222 1.1 riastrad sc->sc_knobs.tap_track_distance_limit)) 2223 1.1 riastrad tap_transition_dragging_down(sc); 2224 1.1 riastrad break; 2225 1.1 riastrad 2226 1.1 riastrad case TAP_STATE_DRAGGING_DOWN: 2227 1.1 riastrad break; 2228 1.1 riastrad 2229 1.1 riastrad case TAP_STATE_DRAGGING_UP: 2230 1.1 riastrad getmicrouptime(&now); 2231 1.1 riastrad tap_transition_tapping_in_drag(sc, &now, fingers); 2232 1.1 riastrad break; 2233 1.1 riastrad 2234 1.1 riastrad case TAP_STATE_TAPPING_IN_DRAG: 2235 1.1 riastrad /* 2236 1.1 riastrad * Number of fingers may have increased, so transition 2237 1.1 riastrad * even though we're already in TAPPING IN DRAG. 2238 1.1 riastrad */ 2239 1.1 riastrad tap_transition_tapping_in_drag(sc, &sc->sc_tap_timer, fingers); 2240 1.1 riastrad break; 2241 1.1 riastrad 2242 1.1 riastrad default: 2243 1.1 riastrad aprint_error_dev(uatp_dev(sc), "%s: invalid tap state: %d\n", 2244 1.1 riastrad __func__, sc->sc_tap_state); 2245 1.1 riastrad tap_transition_initial(sc); 2246 1.1 riastrad break; 2247 1.1 riastrad } 2248 1.1 riastrad TAP_DEBUG_POST(sc); 2249 1.1 riastrad mutex_exit(&sc->sc_tap_mutex); 2250 1.1 riastrad } 2251 1.12 skrll 2252 1.1 riastrad static bool 2253 1.1 riastrad tap_released(struct uatp_softc *sc) 2254 1.1 riastrad { 2255 1.1 riastrad struct timeval now, diff, limit; 2256 1.1 riastrad void (*non_tapped_transition)(struct uatp_softc *); 2257 1.1 riastrad bool ok, temporary_release; 2258 1.1 riastrad 2259 1.1 riastrad mutex_enter(&sc->sc_tap_mutex); 2260 1.1 riastrad TAP_DEBUG_PRE(sc); 2261 1.1 riastrad switch (sc->sc_tap_state) { 2262 1.1 riastrad case TAP_STATE_INITIAL: 2263 1.1 riastrad case TAP_STATE_TAPPED: 2264 1.1 riastrad case TAP_STATE_DRAGGING_UP: 2265 1.1 riastrad /* Spurious interrupt: fingers are already off. */ 2266 1.1 riastrad ok = false; 2267 1.1 riastrad break; 2268 1.1 riastrad 2269 1.1 riastrad case TAP_STATE_TAPPING: 2270 1.1 riastrad temporary_release = false; 2271 1.1 riastrad non_tapped_transition = &tap_transition_initial; 2272 1.1 riastrad goto maybe_tap; 2273 1.1 riastrad 2274 1.1 riastrad case TAP_STATE_DOUBLE_TAPPING: 2275 1.1 riastrad temporary_release = true; 2276 1.1 riastrad non_tapped_transition = &tap_transition_dragging_up; 2277 1.1 riastrad goto maybe_tap; 2278 1.1 riastrad 2279 1.1 riastrad case TAP_STATE_TAPPING_IN_DRAG: 2280 1.1 riastrad temporary_release = false; 2281 1.1 riastrad non_tapped_transition = &tap_transition_dragging_up; 2282 1.1 riastrad goto maybe_tap; 2283 1.1 riastrad 2284 1.1 riastrad maybe_tap: 2285 1.1 riastrad getmicrouptime(&now); 2286 1.1 riastrad timersub(&now, &sc->sc_tap_timer, &diff); 2287 1.1 riastrad uatp_tap_limit(sc, &limit); 2288 1.1 riastrad if (timercmp(&diff, &limit, <=) && 2289 1.1 riastrad (sc->sc_track_distance <= 2290 1.1 riastrad sc->sc_knobs.tap_track_distance_limit)) { 2291 1.1 riastrad if (temporary_release) { 2292 1.1 riastrad /* 2293 1.1 riastrad * XXX Kludge: Temporarily transition 2294 1.1 riastrad * to a tap state that uatp_input will 2295 1.1 riastrad * interpret as `no buttons tapped', 2296 1.1 riastrad * saving the tapping fingers. There 2297 1.1 riastrad * should instead be a separate routine 2298 1.1 riastrad * uatp_input_untapped. 2299 1.1 riastrad */ 2300 1.1 riastrad unsigned int fingers = sc->sc_tapping_fingers; 2301 1.1 riastrad tap_transition_initial(sc); 2302 1.1 riastrad uatp_input(sc, 0, 0, 0, 0, 0); 2303 1.1 riastrad sc->sc_tapping_fingers = fingers; 2304 1.1 riastrad } 2305 1.1 riastrad tap_transition_tapped(sc, &now); 2306 1.1 riastrad } else { 2307 1.1 riastrad (*non_tapped_transition)(sc); 2308 1.1 riastrad } 2309 1.1 riastrad ok = true; 2310 1.1 riastrad break; 2311 1.1 riastrad 2312 1.1 riastrad case TAP_STATE_DRAGGING_DOWN: 2313 1.1 riastrad tap_transition_dragging_up(sc); 2314 1.1 riastrad ok = true; 2315 1.1 riastrad break; 2316 1.1 riastrad 2317 1.1 riastrad default: 2318 1.1 riastrad aprint_error_dev(uatp_dev(sc), "%s: invalid tap state: %d\n", 2319 1.1 riastrad __func__, sc->sc_tap_state); 2320 1.1 riastrad tap_transition_initial(sc); 2321 1.1 riastrad ok = false; 2322 1.1 riastrad break; 2323 1.1 riastrad } 2324 1.1 riastrad TAP_DEBUG_POST(sc); 2325 1.1 riastrad mutex_exit(&sc->sc_tap_mutex); 2326 1.1 riastrad return ok; 2327 1.1 riastrad } 2328 1.12 skrll 2329 1.1 riastrad /* Untapping: Releasing the button after a tap */ 2330 1.1 riastrad 2331 1.1 riastrad static void 2332 1.1 riastrad schedule_untap(struct uatp_softc *sc) 2333 1.1 riastrad { 2334 1.1 riastrad unsigned int ms = sc->sc_knobs.double_tap_limit_msec; 2335 1.1 riastrad if (ms <= 1000) 2336 1.1 riastrad callout_schedule(&sc->sc_untap_callout, mstohz(ms)); 2337 1.1 riastrad else /* XXX Reject bogus values in sysctl. */ 2338 1.1 riastrad aprint_error_dev(uatp_dev(sc), 2339 1.1 riastrad "double-tap delay too long: %ums\n", ms); 2340 1.1 riastrad } 2341 1.1 riastrad 2342 1.1 riastrad static void 2343 1.1 riastrad untap_callout(void *arg) 2344 1.1 riastrad { 2345 1.1 riastrad struct uatp_softc *sc = arg; 2346 1.1 riastrad 2347 1.1 riastrad mutex_enter(&sc->sc_tap_mutex); 2348 1.1 riastrad TAP_DEBUG_PRE(sc); 2349 1.1 riastrad switch (sc->sc_tap_state) { 2350 1.1 riastrad case TAP_STATE_TAPPED: 2351 1.1 riastrad tap_transition_initial(sc); 2352 1.1 riastrad /* 2353 1.1 riastrad * XXX Kludge: Call uatp_input after the state transition 2354 1.1 riastrad * to make sure that it will actually release the button. 2355 1.1 riastrad */ 2356 1.1 riastrad uatp_input(sc, 0, 0, 0, 0, 0); 2357 1.1 riastrad 2358 1.1 riastrad case TAP_STATE_INITIAL: 2359 1.1 riastrad case TAP_STATE_TAPPING: 2360 1.1 riastrad case TAP_STATE_DOUBLE_TAPPING: 2361 1.1 riastrad case TAP_STATE_DRAGGING_UP: 2362 1.1 riastrad case TAP_STATE_DRAGGING_DOWN: 2363 1.1 riastrad case TAP_STATE_TAPPING_IN_DRAG: 2364 1.1 riastrad /* 2365 1.1 riastrad * Somebody else got in and changed the state before we 2366 1.1 riastrad * untapped. Let them take over; do nothing here. 2367 1.1 riastrad */ 2368 1.1 riastrad break; 2369 1.1 riastrad 2370 1.1 riastrad default: 2371 1.1 riastrad aprint_error_dev(uatp_dev(sc), "%s: invalid tap state: %d\n", 2372 1.1 riastrad __func__, sc->sc_tap_state); 2373 1.1 riastrad tap_transition_initial(sc); 2374 1.1 riastrad /* XXX Just in case...? */ 2375 1.1 riastrad uatp_input(sc, 0, 0, 0, 0, 0); 2376 1.1 riastrad break; 2377 1.1 riastrad } 2378 1.1 riastrad TAP_DEBUG_POST(sc); 2379 1.1 riastrad mutex_exit(&sc->sc_tap_mutex); 2380 1.1 riastrad } 2381 1.12 skrll 2382 1.1 riastrad /* 2383 1.1 riastrad * Emulate different buttons if the user holds down n fingers while 2384 1.1 riastrad * pressing the physical button. (This is unrelated to tapping.) 2385 1.1 riastrad */ 2386 1.1 riastrad 2387 1.1 riastrad static uint32_t 2388 1.1 riastrad emulated_buttons(struct uatp_softc *sc, unsigned int fingers) 2389 1.1 riastrad { 2390 1.1 riastrad CHECK((1 < fingers), return 0); 2391 1.1 riastrad 2392 1.1 riastrad switch (fingers) { 2393 1.1 riastrad case 2: 2394 1.1 riastrad DPRINTF(sc, UATP_DEBUG_EMUL_BUTTON, 2395 1.1 riastrad ("2-finger emulated button: %"PRIx32"\n", 2396 1.1 riastrad sc->sc_knobs.two_finger_buttons)); 2397 1.1 riastrad return sc->sc_knobs.two_finger_buttons; 2398 1.1 riastrad 2399 1.1 riastrad case 3: 2400 1.1 riastrad default: 2401 1.1 riastrad DPRINTF(sc, UATP_DEBUG_EMUL_BUTTON, 2402 1.1 riastrad ("3-finger emulated button: %"PRIx32"\n", 2403 1.1 riastrad sc->sc_knobs.three_finger_buttons)); 2404 1.1 riastrad return sc->sc_knobs.three_finger_buttons; 2405 1.1 riastrad } 2406 1.1 riastrad } 2407 1.12 skrll 2408 1.1 riastrad /* 2409 1.1 riastrad * Update the position known to the driver based on the position and 2410 1.1 riastrad * number of fingers. dx, dy, dz, and dw are expected to hold zero; 2411 1.1 riastrad * update_position may store nonzero changes in position in them. 2412 1.1 riastrad */ 2413 1.1 riastrad 2414 1.1 riastrad static void 2415 1.1 riastrad update_position(struct uatp_softc *sc, unsigned int fingers, 2416 1.1 riastrad unsigned int x_raw, unsigned int y_raw, 2417 1.1 riastrad int *dx, int *dy, int *dz, int *dw) 2418 1.1 riastrad { 2419 1.1 riastrad CHECK((0 < fingers), return); 2420 1.1 riastrad 2421 1.1 riastrad if ((fingers == 1) || (sc->sc_knobs.multifinger_track == 1)) 2422 1.1 riastrad move_mouse(sc, x_raw, y_raw, dx, dy); 2423 1.1 riastrad else if (sc->sc_knobs.multifinger_track == 2) 2424 1.1 riastrad scroll_wheel(sc, x_raw, y_raw, dz, dw); 2425 1.1 riastrad } 2426 1.1 riastrad 2427 1.1 riastrad /* 2428 1.1 riastrad * XXX Scrolling needs to use a totally different motion model. 2429 1.1 riastrad */ 2430 1.1 riastrad 2431 1.1 riastrad static void 2432 1.1 riastrad move_mouse(struct uatp_softc *sc, unsigned int x_raw, unsigned int y_raw, 2433 1.1 riastrad int *dx, int *dy) 2434 1.1 riastrad { 2435 1.1 riastrad move(sc, "mouse", x_raw, y_raw, &sc->sc_x_raw, &sc->sc_y_raw, 2436 1.1 riastrad &sc->sc_x_smoothed, &sc->sc_y_smoothed, 2437 1.1 riastrad &sc->sc_x_remainder, &sc->sc_y_remainder, 2438 1.1 riastrad dx, dy); 2439 1.1 riastrad } 2440 1.1 riastrad 2441 1.1 riastrad static void 2442 1.1 riastrad scroll_wheel(struct uatp_softc *sc, unsigned int x_raw, unsigned int y_raw, 2443 1.1 riastrad int *dz, int *dw) 2444 1.1 riastrad { 2445 1.1 riastrad move(sc, "scroll", x_raw, y_raw, &sc->sc_z_raw, &sc->sc_w_raw, 2446 1.1 riastrad &sc->sc_z_smoothed, &sc->sc_w_smoothed, 2447 1.1 riastrad &sc->sc_z_remainder, &sc->sc_w_remainder, 2448 1.1 riastrad dz, dw); 2449 1.1 riastrad } 2450 1.12 skrll 2451 1.1 riastrad static void 2452 1.1 riastrad move(struct uatp_softc *sc, const char *ctx, unsigned int a, unsigned int b, 2453 1.1 riastrad int *a_raw, int *b_raw, 2454 1.1 riastrad int *a_smoothed, int *b_smoothed, 2455 1.1 riastrad unsigned int *a_remainder, unsigned int *b_remainder, 2456 1.1 riastrad int *da, int *db) 2457 1.1 riastrad { 2458 1.1 riastrad #define CHECK_(condition) CHECK(condition, return) 2459 1.1 riastrad 2460 1.1 riastrad int old_a_raw = *a_raw, old_a_smoothed = *a_smoothed; 2461 1.1 riastrad int old_b_raw = *b_raw, old_b_smoothed = *b_smoothed; 2462 1.1 riastrad unsigned int a_dist, b_dist, dist_squared; 2463 1.1 riastrad bool a_fast, b_fast; 2464 1.1 riastrad 2465 1.1 riastrad /* 2466 1.1 riastrad * Make sure the quadratics in motion_below_threshold and 2467 1.1 riastrad * tracking distance don't overflow int arithmetic. 2468 1.1 riastrad */ 2469 1.1 riastrad __CTASSERT(0x12000000 == (2 * UATP_MAX_POSITION * UATP_MAX_POSITION)); 2470 1.1 riastrad 2471 1.1 riastrad CHECK_(a <= UATP_MAX_POSITION); 2472 1.1 riastrad CHECK_(b <= UATP_MAX_POSITION); 2473 1.1 riastrad *a_raw = a; 2474 1.1 riastrad *b_raw = b; 2475 1.1 riastrad if ((old_a_raw < 0) || (old_b_raw < 0)) { 2476 1.1 riastrad DPRINTF(sc, UATP_DEBUG_MOVE, 2477 1.1 riastrad ("initialize %s position (%d, %d) -> (%d, %d)\n", ctx, 2478 1.1 riastrad old_a_raw, old_b_raw, a, b)); 2479 1.1 riastrad return; 2480 1.1 riastrad } 2481 1.1 riastrad 2482 1.1 riastrad if ((old_a_smoothed < 0) || (old_b_smoothed < 0)) { 2483 1.1 riastrad /* XXX Does this make sense? */ 2484 1.1 riastrad old_a_smoothed = old_a_raw; 2485 1.1 riastrad old_b_smoothed = old_b_raw; 2486 1.1 riastrad } 2487 1.1 riastrad 2488 1.1 riastrad CHECK_(0 <= old_a_raw); 2489 1.1 riastrad CHECK_(0 <= old_b_raw); 2490 1.1 riastrad CHECK_(old_a_raw <= UATP_MAX_POSITION); 2491 1.1 riastrad CHECK_(old_b_raw <= UATP_MAX_POSITION); 2492 1.1 riastrad CHECK_(0 <= old_a_smoothed); 2493 1.1 riastrad CHECK_(0 <= old_b_smoothed); 2494 1.1 riastrad CHECK_(old_a_smoothed <= UATP_MAX_POSITION); 2495 1.1 riastrad CHECK_(old_b_smoothed <= UATP_MAX_POSITION); 2496 1.1 riastrad CHECK_(0 <= *a_raw); 2497 1.1 riastrad CHECK_(0 <= *b_raw); 2498 1.1 riastrad CHECK_(*a_raw <= UATP_MAX_POSITION); 2499 1.1 riastrad CHECK_(*b_raw <= UATP_MAX_POSITION); 2500 1.1 riastrad *a_smoothed = smooth(sc, old_a_raw, old_a_smoothed, *a_raw); 2501 1.1 riastrad *b_smoothed = smooth(sc, old_b_raw, old_b_smoothed, *b_raw); 2502 1.1 riastrad CHECK_(0 <= *a_smoothed); 2503 1.1 riastrad CHECK_(0 <= *b_smoothed); 2504 1.1 riastrad CHECK_(*a_smoothed <= UATP_MAX_POSITION); 2505 1.1 riastrad CHECK_(*b_smoothed <= UATP_MAX_POSITION); 2506 1.12 skrll 2507 1.1 riastrad if (sc->sc_motion_timer < sc->sc_knobs.motion_delay) { 2508 1.1 riastrad DPRINTF(sc, UATP_DEBUG_MOVE, ("delay motion %u\n", 2509 1.1 riastrad sc->sc_motion_timer)); 2510 1.1 riastrad sc->sc_motion_timer += 1; 2511 1.1 riastrad return; 2512 1.1 riastrad } 2513 1.1 riastrad 2514 1.1 riastrad /* XXX Use raw distances or smoothed distances? Acceleration? */ 2515 1.1 riastrad if (*a_smoothed < old_a_smoothed) 2516 1.1 riastrad a_dist = old_a_smoothed - *a_smoothed; 2517 1.1 riastrad else 2518 1.1 riastrad a_dist = *a_smoothed - old_a_smoothed; 2519 1.1 riastrad 2520 1.1 riastrad if (*b_smoothed < old_b_smoothed) 2521 1.1 riastrad b_dist = old_b_smoothed - *b_smoothed; 2522 1.1 riastrad else 2523 1.1 riastrad b_dist = *b_smoothed - old_b_smoothed; 2524 1.1 riastrad 2525 1.1 riastrad dist_squared = (a_dist * a_dist) + (b_dist * b_dist); 2526 1.1 riastrad if (dist_squared < ((2 * UATP_MAX_POSITION * UATP_MAX_POSITION) 2527 1.1 riastrad - sc->sc_track_distance)) 2528 1.1 riastrad sc->sc_track_distance += dist_squared; 2529 1.1 riastrad else 2530 1.1 riastrad sc->sc_track_distance = (2 * UATP_MAX_POSITION * 2531 1.1 riastrad UATP_MAX_POSITION); 2532 1.1 riastrad DPRINTF(sc, UATP_DEBUG_TRACK_DIST, ("finger has tracked %u units^2\n", 2533 1.1 riastrad sc->sc_track_distance)); 2534 1.1 riastrad 2535 1.1 riastrad /* 2536 1.1 riastrad * The checks above guarantee that the differences here are at 2537 1.1 riastrad * most UATP_MAX_POSITION in magnitude, since both minuend and 2538 1.1 riastrad * subtrahend are nonnegative and at most UATP_MAX_POSITION. 2539 1.1 riastrad */ 2540 1.1 riastrad if (motion_below_threshold(sc, sc->sc_knobs.motion_threshold, 2541 1.1 riastrad (int)(*a_smoothed - old_a_smoothed), 2542 1.1 riastrad (int)(*b_smoothed - old_b_smoothed))) { 2543 1.1 riastrad DPRINTF(sc, UATP_DEBUG_MOVE, 2544 1.1 riastrad ("%s motion too small: (%d, %d) -> (%d, %d)\n", ctx, 2545 1.1 riastrad old_a_smoothed, old_b_smoothed, 2546 1.1 riastrad *a_smoothed, *b_smoothed)); 2547 1.1 riastrad return; 2548 1.1 riastrad } 2549 1.1 riastrad if (sc->sc_knobs.fast_per_direction == 0) { 2550 1.1 riastrad a_fast = b_fast = !motion_below_threshold(sc, 2551 1.1 riastrad sc->sc_knobs.fast_motion_threshold, 2552 1.1 riastrad (int)(*a_smoothed - old_a_smoothed), 2553 1.1 riastrad (int)(*b_smoothed - old_b_smoothed)); 2554 1.1 riastrad } else { 2555 1.1 riastrad a_fast = !motion_below_threshold(sc, 2556 1.1 riastrad sc->sc_knobs.fast_motion_threshold, 2557 1.1 riastrad (int)(*a_smoothed - old_a_smoothed), 2558 1.1 riastrad 0); 2559 1.1 riastrad b_fast = !motion_below_threshold(sc, 2560 1.1 riastrad sc->sc_knobs.fast_motion_threshold, 2561 1.1 riastrad 0, 2562 1.1 riastrad (int)(*b_smoothed - old_b_smoothed)); 2563 1.1 riastrad } 2564 1.1 riastrad *da = accelerate(sc, old_a_raw, *a_raw, old_a_smoothed, *a_smoothed, 2565 1.1 riastrad a_fast, a_remainder); 2566 1.1 riastrad *db = accelerate(sc, old_b_raw, *b_raw, old_b_smoothed, *b_smoothed, 2567 1.1 riastrad b_fast, b_remainder); 2568 1.1 riastrad DPRINTF(sc, UATP_DEBUG_MOVE, 2569 1.1 riastrad ("update %s position (%d, %d) -> (%d, %d), move by (%d, %d)\n", 2570 1.1 riastrad ctx, old_a_smoothed, old_b_smoothed, *a_smoothed, *b_smoothed, 2571 1.1 riastrad *da, *db)); 2572 1.1 riastrad 2573 1.1 riastrad #undef CHECK_ 2574 1.1 riastrad } 2575 1.12 skrll 2576 1.1 riastrad static int 2577 1.1 riastrad smooth(struct uatp_softc *sc, unsigned int old_raw, unsigned int old_smoothed, 2578 1.1 riastrad unsigned int raw) 2579 1.1 riastrad { 2580 1.1 riastrad #define CHECK_(condition) CHECK(condition, return old_raw) 2581 1.1 riastrad 2582 1.1 riastrad /* 2583 1.1 riastrad * Arithmetic bounds: 2584 1.1 riastrad * . the weights are at most UATP_MAX_WEIGHT; 2585 1.1 riastrad * . the positions are at most UATP_MAX_POSITION; and so 2586 1.1 riastrad * . the numerator of the average is at most 2587 1.1 riastrad * 3 * UATP_MAX_WEIGHT * UATP_MAX_POSITION, 2588 1.1 riastrad * which is #x477000, fitting comfortably in an int. 2589 1.1 riastrad */ 2590 1.1 riastrad __CTASSERT(0x477000 == (3 * UATP_MAX_WEIGHT * UATP_MAX_POSITION)); 2591 1.1 riastrad unsigned int old_raw_weight = uatp_old_raw_weight(sc); 2592 1.1 riastrad unsigned int old_smoothed_weight = uatp_old_smoothed_weight(sc); 2593 1.1 riastrad unsigned int new_raw_weight = uatp_new_raw_weight(sc); 2594 1.1 riastrad CHECK_(old_raw_weight <= UATP_MAX_WEIGHT); 2595 1.1 riastrad CHECK_(old_smoothed_weight <= UATP_MAX_WEIGHT); 2596 1.1 riastrad CHECK_(new_raw_weight <= UATP_MAX_WEIGHT); 2597 1.1 riastrad CHECK_(old_raw <= UATP_MAX_POSITION); 2598 1.1 riastrad CHECK_(old_smoothed <= UATP_MAX_POSITION); 2599 1.1 riastrad CHECK_(raw <= UATP_MAX_POSITION); 2600 1.1 riastrad return (((old_raw_weight * old_raw) + 2601 1.1 riastrad (old_smoothed_weight * old_smoothed) + 2602 1.1 riastrad (new_raw_weight * raw)) 2603 1.1 riastrad / (old_raw_weight + old_smoothed_weight + new_raw_weight)); 2604 1.1 riastrad 2605 1.1 riastrad #undef CHECK_ 2606 1.1 riastrad } 2607 1.1 riastrad 2608 1.1 riastrad static bool 2609 1.1 riastrad motion_below_threshold(struct uatp_softc *sc, unsigned int threshold, 2610 1.1 riastrad int x, int y) 2611 1.1 riastrad { 2612 1.1 riastrad unsigned int x_squared, y_squared; 2613 1.1 riastrad 2614 1.1 riastrad /* Caller guarantees the multiplication will not overflow. */ 2615 1.1 riastrad KASSERT(-UATP_MAX_POSITION <= x); 2616 1.1 riastrad KASSERT(-UATP_MAX_POSITION <= y); 2617 1.1 riastrad KASSERT(x <= UATP_MAX_POSITION); 2618 1.1 riastrad KASSERT(y <= UATP_MAX_POSITION); 2619 1.1 riastrad __CTASSERT(0x12000000 == (2 * UATP_MAX_POSITION * UATP_MAX_POSITION)); 2620 1.1 riastrad 2621 1.1 riastrad x_squared = (x * x); 2622 1.1 riastrad y_squared = (y * y); 2623 1.1 riastrad 2624 1.19 skrll return (x_squared + y_squared) < threshold; 2625 1.1 riastrad } 2626 1.1 riastrad 2627 1.1 riastrad static int 2628 1.1 riastrad accelerate(struct uatp_softc *sc, unsigned int old_raw, unsigned int raw, 2629 1.1 riastrad unsigned int old_smoothed, unsigned int smoothed, bool fast, 2630 1.1 riastrad int *remainder) 2631 1.1 riastrad { 2632 1.1 riastrad #define CHECK_(condition) CHECK(condition, return 0) 2633 1.1 riastrad 2634 1.1 riastrad /* Guarantee that the scaling won't overflow. */ 2635 1.1 riastrad __CTASSERT(0x30000 == 2636 1.1 riastrad (UATP_MAX_POSITION * UATP_MAX_MOTION_MULTIPLIER)); 2637 1.1 riastrad 2638 1.1 riastrad CHECK_(old_raw <= UATP_MAX_POSITION); 2639 1.1 riastrad CHECK_(raw <= UATP_MAX_POSITION); 2640 1.1 riastrad CHECK_(old_smoothed <= UATP_MAX_POSITION); 2641 1.1 riastrad CHECK_(smoothed <= UATP_MAX_POSITION); 2642 1.1 riastrad 2643 1.1 riastrad return (fast ? uatp_scale_fast_motion : uatp_scale_motion) 2644 1.1 riastrad (sc, (((int) smoothed) - ((int) old_smoothed)), remainder); 2645 1.1 riastrad 2646 1.1 riastrad #undef CHECK_ 2647 1.1 riastrad } 2648 1.12 skrll 2649 1.9 riastrad MODULE(MODULE_CLASS_DRIVER, uatp, NULL); 2650 1.9 riastrad 2651 1.9 riastrad #ifdef _MODULE 2652 1.9 riastrad #include "ioconf.c" 2653 1.9 riastrad #endif 2654 1.9 riastrad 2655 1.9 riastrad static int 2656 1.9 riastrad uatp_modcmd(modcmd_t cmd, void *aux) 2657 1.9 riastrad { 2658 1.9 riastrad int error = 0; 2659 1.9 riastrad 2660 1.9 riastrad switch (cmd) { 2661 1.9 riastrad case MODULE_CMD_INIT: 2662 1.9 riastrad #ifdef _MODULE 2663 1.9 riastrad error = config_init_component(cfdriver_ioconf_uatp, 2664 1.9 riastrad cfattach_ioconf_uatp, cfdata_ioconf_uatp); 2665 1.9 riastrad #endif 2666 1.9 riastrad return error; 2667 1.9 riastrad case MODULE_CMD_FINI: 2668 1.9 riastrad #ifdef _MODULE 2669 1.9 riastrad error = config_fini_component(cfdriver_ioconf_uatp, 2670 1.9 riastrad cfattach_ioconf_uatp, cfdata_ioconf_uatp); 2671 1.9 riastrad #endif 2672 1.9 riastrad return error; 2673 1.9 riastrad default: 2674 1.9 riastrad return ENOTTY; 2675 1.9 riastrad } 2676 1.9 riastrad } 2677