Deleted Added
full compact
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}