xref: /freebsd/sys/dev/adb/adb_kbd.c (revision 54ebdd631db8c0bba2baab0155f603a8b5cf014a)
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
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
15  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
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$
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/kbio.h>
35 #include <sys/condvar.h>
36 #include <sys/callout.h>
37 #include <sys/kernel.h>
38 
39 #include <machine/bus.h>
40 
41 #include "opt_kbd.h"
42 #include <dev/kbd/kbdreg.h>
43 #include <dev/kbd/kbdtables.h>
44 
45 #include <vm/vm.h>
46 #include <vm/pmap.h>
47 
48 #include "adb.h"
49 
50 #define KBD_DRIVER_NAME "akbd"
51 
52 #define AKBD_EMULATE_ATKBD 1
53 
54 static int adb_kbd_probe(device_t dev);
55 static int adb_kbd_attach(device_t dev);
56 static int adb_kbd_detach(device_t dev);
57 static void akbd_repeat(void *xsc);
58 
59 static u_int adb_kbd_receive_packet(device_t dev, u_char status,
60 	u_char command, u_char reg, int len, u_char *data);
61 
62 struct adb_kbd_softc {
63 	keyboard_t sc_kbd;
64 
65 	device_t sc_dev;
66 	struct mtx sc_mutex;
67 	struct cv  sc_cv;
68 
69 	int sc_mode;
70 	int sc_state;
71 
72 	int have_led_control;
73 
74 	uint8_t buffer[8];
75 	volatile int buffers;
76 
77 	struct callout sc_repeater;
78 	int sc_repeatstart;
79 	int sc_repeatcontinue;
80 	uint8_t last_press;
81 };
82 
83 static device_method_t adb_kbd_methods[] = {
84 	/* Device interface */
85 	DEVMETHOD(device_probe,         adb_kbd_probe),
86         DEVMETHOD(device_attach,        adb_kbd_attach),
87         DEVMETHOD(device_detach,        adb_kbd_detach),
88         DEVMETHOD(device_shutdown,      bus_generic_shutdown),
89         DEVMETHOD(device_suspend,       bus_generic_suspend),
90         DEVMETHOD(device_resume,        bus_generic_resume),
91 
92 	/* ADB interface */
93 	DEVMETHOD(adb_receive_packet,	adb_kbd_receive_packet),
94 
95 	{ 0, 0 }
96 };
97 
98 static driver_t adb_kbd_driver = {
99 	"akbd",
100 	adb_kbd_methods,
101 	sizeof(struct adb_kbd_softc),
102 };
103 
104 static devclass_t adb_kbd_devclass;
105 
106 DRIVER_MODULE(akbd, adb, adb_kbd_driver, adb_kbd_devclass, 0, 0);
107 
108 static const uint8_t adb_to_at_scancode_map[128] = { 30, 31, 32, 33, 35, 34,
109 	44, 45, 46, 47, 0, 48, 16, 17, 18, 19, 21, 20, 2, 3, 4, 5, 7, 6, 13,
110 	10, 8, 12, 9, 11, 27, 24, 22, 26, 23, 25, 28, 38, 36, 40, 37, 39, 43,
111 	51, 53, 49, 50, 52, 15, 57, 41, 14, 0, 1, 29, 0, 42, 58, 56, 97, 98,
112 	100, 95, 0, 0, 83, 0, 55, 0, 78, 0, 69, 0, 0, 0, 91, 89, 0, 74, 13, 0,
113 	0, 82, 79, 80, 81, 75, 76, 77, 71, 0, 72, 73, 0, 0, 0, 63, 64, 65, 61,
114 	66, 67, 0, 87, 0, 105, 0, 70, 0, 68, 0, 88, 0, 107, 102, 94, 96, 103,
115 	62, 99, 60, 101, 59, 54, 93, 90, 0, 0 };
116 
117 /* keyboard driver declaration */
118 static int              akbd_configure(int flags);
119 static kbd_probe_t      akbd_probe;
120 static kbd_init_t       akbd_init;
121 static kbd_term_t       akbd_term;
122 static kbd_intr_t       akbd_interrupt;
123 static kbd_test_if_t    akbd_test_if;
124 static kbd_enable_t     akbd_enable;
125 static kbd_disable_t    akbd_disable;
126 static kbd_read_t       akbd_read;
127 static kbd_check_t      akbd_check;
128 static kbd_read_char_t  akbd_read_char;
129 static kbd_check_char_t akbd_check_char;
130 static kbd_ioctl_t      akbd_ioctl;
131 static kbd_lock_t       akbd_lock;
132 static kbd_clear_state_t akbd_clear_state;
133 static kbd_get_state_t  akbd_get_state;
134 static kbd_set_state_t  akbd_set_state;
135 static kbd_poll_mode_t  akbd_poll;
136 
137 keyboard_switch_t akbdsw = {
138         akbd_probe,
139         akbd_init,
140         akbd_term,
141         akbd_interrupt,
142         akbd_test_if,
143         akbd_enable,
144         akbd_disable,
145         akbd_read,
146         akbd_check,
147         akbd_read_char,
148         akbd_check_char,
149         akbd_ioctl,
150         akbd_lock,
151         akbd_clear_state,
152         akbd_get_state,
153         akbd_set_state,
154         genkbd_get_fkeystr,
155         akbd_poll,
156         genkbd_diag,
157 };
158 
159 KEYBOARD_DRIVER(akbd, akbdsw, akbd_configure);
160 
161 static int
162 adb_kbd_probe(device_t dev)
163 {
164 	uint8_t type;
165 
166 	type = adb_get_device_type(dev);
167 
168 	if (type != ADB_DEVICE_KEYBOARD)
169 		return (ENXIO);
170 
171 	switch(adb_get_device_handler(dev)) {
172 	case 1:
173 		device_set_desc(dev,"Apple Standard Keyboard");
174 		break;
175 	case 2:
176 		device_set_desc(dev,"Apple Extended Keyboard");
177 		break;
178 	case 4:
179 		device_set_desc(dev,"Apple ISO Keyboard");
180 		break;
181 	case 5:
182 		device_set_desc(dev,"Apple Extended ISO Keyboard");
183 		break;
184 	case 8:
185 		device_set_desc(dev,"Apple Keyboard II");
186 		break;
187 	case 9:
188 		device_set_desc(dev,"Apple ISO Keyboard II");
189 		break;
190 	case 12:
191 		device_set_desc(dev,"PowerBook Keyboard");
192 		break;
193 	case 13:
194 		device_set_desc(dev,"PowerBook ISO Keyboard");
195 		break;
196 	case 24:
197 		device_set_desc(dev,"PowerBook Extended Keyboard");
198 		break;
199 	case 27:
200 		device_set_desc(dev,"Apple Design Keyboard");
201 		break;
202 	case 195:
203 		device_set_desc(dev,"PowerBook G3 Keyboard");
204 		break;
205 	case 196:
206 		device_set_desc(dev,"iBook Keyboard");
207 		break;
208 	default:
209 		device_set_desc(dev,"ADB Keyboard");
210 		break;
211 	}
212 
213 	return (0);
214 }
215 
216 static int
217 ms_to_ticks(int ms)
218 {
219 	if (hz > 1000)
220 		return ms*(hz/1000);
221 
222 	return ms/(1000/hz);
223 }
224 
225 static int
226 adb_kbd_attach(device_t dev)
227 {
228 	struct adb_kbd_softc *sc;
229 	keyboard_switch_t *sw;
230 
231 	sw = kbd_get_switch(KBD_DRIVER_NAME);
232 	if (sw == NULL) {
233 		return ENXIO;
234 	}
235 
236 	sc = device_get_softc(dev);
237 	sc->sc_dev = dev;
238 	sc->sc_mode = K_RAW;
239 	sc->sc_state = 0;
240 	sc->have_led_control = 0;
241 	sc->buffers = 0;
242 
243 	/* Try stepping forward to the extended keyboard protocol */
244 	adb_set_device_handler(dev,3);
245 
246 	mtx_init(&sc->sc_mutex,KBD_DRIVER_NAME,MTX_DEF,0);
247 	cv_init(&sc->sc_cv,KBD_DRIVER_NAME);
248 	callout_init(&sc->sc_repeater, 0);
249 
250 #ifdef AKBD_EMULATE_ATKBD
251 	kbd_init_struct(&sc->sc_kbd, KBD_DRIVER_NAME, KB_101, 0, 0, 0, 0);
252 	kbd_set_maps(&sc->sc_kbd, &key_map, &accent_map, fkey_tab,
253             sizeof(fkey_tab) / sizeof(fkey_tab[0]));
254 #else
255 	#error ADB raw mode not implemented
256 #endif
257 
258 	KBD_FOUND_DEVICE(&sc->sc_kbd);
259 	KBD_PROBE_DONE(&sc->sc_kbd);
260 	KBD_INIT_DONE(&sc->sc_kbd);
261 	KBD_CONFIG_DONE(&sc->sc_kbd);
262 
263 	(*sw->enable)(&sc->sc_kbd);
264 
265 	kbd_register(&sc->sc_kbd);
266 
267 #ifdef KBD_INSTALL_CDEV
268 	if (kbd_attach(&sc->sc_kbd)) {
269 		adb_kbd_detach(dev);
270 		return ENXIO;
271 	}
272 #endif
273 
274 	/* Check if we can read out the LED state from
275 	   this keyboard by reading the key state register */
276 	if (adb_read_register(dev, 2, NULL) == 2)
277 		sc->have_led_control = 1;
278 
279 	adb_set_autopoll(dev,1);
280 
281 	return (0);
282 }
283 
284 static int
285 adb_kbd_detach(device_t dev)
286 {
287 	struct adb_kbd_softc *sc;
288 	keyboard_t *kbd;
289 
290 	sc = device_get_softc(dev);
291 
292 	adb_set_autopoll(dev,0);
293 	callout_stop(&sc->sc_repeater);
294 
295 	mtx_lock(&sc->sc_mutex);
296 
297 	kbd = kbd_get_keyboard(kbd_find_keyboard(KBD_DRIVER_NAME,
298 	          device_get_unit(dev)));
299 
300 	kbdd_disable(kbd);
301 
302 #ifdef KBD_INSTALL_CDEV
303 	kbd_detach(kbd);
304 #endif
305 
306 	kbdd_term(kbd);
307 
308 	mtx_unlock(&sc->sc_mutex);
309 
310 	mtx_destroy(&sc->sc_mutex);
311 	cv_destroy(&sc->sc_cv);
312 
313 	return (0);
314 }
315 
316 static u_int
317 adb_kbd_receive_packet(device_t dev, u_char status,
318     u_char command, u_char reg, int len, u_char *data)
319 {
320 	struct adb_kbd_softc *sc;
321 
322 	sc = device_get_softc(dev);
323 
324 	if (command != ADB_COMMAND_TALK)
325 		return 0;
326 
327 	if (reg != 0 || len != 2)
328 		return (0);
329 
330 	mtx_lock(&sc->sc_mutex);
331 		if ((data[0] & 0x7f) == 57 && sc->buffers < 7) {
332 			/* Fake the down/up cycle for caps lock */
333 			sc->buffer[sc->buffers++] = data[0] & 0x7f;
334 			sc->buffer[sc->buffers++] = (data[0] & 0x7f) | (1 << 7);
335 		} else {
336 			sc->buffer[sc->buffers++] = data[0];
337 		}
338 
339 		if (sc->buffer[sc->buffers-1] < 0xff)
340 			sc->last_press = sc->buffer[sc->buffers-1];
341 
342 		if ((data[1] & 0x7f) == 57 && sc->buffers < 7) {
343 			/* Fake the down/up cycle for caps lock */
344 			sc->buffer[sc->buffers++] = data[1] & 0x7f;
345 			sc->buffer[sc->buffers++] = (data[1] & 0x7f) | (1 << 7);
346 		} else {
347 			sc->buffer[sc->buffers++] = data[1];
348 		}
349 
350 		if (sc->buffer[sc->buffers-1] < 0xff)
351 			sc->last_press = sc->buffer[sc->buffers-1];
352 
353 		/* Stop any existing key repeating */
354 		callout_stop(&sc->sc_repeater);
355 
356 		/* Schedule a repeat callback on keydown */
357 		if (!(sc->last_press & (1 << 7))) {
358 			callout_reset(&sc->sc_repeater,
359 			    ms_to_ticks(sc->sc_kbd.kb_delay1), akbd_repeat, sc);
360 		}
361 	mtx_unlock(&sc->sc_mutex);
362 
363 	cv_broadcast(&sc->sc_cv);
364 
365 	if (KBD_IS_ACTIVE(&sc->sc_kbd) && KBD_IS_BUSY(&sc->sc_kbd)) {
366 		sc->sc_kbd.kb_callback.kc_func(&sc->sc_kbd,
367 			 KBDIO_KEYINPUT, sc->sc_kbd.kb_callback.kc_arg);
368 	}
369 
370 	return (0);
371 }
372 
373 static void
374 akbd_repeat(void *xsc) {
375 	struct adb_kbd_softc *sc = xsc;
376 	int notify_kbd = 0;
377 
378 	/* Fake an up/down key repeat so long as we have the
379 	   free buffers */
380 	mtx_lock(&sc->sc_mutex);
381 		if (sc->buffers < 7) {
382 			sc->buffer[sc->buffers++] = sc->last_press | (1 << 7);
383 			sc->buffer[sc->buffers++] = sc->last_press;
384 
385 			notify_kbd = 1;
386 		}
387 	mtx_unlock(&sc->sc_mutex);
388 
389 	if (notify_kbd && KBD_IS_ACTIVE(&sc->sc_kbd)
390 	    && KBD_IS_BUSY(&sc->sc_kbd)) {
391 		sc->sc_kbd.kb_callback.kc_func(&sc->sc_kbd,
392 		    KBDIO_KEYINPUT, sc->sc_kbd.kb_callback.kc_arg);
393 	}
394 
395 	/* Reschedule the callout */
396 	callout_reset(&sc->sc_repeater, ms_to_ticks(sc->sc_kbd.kb_delay2),
397 	    akbd_repeat, sc);
398 }
399 
400 static int
401 akbd_configure(int flags)
402 {
403 	return 0;
404 }
405 
406 static int
407 akbd_probe(int unit, void *arg, int flags)
408 {
409 	return 0;
410 }
411 
412 static int
413 akbd_init(int unit, keyboard_t **kbdp, void *arg, int flags)
414 {
415 	return 0;
416 }
417 
418 static int
419 akbd_term(keyboard_t *kbd)
420 {
421 	return 0;
422 }
423 
424 static int
425 akbd_interrupt(keyboard_t *kbd, void *arg)
426 {
427 	return 0;
428 }
429 
430 static int
431 akbd_test_if(keyboard_t *kbd)
432 {
433 	return 0;
434 }
435 
436 static int
437 akbd_enable(keyboard_t *kbd)
438 {
439 	KBD_ACTIVATE(kbd);
440 	return (0);
441 }
442 
443 static int
444 akbd_disable(keyboard_t *kbd)
445 {
446 	struct adb_kbd_softc *sc;
447 	sc = (struct adb_kbd_softc *)(kbd);
448 
449 	callout_stop(&sc->sc_repeater);
450 	KBD_DEACTIVATE(kbd);
451 	return (0);
452 }
453 
454 static int
455 akbd_read(keyboard_t *kbd, int wait)
456 {
457 	return (0);
458 }
459 
460 static int
461 akbd_check(keyboard_t *kbd)
462 {
463 	struct adb_kbd_softc *sc;
464 
465 	if (!KBD_IS_ACTIVE(kbd))
466 		return (FALSE);
467 
468 	sc = (struct adb_kbd_softc *)(kbd);
469 
470 	mtx_lock(&sc->sc_mutex);
471 		if (sc->buffers > 0) {
472 			mtx_unlock(&sc->sc_mutex);
473 			return (TRUE);
474 		}
475 	mtx_unlock(&sc->sc_mutex);
476 
477 	return (FALSE);
478 }
479 
480 static u_int
481 akbd_read_char(keyboard_t *kbd, int wait)
482 {
483 	struct adb_kbd_softc *sc;
484 	uint8_t adb_code, final_scancode;
485 	int i;
486 
487 	sc = (struct adb_kbd_softc *)(kbd);
488 
489 	mtx_lock(&sc->sc_mutex);
490 		if (!sc->buffers && wait)
491 			cv_wait(&sc->sc_cv,&sc->sc_mutex);
492 
493 		if (!sc->buffers) {
494 			mtx_unlock(&sc->sc_mutex);
495 			return (0);
496 		}
497 
498 		adb_code = sc->buffer[0];
499 
500 		for (i = 1; i < sc->buffers; i++)
501 			sc->buffer[i-1] = sc->buffer[i];
502 
503 		sc->buffers--;
504 	mtx_unlock(&sc->sc_mutex);
505 
506 	#ifdef AKBD_EMULATE_ATKBD
507 		final_scancode = adb_to_at_scancode_map[adb_code & 0x7f];
508 		final_scancode |= adb_code & 0x80;
509 	#else
510 		final_scancode = adb_code;
511 	#endif
512 
513 	return (final_scancode);
514 }
515 
516 static int
517 akbd_check_char(keyboard_t *kbd)
518 {
519 	if (!KBD_IS_ACTIVE(kbd))
520 		return (FALSE);
521 
522 	return (akbd_check(kbd));
523 }
524 
525 static int
526 set_typematic(keyboard_t *kbd, int code)
527 {
528 	/* These numbers are in microseconds, so convert to ticks */
529 
530 	static int delays[] = { 250, 500, 750, 1000 };
531 	static int rates[] = {  34,  38,  42,  46,  50,  55,  59,  63,
532 				68,  76,  84,  92, 100, 110, 118, 126,
533 				136, 152, 168, 184, 200, 220, 236, 252,
534 				272, 304, 336, 368, 400, 440, 472, 504 };
535 
536 	if (code & ~0x7f)
537 		return EINVAL;
538 	kbd->kb_delay1 = delays[(code >> 5) & 3];
539 	kbd->kb_delay2 = rates[code & 0x1f];
540 	return 0;
541 }
542 
543 static int akbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t data)
544 {
545 	struct adb_kbd_softc *sc;
546 	uint16_t r2;
547 	int error;
548 
549 	sc = (struct adb_kbd_softc *)(kbd);
550 	error = 0;
551 
552 	switch (cmd) {
553 	case KDGKBMODE:
554 		*(int *)data = sc->sc_mode;
555 		break;
556 	case KDSKBMODE:
557 		switch (*(int *)data) {
558 		case K_XLATE:
559 			if (sc->sc_mode != K_XLATE) {
560 				/* make lock key state and LED state match */
561 				sc->sc_state &= ~LOCK_MASK;
562 				sc->sc_state |= KBD_LED_VAL(kbd);
563 			}
564 			/* FALLTHROUGH */
565 		case K_RAW:
566 		case K_CODE:
567 			if (sc->sc_mode != *(int *)data)
568 				sc->sc_mode = *(int *)data;
569 			break;
570 		default:
571 			error = EINVAL;
572 			break;
573 		}
574 
575 		break;
576 
577 	case KDGETLED:
578 		*(int *)data = KBD_LED_VAL(kbd);
579 		break;
580 
581 	case KDSKBSTATE:
582 		if (*(int *)data & ~LOCK_MASK) {
583 			error = EINVAL;
584 			break;
585 		}
586 		sc->sc_state &= ~LOCK_MASK;
587 		sc->sc_state |= *(int *)data;
588 
589 		/* FALLTHROUGH */
590 
591 	case KDSETLED:
592 		KBD_LED_VAL(kbd) = *(int *)data;
593 
594 		if (!sc->have_led_control)
595 			break;
596 
597 		r2 = (~0 & 0x04) | 3;
598 
599 		if (*(int *)data & NLKED)
600 			r2 &= ~1;
601 		if (*(int *)data & CLKED)
602 			r2 &= ~2;
603 		if (*(int *)data & SLKED)
604 			r2 &= ~4;
605 
606 		adb_send_packet(sc->sc_dev,ADB_COMMAND_LISTEN,2,
607 			sizeof(uint16_t),(u_char *)&r2);
608 
609 		break;
610 
611 	case KDGKBSTATE:
612 		*(int *)data = sc->sc_state & LOCK_MASK;
613 		break;
614 
615 	case KDSETREPEAT:
616 		if (!KBD_HAS_DEVICE(kbd))
617 			return 0;
618 		if (((int *)data)[1] < 0)
619 			return EINVAL;
620 		if (((int *)data)[0] < 0)
621 			return EINVAL;
622 		else if (((int *)data)[0] == 0)  /* fastest possible value */
623 			kbd->kb_delay1 = 200;
624 		else
625 			kbd->kb_delay1 = ((int *)data)[0];
626 		kbd->kb_delay2 = ((int *)data)[1];
627 
628 		break;
629 
630 	case KDSETRAD:
631 		error = set_typematic(kbd, *(int *)data);
632 		break;
633 
634 	case PIO_KEYMAP:
635 	case PIO_KEYMAPENT:
636 	case PIO_DEADKEYMAP:
637 	default:
638 		return (genkbd_commonioctl(kbd, cmd, data));
639 	}
640 
641 	return (error);
642 }
643 
644 static int akbd_lock(keyboard_t *kbd, int lock)
645 {
646 	return (0);
647 }
648 
649 static void akbd_clear_state(keyboard_t *kbd)
650 {
651 }
652 
653 static int akbd_get_state(keyboard_t *kbd, void *buf, size_t len)
654 {
655 	return (0);
656 }
657 
658 static int akbd_set_state(keyboard_t *kbd, void *buf, size_t len)
659 {
660 	return (0);
661 }
662 
663 static int akbd_poll(keyboard_t *kbd, int on)
664 {
665 	return (0);
666 }
667 
668 static int
669 akbd_modevent(module_t mod, int type, void *data)
670 {
671 	switch (type) {
672 	case MOD_LOAD:
673 		kbd_add_driver(&akbd_kbd_driver);
674 		break;
675 
676 	case MOD_UNLOAD:
677 		kbd_delete_driver(&akbd_kbd_driver);
678 		break;
679 
680 	default:
681 		return (EOPNOTSUPP);
682 	}
683 
684 	return (0);
685 }
686 
687 DEV_MODULE(akbd, akbd_modevent, NULL);
688 
689