53,6 → 53,7 |
|
#define PL050_KEY_RELEASE 0xF0 |
#define PL050_ESC_KEY 0xE0 |
#define PL050_CAPS_SCAN_CODE 0x58 |
|
static void pl050_suspend(chardev_t *); |
static void pl050_resume(chardev_t *); |
116,7 → 117,7 |
static void pl050_irq_handler(irq_t *irq, void *arg, ...) |
{ |
static int key_released_flag = 0; |
static int caps_count = 0; |
static int caps_locked = 0; |
|
if (irq->notif_cfg.notify && irq->notif_cfg.answerbox) |
ipc_irq_send_notif(irq); |
124,32 → 125,29 |
uint8_t data; |
uint8_t status; |
|
if (((status = pl050_statusread()) & PL050_STAT_RXFULL)) { |
while (((status = pl050_statusread()) & PL050_STAT_RXFULL)) { |
data = pl050_dataread(); |
|
if (data == PL050_ESC_KEY) |
return; |
|
if (data == 0x58) { |
if (caps_count == 2) { |
caps_count = 0; |
return; |
} else if (key_released_flag && !caps_count) { |
key_released_flag = 0; |
return; |
} |
caps_count++; |
} |
|
if (data == PL050_KEY_RELEASE) { |
key_released_flag = 1; |
} else { |
if (key_released_flag) { |
key_released_flag = 0; |
if (data == PL050_CAPS_SCAN_CODE) { |
if (!caps_locked) { |
caps_locked = 1; |
} else { |
caps_locked = 0; |
return; |
} |
} |
key_released(data); |
|
} else { |
if (data == PL050_CAPS_SCAN_CODE && caps_locked) |
return; |
key_pressed(data); |
} |
key_released_flag = 0; |
} |
} |
} |