1 1.36 macallan /* $NetBSD: adb_kbd.c,v 1.36 2025/06/16 08:00:50 macallan Exp $ */ 2 1.1 macallan 3 1.1 macallan /* 4 1.1 macallan * Copyright (C) 1998 Colin Wood 5 1.4 macallan * Copyright (C) 2006, 2007 Michael Lorenz 6 1.1 macallan * All rights reserved. 7 1.1 macallan * 8 1.1 macallan * Redistribution and use in source and binary forms, with or without 9 1.1 macallan * modification, are permitted provided that the following conditions 10 1.1 macallan * are met: 11 1.1 macallan * 1. Redistributions of source code must retain the above copyright 12 1.1 macallan * notice, this list of conditions and the following disclaimer. 13 1.1 macallan * 2. Redistributions in binary form must reproduce the above copyright 14 1.1 macallan * notice, this list of conditions and the following disclaimer in the 15 1.1 macallan * documentation and/or other materials provided with the distribution. 16 1.1 macallan * 3. All advertising materials mentioning features or use of this software 17 1.1 macallan * must display the following acknowledgement: 18 1.1 macallan * This product includes software developed by Colin Wood. 19 1.1 macallan * 4. The name of the author may not be used to endorse or promote products 20 1.1 macallan * derived from this software without specific prior written permission. 21 1.1 macallan * 22 1.1 macallan * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 23 1.1 macallan * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 24 1.1 macallan * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 25 1.1 macallan * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 26 1.1 macallan * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 27 1.1 macallan * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 1.1 macallan * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 1.1 macallan * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 1.1 macallan * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31 1.1 macallan * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 1.1 macallan */ 33 1.1 macallan 34 1.1 macallan #include <sys/cdefs.h> 35 1.36 macallan __KERNEL_RCSID(0, "$NetBSD: adb_kbd.c,v 1.36 2025/06/16 08:00:50 macallan Exp $"); 36 1.29 christos 37 1.29 christos #ifdef _KERNEL_OPT 38 1.29 christos #include "opt_ddb.h" 39 1.29 christos #endif 40 1.1 macallan 41 1.1 macallan #include <sys/param.h> 42 1.1 macallan #include <sys/device.h> 43 1.1 macallan #include <sys/sysctl.h> 44 1.35 macallan #include <sys/condvar.h> 45 1.1 macallan 46 1.1 macallan #include <dev/wscons/wsconsio.h> 47 1.1 macallan #include <dev/wscons/wskbdvar.h> 48 1.1 macallan #include <dev/wscons/wsksymdef.h> 49 1.1 macallan #include <dev/wscons/wsksymvar.h> 50 1.1 macallan #include <dev/wscons/wsmousevar.h> 51 1.1 macallan 52 1.3 macallan #include <dev/sysmon/sysmonvar.h> 53 1.3 macallan #include <dev/sysmon/sysmon_taskq.h> 54 1.3 macallan 55 1.1 macallan #include <machine/autoconf.h> 56 1.1 macallan 57 1.1 macallan #include <dev/adb/adbvar.h> 58 1.1 macallan #include <dev/adb/adb_keymap.h> 59 1.1 macallan 60 1.27 riastrad #include "ioconf.h" 61 1.27 riastrad 62 1.8 macallan #include "opt_wsdisplay_compat.h" 63 1.19 macallan #include "opt_adbkbd.h" 64 1.1 macallan #include "adbdebug.h" 65 1.11 macallan #include "wsmouse.h" 66 1.1 macallan 67 1.1 macallan struct adbkbd_softc { 68 1.12 matt device_t sc_dev; 69 1.1 macallan struct adb_device *sc_adbdev; 70 1.1 macallan struct adb_bus_accessops *sc_ops; 71 1.12 matt device_t sc_wskbddev; 72 1.11 macallan #if NWSMOUSE > 0 73 1.12 matt device_t sc_wsmousedev; 74 1.11 macallan #endif 75 1.3 macallan struct sysmon_pswitch sc_sm_pbutton; 76 1.1 macallan int sc_leds; 77 1.1 macallan int sc_have_led_control; 78 1.16 macallan int sc_power_button_delay; 79 1.1 macallan int sc_msg_len; 80 1.35 macallan kcondvar_t sc_event; 81 1.35 macallan kmutex_t sc_interlock; 82 1.1 macallan int sc_poll; 83 1.1 macallan int sc_polled_chars; 84 1.1 macallan int sc_trans[3]; 85 1.1 macallan int sc_capslock; 86 1.10 macallan uint32_t sc_timestamp; 87 1.1 macallan #ifdef WSDISPLAY_COMPAT_RAWKBD 88 1.1 macallan int sc_rawkbd; 89 1.1 macallan #endif 90 1.33 manu int sc_emul_usb; 91 1.25 macallan bool sc_power_dbg; 92 1.18 macallan 93 1.21 macallan uint32_t sc_power; 94 1.1 macallan uint8_t sc_buffer[16]; 95 1.1 macallan uint8_t sc_pollbuf[16]; 96 1.21 macallan uint8_t sc_us, sc_pe; 97 1.1 macallan }; 98 1.1 macallan 99 1.1 macallan /* 100 1.1 macallan * Function declarations. 101 1.1 macallan */ 102 1.12 matt static int adbkbd_match(device_t, cfdata_t, void *); 103 1.12 matt static void adbkbd_attach(device_t, device_t, void *); 104 1.1 macallan 105 1.1 macallan static void adbkbd_initleds(struct adbkbd_softc *); 106 1.1 macallan static void adbkbd_keys(struct adbkbd_softc *, uint8_t, uint8_t); 107 1.1 macallan static inline void adbkbd_key(struct adbkbd_softc *, uint8_t); 108 1.1 macallan static int adbkbd_wait(struct adbkbd_softc *, int); 109 1.1 macallan 110 1.1 macallan /* Driver definition. */ 111 1.12 matt CFATTACH_DECL_NEW(adbkbd, sizeof(struct adbkbd_softc), 112 1.1 macallan adbkbd_match, adbkbd_attach, NULL, NULL); 113 1.1 macallan 114 1.1 macallan static int adbkbd_enable(void *, int); 115 1.5 christos static int adbkbd_ioctl(void *, u_long, void *, int, struct lwp *); 116 1.1 macallan static void adbkbd_set_leds(void *, int); 117 1.1 macallan static void adbkbd_handler(void *, int, uint8_t *); 118 1.9 macallan static void adbkbd_powerbutton(void *); 119 1.1 macallan 120 1.1 macallan struct wskbd_accessops adbkbd_accessops = { 121 1.1 macallan adbkbd_enable, 122 1.1 macallan adbkbd_set_leds, 123 1.1 macallan adbkbd_ioctl, 124 1.1 macallan }; 125 1.1 macallan 126 1.1 macallan static void adbkbd_cngetc(void *, u_int *, int *); 127 1.1 macallan static void adbkbd_cnpollc(void *, int); 128 1.1 macallan 129 1.1 macallan struct wskbd_consops adbkbd_consops = { 130 1.1 macallan adbkbd_cngetc, 131 1.1 macallan adbkbd_cnpollc, 132 1.1 macallan }; 133 1.1 macallan 134 1.1 macallan struct wskbd_mapdata adbkbd_keymapdata = { 135 1.1 macallan akbd_keydesctab, 136 1.30 macallan #ifdef ADBKBD_LAYOUT 137 1.30 macallan ADBKBD_LAYOUT, 138 1.1 macallan #else 139 1.30 macallan KB_US | KB_APPLE, 140 1.1 macallan #endif 141 1.1 macallan }; 142 1.1 macallan 143 1.11 macallan #if NWSMOUSE > 0 144 1.1 macallan static int adbkms_enable(void *); 145 1.5 christos static int adbkms_ioctl(void *, u_long, void *, int, struct lwp *); 146 1.1 macallan static void adbkms_disable(void *); 147 1.1 macallan 148 1.1 macallan const struct wsmouse_accessops adbkms_accessops = { 149 1.1 macallan adbkms_enable, 150 1.1 macallan adbkms_ioctl, 151 1.1 macallan adbkms_disable, 152 1.1 macallan }; 153 1.1 macallan 154 1.14 macallan static int adbkbd_sysctl_mid(SYSCTLFN_ARGS); 155 1.14 macallan static int adbkbd_sysctl_right(SYSCTLFN_ARGS); 156 1.18 macallan static int adbkbd_sysctl_usb(SYSCTLFN_ARGS); 157 1.1 macallan 158 1.11 macallan #endif /* NWSMOUSE > 0 */ 159 1.11 macallan 160 1.20 he static void adbkbd_setup_sysctl(struct adbkbd_softc *); 161 1.20 he 162 1.1 macallan #ifdef ADBKBD_DEBUG 163 1.1 macallan #define DPRINTF printf 164 1.1 macallan #else 165 1.1 macallan #define DPRINTF while (0) printf 166 1.1 macallan #endif 167 1.1 macallan 168 1.1 macallan static int adbkbd_is_console = 0; 169 1.1 macallan static int adbkbd_console_attached = 0; 170 1.1 macallan 171 1.1 macallan static int 172 1.12 matt adbkbd_match(device_t parent, cfdata_t cf, void *aux) 173 1.1 macallan { 174 1.1 macallan struct adb_attach_args *aaa = aux; 175 1.1 macallan 176 1.1 macallan if (aaa->dev->original_addr == ADBADDR_KBD) 177 1.1 macallan return 1; 178 1.1 macallan else 179 1.1 macallan return 0; 180 1.1 macallan } 181 1.1 macallan 182 1.1 macallan static void 183 1.12 matt adbkbd_attach(device_t parent, device_t self, void *aux) 184 1.1 macallan { 185 1.12 matt struct adbkbd_softc *sc = device_private(self); 186 1.1 macallan struct adb_attach_args *aaa = aux; 187 1.1 macallan short cmd; 188 1.1 macallan struct wskbddev_attach_args a; 189 1.11 macallan #if NWSMOUSE > 0 190 1.1 macallan struct wsmousedev_attach_args am; 191 1.11 macallan #endif 192 1.23 macallan uint8_t buffer[2]; 193 1.1 macallan 194 1.12 matt sc->sc_dev = self; 195 1.1 macallan sc->sc_ops = aaa->ops; 196 1.1 macallan sc->sc_adbdev = aaa->dev; 197 1.1 macallan sc->sc_adbdev->cookie = sc; 198 1.1 macallan sc->sc_adbdev->handler = adbkbd_handler; 199 1.35 macallan mutex_init(&sc->sc_interlock, MUTEX_DEFAULT, IPL_NONE); 200 1.35 macallan cv_init(&sc->sc_event, "adbkbd"); 201 1.1 macallan sc->sc_us = ADBTALK(sc->sc_adbdev->current_addr, 0); 202 1.1 macallan 203 1.1 macallan sc->sc_leds = 0; /* initially off */ 204 1.1 macallan sc->sc_have_led_control = 0; 205 1.16 macallan 206 1.16 macallan /* 207 1.16 macallan * If this is != 0 then pushing the power button will not immadiately 208 1.16 macallan * send a shutdown event to sysmon but instead require another key 209 1.16 macallan * press within 5 seconds with a gap of at least two seconds. The 210 1.16 macallan * reason to do this is the fact that some PowerBook keyboards, 211 1.16 macallan * like the 2400, 3400 and original G3 have their power buttons 212 1.16 macallan * right next to the backspace key and it's extremely easy to hit 213 1.16 macallan * it by accident. 214 1.16 macallan * On most other keyboards the power button is sufficiently far out 215 1.16 macallan * of the way so we don't need this. 216 1.16 macallan */ 217 1.16 macallan sc->sc_power_button_delay = 0; 218 1.1 macallan sc->sc_msg_len = 0; 219 1.1 macallan sc->sc_poll = 0; 220 1.1 macallan sc->sc_capslock = 0; 221 1.1 macallan sc->sc_trans[1] = 103; /* F11 */ 222 1.1 macallan sc->sc_trans[2] = 111; /* F12 */ 223 1.21 macallan 224 1.21 macallan /* 225 1.21 macallan * Most ADB keyboards send 0x7f 0x7f when the power button is pressed. 226 1.21 macallan * Some older PowerBooks, like the 3400c, will send a single scancode 227 1.21 macallan * 0x7e instead. Unfortunately Fn-Command on some more recent *Books 228 1.21 macallan * sends the same scancode, so by default sc_power is set to a value 229 1.21 macallan * that can't occur as a scancode and only set to 0x7e on hardware that 230 1.21 macallan * needs it 231 1.21 macallan */ 232 1.21 macallan sc->sc_power = 0xffff; 233 1.10 macallan sc->sc_timestamp = 0; 234 1.33 manu sc->sc_emul_usb = ADB_EMUL_USB_NONE; 235 1.28 macallan #ifdef ADBKBD_POWER_DDB 236 1.28 macallan sc->sc_power_dbg = TRUE; 237 1.28 macallan #else 238 1.25 macallan sc->sc_power_dbg = FALSE; 239 1.28 macallan #endif 240 1.1 macallan 241 1.24 macallan aprint_normal(" addr %d: ", sc->sc_adbdev->current_addr); 242 1.1 macallan 243 1.1 macallan switch (sc->sc_adbdev->handler_id) { 244 1.1 macallan case ADB_STDKBD: 245 1.24 macallan aprint_normal("standard keyboard\n"); 246 1.1 macallan break; 247 1.1 macallan case ADB_ISOKBD: 248 1.24 macallan aprint_normal("standard keyboard (ISO layout)\n"); 249 1.1 macallan break; 250 1.1 macallan case ADB_EXTKBD: 251 1.1 macallan cmd = ADBTALK(sc->sc_adbdev->current_addr, 1); 252 1.1 macallan sc->sc_msg_len = 0; 253 1.1 macallan sc->sc_ops->send(sc->sc_ops->cookie, sc->sc_poll, cmd, 0, NULL); 254 1.1 macallan adbkbd_wait(sc, 10); 255 1.1 macallan 256 1.1 macallan /* Ignore Logitech MouseMan/Trackman pseudo keyboard */ 257 1.1 macallan /* XXX needs testing */ 258 1.1 macallan if (sc->sc_buffer[2] == 0x9a && sc->sc_buffer[3] == 0x20) { 259 1.24 macallan aprint_normal("Mouseman (non-EMP) pseudo keyboard\n"); 260 1.1 macallan return; 261 1.1 macallan } else if (sc->sc_buffer[2] == 0x9a && 262 1.1 macallan sc->sc_buffer[3] == 0x21) { 263 1.24 macallan aprint_normal("Trackman (non-EMP) pseudo keyboard\n"); 264 1.1 macallan return; 265 1.1 macallan } else { 266 1.24 macallan aprint_normal("extended keyboard\n"); 267 1.1 macallan adbkbd_initleds(sc); 268 1.1 macallan } 269 1.1 macallan break; 270 1.1 macallan case ADB_EXTISOKBD: 271 1.24 macallan aprint_normal("extended keyboard (ISO layout)\n"); 272 1.1 macallan adbkbd_initleds(sc); 273 1.1 macallan break; 274 1.1 macallan case ADB_KBDII: 275 1.24 macallan aprint_normal("keyboard II\n"); 276 1.1 macallan break; 277 1.1 macallan case ADB_ISOKBDII: 278 1.24 macallan aprint_normal("keyboard II (ISO layout)\n"); 279 1.1 macallan break; 280 1.1 macallan case ADB_PBKBD: 281 1.24 macallan aprint_normal("PowerBook keyboard\n"); 282 1.6 macallan sc->sc_power = 0x7e; 283 1.16 macallan sc->sc_power_button_delay = 1; 284 1.1 macallan break; 285 1.1 macallan case ADB_PBISOKBD: 286 1.24 macallan aprint_normal("PowerBook keyboard (ISO layout)\n"); 287 1.6 macallan sc->sc_power = 0x7e; 288 1.16 macallan sc->sc_power_button_delay = 1; 289 1.1 macallan break; 290 1.1 macallan case ADB_ADJKPD: 291 1.24 macallan aprint_normal("adjustable keypad\n"); 292 1.1 macallan break; 293 1.1 macallan case ADB_ADJKBD: 294 1.24 macallan aprint_normal("adjustable keyboard\n"); 295 1.1 macallan break; 296 1.1 macallan case ADB_ADJISOKBD: 297 1.24 macallan aprint_normal("adjustable keyboard (ISO layout)\n"); 298 1.1 macallan break; 299 1.1 macallan case ADB_ADJJAPKBD: 300 1.24 macallan aprint_normal("adjustable keyboard (Japanese layout)\n"); 301 1.1 macallan break; 302 1.1 macallan case ADB_PBEXTISOKBD: 303 1.24 macallan aprint_normal("PowerBook extended keyboard (ISO layout)\n"); 304 1.16 macallan sc->sc_power_button_delay = 1; 305 1.6 macallan sc->sc_power = 0x7e; 306 1.1 macallan break; 307 1.1 macallan case ADB_PBEXTJAPKBD: 308 1.24 macallan aprint_normal("PowerBook extended keyboard (Japanese layout)\n"); 309 1.16 macallan sc->sc_power_button_delay = 1; 310 1.6 macallan sc->sc_power = 0x7e; 311 1.1 macallan break; 312 1.1 macallan case ADB_JPKBDII: 313 1.24 macallan aprint_normal("keyboard II (Japanese layout)\n"); 314 1.1 macallan break; 315 1.1 macallan case ADB_PBEXTKBD: 316 1.24 macallan aprint_normal("PowerBook extended keyboard\n"); 317 1.16 macallan sc->sc_power_button_delay = 1; 318 1.6 macallan sc->sc_power = 0x7e; 319 1.1 macallan break; 320 1.1 macallan case ADB_DESIGNKBD: 321 1.24 macallan aprint_normal("extended keyboard\n"); 322 1.1 macallan adbkbd_initleds(sc); 323 1.1 macallan break; 324 1.1 macallan case ADB_PBJPKBD: 325 1.24 macallan aprint_normal("PowerBook keyboard (Japanese layout)\n"); 326 1.16 macallan sc->sc_power_button_delay = 1; 327 1.6 macallan sc->sc_power = 0x7e; 328 1.1 macallan break; 329 1.1 macallan case ADB_PBG3KBD: 330 1.24 macallan aprint_normal("PowerBook G3 keyboard\n"); 331 1.1 macallan break; 332 1.1 macallan case ADB_PBG3JPKBD: 333 1.24 macallan aprint_normal("PowerBook G3 keyboard (Japanese layout)\n"); 334 1.1 macallan break; 335 1.1 macallan case ADB_IBOOKKBD: 336 1.24 macallan aprint_normal("iBook keyboard\n"); 337 1.1 macallan break; 338 1.1 macallan default: 339 1.24 macallan aprint_normal("mapped device (%d)\n", sc->sc_adbdev->handler_id); 340 1.1 macallan break; 341 1.1 macallan } 342 1.1 macallan 343 1.23 macallan /* 344 1.23 macallan * try to switch to extended protocol 345 1.23 macallan * as in, tell the keyboard to distinguish between left and right 346 1.23 macallan * Shift, Control and Alt keys 347 1.23 macallan */ 348 1.23 macallan cmd = ADBLISTEN(sc->sc_adbdev->current_addr, 3); 349 1.23 macallan buffer[0] = sc->sc_adbdev->current_addr; 350 1.23 macallan buffer[1] = 3; 351 1.23 macallan sc->sc_msg_len = 0; 352 1.23 macallan sc->sc_ops->send(sc->sc_ops->cookie, sc->sc_poll, cmd, 2, buffer); 353 1.23 macallan adbkbd_wait(sc, 10); 354 1.23 macallan 355 1.23 macallan cmd = ADBTALK(sc->sc_adbdev->current_addr, 3); 356 1.23 macallan sc->sc_msg_len = 0; 357 1.23 macallan sc->sc_ops->send(sc->sc_ops->cookie, sc->sc_poll, cmd, 0, NULL); 358 1.23 macallan adbkbd_wait(sc, 10); 359 1.23 macallan if ((sc->sc_msg_len == 4) && (sc->sc_buffer[3] == 3)) { 360 1.24 macallan aprint_verbose_dev(sc->sc_dev, "extended protocol enabled\n"); 361 1.23 macallan } 362 1.23 macallan 363 1.25 macallan #ifdef ADBKBD_DEBUG 364 1.25 macallan cmd = ADBTALK(sc->sc_adbdev->current_addr, 1); 365 1.25 macallan sc->sc_msg_len = 0; 366 1.25 macallan sc->sc_ops->send(sc->sc_ops->cookie, sc->sc_poll, cmd, 0, NULL); 367 1.25 macallan adbkbd_wait(sc, 10); 368 1.25 macallan printf("buffer: %02x %02x\n", sc->sc_buffer[0], sc->sc_buffer[1]); 369 1.25 macallan #endif 370 1.25 macallan 371 1.1 macallan if (adbkbd_is_console && (adbkbd_console_attached == 0)) { 372 1.1 macallan wskbd_cnattach(&adbkbd_consops, sc, &adbkbd_keymapdata); 373 1.1 macallan adbkbd_console_attached = 1; 374 1.1 macallan a.console = 1; 375 1.1 macallan } else { 376 1.1 macallan a.console = 0; 377 1.1 macallan } 378 1.1 macallan a.keymap = &adbkbd_keymapdata; 379 1.1 macallan a.accessops = &adbkbd_accessops; 380 1.1 macallan a.accesscookie = sc; 381 1.1 macallan 382 1.31 thorpej sc->sc_wskbddev = config_found(self, &a, wskbddevprint, 383 1.32 thorpej CFARGS(.iattr = "wskbddev")); 384 1.19 macallan #ifdef ADBKBD_EMUL_USB 385 1.33 manu /* Values from Linux's drivers/macintosh/adbhud.c */ 386 1.33 manu switch (sc->sc_adbdev->handler_id) { 387 1.33 manu case ADB_ISOKBD: /* FALLTHROUGH */ 388 1.33 manu case ADB_EXTISOKBD: /* FALLTHROUGH */ 389 1.33 manu case 0x07: /* FALLTHROUGH */ 390 1.33 manu case ADB_ISOKBDII: /* FALLTHROUGH */ 391 1.33 manu case ADB_PBISOKBD: /* FALLTHROUGH */ 392 1.33 manu case ADB_ADJISOKBD: /* FALLTHROUGH */ 393 1.33 manu case ADB_PBEXTISOKBD: /* FALLTHROUGH */ 394 1.33 manu case 0x19: /* FALLTHROUGH */ 395 1.33 manu case 0x1d: /* FALLTHROUGH */ 396 1.33 manu case 0xc1: /* FALLTHROUGH */ 397 1.33 manu case ADB_IBOOKKBD: /* FALLTHROUGH */ 398 1.33 manu case 0xc7: 399 1.33 manu sc->sc_emul_usb = ADB_EMUL_USB_ISO; 400 1.33 manu wskbd_set_evtrans(sc->sc_wskbddev, adb_to_usb_iso, 128); 401 1.33 manu break; 402 1.33 manu #ifdef notyet 403 1.33 manu case ADB_ADJJAPKBD: /* FALLTHROUGH */ 404 1.33 manu case ADB_PBEXTJAPKBD: /* FALLTHROUGH */ 405 1.33 manu case ADB_JPKBDII: /* FALLTHROUGH */ 406 1.33 manu case 0x17: /* FALLTHROUGH */ 407 1.33 manu case 0x1a: /* FALLTHROUGH */ 408 1.33 manu case ADB_PBJPKBD: /* FALLTHROUGH */ 409 1.33 manu case 0xc2: /* FALLTHROUGH */ 410 1.33 manu case 0xc5: /* FALLTHROUGH */ 411 1.33 manu case 0xc8: /* FALLTHROUGH */ 412 1.33 manu case 0xc9: 413 1.33 manu sc->sc_emul_usb = ADB_EMUL_USB_JIS; 414 1.33 manu wskbd_set_evtrans(sc->sc_wskbddev, adb_to_usb_jis, 128); 415 1.33 manu break; 416 1.33 manu #endif 417 1.33 manu case ADB_STDKBD: /* FALLTHROUGH */ 418 1.33 manu case ADB_EXTKBD: /* FALLTHROUGH */ 419 1.33 manu case 0x03: /* FALLTHROUGH */ 420 1.33 manu case 0x06: /* FALLTHROUGH */ 421 1.33 manu case ADB_KBDII: /* FALLTHROUGH */ 422 1.33 manu case ADB_PBKBD: /* FALLTHROUGH */ 423 1.33 manu case ADB_ADJKBD: /* FALLTHROUGH */ 424 1.33 manu case ADB_PBEXTKBD: /* FALLTHROUGH */ 425 1.33 manu case ADB_DESIGNKBD: /* FALLTHROUGH */ 426 1.33 manu case 0x1c: /* FALLTHROUGH */ 427 1.33 manu case 0xc0: /* FALLTHROUGH */ 428 1.33 manu case ADB_PBG3KBD: /* FALLTHROUGH */ 429 1.33 manu case 0xc6: /* FALLTHROUGH */ 430 1.33 manu default: /* default to ANSI for unknown values */ 431 1.33 manu sc->sc_emul_usb = ADB_EMUL_USB_ANSI; 432 1.33 manu wskbd_set_evtrans(sc->sc_wskbddev, adb_to_usb_ansi, 128); 433 1.33 manu break; 434 1.33 manu } 435 1.19 macallan #endif /* ADBKBD_EMUL_USB */ 436 1.1 macallan 437 1.11 macallan #if NWSMOUSE > 0 438 1.1 macallan /* attach the mouse device */ 439 1.1 macallan am.accessops = &adbkms_accessops; 440 1.1 macallan am.accesscookie = sc; 441 1.31 thorpej sc->sc_wsmousedev = config_found(self, &am, wsmousedevprint, 442 1.32 thorpej CFARGS(.iattr = "wsmousedev")); 443 1.11 macallan #endif 444 1.18 macallan adbkbd_setup_sysctl(sc); 445 1.3 macallan 446 1.3 macallan /* finally register the power button */ 447 1.3 macallan sysmon_task_queue_init(); 448 1.3 macallan memset(&sc->sc_sm_pbutton, 0, sizeof(struct sysmon_pswitch)); 449 1.12 matt sc->sc_sm_pbutton.smpsw_name = device_xname(sc->sc_dev); 450 1.3 macallan sc->sc_sm_pbutton.smpsw_type = PSWITCH_TYPE_POWER; 451 1.3 macallan if (sysmon_pswitch_register(&sc->sc_sm_pbutton) != 0) 452 1.12 matt aprint_error_dev(sc->sc_dev, 453 1.12 matt "unable to register power button with sysmon\n"); 454 1.1 macallan } 455 1.1 macallan 456 1.1 macallan static void 457 1.1 macallan adbkbd_handler(void *cookie, int len, uint8_t *data) 458 1.1 macallan { 459 1.1 macallan struct adbkbd_softc *sc = cookie; 460 1.1 macallan 461 1.1 macallan #ifdef ADBKBD_DEBUG 462 1.1 macallan int i; 463 1.12 matt printf("%s: %02x - ", device_xname(sc->sc_dev), sc->sc_us); 464 1.1 macallan for (i = 0; i < len; i++) { 465 1.1 macallan printf(" %02x", data[i]); 466 1.1 macallan } 467 1.1 macallan printf("\n"); 468 1.1 macallan #endif 469 1.1 macallan if (len >= 2) { 470 1.1 macallan if (data[1] == sc->sc_us) { 471 1.1 macallan adbkbd_keys(sc, data[2], data[3]); 472 1.1 macallan return; 473 1.1 macallan } else { 474 1.1 macallan memcpy(sc->sc_buffer, data, len); 475 1.1 macallan } 476 1.1 macallan sc->sc_msg_len = len; 477 1.35 macallan cv_signal(&sc->sc_event); 478 1.1 macallan } else { 479 1.1 macallan DPRINTF("bogus message\n"); 480 1.1 macallan } 481 1.1 macallan } 482 1.1 macallan 483 1.1 macallan static int 484 1.1 macallan adbkbd_wait(struct adbkbd_softc *sc, int timeout) 485 1.1 macallan { 486 1.1 macallan int cnt = 0; 487 1.1 macallan 488 1.1 macallan if (sc->sc_poll) { 489 1.1 macallan while (sc->sc_msg_len == 0) { 490 1.1 macallan sc->sc_ops->poll(sc->sc_ops->cookie); 491 1.1 macallan } 492 1.1 macallan } else { 493 1.35 macallan mutex_enter(&sc->sc_interlock); 494 1.1 macallan while ((sc->sc_msg_len == 0) && (cnt < timeout)) { 495 1.35 macallan cv_timedwait(&sc->sc_event, &sc->sc_interlock, hz); 496 1.1 macallan cnt++; 497 1.1 macallan } 498 1.35 macallan mutex_exit(&sc->sc_interlock); 499 1.1 macallan } 500 1.1 macallan return (sc->sc_msg_len > 0); 501 1.1 macallan } 502 1.1 macallan 503 1.1 macallan static void 504 1.1 macallan adbkbd_keys(struct adbkbd_softc *sc, uint8_t k1, uint8_t k2) 505 1.1 macallan { 506 1.3 macallan 507 1.1 macallan /* keyboard event processing */ 508 1.3 macallan 509 1.1 macallan DPRINTF("[%02x %02x]", k1, k2); 510 1.3 macallan 511 1.6 macallan if (((k1 == k2) && (k1 == 0x7f)) || (k1 == sc->sc_power)) { 512 1.10 macallan uint32_t now = time_second; 513 1.10 macallan uint32_t diff = now - sc->sc_timestamp; 514 1.3 macallan 515 1.10 macallan sc->sc_timestamp = now; 516 1.16 macallan if (((diff > 1) && (diff < 5)) || 517 1.16 macallan (sc->sc_power_button_delay == 0)) { 518 1.29 christos #ifdef DDB 519 1.28 macallan if (sc->sc_power_dbg) { 520 1.28 macallan Debugger(); 521 1.29 christos return; 522 1.28 macallan } 523 1.29 christos #endif 524 1.29 christos /* power button, report to sysmon */ 525 1.29 christos sc->sc_pe = k1; 526 1.29 christos sysmon_task_queue_sched(0, adbkbd_powerbutton, sc); 527 1.10 macallan } 528 1.1 macallan } else { 529 1.3 macallan 530 1.1 macallan adbkbd_key(sc, k1); 531 1.1 macallan if (k2 != 0xff) 532 1.1 macallan adbkbd_key(sc, k2); 533 1.1 macallan } 534 1.1 macallan } 535 1.1 macallan 536 1.9 macallan static void 537 1.9 macallan adbkbd_powerbutton(void *cookie) 538 1.9 macallan { 539 1.9 macallan struct adbkbd_softc *sc = cookie; 540 1.9 macallan 541 1.28 macallan sysmon_pswitch_event(&sc->sc_sm_pbutton, 542 1.28 macallan ADBK_PRESS(sc->sc_pe) ? PSWITCH_EVENT_PRESSED : 543 1.28 macallan PSWITCH_EVENT_RELEASED); 544 1.28 macallan 545 1.9 macallan } 546 1.9 macallan 547 1.1 macallan static inline void 548 1.1 macallan adbkbd_key(struct adbkbd_softc *sc, uint8_t k) 549 1.1 macallan { 550 1.1 macallan 551 1.1 macallan if (sc->sc_poll) { 552 1.1 macallan if (sc->sc_polled_chars >= 16) { 553 1.12 matt aprint_error_dev(sc->sc_dev,"polling buffer is full\n"); 554 1.1 macallan } 555 1.1 macallan sc->sc_pollbuf[sc->sc_polled_chars] = k; 556 1.1 macallan sc->sc_polled_chars++; 557 1.1 macallan return; 558 1.1 macallan } 559 1.1 macallan 560 1.11 macallan #if NWSMOUSE > 0 561 1.1 macallan /* translate some keys to mouse events */ 562 1.1 macallan if (sc->sc_wsmousedev != NULL) { 563 1.1 macallan if (ADBK_KEYVAL(k) == sc->sc_trans[1]) { 564 1.1 macallan wsmouse_input(sc->sc_wsmousedev, ADBK_PRESS(k) ? 2 : 0, 565 1.1 macallan 0, 0, 0, 0, 566 1.1 macallan WSMOUSE_INPUT_DELTA); 567 1.1 macallan return; 568 1.1 macallan } 569 1.1 macallan if (ADBK_KEYVAL(k) == sc->sc_trans[2]) { 570 1.1 macallan wsmouse_input(sc->sc_wsmousedev, ADBK_PRESS(k) ? 4 : 0, 571 1.1 macallan 0, 0, 0, 0, 572 1.1 macallan WSMOUSE_INPUT_DELTA); 573 1.1 macallan return; 574 1.1 macallan } 575 1.1 macallan } 576 1.11 macallan #endif 577 1.11 macallan 578 1.1 macallan #ifdef WSDISPLAY_COMPAT_RAWKBD 579 1.1 macallan if (sc->sc_rawkbd) { 580 1.1 macallan char cbuf[2]; 581 1.1 macallan int s; 582 1.1 macallan 583 1.8 macallan cbuf[0] = k; 584 1.1 macallan 585 1.1 macallan s = spltty(); 586 1.8 macallan wskbd_rawinput(sc->sc_wskbddev, cbuf, 1); 587 1.1 macallan splx(s); 588 1.1 macallan } else { 589 1.1 macallan #endif 590 1.1 macallan 591 1.1 macallan if (ADBK_KEYVAL(k) == 0x39) { 592 1.1 macallan /* caps lock - send up and down */ 593 1.1 macallan if (ADBK_PRESS(k) != sc->sc_capslock) { 594 1.1 macallan sc->sc_capslock = ADBK_PRESS(k); 595 1.1 macallan wskbd_input(sc->sc_wskbddev, 596 1.1 macallan WSCONS_EVENT_KEY_DOWN, 0x39); 597 1.1 macallan wskbd_input(sc->sc_wskbddev, 598 1.1 macallan WSCONS_EVENT_KEY_UP, 0x39); 599 1.1 macallan } 600 1.1 macallan } else { 601 1.1 macallan /* normal event */ 602 1.1 macallan int type; 603 1.1 macallan 604 1.1 macallan type = ADBK_PRESS(k) ? 605 1.1 macallan WSCONS_EVENT_KEY_DOWN : WSCONS_EVENT_KEY_UP; 606 1.1 macallan wskbd_input(sc->sc_wskbddev, type, ADBK_KEYVAL(k)); 607 1.1 macallan } 608 1.1 macallan #ifdef WSDISPLAY_COMPAT_RAWKBD 609 1.1 macallan } 610 1.1 macallan #endif 611 1.1 macallan } 612 1.1 macallan 613 1.1 macallan /* 614 1.1 macallan * Set the keyboard LED's. 615 1.1 macallan * 616 1.1 macallan * Automatically translates from ioctl/softc format to the 617 1.1 macallan * actual keyboard register format 618 1.1 macallan */ 619 1.1 macallan static void 620 1.1 macallan adbkbd_set_leds(void *cookie, int leds) 621 1.1 macallan { 622 1.1 macallan struct adbkbd_softc *sc = cookie; 623 1.1 macallan int aleds; 624 1.1 macallan short cmd; 625 1.1 macallan uint8_t buffer[2]; 626 1.1 macallan 627 1.1 macallan DPRINTF("adbkbd_set_leds: %02x\n", leds); 628 1.1 macallan if ((leds & 0x07) == (sc->sc_leds & 0x07)) 629 1.1 macallan return; 630 1.1 macallan 631 1.1 macallan if (sc->sc_have_led_control) { 632 1.1 macallan 633 1.1 macallan aleds = (~leds & 0x04) | 3; 634 1.1 macallan if (leds & 1) 635 1.1 macallan aleds &= ~2; 636 1.1 macallan if (leds & 2) 637 1.1 macallan aleds &= ~1; 638 1.1 macallan 639 1.1 macallan buffer[0] = 0xff; 640 1.1 macallan buffer[1] = aleds | 0xf8; 641 1.1 macallan 642 1.1 macallan cmd = ADBLISTEN(sc->sc_adbdev->current_addr, 2); 643 1.11 macallan sc->sc_ops->send(sc->sc_ops->cookie, sc->sc_poll, cmd, 2, 644 1.11 macallan buffer); 645 1.1 macallan } 646 1.1 macallan 647 1.1 macallan sc->sc_leds = leds & 7; 648 1.1 macallan } 649 1.1 macallan 650 1.1 macallan static void 651 1.1 macallan adbkbd_initleds(struct adbkbd_softc *sc) 652 1.1 macallan { 653 1.1 macallan short cmd; 654 1.1 macallan 655 1.1 macallan /* talk R2 */ 656 1.1 macallan cmd = ADBTALK(sc->sc_adbdev->current_addr, 2); 657 1.1 macallan sc->sc_msg_len = 0; 658 1.1 macallan sc->sc_ops->send(sc->sc_ops->cookie, sc->sc_poll, cmd, 0, NULL); 659 1.1 macallan if (!adbkbd_wait(sc, 10)) { 660 1.24 macallan aprint_error_dev(sc->sc_dev, "unable to read LED state\n"); 661 1.1 macallan return; 662 1.1 macallan } 663 1.1 macallan sc->sc_have_led_control = 1; 664 1.1 macallan DPRINTF("have LED control\n"); 665 1.1 macallan return; 666 1.1 macallan } 667 1.1 macallan 668 1.1 macallan static int 669 1.1 macallan adbkbd_enable(void *v, int on) 670 1.1 macallan { 671 1.1 macallan return 0; 672 1.1 macallan } 673 1.1 macallan 674 1.1 macallan static int 675 1.5 christos adbkbd_ioctl(void *v, u_long cmd, void *data, int flag, struct lwp *l) 676 1.1 macallan { 677 1.1 macallan struct adbkbd_softc *sc = (struct adbkbd_softc *) v; 678 1.1 macallan 679 1.1 macallan switch (cmd) { 680 1.1 macallan 681 1.1 macallan case WSKBDIO_GTYPE: 682 1.33 manu if (sc->sc_emul_usb != ADB_EMUL_USB_NONE) { 683 1.18 macallan *(int *)data = WSKBD_TYPE_USB; 684 1.18 macallan } else { 685 1.18 macallan *(int *)data = WSKBD_TYPE_ADB; 686 1.18 macallan } 687 1.1 macallan return 0; 688 1.1 macallan case WSKBDIO_SETLEDS: 689 1.1 macallan adbkbd_set_leds(sc, *(int *)data); 690 1.1 macallan return 0; 691 1.1 macallan case WSKBDIO_GETLEDS: 692 1.1 macallan *(int *)data = sc->sc_leds; 693 1.1 macallan return 0; 694 1.1 macallan #ifdef WSDISPLAY_COMPAT_RAWKBD 695 1.1 macallan case WSKBDIO_SETMODE: 696 1.1 macallan sc->sc_rawkbd = *(int *)data == WSKBD_RAW; 697 1.1 macallan return 0; 698 1.1 macallan #endif 699 1.1 macallan } 700 1.1 macallan 701 1.1 macallan return EPASSTHROUGH; 702 1.1 macallan } 703 1.1 macallan 704 1.1 macallan int 705 1.13 cegger adbkbd_cnattach(void) 706 1.1 macallan { 707 1.1 macallan 708 1.1 macallan adbkbd_is_console = 1; 709 1.1 macallan return 0; 710 1.1 macallan } 711 1.1 macallan 712 1.1 macallan static void 713 1.1 macallan adbkbd_cngetc(void *v, u_int *type, int *data) 714 1.1 macallan { 715 1.1 macallan struct adbkbd_softc *sc = v; 716 1.1 macallan int key, press, val; 717 1.1 macallan int s; 718 1.1 macallan 719 1.1 macallan s = splhigh(); 720 1.1 macallan 721 1.1 macallan KASSERT(sc->sc_poll); 722 1.1 macallan 723 1.1 macallan DPRINTF("polling..."); 724 1.1 macallan while (sc->sc_polled_chars == 0) { 725 1.1 macallan sc->sc_ops->poll(sc->sc_ops->cookie); 726 1.1 macallan } 727 1.1 macallan DPRINTF(" got one\n"); 728 1.1 macallan splx(s); 729 1.1 macallan 730 1.1 macallan key = sc->sc_pollbuf[0]; 731 1.1 macallan sc->sc_polled_chars--; 732 1.1 macallan memmove(sc->sc_pollbuf, sc->sc_pollbuf + 1, 733 1.1 macallan sc->sc_polled_chars); 734 1.1 macallan 735 1.1 macallan press = ADBK_PRESS(key); 736 1.1 macallan val = ADBK_KEYVAL(key); 737 1.1 macallan 738 1.1 macallan *data = val; 739 1.1 macallan *type = press ? WSCONS_EVENT_KEY_DOWN : WSCONS_EVENT_KEY_UP; 740 1.1 macallan } 741 1.1 macallan 742 1.1 macallan static void 743 1.1 macallan adbkbd_cnpollc(void *v, int on) 744 1.1 macallan { 745 1.1 macallan struct adbkbd_softc *sc = v; 746 1.1 macallan 747 1.1 macallan sc->sc_poll = on; 748 1.1 macallan if (!on) { 749 1.1 macallan int i; 750 1.1 macallan 751 1.1 macallan /* feed the poll buffer's content to wskbd */ 752 1.1 macallan for (i = 0; i < sc->sc_polled_chars; i++) { 753 1.1 macallan adbkbd_key(sc, sc->sc_pollbuf[i]); 754 1.1 macallan } 755 1.1 macallan sc->sc_polled_chars = 0; 756 1.1 macallan } 757 1.1 macallan } 758 1.1 macallan 759 1.11 macallan #if NWSMOUSE > 0 760 1.1 macallan /* stuff for the pseudo mouse */ 761 1.1 macallan static int 762 1.1 macallan adbkms_enable(void *v) 763 1.1 macallan { 764 1.1 macallan return 0; 765 1.1 macallan } 766 1.1 macallan 767 1.1 macallan static int 768 1.5 christos adbkms_ioctl(void *v, u_long cmd, void *data, int flag, struct lwp *l) 769 1.1 macallan { 770 1.1 macallan 771 1.1 macallan switch (cmd) { 772 1.1 macallan case WSMOUSEIO_GTYPE: 773 1.1 macallan *(u_int *)data = WSMOUSE_TYPE_PSEUDO; 774 1.1 macallan break; 775 1.1 macallan 776 1.1 macallan default: 777 1.1 macallan return (EPASSTHROUGH); 778 1.1 macallan } 779 1.1 macallan return (0); 780 1.1 macallan } 781 1.1 macallan 782 1.1 macallan static void 783 1.1 macallan adbkms_disable(void *v) 784 1.1 macallan { 785 1.1 macallan } 786 1.1 macallan 787 1.1 macallan static int 788 1.14 macallan adbkbd_sysctl_mid(SYSCTLFN_ARGS) 789 1.1 macallan { 790 1.1 macallan struct sysctlnode node = *rnode; 791 1.1 macallan struct adbkbd_softc *sc=(struct adbkbd_softc *)node.sysctl_data; 792 1.1 macallan const int *np = newp; 793 1.14 macallan int reg; 794 1.1 macallan 795 1.14 macallan DPRINTF("adbkbd_sysctl_mid\n"); 796 1.14 macallan reg = sc->sc_trans[1]; 797 1.1 macallan if (np) { 798 1.1 macallan /* we're asked to write */ 799 1.1 macallan node.sysctl_data = ® 800 1.1 macallan if (sysctl_lookup(SYSCTLFN_CALL(&node)) == 0) { 801 1.1 macallan 802 1.14 macallan sc->sc_trans[1] = *(int *)node.sysctl_data; 803 1.1 macallan return 0; 804 1.1 macallan } 805 1.1 macallan return EINVAL; 806 1.1 macallan } else { 807 1.14 macallan node.sysctl_data = ® 808 1.14 macallan node.sysctl_size = 4; 809 1.14 macallan return (sysctl_lookup(SYSCTLFN_CALL(&node))); 810 1.14 macallan } 811 1.14 macallan } 812 1.14 macallan 813 1.14 macallan static int 814 1.14 macallan adbkbd_sysctl_right(SYSCTLFN_ARGS) 815 1.14 macallan { 816 1.14 macallan struct sysctlnode node = *rnode; 817 1.14 macallan struct adbkbd_softc *sc=(struct adbkbd_softc *)node.sysctl_data; 818 1.14 macallan const int *np = newp; 819 1.14 macallan int reg; 820 1.14 macallan 821 1.14 macallan DPRINTF("adbkbd_sysctl_right\n"); 822 1.14 macallan reg = sc->sc_trans[2]; 823 1.14 macallan if (np) { 824 1.14 macallan /* we're asked to write */ 825 1.14 macallan node.sysctl_data = ® 826 1.14 macallan if (sysctl_lookup(SYSCTLFN_CALL(&node)) == 0) { 827 1.14 macallan 828 1.14 macallan sc->sc_trans[2] = *(int *)node.sysctl_data; 829 1.14 macallan return 0; 830 1.14 macallan } 831 1.14 macallan return EINVAL; 832 1.14 macallan } else { 833 1.14 macallan node.sysctl_data = ® 834 1.1 macallan node.sysctl_size = 4; 835 1.1 macallan return (sysctl_lookup(SYSCTLFN_CALL(&node))); 836 1.1 macallan } 837 1.1 macallan } 838 1.1 macallan 839 1.18 macallan #endif /* NWSMOUSE > 0 */ 840 1.18 macallan 841 1.18 macallan static int 842 1.18 macallan adbkbd_sysctl_usb(SYSCTLFN_ARGS) 843 1.18 macallan { 844 1.18 macallan struct sysctlnode node = *rnode; 845 1.18 macallan struct adbkbd_softc *sc=(struct adbkbd_softc *)node.sysctl_data; 846 1.18 macallan const int *np = newp; 847 1.33 manu int reg; 848 1.18 macallan 849 1.18 macallan DPRINTF("%s\n", __func__); 850 1.18 macallan reg = sc->sc_emul_usb; 851 1.18 macallan if (np) { 852 1.18 macallan /* we're asked to write */ 853 1.18 macallan node.sysctl_data = ® 854 1.18 macallan if (sysctl_lookup(SYSCTLFN_CALL(&node)) == 0) { 855 1.18 macallan 856 1.33 manu sc->sc_emul_usb = *(int *)node.sysctl_data; 857 1.33 manu switch (sc->sc_emul_usb) { 858 1.33 manu case ADB_EMUL_USB_NONE: 859 1.33 manu wskbd_set_evtrans(sc->sc_wskbddev, NULL, 0); 860 1.33 manu break; 861 1.33 manu case ADB_EMUL_USB_ANSI: 862 1.33 manu wskbd_set_evtrans(sc->sc_wskbddev, 863 1.33 manu adb_to_usb_ansi, 128); 864 1.33 manu break; 865 1.33 manu case ADB_EMUL_USB_ISO: 866 1.18 macallan wskbd_set_evtrans(sc->sc_wskbddev, 867 1.33 manu adb_to_usb_iso, 128); 868 1.33 manu break; 869 1.33 manu case ADB_EMUL_USB_JIS: 870 1.33 manu wskbd_set_evtrans(sc->sc_wskbddev, 871 1.33 manu adb_to_usb_jis, 128); 872 1.33 manu break; 873 1.33 manu default: 874 1.33 manu return EINVAL; 875 1.33 manu break; 876 1.18 macallan } 877 1.18 macallan return 0; 878 1.18 macallan } 879 1.18 macallan return EINVAL; 880 1.18 macallan } else { 881 1.18 macallan node.sysctl_data = ® 882 1.18 macallan node.sysctl_size = sizeof(reg); 883 1.18 macallan return (sysctl_lookup(SYSCTLFN_CALL(&node))); 884 1.18 macallan } 885 1.18 macallan } 886 1.18 macallan 887 1.25 macallan static int 888 1.25 macallan adbkbd_sysctl_dbg(SYSCTLFN_ARGS) 889 1.25 macallan { 890 1.25 macallan struct sysctlnode node = *rnode; 891 1.25 macallan struct adbkbd_softc *sc=(struct adbkbd_softc *)node.sysctl_data; 892 1.25 macallan const int *np = newp; 893 1.25 macallan bool reg; 894 1.25 macallan 895 1.25 macallan DPRINTF("%s\n", __func__); 896 1.25 macallan reg = sc->sc_power_dbg; 897 1.25 macallan if (np) { 898 1.25 macallan /* we're asked to write */ 899 1.25 macallan node.sysctl_data = ® 900 1.25 macallan if (sysctl_lookup(SYSCTLFN_CALL(&node)) == 0) { 901 1.25 macallan 902 1.25 macallan sc->sc_power_dbg = *(bool *)node.sysctl_data; 903 1.25 macallan return 0; 904 1.25 macallan } 905 1.25 macallan return EINVAL; 906 1.25 macallan } else { 907 1.25 macallan node.sysctl_data = ® 908 1.25 macallan node.sysctl_size = sizeof(reg); 909 1.25 macallan return (sysctl_lookup(SYSCTLFN_CALL(&node))); 910 1.25 macallan } 911 1.25 macallan } 912 1.25 macallan 913 1.18 macallan static void 914 1.18 macallan adbkbd_setup_sysctl(struct adbkbd_softc *sc) 915 1.18 macallan { 916 1.18 macallan const struct sysctlnode *me, *node; 917 1.18 macallan int ret; 918 1.18 macallan 919 1.18 macallan DPRINTF("%s: sysctl setup\n", device_xname(sc->sc_dev)); 920 1.18 macallan ret = sysctl_createv(NULL, 0, NULL, &me, 921 1.18 macallan CTLFLAG_READWRITE, 922 1.18 macallan CTLTYPE_NODE, device_xname(sc->sc_dev), NULL, 923 1.18 macallan NULL, 0, NULL, 0, 924 1.18 macallan CTL_MACHDEP, CTL_CREATE, CTL_EOL); 925 1.18 macallan ret = sysctl_createv(NULL, 0, NULL, 926 1.18 macallan (void *)&node, 927 1.18 macallan CTLFLAG_READWRITE | CTLFLAG_OWNDESC, 928 1.33 manu CTLTYPE_INT, "emulate_usb", "USB keyboard emulation", 929 1.18 macallan adbkbd_sysctl_usb, 1, (void *)sc, 0, CTL_MACHDEP, 930 1.18 macallan me->sysctl_num, CTL_CREATE, CTL_EOL); 931 1.25 macallan ret = sysctl_createv(NULL, 0, NULL, 932 1.25 macallan (void *)&node, 933 1.25 macallan CTLFLAG_READWRITE | CTLFLAG_OWNDESC, 934 1.25 macallan CTLTYPE_BOOL, "power_ddb", "power button triggers ddb", 935 1.25 macallan adbkbd_sysctl_dbg, 1, (void *)sc, 0, CTL_MACHDEP, 936 1.25 macallan me->sysctl_num, CTL_CREATE, CTL_EOL); 937 1.18 macallan #if NWSMOUSE > 0 938 1.18 macallan if (sc->sc_wsmousedev != NULL) { 939 1.18 macallan ret = sysctl_createv(NULL, 0, NULL, 940 1.18 macallan (void *)&node, 941 1.18 macallan CTLFLAG_READWRITE | CTLFLAG_OWNDESC, 942 1.18 macallan CTLTYPE_INT, "middle", "middle mouse button", 943 1.18 macallan adbkbd_sysctl_mid, 1, (void *)sc, 0, CTL_MACHDEP, 944 1.18 macallan me->sysctl_num, CTL_CREATE, CTL_EOL); 945 1.18 macallan 946 1.18 macallan ret = sysctl_createv(NULL, 0, NULL, 947 1.18 macallan (void *)&node, 948 1.18 macallan CTLFLAG_READWRITE | CTLFLAG_OWNDESC, 949 1.18 macallan CTLTYPE_INT, "right", "right mouse button", 950 1.18 macallan adbkbd_sysctl_right, 2, (void *)sc, 0, CTL_MACHDEP, 951 1.18 macallan me->sysctl_num, CTL_CREATE, CTL_EOL); 952 1.18 macallan } 953 1.18 macallan #endif /* NWSMOUSE > 0 */ 954 1.22 nisimura 955 1.22 nisimura (void)ret; 956 1.18 macallan } 957 1.18 macallan 958 1.1 macallan SYSCTL_SETUP(sysctl_adbkbdtrans_setup, "adbkbd translator setup") 959 1.1 macallan { 960 1.1 macallan 961 1.1 macallan sysctl_createv(NULL, 0, NULL, NULL, 962 1.1 macallan CTLFLAG_PERMANENT, 963 1.1 macallan CTLTYPE_NODE, "machdep", NULL, 964 1.1 macallan NULL, 0, NULL, 0, 965 1.1 macallan CTL_MACHDEP, CTL_EOL); 966 1.1 macallan } 967