-
Linux Kernel 에서 Interrupt serivce routine (ISR) 을 사용하는 간략한 예IT_n_Programs 2019. 3. 2. 18:20
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);}
반응형'IT_n_Programs' 카테고리의 다른 글
uboot 에서 bootargs 를 통해 IP가 kernel 로 전달되는 과정 (0) 2019.03.10 RJ45 케이블 만드는 방법 정리. (0) 2019.03.07 Ubuntu 에서 Upgrade 후에 booting 이 안되는 경우. (0) 2019.03.02 DEBUG define 을 사용해서 log 메시지의 양을 조절하자 ~~ (0) 2019.03.02 ssh 설정 및 사용 (0) 2019.03.02 댓글