@ 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을 호출해 주는 게 정석
: 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