Subversion Repositories HelenOS

Rev

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

Rev 3933 Rev 3942
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];
48
static enum dec_state ds = ds_s;
61
    if (key != 0)
-
 
62
        kbd_push_ev(type, key);
-
 
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
 
153
    [0x1c] = KC_ENTER
138
    [0x1c] = KC_ENTER,
154
 
139
 
-
 
140
    [0x45] = KC_NUM_LOCK,
-
 
141
    [0x37] = KC_NTIMES,
-
 
142
    [0x4a] = KC_NMINUS,
-
 
143
    [0x4e] = KC_NPLUS,
-
 
144
    [0x47] = KC_N7,
-
 
145
    [0x48] = KC_N8,
-
 
146
    [0x49] = KC_N9,
155
/*
147
    [0x4b] = KC_N4,
156
    [0x1] = KC_PRNSCR,
148
    [0x4c] = KC_N5,
-
 
149
    [0x4d] = KC_N6,
-
 
150
    [0x4f] = KC_N1,
157
    [0x1] = KC_SCROLL_LOCK,
151
    [0x50] = KC_N2,
158
    [0x1] = KC_PAUSE,
152
    [0x51] = KC_N3,
159
*/
153
    [0x52] = KC_N0,
-
 
154
    [0x53] = KC_NPERIOD
160
};
155
};
161
 
156
 
-
 
157
static int scanmap_e0[] = {
-
 
158
    [0x38] = KC_RALT,
-
 
159
    [0x1d] = KC_RSHIFT,
-
 
160
 
-
 
161
    [0x37] = KC_PRTSCR,
-
 
162
    [0x52] = KC_INSERT,
-
 
163
    [0x49] = KC_PAGE_UP,
-
 
164
 
-
 
165
    [0x53] = KC_DELETE,
-
 
166
    [0x4f] = KC_END,
-
 
167
    [0x51] = KC_PAGE_DOWN,
-
 
168
 
-
 
169
    [0x48] = KC_UP,
-
 
170
    [0x4b] = KC_LEFT,
-
 
171
    [0x50] = KC_DOWN,
-
 
172
    [0x4d] = KC_RIGHT,
-
 
173
 
-
 
174
    [0x35] = KC_NSLASH,
-
 
175
    [0x1c] = KC_NENTER
-
 
176
};
-
 
177
 
-
 
178
 
-
 
179
void kbd_ctl_parse_scancode(int scancode)
-
 
180
{
-
 
181
    kbd_ev_type_t type;
-
 
182
    unsigned int key;
-
 
183
    int *map;
-
 
184
    size_t map_length;
-
 
185
 
-
 
186
    if (scancode == 0xe0) {
-
 
187
        ds = ds_e;
-
 
188
        return;
-
 
189
    }
-
 
190
 
-
 
191
    switch (ds) {
-
 
192
    case ds_s:
-
 
193
        map = scanmap_simple;
-
 
194
        map_length = sizeof(scanmap_simple) / sizeof(int);
-
 
195
        break;
-
 
196
    case ds_e:
-
 
197
        map = scanmap_e0;
-
 
198
        map_length = sizeof(scanmap_e0) / sizeof(int);
-
 
199
        break;
-
 
200
    }
-
 
201
 
-
 
202
    ds = ds_s;
-
 
203
 
-
 
204
    if (scancode & 0x80) {
-
 
205
        scancode &= ~0x80;
-
 
206
        type = KE_RELEASE;
-
 
207
    } else {
-
 
208
        type = KE_PRESS;
-
 
209
    }
-
 
210
 
-
 
211
    if (scancode < 0 || scancode >= map_length)
-
 
212
        return;
-
 
213
 
-
 
214
    key = map[scancode];
-
 
215
    if (key != 0)
-
 
216
        kbd_push_ev(type, key);
-
 
217
}
-
 
218
 
162
/**
219
/**
163
 * @}
220
 * @}
164
 */
221
 */