Friday, 4 September 2015

BEAGLE BONE BLACK Push Switch Turn on LED

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/kdev_t.h>
#include <linux/errno.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/gpio.h>
#include <asm/uaccess.h>


static u8 sw_gpio_num = 72; // GPIO 2_8
static unsigned int gpio_number[] = {53,54,55,56}; // TODO: Fill the GPIO numbers for User LED 0-3: GPIO1_21-24

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));
        /* Set Led high if value is 0 */
        if(gpio_get_value(sw_gpio_num))
    gpio_set_value(gpio_number[1], 1 /* TODO: Pass the user value here */);
    else
        gpio_set_value(gpio_number[1], 0 /* TODO: Pass the user value here */);
    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