]> CyberLeo.Net >> Repos - FreeBSD/stable/9.git/blob - sys/dev/usb/input/ukbd.c
MFC r240750, r241987 and r242126:
[FreeBSD/stable/9.git] / sys / dev / usb / input / ukbd.c
1 #include <sys/cdefs.h>
2 __FBSDID("$FreeBSD$");
3
4
5 /*-
6  * Copyright (c) 1998 The NetBSD Foundation, Inc.
7  * All rights reserved.
8  *
9  * This code is derived from software contributed to The NetBSD Foundation
10  * by Lennart Augustsson (lennart@augustsson.net) at
11  * Carlstedt Research & Technology.
12  *
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.
21  *
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.
33  *
34  */
35
36 /*
37  * HID spec: http://www.usb.org/developers/devclass_docs/HID1_11.pdf
38  */
39
40 #include "opt_compat.h"
41 #include "opt_kbd.h"
42 #include "opt_ukbd.h"
43
44 #include <sys/stdint.h>
45 #include <sys/stddef.h>
46 #include <sys/param.h>
47 #include <sys/queue.h>
48 #include <sys/types.h>
49 #include <sys/systm.h>
50 #include <sys/kernel.h>
51 #include <sys/bus.h>
52 #include <sys/module.h>
53 #include <sys/lock.h>
54 #include <sys/mutex.h>
55 #include <sys/condvar.h>
56 #include <sys/sysctl.h>
57 #include <sys/sx.h>
58 #include <sys/unistd.h>
59 #include <sys/callout.h>
60 #include <sys/malloc.h>
61 #include <sys/priv.h>
62 #include <sys/proc.h>
63 #include <sys/sched.h>
64 #include <sys/kdb.h>
65
66 #include <dev/usb/usb.h>
67 #include <dev/usb/usbdi.h>
68 #include <dev/usb/usbdi_util.h>
69 #include <dev/usb/usbhid.h>
70
71 #define USB_DEBUG_VAR ukbd_debug
72 #include <dev/usb/usb_debug.h>
73
74 #include <dev/usb/quirk/usb_quirk.h>
75
76 #include <sys/ioccom.h>
77 #include <sys/filio.h>
78 #include <sys/tty.h>
79 #include <sys/kbio.h>
80
81 #include <dev/kbd/kbdreg.h>
82
83 /* the initial key map, accent map and fkey strings */
84 #if defined(UKBD_DFLT_KEYMAP) && !defined(KLD_MODULE)
85 #define KBD_DFLT_KEYMAP
86 #include "ukbdmap.h"
87 #endif
88
89 /* the following file must be included after "ukbdmap.h" */
90 #include <dev/kbd/kbdtables.h>
91
92 #ifdef USB_DEBUG
93 static int ukbd_debug = 0;
94 static int ukbd_no_leds = 0;
95
96 SYSCTL_NODE(_hw_usb, OID_AUTO, ukbd, CTLFLAG_RW, 0, "USB ukbd");
97 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, debug, CTLFLAG_RW | CTLFLAG_TUN,
98     &ukbd_debug, 0, "Debug level");
99 TUNABLE_INT("hw.usb.ukbd.debug", &ukbd_debug);
100 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, no_leds, CTLFLAG_RW | CTLFLAG_TUN,
101     &ukbd_no_leds, 0, "Disables setting of keyboard leds");
102 TUNABLE_INT("hw.usb.ukbd.no_leds", &ukbd_no_leds);
103 #endif
104
105 #define UKBD_EMULATE_ATSCANCODE        1
106 #define UKBD_DRIVER_NAME          "ukbd"
107 #define UKBD_NMOD                     8 /* units */
108 #define UKBD_NKEYCODE                 6 /* units */
109 #define UKBD_IN_BUF_SIZE  (2*(UKBD_NMOD + (2*UKBD_NKEYCODE)))   /* bytes */
110 #define UKBD_IN_BUF_FULL  (UKBD_IN_BUF_SIZE / 2)        /* bytes */
111 #define UKBD_NFKEY        (sizeof(fkey_tab)/sizeof(fkey_tab[0]))        /* units */
112 #define UKBD_BUFFER_SIZE              64        /* bytes */
113
114 struct ukbd_data {
115         uint16_t        modifiers;
116 #define MOD_CONTROL_L   0x01
117 #define MOD_CONTROL_R   0x10
118 #define MOD_SHIFT_L     0x02
119 #define MOD_SHIFT_R     0x20
120 #define MOD_ALT_L       0x04
121 #define MOD_ALT_R       0x40
122 #define MOD_WIN_L       0x08
123 #define MOD_WIN_R       0x80
124 /* internal */
125 #define MOD_EJECT       0x0100
126 #define MOD_FN          0x0200
127         uint8_t keycode[UKBD_NKEYCODE];
128 };
129
130 enum {
131         UKBD_INTR_DT,
132         UKBD_CTRL_LED,
133         UKBD_N_TRANSFER,
134 };
135
136 struct ukbd_softc {
137         keyboard_t sc_kbd;
138         keymap_t sc_keymap;
139         accentmap_t sc_accmap;
140         fkeytab_t sc_fkeymap[UKBD_NFKEY];
141         struct hid_location sc_loc_apple_eject;
142         struct hid_location sc_loc_apple_fn;
143         struct hid_location sc_loc_ctrl_l;
144         struct hid_location sc_loc_ctrl_r;
145         struct hid_location sc_loc_shift_l;
146         struct hid_location sc_loc_shift_r;
147         struct hid_location sc_loc_alt_l;
148         struct hid_location sc_loc_alt_r;
149         struct hid_location sc_loc_win_l;
150         struct hid_location sc_loc_win_r;
151         struct hid_location sc_loc_events;
152         struct hid_location sc_loc_numlock;
153         struct hid_location sc_loc_capslock;
154         struct hid_location sc_loc_scrolllock;
155         struct usb_callout sc_callout;
156         struct ukbd_data sc_ndata;
157         struct ukbd_data sc_odata;
158
159         struct thread *sc_poll_thread;
160         struct usb_device *sc_udev;
161         struct usb_interface *sc_iface;
162         struct usb_xfer *sc_xfer[UKBD_N_TRANSFER];
163
164         uint32_t sc_ntime[UKBD_NKEYCODE];
165         uint32_t sc_otime[UKBD_NKEYCODE];
166         uint32_t sc_input[UKBD_IN_BUF_SIZE];    /* input buffer */
167         uint32_t sc_time_ms;
168         uint32_t sc_composed_char;      /* composed char code, if non-zero */
169 #ifdef UKBD_EMULATE_ATSCANCODE
170         uint32_t sc_buffered_char[2];
171 #endif
172         uint32_t sc_flags;              /* flags */
173 #define UKBD_FLAG_COMPOSE       0x00000001
174 #define UKBD_FLAG_POLLING       0x00000002
175 #define UKBD_FLAG_SET_LEDS      0x00000004
176 #define UKBD_FLAG_ATTACHED      0x00000010
177 #define UKBD_FLAG_GONE          0x00000020
178
179 #define UKBD_FLAG_HID_MASK      0x003fffc0
180 #define UKBD_FLAG_APPLE_EJECT   0x00000040
181 #define UKBD_FLAG_APPLE_FN      0x00000080
182 #define UKBD_FLAG_APPLE_SWAP    0x00000100
183 #define UKBD_FLAG_TIMER_RUNNING 0x00000200
184 #define UKBD_FLAG_CTRL_L        0x00000400
185 #define UKBD_FLAG_CTRL_R        0x00000800
186 #define UKBD_FLAG_SHIFT_L       0x00001000
187 #define UKBD_FLAG_SHIFT_R       0x00002000
188 #define UKBD_FLAG_ALT_L         0x00004000
189 #define UKBD_FLAG_ALT_R         0x00008000
190 #define UKBD_FLAG_WIN_L         0x00010000
191 #define UKBD_FLAG_WIN_R         0x00020000
192 #define UKBD_FLAG_EVENTS        0x00040000
193 #define UKBD_FLAG_NUMLOCK       0x00080000
194 #define UKBD_FLAG_CAPSLOCK      0x00100000
195 #define UKBD_FLAG_SCROLLLOCK    0x00200000
196
197         int     sc_mode;                /* input mode (K_XLATE,K_RAW,K_CODE) */
198         int     sc_state;               /* shift/lock key state */
199         int     sc_accents;             /* accent key index (> 0) */
200         int     sc_led_size;
201         int     sc_kbd_size;
202
203         uint16_t sc_inputs;
204         uint16_t sc_inputhead;
205         uint16_t sc_inputtail;
206         uint16_t sc_modifiers;
207
208         uint8_t sc_leds;                /* store for async led requests */
209         uint8_t sc_iface_index;
210         uint8_t sc_iface_no;
211         uint8_t sc_id_apple_eject;
212         uint8_t sc_id_apple_fn;
213         uint8_t sc_id_ctrl_l;
214         uint8_t sc_id_ctrl_r;
215         uint8_t sc_id_shift_l;
216         uint8_t sc_id_shift_r;
217         uint8_t sc_id_alt_l;
218         uint8_t sc_id_alt_r;
219         uint8_t sc_id_win_l;
220         uint8_t sc_id_win_r;
221         uint8_t sc_id_event;
222         uint8_t sc_id_numlock;
223         uint8_t sc_id_capslock;
224         uint8_t sc_id_scrolllock;
225         uint8_t sc_id_events;
226         uint8_t sc_kbd_id;
227
228         uint8_t sc_buffer[UKBD_BUFFER_SIZE];
229 };
230
231 #define KEY_ERROR         0x01
232
233 #define KEY_PRESS         0
234 #define KEY_RELEASE       0x400
235 #define KEY_INDEX(c)      ((c) & 0xFF)
236
237 #define SCAN_PRESS        0
238 #define SCAN_RELEASE      0x80
239 #define SCAN_PREFIX_E0    0x100
240 #define SCAN_PREFIX_E1    0x200
241 #define SCAN_PREFIX_CTL   0x400
242 #define SCAN_PREFIX_SHIFT 0x800
243 #define SCAN_PREFIX     (SCAN_PREFIX_E0  | SCAN_PREFIX_E1 | \
244                          SCAN_PREFIX_CTL | SCAN_PREFIX_SHIFT)
245 #define SCAN_CHAR(c)    ((c) & 0x7f)
246
247 #define UKBD_LOCK()     mtx_lock(&Giant)
248 #define UKBD_UNLOCK()   mtx_unlock(&Giant)
249
250 #ifdef  INVARIANTS
251
252 /*
253  * Assert that the lock is held in all contexts
254  * where the code can be executed.
255  */
256 #define UKBD_LOCK_ASSERT()      mtx_assert(&Giant, MA_OWNED)
257
258 /*
259  * Assert that the lock is held in the contexts
260  * where it really has to be so.
261  */
262 #define UKBD_CTX_LOCK_ASSERT()                          \
263         do {                                            \
264                 if (!kdb_active && panicstr == NULL)    \
265                         mtx_assert(&Giant, MA_OWNED);   \
266         } while (0)
267 #else
268
269 #define UKBD_LOCK_ASSERT()      (void)0
270 #define UKBD_CTX_LOCK_ASSERT()  (void)0
271
272 #endif
273
274 struct ukbd_mods {
275         uint32_t mask, key;
276 };
277
278 static const struct ukbd_mods ukbd_mods[UKBD_NMOD] = {
279         {MOD_CONTROL_L, 0xe0},
280         {MOD_CONTROL_R, 0xe4},
281         {MOD_SHIFT_L, 0xe1},
282         {MOD_SHIFT_R, 0xe5},
283         {MOD_ALT_L, 0xe2},
284         {MOD_ALT_R, 0xe6},
285         {MOD_WIN_L, 0xe3},
286         {MOD_WIN_R, 0xe7},
287 };
288
289 #define NN 0                            /* no translation */
290 /*
291  * Translate USB keycodes to AT keyboard scancodes.
292  */
293 /*
294  * FIXME: Mac USB keyboard generates:
295  * 0x53: keypad NumLock/Clear
296  * 0x66: Power
297  * 0x67: keypad =
298  * 0x68: F13
299  * 0x69: F14
300  * 0x6a: F15
301  */
302 static const uint8_t ukbd_trtab[256] = {
303         0, 0, 0, 0, 30, 48, 46, 32,     /* 00 - 07 */
304         18, 33, 34, 35, 23, 36, 37, 38, /* 08 - 0F */
305         50, 49, 24, 25, 16, 19, 31, 20, /* 10 - 17 */
306         22, 47, 17, 45, 21, 44, 2, 3,   /* 18 - 1F */
307         4, 5, 6, 7, 8, 9, 10, 11,       /* 20 - 27 */
308         28, 1, 14, 15, 57, 12, 13, 26,  /* 28 - 2F */
309         27, 43, 43, 39, 40, 41, 51, 52, /* 30 - 37 */
310         53, 58, 59, 60, 61, 62, 63, 64, /* 38 - 3F */
311         65, 66, 67, 68, 87, 88, 92, 70, /* 40 - 47 */
312         104, 102, 94, 96, 103, 99, 101, 98,     /* 48 - 4F */
313         97, 100, 95, 69, 91, 55, 74, 78,/* 50 - 57 */
314         89, 79, 80, 81, 75, 76, 77, 71, /* 58 - 5F */
315         72, 73, 82, 83, 86, 107, 122, NN,       /* 60 - 67 */
316         NN, NN, NN, NN, NN, NN, NN, NN, /* 68 - 6F */
317         NN, NN, NN, NN, 115, 108, 111, 113,     /* 70 - 77 */
318         109, 110, 112, 118, 114, 116, 117, 119, /* 78 - 7F */
319         121, 120, NN, NN, NN, NN, NN, 123,      /* 80 - 87 */
320         124, 125, 126, 127, 128, NN, NN, NN,    /* 88 - 8F */
321         NN, NN, NN, NN, NN, NN, NN, NN, /* 90 - 97 */
322         NN, NN, NN, NN, NN, NN, NN, NN, /* 98 - 9F */
323         NN, NN, NN, NN, NN, NN, NN, NN, /* A0 - A7 */
324         NN, NN, NN, NN, NN, NN, NN, NN, /* A8 - AF */
325         NN, NN, NN, NN, NN, NN, NN, NN, /* B0 - B7 */
326         NN, NN, NN, NN, NN, NN, NN, NN, /* B8 - BF */
327         NN, NN, NN, NN, NN, NN, NN, NN, /* C0 - C7 */
328         NN, NN, NN, NN, NN, NN, NN, NN, /* C8 - CF */
329         NN, NN, NN, NN, NN, NN, NN, NN, /* D0 - D7 */
330         NN, NN, NN, NN, NN, NN, NN, NN, /* D8 - DF */
331         29, 42, 56, 105, 90, 54, 93, 106,       /* E0 - E7 */
332         NN, NN, NN, NN, NN, NN, NN, NN, /* E8 - EF */
333         NN, NN, NN, NN, NN, NN, NN, NN, /* F0 - F7 */
334         NN, NN, NN, NN, NN, NN, NN, NN, /* F8 - FF */
335 };
336
337 static const uint8_t ukbd_boot_desc[] = {
338         0x05, 0x01, 0x09, 0x06, 0xa1,
339         0x01, 0x05, 0x07, 0x19, 0xe0,
340         0x29, 0xe7, 0x15, 0x00, 0x25,
341         0x01, 0x75, 0x01, 0x95, 0x08,
342         0x81, 0x02, 0x95, 0x01, 0x75,
343         0x08, 0x81, 0x01, 0x95, 0x03,
344         0x75, 0x01, 0x05, 0x08, 0x19,
345         0x01, 0x29, 0x03, 0x91, 0x02,
346         0x95, 0x05, 0x75, 0x01, 0x91,
347         0x01, 0x95, 0x06, 0x75, 0x08,
348         0x15, 0x00, 0x26, 0xff, 0x00,
349         0x05, 0x07, 0x19, 0x00, 0x2a,
350         0xff, 0x00, 0x81, 0x00, 0xc0
351 };
352
353 /* prototypes */
354 static void     ukbd_timeout(void *);
355 static void     ukbd_set_leds(struct ukbd_softc *, uint8_t);
356 static int      ukbd_set_typematic(keyboard_t *, int);
357 #ifdef UKBD_EMULATE_ATSCANCODE
358 static int      ukbd_key2scan(struct ukbd_softc *, int, int, int);
359 #endif
360 static uint32_t ukbd_read_char(keyboard_t *, int);
361 static void     ukbd_clear_state(keyboard_t *);
362 static int      ukbd_ioctl(keyboard_t *, u_long, caddr_t);
363 static int      ukbd_enable(keyboard_t *);
364 static int      ukbd_disable(keyboard_t *);
365 static void     ukbd_interrupt(struct ukbd_softc *);
366 static void     ukbd_event_keyinput(struct ukbd_softc *);
367
368 static device_probe_t ukbd_probe;
369 static device_attach_t ukbd_attach;
370 static device_detach_t ukbd_detach;
371 static device_resume_t ukbd_resume;
372
373 static uint8_t
374 ukbd_any_key_pressed(struct ukbd_softc *sc)
375 {
376         uint8_t i;
377         uint8_t j;
378
379         for (j = i = 0; i < UKBD_NKEYCODE; i++)
380                 j |= sc->sc_odata.keycode[i];
381
382         return (j ? 1 : 0);
383 }
384
385 static void
386 ukbd_start_timer(struct ukbd_softc *sc)
387 {
388         sc->sc_flags |= UKBD_FLAG_TIMER_RUNNING;
389         usb_callout_reset(&sc->sc_callout, hz / 40, &ukbd_timeout, sc);
390 }
391
392 static void
393 ukbd_put_key(struct ukbd_softc *sc, uint32_t key)
394 {
395
396         UKBD_CTX_LOCK_ASSERT();
397
398         DPRINTF("0x%02x (%d) %s\n", key, key,
399             (key & KEY_RELEASE) ? "released" : "pressed");
400
401         if (sc->sc_inputs < UKBD_IN_BUF_SIZE) {
402                 sc->sc_input[sc->sc_inputtail] = key;
403                 ++(sc->sc_inputs);
404                 ++(sc->sc_inputtail);
405                 if (sc->sc_inputtail >= UKBD_IN_BUF_SIZE) {
406                         sc->sc_inputtail = 0;
407                 }
408         } else {
409                 DPRINTF("input buffer is full\n");
410         }
411 }
412
413 static void
414 ukbd_do_poll(struct ukbd_softc *sc, uint8_t wait)
415 {
416
417         UKBD_CTX_LOCK_ASSERT();
418         KASSERT((sc->sc_flags & UKBD_FLAG_POLLING) != 0,
419             ("ukbd_do_poll called when not polling\n"));
420         DPRINTFN(2, "polling\n");
421
422         if (!kdb_active && !SCHEDULER_STOPPED()) {
423                 /*
424                  * In this context the kernel is polling for input,
425                  * but the USB subsystem works in normal interrupt-driven
426                  * mode, so we just wait on the USB threads to do the job.
427                  * Note that we currently hold the Giant, but it's also used
428                  * as the transfer mtx, so we must release it while waiting.
429                  */
430                 while (sc->sc_inputs == 0) {
431                         /*
432                          * Give USB threads a chance to run.  Note that
433                          * kern_yield performs DROP_GIANT + PICKUP_GIANT.
434                          */
435                         kern_yield(PRI_UNCHANGED);
436                         if (!wait)
437                                 break;
438                 }
439                 return;
440         }
441
442         while (sc->sc_inputs == 0) {
443
444                 usbd_transfer_poll(sc->sc_xfer, UKBD_N_TRANSFER);
445
446                 /* Delay-optimised support for repetition of keys */
447                 if (ukbd_any_key_pressed(sc)) {
448                         /* a key is pressed - need timekeeping */
449                         DELAY(1000);
450
451                         /* 1 millisecond has passed */
452                         sc->sc_time_ms += 1;
453                 }
454
455                 ukbd_interrupt(sc);
456
457                 if (!wait)
458                         break;
459         }
460 }
461
462 static int32_t
463 ukbd_get_key(struct ukbd_softc *sc, uint8_t wait)
464 {
465         int32_t c;
466
467         UKBD_CTX_LOCK_ASSERT();
468         KASSERT((!kdb_active && !SCHEDULER_STOPPED())
469             || (sc->sc_flags & UKBD_FLAG_POLLING) != 0,
470             ("not polling in kdb or panic\n"));
471
472         if (sc->sc_inputs == 0) {
473                 /* start transfer, if not already started */
474                 usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT]);
475         }
476
477         if (sc->sc_flags & UKBD_FLAG_POLLING)
478                 ukbd_do_poll(sc, wait);
479
480         if (sc->sc_inputs == 0) {
481                 c = -1;
482         } else {
483                 c = sc->sc_input[sc->sc_inputhead];
484                 --(sc->sc_inputs);
485                 ++(sc->sc_inputhead);
486                 if (sc->sc_inputhead >= UKBD_IN_BUF_SIZE) {
487                         sc->sc_inputhead = 0;
488                 }
489         }
490         return (c);
491 }
492
493 static void
494 ukbd_interrupt(struct ukbd_softc *sc)
495 {
496         uint32_t n_mod;
497         uint32_t o_mod;
498         uint32_t now = sc->sc_time_ms;
499         uint32_t dtime;
500         uint8_t key;
501         uint8_t i;
502         uint8_t j;
503
504         UKBD_CTX_LOCK_ASSERT();
505
506         if (sc->sc_ndata.keycode[0] == KEY_ERROR)
507                 return;
508
509         n_mod = sc->sc_ndata.modifiers;
510         o_mod = sc->sc_odata.modifiers;
511         if (n_mod != o_mod) {
512                 for (i = 0; i < UKBD_NMOD; i++) {
513                         if ((n_mod & ukbd_mods[i].mask) !=
514                             (o_mod & ukbd_mods[i].mask)) {
515                                 ukbd_put_key(sc, ukbd_mods[i].key |
516                                     ((n_mod & ukbd_mods[i].mask) ?
517                                     KEY_PRESS : KEY_RELEASE));
518                         }
519                 }
520         }
521         /* Check for released keys. */
522         for (i = 0; i < UKBD_NKEYCODE; i++) {
523                 key = sc->sc_odata.keycode[i];
524                 if (key == 0) {
525                         continue;
526                 }
527                 for (j = 0; j < UKBD_NKEYCODE; j++) {
528                         if (sc->sc_ndata.keycode[j] == 0) {
529                                 continue;
530                         }
531                         if (key == sc->sc_ndata.keycode[j]) {
532                                 goto rfound;
533                         }
534                 }
535                 ukbd_put_key(sc, key | KEY_RELEASE);
536 rfound: ;
537         }
538
539         /* Check for pressed keys. */
540         for (i = 0; i < UKBD_NKEYCODE; i++) {
541                 key = sc->sc_ndata.keycode[i];
542                 if (key == 0) {
543                         continue;
544                 }
545                 sc->sc_ntime[i] = now + sc->sc_kbd.kb_delay1;
546                 for (j = 0; j < UKBD_NKEYCODE; j++) {
547                         if (sc->sc_odata.keycode[j] == 0) {
548                                 continue;
549                         }
550                         if (key == sc->sc_odata.keycode[j]) {
551
552                                 /* key is still pressed */
553
554                                 sc->sc_ntime[i] = sc->sc_otime[j];
555                                 dtime = (sc->sc_otime[j] - now);
556
557                                 if (!(dtime & 0x80000000)) {
558                                         /* time has not elapsed */
559                                         goto pfound;
560                                 }
561                                 sc->sc_ntime[i] = now + sc->sc_kbd.kb_delay2;
562                                 break;
563                         }
564                 }
565                 ukbd_put_key(sc, key | KEY_PRESS);
566
567                 /*
568                  * If any other key is presently down, force its repeat to be
569                  * well in the future (100s).  This makes the last key to be
570                  * pressed do the autorepeat.
571                  */
572                 for (j = 0; j != UKBD_NKEYCODE; j++) {
573                         if (j != i)
574                                 sc->sc_ntime[j] = now + (100 * 1000);
575                 }
576 pfound: ;
577         }
578
579         sc->sc_odata = sc->sc_ndata;
580
581         memcpy(sc->sc_otime, sc->sc_ntime, sizeof(sc->sc_otime));
582
583         ukbd_event_keyinput(sc);
584 }
585
586 static void
587 ukbd_event_keyinput(struct ukbd_softc *sc)
588 {
589         int c;
590
591         UKBD_CTX_LOCK_ASSERT();
592
593         if ((sc->sc_flags & UKBD_FLAG_POLLING) != 0)
594                 return;
595
596         if (sc->sc_inputs == 0)
597                 return;
598
599         if (KBD_IS_ACTIVE(&sc->sc_kbd) &&
600             KBD_IS_BUSY(&sc->sc_kbd)) {
601                 /* let the callback function process the input */
602                 (sc->sc_kbd.kb_callback.kc_func) (&sc->sc_kbd, KBDIO_KEYINPUT,
603                     sc->sc_kbd.kb_callback.kc_arg);
604         } else {
605                 /* read and discard the input, no one is waiting for it */
606                 do {
607                         c = ukbd_read_char(&sc->sc_kbd, 0);
608                 } while (c != NOKEY);
609         }
610 }
611
612 static void
613 ukbd_timeout(void *arg)
614 {
615         struct ukbd_softc *sc = arg;
616
617         UKBD_LOCK_ASSERT();
618
619         sc->sc_time_ms += 25;   /* milliseconds */
620
621         ukbd_interrupt(sc);
622
623         /* Make sure any leftover key events gets read out */
624         ukbd_event_keyinput(sc);
625
626         if (ukbd_any_key_pressed(sc) || (sc->sc_inputs != 0)) {
627                 ukbd_start_timer(sc);
628         } else {
629                 sc->sc_flags &= ~UKBD_FLAG_TIMER_RUNNING;
630         }
631 }
632
633 static uint8_t
634 ukbd_apple_fn(uint8_t keycode) {
635         switch (keycode) {
636         case 0x28: return 0x49; /* RETURN -> INSERT */
637         case 0x2a: return 0x4c; /* BACKSPACE -> DEL */
638         case 0x50: return 0x4a; /* LEFT ARROW -> HOME */
639         case 0x4f: return 0x4d; /* RIGHT ARROW -> END */
640         case 0x52: return 0x4b; /* UP ARROW -> PGUP */
641         case 0x51: return 0x4e; /* DOWN ARROW -> PGDN */
642         default: return keycode;
643         }
644 }
645
646 static uint8_t
647 ukbd_apple_swap(uint8_t keycode) {
648         switch (keycode) {
649         case 0x35: return 0x64;
650         case 0x64: return 0x35;
651         default: return keycode;
652         }
653 }
654
655 static void
656 ukbd_intr_callback(struct usb_xfer *xfer, usb_error_t error)
657 {
658         struct ukbd_softc *sc = usbd_xfer_softc(xfer);
659         struct usb_page_cache *pc;
660         uint8_t i;
661         uint8_t offset;
662         uint8_t id;
663         int len;
664
665         UKBD_LOCK_ASSERT();
666
667         usbd_xfer_status(xfer, &len, NULL, NULL, NULL);
668         pc = usbd_xfer_get_frame(xfer, 0);
669
670         switch (USB_GET_STATE(xfer)) {
671         case USB_ST_TRANSFERRED:
672                 DPRINTF("actlen=%d bytes\n", len);
673
674                 if (len == 0) {
675                         DPRINTF("zero length data\n");
676                         goto tr_setup;
677                 }
678
679                 if (sc->sc_kbd_id != 0) {
680                         /* check and remove HID ID byte */
681                         usbd_copy_out(pc, 0, &id, 1);
682                         offset = 1;
683                         len--;
684                         if (len == 0) {
685                                 DPRINTF("zero length data\n");
686                                 goto tr_setup;
687                         }
688                 } else {
689                         offset = 0;
690                         id = 0;
691                 }
692
693                 if (len > UKBD_BUFFER_SIZE)
694                         len = UKBD_BUFFER_SIZE;
695
696                 /* get data */
697                 usbd_copy_out(pc, offset, sc->sc_buffer, len);
698
699                 /* clear temporary storage */
700                 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
701
702                 /* scan through HID data */
703                 if ((sc->sc_flags & UKBD_FLAG_APPLE_EJECT) &&
704                     (id == sc->sc_id_apple_eject)) {
705                         if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_eject))
706                                 sc->sc_modifiers |= MOD_EJECT;
707                         else
708                                 sc->sc_modifiers &= ~MOD_EJECT;
709                 }
710                 if ((sc->sc_flags & UKBD_FLAG_APPLE_FN) &&
711                     (id == sc->sc_id_apple_fn)) {
712                         if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_fn))
713                                 sc->sc_modifiers |= MOD_FN;
714                         else
715                                 sc->sc_modifiers &= ~MOD_FN;
716                 }
717                 if ((sc->sc_flags & UKBD_FLAG_CTRL_L) &&
718                     (id == sc->sc_id_ctrl_l)) {
719                         if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_ctrl_l))
720                           sc->  sc_modifiers |= MOD_CONTROL_L;
721                         else
722                           sc->  sc_modifiers &= ~MOD_CONTROL_L;
723                 }
724                 if ((sc->sc_flags & UKBD_FLAG_CTRL_R) &&
725                     (id == sc->sc_id_ctrl_r)) {
726                         if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_ctrl_r))
727                                 sc->sc_modifiers |= MOD_CONTROL_R;
728                         else
729                                 sc->sc_modifiers &= ~MOD_CONTROL_R;
730                 }
731                 if ((sc->sc_flags & UKBD_FLAG_SHIFT_L) &&
732                     (id == sc->sc_id_shift_l)) {
733                         if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_shift_l))
734                                 sc->sc_modifiers |= MOD_SHIFT_L;
735                         else
736                                 sc->sc_modifiers &= ~MOD_SHIFT_L;
737                 }
738                 if ((sc->sc_flags & UKBD_FLAG_SHIFT_R) &&
739                     (id == sc->sc_id_shift_r)) {
740                         if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_shift_r))
741                                 sc->sc_modifiers |= MOD_SHIFT_R;
742                         else
743                                 sc->sc_modifiers &= ~MOD_SHIFT_R;
744                 }
745                 if ((sc->sc_flags & UKBD_FLAG_ALT_L) &&
746                     (id == sc->sc_id_alt_l)) {
747                         if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_alt_l))
748                                 sc->sc_modifiers |= MOD_ALT_L;
749                         else
750                                 sc->sc_modifiers &= ~MOD_ALT_L;
751                 }
752                 if ((sc->sc_flags & UKBD_FLAG_ALT_R) &&
753                     (id == sc->sc_id_alt_r)) {
754                         if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_alt_r))
755                                 sc->sc_modifiers |= MOD_ALT_R;
756                         else
757                                 sc->sc_modifiers &= ~MOD_ALT_R;
758                 }
759                 if ((sc->sc_flags & UKBD_FLAG_WIN_L) &&
760                     (id == sc->sc_id_win_l)) {
761                         if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_win_l))
762                                 sc->sc_modifiers |= MOD_WIN_L;
763                         else
764                                 sc->sc_modifiers &= ~MOD_WIN_L;
765                 }
766                 if ((sc->sc_flags & UKBD_FLAG_WIN_R) &&
767                     (id == sc->sc_id_win_r)) {
768                         if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_win_r))
769                                 sc->sc_modifiers |= MOD_WIN_R;
770                         else
771                                 sc->sc_modifiers &= ~MOD_WIN_R;
772                 }
773
774                 sc->sc_ndata.modifiers = sc->sc_modifiers;
775
776                 if ((sc->sc_flags & UKBD_FLAG_EVENTS) &&
777                     (id == sc->sc_id_events)) {
778                         i = sc->sc_loc_events.count;
779                         if (i > UKBD_NKEYCODE)
780                                 i = UKBD_NKEYCODE;
781                         if (i > len)
782                                 i = len;
783                         while (i--) {
784                                 sc->sc_ndata.keycode[i] =
785                                     hid_get_data(sc->sc_buffer + i, len - i,
786                                     &sc->sc_loc_events);
787                         }
788                 }
789
790 #ifdef USB_DEBUG
791                 DPRINTF("modifiers = 0x%04x\n", (int)sc->sc_modifiers);
792                 for (i = 0; i < UKBD_NKEYCODE; i++) {
793                         if (sc->sc_ndata.keycode[i]) {
794                                 DPRINTF("[%d] = 0x%02x\n",
795                                     (int)i, (int)sc->sc_ndata.keycode[i]);
796                         }
797                 }
798 #endif
799                 if (sc->sc_modifiers & MOD_FN) {
800                         for (i = 0; i < UKBD_NKEYCODE; i++) {
801                                 sc->sc_ndata.keycode[i] = 
802                                     ukbd_apple_fn(sc->sc_ndata.keycode[i]);
803                         }
804                 }
805
806                 if (sc->sc_flags & UKBD_FLAG_APPLE_SWAP) {
807                         for (i = 0; i < UKBD_NKEYCODE; i++) {
808                                 sc->sc_ndata.keycode[i] = 
809                                     ukbd_apple_swap(sc->sc_ndata.keycode[i]);
810                         }
811                 }
812
813                 ukbd_interrupt(sc);
814
815                 if (!(sc->sc_flags & UKBD_FLAG_TIMER_RUNNING)) {
816                         if (ukbd_any_key_pressed(sc)) {
817                                 ukbd_start_timer(sc);
818                         }
819                 }
820
821         case USB_ST_SETUP:
822 tr_setup:
823                 if (sc->sc_inputs < UKBD_IN_BUF_FULL) {
824                         usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
825                         usbd_transfer_submit(xfer);
826                 } else {
827                         DPRINTF("input queue is full!\n");
828                 }
829                 break;
830
831         default:                        /* Error */
832                 DPRINTF("error=%s\n", usbd_errstr(error));
833
834                 if (error != USB_ERR_CANCELLED) {
835                         /* try to clear stall first */
836                         usbd_xfer_set_stall(xfer);
837                         goto tr_setup;
838                 }
839                 break;
840         }
841 }
842
843 static void
844 ukbd_set_leds_callback(struct usb_xfer *xfer, usb_error_t error)
845 {
846         struct ukbd_softc *sc = usbd_xfer_softc(xfer);
847         struct usb_device_request req;
848         struct usb_page_cache *pc;
849         uint8_t id;
850         uint8_t any;
851         int len;
852
853         UKBD_LOCK_ASSERT();
854
855 #ifdef USB_DEBUG
856         if (ukbd_no_leds)
857                 return;
858 #endif
859
860         switch (USB_GET_STATE(xfer)) {
861         case USB_ST_TRANSFERRED:
862         case USB_ST_SETUP:
863                 if (!(sc->sc_flags & UKBD_FLAG_SET_LEDS))
864                         break;
865                 sc->sc_flags &= ~UKBD_FLAG_SET_LEDS;
866
867                 req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
868                 req.bRequest = UR_SET_REPORT;
869                 USETW2(req.wValue, UHID_OUTPUT_REPORT, 0);
870                 req.wIndex[0] = sc->sc_iface_no;
871                 req.wIndex[1] = 0;
872                 req.wLength[1] = 0;
873
874                 memset(sc->sc_buffer, 0, UKBD_BUFFER_SIZE);
875
876                 id = 0;
877                 any = 0;
878
879                 /* Assumption: All led bits must be in the same ID. */
880
881                 if (sc->sc_flags & UKBD_FLAG_NUMLOCK) {
882                         if (sc->sc_leds & NLKED) {
883                                 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
884                                     &sc->sc_loc_numlock, 1);
885                         }
886                         id = sc->sc_id_numlock;
887                         any = 1;
888                 }
889
890                 if (sc->sc_flags & UKBD_FLAG_SCROLLLOCK) {
891                         if (sc->sc_leds & SLKED) {
892                                 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
893                                     &sc->sc_loc_scrolllock, 1);
894                         }
895                         id = sc->sc_id_scrolllock;
896                         any = 1;
897                 }
898
899                 if (sc->sc_flags & UKBD_FLAG_CAPSLOCK) {
900                         if (sc->sc_leds & CLKED) {
901                                 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
902                                     &sc->sc_loc_capslock, 1);
903                         }
904                         id = sc->sc_id_capslock;
905                         any = 1;
906                 }
907
908                 /* if no leds, nothing to do */
909                 if (!any)
910                         break;
911
912                 /* range check output report length */
913                 len = sc->sc_led_size;
914                 if (len > (UKBD_BUFFER_SIZE - 1))
915                         len = (UKBD_BUFFER_SIZE - 1);
916
917                 /* check if we need to prefix an ID byte */
918                 sc->sc_buffer[0] = id;
919
920                 pc = usbd_xfer_get_frame(xfer, 1);
921                 if (id != 0) {
922                         len++;
923                         usbd_copy_in(pc, 0, sc->sc_buffer, len);
924                 } else {
925                         usbd_copy_in(pc, 0, sc->sc_buffer + 1, len);
926                 }
927                 req.wLength[0] = len;
928                 usbd_xfer_set_frame_len(xfer, 1, len);
929
930                 DPRINTF("len=%d, id=%d\n", len, id);
931
932                 /* setup control request last */
933                 pc = usbd_xfer_get_frame(xfer, 0);
934                 usbd_copy_in(pc, 0, &req, sizeof(req));
935                 usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
936
937                 /* start data transfer */
938                 usbd_xfer_set_frames(xfer, 2);
939                 usbd_transfer_submit(xfer);
940                 break;
941
942         default:                        /* Error */
943                 DPRINTFN(1, "error=%s\n", usbd_errstr(error));
944                 break;
945         }
946 }
947
948 static const struct usb_config ukbd_config[UKBD_N_TRANSFER] = {
949
950         [UKBD_INTR_DT] = {
951                 .type = UE_INTERRUPT,
952                 .endpoint = UE_ADDR_ANY,
953                 .direction = UE_DIR_IN,
954                 .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
955                 .bufsize = 0,   /* use wMaxPacketSize */
956                 .callback = &ukbd_intr_callback,
957         },
958
959         [UKBD_CTRL_LED] = {
960                 .type = UE_CONTROL,
961                 .endpoint = 0x00,       /* Control pipe */
962                 .direction = UE_DIR_ANY,
963                 .bufsize = sizeof(struct usb_device_request) + UKBD_BUFFER_SIZE,
964                 .callback = &ukbd_set_leds_callback,
965                 .timeout = 1000,        /* 1 second */
966         },
967 };
968
969 /* A match on these entries will load ukbd */
970 static const STRUCT_USB_HOST_ID __used ukbd_devs[] = {
971         {USB_IFACE_CLASS(UICLASS_HID),
972          USB_IFACE_SUBCLASS(UISUBCLASS_BOOT),
973          USB_IFACE_PROTOCOL(UIPROTO_BOOT_KEYBOARD),},
974 };
975
976 static int
977 ukbd_probe(device_t dev)
978 {
979         keyboard_switch_t *sw = kbd_get_switch(UKBD_DRIVER_NAME);
980         struct usb_attach_arg *uaa = device_get_ivars(dev);
981         void *d_ptr;
982         int error;
983         uint16_t d_len;
984
985         UKBD_LOCK_ASSERT();
986         DPRINTFN(11, "\n");
987
988         if (sw == NULL) {
989                 return (ENXIO);
990         }
991         if (uaa->usb_mode != USB_MODE_HOST) {
992                 return (ENXIO);
993         }
994
995         if (uaa->info.bInterfaceClass != UICLASS_HID)
996                 return (ENXIO);
997
998         if ((uaa->info.bInterfaceSubClass == UISUBCLASS_BOOT) &&
999             (uaa->info.bInterfaceProtocol == UIPROTO_BOOT_KEYBOARD)) {
1000                 if (usb_test_quirk(uaa, UQ_KBD_IGNORE))
1001                         return (ENXIO);
1002                 else
1003                         return (BUS_PROBE_DEFAULT);
1004         }
1005
1006         error = usbd_req_get_hid_desc(uaa->device, NULL,
1007             &d_ptr, &d_len, M_TEMP, uaa->info.bIfaceIndex);
1008
1009         if (error)
1010                 return (ENXIO);
1011
1012         /*
1013          * NOTE: we currently don't support USB mouse and USB keyboard
1014          * on the same USB endpoint.
1015          */
1016         if (hid_is_collection(d_ptr, d_len,
1017             HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_MOUSE))) {
1018                 /* most likely a mouse */
1019                 error = ENXIO;
1020         } else if (hid_is_collection(d_ptr, d_len,
1021             HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_KEYBOARD))) {
1022                 if (usb_test_quirk(uaa, UQ_KBD_IGNORE))
1023                         error = ENXIO;
1024                 else
1025                         error = BUS_PROBE_DEFAULT;
1026         } else
1027                 error = ENXIO;
1028
1029         free(d_ptr, M_TEMP);
1030         return (error);
1031 }
1032
1033 static void
1034 ukbd_parse_hid(struct ukbd_softc *sc, const uint8_t *ptr, uint32_t len)
1035 {
1036         uint32_t flags;
1037
1038         /* reset detected bits */
1039         sc->sc_flags &= ~UKBD_FLAG_HID_MASK;
1040
1041         /* check if there is an ID byte */
1042         sc->sc_kbd_size = hid_report_size(ptr, len,
1043             hid_input, &sc->sc_kbd_id);
1044
1045         /* investigate if this is an Apple Keyboard */
1046         if (hid_locate(ptr, len,
1047             HID_USAGE2(HUP_CONSUMER, HUG_APPLE_EJECT),
1048             hid_input, 0, &sc->sc_loc_apple_eject, &flags,
1049             &sc->sc_id_apple_eject)) {
1050                 if (flags & HIO_VARIABLE)
1051                         sc->sc_flags |= UKBD_FLAG_APPLE_EJECT | 
1052                             UKBD_FLAG_APPLE_SWAP;
1053                 DPRINTFN(1, "Found Apple eject-key\n");
1054         }
1055         if (hid_locate(ptr, len,
1056             HID_USAGE2(0xFFFF, 0x0003),
1057             hid_input, 0, &sc->sc_loc_apple_fn, &flags,
1058             &sc->sc_id_apple_fn)) {
1059                 if (flags & HIO_VARIABLE)
1060                         sc->sc_flags |= UKBD_FLAG_APPLE_FN;
1061                 DPRINTFN(1, "Found Apple FN-key\n");
1062         }
1063         /* figure out some keys */
1064         if (hid_locate(ptr, len,
1065             HID_USAGE2(HUP_KEYBOARD, 0xE0),
1066             hid_input, 0, &sc->sc_loc_ctrl_l, &flags,
1067             &sc->sc_id_ctrl_l)) {
1068                 if (flags & HIO_VARIABLE)
1069                         sc->sc_flags |= UKBD_FLAG_CTRL_L;
1070                 DPRINTFN(1, "Found left control\n");
1071         }
1072         if (hid_locate(ptr, len,
1073             HID_USAGE2(HUP_KEYBOARD, 0xE4),
1074             hid_input, 0, &sc->sc_loc_ctrl_r, &flags,
1075             &sc->sc_id_ctrl_r)) {
1076                 if (flags & HIO_VARIABLE)
1077                         sc->sc_flags |= UKBD_FLAG_CTRL_R;
1078                 DPRINTFN(1, "Found right control\n");
1079         }
1080         if (hid_locate(ptr, len,
1081             HID_USAGE2(HUP_KEYBOARD, 0xE1),
1082             hid_input, 0, &sc->sc_loc_shift_l, &flags,
1083             &sc->sc_id_shift_l)) {
1084                 if (flags & HIO_VARIABLE)
1085                         sc->sc_flags |= UKBD_FLAG_SHIFT_L;
1086                 DPRINTFN(1, "Found left shift\n");
1087         }
1088         if (hid_locate(ptr, len,
1089             HID_USAGE2(HUP_KEYBOARD, 0xE5),
1090             hid_input, 0, &sc->sc_loc_shift_r, &flags,
1091             &sc->sc_id_shift_r)) {
1092                 if (flags & HIO_VARIABLE)
1093                         sc->sc_flags |= UKBD_FLAG_SHIFT_R;
1094                 DPRINTFN(1, "Found right shift\n");
1095         }
1096         if (hid_locate(ptr, len,
1097             HID_USAGE2(HUP_KEYBOARD, 0xE2),
1098             hid_input, 0, &sc->sc_loc_alt_l, &flags,
1099             &sc->sc_id_alt_l)) {
1100                 if (flags & HIO_VARIABLE)
1101                         sc->sc_flags |= UKBD_FLAG_ALT_L;
1102                 DPRINTFN(1, "Found left alt\n");
1103         }
1104         if (hid_locate(ptr, len,
1105             HID_USAGE2(HUP_KEYBOARD, 0xE6),
1106             hid_input, 0, &sc->sc_loc_alt_r, &flags,
1107             &sc->sc_id_alt_r)) {
1108                 if (flags & HIO_VARIABLE)
1109                         sc->sc_flags |= UKBD_FLAG_ALT_R;
1110                 DPRINTFN(1, "Found right alt\n");
1111         }
1112         if (hid_locate(ptr, len,
1113             HID_USAGE2(HUP_KEYBOARD, 0xE3),
1114             hid_input, 0, &sc->sc_loc_win_l, &flags,
1115             &sc->sc_id_win_l)) {
1116                 if (flags & HIO_VARIABLE)
1117                         sc->sc_flags |= UKBD_FLAG_WIN_L;
1118                 DPRINTFN(1, "Found left GUI\n");
1119         }
1120         if (hid_locate(ptr, len,
1121             HID_USAGE2(HUP_KEYBOARD, 0xE7),
1122             hid_input, 0, &sc->sc_loc_win_r, &flags,
1123             &sc->sc_id_win_r)) {
1124                 if (flags & HIO_VARIABLE)
1125                         sc->sc_flags |= UKBD_FLAG_WIN_R;
1126                 DPRINTFN(1, "Found right GUI\n");
1127         }
1128         /* figure out event buffer */
1129         if (hid_locate(ptr, len,
1130             HID_USAGE2(HUP_KEYBOARD, 0x00),
1131             hid_input, 0, &sc->sc_loc_events, &flags,
1132             &sc->sc_id_events)) {
1133                 sc->sc_flags |= UKBD_FLAG_EVENTS;
1134                 DPRINTFN(1, "Found keyboard events\n");
1135         }
1136
1137         /* figure out leds on keyboard */
1138         sc->sc_led_size = hid_report_size(ptr, len,
1139             hid_output, NULL);
1140
1141         if (hid_locate(ptr, len,
1142             HID_USAGE2(HUP_LEDS, 0x01),
1143             hid_output, 0, &sc->sc_loc_numlock, &flags,
1144             &sc->sc_id_numlock)) {
1145                 if (flags & HIO_VARIABLE)
1146                         sc->sc_flags |= UKBD_FLAG_NUMLOCK;
1147                 DPRINTFN(1, "Found keyboard numlock\n");
1148         }
1149         if (hid_locate(ptr, len,
1150             HID_USAGE2(HUP_LEDS, 0x02),
1151             hid_output, 0, &sc->sc_loc_capslock, &flags,
1152             &sc->sc_id_capslock)) {
1153                 if (flags & HIO_VARIABLE)
1154                         sc->sc_flags |= UKBD_FLAG_CAPSLOCK;
1155                 DPRINTFN(1, "Found keyboard capslock\n");
1156         }
1157         if (hid_locate(ptr, len,
1158             HID_USAGE2(HUP_LEDS, 0x03),
1159             hid_output, 0, &sc->sc_loc_scrolllock, &flags,
1160             &sc->sc_id_scrolllock)) {
1161                 if (flags & HIO_VARIABLE)
1162                         sc->sc_flags |= UKBD_FLAG_SCROLLLOCK;
1163                 DPRINTFN(1, "Found keyboard scrolllock\n");
1164         }
1165 }
1166
1167 static int
1168 ukbd_attach(device_t dev)
1169 {
1170         struct ukbd_softc *sc = device_get_softc(dev);
1171         struct usb_attach_arg *uaa = device_get_ivars(dev);
1172         int32_t unit = device_get_unit(dev);
1173         keyboard_t *kbd = &sc->sc_kbd;
1174         void *hid_ptr = NULL;
1175         usb_error_t err;
1176         uint16_t n;
1177         uint16_t hid_len;
1178
1179         UKBD_LOCK_ASSERT();
1180
1181         kbd_init_struct(kbd, UKBD_DRIVER_NAME, KB_OTHER, unit, 0, 0, 0);
1182
1183         kbd->kb_data = (void *)sc;
1184
1185         device_set_usb_desc(dev);
1186
1187         sc->sc_udev = uaa->device;
1188         sc->sc_iface = uaa->iface;
1189         sc->sc_iface_index = uaa->info.bIfaceIndex;
1190         sc->sc_iface_no = uaa->info.bIfaceNum;
1191         sc->sc_mode = K_XLATE;
1192
1193         usb_callout_init_mtx(&sc->sc_callout, &Giant, 0);
1194
1195         err = usbd_transfer_setup(uaa->device,
1196             &uaa->info.bIfaceIndex, sc->sc_xfer, ukbd_config,
1197             UKBD_N_TRANSFER, sc, &Giant);
1198
1199         if (err) {
1200                 DPRINTF("error=%s\n", usbd_errstr(err));
1201                 goto detach;
1202         }
1203         /* setup default keyboard maps */
1204
1205         sc->sc_keymap = key_map;
1206         sc->sc_accmap = accent_map;
1207         for (n = 0; n < UKBD_NFKEY; n++) {
1208                 sc->sc_fkeymap[n] = fkey_tab[n];
1209         }
1210
1211         kbd_set_maps(kbd, &sc->sc_keymap, &sc->sc_accmap,
1212             sc->sc_fkeymap, UKBD_NFKEY);
1213
1214         KBD_FOUND_DEVICE(kbd);
1215
1216         ukbd_clear_state(kbd);
1217
1218         /*
1219          * FIXME: set the initial value for lock keys in "sc_state"
1220          * according to the BIOS data?
1221          */
1222         KBD_PROBE_DONE(kbd);
1223
1224         /* get HID descriptor */
1225         err = usbd_req_get_hid_desc(uaa->device, NULL, &hid_ptr,
1226             &hid_len, M_TEMP, uaa->info.bIfaceIndex);
1227
1228         if (err == 0) {
1229                 DPRINTF("Parsing HID descriptor of %d bytes\n",
1230                     (int)hid_len);
1231
1232                 ukbd_parse_hid(sc, hid_ptr, hid_len);
1233
1234                 free(hid_ptr, M_TEMP);
1235         }
1236
1237         /* check if we should use the boot protocol */
1238         if (usb_test_quirk(uaa, UQ_KBD_BOOTPROTO) ||
1239             (err != 0) || (!(sc->sc_flags & UKBD_FLAG_EVENTS))) {
1240
1241                 DPRINTF("Forcing boot protocol\n");
1242
1243                 err = usbd_req_set_protocol(sc->sc_udev, NULL, 
1244                         sc->sc_iface_index, 0);
1245
1246                 if (err != 0) {
1247                         DPRINTF("Set protocol error=%s (ignored)\n",
1248                             usbd_errstr(err));
1249                 }
1250
1251                 ukbd_parse_hid(sc, ukbd_boot_desc, sizeof(ukbd_boot_desc));
1252         }
1253
1254         /* ignore if SETIDLE fails, hence it is not crucial */
1255         usbd_req_set_idle(sc->sc_udev, NULL, sc->sc_iface_index, 0, 0);
1256
1257         ukbd_ioctl(kbd, KDSETLED, (caddr_t)&sc->sc_state);
1258
1259         KBD_INIT_DONE(kbd);
1260
1261         if (kbd_register(kbd) < 0) {
1262                 goto detach;
1263         }
1264         KBD_CONFIG_DONE(kbd);
1265
1266         ukbd_enable(kbd);
1267
1268 #ifdef KBD_INSTALL_CDEV
1269         if (kbd_attach(kbd)) {
1270                 goto detach;
1271         }
1272 #endif
1273         sc->sc_flags |= UKBD_FLAG_ATTACHED;
1274
1275         if (bootverbose) {
1276                 genkbd_diag(kbd, bootverbose);
1277         }
1278
1279         /* start the keyboard */
1280         usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT]);
1281
1282         return (0);                     /* success */
1283
1284 detach:
1285         ukbd_detach(dev);
1286         return (ENXIO);                 /* error */
1287 }
1288
1289 static int
1290 ukbd_detach(device_t dev)
1291 {
1292         struct ukbd_softc *sc = device_get_softc(dev);
1293         int error;
1294
1295         UKBD_LOCK_ASSERT();
1296
1297         DPRINTF("\n");
1298
1299         sc->sc_flags |= UKBD_FLAG_GONE;
1300
1301         usb_callout_stop(&sc->sc_callout);
1302
1303         ukbd_disable(&sc->sc_kbd);
1304
1305 #ifdef KBD_INSTALL_CDEV
1306         if (sc->sc_flags & UKBD_FLAG_ATTACHED) {
1307                 error = kbd_detach(&sc->sc_kbd);
1308                 if (error) {
1309                         /* usb attach cannot return an error */
1310                         device_printf(dev, "WARNING: kbd_detach() "
1311                             "returned non-zero! (ignored)\n");
1312                 }
1313         }
1314 #endif
1315         if (KBD_IS_CONFIGURED(&sc->sc_kbd)) {
1316                 error = kbd_unregister(&sc->sc_kbd);
1317                 if (error) {
1318                         /* usb attach cannot return an error */
1319                         device_printf(dev, "WARNING: kbd_unregister() "
1320                             "returned non-zero! (ignored)\n");
1321                 }
1322         }
1323         sc->sc_kbd.kb_flags = 0;
1324
1325         usbd_transfer_unsetup(sc->sc_xfer, UKBD_N_TRANSFER);
1326
1327         usb_callout_drain(&sc->sc_callout);
1328
1329         DPRINTF("%s: disconnected\n",
1330             device_get_nameunit(dev));
1331
1332         return (0);
1333 }
1334
1335 static int
1336 ukbd_resume(device_t dev)
1337 {
1338         struct ukbd_softc *sc = device_get_softc(dev);
1339
1340         UKBD_LOCK_ASSERT();
1341
1342         ukbd_clear_state(&sc->sc_kbd);
1343
1344         return (0);
1345 }
1346
1347 /* early keyboard probe, not supported */
1348 static int
1349 ukbd_configure(int flags)
1350 {
1351         return (0);
1352 }
1353
1354 /* detect a keyboard, not used */
1355 static int
1356 ukbd__probe(int unit, void *arg, int flags)
1357 {
1358         return (ENXIO);
1359 }
1360
1361 /* reset and initialize the device, not used */
1362 static int
1363 ukbd_init(int unit, keyboard_t **kbdp, void *arg, int flags)
1364 {
1365         return (ENXIO);
1366 }
1367
1368 /* test the interface to the device, not used */
1369 static int
1370 ukbd_test_if(keyboard_t *kbd)
1371 {
1372         return (0);
1373 }
1374
1375 /* finish using this keyboard, not used */
1376 static int
1377 ukbd_term(keyboard_t *kbd)
1378 {
1379         return (ENXIO);
1380 }
1381
1382 /* keyboard interrupt routine, not used */
1383 static int
1384 ukbd_intr(keyboard_t *kbd, void *arg)
1385 {
1386         return (0);
1387 }
1388
1389 /* lock the access to the keyboard, not used */
1390 static int
1391 ukbd_lock(keyboard_t *kbd, int lock)
1392 {
1393         return (1);
1394 }
1395
1396 /*
1397  * Enable the access to the device; until this function is called,
1398  * the client cannot read from the keyboard.
1399  */
1400 static int
1401 ukbd_enable(keyboard_t *kbd)
1402 {
1403
1404         UKBD_LOCK();
1405         KBD_ACTIVATE(kbd);
1406         UKBD_UNLOCK();
1407
1408         return (0);
1409 }
1410
1411 /* disallow the access to the device */
1412 static int
1413 ukbd_disable(keyboard_t *kbd)
1414 {
1415
1416         UKBD_LOCK();
1417         KBD_DEACTIVATE(kbd);
1418         UKBD_UNLOCK();
1419
1420         return (0);
1421 }
1422
1423 /* check if data is waiting */
1424 /* Currently unused. */
1425 static int
1426 ukbd_check(keyboard_t *kbd)
1427 {
1428         struct ukbd_softc *sc = kbd->kb_data;
1429
1430         UKBD_CTX_LOCK_ASSERT();
1431
1432         if (!KBD_IS_ACTIVE(kbd))
1433                 return (0);
1434
1435         if (sc->sc_flags & UKBD_FLAG_POLLING)
1436                 ukbd_do_poll(sc, 0);
1437
1438 #ifdef UKBD_EMULATE_ATSCANCODE
1439         if (sc->sc_buffered_char[0]) {
1440                 return (1);
1441         }
1442 #endif
1443         if (sc->sc_inputs > 0) {
1444                 return (1);
1445         }
1446         return (0);
1447 }
1448
1449 /* check if char is waiting */
1450 static int
1451 ukbd_check_char_locked(keyboard_t *kbd)
1452 {
1453         struct ukbd_softc *sc = kbd->kb_data;
1454
1455         UKBD_CTX_LOCK_ASSERT();
1456
1457         if (!KBD_IS_ACTIVE(kbd))
1458                 return (0);
1459
1460         if ((sc->sc_composed_char > 0) &&
1461             (!(sc->sc_flags & UKBD_FLAG_COMPOSE))) {
1462                 return (1);
1463         }
1464         return (ukbd_check(kbd));
1465 }
1466
1467 static int
1468 ukbd_check_char(keyboard_t *kbd)
1469 {
1470         int result;
1471
1472         UKBD_LOCK();
1473         result = ukbd_check_char_locked(kbd);
1474         UKBD_UNLOCK();
1475
1476         return (result);
1477 }
1478
1479 /* read one byte from the keyboard if it's allowed */
1480 /* Currently unused. */
1481 static int
1482 ukbd_read(keyboard_t *kbd, int wait)
1483 {
1484         struct ukbd_softc *sc = kbd->kb_data;
1485         int32_t usbcode;
1486 #ifdef UKBD_EMULATE_ATSCANCODE
1487         uint32_t keycode;
1488         uint32_t scancode;
1489
1490 #endif
1491
1492         UKBD_CTX_LOCK_ASSERT();
1493
1494         if (!KBD_IS_ACTIVE(kbd))
1495                 return (-1);
1496
1497 #ifdef UKBD_EMULATE_ATSCANCODE
1498         if (sc->sc_buffered_char[0]) {
1499                 scancode = sc->sc_buffered_char[0];
1500                 if (scancode & SCAN_PREFIX) {
1501                         sc->sc_buffered_char[0] &= ~SCAN_PREFIX;
1502                         return ((scancode & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
1503                 }
1504                 sc->sc_buffered_char[0] = sc->sc_buffered_char[1];
1505                 sc->sc_buffered_char[1] = 0;
1506                 return (scancode);
1507         }
1508 #endif                                  /* UKBD_EMULATE_ATSCANCODE */
1509
1510         /* XXX */
1511         usbcode = ukbd_get_key(sc, (wait == FALSE) ? 0 : 1);
1512         if (!KBD_IS_ACTIVE(kbd) || (usbcode == -1))
1513                 return (-1);
1514
1515         ++(kbd->kb_count);
1516
1517 #ifdef UKBD_EMULATE_ATSCANCODE
1518         keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1519         if (keycode == NN) {
1520                 return -1;
1521         }
1522         return (ukbd_key2scan(sc, keycode, sc->sc_ndata.modifiers,
1523             (usbcode & KEY_RELEASE)));
1524 #else                                   /* !UKBD_EMULATE_ATSCANCODE */
1525         return (usbcode);
1526 #endif                                  /* UKBD_EMULATE_ATSCANCODE */
1527 }
1528
1529 /* read char from the keyboard */
1530 static uint32_t
1531 ukbd_read_char_locked(keyboard_t *kbd, int wait)
1532 {
1533         struct ukbd_softc *sc = kbd->kb_data;
1534         uint32_t action;
1535         uint32_t keycode;
1536         int32_t usbcode;
1537 #ifdef UKBD_EMULATE_ATSCANCODE
1538         uint32_t scancode;
1539 #endif
1540
1541         UKBD_CTX_LOCK_ASSERT();
1542
1543         if (!KBD_IS_ACTIVE(kbd))
1544                 return (NOKEY);
1545
1546 next_code:
1547
1548         /* do we have a composed char to return ? */
1549
1550         if ((sc->sc_composed_char > 0) &&
1551             (!(sc->sc_flags & UKBD_FLAG_COMPOSE))) {
1552
1553                 action = sc->sc_composed_char;
1554                 sc->sc_composed_char = 0;
1555
1556                 if (action > 0xFF) {
1557                         goto errkey;
1558                 }
1559                 goto done;
1560         }
1561 #ifdef UKBD_EMULATE_ATSCANCODE
1562
1563         /* do we have a pending raw scan code? */
1564
1565         if (sc->sc_mode == K_RAW) {
1566                 scancode = sc->sc_buffered_char[0];
1567                 if (scancode) {
1568                         if (scancode & SCAN_PREFIX) {
1569                                 sc->sc_buffered_char[0] = (scancode & ~SCAN_PREFIX);
1570                                 return ((scancode & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
1571                         }
1572                         sc->sc_buffered_char[0] = sc->sc_buffered_char[1];
1573                         sc->sc_buffered_char[1] = 0;
1574                         return (scancode);
1575                 }
1576         }
1577 #endif                                  /* UKBD_EMULATE_ATSCANCODE */
1578
1579         /* see if there is something in the keyboard port */
1580         /* XXX */
1581         usbcode = ukbd_get_key(sc, (wait == FALSE) ? 0 : 1);
1582         if (usbcode == -1) {
1583                 return (NOKEY);
1584         }
1585         ++kbd->kb_count;
1586
1587 #ifdef UKBD_EMULATE_ATSCANCODE
1588         /* USB key index -> key code -> AT scan code */
1589         keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1590         if (keycode == NN) {
1591                 return (NOKEY);
1592         }
1593         /* return an AT scan code for the K_RAW mode */
1594         if (sc->sc_mode == K_RAW) {
1595                 return (ukbd_key2scan(sc, keycode, sc->sc_ndata.modifiers,
1596                     (usbcode & KEY_RELEASE)));
1597         }
1598 #else                                   /* !UKBD_EMULATE_ATSCANCODE */
1599
1600         /* return the byte as is for the K_RAW mode */
1601         if (sc->sc_mode == K_RAW) {
1602                 return (usbcode);
1603         }
1604         /* USB key index -> key code */
1605         keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1606         if (keycode == NN) {
1607                 return (NOKEY);
1608         }
1609 #endif                                  /* UKBD_EMULATE_ATSCANCODE */
1610
1611         switch (keycode) {
1612         case 0x38:                      /* left alt (compose key) */
1613                 if (usbcode & KEY_RELEASE) {
1614                         if (sc->sc_flags & UKBD_FLAG_COMPOSE) {
1615                                 sc->sc_flags &= ~UKBD_FLAG_COMPOSE;
1616
1617                                 if (sc->sc_composed_char > 0xFF) {
1618                                         sc->sc_composed_char = 0;
1619                                 }
1620                         }
1621                 } else {
1622                         if (!(sc->sc_flags & UKBD_FLAG_COMPOSE)) {
1623                                 sc->sc_flags |= UKBD_FLAG_COMPOSE;
1624                                 sc->sc_composed_char = 0;
1625                         }
1626                 }
1627                 break;
1628                 /* XXX: I don't like these... */
1629         case 0x5c:                      /* print screen */
1630                 if (sc->sc_flags & ALTS) {
1631                         keycode = 0x54; /* sysrq */
1632                 }
1633                 break;
1634         case 0x68:                      /* pause/break */
1635                 if (sc->sc_flags & CTLS) {
1636                         keycode = 0x6c; /* break */
1637                 }
1638                 break;
1639         }
1640
1641         /* return the key code in the K_CODE mode */
1642         if (usbcode & KEY_RELEASE) {
1643                 keycode |= SCAN_RELEASE;
1644         }
1645         if (sc->sc_mode == K_CODE) {
1646                 return (keycode);
1647         }
1648         /* compose a character code */
1649         if (sc->sc_flags & UKBD_FLAG_COMPOSE) {
1650                 switch (keycode) {
1651                         /* key pressed, process it */
1652                 case 0x47:
1653                 case 0x48:
1654                 case 0x49:              /* keypad 7,8,9 */
1655                         sc->sc_composed_char *= 10;
1656                         sc->sc_composed_char += keycode - 0x40;
1657                         goto check_composed;
1658
1659                 case 0x4B:
1660                 case 0x4C:
1661                 case 0x4D:              /* keypad 4,5,6 */
1662                         sc->sc_composed_char *= 10;
1663                         sc->sc_composed_char += keycode - 0x47;
1664                         goto check_composed;
1665
1666                 case 0x4F:
1667                 case 0x50:
1668                 case 0x51:              /* keypad 1,2,3 */
1669                         sc->sc_composed_char *= 10;
1670                         sc->sc_composed_char += keycode - 0x4E;
1671                         goto check_composed;
1672
1673                 case 0x52:              /* keypad 0 */
1674                         sc->sc_composed_char *= 10;
1675                         goto check_composed;
1676
1677                         /* key released, no interest here */
1678                 case SCAN_RELEASE | 0x47:
1679                 case SCAN_RELEASE | 0x48:
1680                 case SCAN_RELEASE | 0x49:       /* keypad 7,8,9 */
1681                 case SCAN_RELEASE | 0x4B:
1682                 case SCAN_RELEASE | 0x4C:
1683                 case SCAN_RELEASE | 0x4D:       /* keypad 4,5,6 */
1684                 case SCAN_RELEASE | 0x4F:
1685                 case SCAN_RELEASE | 0x50:
1686                 case SCAN_RELEASE | 0x51:       /* keypad 1,2,3 */
1687                 case SCAN_RELEASE | 0x52:       /* keypad 0 */
1688                         goto next_code;
1689
1690                 case 0x38:              /* left alt key */
1691                         break;
1692
1693                 default:
1694                         if (sc->sc_composed_char > 0) {
1695                                 sc->sc_flags &= ~UKBD_FLAG_COMPOSE;
1696                                 sc->sc_composed_char = 0;
1697                                 goto errkey;
1698                         }
1699                         break;
1700                 }
1701         }
1702         /* keycode to key action */
1703         action = genkbd_keyaction(kbd, SCAN_CHAR(keycode),
1704             (keycode & SCAN_RELEASE),
1705             &sc->sc_state, &sc->sc_accents);
1706         if (action == NOKEY) {
1707                 goto next_code;
1708         }
1709 done:
1710         return (action);
1711
1712 check_composed:
1713         if (sc->sc_composed_char <= 0xFF) {
1714                 goto next_code;
1715         }
1716 errkey:
1717         return (ERRKEY);
1718 }
1719
1720 /* Currently wait is always false. */
1721 static uint32_t
1722 ukbd_read_char(keyboard_t *kbd, int wait)
1723 {
1724         uint32_t keycode;
1725
1726         UKBD_LOCK();
1727         keycode = ukbd_read_char_locked(kbd, wait);
1728         UKBD_UNLOCK();
1729
1730         return (keycode);
1731 }
1732
1733 /* some useful control functions */
1734 static int
1735 ukbd_ioctl_locked(keyboard_t *kbd, u_long cmd, caddr_t arg)
1736 {
1737         struct ukbd_softc *sc = kbd->kb_data;
1738         int i;
1739 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1740     defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1741         int ival;
1742
1743 #endif
1744
1745         UKBD_LOCK_ASSERT();
1746
1747         switch (cmd) {
1748         case KDGKBMODE:         /* get keyboard mode */
1749                 *(int *)arg = sc->sc_mode;
1750                 break;
1751 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1752     defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1753         case _IO('K', 7):
1754                 ival = IOCPARM_IVAL(arg);
1755                 arg = (caddr_t)&ival;
1756                 /* FALLTHROUGH */
1757 #endif
1758         case KDSKBMODE:         /* set keyboard mode */
1759                 switch (*(int *)arg) {
1760                 case K_XLATE:
1761                         if (sc->sc_mode != K_XLATE) {
1762                                 /* make lock key state and LED state match */
1763                                 sc->sc_state &= ~LOCK_MASK;
1764                                 sc->sc_state |= KBD_LED_VAL(kbd);
1765                         }
1766                         /* FALLTHROUGH */
1767                 case K_RAW:
1768                 case K_CODE:
1769                         if (sc->sc_mode != *(int *)arg) {
1770                                 if ((sc->sc_flags & UKBD_FLAG_POLLING) == 0)
1771                                         ukbd_clear_state(kbd);
1772                                 sc->sc_mode = *(int *)arg;
1773                         }
1774                         break;
1775                 default:
1776                         return (EINVAL);
1777                 }
1778                 break;
1779
1780         case KDGETLED:                  /* get keyboard LED */
1781                 *(int *)arg = KBD_LED_VAL(kbd);
1782                 break;
1783 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1784     defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1785         case _IO('K', 66):
1786                 ival = IOCPARM_IVAL(arg);
1787                 arg = (caddr_t)&ival;
1788                 /* FALLTHROUGH */
1789 #endif
1790         case KDSETLED:                  /* set keyboard LED */
1791                 /* NOTE: lock key state in "sc_state" won't be changed */
1792                 if (*(int *)arg & ~LOCK_MASK)
1793                         return (EINVAL);
1794
1795                 i = *(int *)arg;
1796
1797                 /* replace CAPS LED with ALTGR LED for ALTGR keyboards */
1798                 if (sc->sc_mode == K_XLATE &&
1799                     kbd->kb_keymap->n_keys > ALTGR_OFFSET) {
1800                         if (i & ALKED)
1801                                 i |= CLKED;
1802                         else
1803                                 i &= ~CLKED;
1804                 }
1805                 if (KBD_HAS_DEVICE(kbd))
1806                         ukbd_set_leds(sc, i);
1807
1808                 KBD_LED_VAL(kbd) = *(int *)arg;
1809                 break;
1810         case KDGKBSTATE:                /* get lock key state */
1811                 *(int *)arg = sc->sc_state & LOCK_MASK;
1812                 break;
1813 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1814     defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1815         case _IO('K', 20):
1816                 ival = IOCPARM_IVAL(arg);
1817                 arg = (caddr_t)&ival;
1818                 /* FALLTHROUGH */
1819 #endif
1820         case KDSKBSTATE:                /* set lock key state */
1821                 if (*(int *)arg & ~LOCK_MASK) {
1822                         return (EINVAL);
1823                 }
1824                 sc->sc_state &= ~LOCK_MASK;
1825                 sc->sc_state |= *(int *)arg;
1826
1827                 /* set LEDs and quit */
1828                 return (ukbd_ioctl(kbd, KDSETLED, arg));
1829
1830         case KDSETREPEAT:               /* set keyboard repeat rate (new
1831                                          * interface) */
1832                 if (!KBD_HAS_DEVICE(kbd)) {
1833                         return (0);
1834                 }
1835                 if (((int *)arg)[1] < 0) {
1836                         return (EINVAL);
1837                 }
1838                 if (((int *)arg)[0] < 0) {
1839                         return (EINVAL);
1840                 }
1841                 if (((int *)arg)[0] < 200)      /* fastest possible value */
1842                         kbd->kb_delay1 = 200;
1843                 else
1844                         kbd->kb_delay1 = ((int *)arg)[0];
1845                 kbd->kb_delay2 = ((int *)arg)[1];
1846                 return (0);
1847
1848 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1849     defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1850         case _IO('K', 67):
1851                 ival = IOCPARM_IVAL(arg);
1852                 arg = (caddr_t)&ival;
1853                 /* FALLTHROUGH */
1854 #endif
1855         case KDSETRAD:                  /* set keyboard repeat rate (old
1856                                          * interface) */
1857                 return (ukbd_set_typematic(kbd, *(int *)arg));
1858
1859         case PIO_KEYMAP:                /* set keyboard translation table */
1860         case OPIO_KEYMAP:               /* set keyboard translation table
1861                                          * (compat) */
1862         case PIO_KEYMAPENT:             /* set keyboard translation table
1863                                          * entry */
1864         case PIO_DEADKEYMAP:            /* set accent key translation table */
1865                 sc->sc_accents = 0;
1866                 /* FALLTHROUGH */
1867         default:
1868                 return (genkbd_commonioctl(kbd, cmd, arg));
1869         }
1870
1871         return (0);
1872 }
1873
1874 static int
1875 ukbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
1876 {
1877         int result;
1878
1879         /*
1880          * XXX KDGKBSTATE, KDSKBSTATE and KDSETLED can be called from any
1881          * context where printf(9) can be called, which among other things
1882          * includes interrupt filters and threads with any kinds of locks
1883          * already held.  For this reason it would be dangerous to acquire
1884          * the Giant here unconditionally.  On the other hand we have to
1885          * have it to handle the ioctl.
1886          * So we make our best effort to auto-detect whether we can grab
1887          * the Giant or not.  Blame syscons(4) for this.
1888          */
1889         switch (cmd) {
1890         case KDGKBSTATE:
1891         case KDSKBSTATE:
1892         case KDSETLED:
1893                 if (!mtx_owned(&Giant) && !SCHEDULER_STOPPED())
1894                         return (EDEADLK);       /* best I could come up with */
1895                 /* FALLTHROUGH */
1896         default:
1897                 UKBD_LOCK();
1898                 result = ukbd_ioctl_locked(kbd, cmd, arg);
1899                 UKBD_UNLOCK();
1900                 return (result);
1901         }
1902 }
1903
1904
1905 /* clear the internal state of the keyboard */
1906 static void
1907 ukbd_clear_state(keyboard_t *kbd)
1908 {
1909         struct ukbd_softc *sc = kbd->kb_data;
1910
1911         UKBD_CTX_LOCK_ASSERT();
1912
1913         sc->sc_flags &= ~(UKBD_FLAG_COMPOSE | UKBD_FLAG_POLLING);
1914         sc->sc_state &= LOCK_MASK;      /* preserve locking key state */
1915         sc->sc_accents = 0;
1916         sc->sc_composed_char = 0;
1917 #ifdef UKBD_EMULATE_ATSCANCODE
1918         sc->sc_buffered_char[0] = 0;
1919         sc->sc_buffered_char[1] = 0;
1920 #endif
1921         memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
1922         memset(&sc->sc_odata, 0, sizeof(sc->sc_odata));
1923         memset(&sc->sc_ntime, 0, sizeof(sc->sc_ntime));
1924         memset(&sc->sc_otime, 0, sizeof(sc->sc_otime));
1925 }
1926
1927 /* save the internal state, not used */
1928 static int
1929 ukbd_get_state(keyboard_t *kbd, void *buf, size_t len)
1930 {
1931         return (len == 0) ? 1 : -1;
1932 }
1933
1934 /* set the internal state, not used */
1935 static int
1936 ukbd_set_state(keyboard_t *kbd, void *buf, size_t len)
1937 {
1938         return (EINVAL);
1939 }
1940
1941 static int
1942 ukbd_poll(keyboard_t *kbd, int on)
1943 {
1944         struct ukbd_softc *sc = kbd->kb_data;
1945
1946         UKBD_LOCK();
1947         if (on) {
1948                 sc->sc_flags |= UKBD_FLAG_POLLING;
1949                 sc->sc_poll_thread = curthread;
1950         } else {
1951                 sc->sc_flags &= ~UKBD_FLAG_POLLING;
1952                 ukbd_start_timer(sc);   /* start timer */
1953         }
1954         UKBD_UNLOCK();
1955
1956         return (0);
1957 }
1958
1959 /* local functions */
1960
1961 static void
1962 ukbd_set_leds(struct ukbd_softc *sc, uint8_t leds)
1963 {
1964
1965         UKBD_LOCK_ASSERT();
1966         DPRINTF("leds=0x%02x\n", leds);
1967
1968         sc->sc_leds = leds;
1969         sc->sc_flags |= UKBD_FLAG_SET_LEDS;
1970
1971         /* start transfer, if not already started */
1972
1973         usbd_transfer_start(sc->sc_xfer[UKBD_CTRL_LED]);
1974 }
1975
1976 static int
1977 ukbd_set_typematic(keyboard_t *kbd, int code)
1978 {
1979         static const int delays[] = {250, 500, 750, 1000};
1980         static const int rates[] = {34, 38, 42, 46, 50, 55, 59, 63,
1981                 68, 76, 84, 92, 100, 110, 118, 126,
1982                 136, 152, 168, 184, 200, 220, 236, 252,
1983         272, 304, 336, 368, 400, 440, 472, 504};
1984
1985         if (code & ~0x7f) {
1986                 return (EINVAL);
1987         }
1988         kbd->kb_delay1 = delays[(code >> 5) & 3];
1989         kbd->kb_delay2 = rates[code & 0x1f];
1990         return (0);
1991 }
1992
1993 #ifdef UKBD_EMULATE_ATSCANCODE
1994 static int
1995 ukbd_key2scan(struct ukbd_softc *sc, int code, int shift, int up)
1996 {
1997         static const int scan[] = {
1998                 /* 89 */
1999                 0x11c,  /* Enter */
2000                 /* 90-99 */
2001                 0x11d,  /* Ctrl-R */
2002                 0x135,  /* Divide */
2003                 0x137 | SCAN_PREFIX_SHIFT,      /* PrintScreen */
2004                 0x138,  /* Alt-R */
2005                 0x147,  /* Home */
2006                 0x148,  /* Up */
2007                 0x149,  /* PageUp */
2008                 0x14b,  /* Left */
2009                 0x14d,  /* Right */
2010                 0x14f,  /* End */
2011                 /* 100-109 */
2012                 0x150,  /* Down */
2013                 0x151,  /* PageDown */
2014                 0x152,  /* Insert */
2015                 0x153,  /* Delete */
2016                 0x146,  /* XXX Pause/Break */
2017                 0x15b,  /* Win_L(Super_L) */
2018                 0x15c,  /* Win_R(Super_R) */
2019                 0x15d,  /* Application(Menu) */
2020
2021                 /* SUN TYPE 6 USB KEYBOARD */
2022                 0x168,  /* Sun Type 6 Help */
2023                 0x15e,  /* Sun Type 6 Stop */
2024                 /* 110 - 119 */
2025                 0x15f,  /* Sun Type 6 Again */
2026                 0x160,  /* Sun Type 6 Props */
2027                 0x161,  /* Sun Type 6 Undo */
2028                 0x162,  /* Sun Type 6 Front */
2029                 0x163,  /* Sun Type 6 Copy */
2030                 0x164,  /* Sun Type 6 Open */
2031                 0x165,  /* Sun Type 6 Paste */
2032                 0x166,  /* Sun Type 6 Find */
2033                 0x167,  /* Sun Type 6 Cut */
2034                 0x125,  /* Sun Type 6 Mute */
2035                 /* 120 - 128 */
2036                 0x11f,  /* Sun Type 6 VolumeDown */
2037                 0x11e,  /* Sun Type 6 VolumeUp */
2038                 0x120,  /* Sun Type 6 PowerDown */
2039
2040                 /* Japanese 106/109 keyboard */
2041                 0x73,   /* Keyboard Intl' 1 (backslash / underscore) */
2042                 0x70,   /* Keyboard Intl' 2 (Katakana / Hiragana) */
2043                 0x7d,   /* Keyboard Intl' 3 (Yen sign) (Not using in jp106/109) */
2044                 0x79,   /* Keyboard Intl' 4 (Henkan) */
2045                 0x7b,   /* Keyboard Intl' 5 (Muhenkan) */
2046                 0x5c,   /* Keyboard Intl' 6 (Keypad ,) (For PC-9821 layout) */
2047         };
2048
2049         if ((code >= 89) && (code < (int)(89 + (sizeof(scan) / sizeof(scan[0]))))) {
2050                 code = scan[code - 89];
2051         }
2052         /* Pause/Break */
2053         if ((code == 104) && (!(shift & (MOD_CONTROL_L | MOD_CONTROL_R)))) {
2054                 code = (0x45 | SCAN_PREFIX_E1 | SCAN_PREFIX_CTL);
2055         }
2056         if (shift & (MOD_SHIFT_L | MOD_SHIFT_R)) {
2057                 code &= ~SCAN_PREFIX_SHIFT;
2058         }
2059         code |= (up ? SCAN_RELEASE : SCAN_PRESS);
2060
2061         if (code & SCAN_PREFIX) {
2062                 if (code & SCAN_PREFIX_CTL) {
2063                         /* Ctrl */
2064                         sc->sc_buffered_char[0] = (0x1d | (code & SCAN_RELEASE));
2065                         sc->sc_buffered_char[1] = (code & ~SCAN_PREFIX);
2066                 } else if (code & SCAN_PREFIX_SHIFT) {
2067                         /* Shift */
2068                         sc->sc_buffered_char[0] = (0x2a | (code & SCAN_RELEASE));
2069                         sc->sc_buffered_char[1] = (code & ~SCAN_PREFIX_SHIFT);
2070                 } else {
2071                         sc->sc_buffered_char[0] = (code & ~SCAN_PREFIX);
2072                         sc->sc_buffered_char[1] = 0;
2073                 }
2074                 return ((code & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
2075         }
2076         return (code);
2077
2078 }
2079
2080 #endif                                  /* UKBD_EMULATE_ATSCANCODE */
2081
2082 static keyboard_switch_t ukbdsw = {
2083         .probe = &ukbd__probe,
2084         .init = &ukbd_init,
2085         .term = &ukbd_term,
2086         .intr = &ukbd_intr,
2087         .test_if = &ukbd_test_if,
2088         .enable = &ukbd_enable,
2089         .disable = &ukbd_disable,
2090         .read = &ukbd_read,
2091         .check = &ukbd_check,
2092         .read_char = &ukbd_read_char,
2093         .check_char = &ukbd_check_char,
2094         .ioctl = &ukbd_ioctl,
2095         .lock = &ukbd_lock,
2096         .clear_state = &ukbd_clear_state,
2097         .get_state = &ukbd_get_state,
2098         .set_state = &ukbd_set_state,
2099         .get_fkeystr = &genkbd_get_fkeystr,
2100         .poll = &ukbd_poll,
2101         .diag = &genkbd_diag,
2102 };
2103
2104 KEYBOARD_DRIVER(ukbd, ukbdsw, ukbd_configure);
2105
2106 static int
2107 ukbd_driver_load(module_t mod, int what, void *arg)
2108 {
2109         switch (what) {
2110         case MOD_LOAD:
2111                 kbd_add_driver(&ukbd_kbd_driver);
2112                 break;
2113         case MOD_UNLOAD:
2114                 kbd_delete_driver(&ukbd_kbd_driver);
2115                 break;
2116         }
2117         return (0);
2118 }
2119
2120 static devclass_t ukbd_devclass;
2121
2122 static device_method_t ukbd_methods[] = {
2123         DEVMETHOD(device_probe, ukbd_probe),
2124         DEVMETHOD(device_attach, ukbd_attach),
2125         DEVMETHOD(device_detach, ukbd_detach),
2126         DEVMETHOD(device_resume, ukbd_resume),
2127         {0, 0}
2128 };
2129
2130 static driver_t ukbd_driver = {
2131         .name = "ukbd",
2132         .methods = ukbd_methods,
2133         .size = sizeof(struct ukbd_softc),
2134 };
2135
2136 DRIVER_MODULE(ukbd, uhub, ukbd_driver, ukbd_devclass, ukbd_driver_load, 0);
2137 MODULE_DEPEND(ukbd, usb, 1, 1, 1);
2138 MODULE_VERSION(ukbd, 1);