Linux驱动---光电开关、火焰传感器、人体红外传感器

文章目录

  • 一、电路连接
  • 二、设备树
  • 三、驱动代码

一、电路连接

人体红外 – PF12
检测到人体时会产生一个上升沿

光电开关 – PE15
有遮挡物时会产生一个上升沿

火焰传感器 – PF5
有火焰时会产生一个上升沿

二、设备树

/{	//人体红外PF12human{ compatible = "zyx,human";interrupt-parent = <&gpiof>;  	//中断父节点是gpiofinterrupts = <12 0>;			//第一个参数是中断控制器下标};//光电开关PE15light{compatible = "zyx,light";interrupt-parent = <&gpioe>;interrupts = <15 0>;};//火焰传感器PF5fire{compatible = "zyx,fire";interrupt-parent = <&gpiof>;interrupts = <5 0>;};
};

三、驱动代码

以光电开关为例
使用了platform总线驱动

/***人体红外PF12* ***/
#include <linux/module.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/mod_devicetable.h>
#include <linux/of.h> //设备树文件相关头文件
#include <linux/of_gpio.h>
#include <linux/cdev.h>
#include <linux/interrupt.h>#define CNAME "light"
struct cdev *cdev_light;
struct class *class_light;
struct device *device_light;
int major = 0; //主设备号
int minor = 0;
dev_t devno_light;int irqno_light; //中断号/***中断处理函数***/
irqreturn_t light_irq_handler(int irqno, void *dev){printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);return IRQ_HANDLED;
}/***字符设备***/
int light_open(struct inode *inode, struct file *file){printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);return 0;
}
int light_close (struct inode *inode, struct file *file){printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);return 0;
}const struct file_operations lightfops = {.open = light_open,.release = light_close,
};int light_probe(struct platform_device *dev){int ret=0;/***注册字符设备驱动***///1. 分配对象cdev_light = cdev_alloc();if(NULL == cdev_light){ //成功返回结构体指针,失败返回NULLpr_err("cdev_alloc error");ret = -ENOMEM;goto err1;}//初始化对象:部分成员初始化cdev_init(cdev_light,&lightfops);//申请设备号:如果major为0,则动态申请,否则就静态指定if(major > 0){ //静态申请ret = register_chrdev_region(MKDEV(major,minor),1,CNAME);if (ret) {pr_err("register_chrdev_region error\n");goto err2;}}else if(major == 0){ //动态申请ret = alloc_chrdev_region(&devno_light,0,1,CNAME); if (ret) {pr_err("alloc_chrdev_region error\n");goto err2;}major=MAJOR(devno_light);minor=MINOR(devno_light);}//注册ret = cdev_add(cdev_light,MKDEV(major,minor),1); if (ret) {pr_err("cdev_add error\n");goto err3;}/***自动创建设备节点***/class_light=class_create(THIS_MODULE,CNAME);if(IS_ERR(class_light)){pr_err("class_create error");ret = PTR_ERR(class_light);goto err4;}device_light = device_create(class_light,NULL,MKDEV(major,minor),NULL,CNAME);if(IS_ERR(device_light)){pr_err("device_create error");ret = PTR_ERR(device_light);goto err5;}/***初始化中断***///获取软中断号irqno_light=platform_get_irq(dev,0);if(irqno_light < 0){pr_err("platform_get_irq error");ret = irqno_light;goto err6;}//3.注册中断号ret = request_irq(irqno_light,light_irq_handler,IRQF_TRIGGER_FALLING,"light_IRQ",NULL);if(ret){pr_err("request_irq error");goto err6;}return 0;
err6:device_destroy(class_light, MKDEV(major,minor));
err5:class_destroy(class_light);
err4:cdev_del(cdev_light);
err3:unregister_chrdev_region(MKDEV(major,minor),1);
err2:kfree(cdev_light);
err1:return ret;
}int light_remove(struct platform_device *dev){free_irq(irqno_light,NULL);device_destroy(class_light, MKDEV(major, minor));class_destroy(class_light);cdev_del(cdev_light);unregister_chrdev_region(MKDEV(major,minor),1);kfree(cdev_light);return 0;
}//设备树匹配
struct of_device_id	light_of_match[]={{.compatible="zyx,light"},{},
};
struct platform_driver light_driver={.probe=light_probe,.remove=light_remove,.driver={.name="light_driver",.of_match_table=light_of_match,},
};module_platform_driver(light_driver);
MODULE_LICENSE("GPL");

