42,6 → 42,7 |
#include <bool.h> |
|
|
/* GXemul key codes in no-framebuffer mode. */ |
#define GXEMUL_KEY_F1 0x504f1bL |
#define GXEMUL_KEY_F2 0x514f1bL |
#define GXEMUL_KEY_F3 0x524f1bL |
55,7 → 56,10 |
#define GXEMUL_KEY_F11 0x33325d1bL |
#define GXEMUL_KEY_F12 0x34325b1bL |
|
/** Start code of F5-F12 keys. */ |
#define GXEMUL_KEY_F5_F12_START_CODE 0x7e |
|
/* GXemul key codes in framebuffer mode. */ |
#define GXEMUL_FB_KEY_F1 0x504f5b1bL |
#define GXEMUL_FB_KEY_F2 0x514f5b1bL |
#define GXEMUL_FB_KEY_F3 0x524f5b1bL |
103,28 → 107,33 |
|
/** Process data sent when a key is pressed (in no-framebuffer mode). |
* |
* @param keybuffer Buffer of scan codes. |
* @param keybuffer Buffer of pressed key. |
* @param scan_code Scan code. |
* |
* @return Code of the pressed key. |
* @return Always 1. |
*/ |
static int gxemul_process_no_fb(keybuffer_t *keybuffer, int scan_code) |
static int gxemul_kbd_process_no_fb(keybuffer_t *keybuffer, int scan_code) |
{ |
// holds at most 4 latest scan codes |
static unsigned long buf = 0; |
|
static unsigned long buf = 0; |
// number of scan codes in #buf |
static int count = 0; |
|
/* |
// Preserve for detecting scan codes. |
// keybuffer_push(keybuffer, to_hex((scan_code>>4)&0xf)); |
// keybuffer_push(keybuffer, to_hex(scan_code&0xf)); |
// keybuffer_push(keybuffer, 'X'); |
// keybuffer_push(keybuffer, 'Y'); |
// return 1; |
keybuffer_push(keybuffer, to_hex((scan_code>>4)&0xf)); |
keybuffer_push(keybuffer, to_hex(scan_code&0xf)); |
keybuffer_push(keybuffer, 'X'); |
keybuffer_push(keybuffer, 'Y'); |
return 1; |
*/ |
|
if (scan_code == '\r') |
if (scan_code == '\r') { |
scan_code = '\n'; |
|
if(scan_code == 0x7e) { |
} |
|
if (scan_code == GXEMUL_KEY_F5_F12_START_CODE) { |
switch (buf) { |
case GXEMUL_KEY_F5: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 5); |
160,9 → 169,9 |
return 1; |
default: |
keybuffer_push(keybuffer, buf & 0xff); |
keybuffer_push(keybuffer, (buf >> 8) &0xff); |
keybuffer_push(keybuffer, (buf >> 16) &0xff); |
keybuffer_push(keybuffer, (buf >> 24) &0xff); |
keybuffer_push(keybuffer, (buf >> 8) & 0xff); |
keybuffer_push(keybuffer, (buf >> 16) & 0xff); |
keybuffer_push(keybuffer, (buf >> 24) & 0xff); |
keybuffer_push(keybuffer, scan_code); |
buf = count = 0; |
return 1; |
169,16 → 178,18 |
} |
} |
|
buf |= ((unsigned long) scan_code)<<(8*(count++)); |
// add to buffer |
buf |= ((unsigned long) scan_code) << (8 * (count++)); |
|
if((buf & 0xff) != (GXEMUL_KEY_F1 & 0xff)) { |
if ((buf & 0xff) != (GXEMUL_KEY_F1 & 0xff)) { |
keybuffer_push(keybuffer, buf); |
buf = count = 0; |
return 1; |
} |
|
if (count <= 1) |
if (count <= 1) { |
return 1; |
} |
|
if ((buf & 0xffff) != (GXEMUL_KEY_F1 & 0xffff) |
&& (buf & 0xffff) != (GXEMUL_KEY_F5 & 0xffff) ) { |
189,8 → 200,9 |
return 1; |
} |
|
if (count <= 2) |
if (count <= 2) { |
return 1; |
} |
|
switch (buf) { |
case GXEMUL_KEY_F1: |
212,18 → 224,19 |
} |
|
|
if((buf & 0xffffff) != (GXEMUL_KEY_F5 & 0xffffff) |
if ((buf & 0xffffff) != (GXEMUL_KEY_F5 & 0xffffff) |
&& (buf & 0xffffff) != (GXEMUL_KEY_F9 & 0xffffff)) { |
|
keybuffer_push(keybuffer, buf & 0xff); |
keybuffer_push(keybuffer, (buf >> 8) & 0xff); |
keybuffer_push(keybuffer, (buf >> 16) & 0xff); |
buf=count=0; |
buf = count = 0; |
return 1; |
} |
|
if (count <= 3) |
if (count <= 3) { |
return 1; |
} |
|
switch (buf) { |
case GXEMUL_KEY_F5: |
237,12 → 250,13 |
return 1; |
default: |
keybuffer_push(keybuffer, buf & 0xff); |
keybuffer_push(keybuffer, (buf >> 8) &0xff); |
keybuffer_push(keybuffer, (buf >> 16) &0xff); |
keybuffer_push(keybuffer, (buf >> 24) &0xff); |
keybuffer_push(keybuffer, (buf >> 8) & 0xff); |
keybuffer_push(keybuffer, (buf >> 16) & 0xff); |
keybuffer_push(keybuffer, (buf >> 24) & 0xff); |
buf = count = 0; |
return 1; |
} |
|
return 1; |
} |
|
249,30 → 263,34 |
|
/** Process data sent when a key is pressed (in framebuffer mode). |
* |
* @param keybuffer Buffer of scan codes. |
* @param keybuffer Buffer of pressed keys. |
* @param scan_code Scan code. |
* |
* @return Code of the pressed key. |
* @return Always 1. |
*/ |
static int gxemul_process_fb(keybuffer_t *keybuffer, int scan_code) |
static int gxemul_kbd_process_fb(keybuffer_t *keybuffer, int scan_code) |
{ |
// holds at most 4 latest scan codes |
static unsigned long buf = 0; |
static int count = 0; |
|
/* Please preserve this code (it can be used to determine scancodes) |
|
// number of scan codes in #buf |
static int count = 0; |
|
/* |
// Please preserve this code (it can be used to determine scancodes) |
keybuffer_push(keybuffer, to_hex((scan_code>>4)&0xf)); |
keybuffer_push(keybuffer, to_hex(scan_code&0xf)); |
keybuffer_push(keybuffer, ' '); |
keybuffer_push(keybuffer, ' '); |
|
return 1; |
*/ |
|
if (scan_code == '\r') |
if (scan_code == '\r') { |
scan_code = '\n'; |
} |
|
buf |= ((unsigned long) scan_code)<<(8*(count++)); |
// add to buffer |
buf |= ((unsigned long) scan_code) << (8*(count++)); |
|
|
if ((buf & 0xff) != (GXEMUL_FB_KEY_F1 & 0xff)) { |
281,8 → 299,9 |
return 1; |
} |
|
if (count <= 1) |
if (count <= 1) { |
return 1; |
} |
|
if ((buf & 0xffff) != (GXEMUL_FB_KEY_F1 & 0xffff)) { |
keybuffer_push(keybuffer, buf & 0xff); |
291,10 → 310,10 |
return 1; |
} |
|
if (count <= 2) |
if (count <= 2) { |
return 1; |
} |
|
|
if ((buf & 0xffffff) != (GXEMUL_FB_KEY_F1 & 0xffffff) |
&& (buf & 0xffffff) != (GXEMUL_FB_KEY_F5 & 0xffffff) |
&& (buf & 0xffffff) != (GXEMUL_FB_KEY_F9 & 0xffffff)) { |
306,67 → 325,68 |
return 1; |
} |
|
if ( count <= 3 ) |
if (count <= 3) { |
return 1; |
|
} |
|
switch (buf) { |
case GXEMUL_FB_KEY_F1: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 1 ); |
buf=count=0; |
buf = count = 0; |
return 1; |
case GXEMUL_FB_KEY_F2: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 2 ); |
buf=count=0; |
buf = count = 0; |
return 1; |
case GXEMUL_FB_KEY_F3: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 3 ); |
buf=count=0; |
buf = count = 0; |
return 1; |
case GXEMUL_FB_KEY_F4: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 4 ); |
buf=count=0; |
buf = count = 0; |
return 1; |
case GXEMUL_FB_KEY_F5: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 5 ); |
buf=count=0; |
buf = count = 0; |
return 1; |
case GXEMUL_FB_KEY_F6: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 6 ); |
buf=count=0; |
buf = count = 0; |
return 1; |
case GXEMUL_FB_KEY_F7: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 7 ); |
buf=count=0; |
buf = count = 0; |
return 1; |
case GXEMUL_FB_KEY_F8: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 8 ); |
buf=count=0; |
buf = count = 0; |
return 1; |
case GXEMUL_FB_KEY_F9: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 9 ); |
buf=count=0; |
buf = count = 0; |
return 1; |
case GXEMUL_FB_KEY_F10: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 10 ); |
buf=count=0; |
buf = count = 0; |
return 1; |
case GXEMUL_FB_KEY_F11: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 11 ); |
buf=count=0; |
buf = count = 0; |
return 1; |
case GXEMUL_FB_KEY_F12: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 12 ); |
buf=count=0; |
buf = count = 0; |
return 1; |
default: |
keybuffer_push(keybuffer, buf & 0xff ); |
keybuffer_push(keybuffer, (buf >> 8) &0xff ); |
keybuffer_push(keybuffer, (buf >> 16) &0xff ); |
keybuffer_push(keybuffer, (buf >> 24) &0xff ); |
buf=count=0; |
keybuffer_push(keybuffer, (buf >> 8) & 0xff); |
keybuffer_push(keybuffer, (buf >> 16) & 0xff); |
keybuffer_push(keybuffer, (buf >> 24) & 0xff); |
buf = count = 0; |
return 1; |
} |
|
return 1; |
} |
|
383,29 → 403,19 |
|
/** Process data sent when a key is pressed. |
* |
* @param keybuffer Buffer of scan codes. |
* @param keybuffer Buffer of pressed keys. |
* @param call IPC call. |
* |
* @return Code of the pressed key. |
* @return Always 1. |
*/ |
int kbd_arch_process(keybuffer_t *keybuffer, ipc_call_t *call) |
{ |
int scan_code = IPC_GET_ARG2(*call); |
static int esc_count = 0; |
|
if (scan_code == 0x1b) { |
esc_count++; |
if (esc_count == 3) { |
__SYSCALL0(SYS_DEBUG_ENABLE_CONSOLE); |
} |
} else { |
esc_count = 0; |
} |
|
if (fb) { |
return gxemul_process_fb(keybuffer, scan_code); |
return gxemul_kbd_process_fb(keybuffer, scan_code); |
} else { |
return gxemul_process_no_fb(keybuffer, scan_code); |
return gxemul_kbd_process_no_fb(keybuffer, scan_code); |
} |
|
} |