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