2011-08-17 6 views
5

AT91SAM9M10-EKES 평가 보드에서 GPIO IRQ를 프로그래밍하려고합니다. IRQ가 성공적으로 등록되었으며 IRQ가 작동 중입니다. 그러나 일부 인터럽트가 누락되었습니다. 나는 26를 보내고있다, 그리고 나는 단지 22ARM 기반 임베디드 리눅스에서 GPIO IRQ

코드 수 :

static irqreturn_t wiegand_interrupt(int irq, void *dev_id){ 
    atomic_inc(&counter); 
    printk(KERN_WARNING "IRQ recieved, counting... %d\n",atomic_read(&counter)); 
    return 0; 
} 
irq1 = gpio_to_irq(AT91_PIN_PA21); 
if (irq1 < 0) { 
    err = irq1; 
    printk("Unable to get irq number for GPIO %d, error %d\n",AT91_PIN_PA21, err); 
    goto fail; 
} 

err = request_irq(irq1,wiegand_interrupt,0 ,"wiegand",NULL); 

irq2 = gpio_to_irq(AT91_PIN_PA20); 
if (irq2 < 0) { 
    err = irq2; 
    printk("Unable to get irq number for GPIO %d, error %d\n",AT91_PIN_PA21, err); 
    goto fail; 
} 

err = request_irq(irq2,wiegand_interrupt,0 ,"wiegand",NULL); 

이 전체 드라이버되지 않습니다, 그러나 이것은 IRQ를 다루는 실제적인 부분이다. 누군가 코드에 문제가 있거나 4 가지 인터럽트가 손실 된 이유를 알 수있는 방법을 제안 할 수 있으면 답장을 보내주십시오. 나는 ... :(

감사합니다. 라몬 시간이에 붙어있어.

답변

4

나는 당신이 당신의 인터럽트를 유발한다고 가정 발견 외부 시스템 (아마도 마이크로 컨트롤러 나 GPIOS를 토글 할 수있는 무언가)을 가지고있을 것입니다. 인터럽트가 실제로 보이지 않기 때문에 외부 시스템이 인터럽트를 처리하여 새로운 인터럽트를 트리거 할 수 있습니다.

printk는 매우 느린 기능이므로 일부 인터럽트를 놓칠 수 있습니다. 이전 인터럽트를 처리하는 동안 새 인터럽트가 발생할 수 있습니다.

그래서 처리기에서 printk을 사용하지 말 것을 권합니다. 이런 식으로하고 싶다면 인터럽트 핸들러의 아래쪽 절반으로 태스크 릿이나 워크 큐를 사용하는 것이 좋습니다.

Linux 디바이스 드라이버 10 장을 읽는 것만 권장합니다.

아, 그런데 IRQ 처리기는 0을 반환하지 않고 IRQ_HANDLED를 반환합니다.

+1

printk가 그 이유입니다. 그것은 작동합니다. 감사. – stdcall

+0

@ Longfield : http://stackoverflow.com/questions/24608817/interrupt-on-gpio-line-is-not-being-detected에 답변 해 주시겠습니까? –

1

좋아, 사실, 문제는 GPIO 핀이 IRQF_TRIGGER_FALLING 플래그를 지원하지 않는 동안은의 GPIO 핀을 사용한다는 것입니다 , 인 내가 필요 정확히. 그래서 아마, 인터럽트 핸들러가 제대로 신호를 인식하지 못합니다. 내가 IRQF_TRIGGER_FALLING이 수를 위해 외부 핀을 사용할 필요가 IRQ의.

+0

안녕하세요. 비슷한 문제가 있습니다. http://stackoverflow.com/questions/24608817/interrupt-on-gpio-line-is-not-being-detected –