Subversion Repositories HelenOS

Rev

Rev 4343 | Rev 4346 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4343 Rev 4344
Line 38... Line 38...
38
#include <kbd.h>
38
#include <kbd.h>
39
#include <kbd/kbd.h>
39
#include <kbd/kbd.h>
40
#include <kbd/keycode.h>
40
#include <kbd/keycode.h>
41
#include <kbd_ctl.h>
41
#include <kbd_ctl.h>
42
 
42
 
43
static int scanmap_simple[];
-
 
44
 
-
 
45
void kbd_ctl_parse_scancode(int scancode)
-
 
46
{
-
 
47
    kbd_ev_type_t type;
-
 
48
    unsigned int key;
43
enum dec_state {
49
 
-
 
50
    if (scancode < 0 || scancode >= 0x100)
-
 
51
        return;
44
    ds_s,
52
 
-
 
53
    if (scancode & 0x80) {
-
 
54
        scancode &= ~0x80;
-
 
55
        type = KE_RELEASE;
-
 
56
    } else {
45
    ds_e
57
        type = KE_PRESS;
-
 
58
    }
46
};
59
 
47
 
60
    key = scanmap_simple[scancode];
-
 
61
    if (key != 0)
-
 
62
        kbd_push_ev(type, key, 0);
48
static enum dec_state ds = ds_s;
63
}
-
 
64
 
49
 
65
static int scanmap_simple[128] = {
50
static int scanmap_simple[] = {
66
 
51
 
67
    [0x29] = KC_BACKTICK,
52
    [0x29] = KC_BACKTICK,
68
 
53
 
69
    [0x02] = KC_1,
54
    [0x02] = KC_1,
70
    [0x03] = KC_2,
55
    [0x03] = KC_2,
Line 148... Line 133...
148
    [0x44] = KC_F10,
133
    [0x44] = KC_F10,
149
 
134
 
150
    [0x57] = KC_F11,
135
    [0x57] = KC_F11,
151
    [0x58] = KC_F12,
136
    [0x58] = KC_F12,
152
 
137
 
-
 
138
    [0x46] = KC_SCROLL_LOCK,
-
 
139
 
153
    [0x1c] = KC_ENTER
140
    [0x1c] = KC_ENTER,
154
 
141
 
-
 
142
    [0x45] = KC_NUM_LOCK,
-
 
143
    [0x37] = KC_NTIMES,
-
 
144
    [0x4a] = KC_NMINUS,
-
 
145
    [0x4e] = KC_NPLUS,
-
 
146
    [0x47] = KC_N7,
-
 
147
    [0x48] = KC_N8,
-
 
148
    [0x49] = KC_N9,
155
/*
149
    [0x4b] = KC_N4,
156
    [0x1] = KC_PRNSCR,
150
    [0x4c] = KC_N5,
-
 
151
    [0x4d] = KC_N6,
-
 
152
    [0x4f] = KC_N1,
157
    [0x1] = KC_SCROLL_LOCK,
153
    [0x50] = KC_N2,
158
    [0x1] = KC_PAUSE,
154
    [0x51] = KC_N3,
159
*/
155
    [0x52] = KC_N0,
-
 
156
    [0x53] = KC_NPERIOD
160
};
157
};
161
 
158
 
-
 
159
static int scanmap_e0[] = {
-
 
160
    [0x38] = KC_RALT,
-
 
161
    [0x1d] = KC_RSHIFT,
-
 
162
 
-
 
163
    [0x37] = KC_PRTSCR,
-
 
164
 
-
 
165
    [0x52] = KC_INSERT,
-
 
166
    [0x47] = KC_HOME,
-
 
167
    [0x49] = KC_PAGE_UP,
-
 
168
 
-
 
169
    [0x53] = KC_DELETE,
-
 
170
    [0x4f] = KC_END,
-
 
171
    [0x51] = KC_PAGE_DOWN,
-
 
172
 
-
 
173
    [0x48] = KC_UP,
-
 
174
    [0x4b] = KC_LEFT,
-
 
175
    [0x50] = KC_DOWN,
-
 
176
    [0x4d] = KC_RIGHT,
-
 
177
 
-
 
178
    [0x35] = KC_NSLASH,
-
 
179
    [0x1c] = KC_NENTER
-
 
180
};
-
 
181
 
-
 
182
 
-
 
183
void kbd_ctl_parse_scancode(int scancode)
-
 
184
{
-
 
185
    kbd_ev_type_t type;
-
 
186
    unsigned int key;
-
 
187
    int *map;
-
 
188
    size_t map_length;
-
 
189
 
-
 
190
    if (scancode == 0xe0) {
-
 
191
        ds = ds_e;
-
 
192
        return;
-
 
193
    }
-
 
194
 
-
 
195
    switch (ds) {
-
 
196
    case ds_s:
-
 
197
        map = scanmap_simple;
-
 
198
        map_length = sizeof(scanmap_simple) / sizeof(int);
-
 
199
        break;
-
 
200
    case ds_e:
-
 
201
        map = scanmap_e0;
-
 
202
        map_length = sizeof(scanmap_e0) / sizeof(int);
-
 
203
        break;
-
 
204
    }
-
 
205
 
-
 
206
    ds = ds_s;
-
 
207
 
-
 
208
    if (scancode & 0x80) {
-
 
209
        scancode &= ~0x80;
-
 
210
        type = KE_RELEASE;
-
 
211
    } else {
-
 
212
        type = KE_PRESS;
-
 
213
    }
-
 
214
 
-
 
215
    if (scancode < 0 || scancode >= map_length)
-
 
216
        return;
-
 
217
 
-
 
218
    key = map[scancode];
-
 
219
    if (key != 0)
-
 
220
        kbd_push_ev(type, key);
-
 
221
}
-
 
222
 
162
/**
223
/**
163
 * @}
224
 * @}
164
 */
225
 */