题目:三个按键实现按键中断,key1>>led1,key2>>led2, key3>>led3。按键按一下灯亮,再按一下灯灭 。

#include <linux/init.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/gpio.h>
#include <linux/of_gpio.h>
#include <linux/timer.h>
#include <linux/of_irq.h>
#include <linux/interrupt.h>//定义指针指向获取的设备树节点信息空间
struct device_node *node;
struct gpio_desc *gpiono1;
struct gpio_desc *gpiono2;
struct gpio_desc *gpiono3;
int ret;unsigned int irqno1;
unsigned int irqno2;
unsigned int irqno3;struct device_node *node_irq;//中断处理函数
irqreturn_t irq_handler1(int irqno, void *dev)
{printk("key1 interrupt....\n");gpiod_set_value(gpiono1, !gpiod_get_value(gpiono1));return IRQ_HANDLED;
}
irqreturn_t irq_handler2(int irqno, void *dev)
{printk("key2 interrupt...\n");gpiod_set_value(gpiono2, !gpiod_get_value(gpiono2));return IRQ_HANDLED;
}
irqreturn_t irq_handler3(int irqno, void *dev)
{printk("key3 interrupt....\n");gpiod_set_value(gpiono3, !gpiod_get_value(gpiono3));return IRQ_HANDLED;
}static int __init mycdev_init(void)
{//通过名字获取设备树节点信息node = of_find_node_by_name(NULL, "myleds");if (node == NULL){printk("通过名字解析设备树节点失败\n");return -EFAULT;}printk("成功解析到设备树节点\n");//获取并申请gpio编号gpiono1 = gpiod_get_from_of_node(node, "myled1", 0, GPIOD_OUT_LOW, NULL);if (IS_ERR(gpiono1)){printk("获取gpio编号失败\n");return PTR_ERR(gpiono1);}printk("成功获取到编号1\n");gpiono2 = gpiod_get_from_of_node(node, "myled2", 0, GPIOD_OUT_LOW, NULL);if (IS_ERR(gpiono2)){printk("获取gpio编号失败\n");return PTR_ERR(gpiono2);}printk("成功获取到编号2\n");gpiono3 = gpiod_get_from_of_node(node, "myled3", 0, GPIOD_OUT_LOW, NULL);if (IS_ERR(gpiono3)){printk("获取gpio编号失败\n");return PTR_ERR(gpiono3);}printk("成功获取到编号3\n");//通过名字获取中断设备树节点信息node_irq = of_find_node_by_name(NULL, "myirq");if (node_irq == NULL){printk("通过名字解析设备树节点失败\n");return -EFAULT;}printk("成功解析到中断设备树节点\n");//根据设备树获取key1软中断号irqno1 = irq_of_parse_and_map(node_irq, 2);if (irqno1 == 0){printk("获取软中断号失败\n");return EINVAL;}printk("获取key1软中断号成功\n");//根据设备树获取key2软中断号irqno2 = irq_of_parse_and_map(node_irq, 0);if (irqno2 == 0){printk("获取软中断号失败\n");return EINVAL;}printk("获取key2软中断号成功\n");//根据设备树获取key2软中断号irqno3 = irq_of_parse_and_map(node_irq, 1);if (irqno3 == 0){printk("获取软中断号失败\n");return EINVAL;}printk("获取key3软中断号成功\n");//将中断号注册进内核ret = request_irq(irqno1, irq_handler1, IRQF_TRIGGER_FALLING, "key1_inte", NULL);if (ret){printk("注册中断失败\n");return ret;}ret = request_irq(irqno2, irq_handler2, IRQF_TRIGGER_FALLING, "key2_inte", NULL);if (ret){printk("注册中断失败\n");return ret;}ret = request_irq(irqno3, irq_handler3, IRQF_TRIGGER_FALLING, "key3_inte", NULL);if (ret){printk("注册中断失败\n");return ret;}printk("注册中断成功\n");return 0;
}
static void __exit mycdev_exit(void)
{//中断注销free_irq(irqno1, NULL);free_irq(irqno2, NULL);free_irq(irqno3, NULL);//熄灭ledgpiod_set_value(gpiono1, 0);gpiod_set_value(gpiono2, 0);gpiod_set_value(gpiono3, 0);//释放gpio编号gpiod_put(gpiono1);gpiod_put(gpiono2);gpiod_put(gpiono3);
}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");

测试结果:

