[51d6f80] | 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 |
|
---|
[ce5bcb4] | 29 | /** @addtogroup kbdmips32 mips32
|
---|
| 30 | * @brief HelenOS mips32 arch dependent parts of uspace keyboard handler.
|
---|
| 31 | * @ingroup kbd
|
---|
| 32 | * @{
|
---|
| 33 | */
|
---|
| 34 | /** @file
|
---|
| 35 | */
|
---|
[51d6f80] | 36 | #include <arch/kbd.h>
|
---|
[38edb96] | 37 | #include <ipc/ipc.h>
|
---|
[ec5beb7d] | 38 | #include <sysinfo.h>
|
---|
[15039b67] | 39 | #include <kbd.h>
|
---|
| 40 | #include <keys.h>
|
---|
[d1c4b9e] | 41 |
|
---|
[ec5beb7d] | 42 | #define MSIM_KEY_F1 0x504f1bL
|
---|
| 43 | #define MSIM_KEY_F2 0x514f1bL
|
---|
| 44 | #define MSIM_KEY_F3 0x524f1bL
|
---|
| 45 | #define MSIM_KEY_F4 0x534f1bL
|
---|
| 46 | #define MSIM_KEY_F5 0x35315b1bL
|
---|
| 47 | #define MSIM_KEY_F6 0x37315b1bL
|
---|
| 48 | #define MSIM_KEY_F7 0x38315b1bL
|
---|
| 49 | #define MSIM_KEY_F8 0x39315b1bL
|
---|
| 50 | #define MSIM_KEY_F9 0x30325b1bL
|
---|
| 51 | #define MSIM_KEY_F10 0x31325b1bL
|
---|
| 52 | #define MSIM_KEY_F11 0x33325b1bL
|
---|
| 53 | #define MSIM_KEY_F12 0x34325b1bL
|
---|
| 54 |
|
---|
| 55 | #define GXEMUL_KEY_F1 0x504f5b1bL
|
---|
| 56 | #define GXEMUL_KEY_F2 0x514f5b1bL
|
---|
| 57 | #define GXEMUL_KEY_F3 0x524f5b1bL
|
---|
| 58 | #define GXEMUL_KEY_F4 0x534f5b1bL
|
---|
| 59 | #define GXEMUL_KEY_F5 0x35315b1bL
|
---|
| 60 | #define GXEMUL_KEY_F6 0x37315b1bL
|
---|
| 61 | #define GXEMUL_KEY_F7 0x38315b1bL
|
---|
| 62 | #define GXEMUL_KEY_F8 0x39315b1bL
|
---|
| 63 | #define GXEMUL_KEY_F9 0x38325b1bL
|
---|
| 64 | #define GXEMUL_KEY_F10 0x39325b1bL
|
---|
| 65 | #define GXEMUL_KEY_F11 0x33325b1bL
|
---|
| 66 | #define GXEMUL_KEY_F12 0x34325b1bL
|
---|
[d1c4b9e] | 67 |
|
---|
| 68 | #define FUNCTION_KEYS 0x100
|
---|
| 69 |
|
---|
[51d6f80] | 70 | irq_cmd_t msim_cmds[1] = {
|
---|
[494a54a] | 71 | { CMD_MEM_READ_1, (void *) 0, 0, 2 }
|
---|
[51d6f80] | 72 | };
|
---|
| 73 |
|
---|
| 74 | irq_code_t msim_kbd = {
|
---|
| 75 | 1,
|
---|
| 76 | msim_cmds
|
---|
| 77 | };
|
---|
| 78 |
|
---|
[ec5beb7d] | 79 | static int msim,gxemul;
|
---|
[f8d5b85] | 80 | static int fb_fb;
|
---|
| 81 |
|
---|
[ec5beb7d] | 82 |
|
---|
[a1c7827] | 83 | int kbd_arch_init(void)
|
---|
[51d6f80] | 84 | {
|
---|
[801579fe] | 85 | fb_fb = (sysinfo_value("fb.kind") == 1);
|
---|
[494a54a] | 86 | msim_cmds[0].addr = sysinfo_value("kbd.address.virtual");
|
---|
| 87 | ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"), 0, &msim_kbd);
|
---|
[15039b67] | 88 | return 0;
|
---|
[51d6f80] | 89 | }
|
---|
| 90 |
|
---|
[d1c4b9e] | 91 |
|
---|
[f8d5b85] | 92 | /*
|
---|
[ec5beb7d] | 93 | //*
|
---|
| 94 | //* Please preserve this code (it can be used to determine scancodes)
|
---|
| 95 | //*
|
---|
[d1c4b9e] | 96 | int to_hex(int v)
|
---|
| 97 | {
|
---|
| 98 | return "0123456789ABCDEF"[v];
|
---|
| 99 | }
|
---|
[f8d5b85] | 100 | */
|
---|
[d1c4b9e] | 101 |
|
---|
[f8d5b85] | 102 | static int kbd_arch_process_no_fb(keybuffer_t *keybuffer, int scan_code)
|
---|
[a1c7827] | 103 | {
|
---|
[d1c4b9e] | 104 |
|
---|
[801579fe] | 105 | static unsigned long buf = 0;
|
---|
| 106 | static int count = 0;
|
---|
[d1c4b9e] | 107 |
|
---|
[f8d5b85] | 108 | /* Please preserve this code (it can be used to determine scancodes)
|
---|
[d1c4b9e] | 109 |
|
---|
[f8d5b85] | 110 | keybuffer_push(keybuffer, to_hex((scan_code>>4)&0xf));
|
---|
| 111 | keybuffer_push(keybuffer, to_hex(scan_code&0xf));
|
---|
| 112 | keybuffer_push(keybuffer, ' ');
|
---|
| 113 | keybuffer_push(keybuffer, ' ');
|
---|
| 114 |
|
---|
| 115 | return 1;
|
---|
| 116 | */
|
---|
[d1c4b9e] | 117 |
|
---|
[801579fe] | 118 | if(scan_code == 0x7e) {
|
---|
| 119 | switch (buf) {
|
---|
| 120 | case MSIM_KEY_F5:
|
---|
| 121 | keybuffer_push(keybuffer,FUNCTION_KEYS | 5);
|
---|
| 122 | buf = count = 0;
|
---|
| 123 | return 1;
|
---|
| 124 | case MSIM_KEY_F6:
|
---|
| 125 | keybuffer_push(keybuffer,FUNCTION_KEYS | 6);
|
---|
| 126 | buf = count = 0;
|
---|
| 127 | return 1;
|
---|
| 128 | case MSIM_KEY_F7:
|
---|
| 129 | keybuffer_push(keybuffer,FUNCTION_KEYS | 7);
|
---|
| 130 | buf = count = 0;
|
---|
| 131 | return 1;
|
---|
| 132 | case MSIM_KEY_F8:
|
---|
| 133 | keybuffer_push(keybuffer,FUNCTION_KEYS | 8);
|
---|
| 134 | buf = count = 0;
|
---|
| 135 | return 1;
|
---|
| 136 | case MSIM_KEY_F9:
|
---|
| 137 | keybuffer_push(keybuffer,FUNCTION_KEYS | 9);
|
---|
| 138 | buf = count = 0;
|
---|
| 139 | return 1;
|
---|
| 140 | case MSIM_KEY_F10:
|
---|
| 141 | keybuffer_push(keybuffer,FUNCTION_KEYS | 10);
|
---|
| 142 | buf = count = 0;
|
---|
| 143 | return 1;
|
---|
| 144 | case MSIM_KEY_F11:
|
---|
| 145 | keybuffer_push(keybuffer,FUNCTION_KEYS | 11);
|
---|
| 146 | buf = count = 0;
|
---|
| 147 | return 1;
|
---|
| 148 | case MSIM_KEY_F12:
|
---|
| 149 | keybuffer_push(keybuffer,FUNCTION_KEYS | 12);
|
---|
| 150 | buf = count = 0;
|
---|
| 151 | return 1;
|
---|
| 152 | default:
|
---|
| 153 | keybuffer_push(keybuffer, buf & 0xff);
|
---|
| 154 | keybuffer_push(keybuffer, (buf >> 8) &0xff);
|
---|
| 155 | keybuffer_push(keybuffer, (buf >> 16) &0xff);
|
---|
| 156 | keybuffer_push(keybuffer, (buf >> 24) &0xff);
|
---|
| 157 | keybuffer_push(keybuffer, scan_code);
|
---|
| 158 | buf = count = 0;
|
---|
| 159 | return 1;
|
---|
[d1c4b9e] | 160 | }
|
---|
| 161 | }
|
---|
| 162 |
|
---|
[801579fe] | 163 | buf |= ((unsigned long) scan_code)<<(8*(count++));
|
---|
[d1c4b9e] | 164 |
|
---|
[801579fe] | 165 | if((buf & 0xff) != (MSIM_KEY_F1 & 0xff)) {
|
---|
| 166 | keybuffer_push(keybuffer, buf);
|
---|
| 167 | buf = count = 0;
|
---|
[d1c4b9e] | 168 | return 1;
|
---|
| 169 | }
|
---|
| 170 |
|
---|
[801579fe] | 171 | if (count <= 1)
|
---|
[d1c4b9e] | 172 | return 1;
|
---|
| 173 |
|
---|
[801579fe] | 174 | if ((buf & 0xffff) != (MSIM_KEY_F1 & 0xffff)
|
---|
| 175 | && (buf & 0xffff) != (MSIM_KEY_F5 & 0xffff) ) {
|
---|
[d1c4b9e] | 176 |
|
---|
[801579fe] | 177 | keybuffer_push(keybuffer, buf & 0xff);
|
---|
| 178 | keybuffer_push(keybuffer, (buf >> 8) &0xff);
|
---|
| 179 | buf = count = 0;
|
---|
[d1c4b9e] | 180 | return 1;
|
---|
| 181 | }
|
---|
| 182 |
|
---|
[801579fe] | 183 | if (count <= 2)
|
---|
[d1c4b9e] | 184 | return 1;
|
---|
| 185 |
|
---|
[801579fe] | 186 | switch (buf) {
|
---|
| 187 | case MSIM_KEY_F1:
|
---|
| 188 | keybuffer_push(keybuffer,FUNCTION_KEYS | 1);
|
---|
| 189 | buf = count = 0;
|
---|
| 190 | return 1;
|
---|
| 191 | case MSIM_KEY_F2:
|
---|
| 192 | keybuffer_push(keybuffer,FUNCTION_KEYS | 2);
|
---|
| 193 | buf = count = 0;
|
---|
| 194 | return 1;
|
---|
| 195 | case MSIM_KEY_F3:
|
---|
| 196 | keybuffer_push(keybuffer,FUNCTION_KEYS | 3);
|
---|
| 197 | buf = count = 0;
|
---|
| 198 | return 1;
|
---|
| 199 | case MSIM_KEY_F4:
|
---|
| 200 | keybuffer_push(keybuffer,FUNCTION_KEYS | 4);
|
---|
| 201 | buf = count = 0;
|
---|
| 202 | return 1;
|
---|
[d1c4b9e] | 203 | }
|
---|
| 204 |
|
---|
| 205 |
|
---|
[801579fe] | 206 | if((buf & 0xffffff) != (MSIM_KEY_F5 & 0xffffff)
|
---|
| 207 | && (buf & 0xffffff) != (MSIM_KEY_F9 & 0xffffff)) {
|
---|
[d1c4b9e] | 208 |
|
---|
[801579fe] | 209 | keybuffer_push(keybuffer, buf & 0xff);
|
---|
| 210 | keybuffer_push(keybuffer, (buf >> 8) & 0xff);
|
---|
| 211 | keybuffer_push(keybuffer, (buf >> 16) & 0xff);
|
---|
[d1c4b9e] | 212 | buf=count=0;
|
---|
| 213 | return 1;
|
---|
| 214 | }
|
---|
| 215 |
|
---|
[801579fe] | 216 | if (count <= 3)
|
---|
[d1c4b9e] | 217 | return 1;
|
---|
| 218 |
|
---|
[801579fe] | 219 | switch (buf) {
|
---|
| 220 | case MSIM_KEY_F5:
|
---|
| 221 | case MSIM_KEY_F6:
|
---|
| 222 | case MSIM_KEY_F7:
|
---|
| 223 | case MSIM_KEY_F8:
|
---|
| 224 | case MSIM_KEY_F9:
|
---|
| 225 | case MSIM_KEY_F10:
|
---|
| 226 | case MSIM_KEY_F11:
|
---|
| 227 | case MSIM_KEY_F12:
|
---|
| 228 | return 1;
|
---|
| 229 | default:
|
---|
| 230 | keybuffer_push(keybuffer, buf & 0xff);
|
---|
| 231 | keybuffer_push(keybuffer, (buf >> 8) &0xff);
|
---|
| 232 | keybuffer_push(keybuffer, (buf >> 16) &0xff);
|
---|
| 233 | keybuffer_push(keybuffer, (buf >> 24) &0xff);
|
---|
| 234 | buf = count = 0;
|
---|
| 235 | return 1;
|
---|
| 236 | }
|
---|
[ec5beb7d] | 237 | return 1;
|
---|
| 238 | }
|
---|
| 239 |
|
---|
| 240 |
|
---|
| 241 |
|
---|
[f8d5b85] | 242 | static int kbd_arch_process_fb(keybuffer_t *keybuffer, int scan_code)
|
---|
[ec5beb7d] | 243 | {
|
---|
[801579fe] | 244 | static unsigned long buf = 0;
|
---|
| 245 | static int count = 0;
|
---|
[ec5beb7d] | 246 |
|
---|
[f8d5b85] | 247 | /* Please preserve this code (it can be used to determine scancodes)
|
---|
[ec5beb7d] | 248 |
|
---|
[f8d5b85] | 249 | keybuffer_push(keybuffer, to_hex((scan_code>>4)&0xf));
|
---|
| 250 | keybuffer_push(keybuffer, to_hex(scan_code&0xf));
|
---|
| 251 | keybuffer_push(keybuffer, ' ');
|
---|
| 252 | keybuffer_push(keybuffer, ' ');
|
---|
| 253 |
|
---|
| 254 | return 1;
|
---|
| 255 | */
|
---|
[e8d77a4] | 256 |
|
---|
[801579fe] | 257 | if (scan_code == '\r')
|
---|
| 258 | scan_code = '\n';
|
---|
[e8d77a4] | 259 |
|
---|
[801579fe] | 260 | buf |= ((unsigned long) scan_code)<<(8*(count++));
|
---|
[ec5beb7d] | 261 |
|
---|
| 262 |
|
---|
[801579fe] | 263 | if ((buf & 0xff) != (GXEMUL_KEY_F1 & 0xff)) {
|
---|
| 264 | keybuffer_push(keybuffer, buf);
|
---|
| 265 | buf = count = 0;
|
---|
[ec5beb7d] | 266 | return 1;
|
---|
| 267 | }
|
---|
| 268 |
|
---|
[801579fe] | 269 | if (count <= 1)
|
---|
[ec5beb7d] | 270 | return 1;
|
---|
| 271 |
|
---|
[801579fe] | 272 | if ((buf & 0xffff) != (GXEMUL_KEY_F1 & 0xffff)) {
|
---|
| 273 | keybuffer_push(keybuffer, buf & 0xff);
|
---|
| 274 | keybuffer_push(keybuffer, (buf >> 8) &0xff);
|
---|
| 275 | buf = count = 0;
|
---|
[ec5beb7d] | 276 | return 1;
|
---|
| 277 | }
|
---|
| 278 |
|
---|
[801579fe] | 279 | if (count <= 2)
|
---|
[ec5beb7d] | 280 | return 1;
|
---|
| 281 |
|
---|
| 282 |
|
---|
[801579fe] | 283 | if ((buf & 0xffffff) != (GXEMUL_KEY_F1 & 0xffffff)
|
---|
| 284 | && (buf & 0xffffff) != (GXEMUL_KEY_F5 & 0xffffff)
|
---|
| 285 | && (buf & 0xffffff) != (GXEMUL_KEY_F9 & 0xffffff)) {
|
---|
[ec5beb7d] | 286 |
|
---|
[801579fe] | 287 | keybuffer_push(keybuffer, buf & 0xff);
|
---|
| 288 | keybuffer_push(keybuffer, (buf >> 8) & 0xff);
|
---|
| 289 | keybuffer_push(keybuffer, (buf >> 16) & 0xff);
|
---|
| 290 | buf = count = 0;
|
---|
[ec5beb7d] | 291 | return 1;
|
---|
| 292 | }
|
---|
| 293 |
|
---|
| 294 | if ( count <= 3 )
|
---|
| 295 | return 1;
|
---|
| 296 |
|
---|
| 297 |
|
---|
[801579fe] | 298 | switch (buf) {
|
---|
| 299 | case GXEMUL_KEY_F1:
|
---|
| 300 | keybuffer_push(keybuffer,FUNCTION_KEYS | 1 );
|
---|
| 301 | buf=count=0;
|
---|
| 302 | return 1;
|
---|
| 303 | case GXEMUL_KEY_F2:
|
---|
| 304 | keybuffer_push(keybuffer,FUNCTION_KEYS | 2 );
|
---|
| 305 | buf=count=0;
|
---|
| 306 | return 1;
|
---|
| 307 | case GXEMUL_KEY_F3:
|
---|
| 308 | keybuffer_push(keybuffer,FUNCTION_KEYS | 3 );
|
---|
| 309 | buf=count=0;
|
---|
| 310 | return 1;
|
---|
| 311 | case GXEMUL_KEY_F4:
|
---|
| 312 | keybuffer_push(keybuffer,FUNCTION_KEYS | 4 );
|
---|
| 313 | buf=count=0;
|
---|
| 314 | return 1;
|
---|
| 315 | case GXEMUL_KEY_F5:
|
---|
| 316 | keybuffer_push(keybuffer,FUNCTION_KEYS | 5 );
|
---|
| 317 | buf=count=0;
|
---|
| 318 | return 1;
|
---|
| 319 | case GXEMUL_KEY_F6:
|
---|
| 320 | keybuffer_push(keybuffer,FUNCTION_KEYS | 6 );
|
---|
| 321 | buf=count=0;
|
---|
| 322 | return 1;
|
---|
| 323 | case GXEMUL_KEY_F7:
|
---|
| 324 | keybuffer_push(keybuffer,FUNCTION_KEYS | 7 );
|
---|
| 325 | buf=count=0;
|
---|
| 326 | return 1;
|
---|
| 327 | case GXEMUL_KEY_F8:
|
---|
| 328 | keybuffer_push(keybuffer,FUNCTION_KEYS | 8 );
|
---|
| 329 | buf=count=0;
|
---|
| 330 | return 1;
|
---|
| 331 | case GXEMUL_KEY_F9:
|
---|
| 332 | keybuffer_push(keybuffer,FUNCTION_KEYS | 9 );
|
---|
| 333 | buf=count=0;
|
---|
| 334 | return 1;
|
---|
| 335 | case GXEMUL_KEY_F10:
|
---|
| 336 | keybuffer_push(keybuffer,FUNCTION_KEYS | 10 );
|
---|
| 337 | buf=count=0;
|
---|
| 338 | return 1;
|
---|
| 339 | case GXEMUL_KEY_F11:
|
---|
| 340 | keybuffer_push(keybuffer,FUNCTION_KEYS | 11 );
|
---|
| 341 | buf=count=0;
|
---|
| 342 | return 1;
|
---|
| 343 | case GXEMUL_KEY_F12:
|
---|
| 344 | keybuffer_push(keybuffer,FUNCTION_KEYS | 12 );
|
---|
| 345 | buf=count=0;
|
---|
| 346 | return 1;
|
---|
| 347 | default:
|
---|
| 348 | keybuffer_push(keybuffer, buf & 0xff );
|
---|
| 349 | keybuffer_push(keybuffer, (buf >> 8) &0xff );
|
---|
| 350 | keybuffer_push(keybuffer, (buf >> 16) &0xff );
|
---|
| 351 | keybuffer_push(keybuffer, (buf >> 24) &0xff );
|
---|
| 352 | buf=count=0;
|
---|
| 353 | return 1;
|
---|
| 354 | }
|
---|
[d1c4b9e] | 355 | return 1;
|
---|
[a1c7827] | 356 | }
|
---|
[ec5beb7d] | 357 |
|
---|
[15039b67] | 358 | int kbd_arch_process(keybuffer_t *keybuffer, ipc_call_t *call)
|
---|
[ec5beb7d] | 359 | {
|
---|
[15039b67] | 360 | int scan_code = IPC_GET_ARG2(*call);
|
---|
[b7e9c34] | 361 | static int esc_count=0;
|
---|
| 362 |
|
---|
[801579fe] | 363 | if (scan_code == 0x1b) {
|
---|
[b7e9c34] | 364 | esc_count++;
|
---|
[801579fe] | 365 | if (esc_count == 3)
|
---|
[b7e9c34] | 366 | __SYSCALL0(SYS_DEBUG_ENABLE_CONSOLE);
|
---|
| 367 | } else {
|
---|
| 368 | esc_count=0;
|
---|
| 369 | }
|
---|
| 370 |
|
---|
[801579fe] | 371 | if (fb_fb)
|
---|
| 372 | return kbd_arch_process_fb(keybuffer, scan_code);
|
---|
[b7e9c34] | 373 |
|
---|
[801579fe] | 374 | return kbd_arch_process_no_fb(keybuffer, scan_code);
|
---|
[ec5beb7d] | 375 | }
|
---|
[f8d5b85] | 376 | /** @}
|
---|
| 377 | */
|
---|