#include <linux/init.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/gpio.h>
#include <linux/timer.h>
#include <linux/of_irq.h>
#include <linux/interrupt.h>
struct device_node *node1;
struct device_node *node2;
struct gpio_desc *gpiono_led1;
struct gpio_desc *gpiono_led2;
struct gpio_desc *gpiono_led3;
int ret;
unsigned int irqno_key1;
unsigned int irqno_key2;
unsigned int irqno_key3;
irqreturn_t irq_handler_key1(int irqno_key1,void *dev)
{
gpiod_set_value(gpiono_led1,!gpiod_get_value(gpiono_led1));
return IRQ_HANDLED;
}
irqreturn_t irq_handler_key2(int irqno_key2,void *dev)
{
gpiod_set_value(gpiono_led2,!gpiod_get_value(gpiono_led2));
return IRQ_HANDLED;
}
irqreturn_t irq_handler_key3(int irqno_key3,void *dev)
{
gpiod_set_value(gpiono_led3,!gpiod_get_value(gpiono_led3));
return IRQ_HANDLED;
}
static int __init mycdev_init(void)
{
node1=of_find_node_by_name(NULL,"myleds");
if(node1==NULL)
{
printk("find node1 error\n");
return -EFAULT;
}
printk("find node1 success\n");
node2=of_find_node_by_name(NULL,"myirq");
if(node2==NULL)
{
printk("find node2 error\n");
return -EFAULT;
}
printk("find node2 success\n");
//获取三盏灯的gpio编号
gpiono_led1 = gpiod_get_from_of_node(node1,"myled1",0,GPIOD_OUT_LOW,NULL);
if(IS_ERR(gpiono_led1))
{
printk("get gpiono led1 error\n");
return PTR_ERR(gpiono_led1);
}
gpiono_led2 = gpiod_get_from_of_node(node1,"myled2",0,GPIOD_OUT_LOW,NULL);
if(IS_ERR(gpiono_led2))
{
printk("get gpiono led2 error\n");
return PTR_ERR(gpiono_led2);
}
gpiono_led3 = gpiod_get_from_of_node(node1,"myled3",0,GPIOD_OUT_LOW,NULL);
if(IS_ERR(gpiono_led3))
{
printk("get gpiono led3 error\n");
return PTR_ERR(gpiono_led3);
}
//获取三个按键的软中断号
irqno_key1=irq_of_parse_and_map(node2,2);
if(irqno_key1==0)
{
printk("get irqno key1 error\n");
return EINVAL;
}
irqno_key2=irq_of_parse_and_map(node2,0);
if(irqno_key2==0)
{
printk("get irqno key2 error\n");
return EINVAL;
}
irqno_key3=irq_of_parse_and_map(node2,1);
if(irqno_key3==0)
{
printk("get irqno key3 error\n");
return EINVAL;
}
//将中断号注册进内核
ret=request_irq(irqno_key1,irq_handler_key1,IRQF_TRIGGER_FALLING,"key1_inte",NULL);
if(ret)
{
printk("request irq key1 error\n");
return ret;
}
ret=request_irq(irqno_key2,irq_handler_key2,IRQF_TRIGGER_FALLING,"key2_inte",NULL);
if(ret)
{
printk("request irq key2 error\n");
return ret;
}
ret=request_irq(irqno_key3,irq_handler_key3,IRQF_TRIGGER_FALLING,"key3_inte",NULL);
if(ret)
{
printk("request irq key3 error\n");
return ret;
}
return 0;
}
static void __exit mycdev_exit(void)
{
free_irq(irqno_key1,NULL);
free_irq(irqno_key2,NULL);
free_irq(irqno_key3,NULL);
gpiod_set_value(gpiono_led1,0);
gpiod_put(gpiono_led1);
gpiod_set_value(gpiono_led2,0);
gpiod_put(gpiono_led2);
gpiod_set_value(gpiono_led3,0);
gpiod_put(gpiono_led3);
}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");