Linux Kernel 에서 Interrupt serivce routine (ISR) 을 사용하는 간략한 예
Linux Kernel 에서 Interrupt serivce routine (ISR) 을 사용하는 간략한 예.
Kernel 버젼은 3.14.38 이고, GPIO Interrupt 를 받아서 ISR 의 호출은 아래와 같다.
1) Header 파일은 아래 것이 꼭 필요하고, 물론 당연히 GPIO 도 넣어 줘야 한다.
#include <linux/interrupt.h>
#include <linux/gpio.h>
2) ISR 은 아래와 같은 형태를 취하고, 이 함수가 인터럽트 발생시 호출될 함수.
static irqreturn_t gpio_isr(int irq, void *data)
{
DBG("%s :keres Enter ~irq=%d, \r\n", __func__,irq);
return IRQ_HANDLED;
}
3) 먼저 GPIO를 request 하고, 보통은 IN 으로 해서 외부 Interrupt 를 감지 하도록 설정.
err = gpio_request_one(xxxx_led[0].gpio, GPIOF_DIR_IN, xxxx_led[0].name);
if (err){
pr_warn("ERR ~~ unable to request for gpio%d, err=%d\n", xxxx_led[0].gpio, err);
}
DBG("%s :Request irq, gpio=%d \r\n", __func__,xxxx_led[0].gpio);
4) 아래와 같이 gpio_to_irq() 로 얻어온 IRQ 값을 사용하여 등록.
// 등록시 아래처럼 FALLING or RISING 등을 사용하여 설정하는 부분이 있는데 여기까지는 확인 안해 봤음. ..
request_irq( gpio_to_irq(xxxx_led[0].gpio), gpio_isr, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, xxxx_led[0].name,NULL);
if(err){
pr_warn("ERR ~~ unable to IRQ for gpio%d, err=%d\n", xxxx_led[0].gpio, err);
}