华清远见(上海中心)22071

   三个按键分别中断实现控制三盏灯的亮灭

驱动代码>>>

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值