kernel: Remove the COMPAT_43 kernel option along with all related code.
[dragonfly.git] / sys / bus / u4b / input / ukbd.c
blob3344aa145c97c7d84955c9ee62030bd5634246bc
1 #include <sys/cdefs.h>
2 __FBSDID("$FreeBSD: head/sys/dev/usb/input/ukbd.c 262972 2014-03-10 08:52:30Z hselasky $");
5 /*-
6 * Copyright (c) 1998 The NetBSD Foundation, Inc.
7 * All rights reserved.
9 * This code is derived from software contributed to The NetBSD Foundation
10 * by Lennart Augustsson (lennart@augustsson.net) at
11 * Carlstedt Research & Technology.
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions
15 * are met:
16 * 1. Redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer.
18 * 2. Redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution.
22 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
23 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
24 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
25 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
26 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 * POSSIBILITY OF SUCH DAMAGE.
37 * HID spec: http://www.usb.org/developers/devclass_docs/HID1_11.pdf
40 #include "opt_kbd.h"
41 #include "opt_ukbd.h"
43 #include <sys/stdint.h>
44 #include <sys/param.h>
45 #include <sys/queue.h>
46 #include <sys/types.h>
47 #include <sys/systm.h>
48 #include <sys/kernel.h>
49 #include <sys/bus.h>
50 #include <sys/module.h>
51 #include <sys/lock.h>
52 #include <sys/condvar.h>
53 #include <sys/sysctl.h>
54 #include <sys/unistd.h>
55 #include <sys/callout.h>
56 #include <sys/malloc.h>
57 #include <sys/priv.h>
58 #include <sys/proc.h>
59 #include <sys/sched.h>
60 #include <sys/thread2.h>
62 #include <bus/u4b/usb.h>
63 #include <bus/u4b/usbdi.h>
64 #include <bus/u4b/usbdi_util.h>
65 #include <bus/u4b/usbhid.h>
67 #define USB_DEBUG_VAR ukbd_debug
68 #include <bus/u4b/usb_debug.h>
70 #include <bus/u4b/quirk/usb_quirk.h>
72 #include <sys/ioccom.h>
73 #include <sys/filio.h>
74 #include <sys/tty.h>
75 #include <sys/kbio.h>
77 #include <dev/misc/kbd/kbdreg.h>
79 /* the initial key map, accent map and fkey strings */
80 #if defined(UKBD_DFLT_KEYMAP) && !defined(KLD_MODULE)
81 #define KBD_DFLT_KEYMAP
82 #include "ukbdmap.h"
83 #endif
85 /* the following file must be included after "ukbdmap.h" */
86 #include <dev/misc/kbd/kbdtables.h>
88 #ifdef USB_DEBUG
89 static int ukbd_debug = 0;
90 static int ukbd_no_leds = 0;
91 static int ukbd_pollrate = 0;
93 static SYSCTL_NODE(_hw_usb, OID_AUTO, ukbd, CTLFLAG_RW, 0, "USB keyboard");
94 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, debug, CTLFLAG_RW,
95 &ukbd_debug, 0, "Debug level");
96 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, no_leds, CTLFLAG_RW,
97 &ukbd_no_leds, 0, "Disables setting of keyboard leds");
98 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, pollrate, CTLFLAG_RW,
99 &ukbd_pollrate, 0, "Force this polling rate, 1-1000Hz");
101 TUNABLE_INT("hw.usb.ukbd.debug", &ukbd_debug);
102 TUNABLE_INT("hw.usb.ukbd.no_leds", &ukbd_no_leds);
103 TUNABLE_INT("hw.usb.ukbd.pollrate", &ukbd_pollrate);
104 #endif
106 #define UKBD_EMULATE_ATSCANCODE 1
107 #define UKBD_DRIVER_NAME "ukbd"
108 #define UKBD_NMOD 8 /* units */
109 #define UKBD_NKEYCODE 6 /* units */
110 #define UKBD_IN_BUF_SIZE (2*(UKBD_NMOD + (2*UKBD_NKEYCODE))) /* bytes */
111 #define UKBD_IN_BUF_FULL (UKBD_IN_BUF_SIZE / 2) /* bytes */
112 #define UKBD_NFKEY (sizeof(fkey_tab)/sizeof(fkey_tab[0])) /* units */
113 #define UKBD_BUFFER_SIZE 64 /* bytes */
115 struct ukbd_data {
116 uint16_t modifiers;
117 #define MOD_CONTROL_L 0x01
118 #define MOD_CONTROL_R 0x10
119 #define MOD_SHIFT_L 0x02
120 #define MOD_SHIFT_R 0x20
121 #define MOD_ALT_L 0x04
122 #define MOD_ALT_R 0x40
123 #define MOD_WIN_L 0x08
124 #define MOD_WIN_R 0x80
125 /* internal */
126 #define MOD_EJECT 0x0100
127 #define MOD_FN 0x0200
128 uint8_t keycode[UKBD_NKEYCODE];
131 enum {
132 UKBD_INTR_DT,
133 UKBD_CTRL_LED,
134 UKBD_N_TRANSFER,
137 struct ukbd_softc {
138 device_t sc_dev;
139 keyboard_t sc_kbd;
140 keymap_t sc_keymap;
141 accentmap_t sc_accmap;
142 fkeytab_t sc_fkeymap[UKBD_NFKEY];
143 struct hid_location sc_loc_apple_eject;
144 struct hid_location sc_loc_apple_fn;
145 struct hid_location sc_loc_ctrl_l;
146 struct hid_location sc_loc_ctrl_r;
147 struct hid_location sc_loc_shift_l;
148 struct hid_location sc_loc_shift_r;
149 struct hid_location sc_loc_alt_l;
150 struct hid_location sc_loc_alt_r;
151 struct hid_location sc_loc_win_l;
152 struct hid_location sc_loc_win_r;
153 struct hid_location sc_loc_events;
154 struct hid_location sc_loc_numlock;
155 struct hid_location sc_loc_capslock;
156 struct hid_location sc_loc_scrolllock;
157 struct usb_callout sc_callout;
158 struct ukbd_data sc_ndata;
159 struct ukbd_data sc_odata;
161 struct thread *sc_poll_thread;
162 struct usb_device *sc_udev;
163 struct usb_interface *sc_iface;
164 struct usb_xfer *sc_xfer[UKBD_N_TRANSFER];
166 uint32_t sc_ntime[UKBD_NKEYCODE];
167 uint32_t sc_otime[UKBD_NKEYCODE];
168 uint32_t sc_input[UKBD_IN_BUF_SIZE]; /* input buffer */
169 uint32_t sc_time_ms;
170 uint32_t sc_composed_char; /* composed char code, if non-zero */
171 #ifdef UKBD_EMULATE_ATSCANCODE
172 uint32_t sc_buffered_char[2];
173 #endif
174 uint32_t sc_flags; /* flags */
175 #define UKBD_FLAG_COMPOSE 0x00000001
176 #define UKBD_FLAG_POLLING 0x00000002
177 #define UKBD_FLAG_SET_LEDS 0x00000004
178 #define UKBD_FLAG_ATTACHED 0x00000010
179 #define UKBD_FLAG_GONE 0x00000020
181 #define UKBD_FLAG_HID_MASK 0x003fffc0
182 #define UKBD_FLAG_APPLE_EJECT 0x00000040
183 #define UKBD_FLAG_APPLE_FN 0x00000080
184 #define UKBD_FLAG_APPLE_SWAP 0x00000100
185 #define UKBD_FLAG_TIMER_RUNNING 0x00000200
186 #define UKBD_FLAG_CTRL_L 0x00000400
187 #define UKBD_FLAG_CTRL_R 0x00000800
188 #define UKBD_FLAG_SHIFT_L 0x00001000
189 #define UKBD_FLAG_SHIFT_R 0x00002000
190 #define UKBD_FLAG_ALT_L 0x00004000
191 #define UKBD_FLAG_ALT_R 0x00008000
192 #define UKBD_FLAG_WIN_L 0x00010000
193 #define UKBD_FLAG_WIN_R 0x00020000
194 #define UKBD_FLAG_EVENTS 0x00040000
195 #define UKBD_FLAG_NUMLOCK 0x00080000
196 #define UKBD_FLAG_CAPSLOCK 0x00100000
197 #define UKBD_FLAG_SCROLLLOCK 0x00200000
199 int sc_mode; /* input mode (K_XLATE,K_RAW,K_CODE) */
200 int sc_state; /* shift/lock key state */
201 int sc_accents; /* accent key index (> 0) */
202 int sc_led_size;
203 int sc_kbd_size;
205 uint16_t sc_inputs;
206 uint16_t sc_inputhead;
207 uint16_t sc_inputtail;
208 uint16_t sc_modifiers;
210 uint8_t sc_leds; /* store for async led requests */
211 uint8_t sc_iface_index;
212 uint8_t sc_iface_no;
213 uint8_t sc_id_apple_eject;
214 uint8_t sc_id_apple_fn;
215 uint8_t sc_id_ctrl_l;
216 uint8_t sc_id_ctrl_r;
217 uint8_t sc_id_shift_l;
218 uint8_t sc_id_shift_r;
219 uint8_t sc_id_alt_l;
220 uint8_t sc_id_alt_r;
221 uint8_t sc_id_win_l;
222 uint8_t sc_id_win_r;
223 uint8_t sc_id_event;
224 uint8_t sc_id_numlock;
225 uint8_t sc_id_capslock;
226 uint8_t sc_id_scrolllock;
227 uint8_t sc_id_events;
228 uint8_t sc_kbd_id;
230 uint8_t sc_buffer[UKBD_BUFFER_SIZE];
233 #define KEY_ERROR 0x01
235 #define KEY_PRESS 0
236 #define KEY_RELEASE 0x400
237 #define KEY_INDEX(c) ((c) & 0xFF)
239 #define SCAN_PRESS 0
240 #define SCAN_RELEASE 0x80
241 #define SCAN_PREFIX_E0 0x100
242 #define SCAN_PREFIX_E1 0x200
243 #define SCAN_PREFIX_CTL 0x400
244 #define SCAN_PREFIX_SHIFT 0x800
245 #define SCAN_PREFIX (SCAN_PREFIX_E0 | SCAN_PREFIX_E1 | \
246 SCAN_PREFIX_CTL | SCAN_PREFIX_SHIFT)
247 #define SCAN_CHAR(c) ((c) & 0x7f)
249 #define UKBD_LOCK(sc) lockmgr(&(sc)->sc_kbd.kb_lock, LK_EXCLUSIVE)
250 #define UKBD_UNLOCK(sc) lockmgr(&(sc)->sc_kbd.kb_lock, LK_RELEASE)
252 #ifdef INVARIANTS
255 * Assert that the lock is held in all contexts
256 * where the code can be executed.
258 #define UKBD_LOCK_ASSERT()
261 * Assert that the lock is held in the contexts
262 * where it really has to be so.
264 #define UKBD_CTX_LOCK_ASSERT()
265 #else
267 #define UKBD_LOCK_ASSERT() (void)0
268 #define UKBD_CTX_LOCK_ASSERT() (void)0
270 #endif
272 struct ukbd_mods {
273 uint32_t mask, key;
276 static const struct ukbd_mods ukbd_mods[UKBD_NMOD] = {
277 {MOD_CONTROL_L, 0xe0},
278 {MOD_CONTROL_R, 0xe4},
279 {MOD_SHIFT_L, 0xe1},
280 {MOD_SHIFT_R, 0xe5},
281 {MOD_ALT_L, 0xe2},
282 {MOD_ALT_R, 0xe6},
283 {MOD_WIN_L, 0xe3},
284 {MOD_WIN_R, 0xe7},
287 #define NN 0 /* no translation */
289 * Translate USB keycodes to AT keyboard scancodes.
292 * FIXME: Mac USB keyboard generates:
293 * 0x53: keypad NumLock/Clear
294 * 0x66: Power
295 * 0x67: keypad =
296 * 0x68: F13
297 * 0x69: F14
298 * 0x6a: F15
300 static const uint8_t ukbd_trtab[256] = {
301 0, 0, 0, 0, 30, 48, 46, 32, /* 00 - 07 */
302 18, 33, 34, 35, 23, 36, 37, 38, /* 08 - 0F */
303 50, 49, 24, 25, 16, 19, 31, 20, /* 10 - 17 */
304 22, 47, 17, 45, 21, 44, 2, 3, /* 18 - 1F */
305 4, 5, 6, 7, 8, 9, 10, 11, /* 20 - 27 */
306 28, 1, 14, 15, 57, 12, 13, 26, /* 28 - 2F */
307 27, 43, 43, 39, 40, 41, 51, 52, /* 30 - 37 */
308 53, 58, 59, 60, 61, 62, 63, 64, /* 38 - 3F */
309 65, 66, 67, 68, 87, 88, 92, 70, /* 40 - 47 */
310 104, 102, 94, 96, 103, 99, 101, 98, /* 48 - 4F */
311 97, 100, 95, 69, 91, 55, 74, 78,/* 50 - 57 */
312 89, 79, 80, 81, 75, 76, 77, 71, /* 58 - 5F */
313 72, 73, 82, 83, 86, 107, 122, NN, /* 60 - 67 */
314 NN, NN, NN, NN, NN, NN, NN, NN, /* 68 - 6F */
315 NN, NN, NN, NN, 115, 108, 111, 113, /* 70 - 77 */
316 109, 110, 112, 118, 114, 116, 117, 119, /* 78 - 7F */
317 121, 120, NN, NN, NN, NN, NN, 123, /* 80 - 87 */
318 124, 125, 126, 127, 128, NN, NN, NN, /* 88 - 8F */
319 NN, NN, NN, NN, NN, NN, NN, NN, /* 90 - 97 */
320 NN, NN, NN, NN, NN, NN, NN, NN, /* 98 - 9F */
321 NN, NN, NN, NN, NN, NN, NN, NN, /* A0 - A7 */
322 NN, NN, NN, NN, NN, NN, NN, NN, /* A8 - AF */
323 NN, NN, NN, NN, NN, NN, NN, NN, /* B0 - B7 */
324 NN, NN, NN, NN, NN, NN, NN, NN, /* B8 - BF */
325 NN, NN, NN, NN, NN, NN, NN, NN, /* C0 - C7 */
326 NN, NN, NN, NN, NN, NN, NN, NN, /* C8 - CF */
327 NN, NN, NN, NN, NN, NN, NN, NN, /* D0 - D7 */
328 NN, NN, NN, NN, NN, NN, NN, NN, /* D8 - DF */
329 29, 42, 56, 105, 90, 54, 93, 106, /* E0 - E7 */
330 NN, NN, NN, NN, NN, NN, NN, NN, /* E8 - EF */
331 NN, NN, NN, NN, NN, NN, NN, NN, /* F0 - F7 */
332 NN, NN, NN, NN, NN, NN, NN, NN, /* F8 - FF */
335 static const uint8_t ukbd_boot_desc[] = {
336 0x05, 0x01, 0x09, 0x06, 0xa1,
337 0x01, 0x05, 0x07, 0x19, 0xe0,
338 0x29, 0xe7, 0x15, 0x00, 0x25,
339 0x01, 0x75, 0x01, 0x95, 0x08,
340 0x81, 0x02, 0x95, 0x01, 0x75,
341 0x08, 0x81, 0x01, 0x95, 0x03,
342 0x75, 0x01, 0x05, 0x08, 0x19,
343 0x01, 0x29, 0x03, 0x91, 0x02,
344 0x95, 0x05, 0x75, 0x01, 0x91,
345 0x01, 0x95, 0x06, 0x75, 0x08,
346 0x15, 0x00, 0x26, 0xff, 0x00,
347 0x05, 0x07, 0x19, 0x00, 0x2a,
348 0xff, 0x00, 0x81, 0x00, 0xc0
351 /* prototypes */
352 static void ukbd_timeout(void *);
353 static void ukbd_set_leds(struct ukbd_softc *, uint8_t);
354 static int ukbd_set_typematic(keyboard_t *, int);
355 #ifdef UKBD_EMULATE_ATSCANCODE
356 static int ukbd_key2scan(struct ukbd_softc *, int, int, int);
357 #endif
358 static uint32_t ukbd_read_char(keyboard_t *, int);
359 static void ukbd_clear_state(keyboard_t *);
360 static int ukbd_ioctl(keyboard_t *, u_long, caddr_t);
361 static int ukbd_enable(keyboard_t *);
362 static int ukbd_disable(keyboard_t *);
363 static void ukbd_interrupt(struct ukbd_softc *);
364 static void ukbd_event_keyinput(struct ukbd_softc *);
366 static device_probe_t ukbd_probe;
367 static device_attach_t ukbd_attach;
368 static device_detach_t ukbd_detach;
369 static device_resume_t ukbd_resume;
371 static uint8_t
372 ukbd_any_key_pressed(struct ukbd_softc *sc)
374 uint8_t i;
375 uint8_t j;
377 for (j = i = 0; i < UKBD_NKEYCODE; i++)
378 j |= sc->sc_odata.keycode[i];
380 return (j ? 1 : 0);
383 static void
384 ukbd_start_timer(struct ukbd_softc *sc)
386 sc->sc_flags |= UKBD_FLAG_TIMER_RUNNING;
387 usb_callout_reset(&sc->sc_callout, hz / 40, &ukbd_timeout, sc);
390 static void
391 ukbd_put_key(struct ukbd_softc *sc, uint32_t key)
394 UKBD_CTX_LOCK_ASSERT();
396 DPRINTF("0x%02x (%d) %s\n", key, key,
397 (key & KEY_RELEASE) ? "released" : "pressed");
399 if (sc->sc_inputs < UKBD_IN_BUF_SIZE) {
400 sc->sc_input[sc->sc_inputtail] = key;
401 ++(sc->sc_inputs);
402 ++(sc->sc_inputtail);
403 if (sc->sc_inputtail >= UKBD_IN_BUF_SIZE) {
404 sc->sc_inputtail = 0;
406 } else {
407 DPRINTF("input buffer is full\n");
411 static void
412 ukbd_do_poll(struct ukbd_softc *sc, uint8_t wait)
415 UKBD_CTX_LOCK_ASSERT();
416 KASSERT((sc->sc_flags & UKBD_FLAG_POLLING) != 0,
417 ("ukbd_do_poll called when not polling\n"));
418 DPRINTFN(2, "polling\n");
419 #if 0 /* XXX */
420 if (!kdb_active && !SCHEDULER_STOPPED()) {
422 * In this context the kernel is polling for input,
423 * but the USB subsystem works in normal interrupt-driven
424 * mode, so we just wait on the USB threads to do the job.
425 * Note that we currently hold the Giant, but it's also used
426 * as the transfer mtx, so we must release it while waiting.
428 while (sc->sc_inputs == 0) {
430 * Give USB threads a chance to run. Note that
431 * kern_yield performs DROP_GIANT + PICKUP_GIANT.
433 lwkt_yield();
434 if (!wait)
435 break;
437 return;
439 #endif
441 while (sc->sc_inputs == 0) {
443 usbd_transfer_poll(sc->sc_xfer, UKBD_N_TRANSFER);
445 /* Delay-optimised support for repetition of keys */
446 if (ukbd_any_key_pressed(sc)) {
447 /* a key is pressed - need timekeeping */
448 DELAY(1000);
450 /* 1 millisecond has passed */
451 sc->sc_time_ms += 1;
454 ukbd_interrupt(sc);
456 if (!wait)
457 break;
461 static int32_t
462 ukbd_get_key(struct ukbd_softc *sc, uint8_t wait)
464 int32_t c;
466 UKBD_CTX_LOCK_ASSERT();
467 #if 0
468 KASSERT((!kdb_active && !SCHEDULER_STOPPED())
469 || (sc->sc_flags & UKBD_FLAG_POLLING) != 0,
470 ("not polling in kdb or panic\n"));
471 #endif
473 if (sc->sc_inputs == 0 &&
474 (sc->sc_flags & UKBD_FLAG_GONE) == 0) {
475 /* start transfer, if not already started */
476 usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT]);
479 if (sc->sc_flags & UKBD_FLAG_POLLING)
480 ukbd_do_poll(sc, wait);
482 if (sc->sc_inputs == 0) {
483 c = -1;
484 } else {
485 c = sc->sc_input[sc->sc_inputhead];
486 --(sc->sc_inputs);
487 ++(sc->sc_inputhead);
488 if (sc->sc_inputhead >= UKBD_IN_BUF_SIZE) {
489 sc->sc_inputhead = 0;
492 return (c);
495 static void
496 ukbd_interrupt(struct ukbd_softc *sc)
498 uint32_t n_mod;
499 uint32_t o_mod;
500 uint32_t now = sc->sc_time_ms;
501 uint32_t dtime;
502 uint8_t key;
503 uint8_t i;
504 uint8_t j;
506 UKBD_CTX_LOCK_ASSERT();
508 if (sc->sc_ndata.keycode[0] == KEY_ERROR)
509 return;
511 n_mod = sc->sc_ndata.modifiers;
512 o_mod = sc->sc_odata.modifiers;
513 if (n_mod != o_mod) {
514 for (i = 0; i < UKBD_NMOD; i++) {
515 if ((n_mod & ukbd_mods[i].mask) !=
516 (o_mod & ukbd_mods[i].mask)) {
517 ukbd_put_key(sc, ukbd_mods[i].key |
518 ((n_mod & ukbd_mods[i].mask) ?
519 KEY_PRESS : KEY_RELEASE));
523 /* Check for released keys. */
524 for (i = 0; i < UKBD_NKEYCODE; i++) {
525 key = sc->sc_odata.keycode[i];
526 if (key == 0) {
527 continue;
529 for (j = 0; j < UKBD_NKEYCODE; j++) {
530 if (sc->sc_ndata.keycode[j] == 0) {
531 continue;
533 if (key == sc->sc_ndata.keycode[j]) {
534 goto rfound;
537 ukbd_put_key(sc, key | KEY_RELEASE);
538 rfound: ;
541 /* Check for pressed keys. */
542 for (i = 0; i < UKBD_NKEYCODE; i++) {
543 key = sc->sc_ndata.keycode[i];
544 if (key == 0) {
545 continue;
547 sc->sc_ntime[i] = now + sc->sc_kbd.kb_delay1;
548 for (j = 0; j < UKBD_NKEYCODE; j++) {
549 if (sc->sc_odata.keycode[j] == 0) {
550 continue;
552 if (key == sc->sc_odata.keycode[j]) {
554 /* key is still pressed */
556 sc->sc_ntime[i] = sc->sc_otime[j];
557 dtime = (sc->sc_otime[j] - now);
559 if (!(dtime & 0x80000000)) {
560 /* time has not elapsed */
561 goto pfound;
563 sc->sc_ntime[i] = now + sc->sc_kbd.kb_delay2;
564 break;
567 ukbd_put_key(sc, key | KEY_PRESS);
570 * If any other key is presently down, force its repeat to be
571 * well in the future (100s). This makes the last key to be
572 * pressed do the autorepeat.
574 for (j = 0; j != UKBD_NKEYCODE; j++) {
575 if (j != i)
576 sc->sc_ntime[j] = now + (100 * 1000);
578 pfound: ;
581 sc->sc_odata = sc->sc_ndata;
583 memcpy(sc->sc_otime, sc->sc_ntime, sizeof(sc->sc_otime));
585 ukbd_event_keyinput(sc);
588 static void
589 ukbd_event_keyinput(struct ukbd_softc *sc)
591 int c;
593 UKBD_CTX_LOCK_ASSERT();
595 if ((sc->sc_flags & UKBD_FLAG_POLLING) != 0)
596 return;
598 if (sc->sc_inputs == 0)
599 return;
601 if (KBD_IS_ACTIVE(&sc->sc_kbd) &&
602 KBD_IS_BUSY(&sc->sc_kbd)) {
603 /* let the callback function process the input */
604 (sc->sc_kbd.kb_callback.kc_func) (&sc->sc_kbd, KBDIO_KEYINPUT,
605 sc->sc_kbd.kb_callback.kc_arg);
606 } else {
607 /* read and discard the input, no one is waiting for it */
608 do {
609 c = ukbd_read_char(&sc->sc_kbd, 0);
610 } while (c != NOKEY);
614 static void
615 ukbd_timeout(void *arg)
617 struct ukbd_softc *sc = arg;
619 UKBD_LOCK_ASSERT();
621 sc->sc_time_ms += 25; /* milliseconds */
623 ukbd_interrupt(sc);
625 /* Make sure any leftover key events gets read out */
626 ukbd_event_keyinput(sc);
628 if (ukbd_any_key_pressed(sc) || (sc->sc_inputs != 0)) {
629 ukbd_start_timer(sc);
630 } else {
631 sc->sc_flags &= ~UKBD_FLAG_TIMER_RUNNING;
635 static uint8_t
636 ukbd_apple_fn(uint8_t keycode) {
637 switch (keycode) {
638 case 0x28: return 0x49; /* RETURN -> INSERT */
639 case 0x2a: return 0x4c; /* BACKSPACE -> DEL */
640 case 0x50: return 0x4a; /* LEFT ARROW -> HOME */
641 case 0x4f: return 0x4d; /* RIGHT ARROW -> END */
642 case 0x52: return 0x4b; /* UP ARROW -> PGUP */
643 case 0x51: return 0x4e; /* DOWN ARROW -> PGDN */
644 default: return keycode;
648 static uint8_t
649 ukbd_apple_swap(uint8_t keycode) {
650 switch (keycode) {
651 case 0x35: return 0x64;
652 case 0x64: return 0x35;
653 default: return keycode;
657 static void
658 ukbd_intr_callback(struct usb_xfer *xfer, usb_error_t error)
660 struct ukbd_softc *sc = usbd_xfer_softc(xfer);
661 struct usb_page_cache *pc;
662 uint8_t i;
663 uint8_t offset;
664 uint8_t id;
665 int len;
667 UKBD_LOCK_ASSERT();
669 usbd_xfer_status(xfer, &len, NULL, NULL, NULL);
670 pc = usbd_xfer_get_frame(xfer, 0);
672 switch (USB_GET_STATE(xfer)) {
673 case USB_ST_TRANSFERRED:
674 DPRINTF("actlen=%d bytes\n", len);
676 if (len == 0) {
677 DPRINTF("zero length data\n");
678 goto tr_setup;
681 if (sc->sc_kbd_id != 0) {
682 /* check and remove HID ID byte */
683 usbd_copy_out(pc, 0, &id, 1);
684 offset = 1;
685 len--;
686 if (len == 0) {
687 DPRINTF("zero length data\n");
688 goto tr_setup;
690 } else {
691 offset = 0;
692 id = 0;
695 if (len > UKBD_BUFFER_SIZE)
696 len = UKBD_BUFFER_SIZE;
698 /* get data */
699 usbd_copy_out(pc, offset, sc->sc_buffer, len);
701 /* clear temporary storage */
702 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
704 /* scan through HID data */
705 if ((sc->sc_flags & UKBD_FLAG_APPLE_EJECT) &&
706 (id == sc->sc_id_apple_eject)) {
707 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_eject))
708 sc->sc_modifiers |= MOD_EJECT;
709 else
710 sc->sc_modifiers &= ~MOD_EJECT;
712 if ((sc->sc_flags & UKBD_FLAG_APPLE_FN) &&
713 (id == sc->sc_id_apple_fn)) {
714 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_fn))
715 sc->sc_modifiers |= MOD_FN;
716 else
717 sc->sc_modifiers &= ~MOD_FN;
719 if ((sc->sc_flags & UKBD_FLAG_CTRL_L) &&
720 (id == sc->sc_id_ctrl_l)) {
721 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_ctrl_l))
722 sc-> sc_modifiers |= MOD_CONTROL_L;
723 else
724 sc-> sc_modifiers &= ~MOD_CONTROL_L;
726 if ((sc->sc_flags & UKBD_FLAG_CTRL_R) &&
727 (id == sc->sc_id_ctrl_r)) {
728 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_ctrl_r))
729 sc->sc_modifiers |= MOD_CONTROL_R;
730 else
731 sc->sc_modifiers &= ~MOD_CONTROL_R;
733 if ((sc->sc_flags & UKBD_FLAG_SHIFT_L) &&
734 (id == sc->sc_id_shift_l)) {
735 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_shift_l))
736 sc->sc_modifiers |= MOD_SHIFT_L;
737 else
738 sc->sc_modifiers &= ~MOD_SHIFT_L;
740 if ((sc->sc_flags & UKBD_FLAG_SHIFT_R) &&
741 (id == sc->sc_id_shift_r)) {
742 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_shift_r))
743 sc->sc_modifiers |= MOD_SHIFT_R;
744 else
745 sc->sc_modifiers &= ~MOD_SHIFT_R;
747 if ((sc->sc_flags & UKBD_FLAG_ALT_L) &&
748 (id == sc->sc_id_alt_l)) {
749 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_alt_l))
750 sc->sc_modifiers |= MOD_ALT_L;
751 else
752 sc->sc_modifiers &= ~MOD_ALT_L;
754 if ((sc->sc_flags & UKBD_FLAG_ALT_R) &&
755 (id == sc->sc_id_alt_r)) {
756 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_alt_r))
757 sc->sc_modifiers |= MOD_ALT_R;
758 else
759 sc->sc_modifiers &= ~MOD_ALT_R;
761 if ((sc->sc_flags & UKBD_FLAG_WIN_L) &&
762 (id == sc->sc_id_win_l)) {
763 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_win_l))
764 sc->sc_modifiers |= MOD_WIN_L;
765 else
766 sc->sc_modifiers &= ~MOD_WIN_L;
768 if ((sc->sc_flags & UKBD_FLAG_WIN_R) &&
769 (id == sc->sc_id_win_r)) {
770 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_win_r))
771 sc->sc_modifiers |= MOD_WIN_R;
772 else
773 sc->sc_modifiers &= ~MOD_WIN_R;
776 sc->sc_ndata.modifiers = sc->sc_modifiers;
778 if ((sc->sc_flags & UKBD_FLAG_EVENTS) &&
779 (id == sc->sc_id_events)) {
780 i = sc->sc_loc_events.count;
781 if (i > UKBD_NKEYCODE)
782 i = UKBD_NKEYCODE;
783 if (i > len)
784 i = len;
785 while (i--) {
786 sc->sc_ndata.keycode[i] =
787 hid_get_data(sc->sc_buffer + i, len - i,
788 &sc->sc_loc_events);
792 #ifdef USB_DEBUG
793 DPRINTF("modifiers = 0x%04x\n", (int)sc->sc_modifiers);
794 for (i = 0; i < UKBD_NKEYCODE; i++) {
795 if (sc->sc_ndata.keycode[i]) {
796 DPRINTF("[%d] = 0x%02x\n",
797 (int)i, (int)sc->sc_ndata.keycode[i]);
800 #endif
801 if (sc->sc_modifiers & MOD_FN) {
802 for (i = 0; i < UKBD_NKEYCODE; i++) {
803 sc->sc_ndata.keycode[i] =
804 ukbd_apple_fn(sc->sc_ndata.keycode[i]);
808 if (sc->sc_flags & UKBD_FLAG_APPLE_SWAP) {
809 for (i = 0; i < UKBD_NKEYCODE; i++) {
810 sc->sc_ndata.keycode[i] =
811 ukbd_apple_swap(sc->sc_ndata.keycode[i]);
815 ukbd_interrupt(sc);
817 if (!(sc->sc_flags & UKBD_FLAG_TIMER_RUNNING)) {
818 if (ukbd_any_key_pressed(sc)) {
819 ukbd_start_timer(sc);
823 case USB_ST_SETUP:
824 tr_setup:
825 if (sc->sc_inputs < UKBD_IN_BUF_FULL) {
826 usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
827 usbd_transfer_submit(xfer);
828 } else {
829 DPRINTF("input queue is full!\n");
831 break;
833 default: /* Error */
834 DPRINTF("error=%s\n", usbd_errstr(error));
836 if (error != USB_ERR_CANCELLED) {
837 /* try to clear stall first */
838 usbd_xfer_set_stall(xfer);
839 goto tr_setup;
841 break;
845 static void
846 ukbd_set_leds_callback(struct usb_xfer *xfer, usb_error_t error)
848 struct ukbd_softc *sc = usbd_xfer_softc(xfer);
849 struct usb_device_request req;
850 struct usb_page_cache *pc;
851 uint8_t id;
852 uint8_t any;
853 int len;
855 UKBD_LOCK_ASSERT();
857 #ifdef USB_DEBUG
858 if (ukbd_no_leds)
859 return;
860 #endif
862 switch (USB_GET_STATE(xfer)) {
863 case USB_ST_TRANSFERRED:
864 case USB_ST_SETUP:
865 if (!(sc->sc_flags & UKBD_FLAG_SET_LEDS))
866 break;
867 sc->sc_flags &= ~UKBD_FLAG_SET_LEDS;
869 req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
870 req.bRequest = UR_SET_REPORT;
871 USETW2(req.wValue, UHID_OUTPUT_REPORT, 0);
872 req.wIndex[0] = sc->sc_iface_no;
873 req.wIndex[1] = 0;
874 req.wLength[1] = 0;
876 memset(sc->sc_buffer, 0, UKBD_BUFFER_SIZE);
878 id = 0;
879 any = 0;
881 /* Assumption: All led bits must be in the same ID. */
883 if (sc->sc_flags & UKBD_FLAG_NUMLOCK) {
884 if (sc->sc_leds & NLKED) {
885 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
886 &sc->sc_loc_numlock, 1);
888 id = sc->sc_id_numlock;
889 any = 1;
892 if (sc->sc_flags & UKBD_FLAG_SCROLLLOCK) {
893 if (sc->sc_leds & SLKED) {
894 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
895 &sc->sc_loc_scrolllock, 1);
897 id = sc->sc_id_scrolllock;
898 any = 1;
901 if (sc->sc_flags & UKBD_FLAG_CAPSLOCK) {
902 if (sc->sc_leds & CLKED) {
903 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
904 &sc->sc_loc_capslock, 1);
906 id = sc->sc_id_capslock;
907 any = 1;
910 /* if no leds, nothing to do */
911 if (!any)
912 break;
914 /* range check output report length */
915 len = sc->sc_led_size;
916 if (len > (UKBD_BUFFER_SIZE - 1))
917 len = (UKBD_BUFFER_SIZE - 1);
919 /* check if we need to prefix an ID byte */
920 sc->sc_buffer[0] = id;
922 pc = usbd_xfer_get_frame(xfer, 1);
923 if (id != 0) {
924 len++;
925 usbd_copy_in(pc, 0, sc->sc_buffer, len);
926 } else {
927 usbd_copy_in(pc, 0, sc->sc_buffer + 1, len);
929 req.wLength[0] = len;
930 usbd_xfer_set_frame_len(xfer, 1, len);
932 DPRINTF("len=%d, id=%d\n", len, id);
934 /* setup control request last */
935 pc = usbd_xfer_get_frame(xfer, 0);
936 usbd_copy_in(pc, 0, &req, sizeof(req));
937 usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
939 /* start data transfer */
940 usbd_xfer_set_frames(xfer, 2);
941 usbd_transfer_submit(xfer);
942 break;
944 default: /* Error */
945 DPRINTFN(1, "error=%s\n", usbd_errstr(error));
946 break;
950 static const struct usb_config ukbd_config[UKBD_N_TRANSFER] = {
952 [UKBD_INTR_DT] = {
953 .type = UE_INTERRUPT,
954 .endpoint = UE_ADDR_ANY,
955 .direction = UE_DIR_IN,
956 .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
957 .bufsize = 0, /* use wMaxPacketSize */
958 .callback = &ukbd_intr_callback,
961 [UKBD_CTRL_LED] = {
962 .type = UE_CONTROL,
963 .endpoint = 0x00, /* Control pipe */
964 .direction = UE_DIR_ANY,
965 .bufsize = sizeof(struct usb_device_request) + UKBD_BUFFER_SIZE,
966 .callback = &ukbd_set_leds_callback,
967 .timeout = 1000, /* 1 second */
971 /* A match on these entries will load ukbd */
972 static const STRUCT_USB_HOST_ID __used ukbd_devs[] = {
973 {USB_IFACE_CLASS(UICLASS_HID),
974 USB_IFACE_SUBCLASS(UISUBCLASS_BOOT),
975 USB_IFACE_PROTOCOL(UIPROTO_BOOT_KEYBOARD),},
978 static int
979 ukbd_probe(device_t dev)
981 keyboard_switch_t *sw = kbd_get_switch(UKBD_DRIVER_NAME);
982 struct usb_attach_arg *uaa = device_get_ivars(dev);
983 void *d_ptr;
984 int error;
985 uint16_t d_len;
987 UKBD_LOCK_ASSERT();
988 DPRINTFN(11, "\n");
990 if (sw == NULL) {
991 return (ENXIO);
993 if (uaa->usb_mode != USB_MODE_HOST) {
994 return (ENXIO);
997 if (uaa->info.bInterfaceClass != UICLASS_HID)
998 return (ENXIO);
1000 if (usb_test_quirk(uaa, UQ_KBD_IGNORE))
1001 return (ENXIO);
1003 if ((uaa->info.bInterfaceSubClass == UISUBCLASS_BOOT) &&
1004 (uaa->info.bInterfaceProtocol == UIPROTO_BOOT_KEYBOARD))
1005 return (BUS_PROBE_DEFAULT);
1007 error = usbd_req_get_hid_desc(uaa->device, NULL,
1008 &d_ptr, &d_len, M_TEMP, uaa->info.bIfaceIndex);
1010 if (error)
1011 return (ENXIO);
1013 if (hid_is_keyboard(d_ptr, d_len)) {
1014 if (hid_is_mouse(d_ptr, d_len)) {
1016 * NOTE: We currently don't support USB mouse
1017 * and USB keyboard on the same USB endpoint.
1018 * Let "ums" driver win.
1020 error = ENXIO;
1021 } else {
1022 error = BUS_PROBE_DEFAULT;
1024 } else {
1025 error = ENXIO;
1027 kfree(d_ptr, M_TEMP);
1028 return (error);
1031 static void
1032 ukbd_parse_hid(struct ukbd_softc *sc, const uint8_t *ptr, uint32_t len)
1034 uint32_t flags;
1036 /* reset detected bits */
1037 sc->sc_flags &= ~UKBD_FLAG_HID_MASK;
1039 /* check if there is an ID byte */
1040 sc->sc_kbd_size = hid_report_size(ptr, len,
1041 hid_input, &sc->sc_kbd_id);
1043 /* investigate if this is an Apple Keyboard */
1044 if (hid_locate(ptr, len,
1045 HID_USAGE2(HUP_CONSUMER, HUG_APPLE_EJECT),
1046 hid_input, 0, &sc->sc_loc_apple_eject, &flags,
1047 &sc->sc_id_apple_eject)) {
1048 if (flags & HIO_VARIABLE)
1049 sc->sc_flags |= UKBD_FLAG_APPLE_EJECT |
1050 UKBD_FLAG_APPLE_SWAP;
1051 DPRINTFN(1, "Found Apple eject-key\n");
1053 if (hid_locate(ptr, len,
1054 HID_USAGE2(0xFFFF, 0x0003),
1055 hid_input, 0, &sc->sc_loc_apple_fn, &flags,
1056 &sc->sc_id_apple_fn)) {
1057 if (flags & HIO_VARIABLE)
1058 sc->sc_flags |= UKBD_FLAG_APPLE_FN;
1059 DPRINTFN(1, "Found Apple FN-key\n");
1061 /* figure out some keys */
1062 if (hid_locate(ptr, len,
1063 HID_USAGE2(HUP_KEYBOARD, 0xE0),
1064 hid_input, 0, &sc->sc_loc_ctrl_l, &flags,
1065 &sc->sc_id_ctrl_l)) {
1066 if (flags & HIO_VARIABLE)
1067 sc->sc_flags |= UKBD_FLAG_CTRL_L;
1068 DPRINTFN(1, "Found left control\n");
1070 if (hid_locate(ptr, len,
1071 HID_USAGE2(HUP_KEYBOARD, 0xE4),
1072 hid_input, 0, &sc->sc_loc_ctrl_r, &flags,
1073 &sc->sc_id_ctrl_r)) {
1074 if (flags & HIO_VARIABLE)
1075 sc->sc_flags |= UKBD_FLAG_CTRL_R;
1076 DPRINTFN(1, "Found right control\n");
1078 if (hid_locate(ptr, len,
1079 HID_USAGE2(HUP_KEYBOARD, 0xE1),
1080 hid_input, 0, &sc->sc_loc_shift_l, &flags,
1081 &sc->sc_id_shift_l)) {
1082 if (flags & HIO_VARIABLE)
1083 sc->sc_flags |= UKBD_FLAG_SHIFT_L;
1084 DPRINTFN(1, "Found left shift\n");
1086 if (hid_locate(ptr, len,
1087 HID_USAGE2(HUP_KEYBOARD, 0xE5),
1088 hid_input, 0, &sc->sc_loc_shift_r, &flags,
1089 &sc->sc_id_shift_r)) {
1090 if (flags & HIO_VARIABLE)
1091 sc->sc_flags |= UKBD_FLAG_SHIFT_R;
1092 DPRINTFN(1, "Found right shift\n");
1094 if (hid_locate(ptr, len,
1095 HID_USAGE2(HUP_KEYBOARD, 0xE2),
1096 hid_input, 0, &sc->sc_loc_alt_l, &flags,
1097 &sc->sc_id_alt_l)) {
1098 if (flags & HIO_VARIABLE)
1099 sc->sc_flags |= UKBD_FLAG_ALT_L;
1100 DPRINTFN(1, "Found left alt\n");
1102 if (hid_locate(ptr, len,
1103 HID_USAGE2(HUP_KEYBOARD, 0xE6),
1104 hid_input, 0, &sc->sc_loc_alt_r, &flags,
1105 &sc->sc_id_alt_r)) {
1106 if (flags & HIO_VARIABLE)
1107 sc->sc_flags |= UKBD_FLAG_ALT_R;
1108 DPRINTFN(1, "Found right alt\n");
1110 if (hid_locate(ptr, len,
1111 HID_USAGE2(HUP_KEYBOARD, 0xE3),
1112 hid_input, 0, &sc->sc_loc_win_l, &flags,
1113 &sc->sc_id_win_l)) {
1114 if (flags & HIO_VARIABLE)
1115 sc->sc_flags |= UKBD_FLAG_WIN_L;
1116 DPRINTFN(1, "Found left GUI\n");
1118 if (hid_locate(ptr, len,
1119 HID_USAGE2(HUP_KEYBOARD, 0xE7),
1120 hid_input, 0, &sc->sc_loc_win_r, &flags,
1121 &sc->sc_id_win_r)) {
1122 if (flags & HIO_VARIABLE)
1123 sc->sc_flags |= UKBD_FLAG_WIN_R;
1124 DPRINTFN(1, "Found right GUI\n");
1126 /* figure out event buffer */
1127 if (hid_locate(ptr, len,
1128 HID_USAGE2(HUP_KEYBOARD, 0x00),
1129 hid_input, 0, &sc->sc_loc_events, &flags,
1130 &sc->sc_id_events)) {
1131 if (flags & HIO_VARIABLE) {
1132 DPRINTFN(1, "Ignoring keyboard event control\n");
1133 } else {
1134 sc->sc_flags |= UKBD_FLAG_EVENTS;
1135 DPRINTFN(1, "Found keyboard event array\n");
1139 /* figure out leds on keyboard */
1140 sc->sc_led_size = hid_report_size(ptr, len,
1141 hid_output, NULL);
1143 if (hid_locate(ptr, len,
1144 HID_USAGE2(HUP_LEDS, 0x01),
1145 hid_output, 0, &sc->sc_loc_numlock, &flags,
1146 &sc->sc_id_numlock)) {
1147 if (flags & HIO_VARIABLE)
1148 sc->sc_flags |= UKBD_FLAG_NUMLOCK;
1149 DPRINTFN(1, "Found keyboard numlock\n");
1151 if (hid_locate(ptr, len,
1152 HID_USAGE2(HUP_LEDS, 0x02),
1153 hid_output, 0, &sc->sc_loc_capslock, &flags,
1154 &sc->sc_id_capslock)) {
1155 if (flags & HIO_VARIABLE)
1156 sc->sc_flags |= UKBD_FLAG_CAPSLOCK;
1157 DPRINTFN(1, "Found keyboard capslock\n");
1159 if (hid_locate(ptr, len,
1160 HID_USAGE2(HUP_LEDS, 0x03),
1161 hid_output, 0, &sc->sc_loc_scrolllock, &flags,
1162 &sc->sc_id_scrolllock)) {
1163 if (flags & HIO_VARIABLE)
1164 sc->sc_flags |= UKBD_FLAG_SCROLLLOCK;
1165 DPRINTFN(1, "Found keyboard scrolllock\n");
1169 static int
1170 ukbd_attach(device_t dev)
1172 struct ukbd_softc *sc = device_get_softc(dev);
1173 struct usb_attach_arg *uaa = device_get_ivars(dev);
1174 int32_t unit = device_get_unit(dev);
1175 keyboard_t *kbd = &sc->sc_kbd;
1176 void *hid_ptr = NULL;
1177 usb_error_t err;
1178 uint16_t n;
1179 uint16_t hid_len;
1180 #ifdef USB_DEBUG
1181 int rate;
1182 #endif
1183 UKBD_LOCK_ASSERT();
1185 kbd_init_struct(kbd, UKBD_DRIVER_NAME, KB_OTHER,
1186 unit, 0, KB_PRI_USB, 0, 0);
1188 kbd->kb_data = (void *)sc;
1190 device_set_usb_desc(dev);
1192 sc->sc_udev = uaa->device;
1193 sc->sc_iface = uaa->iface;
1194 sc->sc_iface_index = uaa->info.bIfaceIndex;
1195 sc->sc_iface_no = uaa->info.bIfaceNum;
1196 sc->sc_mode = K_XLATE;
1198 usb_callout_init_mtx(&sc->sc_callout, &kbd->kb_lock, 0);
1200 err = usbd_transfer_setup(uaa->device,
1201 &uaa->info.bIfaceIndex, sc->sc_xfer, ukbd_config,
1202 UKBD_N_TRANSFER, sc, &sc->sc_kbd.kb_lock);
1204 if (err) {
1205 DPRINTF("error=%s\n", usbd_errstr(err));
1206 goto detach;
1208 /* setup default keyboard maps */
1210 sc->sc_keymap = key_map;
1211 sc->sc_accmap = accent_map;
1212 for (n = 0; n < UKBD_NFKEY; n++) {
1213 sc->sc_fkeymap[n] = fkey_tab[n];
1216 kbd_set_maps(kbd, &sc->sc_keymap, &sc->sc_accmap,
1217 sc->sc_fkeymap, UKBD_NFKEY);
1219 KBD_FOUND_DEVICE(kbd);
1221 ukbd_clear_state(kbd);
1224 * FIXME: set the initial value for lock keys in "sc_state"
1225 * according to the BIOS data?
1227 KBD_PROBE_DONE(kbd);
1229 /* get HID descriptor */
1230 err = usbd_req_get_hid_desc(uaa->device, NULL, &hid_ptr,
1231 &hid_len, M_TEMP, uaa->info.bIfaceIndex);
1233 if (err == 0) {
1234 DPRINTF("Parsing HID descriptor of %d bytes\n",
1235 (int)hid_len);
1237 ukbd_parse_hid(sc, hid_ptr, hid_len);
1239 kfree(hid_ptr, M_TEMP);
1242 /* check if we should use the boot protocol */
1243 if (usb_test_quirk(uaa, UQ_KBD_BOOTPROTO) ||
1244 (err != 0) || (!(sc->sc_flags & UKBD_FLAG_EVENTS))) {
1246 DPRINTF("Forcing boot protocol\n");
1248 err = usbd_req_set_protocol(sc->sc_udev, NULL,
1249 sc->sc_iface_index, 0);
1251 if (err != 0) {
1252 DPRINTF("Set protocol error=%s (ignored)\n",
1253 usbd_errstr(err));
1256 ukbd_parse_hid(sc, ukbd_boot_desc, sizeof(ukbd_boot_desc));
1259 /* ignore if SETIDLE fails, hence it is not crucial */
1260 usbd_req_set_idle(sc->sc_udev, NULL, sc->sc_iface_index, 0, 0);
1262 ukbd_ioctl(kbd, KDSETLED, (caddr_t)&sc->sc_state);
1264 KBD_INIT_DONE(kbd);
1266 if (kbd_register(kbd) < 0) {
1267 goto detach;
1269 KBD_CONFIG_DONE(kbd);
1271 ukbd_enable(kbd);
1273 #ifdef KBD_INSTALL_CDEV
1274 if (kbd_attach(kbd)) {
1275 goto detach;
1277 #endif
1278 sc->sc_flags |= UKBD_FLAG_ATTACHED;
1280 if (bootverbose) {
1281 genkbd_diag(kbd, bootverbose);
1284 #ifdef USB_DEBUG
1285 /* check for polling rate override */
1286 rate = ukbd_pollrate;
1287 if (rate > 0) {
1288 if (rate > 1000)
1289 rate = 1;
1290 else
1291 rate = 1000 / rate;
1293 /* set new polling interval in ms */
1294 usbd_xfer_set_interval(sc->sc_xfer[UKBD_INTR_DT], rate);
1296 #endif
1297 /* start the keyboard */
1298 /* XXX mp locking added */
1299 UKBD_LOCK(sc);
1300 usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT]);
1301 UKBD_UNLOCK(sc);
1303 return (0); /* success */
1304 detach:
1305 ukbd_detach(dev);
1306 return (ENXIO); /* error */
1309 static int
1310 ukbd_detach(device_t dev)
1312 struct ukbd_softc *sc = device_get_softc(dev);
1313 int error;
1315 UKBD_LOCK_ASSERT();
1317 DPRINTF("\n");
1319 crit_enter();
1320 sc->sc_flags |= UKBD_FLAG_GONE;
1322 usb_callout_stop(&sc->sc_callout);
1324 /* kill any stuck keys */
1325 if (sc->sc_flags & UKBD_FLAG_ATTACHED) {
1326 /* stop receiving events from the USB keyboard */
1327 usbd_transfer_stop(sc->sc_xfer[UKBD_INTR_DT]);
1329 /* release all leftover keys, if any */
1330 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
1332 /* process releasing of all keys */
1333 ukbd_interrupt(sc);
1336 ukbd_disable(&sc->sc_kbd);
1339 * XXX make sure this is in the correct place here,
1340 * it was taken from below the second if()
1342 usbd_transfer_unsetup(sc->sc_xfer, UKBD_N_TRANSFER);
1343 usb_callout_drain(&sc->sc_callout);
1345 #ifdef KBD_INSTALL_CDEV
1346 if (sc->sc_flags & UKBD_FLAG_ATTACHED) {
1347 error = kbd_detach(&sc->sc_kbd);
1348 if (error) {
1349 /* usb attach cannot return an error */
1350 device_printf(dev, "WARNING: kbd_detach() "
1351 "returned non-zero! (ignored)\n");
1354 #endif
1355 if (KBD_IS_CONFIGURED(&sc->sc_kbd)) {
1357 * kbd_unregister requires kb_lock to be held
1358 * but lockuninits it then
1360 UKBD_LOCK(sc);
1361 error = kbd_unregister(&sc->sc_kbd);
1362 if (error) {
1363 /* usb attach cannot return an error */
1364 device_printf(dev, "WARNING: kbd_unregister() "
1365 "returned non-zero! (ignored)\n");
1368 sc->sc_kbd.kb_flags = 0;
1370 crit_exit();
1372 DPRINTF("%s: disconnected\n",
1373 device_get_nameunit(dev));
1375 return (0);
1378 static int
1379 ukbd_resume(device_t dev)
1381 struct ukbd_softc *sc = device_get_softc(dev);
1383 UKBD_LOCK_ASSERT();
1385 ukbd_clear_state(&sc->sc_kbd);
1387 return (0);
1390 /* early keyboard probe, not supported */
1391 static int
1392 ukbd_configure(int flags)
1394 return (0);
1397 /* detect a keyboard, not used */
1398 static int
1399 ukbd__probe(int unit, void *arg, int flags)
1401 return (ENXIO);
1404 /* reset and initialize the device, not used */
1405 static int
1406 ukbd_init(int unit, keyboard_t **kbdp, void *arg, int flags)
1408 return (ENXIO);
1411 /* test the interface to the device, not used */
1412 static int
1413 ukbd_test_if(keyboard_t *kbd)
1415 return (0);
1418 /* finish using this keyboard, not used */
1419 static int
1420 ukbd_term(keyboard_t *kbd)
1422 return (ENXIO);
1425 /* keyboard interrupt routine, not used */
1426 static int
1427 ukbd_intr(keyboard_t *kbd, void *arg)
1429 return (0);
1432 /* lock the access to the keyboard, not used */
1433 static int
1434 ukbd_lock(keyboard_t *kbd, int lock)
1436 return (1);
1440 * Enable the access to the device; until this function is called,
1441 * the client cannot read from the keyboard.
1443 static int
1444 ukbd_enable(keyboard_t *kbd)
1446 crit_enter();
1447 KBD_ACTIVATE(kbd);
1448 crit_exit();
1450 return (0);
1453 /* disallow the access to the device */
1454 static int
1455 ukbd_disable(keyboard_t *kbd)
1457 crit_enter();
1458 KBD_DEACTIVATE(kbd);
1459 crit_exit();
1461 return (0);
1464 /* check if data is waiting */
1465 /* Currently unused. */
1466 static int
1467 ukbd_check(keyboard_t *kbd)
1469 struct ukbd_softc *sc = kbd->kb_data;
1471 UKBD_CTX_LOCK_ASSERT();
1473 if (!KBD_IS_ACTIVE(kbd))
1474 return (0);
1476 if (sc->sc_flags & UKBD_FLAG_POLLING)
1477 ukbd_do_poll(sc, 0);
1479 #ifdef UKBD_EMULATE_ATSCANCODE
1480 if (sc->sc_buffered_char[0]) {
1481 return (1);
1483 #endif
1484 if (sc->sc_inputs > 0) {
1485 return (1);
1487 return (0);
1490 /* check if char is waiting */
1491 static int
1492 ukbd_check_char_locked(keyboard_t *kbd)
1494 struct ukbd_softc *sc = kbd->kb_data;
1496 UKBD_CTX_LOCK_ASSERT();
1498 if (!KBD_IS_ACTIVE(kbd))
1499 return (0);
1501 if ((sc->sc_composed_char > 0) &&
1502 (!(sc->sc_flags & UKBD_FLAG_COMPOSE))) {
1503 return (1);
1505 return (ukbd_check(kbd));
1508 static int
1509 ukbd_check_char(keyboard_t *kbd)
1511 int result;
1512 #if 0
1513 struct ukbd_softc *sc = kbd->kb_data;
1515 UKBD_LOCK(sc);
1516 #endif
1517 result = ukbd_check_char_locked(kbd);
1518 #if 0
1519 UKBD_UNLOCK(sc);
1520 #endif
1522 return (result);
1525 /* read one byte from the keyboard if it's allowed */
1526 /* Currently unused. */
1527 static int
1528 ukbd_read(keyboard_t *kbd, int wait)
1530 struct ukbd_softc *sc = kbd->kb_data;
1531 int32_t usbcode;
1532 #ifdef UKBD_EMULATE_ATSCANCODE
1533 uint32_t keycode;
1534 uint32_t scancode;
1536 #endif
1538 UKBD_CTX_LOCK_ASSERT();
1540 if (!KBD_IS_ACTIVE(kbd))
1541 return (-1);
1543 #ifdef UKBD_EMULATE_ATSCANCODE
1544 if (sc->sc_buffered_char[0]) {
1545 scancode = sc->sc_buffered_char[0];
1546 if (scancode & SCAN_PREFIX) {
1547 sc->sc_buffered_char[0] &= ~SCAN_PREFIX;
1548 return ((scancode & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
1550 sc->sc_buffered_char[0] = sc->sc_buffered_char[1];
1551 sc->sc_buffered_char[1] = 0;
1552 return (scancode);
1554 #endif /* UKBD_EMULATE_ATSCANCODE */
1556 /* XXX */
1557 usbcode = ukbd_get_key(sc, (wait == FALSE) ? 0 : 1);
1558 if (!KBD_IS_ACTIVE(kbd) || (usbcode == -1))
1559 return (-1);
1561 ++(kbd->kb_count);
1563 #ifdef UKBD_EMULATE_ATSCANCODE
1564 keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1565 if (keycode == NN) {
1566 return -1;
1568 return (ukbd_key2scan(sc, keycode, sc->sc_ndata.modifiers,
1569 (usbcode & KEY_RELEASE)));
1570 #else /* !UKBD_EMULATE_ATSCANCODE */
1571 return (usbcode);
1572 #endif /* UKBD_EMULATE_ATSCANCODE */
1575 /* read char from the keyboard */
1576 static uint32_t
1577 ukbd_read_char_locked(keyboard_t *kbd, int wait)
1579 struct ukbd_softc *sc = kbd->kb_data;
1580 uint32_t action;
1581 uint32_t keycode;
1582 int32_t usbcode;
1583 #ifdef UKBD_EMULATE_ATSCANCODE
1584 uint32_t scancode;
1585 #endif
1587 UKBD_CTX_LOCK_ASSERT();
1589 if (!KBD_IS_ACTIVE(kbd))
1590 return (NOKEY);
1592 next_code:
1594 /* do we have a composed char to return ? */
1596 if ((sc->sc_composed_char > 0) &&
1597 (!(sc->sc_flags & UKBD_FLAG_COMPOSE))) {
1599 action = sc->sc_composed_char;
1600 sc->sc_composed_char = 0;
1602 if (action > 0xFF) {
1603 goto errkey;
1605 goto done;
1607 #ifdef UKBD_EMULATE_ATSCANCODE
1609 /* do we have a pending raw scan code? */
1611 if (sc->sc_mode == K_RAW) {
1612 scancode = sc->sc_buffered_char[0];
1613 if (scancode) {
1614 if (scancode & SCAN_PREFIX) {
1615 sc->sc_buffered_char[0] = (scancode & ~SCAN_PREFIX);
1616 return ((scancode & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
1618 sc->sc_buffered_char[0] = sc->sc_buffered_char[1];
1619 sc->sc_buffered_char[1] = 0;
1620 return (scancode);
1623 #endif /* UKBD_EMULATE_ATSCANCODE */
1625 /* see if there is something in the keyboard port */
1626 /* XXX */
1627 usbcode = ukbd_get_key(sc, (wait == FALSE) ? 0 : 1);
1628 if (usbcode == -1) {
1629 return (NOKEY);
1631 ++kbd->kb_count;
1633 #ifdef UKBD_EMULATE_ATSCANCODE
1634 /* USB key index -> key code -> AT scan code */
1635 keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1636 if (keycode == NN) {
1637 return (NOKEY);
1639 /* return an AT scan code for the K_RAW mode */
1640 if (sc->sc_mode == K_RAW) {
1641 return (ukbd_key2scan(sc, keycode, sc->sc_ndata.modifiers,
1642 (usbcode & KEY_RELEASE)));
1644 #else /* !UKBD_EMULATE_ATSCANCODE */
1646 /* return the byte as is for the K_RAW mode */
1647 if (sc->sc_mode == K_RAW) {
1648 return (usbcode);
1650 /* USB key index -> key code */
1651 keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1652 if (keycode == NN) {
1653 return (NOKEY);
1655 #endif /* UKBD_EMULATE_ATSCANCODE */
1657 switch (keycode) {
1658 case 0x38: /* left alt (compose key) */
1659 if (usbcode & KEY_RELEASE) {
1660 if (sc->sc_flags & UKBD_FLAG_COMPOSE) {
1661 sc->sc_flags &= ~UKBD_FLAG_COMPOSE;
1663 if (sc->sc_composed_char > 0xFF) {
1664 sc->sc_composed_char = 0;
1667 } else {
1668 if (!(sc->sc_flags & UKBD_FLAG_COMPOSE)) {
1669 sc->sc_flags |= UKBD_FLAG_COMPOSE;
1670 sc->sc_composed_char = 0;
1673 break;
1674 /* XXX: I don't like these... */
1675 case 0x5c: /* print screen */
1676 if (sc->sc_flags & ALTS) {
1677 keycode = 0x54; /* sysrq */
1679 break;
1680 case 0x68: /* pause/break */
1681 if (sc->sc_flags & CTLS) {
1682 keycode = 0x6c; /* break */
1684 break;
1687 /* return the key code in the K_CODE mode */
1688 if (usbcode & KEY_RELEASE) {
1689 keycode |= SCAN_RELEASE;
1691 if (sc->sc_mode == K_CODE) {
1692 return (keycode);
1694 /* compose a character code */
1695 if (sc->sc_flags & UKBD_FLAG_COMPOSE) {
1696 switch (keycode) {
1697 /* key pressed, process it */
1698 case 0x47:
1699 case 0x48:
1700 case 0x49: /* keypad 7,8,9 */
1701 sc->sc_composed_char *= 10;
1702 sc->sc_composed_char += keycode - 0x40;
1703 goto check_composed;
1705 case 0x4B:
1706 case 0x4C:
1707 case 0x4D: /* keypad 4,5,6 */
1708 sc->sc_composed_char *= 10;
1709 sc->sc_composed_char += keycode - 0x47;
1710 goto check_composed;
1712 case 0x4F:
1713 case 0x50:
1714 case 0x51: /* keypad 1,2,3 */
1715 sc->sc_composed_char *= 10;
1716 sc->sc_composed_char += keycode - 0x4E;
1717 goto check_composed;
1719 case 0x52: /* keypad 0 */
1720 sc->sc_composed_char *= 10;
1721 goto check_composed;
1723 /* key released, no interest here */
1724 case SCAN_RELEASE | 0x47:
1725 case SCAN_RELEASE | 0x48:
1726 case SCAN_RELEASE | 0x49: /* keypad 7,8,9 */
1727 case SCAN_RELEASE | 0x4B:
1728 case SCAN_RELEASE | 0x4C:
1729 case SCAN_RELEASE | 0x4D: /* keypad 4,5,6 */
1730 case SCAN_RELEASE | 0x4F:
1731 case SCAN_RELEASE | 0x50:
1732 case SCAN_RELEASE | 0x51: /* keypad 1,2,3 */
1733 case SCAN_RELEASE | 0x52: /* keypad 0 */
1734 goto next_code;
1736 case 0x38: /* left alt key */
1737 break;
1739 default:
1740 if (sc->sc_composed_char > 0) {
1741 sc->sc_flags &= ~UKBD_FLAG_COMPOSE;
1742 sc->sc_composed_char = 0;
1743 goto errkey;
1745 break;
1748 /* keycode to key action */
1749 action = genkbd_keyaction(kbd, SCAN_CHAR(keycode),
1750 (keycode & SCAN_RELEASE),
1751 &sc->sc_state, &sc->sc_accents);
1752 if (action == NOKEY) {
1753 goto next_code;
1755 done:
1756 return (action);
1758 check_composed:
1759 if (sc->sc_composed_char <= 0xFF) {
1760 goto next_code;
1762 errkey:
1763 return (ERRKEY);
1766 /* Currently wait is always false. */
1767 static uint32_t
1768 ukbd_read_char(keyboard_t *kbd, int wait)
1770 uint32_t keycode;
1771 #if 0
1772 struct ukbd_softc *sc = kbd->kb_data;
1774 UKBD_LOCK(sc);
1775 #endif
1776 keycode = ukbd_read_char_locked(kbd, wait);
1777 #if 0
1778 UKBD_UNLOCK(sc);
1779 #endif
1781 return (keycode);
1784 /* some useful control functions */
1785 static int
1786 ukbd_ioctl_locked(keyboard_t *kbd, u_long cmd, caddr_t arg)
1788 struct ukbd_softc *sc = kbd->kb_data;
1789 int i;
1791 switch (cmd) {
1792 case KDGKBMODE: /* get keyboard mode */
1793 *(int *)arg = sc->sc_mode;
1794 break;
1795 case KDSKBMODE: /* set keyboard mode */
1796 switch (*(int *)arg) {
1797 case K_XLATE:
1798 if (sc->sc_mode != K_XLATE) {
1799 /* make lock key state and LED state match */
1800 sc->sc_state &= ~LOCK_MASK;
1801 sc->sc_state |= KBD_LED_VAL(kbd);
1803 /* FALLTHROUGH */
1804 case K_RAW:
1805 case K_CODE:
1806 if (sc->sc_mode != *(int *)arg) {
1807 if ((sc->sc_flags & UKBD_FLAG_POLLING) == 0)
1808 ukbd_clear_state(kbd);
1809 sc->sc_mode = *(int *)arg;
1811 break;
1812 default:
1813 return (EINVAL);
1815 break;
1817 case KDGETLED: /* get keyboard LED */
1818 *(int *)arg = KBD_LED_VAL(kbd);
1819 break;
1820 case KDSETLED: /* set keyboard LED */
1821 /* NOTE: lock key state in "sc_state" won't be changed */
1822 if (*(int *)arg & ~LOCK_MASK)
1823 return (EINVAL);
1825 i = *(int *)arg;
1827 /* replace CAPS LED with ALTGR LED for ALTGR keyboards */
1828 if (sc->sc_mode == K_XLATE &&
1829 kbd->kb_keymap->n_keys > ALTGR_OFFSET) {
1830 if (i & ALKED)
1831 i |= CLKED;
1832 else
1833 i &= ~CLKED;
1835 if (KBD_HAS_DEVICE(kbd))
1836 ukbd_set_leds(sc, i);
1838 KBD_LED_VAL(kbd) = *(int *)arg;
1839 break;
1840 case KDGKBSTATE: /* get lock key state */
1841 *(int *)arg = sc->sc_state & LOCK_MASK;
1842 break;
1843 case KDSKBSTATE: /* set lock key state */
1844 if (*(int *)arg & ~LOCK_MASK) {
1845 return (EINVAL);
1847 sc->sc_state &= ~LOCK_MASK;
1848 sc->sc_state |= *(int *)arg;
1850 /* set LEDs and quit */
1851 return (ukbd_ioctl(kbd, KDSETLED, arg));
1853 case KDSETREPEAT: /* set keyboard repeat rate (new
1854 * interface) */
1855 if (!KBD_HAS_DEVICE(kbd)) {
1856 return (0);
1858 if (((int *)arg)[1] < 0) {
1859 return (EINVAL);
1861 if (((int *)arg)[0] < 0) {
1862 return (EINVAL);
1864 if (((int *)arg)[0] < 200) /* fastest possible value */
1865 kbd->kb_delay1 = 200;
1866 else
1867 kbd->kb_delay1 = ((int *)arg)[0];
1868 kbd->kb_delay2 = ((int *)arg)[1];
1869 return (0);
1871 case KDSETRAD: /* set keyboard repeat rate (old
1872 * interface) */
1873 return (ukbd_set_typematic(kbd, *(int *)arg));
1875 case PIO_KEYMAP: /* set keyboard translation table */
1876 case PIO_KEYMAPENT: /* set keyboard translation table
1877 * entry */
1878 case PIO_DEADKEYMAP: /* set accent key translation table */
1879 sc->sc_accents = 0;
1880 /* FALLTHROUGH */
1881 default:
1882 return (genkbd_commonioctl(kbd, cmd, arg));
1885 return (0);
1888 static int
1889 ukbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
1891 int result;
1892 struct ukbd_softc *sc = kbd->kb_data;
1895 * XXX KDGKBSTATE, KDSKBSTATE and KDSETLED can be called from any
1896 * context where printf(9) can be called, which among other things
1897 * includes interrupt filters and threads with any kinds of locks
1898 * already held. For this reason it would be dangerous to acquire
1899 * the Giant here unconditionally. On the other hand we have to
1900 * have it to handle the ioctl.
1901 * So we make our best effort to auto-detect whether we can grab
1902 * the Giant or not. Blame syscons(4) for this.
1904 switch (cmd) {
1905 case KDGKBSTATE:
1906 case KDSKBSTATE:
1907 case KDSETLED:
1908 if(!lockowned(&kbd->kb_lock)) {
1909 return (EDEADLK); /* best I could come up with */
1911 /* FALLTHROUGH */
1912 default:
1913 UKBD_LOCK(sc);
1914 result = ukbd_ioctl_locked(kbd, cmd, arg);
1915 UKBD_UNLOCK(sc);
1916 return (result);
1921 /* clear the internal state of the keyboard */
1922 static void
1923 ukbd_clear_state(keyboard_t *kbd)
1925 struct ukbd_softc *sc = kbd->kb_data;
1927 UKBD_CTX_LOCK_ASSERT();
1929 sc->sc_flags &= ~(UKBD_FLAG_COMPOSE | UKBD_FLAG_POLLING);
1930 sc->sc_state &= LOCK_MASK; /* preserve locking key state */
1931 sc->sc_accents = 0;
1932 sc->sc_composed_char = 0;
1933 #ifdef UKBD_EMULATE_ATSCANCODE
1934 sc->sc_buffered_char[0] = 0;
1935 sc->sc_buffered_char[1] = 0;
1936 #endif
1937 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
1938 memset(&sc->sc_odata, 0, sizeof(sc->sc_odata));
1939 memset(&sc->sc_ntime, 0, sizeof(sc->sc_ntime));
1940 memset(&sc->sc_otime, 0, sizeof(sc->sc_otime));
1943 /* save the internal state, not used */
1944 static int
1945 ukbd_get_state(keyboard_t *kbd, void *buf, size_t len)
1947 return (len == 0) ? 1 : -1;
1950 /* set the internal state, not used */
1951 static int
1952 ukbd_set_state(keyboard_t *kbd, void *buf, size_t len)
1954 return (EINVAL);
1957 static int
1958 ukbd_poll(keyboard_t *kbd, int on)
1960 struct ukbd_softc *sc = kbd->kb_data;
1962 UKBD_LOCK(sc);
1963 if (on) {
1964 sc->sc_flags |= UKBD_FLAG_POLLING;
1965 sc->sc_poll_thread = curthread;
1966 } else {
1967 sc->sc_flags &= ~UKBD_FLAG_POLLING;
1968 ukbd_start_timer(sc); /* start timer */
1970 UKBD_UNLOCK(sc);
1972 return (0);
1975 /* local functions */
1977 static void
1978 ukbd_set_leds(struct ukbd_softc *sc, uint8_t leds)
1980 UKBD_LOCK_ASSERT();
1981 DPRINTF("leds=0x%02x\n", leds);
1983 sc->sc_leds = leds;
1984 sc->sc_flags |= UKBD_FLAG_SET_LEDS;
1986 /* start transfer, if not already started */
1988 usbd_transfer_start(sc->sc_xfer[UKBD_CTRL_LED]);
1991 static int
1992 ukbd_set_typematic(keyboard_t *kbd, int code)
1994 static const int delays[] = {250, 500, 750, 1000};
1995 static const int rates[] = {34, 38, 42, 46, 50, 55, 59, 63,
1996 68, 76, 84, 92, 100, 110, 118, 126,
1997 136, 152, 168, 184, 200, 220, 236, 252,
1998 272, 304, 336, 368, 400, 440, 472, 504};
2000 if (code & ~0x7f) {
2001 return (EINVAL);
2003 kbd->kb_delay1 = delays[(code >> 5) & 3];
2004 kbd->kb_delay2 = rates[code & 0x1f];
2005 return (0);
2008 #ifdef UKBD_EMULATE_ATSCANCODE
2009 static int
2010 ukbd_key2scan(struct ukbd_softc *sc, int code, int shift, int up)
2012 static const int scan[] = {
2013 /* 89 */
2014 0x11c, /* Enter */
2015 /* 90-99 */
2016 0x11d, /* Ctrl-R */
2017 0x135, /* Divide */
2018 0x137 | SCAN_PREFIX_SHIFT, /* PrintScreen */
2019 0x138, /* Alt-R */
2020 0x147, /* Home */
2021 0x148, /* Up */
2022 0x149, /* PageUp */
2023 0x14b, /* Left */
2024 0x14d, /* Right */
2025 0x14f, /* End */
2026 /* 100-109 */
2027 0x150, /* Down */
2028 0x151, /* PageDown */
2029 0x152, /* Insert */
2030 0x153, /* Delete */
2031 0x146, /* XXX Pause/Break */
2032 0x15b, /* Win_L(Super_L) */
2033 0x15c, /* Win_R(Super_R) */
2034 0x15d, /* Application(Menu) */
2036 /* SUN TYPE 6 USB KEYBOARD */
2037 0x168, /* Sun Type 6 Help */
2038 0x15e, /* Sun Type 6 Stop */
2039 /* 110 - 119 */
2040 0x15f, /* Sun Type 6 Again */
2041 0x160, /* Sun Type 6 Props */
2042 0x161, /* Sun Type 6 Undo */
2043 0x162, /* Sun Type 6 Front */
2044 0x163, /* Sun Type 6 Copy */
2045 0x164, /* Sun Type 6 Open */
2046 0x165, /* Sun Type 6 Paste */
2047 0x166, /* Sun Type 6 Find */
2048 0x167, /* Sun Type 6 Cut */
2049 0x125, /* Sun Type 6 Mute */
2050 /* 120 - 128 */
2051 0x11f, /* Sun Type 6 VolumeDown */
2052 0x11e, /* Sun Type 6 VolumeUp */
2053 0x120, /* Sun Type 6 PowerDown */
2055 /* Japanese 106/109 keyboard */
2056 0x73, /* Keyboard Intl' 1 (backslash / underscore) */
2057 0x70, /* Keyboard Intl' 2 (Katakana / Hiragana) */
2058 0x7d, /* Keyboard Intl' 3 (Yen sign) (Not using in jp106/109) */
2059 0x79, /* Keyboard Intl' 4 (Henkan) */
2060 0x7b, /* Keyboard Intl' 5 (Muhenkan) */
2061 0x5c, /* Keyboard Intl' 6 (Keypad ,) (For PC-9821 layout) */
2064 if ((code >= 89) && (code < (int)(89 + NELEM(scan)))) {
2065 code = scan[code - 89];
2067 /* Pause/Break */
2068 if ((code == 104) && (!(shift & (MOD_CONTROL_L | MOD_CONTROL_R)))) {
2069 code = (0x45 | SCAN_PREFIX_E1 | SCAN_PREFIX_CTL);
2071 if (shift & (MOD_SHIFT_L | MOD_SHIFT_R)) {
2072 code &= ~SCAN_PREFIX_SHIFT;
2074 code |= (up ? SCAN_RELEASE : SCAN_PRESS);
2076 if (code & SCAN_PREFIX) {
2077 if (code & SCAN_PREFIX_CTL) {
2078 /* Ctrl */
2079 sc->sc_buffered_char[0] = (0x1d | (code & SCAN_RELEASE));
2080 sc->sc_buffered_char[1] = (code & ~SCAN_PREFIX);
2081 } else if (code & SCAN_PREFIX_SHIFT) {
2082 /* Shift */
2083 sc->sc_buffered_char[0] = (0x2a | (code & SCAN_RELEASE));
2084 sc->sc_buffered_char[1] = (code & ~SCAN_PREFIX_SHIFT);
2085 } else {
2086 sc->sc_buffered_char[0] = (code & ~SCAN_PREFIX);
2087 sc->sc_buffered_char[1] = 0;
2089 return ((code & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
2091 return (code);
2095 #endif /* UKBD_EMULATE_ATSCANCODE */
2097 static keyboard_switch_t ukbdsw = {
2098 .probe = &ukbd__probe,
2099 .init = &ukbd_init,
2100 .term = &ukbd_term,
2101 .intr = &ukbd_intr,
2102 .test_if = &ukbd_test_if,
2103 .enable = &ukbd_enable,
2104 .disable = &ukbd_disable,
2105 .read = &ukbd_read,
2106 .check = &ukbd_check,
2107 .read_char = &ukbd_read_char,
2108 .check_char = &ukbd_check_char,
2109 .ioctl = &ukbd_ioctl,
2110 .lock = &ukbd_lock,
2111 .clear_state = &ukbd_clear_state,
2112 .get_state = &ukbd_get_state,
2113 .set_state = &ukbd_set_state,
2114 .get_fkeystr = &genkbd_get_fkeystr,
2115 .poll = &ukbd_poll,
2116 .diag = &genkbd_diag,
2119 KEYBOARD_DRIVER(ukbd, ukbdsw, ukbd_configure);
2121 static int
2122 ukbd_driver_load(module_t mod, int what, void *arg)
2124 switch (what) {
2125 case MOD_LOAD:
2126 kbd_add_driver(&ukbd_kbd_driver);
2127 break;
2128 case MOD_UNLOAD:
2129 kbd_delete_driver(&ukbd_kbd_driver);
2130 break;
2132 return (0);
2135 static devclass_t ukbd_devclass;
2137 static device_method_t ukbd_methods[] = {
2138 DEVMETHOD(device_probe, ukbd_probe),
2139 DEVMETHOD(device_attach, ukbd_attach),
2140 DEVMETHOD(device_detach, ukbd_detach),
2141 DEVMETHOD(device_resume, ukbd_resume),
2142 DEVMETHOD_END
2145 static driver_t ukbd_driver = {
2146 .name = "ukbd",
2147 .methods = ukbd_methods,
2148 .size = sizeof(struct ukbd_softc),
2151 DRIVER_MODULE(ukbd, uhub, ukbd_driver, ukbd_devclass, ukbd_driver_load, NULL);
2152 MODULE_DEPEND(ukbd, usb, 1, 1, 1);
2153 MODULE_VERSION(ukbd, 1);