Thursday, 3 September 2015

interrupt_switch.c

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/interrupt.h>
#include <linux/gpio.h>

static u8 sw_gpio_num = 72; // GPIO 2_8

static irqreturn_t sw_irq_handler(int irq, void *data)
{
    printk(KERN_INFO "GPIO %d IRQ %d Value %d\n", sw_gpio_num, irq, gpio_get_value(sw_gpio_num));

    return IRQ_HANDLED;
}

static int __init sw_int_init(void)
{
    int ret;
    int irq;

#if 1
    if ((ret = gpio_request(sw_gpio_num, "sw_int")) < 0)
    {
        printk(KERN_ERR "GPIO %d is already in use\n", sw_gpio_num);
        return ret;
    }

    if ((ret = gpio_direction_input(sw_gpio_num)) < 0)
    {
        printk(KERN_ERR "GPIO %d is not set as input\n", sw_gpio_num);
        return ret;
    }
#else
    if ((ret = gpio_request_one(sw_gpio_num, GPIOF_IN, "sw_int")) < 0)
    {
        printk(KERN_ERR "GPIO %d is already in use\n", sw_gpio_num);
        return ret;
    }
#endif

    if ((irq = gpio_to_irq(sw_gpio_num)) < 0)
    {
        printk(KERN_ALERT "GPIO %d cannot be used as interrupt", sw_gpio_num);
        gpio_free(sw_gpio_num);
        return irq;
    }

    if ((ret = request_irq(irq, sw_irq_handler,
                        IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, "sw_int", NULL)) < 0)
    {
        printk(KERN_ERR "Registering irq %d failed\n", irq);
        gpio_free(sw_gpio_num);
        return ret;
    }
   
    printk(KERN_INFO "GPIO %d IRQ %d Value %d\n", sw_gpio_num, irq, gpio_get_value(sw_gpio_num));

    printk(KERN_INFO "Switch Interrupt Driver loaded\n");

    return 0;
}

static void __exit sw_int_exit(void)
{
    free_irq(gpio_to_irq(sw_gpio_num), NULL);
    gpio_free(sw_gpio_num);
    printk(KERN_INFO "Switch Interrupt Driver unloaded\n");
}

module_init(sw_int_init);
module_exit(sw_int_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Anil Kumar Pugalia <anil@sysplay.in>");
MODULE_DESCRIPTION("Switch Interrupt Driver");


No comments:

Post a Comment