コード例 #1
0
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;
}
コード例 #2
0
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);
    }
}
コード例 #3
0
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;
        }

    }

}