detecting interrupt on GPIO in kernel module

I am toggling the input into a GPIO line on my BeagleBone from high to low every 500 ms using an Atmel uC. I have registered a handler for this in my Linux Kernel Module, but the handler is not being called for some reason.

My module code is -

#define GPIO 54
#define GPIO_INT_NAME  "gpio_int"

#define GPIO_HIGH gpio_get_value(GPIO)
#define GPIO_LOW (gpio_get_value(GPIO) == 0)
short int irq_any_gpio    = 0;
int count =0;

enum { falling, rising } type; 
static irqreturn_t r_irq_handler(int irq, void *dev_id)
 {
      count++;
    printk(KERN_DEBUG "interrupt received (irq: %d)\n", irq);
        if (irq == gpio_to_irq(GPIO)) 
    {

        type = GPIO_LOW ? falling : rising;

        if(type == falling)
        {
            printk("gpio pin is low\n");    
        }
        else
            printk("gpio pin is high\n");

    }

    return IRQ_HANDLED;
}

void r_int_config(void) {

   if (gpio_request(GPIO, GPIO_INT_NAME )) 
   {
      printk("GPIO request failure: %s\n", GPIO_INT_NAME );
      return;
   }

   if ( (irq_any_gpio = gpio_to_irq(GPIO)) < 0 ) {
      printk("GPIO to IRQ mapping failure %s\n",GPIO_INT_NAME );
      return;
   }

   printk(KERN_NOTICE "Mapped int %d\n", irq_any_gpio);

   if (request_irq(irq_any_gpio,(irq_handler_t ) r_irq_handler, IRQF_TRIGGER_HIGH, GPIO_INT_NAME, NULL)) 
   {
      printk("Irq Request failure\n");
      return;
   }

   return;
}

void r_int_release(void) {

   free_irq(gpio_to_irq(GPIO), NULL);
    gpio_free(GPIO);;
   return;
}

int init_module(void)
{
        printk("<1>Hello World\n"); 
    r_int_config();
        return 0;
}

On calling insmod interrupt_test.ko, i get the following message

[   76.594543] Hello World                                                      
[   76.597137] Mapped int 214  

But now when I start toggling the input into this gpio pin, the interrupt handler doesn’t get called and the message - “interrupt received” is not being displayed.

How do I solve this ? What’s causing the problem?

Does the problem have something to do with dev id paramter in the interrupt handler?

Hi

I see that some function definitions are missing in your code. Can you share those as well, so that i too can try and figure out the problem.
Especially the functions like gpio_to_irq() …
Thanks.


Does cat /proc/interrupts give show anything for 214.
Check whether It is going to architecture specific impelemtation of gpio_to_irq

Hi Kavita

A generic question regarding interrupts.
If i register an interrupt using request_threaded_irq() or request_irq() will that be listed in /proc/interrupts ?

Yes it does show in cat /proc/interrupts
It doesnot matter you use request_threaded_irq or request_irq

request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
const char *name, void *dev)
Here the handler will be run in interrupt context

and

request_threaded_irq(unsigned int irq, irq_handler_t handler,
irq_handler_t thread_fn,
unsigned long flags, const char *name, void *dev);

In threaded IRQ
irq_handler_t handle - Interrupt context

irq_handler_t thread_fn- Process context

This is the only difference.

Thanks
Kavitha

Hi Kavita

Thanks for clarifying

use of gpio_int_name