static int init_keypad(void) { int ret = 0; twl_init_irq(); // Enable software mode and keypad power on ret = kp_write(REG_KEYP_CTRL_REG, 0x43); // Mask all interrupts ret |= kp_write(REG_KEYP_IMR1, 0x0f); { /* Clear ISR */ l4_uint8_t v; kp_read(REG_KEYP_ISR1, &v); kp_read(REG_KEYP_ISR1, &v); } // Trigger interrupts on rising edge ret |= kp_write(REG_KEYP_EDR, 0xaa); // Set pre scalar field ret |= kp_write(REG_LK_PTV_REG, 4 << 5); // Set key debounce time ret |= kp_write(REG_KEY_DEB_REG, 0x3f); // Enable COR-mode ret |= kp_write(REG_KEYP_SIH_CTRL, 0x4); // unmask all interrupts ret |= kp_write(REG_KEYP_IMR1, 0); return ret; }
static int kp_irq_func(void) { l4_cap_idx_t irq_cap = l4re_util_cap_alloc(); l4_cap_idx_t thread_cap = pthread_getl4cap(_pthread); l4_msgtag_t tag; l4_debugger_set_object_name(thread_cap, "kp-omap3.irq"); if (l4io_request_irq(7, irq_cap) < 0) return -2; // was L4_IRQ_F_LEVEL_LOW tag = l4_irq_attach(irq_cap, 0, thread_cap); if (l4_ipc_error(tag, l4_utcb())) return -3; while (1) { tag = l4_irq_receive(irq_cap, L4_IPC_NEVER); if (l4_ipc_error(tag, l4_utcb())) { printf("[KEYP] Error: Receive irq failed\n"); continue; } kp_write(REG_KEYP_IMR1, 0xf); if (kp_handler) scan_key(); l4_uint8_t value = 0; kp_read(REG_KEYP_ISR1, &value); kp_write(REG_KEYP_IMR1, 0x0); } }
void main(void) { unsigned char data,p_data=255; lcd_init(); kp_init(); while(1) { data=kp_read(); if(p_data!=data) { if(data!=255) lcd_showvalue(data); p_data=data; } } }