adb_mouse.c (187893) | adb_mouse.c (199888) |
---|---|
1/*- 2 * Copyright (C) 2008 Nathan Whitehorn 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 8 unchanged lines hidden (view full) --- 17 * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 18 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 20 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 21 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 22 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 23 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 * | 1/*- 2 * Copyright (C) 2008 Nathan Whitehorn 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 8 unchanged lines hidden (view full) --- 17 * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 18 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 20 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 21 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 22 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 23 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 * |
25 * $FreeBSD: head/sys/dev/adb/adb_mouse.c 187893 2009-01-29 16:18:49Z jhb $ | 25 * $FreeBSD: head/sys/dev/adb/adb_mouse.c 199888 2009-11-28 17:48:25Z nwhitehorn $ |
26 */ 27 28#include <sys/cdefs.h> 29#include <sys/param.h> 30#include <sys/systm.h> 31#include <sys/module.h> 32#include <sys/bus.h> 33#include <sys/conf.h> 34#include <sys/mouse.h> 35#include <sys/poll.h> 36#include <sys/condvar.h> 37#include <sys/selinfo.h> | 26 */ 27 28#include <sys/cdefs.h> 29#include <sys/param.h> 30#include <sys/systm.h> 31#include <sys/module.h> 32#include <sys/bus.h> 33#include <sys/conf.h> 34#include <sys/mouse.h> 35#include <sys/poll.h> 36#include <sys/condvar.h> 37#include <sys/selinfo.h> |
38#include <sys/sysctl.h> |
|
38#include <sys/uio.h> 39#include <sys/fcntl.h> 40#include <sys/kernel.h> 41 42#include <machine/bus.h> 43 44#include <vm/vm.h> 45#include <vm/pmap.h> 46 47#include "adb.h" 48 49#define CDEV_GET_SOFTC(x) (x)->si_drv1 50 51static int adb_mouse_probe(device_t dev); 52static int adb_mouse_attach(device_t dev); 53static int adb_mouse_detach(device_t dev); | 39#include <sys/uio.h> 40#include <sys/fcntl.h> 41#include <sys/kernel.h> 42 43#include <machine/bus.h> 44 45#include <vm/vm.h> 46#include <vm/pmap.h> 47 48#include "adb.h" 49 50#define CDEV_GET_SOFTC(x) (x)->si_drv1 51 52static int adb_mouse_probe(device_t dev); 53static int adb_mouse_attach(device_t dev); 54static int adb_mouse_detach(device_t dev); |
55static void adb_init_trackpad(device_t dev); 56static int adb_tapping_sysctl(SYSCTL_HANDLER_ARGS); |
|
54 55static d_open_t ams_open; 56static d_close_t ams_close; 57static d_read_t ams_read; 58static d_ioctl_t ams_ioctl; 59static d_poll_t ams_poll; 60 61static u_int adb_mouse_receive_packet(device_t dev, u_char status, --- 10 unchanged lines hidden (view full) --- 72#define AMS_TOUCHPAD 0x2 73 uint16_t dpi; 74 75 mousehw_t hw; 76 mousemode_t mode; 77 u_char id[4]; 78 79 int buttons; | 57 58static d_open_t ams_open; 59static d_close_t ams_close; 60static d_read_t ams_read; 61static d_ioctl_t ams_ioctl; 62static d_poll_t ams_poll; 63 64static u_int adb_mouse_receive_packet(device_t dev, u_char status, --- 10 unchanged lines hidden (view full) --- 75#define AMS_TOUCHPAD 0x2 76 uint16_t dpi; 77 78 mousehw_t hw; 79 mousemode_t mode; 80 u_char id[4]; 81 82 int buttons; |
83 u_int sc_tapping; 84 int button_buf; |
|
80 int last_buttons; 81 int xdelta, ydelta; 82 83 int8_t packet[8]; 84 size_t packet_read_len; 85 86 struct cdev *cdev; 87 struct selinfo rsel; --- 74 unchanged lines hidden (view full) --- 162 sc->mode.protocol = MOUSE_PROTO_SYSMOUSE; 163 sc->mode.rate = -1; 164 sc->mode.resolution = 100; 165 sc->mode.accelfactor = 0; 166 sc->mode.level = 0; 167 sc->mode.packetsize = 5; 168 169 sc->buttons = 0; | 85 int last_buttons; 86 int xdelta, ydelta; 87 88 int8_t packet[8]; 89 size_t packet_read_len; 90 91 struct cdev *cdev; 92 struct selinfo rsel; --- 74 unchanged lines hidden (view full) --- 167 sc->mode.protocol = MOUSE_PROTO_SYSMOUSE; 168 sc->mode.rate = -1; 169 sc->mode.resolution = 100; 170 sc->mode.accelfactor = 0; 171 sc->mode.level = 0; 172 sc->mode.packetsize = 5; 173 174 sc->buttons = 0; |
175 sc->sc_tapping = 0; 176 sc->button_buf = 0; |
|
170 sc->last_buttons = 0; 171 sc->packet_read_len = 0; 172 173 /* Try to switch to extended protocol */ 174 adb_set_device_handler(dev,4); 175 176 switch(adb_get_device_handler(dev)) { 177 case 1: --- 22 unchanged lines hidden (view full) --- 200 break; 201 case 2: 202 sc->hw.type = MOUSE_TRACKBALL; 203 description = "Trackball"; 204 break; 205 case 3: 206 sc->flags |= AMS_TOUCHPAD; 207 sc->hw.type = MOUSE_PAD; | 177 sc->last_buttons = 0; 178 sc->packet_read_len = 0; 179 180 /* Try to switch to extended protocol */ 181 adb_set_device_handler(dev,4); 182 183 switch(adb_get_device_handler(dev)) { 184 case 1: --- 22 unchanged lines hidden (view full) --- 207 break; 208 case 2: 209 sc->hw.type = MOUSE_TRACKBALL; 210 description = "Trackball"; 211 break; 212 case 3: 213 sc->flags |= AMS_TOUCHPAD; 214 sc->hw.type = MOUSE_PAD; |
215 adb_init_trackpad(dev); |
|
208 description = "Touchpad"; 209 break; 210 } 211 212 sc->hw.buttons = r1[7]; 213 214 device_printf(dev,"%d-button %d-dpi %s\n", 215 sc->hw.buttons, sc->mode.resolution,description); --- 38 unchanged lines hidden (view full) --- 254 destroy_dev(sc->cdev); 255 256 mtx_destroy(&sc->sc_mtx); 257 cv_destroy(&sc->sc_cv); 258 259 return (0); 260} 261 | 216 description = "Touchpad"; 217 break; 218 } 219 220 sc->hw.buttons = r1[7]; 221 222 device_printf(dev,"%d-button %d-dpi %s\n", 223 sc->hw.buttons, sc->mode.resolution,description); --- 38 unchanged lines hidden (view full) --- 262 destroy_dev(sc->cdev); 263 264 mtx_destroy(&sc->sc_mtx); 265 cv_destroy(&sc->sc_cv); 266 267 return (0); 268} 269 |
270static void 271adb_init_trackpad(device_t dev) 272{ 273 struct adb_mouse_softc *sc; 274 struct sysctl_ctx_list *ctx; 275 struct sysctl_oid *tree; 276 277 size_t r1_len; 278 u_char r1[8]; 279 u_char r2[8]; 280 281 sc = device_get_softc(dev); 282 283 r1_len = adb_read_register(dev, 1, r1); 284 285 /* An Extended Mouse register1 must return 8 bytes. */ 286 if (r1_len != 8) 287 return; 288 289 if((r1[6] != 0x0d)) 290 { 291 r1[6] = 0x0d; 292 293 adb_write_register(dev, 1, 8, r1); 294 295 r1_len = adb_read_register(dev, 1, r1); 296 297 if (r1[6] != 0x0d) 298 { 299 device_printf(dev, "ADB Mouse = 0x%x " 300 "(non-Extended Mode)\n", r1[6]); 301 return; 302 } else { 303 device_printf(dev, "ADB Mouse = 0x%x " 304 "(Extended Mode)\n", r1[6]); 305 306 /* Set ADB Extended Features to default values, 307 enabled. */ 308 r2[0] = 0x19; /* Clicking: 0x19 disabled 0x99 enabled */ 309 r2[1] = 0x94; /* Dragging: 0x14 disabled 0x94 enabled */ 310 r2[2] = 0x19; 311 r2[3] = 0xff; /* DragLock: 0xff disabled 0xb2 enabled */ 312 r2[4] = 0xb2; 313 r2[5] = 0x8a; 314 r2[6] = 0x1b; 315 316 r2[7] = 0x57; /* 0x57 bits 3:0 for W mode */ 317 318 adb_write_register(dev, 2, 8, r2); 319 320 } 321 } 322 323 /* 324 * Set up sysctl 325 */ 326 ctx = device_get_sysctl_ctx(dev); 327 tree = device_get_sysctl_tree(dev); 328 SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, "tapping", 329 CTLTYPE_INT | CTLFLAG_RW, sc, 0, adb_tapping_sysctl, 330 "I", "Tapping the pad causes button events"); 331 return; 332} 333 |
|
262static u_int 263adb_mouse_receive_packet(device_t dev, u_char status, u_char command, 264 u_char reg, int len, u_char *data) 265{ 266 struct adb_mouse_softc *sc; 267 int i = 0; 268 int xdelta, ydelta; | 334static u_int 335adb_mouse_receive_packet(device_t dev, u_char status, u_char command, 336 u_char reg, int len, u_char *data) 337{ 338 struct adb_mouse_softc *sc; 339 int i = 0; 340 int xdelta, ydelta; |
269 int buttons; | 341 int buttons, tmp_buttons; |
270 271 sc = device_get_softc(dev); 272 273 if (command != ADB_COMMAND_TALK || reg != 0 || len < 2) 274 return (0); 275 276 ydelta = data[0] & 0x7f; 277 xdelta = data[1] & 0x7f; --- 15 unchanged lines hidden (view full) --- 293 } 294 295 /* Do sign extension as necessary */ 296 if (xdelta & (0x40 << 3*(len-2))) 297 xdelta |= 0xffffffc0 << 3*(len - 2); 298 if (ydelta & (0x40 << 3*(len-2))) 299 ydelta |= 0xffffffc0 << 3*(len - 2); 300 | 342 343 sc = device_get_softc(dev); 344 345 if (command != ADB_COMMAND_TALK || reg != 0 || len < 2) 346 return (0); 347 348 ydelta = data[0] & 0x7f; 349 xdelta = data[1] & 0x7f; --- 15 unchanged lines hidden (view full) --- 365 } 366 367 /* Do sign extension as necessary */ 368 if (xdelta & (0x40 << 3*(len-2))) 369 xdelta |= 0xffffffc0 << 3*(len - 2); 370 if (ydelta & (0x40 << 3*(len-2))) 371 ydelta |= 0xffffffc0 << 3*(len - 2); 372 |
373 if ((sc->flags & AMS_TOUCHPAD) && (sc->sc_tapping == 1)) { 374 tmp_buttons = buttons; 375 if (buttons == 0x12) { 376 /* Map a double tap on button 3. 377 Keep the button state for the next sequence. 378 A double tap sequence is followed by a single tap 379 sequence. 380 */ 381 tmp_buttons = 0x3; 382 sc->button_buf = tmp_buttons; 383 } else if (buttons == 0x2) { 384 /* Map a single tap on button 2. But only if it is 385 not a successor from a double tap. 386 */ 387 if (sc->button_buf != 0x3) 388 tmp_buttons = 0x2; 389 else 390 tmp_buttons = 0; 391 392 sc->button_buf = 0; 393 } 394 buttons = tmp_buttons; 395 } 396 |
|
301 /* 302 * Some mice report high-numbered buttons on the wrong button number, 303 * so set the highest-numbered real button as pressed if there are 304 * mysterious high-numbered ones set. 305 * 306 * Don't do this for touchpads, because touchpads also trigger 307 * high button events when they are touched. 308 */ --- 240 unchanged lines hidden (view full) --- 549 break; } 550 default: 551 return ENOTTY; 552 } 553 554 return (0); 555} 556 | 397 /* 398 * Some mice report high-numbered buttons on the wrong button number, 399 * so set the highest-numbered real button as pressed if there are 400 * mysterious high-numbered ones set. 401 * 402 * Don't do this for touchpads, because touchpads also trigger 403 * high button events when they are touched. 404 */ --- 240 unchanged lines hidden (view full) --- 645 break; } 646 default: 647 return ENOTTY; 648 } 649 650 return (0); 651} 652 |
653static int 654adb_tapping_sysctl(SYSCTL_HANDLER_ARGS) 655{ 656 struct adb_mouse_softc *sc = arg1; 657 device_t dev; 658 int error; 659 u_char r2[8]; 660 u_int tapping; 661 662 dev = sc->sc_dev; 663 tapping = sc->sc_tapping; 664 665 error = sysctl_handle_int(oidp, &tapping, 0, req); 666 667 if (error || !req->newptr) 668 return (error); 669 670 if (tapping == 1) { 671 adb_read_register(dev, 2, r2); 672 r2[0] = 0x99; /* enable tapping. */ 673 adb_write_register(dev, 2, 8, r2); 674 sc->sc_tapping = 1; 675 } else if (tapping == 0) { 676 adb_read_register(dev, 2, r2); 677 r2[0] = 0x19; /* disable tapping. */ 678 adb_write_register(dev, 2, 8, r2); 679 sc->sc_tapping = 0; 680 } 681 else 682 return (EINVAL); 683 684 return (0); 685} |
|