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 Serial TTY-like keyboard controller driver.
39
#include <io/keycode.h>
44
/** Scancode parser */
47
/** Current parser state */
55
0, KC_BACKTICK, 0x60, GSP_END,
57
0, KC_1, 0x31, GSP_END,
58
0, KC_2, 0x32, GSP_END,
59
0, KC_3, 0x33, GSP_END,
60
0, KC_4, 0x34, GSP_END,
61
0, KC_5, 0x35, GSP_END,
62
0, KC_6, 0x36, GSP_END,
63
0, KC_7, 0x37, GSP_END,
64
0, KC_8, 0x38, GSP_END,
65
0, KC_9, 0x39, GSP_END,
66
0, KC_0, 0x30, GSP_END,
68
0, KC_MINUS, 0x2d, GSP_END,
69
0, KC_EQUALS, 0x3d, GSP_END,
70
0, KC_BACKSPACE, 0x08, GSP_END,
72
0, KC_TAB, 0x09, GSP_END,
74
0, KC_Q, 0x71, GSP_END,
75
0, KC_W, 0x77, GSP_END,
76
0, KC_E, 0x65, GSP_END,
77
0, KC_R, 0x72, GSP_END,
78
0, KC_T, 0x74, GSP_END,
79
0, KC_Y, 0x79, GSP_END,
80
0, KC_U, 0x75, GSP_END,
81
0, KC_I, 0x69, GSP_END,
82
0, KC_O, 0x6f, GSP_END,
83
0, KC_P, 0x70, GSP_END,
85
0, KC_LBRACKET, 0x5b, GSP_END,
86
0, KC_RBRACKET, 0x5d, GSP_END,
88
0, KC_A, 0x61, GSP_END,
89
0, KC_S, 0x73, GSP_END,
90
0, KC_D, 0x64, GSP_END,
91
0, KC_F, 0x66, GSP_END,
92
0, KC_G, 0x67, GSP_END,
93
0, KC_H, 0x68, GSP_END,
94
0, KC_J, 0x6a, GSP_END,
95
0, KC_K, 0x6b, GSP_END,
96
0, KC_L, 0x6c, GSP_END,
98
0, KC_SEMICOLON, 0x3b, GSP_END,
99
0, KC_QUOTE, 0x27, GSP_END,
100
0, KC_BACKSLASH, 0x5c, GSP_END,
102
0, KC_Z, 0x7a, GSP_END,
103
0, KC_X, 0x78, GSP_END,
104
0, KC_C, 0x63, GSP_END,
105
0, KC_V, 0x76, GSP_END,
106
0, KC_B, 0x62, GSP_END,
107
0, KC_N, 0x6e, GSP_END,
108
0, KC_M, 0x6d, GSP_END,
110
0, KC_COMMA, 0x2c, GSP_END,
111
0, KC_PERIOD, 0x2e, GSP_END,
112
0, KC_SLASH, 0x2f, GSP_END,
116
KM_SHIFT, KC_BACKTICK, 0x7e, GSP_END,
118
KM_SHIFT, KC_1, 0x21, GSP_END,
119
KM_SHIFT, KC_2, 0x40, GSP_END,
120
KM_SHIFT, KC_3, 0x23, GSP_END,
121
KM_SHIFT, KC_4, 0x24, GSP_END,
122
KM_SHIFT, KC_5, 0x25, GSP_END,
123
KM_SHIFT, KC_6, 0x5e, GSP_END,
124
KM_SHIFT, KC_7, 0x26, GSP_END,
125
KM_SHIFT, KC_8, 0x2a, GSP_END,
126
KM_SHIFT, KC_9, 0x28, GSP_END,
127
KM_SHIFT, KC_0, 0x29, GSP_END,
129
KM_SHIFT, KC_MINUS, 0x5f, GSP_END,
130
KM_SHIFT, KC_EQUALS, 0x2b, GSP_END,
132
KM_SHIFT, KC_Q, 0x51, GSP_END,
133
KM_SHIFT, KC_W, 0x57, GSP_END,
134
KM_SHIFT, KC_E, 0x45, GSP_END,
135
KM_SHIFT, KC_R, 0x52, GSP_END,
136
KM_SHIFT, KC_T, 0x54, GSP_END,
137
KM_SHIFT, KC_Y, 0x59, GSP_END,
138
KM_SHIFT, KC_U, 0x55, GSP_END,
139
KM_SHIFT, KC_I, 0x49, GSP_END,
140
KM_SHIFT, KC_O, 0x4f, GSP_END,
141
KM_SHIFT, KC_P, 0x50, GSP_END,
143
KM_SHIFT, KC_LBRACKET, 0x7b, GSP_END,
144
KM_SHIFT, KC_RBRACKET, 0x7d, GSP_END,
146
KM_SHIFT, KC_A, 0x41, GSP_END,
147
KM_SHIFT, KC_S, 0x53, GSP_END,
148
KM_SHIFT, KC_D, 0x44, GSP_END,
149
KM_SHIFT, KC_F, 0x46, GSP_END,
150
KM_SHIFT, KC_G, 0x47, GSP_END,
151
KM_SHIFT, KC_H, 0x48, GSP_END,
152
KM_SHIFT, KC_J, 0x4a, GSP_END,
153
KM_SHIFT, KC_K, 0x4b, GSP_END,
154
KM_SHIFT, KC_L, 0x4c, GSP_END,
156
KM_SHIFT, KC_SEMICOLON, 0x3a, GSP_END,
157
KM_SHIFT, KC_QUOTE, 0x22, GSP_END,
158
KM_SHIFT, KC_BACKSLASH, 0x7c, GSP_END,
160
KM_SHIFT, KC_Z, 0x5a, GSP_END,
161
KM_SHIFT, KC_X, 0x58, GSP_END,
162
KM_SHIFT, KC_C, 0x43, GSP_END,
163
KM_SHIFT, KC_V, 0x56, GSP_END,
164
KM_SHIFT, KC_B, 0x42, GSP_END,
165
KM_SHIFT, KC_N, 0x4e, GSP_END,
166
KM_SHIFT, KC_M, 0x4d, GSP_END,
168
KM_SHIFT, KC_COMMA, 0x3c, GSP_END,
169
KM_SHIFT, KC_PERIOD, 0x3e, GSP_END,
170
KM_SHIFT, KC_SLASH, 0x3f, GSP_END,
174
0, KC_SPACE, 0x20, GSP_END,
175
0, KC_ENTER, 0x0a, GSP_END,
176
0, KC_ENTER, 0x0d, GSP_END,
178
0, KC_ESCAPE, 0x1b, 0x1b, GSP_END,
180
0, KC_F1, 0x1b, 0x4f, 0x50, GSP_END,
181
0, KC_F2, 0x1b, 0x4f, 0x51, GSP_END,
182
0, KC_F3, 0x1b, 0x4f, 0x52, GSP_END,
183
0, KC_F4, 0x1b, 0x4f, 0x53, GSP_END,
184
0, KC_F5, 0x1b, 0x5b, 0x31, 0x35, 0x7e, GSP_END,
185
0, KC_F6, 0x1b, 0x5b, 0x31, 0x37, 0x7e, GSP_END,
186
0, KC_F7, 0x1b, 0x5b, 0x31, 0x38, 0x7e, GSP_END,
187
0, KC_F8, 0x1b, 0x5b, 0x31, 0x39, 0x7e, GSP_END,
188
0, KC_F9, 0x1b, 0x5b, 0x32, 0x30, 0x7e, GSP_END,
189
0, KC_F10, 0x1b, 0x5b, 0x32, 0x31, 0x7e, GSP_END,
190
0, KC_F11, 0x1b, 0x5b, 0x32, 0x33, 0x7e, GSP_END,
191
0, KC_F12, 0x1b, 0x5b, 0x32, 0x34, 0x7e, GSP_END,
193
0, KC_INSERT, 0x1b, 0x5b, 0x32, 0x7e, GSP_END,
194
0, KC_HOME, 0x1b, 0x5b, 0x48, GSP_END,
195
0, KC_PAGE_UP, 0x1b, 0x5b, 0x35, 0x7e, GSP_END,
196
0, KC_DELETE, 0x1b, 0x5b, 0x33, 0x7e, GSP_END,
197
0, KC_END, 0x1b, 0x5b, 0x46, GSP_END,
198
0, KC_PAGE_DOWN, 0x1b, 0x5b, 0x36, 0x7e, GSP_END,
200
0, KC_UP, 0x1b, 0x5b, 0x41, GSP_END,
201
0, KC_LEFT, 0x1b, 0x5b, 0x44, GSP_END,
202
0, KC_DOWN, 0x1b, 0x5b, 0x42, GSP_END,
203
0, KC_RIGHT, 0x1b, 0x5b, 0x43, GSP_END,
208
int kbd_ctl_init(void)
213
return gsp_insert_defs(&sp, seq_defs);
216
void kbd_ctl_parse_scancode(int scancode)
220
ds = gsp_step(&sp, ds, scancode, &mods, &key);
222
stroke_sim(mods, key);