2013-09-07 3 views
3

저는 x86 리눅스 용 장치 드라이버에서 일하고 있습니다. 디바이스는 인터럽트를 생성하기 위해 PCH의 GPIO에 연결된 핀을 가지고있다. 해당 GPIO 핀과 관련된 IRQ를 요청하고 인터럽트 핸들러를 설치하려면 어떻게합니까?x86 Linux 용 GPIO 인터럽트 처리기를 구현하는 방법은 무엇입니까?

+0

http://lwn.net/images/pdf/LDD3/ch10.pdf가 도움이 될 수 있습니다. – user35443

+0

@ user35443 요청할 IRQ 번호를 어떻게 알 수 있습니까? – Chuankai

+0

'gpio_to_irq()'를 본 적이 있습니까? 네 운전사가 이거 니? http://lxr.free-electrons.com/source/drivers/gpio/gpio-pch.c – Alex

답변

5

당신이 찾고있는 헤더 파일이

#include <linux/gpio.h> 

당신이해야 할 첫번째 일은 특정 GPIO를 할당하는 것입니다. 이 호출을 사용하여 수행 할 수는

int irq = 0; 
if((irq = gpio_to_irq(GPIO)) < 0 /*irq number can't be less than zero*/) 
    //fail 
    ... 

이제 일반적인 커널 루틴을 사용하여 IRQ 핸들러를 등록하기위한

#define GPIO //gpio number 

... 

if(gpio_request(GPIO, "Description")) 
    //fail 
    ... 

는 자신의 GPIO 핀을 얻을 후에는 IRQ를 수집 할 수 있습니다. 모듈 정리를 할 때

#include <linux/interrupt.h> 
... 
int result = request_irq(irq, handler_function, 
         IRQF_TRIGGER_LOW, /*here is where you set up on what event should the irq occur*/ 
         "Description", "Device description"); 
if(result) 
    //fail 
    ... 

free_irqgpio_free해야합니다. 하지 않으면 GPIO 핀을 다시 할당 할 수 없습니다.

+0

GPIO 번호는 어떻게 가상 주소에 매핑됩니까? 커널이 가상 주소를 올바르게 처리합니까? –

+1

질문을 좀 더 명확하게 할 수 있습니까? GPIO에 액세스 할 수있는 메모리 매핑 IO는 특정 프로세서/개발 보드에 대해 설정된 주소를가집니다. 대부분의 리눅스 커널 릴리즈는 MMU를 사용하기 때문에 먼저 '물리적 인'주소를 프로세스의 가상 주소에 매핑해야합니다. 그 후에는 어디에서나 가상 주소에 액세스하지만 읽기 및 쓰기는 GPIO에서 수행됩니다. – user35443

+0

좋아요, 좀 더 구체적으로 설명하겠습니다. GPIO39 (팬더 보드 OMAP4460의 J3 확장 커넥터 핀 22)의 하강 에지에서 10ms마다 외부 인터럽트가 발생합니다. 인터럽트를 처리하기 위해 답안에서 제시 한 것과 동일한 단계를 정확히 수행했습니다. 그러나 핸들러가 호출되지 않습니다. 즉, GPIO39에서 인터럽트가 감지되지 않습니다. 그리고 한 가지 더 ... GPIO39에 지정된 IRQ 번호는 TRM에서 30입니다. 하지만, gpio_to_irq의 반환 값은 199입니다. 제가 누락 되었습니까? 이것을 올바른 방법일까요? –

관련 문제