Subversion Repositories HelenOS-historic

Rev

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

Rev Author Line No. Line
1339 cejka 1
/*
2
 * Copyright (C) 2006 Josef Cejka
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>
1353 jermar 30
#include <ipc/ipc.h>
1339 cejka 31
 
1622 vana 32
 
33
#define KEY_F1 0x504f1bL
34
#define KEY_F2 0x514f1bL
35
#define KEY_F3 0x524f1bL
36
#define KEY_F4 0x534f1bL
37
#define KEY_F5 0x35315b1bL
38
#define KEY_F6 0x37315b1bL
39
#define KEY_F7 0x38315b1bL
40
#define KEY_F8 0x39315b1bL
41
#define KEY_F9 0x30325b1bL
42
#define KEY_F10 0x31325b1bL
43
#define KEY_F11 0x33325b1bL
44
#define KEY_F12 0x34325b1bL
45
 
46
 
47
#define FUNCTION_KEYS 0x100
48
 
49
 
1339 cejka 50
irq_cmd_t msim_cmds[1] = {
51
    { CMD_MEM_READ_1, (void *)0xB0000000, 0 }
52
};
53
 
54
irq_code_t msim_kbd = {
55
    1,
56
    msim_cmds
57
};
58
 
1347 palkovsky 59
int kbd_arch_init(void)
1339 cejka 60
{
61
    ipc_register_irq(2, &msim_kbd);
1347 palkovsky 62
    return 1;
1339 cejka 63
}
64
 
1622 vana 65
 
66
/*
67
*
68
* Please preserve this code (it can be used to determine scancodes)
69
*
70
int to_hex(int v)
71
{
72
        return "0123456789ABCDEF"[v];
73
}
74
*/
75
 
1451 cejka 76
int kbd_arch_process(keybuffer_t *keybuffer, int scan_code)
1347 palkovsky 77
{
1622 vana 78
 
79
    static unsigned long buf=0;
80
    static int count=0;
81
 
82
 
83
    //* Please preserve this code (it can be used to determine scancodes)
84
    //*
85
    //keybuffer_push(keybuffer, to_hex((scan_code>>4)&0xf));
86
    //keybuffer_push(keybuffer, to_hex(scan_code&0xf));
87
    //keybuffer_push(keybuffer, ' ');
88
    //keybuffer_push(keybuffer, ' ');
89
    //*/
90
    //return 1;
91
 
92
 
93
    if(scan_code==0x7e)
94
    {
95
        switch (buf){
96
            case KEY_F5:
97
                keybuffer_push(keybuffer,FUNCTION_KEYS | 5 );
98
                buf=count=0;
99
                return 1;
100
            case KEY_F6:
101
                keybuffer_push(keybuffer,FUNCTION_KEYS | 6 );
102
                buf=count=0;
103
                return 1;
104
            case KEY_F7:
105
                keybuffer_push(keybuffer,FUNCTION_KEYS | 7 );
106
                buf=count=0;
107
                return 1;
108
            case KEY_F8:
109
                keybuffer_push(keybuffer,FUNCTION_KEYS | 8 );
110
                buf=count=0;
111
                return 1;
112
 
113
            case KEY_F9:
114
                keybuffer_push(keybuffer,FUNCTION_KEYS | 9 );
115
                buf=count=0;
116
                return 1;
117
            case KEY_F10:
118
                keybuffer_push(keybuffer,FUNCTION_KEYS | 10 );
119
                buf=count=0;
120
                return 1;
121
 
122
            case KEY_F11:
123
                keybuffer_push(keybuffer,FUNCTION_KEYS | 11 );
124
                buf=count=0;
125
                return 1;
126
            case KEY_F12:
127
                keybuffer_push(keybuffer,FUNCTION_KEYS | 12 );
128
                buf=count=0;
129
                return 1;
130
            default:
131
                keybuffer_push(keybuffer, buf & 0xff );
132
                keybuffer_push(keybuffer, (buf >> 8) &0xff );
133
                keybuffer_push(keybuffer, (buf >> 16) &0xff );
134
                keybuffer_push(keybuffer, (buf >> 24) &0xff );
135
                keybuffer_push(keybuffer, scan_code );
136
                buf=count=0;
137
                return 1;
138
 
139
        }
140
    }
141
 
142
    buf|=((unsigned long) scan_code)<<(8*(count++));
143
 
144
 
145
    if((buf & 0xff)!= (KEY_F1 & 0xff)) {
146
 
147
        keybuffer_push(keybuffer,buf );
148
        buf=count=0;
149
        return 1;
150
    }
151
 
152
    if ( count <= 1 )
153
        return 1;
154
 
155
    if(    (buf & 0xffff) != (KEY_F1 & 0xffff)
156
        && (buf & 0xffff) != (KEY_F5 & 0xffff) ) {
157
 
158
        keybuffer_push(keybuffer, buf & 0xff );
159
        keybuffer_push(keybuffer, (buf >> 8) &0xff );
160
        buf=count=0;
161
        return 1;
162
    }
163
 
164
    if ( count <= 2)
165
        return 1;
166
 
167
    switch (buf){
168
        case KEY_F1:
169
            keybuffer_push(keybuffer,FUNCTION_KEYS | 1 );
170
            buf=count=0;
171
            return 1;
172
        case KEY_F2:
173
            keybuffer_push(keybuffer,FUNCTION_KEYS | 2 );
174
            buf=count=0;
175
            return 1;
176
        case KEY_F3:
177
            keybuffer_push(keybuffer,FUNCTION_KEYS | 3 );
178
            buf=count=0;
179
            return 1;
180
        case KEY_F4:
181
            keybuffer_push(keybuffer,FUNCTION_KEYS | 4 );
182
            buf=count=0;
183
            return 1;
184
    }
185
 
186
 
187
    if(    (buf & 0xffffff) != (KEY_F5 & 0xffffff)
188
        && (buf & 0xffffff) != (KEY_F9 & 0xffffff) ) {
189
 
190
        keybuffer_push(keybuffer, buf & 0xff );
191
        keybuffer_push(keybuffer, (buf >> 8) &0xff );
192
        keybuffer_push(keybuffer, (buf >> 16) &0xff );
193
        buf=count=0;
194
        return 1;
195
    }
196
 
197
    if ( count <= 3 )
198
        return 1;
199
 
200
 
201
 
202
 
203
    switch (buf){
204
        case KEY_F5:
205
        case KEY_F6:
206
        case KEY_F7:
207
        case KEY_F8:
208
        case KEY_F9:
209
        case KEY_F10:
210
        case KEY_F11:
211
        case KEY_F12:
212
            return 1;
213
        default:
214
            keybuffer_push(keybuffer, buf & 0xff );
215
            keybuffer_push(keybuffer, (buf >> 8) &0xff );
216
            keybuffer_push(keybuffer, (buf >> 16) &0xff );
217
            keybuffer_push(keybuffer, (buf >> 24) &0xff );
218
            buf=count=0;
219
            return 1;
220
 
221
        }
222
    return 1;
1347 palkovsky 223
}