Subversion Repositories HelenOS-historic

Rev

Rev 1629 | Rev 1649 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1608 decky 1
/*
1626 decky 2
 * Copyright (C) 2006 Martin Decky
1608 decky 3
 * All rights reserved.
4
 *
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions
7
 * are met:
8
 *
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.
16
 *
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.
27
 */
28
 
29
#include <arch/kbd.h>
30
#include <ipc/ipc.h>
1626 decky 31
#include <sysinfo.h>
1608 decky 32
 
1626 decky 33
irq_cmd_t cuda_cmds[1] = {
34
    { CMD_PPC32_GETCHAR, 0, 0 }
35
};
36
 
37
irq_code_t cuda_kbd = {
38
    1,
39
    cuda_cmds
40
};
41
 
42
 
1634 decky 43
#define SPECIAL     255
44
#define FUNCTION_KEYS 0x100
45
 
46
 
47
static int lchars[0x80] = {
48
    'a',
49
    's',
50
    'd',
51
    'f',
52
    'h',
53
    'g',
54
    'z',
55
    'x',
56
    'c',
57
    'v',
58
    SPECIAL,
59
    'b',
60
    'q',
61
    'w',
62
    'e',
63
    'r',
64
    'y',
65
    't',
66
    '1',
67
    '2',
68
    '3',
69
    '4',
70
    '6',
71
    '5',
72
    '=',
73
    '9',
74
    '7',
75
    '-',
76
    '8',
77
    '0',
78
    ']',
79
    'o',
80
    'u',
81
    '[',
82
    'i',
83
    'p',
84
    '\n',                 /* Enter */
85
    'l',
86
    'j',
87
    '\'',
88
    'k',
89
    ';',
90
    '\\',
91
    ',',
92
    '/',
93
    'n',
94
    'm',
95
    '.',
96
    '\t',                 /* Tab */
97
    ' ',
98
    '`',
99
    '\b',                 /* Backspace */
100
    SPECIAL,
101
    SPECIAL,              /* Escape */
102
    SPECIAL,              /* Ctrl */
103
    SPECIAL,              /* Alt */
104
    SPECIAL,              /* Shift */
105
    SPECIAL,              /* Caps-Lock */
106
    SPECIAL,              /* RAlt */
107
    SPECIAL,              /* Left */
108
    SPECIAL,              /* Right */
109
    SPECIAL,              /* Down */
110
    SPECIAL,              /* Up */
111
    SPECIAL,
112
    SPECIAL,
113
    '.',                  /* Keypad . */
114
    SPECIAL,
115
    '*',                  /* Keypad * */
116
    SPECIAL,
117
    '+',                  /* Keypad + */
118
    SPECIAL,
119
    SPECIAL,              /* NumLock */
120
    SPECIAL,
121
    SPECIAL,
122
    SPECIAL,
123
    '/',                  /* Keypad / */
124
    '\n',                 /* Keypad Enter */
125
    SPECIAL,
126
    '-',                  /* Keypad - */
127
    SPECIAL,
128
    SPECIAL,
129
    SPECIAL,
130
    '0',                  /* Keypad 0 */
131
    '1',                  /* Keypad 1 */
132
    '2',                  /* Keypad 2 */
133
    '3',                  /* Keypad 3 */
134
    '4',                  /* Keypad 4 */
135
    '5',                  /* Keypad 5 */
136
    '6',                  /* Keypad 6 */
137
    '7',                  /* Keypad 7 */
138
    SPECIAL,
139
    '8',                  /* Keypad 8 */
140
    '9',                  /* Keypad 9 */
141
    SPECIAL,
142
    SPECIAL,
143
    SPECIAL,
144
    (FUNCTION_KEYS | 5),  /* F5 */
145
    (FUNCTION_KEYS | 6),  /* F6 */
146
    (FUNCTION_KEYS | 7),  /* F7 */
147
    (FUNCTION_KEYS | 3),  /* F3 */
148
    (FUNCTION_KEYS | 8),  /* F8 */
149
    (FUNCTION_KEYS | 9),  /* F9 */
150
    SPECIAL,
151
    (FUNCTION_KEYS | 11), /* F11 */
152
    SPECIAL,
153
    (FUNCTION_KEYS | 13), /* F13 */
154
    SPECIAL,
155
    SPECIAL,              /* ScrollLock */
156
    SPECIAL,
157
    (FUNCTION_KEYS | 10), /* F10 */
158
    SPECIAL,
159
    (FUNCTION_KEYS | 12), /* F12 */
160
    SPECIAL,
161
    SPECIAL,              /* Pause */
162
    SPECIAL,              /* Insert */
163
    SPECIAL,              /* Home */
164
    SPECIAL,              /* PageUp */
165
    SPECIAL,              /* Delete */
166
    (FUNCTION_KEYS | 4),  /* F4 */
167
    SPECIAL,              /* End */
168
    (FUNCTION_KEYS | 2),  /* F2 */
169
    SPECIAL,              /* PageDown */
170
    (FUNCTION_KEYS | 1)   /* F1 */
1629 decky 171
};
172
 
173
 
1608 decky 174
int kbd_arch_init(void)
175
{
1626 decky 176
    return (!ipc_register_irq(sysinfo_value("cuda.irq"), &cuda_kbd));
1608 decky 177
}
178
 
1626 decky 179
 
180
int kbd_arch_process(keybuffer_t *keybuffer, int scan_code)
1608 decky 181
{
1634 decky 182
    if (scan_code != -1) {
183
        uint8_t scancode = (uint8_t) scan_code;
1629 decky 184
 
1634 decky 185
        if ((scancode & 0x80) != 0x80) {
186
            int key = lchars[scancode & 0x7f];
187
 
188
            if (key != SPECIAL)
189
                keybuffer_push(keybuffer, key);
190
        }
191
    }
1629 decky 192
 
1608 decky 193
    return 1;
194
}