2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
4 * Copyright (C) 2008 Nathan Whitehorn
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 #include <sys/cdefs.h>
31 #include <sys/param.h>
32 #include <sys/systm.h>
34 #include <sys/module.h>
35 #include <sys/mutex.h>
39 #include <sys/condvar.h>
40 #include <sys/callout.h>
41 #include <sys/kernel.h>
42 #include <sys/sysctl.h>
44 #include <machine/bus.h>
47 #include <dev/kbd/kbdreg.h>
48 #include <dev/kbd/kbdtables.h>
49 #include <dev/ofw/openfirm.h>
50 #include <dev/ofw/ofw_bus.h>
57 #define KBD_DRIVER_NAME "akbd"
59 #define AKBD_EMULATE_ATKBD 1
61 static int adb_kbd_probe(device_t dev);
62 static int adb_kbd_attach(device_t dev);
63 static int adb_kbd_detach(device_t dev);
64 static void akbd_repeat(void *xsc);
65 static int adb_fn_keys(SYSCTL_HANDLER_ARGS);
67 static u_int adb_kbd_receive_packet(device_t dev, u_char status,
68 u_char command, u_char reg, int len, u_char *data);
70 struct adb_kbd_softc {
83 #ifdef AKBD_EMULATE_ATKBD
84 uint8_t at_buffered_char[2];
88 struct callout sc_repeater;
90 int sc_repeatcontinue;
94 static device_method_t adb_kbd_methods[] = {
95 /* Device interface */
96 DEVMETHOD(device_probe, adb_kbd_probe),
97 DEVMETHOD(device_attach, adb_kbd_attach),
98 DEVMETHOD(device_detach, adb_kbd_detach),
99 DEVMETHOD(device_shutdown, bus_generic_shutdown),
100 DEVMETHOD(device_suspend, bus_generic_suspend),
101 DEVMETHOD(device_resume, bus_generic_resume),
104 DEVMETHOD(adb_receive_packet, adb_kbd_receive_packet),
109 static driver_t adb_kbd_driver = {
112 sizeof(struct adb_kbd_softc),
115 static devclass_t adb_kbd_devclass;
117 DRIVER_MODULE(akbd, adb, adb_kbd_driver, adb_kbd_devclass, 0, 0);
119 #ifdef AKBD_EMULATE_ATKBD
121 #define SCAN_PRESS 0x000
122 #define SCAN_RELEASE 0x080
123 #define SCAN_PREFIX_E0 0x100
124 #define SCAN_PREFIX_E1 0x200
125 #define SCAN_PREFIX_CTL 0x400
126 #define SCAN_PREFIX_SHIFT 0x800
127 #define SCAN_PREFIX (SCAN_PREFIX_E0 | SCAN_PREFIX_E1 | \
128 SCAN_PREFIX_CTL | SCAN_PREFIX_SHIFT)
130 static const uint8_t adb_to_at_scancode_map[128] = { 30, 31, 32, 33, 35, 34,
131 44, 45, 46, 47, 0, 48, 16, 17, 18, 19, 21, 20, 2, 3, 4, 5, 7, 6, 13,
132 10, 8, 12, 9, 11, 27, 24, 22, 26, 23, 25, 28, 38, 36, 40, 37, 39, 43,
133 51, 53, 49, 50, 52, 15, 57, 41, 14, 0, 1, 29, 0, 42, 58, 56, 97, 98,
134 100, 95, 0, 0, 83, 0, 55, 0, 78, 0, 69, 0, 0, 0, 91, 89, 0, 74, 13, 0,
135 0, 82, 79, 80, 81, 75, 76, 77, 71, 0, 72, 73, 0, 0, 0, 63, 64, 65, 61,
136 66, 67, 0, 87, 0, 105, 0, 70, 0, 68, 0, 88, 0, 107, 102, 94, 96, 103,
137 62, 99, 60, 101, 59, 54, 93, 90, 0, 0 };
140 keycode2scancode(int keycode, int shift, int up)
142 static const int scan[] = {
143 /* KP enter, right ctrl, KP divide */
146 0x37 | SCAN_PREFIX_SHIFT,
147 /* right alt, home, up, page up, left, right, end */
148 0x38, 0x47, 0x48, 0x49, 0x4b, 0x4d, 0x4f,
149 /* down, page down, insert, delete */
150 0x50, 0x51, 0x52, 0x53,
151 /* pause/break (see also below) */
154 * MS: left window, right window, menu
155 * also Sun: left meta, right meta, compose
159 /* help, stop, again, props, undo, front, copy */
160 0x68, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63,
161 /* open, paste, find, cut, audiomute, audiolower, audioraise */
162 0x64, 0x65, 0x66, 0x67, 0x25, 0x1f, 0x1e,
169 if ((keycode >= 89) && (keycode < 89 + nitems(scan)))
170 scancode = scan[keycode - 89] | SCAN_PREFIX_E0;
172 if ((keycode == 104) && !(shift & CTLS))
173 scancode = 0x45 | SCAN_PREFIX_E1 | SCAN_PREFIX_CTL;
175 scancode &= ~SCAN_PREFIX_SHIFT;
176 return (scancode | (up ? SCAN_RELEASE : SCAN_PRESS));
180 /* keyboard driver declaration */
181 static int akbd_configure(int flags);
182 static kbd_probe_t akbd_probe;
183 static kbd_init_t akbd_init;
184 static kbd_term_t akbd_term;
185 static kbd_intr_t akbd_interrupt;
186 static kbd_test_if_t akbd_test_if;
187 static kbd_enable_t akbd_enable;
188 static kbd_disable_t akbd_disable;
189 static kbd_read_t akbd_read;
190 static kbd_check_t akbd_check;
191 static kbd_read_char_t akbd_read_char;
192 static kbd_check_char_t akbd_check_char;
193 static kbd_ioctl_t akbd_ioctl;
194 static kbd_lock_t akbd_lock;
195 static kbd_clear_state_t akbd_clear_state;
196 static kbd_get_state_t akbd_get_state;
197 static kbd_set_state_t akbd_set_state;
198 static kbd_poll_mode_t akbd_poll;
200 keyboard_switch_t akbdsw = {
204 .intr = akbd_interrupt,
205 .test_if = akbd_test_if,
206 .enable = akbd_enable,
207 .disable = akbd_disable,
210 .read_char = akbd_read_char,
211 .check_char = akbd_check_char,
214 .clear_state = akbd_clear_state,
215 .get_state = akbd_get_state,
216 .set_state = akbd_set_state,
220 KEYBOARD_DRIVER(akbd, akbdsw, akbd_configure);
223 adb_kbd_probe(device_t dev)
227 type = adb_get_device_type(dev);
229 if (type != ADB_DEVICE_KEYBOARD)
232 switch(adb_get_device_handler(dev)) {
234 device_set_desc(dev,"Apple Standard Keyboard");
237 device_set_desc(dev,"Apple Extended Keyboard");
240 device_set_desc(dev,"Apple ISO Keyboard");
243 device_set_desc(dev,"Apple Extended ISO Keyboard");
246 device_set_desc(dev,"Apple Keyboard II");
249 device_set_desc(dev,"Apple ISO Keyboard II");
252 device_set_desc(dev,"PowerBook Keyboard");
255 device_set_desc(dev,"PowerBook ISO Keyboard");
258 device_set_desc(dev,"PowerBook Extended Keyboard");
261 device_set_desc(dev,"Apple Design Keyboard");
264 device_set_desc(dev,"PowerBook G3 Keyboard");
267 device_set_desc(dev,"iBook Keyboard");
270 device_set_desc(dev,"ADB Keyboard");
287 adb_kbd_attach(device_t dev)
289 struct adb_kbd_softc *sc;
290 keyboard_switch_t *sw;
294 sw = kbd_get_switch(KBD_DRIVER_NAME);
299 sc = device_get_softc(dev);
303 sc->have_led_control = 0;
306 /* Try stepping forward to the extended keyboard protocol */
307 adb_set_device_handler(dev,3);
309 mtx_init(&sc->sc_mutex, KBD_DRIVER_NAME, NULL, MTX_DEF);
310 cv_init(&sc->sc_cv,KBD_DRIVER_NAME);
311 callout_init(&sc->sc_repeater, 0);
313 #ifdef AKBD_EMULATE_ATKBD
314 kbd_init_struct(&sc->sc_kbd, KBD_DRIVER_NAME, KB_101, 0, 0, 0, 0);
315 kbd_set_maps(&sc->sc_kbd, &key_map, &accent_map, fkey_tab,
316 sizeof(fkey_tab) / sizeof(fkey_tab[0]));
318 #error ADB raw mode not implemented
321 KBD_FOUND_DEVICE(&sc->sc_kbd);
322 KBD_PROBE_DONE(&sc->sc_kbd);
323 KBD_INIT_DONE(&sc->sc_kbd);
324 KBD_CONFIG_DONE(&sc->sc_kbd);
326 (*sw->enable)(&sc->sc_kbd);
328 kbd_register(&sc->sc_kbd);
330 #ifdef KBD_INSTALL_CDEV
331 if (kbd_attach(&sc->sc_kbd)) {
337 /* Check if we can read out the LED state from
338 this keyboard by reading the key state register */
339 if (adb_read_register(dev, 2, NULL) == 2)
340 sc->have_led_control = 1;
342 adb_set_autopoll(dev,1);
344 handle = OF_finddevice("mac-io/via-pmu/adb/keyboard");
345 if (handle != -1 && OF_getprop(handle, "AAPL,has-embedded-fn-keys",
346 &fkeys, sizeof(fkeys)) != -1) {
347 static const char *key_names[] = {"F1", "F2", "F3", "F4", "F5",
348 "F6", "F7", "F8", "F9", "F10", "F11", "F12"};
349 struct sysctl_ctx_list *ctx;
350 struct sysctl_oid *tree;
354 device_printf(dev, "Keyboard has embedded Fn keys\n");
356 for (i = 0; i < 12; i++) {
359 if (OF_getprop(handle, key_names[i], &keyval,
365 adb_write_register(dev, 0, 3, buf);
367 adb_write_register(dev, 1, 2, &(uint16_t){0});
369 ctx = device_get_sysctl_ctx(dev);
370 tree = device_get_sysctl_tree(dev);
372 SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
373 "fn_keys_function_as_primary",
374 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, sc,
376 "Set the Fn keys to be their F-key type as default");
383 adb_kbd_detach(device_t dev)
385 struct adb_kbd_softc *sc;
388 sc = device_get_softc(dev);
390 adb_set_autopoll(dev,0);
391 callout_stop(&sc->sc_repeater);
393 mtx_lock(&sc->sc_mutex);
395 kbd = kbd_get_keyboard(kbd_find_keyboard(KBD_DRIVER_NAME,
396 device_get_unit(dev)));
400 #ifdef KBD_INSTALL_CDEV
406 mtx_unlock(&sc->sc_mutex);
408 mtx_destroy(&sc->sc_mutex);
409 cv_destroy(&sc->sc_cv);
415 adb_kbd_receive_packet(device_t dev, u_char status,
416 u_char command, u_char reg, int len, u_char *data)
418 struct adb_kbd_softc *sc;
420 sc = device_get_softc(dev);
422 if (command != ADB_COMMAND_TALK)
425 if (reg != 0 || len != 2)
428 mtx_lock(&sc->sc_mutex);
429 /* 0x7f is always the power button */
430 if (data[0] == 0x7f) {
431 devctl_notify("PMU", "Button", "pressed", NULL);
432 mtx_unlock(&sc->sc_mutex);
434 } else if (data[0] == 0xff) {
435 mtx_unlock(&sc->sc_mutex);
436 return (0); /* Ignore power button release. */
438 if ((data[0] & 0x7f) == 57 && sc->buffers < 7) {
439 /* Fake the down/up cycle for caps lock */
440 sc->buffer[sc->buffers++] = data[0] & 0x7f;
441 sc->buffer[sc->buffers++] = (data[0] & 0x7f) | (1 << 7);
443 sc->buffer[sc->buffers++] = data[0];
445 if (sc->buffer[sc->buffers-1] < 0xff)
446 sc->last_press = sc->buffer[sc->buffers-1];
448 if ((data[1] & 0x7f) == 57 && sc->buffers < 7) {
449 /* Fake the down/up cycle for caps lock */
450 sc->buffer[sc->buffers++] = data[1] & 0x7f;
451 sc->buffer[sc->buffers++] = (data[1] & 0x7f) | (1 << 7);
453 sc->buffer[sc->buffers++] = data[1];
456 if (sc->buffer[sc->buffers-1] < 0xff)
457 sc->last_press = sc->buffer[sc->buffers-1];
459 /* Stop any existing key repeating */
460 callout_stop(&sc->sc_repeater);
462 /* Schedule a repeat callback on keydown */
463 if (!(sc->last_press & (1 << 7))) {
464 callout_reset(&sc->sc_repeater,
465 ms_to_ticks(sc->sc_kbd.kb_delay1), akbd_repeat, sc);
467 mtx_unlock(&sc->sc_mutex);
469 cv_broadcast(&sc->sc_cv);
471 if (KBD_IS_ACTIVE(&sc->sc_kbd) && KBD_IS_BUSY(&sc->sc_kbd)) {
472 sc->sc_kbd.kb_callback.kc_func(&sc->sc_kbd,
473 KBDIO_KEYINPUT, sc->sc_kbd.kb_callback.kc_arg);
480 akbd_repeat(void *xsc) {
481 struct adb_kbd_softc *sc = xsc;
484 /* Fake an up/down key repeat so long as we have the
486 mtx_lock(&sc->sc_mutex);
487 if (sc->buffers < 7) {
488 sc->buffer[sc->buffers++] = sc->last_press | (1 << 7);
489 sc->buffer[sc->buffers++] = sc->last_press;
493 mtx_unlock(&sc->sc_mutex);
495 if (notify_kbd && KBD_IS_ACTIVE(&sc->sc_kbd)
496 && KBD_IS_BUSY(&sc->sc_kbd)) {
497 sc->sc_kbd.kb_callback.kc_func(&sc->sc_kbd,
498 KBDIO_KEYINPUT, sc->sc_kbd.kb_callback.kc_arg);
501 /* Reschedule the callout */
502 callout_reset(&sc->sc_repeater, ms_to_ticks(sc->sc_kbd.kb_delay2),
507 akbd_configure(int flags)
513 akbd_probe(int unit, void *arg, int flags)
519 akbd_init(int unit, keyboard_t **kbdp, void *arg, int flags)
525 akbd_term(keyboard_t *kbd)
531 akbd_interrupt(keyboard_t *kbd, void *arg)
537 akbd_test_if(keyboard_t *kbd)
543 akbd_enable(keyboard_t *kbd)
550 akbd_disable(keyboard_t *kbd)
552 struct adb_kbd_softc *sc;
553 sc = (struct adb_kbd_softc *)(kbd);
555 callout_stop(&sc->sc_repeater);
561 akbd_read(keyboard_t *kbd, int wait)
567 akbd_check(keyboard_t *kbd)
569 struct adb_kbd_softc *sc;
571 if (!KBD_IS_ACTIVE(kbd))
574 sc = (struct adb_kbd_softc *)(kbd);
576 mtx_lock(&sc->sc_mutex);
577 #ifdef AKBD_EMULATE_ATKBD
578 if (sc->at_buffered_char[0]) {
579 mtx_unlock(&sc->sc_mutex);
584 if (sc->buffers > 0) {
585 mtx_unlock(&sc->sc_mutex);
588 mtx_unlock(&sc->sc_mutex);
594 akbd_read_char(keyboard_t *kbd, int wait)
596 struct adb_kbd_softc *sc;
601 sc = (struct adb_kbd_softc *)(kbd);
603 mtx_lock(&sc->sc_mutex);
605 #if defined(AKBD_EMULATE_ATKBD)
606 if (sc->sc_mode == K_RAW && sc->at_buffered_char[0]) {
607 key = sc->at_buffered_char[0];
608 if (key & SCAN_PREFIX) {
609 sc->at_buffered_char[0] = key & ~SCAN_PREFIX;
610 key = (key & SCAN_PREFIX_E0) ? 0xe0 : 0xe1;
612 sc->at_buffered_char[0] = sc->at_buffered_char[1];
613 sc->at_buffered_char[1] = 0;
616 mtx_unlock(&sc->sc_mutex);
622 if (!sc->buffers && wait)
623 cv_wait(&sc->sc_cv,&sc->sc_mutex);
626 mtx_unlock(&sc->sc_mutex);
630 adb_code = sc->buffer[0];
632 for (i = 1; i < sc->buffers; i++)
633 sc->buffer[i-1] = sc->buffer[i];
637 #ifdef AKBD_EMULATE_ATKBD
638 key = adb_to_at_scancode_map[adb_code & 0x7f];
639 if (sc->sc_mode == K_CODE) {
640 /* Add the key-release bit */
641 key |= adb_code & 0x80;
642 } else if (sc->sc_mode == K_RAW) {
644 * In the raw case, we have to emulate the gross
645 * variable-length AT keyboard thing. Since this code
646 * is copied from sunkbd, which is the same code
647 * as ukbd, it might be nice to have this centralized.
650 key = keycode2scancode(key,
653 if (key & SCAN_PREFIX) {
654 if (key & SCAN_PREFIX_CTL) {
655 sc->at_buffered_char[0] =
656 0x1d | (key & SCAN_RELEASE);
657 sc->at_buffered_char[1] =
659 } else if (key & SCAN_PREFIX_SHIFT) {
660 sc->at_buffered_char[0] =
661 0x2a | (key & SCAN_RELEASE);
662 sc->at_buffered_char[1] =
663 key & ~SCAN_PREFIX_SHIFT;
665 sc->at_buffered_char[0] =
667 sc->at_buffered_char[1] = 0;
670 key = (key & SCAN_PREFIX_E0) ? 0xe0 : 0xe1;
677 mtx_unlock(&sc->sc_mutex);
683 akbd_check_char(keyboard_t *kbd)
685 if (!KBD_IS_ACTIVE(kbd))
688 return (akbd_check(kbd));
692 set_typematic(keyboard_t *kbd, int code)
694 /* These numbers are in microseconds, so convert to ticks */
696 static int delays[] = { 250, 500, 750, 1000 };
697 static int rates[] = { 34, 38, 42, 46, 50, 55, 59, 63,
698 68, 76, 84, 92, 100, 110, 118, 126,
699 136, 152, 168, 184, 200, 220, 236, 252,
700 272, 304, 336, 368, 400, 440, 472, 504 };
704 kbd->kb_delay1 = delays[(code >> 5) & 3];
705 kbd->kb_delay2 = rates[code & 0x1f];
709 static int akbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t data)
711 struct adb_kbd_softc *sc;
715 sc = (struct adb_kbd_softc *)(kbd);
720 *(int *)data = sc->sc_mode;
723 switch (*(int *)data) {
725 if (sc->sc_mode != K_XLATE) {
726 /* make lock key state and LED state match */
727 sc->sc_state &= ~LOCK_MASK;
728 sc->sc_state |= KBD_LED_VAL(kbd);
733 if (sc->sc_mode != *(int *)data)
734 sc->sc_mode = *(int *)data;
744 *(int *)data = KBD_LED_VAL(kbd);
748 if (*(int *)data & ~LOCK_MASK) {
752 sc->sc_state &= ~LOCK_MASK;
753 sc->sc_state |= *(int *)data;
758 KBD_LED_VAL(kbd) = *(int *)data;
760 if (!sc->have_led_control)
763 r2 = (~0 & 0x04) | 3;
765 if (*(int *)data & NLKED)
767 if (*(int *)data & CLKED)
769 if (*(int *)data & SLKED)
772 adb_send_packet(sc->sc_dev,ADB_COMMAND_LISTEN,2,
773 sizeof(uint16_t),(u_char *)&r2);
778 *(int *)data = sc->sc_state & LOCK_MASK;
782 if (!KBD_HAS_DEVICE(kbd))
784 if (((int *)data)[1] < 0)
786 if (((int *)data)[0] < 0)
788 else if (((int *)data)[0] == 0) /* fastest possible value */
789 kbd->kb_delay1 = 200;
791 kbd->kb_delay1 = ((int *)data)[0];
792 kbd->kb_delay2 = ((int *)data)[1];
797 error = set_typematic(kbd, *(int *)data);
805 return (genkbd_commonioctl(kbd, cmd, data));
811 static int akbd_lock(keyboard_t *kbd, int lock)
816 static void akbd_clear_state(keyboard_t *kbd)
818 struct adb_kbd_softc *sc;
820 sc = (struct adb_kbd_softc *)(kbd);
822 mtx_lock(&sc->sc_mutex);
825 callout_stop(&sc->sc_repeater);
827 #if defined(AKBD_EMULATE_ATKBD)
828 sc->at_buffered_char[0] = 0;
829 sc->at_buffered_char[1] = 0;
831 mtx_unlock(&sc->sc_mutex);
834 static int akbd_get_state(keyboard_t *kbd, void *buf, size_t len)
839 static int akbd_set_state(keyboard_t *kbd, void *buf, size_t len)
844 static int akbd_poll(keyboard_t *kbd, int on)
850 akbd_modevent(module_t mod, int type, void *data)
854 kbd_add_driver(&akbd_kbd_driver);
858 kbd_delete_driver(&akbd_kbd_driver);
869 adb_fn_keys(SYSCTL_HANDLER_ARGS)
871 struct adb_kbd_softc *sc = arg1;
873 uint16_t is_fn_enabled;
874 unsigned int is_fn_enabled_sysctl;
876 adb_read_register(sc->sc_dev, 1, &is_fn_enabled);
878 is_fn_enabled_sysctl = is_fn_enabled;
879 error = sysctl_handle_int(oidp, &is_fn_enabled_sysctl, 0, req);
881 if (error || !req->newptr)
884 is_fn_enabled = is_fn_enabled_sysctl;
885 if (is_fn_enabled != 1 && is_fn_enabled != 0)
888 adb_write_register(sc->sc_dev, 1, 2, &is_fn_enabled);
892 DEV_MODULE(akbd, akbd_modevent, NULL);