实验现象:

当触发光电开关的中断时,就会打印提示信息
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/443117.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据驱动投资:AI在股票市场的应用

当ChatGPT首次亮相时&#xff0c;其卓越的语言处理能力立刻引起了许多行业的广泛关注&#xff0c;投资界也不例外。关于ChatGPT是否能应用于投资决策的问题&#xff0c;迅速成为热门讨论的焦点。 近期&#xff0c;加拿大多伦多大学和印度孟买理工学院的研究人员联合开展了一项…

[论文阅读] DVQA: Understanding Data Visualizations via Question Answering

原文链接&#xff1a;http://arxiv.org/abs/1801.08163 启发&#xff1a;没太读懂这篇论文&#xff0c;暂时能理解的就是本文提出了一个专门针对条形图问答的数据集DVQA以及一个端到端模型SANDY&#xff0c;模型有两个版本&#xff0c;Oracle和OCR。主要解决的问题是固定词表无…

C++ —— 优先级队列(priority queue)的模拟实现

目录 杂谈 vector和list的区别 1. 优先级队列的定义 2. 优先级队列的模拟实现 3. 仿函数 链接&#xff1a; priority_queue - C Reference (cplusplus.com)https://legacy.cplusplus.com/reference/queue/priority_queue/?kwpriority_queue 杂谈 vector和list的区别 在…

UPDATE 和 DELETE数据库表的多行

文章目录 说明程序测试结果 说明 程序 *&---------------------------------------------------------------------* *& Report Z_TEST_1008 *&---------------------------------------------------------------------* *& *&--------------------------…

手机怎样改网络ip地址?内容详尽实用

随着网络技术的发展&#xff0c;更改手机IP地址已成为一种常见需求。本文将详细介绍如何在不同网络环境下更改手机IP地址&#xff0c;包括移动网络和WiFi网络&#xff0c;以及同时适用于两种网络的方法&#xff0c;内容详尽实用&#xff0c;干货满满。 一、适用于移动网络&…

vue3 vue2

vue3.0是如何变快的&#xff1f; diff算法优化 vue2的虚拟dom是进行全局的对比。vue3 新增了静态标记&#xff08;patchFlag&#xff09; 在与上次虚拟节点进行比较的时候&#xff0c;只对比带有patch Flag的节点&#xff0c;并且可以通过flag的信息得知当前节点要对比的具体内…

10.9 Qt事件处理机制

键盘按键调整label移动 #include "widget.h" #include "ui_widget.h" #include <QDebug> #include <QKeyEvent>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);}Widget::~Widget() {delete ui;…

C++——vector

目录 一、简介 二、接口 1.构造 2.空间变化 3.增删查改 三、vector与string的区别 四、模拟实现 vector.h test.cpp 一、简介 vector&#xff0c;其实就是我们C语言学过的动态顺序表&#xff0c;一个可以存储任何数据类型&#xff0c;可以动态增长的数组。C的STL将其收…

项目完整开发的流程

流程 1.设计产品 2.写需求文档 2.1需求分析&#xff0c;后端设计数据库&#xff0c;建表&#xff0c;客户沟通&#xff0c;说完签字&#xff0c;留证据&#xff0c;防止后面扯皮&#xff0c;和防止后续变需求重新写业务 3.画原型图&#xff0c;也就是草图&#xff0c;初始的…

Java报错输出的信息究竟是什么?

