static void keyboard_report_event(void * device, u32_t flag, u8_t data, enum key_value_t press) { u32_t key; u32_t i; for(i = 0; i < ARRAY_SIZE(map); i++) { if(map[i].data == data) { if( (flag & KBD_CAPS_LOCK) ) key = map[i].caps_key; else if( (flag & (KBD_LEFT_SHIFT | KBD_RIGHT_SHIFT)) ) key = map[i].shift_key; else if( (flag & (KBD_LEFT_CTRL | KBD_RIGHT_CTRL)) ) key = 0; else key = map[i].key; if(key != 0) { if(press == KEY_BUTTON_DOWN) push_event_key_down(device, key); else if(press == KEY_BUTTON_UP) push_event_key_up(device, key); } } } }
static int key_gpio_timer_function(struct timer_t * timer, void * data) { struct input_t * input = (struct input_t *)(data); struct key_gpio_private_data_t * dat = (struct key_gpio_private_data_t *)input->priv; struct key_gpio_data_t * rdat = (struct key_gpio_data_t *)dat->rdat; enum event_type_t type; int i, val; for(i = 0; i < rdat->nbutton; i++) { val = gpio_get_value(rdat->buttons[i].gpio); if(val != dat->state[i]) { if(rdat->buttons[i].active_low) type = val ? EVENT_TYPE_KEY_UP : EVENT_TYPE_KEY_DOWN; else type = val ? EVENT_TYPE_KEY_DOWN : EVENT_TYPE_KEY_UP; if(type == EVENT_TYPE_KEY_DOWN) push_event_key_down(input, rdat->buttons[i].key); else if(type == EVENT_TYPE_KEY_UP) push_event_key_up(input, rdat->buttons[i].key); } dat->state[i] = val; } timer_forward_now(timer, ms_to_ktime(100)); return 1; }
static void key_rc5t620_interrupt(void * data) { struct input_t * input = (struct input_t *)data; struct key_rc5t620_pdata_t * pdat = (struct key_rc5t620_pdata_t *)input->priv; u8_t val = 0; rc5t620_read(pdat->dev, RC5T620_PWRMON, &val); if(val & 0x1) push_event_key_down(input, KEY_POWER); else push_event_key_up(input, KEY_POWER); rc5t620_read(pdat->dev, RC5T620_PWRIRQ, &val); val &= ~(0x1 << 0); rc5t620_write(pdat->dev, RC5T620_PWRIRQ, val); }