54,6 → 54,7 |
|
#define PL050_KEY_RELEASE 0xF0 |
#define PL050_ESC_KEY 0xE0 |
#define PL050_CAPS_SCAN_CODE 0x58 |
|
irq_cmd_t pl050_cmds[] = { |
{ CMD_MEM_READ_1, (void *) 0, 0, 1 }, |
91,31 → 92,27 |
int kbd_arch_process(keybuffer_t *keybuffer, ipc_call_t *call) |
{ |
static int key_released_flag = 0; |
static int caps_count = 0; |
|
static int caps_locked = 0; |
int scan_code = IPC_GET_ARG1(*call); |
|
if (scan_code == 0x58) { |
if (caps_count == 2) { |
caps_count = 0; |
return 1; |
} else if (key_released_flag && !caps_count) { |
key_released_flag = 0; |
return 1; |
} |
caps_count++; |
} |
|
|
if (scan_code == PL050_KEY_RELEASE) { |
key_released_flag = 1; |
} else { |
if (key_released_flag) { |
key_released_flag = 0; |
if (scan_code == PL050_CAPS_SCAN_CODE) { |
if (caps_locked) { |
caps_locked = 0; |
return 1; |
} else |
caps_locked = 1; |
} |
key_released(keybuffer, scan_code); |
} else { |
if (scan_code == PL050_CAPS_SCAN_CODE && caps_locked) |
return 1; |
key_pressed(keybuffer, scan_code); |
} |
key_released_flag = 0; |
} |
|
return 1; |