Java报错输出的信息究竟是什么&#xff1f; 本篇会带大家了解一下java运行时报错输出的信息内容&#xff0c;简单学习一下虚拟机内存中Java虚拟机栈的工作方式以及栈帧中所存储的信息内容 异常信息 当你的程序运行报错时&#xff0c;你是否会好奇打印出来的那一大坨红色的究竟…

上海AI Lab视频生成大模型书生.筑梦环境搭建推理测试

引子 最近视频生成大模型层出不穷&#xff0c;上海AI Lab推出新一代视频生成大模型 “书生・筑梦 2.0”(Vchitect 2.0)。根据官方介绍&#xff0c;书生・筑梦 2.0 是集文生视频、图生视频、插帧超分、训练系统一体化的视频生成大模型。OK&#xff0c;那就让我们开始吧。 一、模…

怎么将手机备忘录传送至电脑

在数字化时代&#xff0c;手机备忘录已成为我们生活中不可或缺的一部分。无论是记录购物清单、工作事项&#xff0c;还是灵感闪现的瞬间&#xff0c;手机备忘录都能随时记录下这些宝贵的信息&#xff0c;帮助我们防止遗忘。然而&#xff0c;有时候我们需要将这些备忘录内容转移…

AtCoder Beginner Contest 374

C - Separated Lunch 题目&#xff1a; 思路&#xff1a; dfs枚举每个数是否选入a数组中&#xff0c;求和比较 代码&#xff1a; #include <bits/stdc.h>using namespace std;typedef long long LL;const int N25;int a[N]; bool st[N]; int mn0x3f3f3f3f; int sum; …

thinkphp 学习记录

1、PHP配置 &#xff08;点开链接后&#xff0c;往下拉&#xff0c;找到PHP8.2.2版本&#xff0c;下载的是ZIP格式&#xff0c;解压即用&#xff09; PHP For Windows: Binaries and sources Releases &#xff08;这里是下载地址&#xff09; 我解压的地址是&#xff1a;D:\…

webGL进阶(一)多重纹理效果

效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&q…

初始Linux(二)基础命令

前言&#xff1a; 之前那一篇我们已经介绍了一部分的基础命令&#xff0c;当然那只不过是九牛一毛&#xff0c;本篇我们继续介绍一些比较重要且需要掌握的基础命令。 mv命令&#xff1a; 其实这个命令有两个功能&#xff0c;一个是移动&#xff08;剪切&#xff09;文件&#…

【LeetCode】每日一题 2024_10_9 找到按位或最接近 K 的子数组(LogTrick、位运算)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;找到按位或最接近 K 的子数组 代码与解题思路 今天是 2100 的题目&#xff0c;难度略高&#xff0c;不在我的能力范围&#xff0c;推荐题解&#xff1a;两种方法&#xff1a;LogTrick/滑…

【优选算法】--- 位运算

位运算 一、常见的位运算总结&#xff08;重点&#xff01;&#xff09;1、关于位运算的符号2、&#xff08;判断&#xff09;给一个数字n&#xff0c;确定它的二进制表示中的第X位&#xff0c;是1还是0&#xff1f;3、&#xff08;修改&#xff09;如何把一个二进制的数字的第…

计算机、大数据与人工智能国际学术会议

第五届计算机、大数据与人工智能国际会议由景德镇陶瓷大学主办&#xff0c;西安交通大学、暨南大学、南京邮电大学、长沙学院、景德镇学院、爱迩思出版社&#xff08;ELSP&#xff09;协办。会议于2024年11月1日~3日在江西景德镇举行。在本次会议上发表的文章将出版到会议论文集…

目标检测实战教程Day1(原创)

原创不易&#xff0c;转载请标明本文地址 目标检测一直是计算机视觉领域的核心问题之一&#xff0c;它就像是让计算机拥有了一双“鹰眼”&#xff0c;能在复杂的图像中迅速锁定和识别出各种有趣的目标&#xff0c;比如人、汽车、动物或者任何其他特定物体。在这一章&#xff0c…