华清远见上海中心22071班--11.28作业相关推荐

  1. 华清远见上海中心22071班--11.19作业

    题目:实现开发板点灯操作 程序要求: 1)分部实现注册字符设备驱动 2)自动创建设备节点 3)通过结构体对led灯地址进行映射 4)次设备号完成私有数据传参 5)在open函数中获取到次设备号,用私有 ...

  2. 华清远见上海中心22071班--11.24作业

    题目:应用层采取ioctl命令控制,驱动代码用GPIO子系统,实现开发板6盏灯的循环亮灭 头文件程序: #ifndef __LED_H__ #define __LED_H__typedef enum{ ...

  3. 华清远见上海中心22071班--11.29作业

    题目:paltform总线中通过名字.名字列表和设备树三种方式实现driver和device匹配 方式一>>>名字: #include <linux/init.h> #i ...

  4. 华清远见上海中心22071班 8.25作业

    目录 1.用无头结点的循环链表实现约瑟夫环问题 头文件: 功能函数: 主函数: 终端输出: 2.顺序栈实现进制转换问题 头文件: 功能函数: 主函数: 终端输出: 1.用无头结点的循环链表实现约瑟夫环 ...

  5. 华清远见上海中心22071班 9.2作业

    1.用父子进程拷贝一张图片,其中子进程先拷贝后半部分,父进程后拷贝前半部分.要求用文件IO实现. 函数: #include <stdio.h> #include <fcntl.h&g ...

  6. 华清远见上海中心22071班 9.7作业

    目录 1.创建两个线程 A.B,要求A线程读取文件中的数据,B线程将读取到的数据打印到终端上,类似shell命令cat. 2.编写一个程序,开启3个线程,这3个线程的ID分别为A.B.C,每个线程将自 ...

  7. 华清远见上海中心22071班 9.30作业

    电子词典: 登录注册功能,不能重复登录,重复注册 单词查询功能 历史记录功能,存储单词,意思,以及查询时间 基于TCP,支持多客户端连接 采用数据库保存用户信息与历史记录 将dict.txt的数据导入 ...

  8. 华清远见上海中心22071班 8.24作业

    1.单向链表按位置修改 void list_update_pos(linklist *L,int pos,datatype e) {if(NULL==L||list_empty(L)||pos< ...

  9. 华清远见上海中心22071班 9.21作业

    1.完成数据库的插入.删除.修改,插入选择全字段插入.删除.修改选择用id的方式 代码: #include <stdio.h> #include <sqlite3.h> #in ...

最新文章

  1. 批量更新日期字段中的年
  2. 未来CPU内核将更简单!
  3. roboware studio_关于安装Roboware的教程
  4. Java 开发新选择?Apache NetBeans IDE 9.0 正式发布
  5. 【51nod】最大子段和
  6. Ext2 常见界面界面(grid分页、窗口布局、下拉框级联)
  7. 利用栈将html源码解析为节点树
  8. JSP的自定义标签(一)
  9. ISSCC2021 基于SRAM的存内计算16.3阅读记录
  10. 学号密码错误的计算机流程图,自学考试管理信息系统练习题及答案
  11. 【DP】洛谷 P1510 精卫填海
  12. JavaEE个人学习总结
  13. python心得总结知识点和收获,千锋Python培训学员心得 在总结中收获提升
  14. 信息系统项目管理师之信息化与信息系统
  15. UpdateDate()
  16. C语言中%s,%m.ns 和 %e,%m.ne 的意思
  17. 达人评测 华为matebook16对比联想小新pro16锐龙版 2021哪个好
  18. 模拟CMOS集成电路设计 学习笔记(二)
  19. 小米十年,做不好售后
  20. Android前台服务讲解二之自定义通知视图(RemoteViews)及数据UI更新

热门文章

  1. iOS和Android手机浏览器链接打开app store或应用市场下载软件讲解
  2. mysql数据库字段默认值设为什么_为什么数据库字段需要设置默认值
  3. pythonurllib登录微博账号_Python使用cookielib和urllib2模拟登录新浪微博并抓取数据...
  4. 手机PLC编程学习仿真软件(安卓版)
  5. 叮咚~你订阅的 OpenMMLab 4 月月刊已送达
  6. Unity3D 之 坦克大战(一)
  7. 获取DedeCMS当前文章页的本文地址URL地址方法
  8. geoserver发布离线瓦片卫星图TIF格式
  9. 【Python】二进制字符串异或
  10. python读取rtf文件中指定的内容_使用Python读取RTF文件时遇到欧元符号问题