2014-07-07 7 views
6

pandaboard OMAP4의 GPIO_39에서 10ms마다 인터럽트가 생성됩니다. Linux 드라이버 코드에서이 핸들러를 등록했지만 인터럽트가 감지되지 않아 핸들러가 호출되지 않습니다.임베디드 리눅스에서 GPIO 라인의 인터럽트를 탐지하는 방법은 무엇입니까?

인터럽트가 실제로 생성되고 있음을 하드웨어 수준 (gpio 핀을 조사하여)에서 확인했습니다. 그것은 소프트웨어가 그것을 감지 할 수 없다는 것입니다.

내 드라이버 코드에는 다음과 같은 내용이 있습니다.

#define GPIO_NO  39 

    iowrite16(0x3, gpio_39_address + 2); /* Configured the pin 22 to be used as gpio. */ 

    ret = gpio_request(GPIO_NO, "Claiming GPIO"); 
    if(ret < 0) 
    { 
    printk(KERN_ALERT "%s: Claiming GPIO_%d failed\n", __func__, GPIO_NO); 
    return -1; 
    } 
    else 
    { 
    printk(KERN_INFO "%s: Claiming GPIO_%d successful\n", __func__, GPIO_NO); 
    } 

    ret = gpio_direction_input(GPIO_NO); 
    if(ret < 0) 
    { 
    printk(KERN_INFO "%s: Setting GPIO direction to input failed\n", __func__); 
    return -1; 
    } 
    else 
    { 
    printk(KERN_INFO "%s: Direction of GPIO_%d set to input\n", __func__, GPIO_NO); 
    } 

    GPIO_IRQ = gpio_to_irq(GPIO_NO); 

    if(GPIO_IRQ < 0) 
    { 
    printk(KERN_INFO "%s: Mapping GPIO_%d to IRQ failed\n", __func__, GPIO_NO); 
    return -1; 
    } 
    else 
    { 
    printk(KERN_INFO "%s: Mapping GPIO_%d to IRQ_%d successful\n", __func__, GPIO_NO, GPIO_IRQ); 
    } 

    if((request_irq(GPIO_IRQ, ten_ms_int, IRQF_TRIGGER_FALLING, DEVICE_NAME, NULL))) 
    { 
    printk(KERN_ALERT "%s: requeseting GPIO_IRQ %d failed\n", __func__, GPIO_IRQ); 
    return -1; 
    } 
    else 
    { 
    printk(KERN_INFO "%s: requesting GPIO_IRQ %d successful\n", __func__, GPIO_IRQ); 
    } 

irqreturn_t ten_ms_int(int irq, void *dev_id) 
{ 
    T_UINT32 l; 
    /* Enable spi channel */ 
    l = ioread32(spi_base + SPI_CHCONF0); 
    l |= SPI_CHCONF0_FORCE; 
    iowrite32(l, (spi_base + SPI_CHCONF0)); 

    l = ioread32(spi_base + SPI_CHCTRL0); 
    l |= SPI_CHCTRL_EN; 
    iowrite32(l, (spi_base + SPI_CHCTRL0)); 

    /* Enable dma channel 0 */ 
    l = ioread32(sdma_base + SDMA_CCR(CHANNEL0)); 
    l |= SDMA_CCR_ENABLE; 
    iowrite32(l, sdma_base + SDMA_CCR(CHANNEL0)); 

    /* Enable dma channel 1 */ 
    l = ioread32(sdma_base + SDMA_CCR(CHANNEL1)); 
    l |= SDMA_CCR_ENABLE; 
    iowrite32(l, sdma_base + SDMA_CCR(CHANNEL1)); 
    //printk(KERN_INFO "%s: 10ms interrupt detected %d\n", __func__, irq); /* I know that I've to remove this printk statement */ 
    return IRQ_HANDLED; 
} 

GPIO_39는 뱅크 GPIO2에 속하는 대응하는 인터럽트 번호 gpio_to_irq()의 반환 값이 문제의 또 다른 원인은 199이고, 32이다하지만.

코드에 이상이 있거나 뭔가 놓친 경우 알려주십시오.

+1

코드는 대부분 괜찮아 보입니다. 나는 당신의 첫번째 아이오 와이트가 아마도 가장 불필요하다고 생각합니다. 어떻게해야할까요? 핀 다중화 설정을 확인하고 인터럽트 신호를 값으로 읽을 수 있는지 확인 했습니까 (예 : 사용자 공간 인터페이스 사용). – slobobaby

+0

첫 번째 iowrite는 핀 다중화 부분입니다. –

+0

사용자 공간 인터페이스를 사용하는 경우 외부 신호 레벨을 올바르게 읽을 수 있습니까? – slobobaby

답변

1

GPIO 핀을 명시 적으로 하강 에지를 감지하도록하십시오.

gpio 모듈 수준에서 FALLING_DETECT gpio를 활성화해야합니다.