当前位置: 首页 > news >正文

Linux火焰传感器驱动程序

ioremap()地址映射

ioremap 函数用于将设备的物理地址映射到内核的虚拟地址空间,这样内核就可以通过普通的指针访问硬件寄存器。

void *regGPGCON = ioremap(0x00000000, 4);

这里的 0x00000000 是 物理地址,而 regGPGCON 指向的是 虚拟地址。


void *regGPGCON;
regGPGCON = ioremap(GPGCON, 4);

GPGCON 是 物理地址,即硬件寄存器的实际地址。

regGPGCON 是 虚拟地址,即通过 ioremap 映射后的地址,用于内核访问硬件寄存器。

等待队列 Wait Queue 处理内核中断

等待队列:是一个数据结构,用于跟踪一组等待特定事件发生的进程。

等待队列条目:每个进程都会在等待队列中有一个对应的条目,记录着进程的状态和其他相关信息。

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/miscdevice.h>
#include <linux/irqreturn.h>
#include <linux/interrupt.h>
#include <linux/sched.h>
#include <linux/wait.h>
#include <mach/irqs.h>
#include <asm/uaccess.h>
#include <asm/io.h>#define GPGCON (0x56000060)   //端口控制寄存器  用来设置端口的引脚功能  将来配为 外部中断EINT模式
#define GPGDAT (0X56000064)	  //数据寄存器    在EINT模式下  如果检测到外部中断 就会改变这个寄存器的电平   读取引脚的电平
#define GPGUP  (0x56000068)  // 上拉使能寄存器static unsigned int *regGPGCON; // 物理地址映射到虚拟地址  所指向的指针
static unsigned int *regGPGDAT;
static unsigned int *regGPGUP;static wait_queue_head_t wq;  // 等待队列队头
static int condition;    // 等待条件
int fire = 0;irqreturn_t fire_handler(int irq_num,void *dev)
{if(irq_num == IRQ_EINT15){fire = 1;}condition = 1;wake_up(&wq);return IRQ_HANDLED;
}int fire_open(struct inode *p_node,struct file *fp)
{return 0;
}int fire_release(struct inode *p_node,struct file *fp)
{return 0;
}ssize_t fire_write(struct file *fp,const char __user *user_buffer,size_t n,loff_t *offset)
{return 0;
}ssize_t fire_read(struct file *fp,char __user *user_buffer,size_t n,loff_t *offset)
{condition = 0;wait_event_interruptible(wq,condition);copy_to_user(user_buffer,&fire,4);fire = 0;return sizeof(fire);
}static struct file_operations fops =
{.owner = THIS_MODULE,.open = fire_open,.release = fire_release,.read = fire_read,
};
//定义了一个杂项设备,用于注册设备节点。
static struct miscdevice fire_device =
{.minor = MISC_DYNAMIC_MINOR,.fops = &fops,.name = "fire"
};static int __init fire_driver_init(void)
{int ret;ret = misc_register(&fire_device);if(ret){printk("misc_register is error");return ret;}ret = request_irq(IRQ_EINT15,fire_handler,IRQF_TRIGGER_RISING | IRQF_DISABLED,"fire_irq",&fire_device);if(ret){printk("request_irq is error\n");misc_deregister(&fire_device);}init_waitqueue_head(&wq);regGPGCON = ioremap(GPGCON,4);regGPGDAT = ioremap(GPGDAT,4);regGPGUP = ioremap(GPGUP,4);return 0;
}void __exit fire_exit(void)
{iounmap(regGPGCON);iounmap(regGPGDAT);iounmap(regGPGUP);disable_irq(IRQ_EINT15);free_irq(IRQ_EINT15,&fire_device);misc_deregister(&fire_device);
}module_init(fire_driver_init);
module_exit(fire_exit);MODULE_LICENSE("GPL");

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • .NET程序集编辑器/调试器 dnSpy 使用介绍
  • 安卓开机启动性能优化之-bootchart相关工具使用及查看
  • 【Django】在vscode中新建Django应用并新增路由
  • 模拟电子技术-实验四 二极管电路仿真
  • IDEA缓存和索引
  • css中如何清除浮动
  • js点击或者双击页面使其全屏,并且内容自适应
  • C++ : 序列容器之Vector
  • 面试场景题系列--(3)如何避免超预期的高并发压力压垮系统?限流算法--xunznux
  • 微服务架构下Mojo模型的创新应用:细粒度服务与智能优化
  • 【LLM】-08-搭建问答系统-语言模型,提问范式与 Token
  • 虚拟机centos9搭建wordpress
  • c++ 自定义异常
  • 相机的内参与外参
  • 端到端自动驾驶科普向
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • [笔记] php常见简单功能及函数
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 「面试题」如何实现一个圣杯布局?
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 78. Subsets
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Meteor的表单提交:Form
  • mysql中InnoDB引擎中页的概念
  • react-native 安卓真机环境搭建
  • 翻译--Thinking in React
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 老板让我十分钟上手nx-admin
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 浅谈Golang中select的用法
  • 嵌入式文件系统
  • 新手搭建网站的主要流程
  • 学习笔记TF060:图像语音结合,看图说话
  • 转载:[译] 内容加速黑科技趣谈
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 7行Python代码的人脸识别
  • 交换综合实验一
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • $ git push -u origin master 推送到远程库出错
  • (10)STL算法之搜索(二) 二分查找
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (ZT)出版业改革:该死的死,该生的生
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (分布式缓存)Redis哨兵
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (力扣题库)跳跃游戏II(c++)
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (转) RFS+AutoItLibrary测试web对话框
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .NET gRPC 和RESTful简单对比
  • .Net IE10 _doPostBack 未定义