#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");
#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