2 * Copyright (c) 2014 Jakub Wojciech Klama <jceel@FreeBSD.org>
3 * Copyright (c) 2015-2016 Vladimir Kondratyev <wulf@FreeBSD.org>
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 #include <sys/param.h>
34 #include <sys/kernel.h>
36 #include <sys/malloc.h>
37 #include <sys/mutex.h>
38 #include <sys/systm.h>
40 #include <dev/evdev/evdev.h>
41 #include <dev/evdev/input.h>
43 #include <dev/kbd/kbdreg.h>
45 #define NONE KEY_RESERVED
47 static uint16_t evdev_usb_scancodes[256] = {
49 NONE, NONE, NONE, NONE, KEY_A, KEY_B, KEY_C, KEY_D,
50 KEY_E, KEY_F, KEY_G, KEY_H, KEY_I, KEY_J, KEY_K, KEY_L,
51 KEY_M, KEY_N, KEY_O, KEY_P, KEY_Q, KEY_R, KEY_S, KEY_T,
52 KEY_U, KEY_V, KEY_W, KEY_X, KEY_Y, KEY_Z, KEY_1, KEY_2,
53 KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0,
55 KEY_ENTER, KEY_ESC, KEY_BACKSPACE, KEY_TAB,
56 KEY_SPACE, KEY_MINUS, KEY_EQUAL, KEY_LEFTBRACE,
57 KEY_RIGHTBRACE, KEY_BACKSLASH, KEY_BACKSLASH, KEY_SEMICOLON,
58 KEY_APOSTROPHE, KEY_GRAVE, KEY_COMMA, KEY_DOT,
59 KEY_SLASH, KEY_CAPSLOCK, KEY_F1, KEY_F2,
60 KEY_F3, KEY_F4, KEY_F5, KEY_F6,
62 KEY_F7, KEY_F8, KEY_F9, KEY_F10,
63 KEY_F11, KEY_F12, KEY_SYSRQ, KEY_SCROLLLOCK,
64 KEY_PAUSE, KEY_INSERT, KEY_HOME, KEY_PAGEUP,
65 KEY_DELETE, KEY_END, KEY_PAGEDOWN, KEY_RIGHT,
66 KEY_LEFT, KEY_DOWN, KEY_UP, KEY_NUMLOCK,
67 KEY_KPSLASH, KEY_KPASTERISK, KEY_KPMINUS, KEY_KPPLUS,
68 KEY_KPENTER, KEY_KP1, KEY_KP2, KEY_KP3,
69 KEY_KP4, KEY_KP5, KEY_KP6, KEY_KP7,
71 KEY_KP8, KEY_KP9, KEY_KP0, KEY_KPDOT,
72 KEY_102ND, KEY_COMPOSE, KEY_POWER, KEY_KPEQUAL,
73 KEY_F13, KEY_F14, KEY_F15, KEY_F16,
74 KEY_F17, KEY_F18, KEY_F19, KEY_F20,
75 KEY_F21, KEY_F22, KEY_F23, KEY_F24,
76 KEY_OPEN, KEY_HELP, KEY_PROPS, KEY_FRONT,
77 KEY_STOP, KEY_AGAIN, KEY_UNDO, KEY_CUT,
78 KEY_COPY, KEY_PASTE, KEY_FIND, KEY_MUTE,
80 KEY_VOLUMEUP, KEY_VOLUMEDOWN, NONE, NONE,
81 NONE, KEY_KPCOMMA, NONE, KEY_RO,
82 KEY_KATAKANAHIRAGANA, KEY_YEN,KEY_HENKAN, KEY_MUHENKAN,
83 KEY_KPJPCOMMA, NONE, NONE, NONE,
84 KEY_HANGEUL, KEY_HANJA, KEY_KATAKANA, KEY_HIRAGANA,
85 KEY_ZENKAKUHANKAKU, NONE, NONE, NONE,
86 NONE, NONE, NONE, NONE,
87 NONE, NONE, NONE, NONE,
89 NONE, NONE, NONE, NONE,
90 NONE, NONE, NONE, NONE,
91 NONE, NONE, NONE, NONE,
92 NONE, NONE, NONE, NONE,
93 NONE, NONE, NONE, NONE,
94 NONE, NONE, NONE, NONE,
95 NONE, NONE, NONE, NONE,
96 NONE, NONE, NONE, NONE,
98 NONE, NONE, NONE, NONE,
99 NONE, NONE, NONE, NONE,
100 NONE, NONE, NONE, NONE,
101 NONE, NONE, NONE, NONE,
102 NONE, NONE, NONE, NONE,
103 NONE, NONE, NONE, NONE,
104 NONE, NONE, NONE, NONE,
105 NONE, NONE, NONE, NONE,
107 KEY_LEFTCTRL, KEY_LEFTSHIFT, KEY_LEFTALT, KEY_LEFTMETA,
108 KEY_RIGHTCTRL, KEY_RIGHTSHIFT, KEY_RIGHTALT, KEY_RIGHTMETA,
109 KEY_PLAYPAUSE, KEY_STOPCD, KEY_PREVIOUSSONG,KEY_NEXTSONG,
110 KEY_EJECTCD, KEY_VOLUMEUP, KEY_VOLUMEDOWN, KEY_MUTE,
111 KEY_WWW, KEY_BACK, KEY_FORWARD, KEY_STOP,
112 KEY_FIND, KEY_SCROLLUP, KEY_SCROLLDOWN, KEY_EDIT,
113 KEY_SLEEP, KEY_COFFEE, KEY_REFRESH, KEY_CALC,
114 NONE, NONE, NONE, NONE,
118 static uint16_t evdev_at_set1_scancodes[] = {
120 NONE, KEY_ESC, KEY_1, KEY_2,
121 KEY_3, KEY_4, KEY_5, KEY_6,
122 KEY_7, KEY_8, KEY_9, KEY_0,
123 KEY_MINUS, KEY_EQUAL, KEY_BACKSPACE, KEY_TAB,
124 KEY_Q, KEY_W, KEY_E, KEY_R,
125 KEY_T, KEY_Y, KEY_U, KEY_I,
126 KEY_O, KEY_P, KEY_LEFTBRACE, KEY_RIGHTBRACE,
127 KEY_ENTER, KEY_LEFTCTRL, KEY_A, KEY_S,
129 KEY_D, KEY_F, KEY_G, KEY_H,
130 KEY_J, KEY_K, KEY_L, KEY_SEMICOLON,
131 KEY_APOSTROPHE, KEY_GRAVE, KEY_LEFTSHIFT, KEY_BACKSLASH,
132 KEY_Z, KEY_X, KEY_C, KEY_V,
133 KEY_B, KEY_N, KEY_M, KEY_COMMA,
134 KEY_DOT, KEY_SLASH, KEY_RIGHTSHIFT, KEY_KPASTERISK,
135 KEY_LEFTALT, KEY_SPACE, KEY_CAPSLOCK, KEY_F1,
136 KEY_F2, KEY_F3, KEY_F4, KEY_F5,
138 KEY_F6, KEY_F7, KEY_F8, KEY_F9,
139 KEY_F10, KEY_NUMLOCK, KEY_SCROLLLOCK, KEY_KP7,
140 KEY_KP8, KEY_KP9, KEY_KPMINUS, KEY_KP4,
141 KEY_KP5, KEY_KP6, KEY_KPPLUS, KEY_KP1,
142 KEY_KP2, KEY_KP3, KEY_KP0, KEY_KPDOT,
143 NONE, NONE, KEY_102ND, KEY_F11,
144 KEY_F12, NONE, NONE, NONE,
145 NONE, NONE, NONE, NONE,
147 NONE, NONE, NONE, NONE,
148 NONE, NONE, NONE, NONE,
149 NONE, NONE, NONE, NONE,
150 NONE, NONE, NONE, NONE,
151 KEY_KATAKANAHIRAGANA, NONE, NONE, KEY_RO,
152 NONE, NONE, KEY_ZENKAKUHANKAKU, KEY_HIRAGANA,
153 KEY_KATAKANA, KEY_HENKAN, NONE, KEY_MUHENKAN,
154 NONE, KEY_YEN, KEY_KPCOMMA, NONE,
155 /* 0x00 - 0x1f. 0xE0 prefixed */
156 NONE, NONE, NONE, NONE,
157 NONE, NONE, NONE, NONE,
158 NONE, NONE, NONE, NONE,
159 NONE, NONE, NONE, NONE,
160 KEY_PREVIOUSSONG, NONE, NONE, NONE,
161 NONE, NONE, NONE, NONE,
162 NONE, KEY_NEXTSONG, NONE, NONE,
163 KEY_KPENTER, KEY_RIGHTCTRL, NONE, NONE,
164 /* 0x20 - 0x3f. 0xE0 prefixed */
165 KEY_MUTE, KEY_CALC, KEY_PLAYPAUSE, NONE,
166 KEY_STOPCD, NONE, NONE, NONE,
167 NONE, NONE, NONE, NONE,
168 NONE, NONE, KEY_VOLUMEDOWN, NONE,
169 KEY_VOLUMEUP, NONE, KEY_HOMEPAGE, NONE,
170 NONE, KEY_KPSLASH, NONE, KEY_SYSRQ,
171 KEY_RIGHTALT, NONE, NONE, NONE,
172 NONE, NONE, NONE, NONE,
173 /* 0x40 - 0x5f. 0xE0 prefixed */
174 NONE, NONE, NONE, NONE,
175 NONE, NONE, KEY_PAUSE, KEY_HOME,
176 KEY_UP, KEY_PAGEUP, NONE, KEY_LEFT,
177 NONE, KEY_RIGHT, NONE, KEY_END,
178 KEY_DOWN, KEY_PAGEDOWN, KEY_INSERT, KEY_DELETE,
179 NONE, NONE, NONE, NONE,
180 NONE, NONE, NONE, KEY_LEFTMETA,
181 KEY_RIGHTMETA, KEY_MENU, KEY_POWER, KEY_SLEEP,
182 /* 0x60 - 0x7f. 0xE0 prefixed */
183 NONE, NONE, NONE, KEY_WAKEUP,
184 NONE, KEY_SEARCH, KEY_BOOKMARKS, KEY_REFRESH,
185 KEY_STOP, KEY_FORWARD, KEY_BACK, KEY_COMPUTER,
186 KEY_MAIL, KEY_MEDIA, NONE, NONE,
187 NONE, NONE, NONE, NONE,
188 NONE, NONE, NONE, NONE,
189 NONE, NONE, NONE, NONE,
190 NONE, NONE, NONE, NONE,
193 static uint16_t evdev_mouse_button_codes[] = {
204 static uint16_t evdev_led_codes[] = {
205 LED_CAPSL, /* CLKED */
206 LED_NUML, /* NLKED */
207 LED_SCROLLL, /* SLKED */
211 evdev_hid2key(int scancode)
213 return evdev_usb_scancodes[scancode];
217 evdev_support_all_known_keys(struct evdev_dev *evdev)
221 for (i = KEY_RESERVED; i < nitems(evdev_at_set1_scancodes); i++)
222 if (evdev_at_set1_scancodes[i] != NONE)
223 evdev_support_key(evdev, evdev_at_set1_scancodes[i]);
227 evdev_scancode2key(int *state, int scancode)
231 /* translate the scan code into a keycode */
232 keycode = evdev_at_set1_scancodes[scancode & 0x7f];
234 case 0x00: /* normal scancode */
242 case 0xE0: /* 0xE0 prefix */
244 keycode = evdev_at_set1_scancodes[0x80 + (scancode & 0x7f)];
246 case 0xE1: /* 0xE1 prefix */
248 * The pause/break key on the 101 keyboard produces:
250 * Ctrl-pause/break produces:
251 * E0-46 E0-C6 (See above.)
254 if ((scancode & 0x7f) == 0x1D)
258 case 0x1D: /* pause / break */
260 if (scancode != 0x45)
270 evdev_push_mouse_btn(struct evdev_dev *evdev, int buttons)
274 for (i = 0; i < nitems(evdev_mouse_button_codes); i++)
275 evdev_push_key(evdev, evdev_mouse_button_codes[i],
280 evdev_push_leds(struct evdev_dev *evdev, int leds)
284 /* Some drivers initialize leds before evdev */
288 for (i = 0; i < nitems(evdev_led_codes); i++)
289 evdev_push_led(evdev, evdev_led_codes[i], leds & (1 << i));
293 evdev_push_repeats(struct evdev_dev *evdev, keyboard_t *kbd)
295 /* Some drivers initialize typematics before evdev */
299 evdev_push_event(evdev, EV_REP, REP_DELAY, kbd->kb_delay1);
300 evdev_push_event(evdev, EV_REP, REP_PERIOD, kbd->kb_delay2);
304 evdev_ev_kbd_event(struct evdev_dev *evdev, void *softc, uint16_t type,
305 uint16_t code, int32_t value)
307 keyboard_t *kbd = (keyboard_t *)softc;
308 int delay[2], leds, oleds;
311 if (type == EV_LED) {
312 leds = oleds = KBD_LED_VAL(kbd);
313 for (i = 0; i < nitems(evdev_led_codes); i++) {
314 if (evdev_led_codes[i] == code) {
321 kbdd_ioctl(kbd, KDSETLED,
328 } else if (type == EV_REP && code == REP_DELAY) {
330 delay[1] = kbd->kb_delay2;
332 kbdd_ioctl(kbd, KDSETREPEAT, (caddr_t)delay);
334 } else if (type == EV_REP && code == REP_PERIOD) {
335 delay[0] = kbd->kb_delay1;
338 kbdd_ioctl(kbd, KDSETREPEAT, (caddr_t)delay);