1 1.43 rin /* $NetBSD: ms.c,v 1.43 2022/08/01 01:32:15 rin Exp $ */ 2 1.5 cgd 3 1.1 mw /* 4 1.1 mw * based on: 5 1.1 mw * 6 1.1 mw * Copyright (c) 1992, 1993 7 1.1 mw * The Regents of the University of California. All rights reserved. 8 1.1 mw * 9 1.1 mw * This software was developed by the Computer Systems Engineering group 10 1.1 mw * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and 11 1.1 mw * contributed to Berkeley. 12 1.1 mw * 13 1.1 mw * All advertising materials mentioning features or use of this software 14 1.1 mw * must display the following acknowledgement: 15 1.1 mw * This product includes software developed by the University of 16 1.1 mw * California, Lawrence Berkeley Laboratory. 17 1.1 mw * 18 1.1 mw * Redistribution and use in source and binary forms, with or without 19 1.1 mw * modification, are permitted provided that the following conditions 20 1.1 mw * are met: 21 1.1 mw * 1. Redistributions of source code must retain the above copyright 22 1.1 mw * notice, this list of conditions and the following disclaimer. 23 1.1 mw * 2. Redistributions in binary form must reproduce the above copyright 24 1.1 mw * notice, this list of conditions and the following disclaimer in the 25 1.1 mw * documentation and/or other materials provided with the distribution. 26 1.26 agc * 3. Neither the name of the University nor the names of its contributors 27 1.1 mw * may be used to endorse or promote products derived from this software 28 1.1 mw * without specific prior written permission. 29 1.1 mw * 30 1.1 mw * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 31 1.1 mw * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 32 1.1 mw * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 33 1.1 mw * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 34 1.1 mw * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 35 1.1 mw * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 36 1.1 mw * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 37 1.1 mw * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 38 1.1 mw * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 39 1.1 mw * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 40 1.1 mw * SUCH DAMAGE. 41 1.1 mw * 42 1.1 mw * @(#)ms.c 8.1 (Berkeley) 6/11/93 43 1.1 mw * 44 1.5 cgd * Header: ms.c,v 1.5 92/11/26 01:28:47 torek Exp (LBL) 45 1.1 mw */ 46 1.20 aymeric 47 1.20 aymeric #include <sys/cdefs.h> 48 1.43 rin __KERNEL_RCSID(0, "$NetBSD: ms.c,v 1.43 2022/08/01 01:32:15 rin Exp $"); 49 1.1 mw 50 1.1 mw /* 51 1.1 mw * Mouse driver. 52 1.28 jandberg * 53 1.28 jandberg * wscons aware. Attaches two wsmouse devices, one for each port. 54 1.28 jandberg * Also still exports its own device entry points so it is possible 55 1.28 jandberg * to open this and read firm_events. 56 1.28 jandberg * The events go only to one place at a time: 57 1.28 jandberg * - When somebody has opened a ms device directly wsmouse cannot be activated. 58 1.28 jandberg * (when wsmouse is opened it calls ms_enable to activate) 59 1.28 jandberg * - When feeding events to wsmouse open of ms device will fail. 60 1.1 mw */ 61 1.1 mw 62 1.28 jandberg #include "wsmouse.h" 63 1.28 jandberg 64 1.2 chopps #include <sys/param.h> 65 1.9 is #include <sys/device.h> 66 1.2 chopps #include <sys/ioctl.h> 67 1.2 chopps #include <sys/kernel.h> 68 1.2 chopps #include <sys/proc.h> 69 1.2 chopps #include <sys/syslog.h> 70 1.2 chopps #include <sys/systm.h> 71 1.16 thorpej #include <sys/callout.h> 72 1.2 chopps #include <sys/tty.h> 73 1.8 veego #include <sys/signalvar.h> 74 1.21 gehenna #include <sys/conf.h> 75 1.1 mw 76 1.2 chopps #include <amiga/dev/event_var.h> 77 1.2 chopps #include <amiga/dev/vuid_event.h> 78 1.1 mw 79 1.2 chopps #include <amiga/amiga/custom.h> 80 1.2 chopps #include <amiga/amiga/cia.h> 81 1.9 is #include <amiga/amiga/device.h> 82 1.1 mw 83 1.28 jandberg #if NWSMOUSE > 0 84 1.28 jandberg #include <dev/wscons/wsmousevar.h> 85 1.28 jandberg #include <dev/wscons/wsconsio.h> 86 1.28 jandberg #endif 87 1.28 jandberg 88 1.37 chs void msattach(device_t, device_t, void *); 89 1.37 chs int msmatch(device_t, cfdata_t, void *); 90 1.1 mw 91 1.17 kleink /* per-port state */ 92 1.17 kleink struct ms_port { 93 1.17 kleink int ms_portno; /* which hardware port, for msintr() */ 94 1.9 is 95 1.17 kleink struct callout ms_intr_ch; 96 1.16 thorpej 97 1.9 is u_char ms_horc; /* horizontal counter on last scan */ 98 1.9 is u_char ms_verc; /* vertical counter on last scan */ 99 1.9 is char ms_mb; /* mouse button state */ 100 1.9 is char ms_ub; /* user button state */ 101 1.9 is int ms_dx; /* delta-x */ 102 1.9 is int ms_dy; /* delta-y */ 103 1.9 is volatile int ms_ready; /* event queue is ready */ 104 1.9 is struct evvar ms_events; /* event queue state */ 105 1.28 jandberg #if NWSMOUSE > 0 106 1.37 chs device_t ms_wsmousedev; /* wsmouse device */ 107 1.28 jandberg int ms_wsenabled; /* feeding events to wscons */ 108 1.28 jandberg #endif 109 1.9 is }; 110 1.9 is 111 1.17 kleink #define MS_NPORTS 2 112 1.17 kleink 113 1.17 kleink struct ms_softc { 114 1.17 kleink struct ms_port sc_ports[MS_NPORTS]; 115 1.17 kleink }; 116 1.17 kleink 117 1.37 chs CFATTACH_DECL_NEW(ms, sizeof(struct ms_softc), 118 1.23 thorpej msmatch, msattach, NULL, NULL); 119 1.9 is 120 1.19 aymeric void msintr(void *); 121 1.19 aymeric void ms_enable(struct ms_port *); 122 1.19 aymeric void ms_disable(struct ms_port *); 123 1.17 kleink 124 1.15 thorpej extern struct cfdriver ms_cd; 125 1.21 gehenna 126 1.21 gehenna dev_type_open(msopen); 127 1.21 gehenna dev_type_close(msclose); 128 1.21 gehenna dev_type_read(msread); 129 1.21 gehenna dev_type_ioctl(msioctl); 130 1.21 gehenna dev_type_poll(mspoll); 131 1.24 jdolecek dev_type_kqfilter(mskqfilter); 132 1.21 gehenna 133 1.21 gehenna const struct cdevsw ms_cdevsw = { 134 1.38 dholland .d_open = msopen, 135 1.38 dholland .d_close = msclose, 136 1.38 dholland .d_read = msread, 137 1.38 dholland .d_write = nowrite, 138 1.38 dholland .d_ioctl = msioctl, 139 1.38 dholland .d_stop = nostop, 140 1.38 dholland .d_tty = notty, 141 1.38 dholland .d_poll = mspoll, 142 1.38 dholland .d_mmap = nommap, 143 1.38 dholland .d_kqfilter = mskqfilter, 144 1.39 dholland .d_discard = nodiscard, 145 1.38 dholland .d_flag = 0 146 1.21 gehenna }; 147 1.1 mw 148 1.17 kleink #define MS_UNIT(d) ((minor(d) & ~0x1) >> 1) 149 1.17 kleink #define MS_PORT(d) (minor(d) & 0x1) 150 1.17 kleink 151 1.17 kleink /* 152 1.17 kleink * Given a dev_t, return a pointer to the port's hardware state. 153 1.25 perry * Assumes the unit to be valid, so do *not* use this in msopen(). 154 1.17 kleink */ 155 1.17 kleink #define MS_DEV2MSPORT(d) \ 156 1.17 kleink (&(((struct ms_softc *)getsoftc(ms_cd, MS_UNIT(d)))->sc_ports[MS_PORT(d)])) 157 1.17 kleink 158 1.28 jandberg #if NWSMOUSE > 0 159 1.28 jandberg /* 160 1.28 jandberg * Callbacks for wscons. 161 1.28 jandberg */ 162 1.28 jandberg static int ms_wscons_enable(void *); 163 1.31 christos static int ms_wscons_ioctl(void *, u_long, void *, int, struct lwp *); 164 1.28 jandberg static void ms_wscons_disable(void *); 165 1.28 jandberg 166 1.28 jandberg static struct wsmouse_accessops ms_wscons_accessops = { 167 1.28 jandberg ms_wscons_enable, 168 1.28 jandberg ms_wscons_ioctl, 169 1.28 jandberg ms_wscons_disable 170 1.28 jandberg }; 171 1.28 jandberg #endif 172 1.28 jandberg 173 1.3 chopps int 174 1.37 chs msmatch(device_t parent, cfdata_t cf, void *aux) 175 1.3 chopps { 176 1.17 kleink static int ms_matched = 0; 177 1.9 is 178 1.17 kleink /* Allow only one instance. */ 179 1.37 chs if (!matchname((char *)aux, "ms") || ms_matched) 180 1.17 kleink return 0; 181 1.9 is 182 1.17 kleink ms_matched = 1; 183 1.17 kleink return 1; 184 1.3 chopps } 185 1.1 mw 186 1.9 is void 187 1.37 chs msattach(device_t parent, device_t self, void *aux) 188 1.9 is { 189 1.28 jandberg #if NWSMOUSE > 0 190 1.28 jandberg struct wsmousedev_attach_args waa; 191 1.28 jandberg #endif 192 1.37 chs struct ms_softc *sc = device_private(self); 193 1.17 kleink int i; 194 1.16 thorpej 195 1.13 christos printf("\n"); 196 1.17 kleink for (i = 0; i < MS_NPORTS; i++) { 197 1.17 kleink sc->sc_ports[i].ms_portno = i; 198 1.32 ad callout_init(&sc->sc_ports[i].ms_intr_ch, 0); 199 1.28 jandberg #if NWSMOUSE > 0 200 1.28 jandberg waa.accessops = &ms_wscons_accessops; 201 1.28 jandberg waa.accesscookie = &sc->sc_ports[i]; 202 1.28 jandberg 203 1.28 jandberg sc->sc_ports[i].ms_wsenabled = 0; 204 1.28 jandberg sc->sc_ports[i].ms_wsmousedev = 205 1.41 rin config_found(self, &waa, wsmousedevprint, 206 1.42 thorpej CFARGS(.iattr = "wsmousedev")); 207 1.28 jandberg #endif 208 1.17 kleink } 209 1.9 is } 210 1.9 is 211 1.3 chopps /* 212 1.3 chopps * Amiga mice are hooked up to one of the two "game" ports, where 213 1.3 chopps * the main mouse is usually on the first port, and port 2 can 214 1.3 chopps * be used by a joystick. Nevertheless, we support two mouse 215 1.3 chopps * devices, /dev/mouse0 and /dev/mouse1 (with a link of /dev/mouse to 216 1.3 chopps * the device that represents the port of the mouse in use). 217 1.3 chopps */ 218 1.1 mw 219 1.3 chopps /* 220 1.17 kleink * enable scanner, called when someone opens the port. 221 1.3 chopps */ 222 1.1 mw void 223 1.19 aymeric ms_enable(struct ms_port *ms) 224 1.1 mw { 225 1.10 is 226 1.19 aymeric /* 227 1.3 chopps * use this as flag to the "interrupt" to tell it when to 228 1.3 chopps * shut off (when it's reset to 0). 229 1.3 chopps */ 230 1.3 chopps ms->ms_ready = 1; 231 1.1 mw 232 1.17 kleink callout_reset(&ms->ms_intr_ch, 2, msintr, ms); 233 1.1 mw } 234 1.1 mw 235 1.3 chopps /* 236 1.3 chopps * disable scanner. Just set ms_ready to 0, and after the next 237 1.3 chopps * timeout taken, no further timeouts will be initiated. 238 1.3 chopps */ 239 1.1 mw void 240 1.19 aymeric ms_disable(struct ms_port *ms) 241 1.1 mw { 242 1.3 chopps int s; 243 1.1 mw 244 1.3 chopps s = splhigh (); 245 1.3 chopps ms->ms_ready = 0; 246 1.3 chopps /* 247 1.3 chopps * sync with the interrupt 248 1.3 chopps */ 249 1.3 chopps tsleep(ms, PZERO - 1, "mouse-disable", 0); 250 1.3 chopps splx(s); 251 1.1 mw } 252 1.1 mw 253 1.1 mw 254 1.19 aymeric /* 255 1.3 chopps * we're emulating a mousesystems serial mouse here.. 256 1.3 chopps */ 257 1.1 mw void 258 1.19 aymeric msintr(void *arg) 259 1.1 mw { 260 1.3 chopps static const char to_one[] = { 1, 2, 2, 4, 4, 4, 4 }; 261 1.3 chopps static const int to_id[] = { MS_RIGHT, MS_MIDDLE, 0, MS_LEFT }; 262 1.17 kleink struct ms_port *ms = arg; 263 1.3 chopps struct firm_event *fe; 264 1.17 kleink int mb, ub, d, get, put, any, port; 265 1.3 chopps u_char pra, *horc, *verc; 266 1.3 chopps u_short pot, count; 267 1.3 chopps short dx, dy; 268 1.19 aymeric 269 1.17 kleink port = ms->ms_portno; 270 1.10 is 271 1.3 chopps horc = ((u_char *) &count) + 1; 272 1.3 chopps verc = (u_char *) &count; 273 1.3 chopps 274 1.3 chopps /* 275 1.3 chopps * first read the three buttons. 276 1.3 chopps */ 277 1.3 chopps pot = custom.potgor; 278 1.3 chopps pra = ciaa.pra; 279 1.17 kleink pot >>= port == 0 ? 8 : 12; /* contains right and middle button */ 280 1.17 kleink pra >>= port == 0 ? 6 : 7; /* contains left button */ 281 1.3 chopps mb = (pot & 4) / 4 + (pot & 1) * 2 + (pra & 1) * 4; 282 1.3 chopps mb ^= 0x07; 283 1.3 chopps 284 1.3 chopps /* 285 1.3 chopps * read current values of counter registers 286 1.3 chopps */ 287 1.17 kleink if (port == 0) 288 1.3 chopps count = custom.joy0dat; 289 1.3 chopps else 290 1.3 chopps count = custom.joy1dat; 291 1.19 aymeric 292 1.3 chopps /* 293 1.3 chopps * take care of wraparound 294 1.3 chopps */ 295 1.3 chopps dx = *horc - ms->ms_horc; 296 1.3 chopps if (dx < -127) 297 1.3 chopps dx += 255; 298 1.3 chopps else if (dx > 127) 299 1.3 chopps dx -= 255; 300 1.3 chopps dy = *verc - ms->ms_verc; 301 1.3 chopps if (dy < -127) 302 1.3 chopps dy += 255; 303 1.3 chopps else if (dy > 127) 304 1.3 chopps dy -= 255; 305 1.3 chopps 306 1.3 chopps /* 307 1.3 chopps * remember current values for next scan 308 1.3 chopps */ 309 1.3 chopps ms->ms_horc = *horc; 310 1.3 chopps ms->ms_verc = *verc; 311 1.3 chopps 312 1.3 chopps ms->ms_dx = dx; 313 1.3 chopps ms->ms_dy = dy; 314 1.3 chopps ms->ms_mb = mb; 315 1.19 aymeric 316 1.28 jandberg #if NWSMOUSE > 0 317 1.28 jandberg /* 318 1.28 jandberg * If we have attached wsmouse and we are not opened 319 1.28 jandberg * directly then pass events to wscons. 320 1.28 jandberg */ 321 1.28 jandberg if (ms->ms_wsmousedev && ms->ms_wsenabled) 322 1.28 jandberg { 323 1.28 jandberg int buttons = 0; 324 1.28 jandberg 325 1.28 jandberg if (mb & 4) 326 1.28 jandberg buttons |= 1; 327 1.28 jandberg if (mb & 2) 328 1.28 jandberg buttons |= 2; 329 1.28 jandberg if (mb & 1) 330 1.28 jandberg buttons |= 4; 331 1.28 jandberg 332 1.28 jandberg wsmouse_input(ms->ms_wsmousedev, 333 1.28 jandberg buttons, 334 1.30 plunky dx, -dy, 0, 0, 335 1.28 jandberg WSMOUSE_INPUT_DELTA); 336 1.28 jandberg 337 1.28 jandberg } else 338 1.28 jandberg #endif 339 1.3 chopps if (dx || dy || ms->ms_ub != ms->ms_mb) { 340 1.3 chopps /* 341 1.3 chopps * We have at least one event (mouse button, delta-X, or 342 1.3 chopps * delta-Y; possibly all three, and possibly three separate 343 1.3 chopps * button events). Deliver these events until we are out of 344 1.19 aymeric * changes or out of room. As events get delivered, mark them 345 1.3 chopps * `unchanged'. 346 1.3 chopps */ 347 1.3 chopps any = 0; 348 1.3 chopps get = ms->ms_events.ev_get; 349 1.3 chopps put = ms->ms_events.ev_put; 350 1.3 chopps fe = &ms->ms_events.ev_q[put]; 351 1.3 chopps 352 1.3 chopps mb = ms->ms_mb; 353 1.3 chopps ub = ms->ms_ub; 354 1.3 chopps while ((d = mb ^ ub) != 0) { 355 1.3 chopps /* 356 1.3 chopps * Mouse button change. Convert up to three changes 357 1.3 chopps * to the `first' change, and drop it into the event 358 1.3 chopps * queue. 359 1.3 chopps */ 360 1.3 chopps if ((++put) % EV_QSIZE == get) { 361 1.3 chopps put--; 362 1.3 chopps goto out; 363 1.3 chopps } 364 1.3 chopps 365 1.3 chopps d = to_one[d - 1]; /* from 1..7 to {1,2,4} */ 366 1.3 chopps fe->id = to_id[d - 1]; /* from {1,2,4} to ID */ 367 1.3 chopps fe->value = mb & d ? VKEY_DOWN : VKEY_UP; 368 1.35 mhitch firm_gettime(fe); 369 1.3 chopps fe++; 370 1.3 chopps 371 1.3 chopps if (put >= EV_QSIZE) { 372 1.3 chopps put = 0; 373 1.3 chopps fe = &ms->ms_events.ev_q[0]; 374 1.3 chopps } 375 1.3 chopps any = 1; 376 1.3 chopps 377 1.3 chopps ub ^= d; 378 1.3 chopps } 379 1.3 chopps if (ms->ms_dx) { 380 1.3 chopps if ((++put) % EV_QSIZE == get) { 381 1.3 chopps put--; 382 1.3 chopps goto out; 383 1.3 chopps } 384 1.3 chopps 385 1.3 chopps fe->id = LOC_X_DELTA; 386 1.3 chopps fe->value = ms->ms_dx; 387 1.35 mhitch firm_gettime(fe); 388 1.4 chopps fe++; 389 1.3 chopps 390 1.3 chopps if (put >= EV_QSIZE) { 391 1.3 chopps put = 0; 392 1.3 chopps fe = &ms->ms_events.ev_q[0]; 393 1.3 chopps } 394 1.3 chopps any = 1; 395 1.3 chopps 396 1.3 chopps ms->ms_dx = 0; 397 1.3 chopps } 398 1.3 chopps if (ms->ms_dy) { 399 1.3 chopps if ((++put) % EV_QSIZE == get) { 400 1.3 chopps put--; 401 1.3 chopps goto out; 402 1.3 chopps } 403 1.3 chopps 404 1.3 chopps fe->id = LOC_Y_DELTA; 405 1.3 chopps fe->value = ms->ms_dy; 406 1.35 mhitch firm_gettime(fe); 407 1.4 chopps fe++; 408 1.3 chopps 409 1.3 chopps if (put >= EV_QSIZE) { 410 1.3 chopps put = 0; 411 1.3 chopps fe = &ms->ms_events.ev_q[0]; 412 1.3 chopps } 413 1.3 chopps any = 1; 414 1.1 mw 415 1.3 chopps ms->ms_dy = 0; 416 1.3 chopps } 417 1.1 mw out: 418 1.3 chopps if (any) { 419 1.3 chopps ms->ms_ub = ub; 420 1.3 chopps ms->ms_events.ev_put = put; 421 1.3 chopps EV_WAKEUP(&ms->ms_events); 422 1.3 chopps } 423 1.1 mw } 424 1.1 mw 425 1.3 chopps /* 426 1.3 chopps * reschedule handler, or if terminating, 427 1.3 chopps * handshake with ms_disable 428 1.3 chopps */ 429 1.3 chopps if (ms->ms_ready) 430 1.17 kleink callout_reset(&ms->ms_intr_ch, 2, msintr, ms); 431 1.3 chopps else 432 1.3 chopps wakeup(ms); 433 1.1 mw } 434 1.1 mw 435 1.1 mw int 436 1.29 christos msopen(dev_t dev, int flags, int mode, struct lwp *l) 437 1.1 mw { 438 1.17 kleink struct ms_softc *sc; 439 1.17 kleink struct ms_port *ms; 440 1.17 kleink int unit, port; 441 1.3 chopps 442 1.17 kleink unit = MS_UNIT(dev); 443 1.17 kleink sc = (struct ms_softc *)getsoftc(ms_cd, unit); 444 1.3 chopps 445 1.17 kleink if (sc == NULL) 446 1.3 chopps return(EXDEV); 447 1.3 chopps 448 1.17 kleink port = MS_PORT(dev); 449 1.17 kleink ms = &sc->sc_ports[port]; 450 1.17 kleink 451 1.3 chopps if (ms->ms_events.ev_io) 452 1.3 chopps return(EBUSY); 453 1.18 is 454 1.28 jandberg #if NWSMOUSE > 0 455 1.28 jandberg /* don't allow opening when sending events to wsmouse */ 456 1.28 jandberg if (ms->ms_wsenabled) 457 1.28 jandberg return EBUSY; 458 1.28 jandberg #endif 459 1.18 is /* initialize potgo bits for mouse mode */ 460 1.18 is custom.potgo = custom.potgor | (0xf00 << (port * 4)); 461 1.3 chopps 462 1.29 christos ms->ms_events.ev_io = l->l_proc; 463 1.3 chopps ev_init(&ms->ms_events); /* may cause sleep */ 464 1.17 kleink ms_enable(ms); 465 1.3 chopps return(0); 466 1.1 mw } 467 1.1 mw 468 1.1 mw int 469 1.29 christos msclose(dev_t dev, int flags, int mode, struct lwp *l) 470 1.1 mw { 471 1.17 kleink struct ms_port *ms; 472 1.1 mw 473 1.17 kleink ms = MS_DEV2MSPORT(dev); 474 1.3 chopps 475 1.17 kleink ms_disable(ms); 476 1.3 chopps ev_fini(&ms->ms_events); 477 1.3 chopps ms->ms_events.ev_io = NULL; 478 1.3 chopps return(0); 479 1.1 mw } 480 1.1 mw 481 1.1 mw int 482 1.19 aymeric msread(dev_t dev, struct uio *uio, int flags) 483 1.1 mw { 484 1.17 kleink struct ms_port *ms; 485 1.1 mw 486 1.17 kleink ms = MS_DEV2MSPORT(dev); 487 1.10 is 488 1.3 chopps return(ev_read(&ms->ms_events, uio, flags)); 489 1.1 mw } 490 1.1 mw 491 1.1 mw int 492 1.31 christos msioctl(dev_t dev, u_long cmd, register void *data, int flag, 493 1.29 christos struct lwp *l) 494 1.1 mw { 495 1.17 kleink struct ms_port *ms; 496 1.1 mw 497 1.17 kleink ms = MS_DEV2MSPORT(dev); 498 1.1 mw 499 1.3 chopps switch (cmd) { 500 1.3 chopps case FIONBIO: /* we will remove this someday (soon???) */ 501 1.3 chopps return(0); 502 1.3 chopps case FIOASYNC: 503 1.3 chopps ms->ms_events.ev_async = *(int *)data != 0; 504 1.27 jdolecek return(0); 505 1.27 jdolecek case FIOSETOWN: 506 1.27 jdolecek if (-*(int *)data != ms->ms_events.ev_io->p_pgid 507 1.27 jdolecek && *(int *)data != ms->ms_events.ev_io->p_pid) 508 1.27 jdolecek return(EPERM); 509 1.3 chopps return(0); 510 1.3 chopps case TIOCSPGRP: 511 1.3 chopps if (*(int *)data != ms->ms_events.ev_io->p_pgid) 512 1.3 chopps return(EPERM); 513 1.3 chopps return(0); 514 1.3 chopps case VUIDGFORMAT: /* we only do firm_events */ 515 1.3 chopps *(int *)data = VUID_FIRM_EVENT; 516 1.3 chopps return(0); 517 1.3 chopps case VUIDSFORMAT: 518 1.3 chopps if (*(int *)data != VUID_FIRM_EVENT) 519 1.3 chopps return(EINVAL); 520 1.3 chopps return(0); 521 1.3 chopps } 522 1.3 chopps return(ENOTTY); 523 1.1 mw } 524 1.1 mw 525 1.1 mw int 526 1.29 christos mspoll(dev_t dev, int events, struct lwp *l) 527 1.1 mw { 528 1.17 kleink struct ms_port *ms; 529 1.1 mw 530 1.17 kleink ms = MS_DEV2MSPORT(dev); 531 1.10 is 532 1.29 christos return(ev_poll(&ms->ms_events, events, l)); 533 1.24 jdolecek } 534 1.24 jdolecek 535 1.24 jdolecek int 536 1.36 dsl mskqfilter(dev_t dev, struct knote *kn) 537 1.24 jdolecek { 538 1.24 jdolecek struct ms_port *ms; 539 1.24 jdolecek 540 1.24 jdolecek ms = MS_DEV2MSPORT(dev); 541 1.24 jdolecek 542 1.24 jdolecek return (ev_kqfilter(&ms->ms_events, kn)); 543 1.1 mw } 544 1.28 jandberg 545 1.28 jandberg #if NWSMOUSE > 0 546 1.28 jandberg 547 1.28 jandberg static int 548 1.31 christos ms_wscons_ioctl(void *cookie, u_long cmd, void *data, int flag, 549 1.29 christos struct lwp *l) 550 1.28 jandberg { 551 1.28 jandberg switch(cmd) { 552 1.28 jandberg case WSMOUSEIO_GTYPE: 553 1.28 jandberg *(u_int*)data = WSMOUSE_TYPE_AMIGA; 554 1.28 jandberg return (0); 555 1.28 jandberg } 556 1.28 jandberg 557 1.43 rin return EPASSTHROUGH; 558 1.28 jandberg } 559 1.28 jandberg 560 1.28 jandberg static int 561 1.28 jandberg ms_wscons_enable(void *cookie) 562 1.28 jandberg { 563 1.28 jandberg struct ms_port *port = cookie; 564 1.28 jandberg 565 1.28 jandberg /* somebody reading events from us directly? */ 566 1.28 jandberg if (port->ms_events.ev_io) 567 1.28 jandberg return EBUSY; 568 1.28 jandberg 569 1.28 jandberg port->ms_wsenabled = 1; 570 1.28 jandberg ms_enable(port); 571 1.28 jandberg 572 1.28 jandberg return 0; 573 1.28 jandberg } 574 1.28 jandberg 575 1.28 jandberg static void 576 1.28 jandberg ms_wscons_disable(void *cookie) 577 1.28 jandberg { 578 1.28 jandberg struct ms_port *port = cookie; 579 1.28 jandberg 580 1.28 jandberg if (port->ms_wsenabled) 581 1.28 jandberg ms_disable(port); 582 1.28 jandberg port->ms_wsenabled = 0; 583 1.28 jandberg } 584 1.28 jandberg 585 1.28 jandberg #endif 586 1.28 jandberg 587