Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 4633 → Rev 4634

/branches/arm/kernel/arch/arm32/src/drivers/pl050.c
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;
}
}
}