Thursday, April 23, 2015

Using Interrupt in Embedded Linux

@ Button Key
  : Target Board 버튼 Press 시 Interrupt 발생
  : 발생한 Interrupt를 어떻게 처리하는지?

@ Interrupt in Arm Processor
  : Arm 프로세서에서는 Interrupt가 발생하면 IRQ Exception이 발생하는데,
  : 프로세서 내에 Exception Vector Table 이라는 것이 존재해서,
  : 발생한 Exception 타입에 따라 Table의 특정 주소에 위치한 명령을 수행하게 됨

@ Interrupt Handling
request_irq(IRQ_EINT0, (void*) key1_isr, IRQF_DISABLED | IRQF_TRIGGER_FALLING, "KEY1", NULL);
  : "request_irq()" function이 가장 중요!
  : request_irq 함수를 이용하여 해당 interrupt에 ISR(Interrupt Service Routine)을 등록
  : IRQ_EINT0 의 경우는 Target Board(HW)에서 정의된 값을 사용해야 함

free_irq(IRQ_EINT0, NULL);
  : Interrupt 사용 후에는 반드시 "free_irq()" function을 호출해 주는 게 정석

/*
 * @file   keybutton.c
 * @brief  Module Source for button key interrupt
 */

static irqreturn_t key1_isr(int irq, void* dev_id, struct pt_regs* regs)
{
    printk("KEY1 pressed.. irq_no( %d )\n", irq);
    return IRQ_HANDLED;
}

static int __init button_probe(struct device* dev)
{
    request_irq(IRQ_EINT0, (void*) key1_isr, IRQF_DISABLED | IRQF_TRIGGER_FALLING, "KEY1", NULL);
    return 0;
}

static int button_remove(struct device* dev)
{
    free_irq(IRQ_EINT0, NULL);
}

static struct device_driver button_driver = {
    .name    = "button",
    .owner   = THIS_MODULE,
    .bus     = &platform_bus_type,
    .probe   = button_probe,
    .remove  = button_remove,
}

...

MODULE_LICENSE("GPL");

No comments:

Post a Comment