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