2
* Copyright (c) 2009 Jiri Svoboda
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
9
* - Redistributions of source code must retain the above copyright
10
* notice, this list of conditions and the following disclaimer.
11
* - 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.
14
* - The name of the author may not be used to endorse or promote products
15
* derived from this software without specific prior written permission.
17
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
/** @addtogroup kbd_ctl
35
* @brief PC keyboard controller driver.
39
#include <io/console.h>
40
#include <io/keycode.h>
49
static enum dec_state ds;
51
static int scanmap_simple[] = {
68
[0x0e] = KC_BACKSPACE,
86
[0x3a] = KC_CAPS_LOCK,
98
[0x27] = KC_SEMICOLON,
100
[0x2b] = KC_BACKSLASH,
139
[0x46] = KC_SCROLL_LOCK,
143
[0x45] = KC_NUM_LOCK,
160
static int scanmap_e0[] = {
172
[0x51] = KC_PAGE_DOWN,
183
int kbd_ctl_init(void)
189
void kbd_ctl_parse_scancode(int scancode)
191
console_ev_type_t type;
196
if (scancode == 0xe0) {
203
map = scanmap_simple;
204
map_length = sizeof(scanmap_simple) / sizeof(int);
208
map_length = sizeof(scanmap_e0) / sizeof(int);
217
if (scancode & 0x80) {
224
if ((scancode < 0) || ((size_t) scancode >= map_length))
229
kbd_push_ev(type, key);