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