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

网站建设为主题调研材料山东省建设机械协会网站

网站建设为主题调研材料,山东省建设机械协会网站,云南建设学院的网站,静态页面网站怎么做文章目录 前言一、SR501模块介绍二、设备树编写三、驱动编写1.确定主设备号2.编写file_operations结构体3.注册file_operations结构体4.出口函数编写5.probe函数和remove函数编写6.中断编写7.测试程序编写8.全部驱动程序 总结 前言 本篇文章将给大家介绍一下SR501驱动程序的编… 文章目录 前言一、SR501模块介绍二、设备树编写三、驱动编写1.确定主设备号2.编写file_operations结构体3.注册file_operations结构体4.出口函数编写5.probe函数和remove函数编写6.中断编写7.测试程序编写8.全部驱动程序 总结 前言 本篇文章将给大家介绍一下SR501驱动程序的编写。 一、SR501模块介绍 SR501是一种基于红外线感应原理的人体感应模块通常被用于安防等一系列自动控制场景中。它主要通过红外线传感器检测感应区域内的人体热辐射当检测到人体进入这个区域时输出高电平信号当人体离开这个区域时输出低电平信号。 SR501模块整体封装在一块小板子上板子上有两个旋钮可以通过旋转它们来调节感应灵敏度和输出信号类型以适应不同的应用场景。此外模块还具有自动感应和手动感应两种模式可以通过调节模式选择开关来进行调节。 SR501模块拥有许多优点例如可以灵敏地探测人体响应速度快、稳定性好、安装简单等等因此被广泛应用于各种人体感应应用场景中。 SR501接线 VCC----电源 GND----GND OUT-----GPIO设置为输入模式 二、设备树编写 这里我将SR501模块接到了GPIO4_19 这里主要需要注意的就是compatible属性使用这个属性来和我们编写的驱动进行匹配。 sr501{compatible my,sr501;gpios gpio4 19 GPIO_ACTIVE_HIGH;}; 三、驱动编写 1.确定主设备号 主设备设置为0让系统自动帮我们分配主设备号。 static int major0;/*主设备号*/2.编写file_operations结构体 我们需要提供这个结构体并且编写其中的open和read函数供应用程序使用。 static ssize_t sr501_read (struct file *file, char __user *buf, size_t size, loff_t *off) {int err;wait_event_interruptible(sr501_wq, sr501_data);err copy_to_user(buf, sr501_data, 4);sr501_data 0;return 0;}static int sr501_open (struct inode *inode, struct file *file) {printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);return 0; }static struct file_operations sr501_ops{.owner THIS_MODULE,.open sr501_open,.read sr501_read, }; 3.注册file_operations结构体 在Linux中注册其实就是指在Linux内核中添加我们自己编写的这个file_operations结构体。这个注册的工作在入口函数中完成。 static int __init sr501_init(void) {int err;printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);/*确定主设备号*/majorregister_chrdev(major, mysr501, sr501_ops);/*创建类*/sr501_classclass_create(THIS_MODULE, sr501);if (IS_ERR(sr501_class)) {printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);unregister_chrdev(major, mysr501);return PTR_ERR(sr501_class);}init_waitqueue_head(sr501_wq);//初始化队列errplatform_driver_register(sr501);return 0; }4.出口函数编写 有入口函数就会有出口函数在入口函数中做的是设备的注册等工作那么出口函数就是做相反的工作将设备注销。 static void __exit sr501_exit(void) {printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);platform_driver_unregister(sr501);class_destroy(sr501_class);unregister_chrdev(major, mysr501); }module_init(sr501_init); module_exit(sr501_exit);MODULE_LICENSE(GPL);5.probe函数和remove函数编写 创建platform_driver结构体和of_device_id结构体使用of_device_id结构体中的compatible 属性和设备树进行匹配匹配完成后会调用到probe函数。 static const struct of_device_id my_sr501[] {{ .compatible my,sr501 },{ }, };static struct platform_driver sr501{.driver {.name sr501,.of_match_table my_sr501, },.probe sr501_probe,.remove sr501_remove, };static int sr501_probe(struct platform_device *pdev) {int err;printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);/*1.获取硬件信息*/sr501_gpiogpiod_get(pdev-dev, NULL, GPIOD_IN);if (IS_ERR(sr501_gpio)) {printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);}/*得到irq*/irq gpiod_to_irq(sr501_gpio);/*申请中断并设置为双边沿触发*/err request_irq(irq, sr501_isr, IRQF_TRIGGER_RISING|IRQF_TRIGGER_FALLING, sr501, NULL);if (err ! 0) {printk(request_irq is err\n);}/*2.创建设备节点*/ device_create(sr501_class, NULL, MKDEV(major, 0), NULL, sr501);return 0; }static int sr501_remove(struct platform_device *pdev) { printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);device_destroy(sr501_class, MKDEV(major, 0));free_irq(irq, NULL);gpiod_put(sr501_gpio);return 0; }6.中断编写 这里我们使用中断来实现SR501的核心功能因为当检测到有人的时候SR501表现为高电平没有人的时候SR501则表现为低电平。那么这样我们就可以把SR501的引脚配置为中断引脚当电平发生变化的时候就会产生中断。 这里使用到了wait_queue_head_t 定义了一个等待队列当有人的时候使用wake_up函数唤醒等待队列读取数据。 static wait_queue_head_t sr501_wq;/*等待队列*/static irqreturn_t sr501_isr(int irq, void *dev_id) {int val gpiod_get_value(sr501_gpio);if(val){sr501_data 1;wake_up(sr501_wq);}return IRQ_HANDLED; // IRQ_WAKE_THREAD; }7.测试程序编写 有了驱动程序后相应的也需要一个应用程序来测试驱动代码是否正确在应用程序中使用read函数来读取数据。 #include sys/types.h #include sys/stat.h #include fcntl.h #include unistd.h #include stdio.h #include string.h #include poll.h #include signal.h #include unistd.h/** ./sr501_test /dev/sr501**/ int main(int argc, char **argv) {int fd;int data;/* 1. 判断参数 */if (argc ! 2) {printf(Usage: %s dev\n, argv[0]);return -1;}/* 2. 打开文件 */ // fd open(argv[1], O_RDWR | O_NONBLOCK);fd open(argv[1], O_RDWR);if (fd -1){printf(can not open file %s\n, argv[1]);return -1;}while (1){read(fd, data, 4);if (data){printf(have people\n);}else{printf(no people\n);} sleep(1);}close(fd);return 0; } 8.全部驱动程序 #include linux/module.h #include linux/poll.h#include linux/fs.h #include linux/errno.h #include linux/miscdevice.h #include linux/kernel.h #include linux/major.h #include linux/mutex.h #include linux/proc_fs.h #include linux/seq_file.h #include linux/stat.h #include linux/init.h #include linux/device.h #include linux/tty.h #include linux/kmod.h #include linux/gfp.h #include linux/gpio/consumer.h #include linux/platform_device.h #include linux/of_gpio.h #include linux/of_irq.h #include linux/interrupt.h #include linux/irq.h #include linux/slab.h #include linux/fcntl.h #include linux/timer.h #include linux/workqueue.h #include asm/current.h #include linux/delay.h #include linux/timex.hstatic int major0;/*主设备号*/ static struct class *sr501_class; static struct gpio_desc *sr501_gpio;/*sr501 gpio*/ static int sr501_data 0; static int irq;/*中断号*/ static wait_queue_head_t sr501_wq;/*等待队列*/static ssize_t sr501_read (struct file *file, char __user *buf, size_t size, loff_t *off) {int err;wait_event_interruptible(sr501_wq, sr501_data);err copy_to_user(buf, sr501_data, 4);sr501_data 0;return 0;}static int sr501_open (struct inode *inode, struct file *file) {printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);return 0; }static struct file_operations sr501_ops{.owner THIS_MODULE,.open sr501_open,.read sr501_read, };static irqreturn_t sr501_isr(int irq, void *dev_id) {int val gpiod_get_value(sr501_gpio);if(val){sr501_data 1;wake_up(sr501_wq);}return IRQ_HANDLED; // IRQ_WAKE_THREAD; }static int sr501_probe(struct platform_device *pdev) {int err;printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);/*1.获取硬件信息*/sr501_gpiogpiod_get(pdev-dev, NULL, GPIOD_IN);if (IS_ERR(sr501_gpio)) {printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);}/*得到irq*/irq gpiod_to_irq(sr501_gpio);/*申请中断并设置为双边沿触发*/err request_irq(irq, sr501_isr, IRQF_TRIGGER_RISING|IRQF_TRIGGER_FALLING, sr501, NULL);if (err ! 0) {printk(request_irq is err\n);}/*2.创建设备节点*/ device_create(sr501_class, NULL, MKDEV(major, 0), NULL, sr501);return 0; }static int sr501_remove(struct platform_device *pdev) { printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);device_destroy(sr501_class, MKDEV(major, 0));free_irq(irq, NULL);gpiod_put(sr501_gpio);return 0; }static const struct of_device_id my_sr501[] {{ .compatible my,sr501 },{ }, };static struct platform_driver sr501{.driver {.name sr501,.of_match_table my_sr501, },.probe sr501_probe,.remove sr501_remove, };static int __init sr501_init(void) {int err;printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);/*确定主设备号*/majorregister_chrdev(major, mysr501, sr501_ops);/*创建类*/sr501_classclass_create(THIS_MODULE, sr501);if (IS_ERR(sr501_class)) {printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);unregister_chrdev(major, mysr501);return PTR_ERR(sr501_class);}init_waitqueue_head(sr501_wq);//初始化队列errplatform_driver_register(sr501);return 0; }static void __exit sr501_exit(void) {printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);platform_driver_unregister(sr501);class_destroy(sr501_class);unregister_chrdev(major, mysr501); }module_init(sr501_init); module_exit(sr501_exit);MODULE_LICENSE(GPL); 总结 本篇文章就讲解到这里只要掌握Linux驱动的核心框架写一个驱动程序并不是那么困难。
文章转载自:
http://www.morning.tzrmp.cn.gov.cn.tzrmp.cn
http://www.morning.prsxj.cn.gov.cn.prsxj.cn
http://www.morning.pntzg.cn.gov.cn.pntzg.cn
http://www.morning.pjjkz.cn.gov.cn.pjjkz.cn
http://www.morning.splcc.cn.gov.cn.splcc.cn
http://www.morning.pybqq.cn.gov.cn.pybqq.cn
http://www.morning.nqmkr.cn.gov.cn.nqmkr.cn
http://www.morning.pjrql.cn.gov.cn.pjrql.cn
http://www.morning.yunease.com.gov.cn.yunease.com
http://www.morning.bmts.cn.gov.cn.bmts.cn
http://www.morning.fxzw.cn.gov.cn.fxzw.cn
http://www.morning.zkbxx.cn.gov.cn.zkbxx.cn
http://www.morning.cpnlq.cn.gov.cn.cpnlq.cn
http://www.morning.uqrphxm.cn.gov.cn.uqrphxm.cn
http://www.morning.tnthd.cn.gov.cn.tnthd.cn
http://www.morning.hkng.cn.gov.cn.hkng.cn
http://www.morning.kxgn.cn.gov.cn.kxgn.cn
http://www.morning.nhdw.cn.gov.cn.nhdw.cn
http://www.morning.ygrdb.cn.gov.cn.ygrdb.cn
http://www.morning.tgyqq.cn.gov.cn.tgyqq.cn
http://www.morning.yrbq.cn.gov.cn.yrbq.cn
http://www.morning.dmxzd.cn.gov.cn.dmxzd.cn
http://www.morning.wqmpd.cn.gov.cn.wqmpd.cn
http://www.morning.jtdrz.cn.gov.cn.jtdrz.cn
http://www.morning.chzqy.cn.gov.cn.chzqy.cn
http://www.morning.trtxt.cn.gov.cn.trtxt.cn
http://www.morning.llmhq.cn.gov.cn.llmhq.cn
http://www.morning.thrcj.cn.gov.cn.thrcj.cn
http://www.morning.lhxrn.cn.gov.cn.lhxrn.cn
http://www.morning.zrpys.cn.gov.cn.zrpys.cn
http://www.morning.qhmgq.cn.gov.cn.qhmgq.cn
http://www.morning.yzmzp.cn.gov.cn.yzmzp.cn
http://www.morning.frfnb.cn.gov.cn.frfnb.cn
http://www.morning.xxhc.cn.gov.cn.xxhc.cn
http://www.morning.bssjp.cn.gov.cn.bssjp.cn
http://www.morning.lfbzg.cn.gov.cn.lfbzg.cn
http://www.morning.ktlxk.cn.gov.cn.ktlxk.cn
http://www.morning.qytpt.cn.gov.cn.qytpt.cn
http://www.morning.nkjxn.cn.gov.cn.nkjxn.cn
http://www.morning.tkzrh.cn.gov.cn.tkzrh.cn
http://www.morning.qxdrw.cn.gov.cn.qxdrw.cn
http://www.morning.ktrh.cn.gov.cn.ktrh.cn
http://www.morning.gjzwj.cn.gov.cn.gjzwj.cn
http://www.morning.bwnd.cn.gov.cn.bwnd.cn
http://www.morning.dmrjx.cn.gov.cn.dmrjx.cn
http://www.morning.cknws.cn.gov.cn.cknws.cn
http://www.morning.syrzl.cn.gov.cn.syrzl.cn
http://www.morning.xqwq.cn.gov.cn.xqwq.cn
http://www.morning.kcyxs.cn.gov.cn.kcyxs.cn
http://www.morning.kvzvoew.cn.gov.cn.kvzvoew.cn
http://www.morning.jbxmb.cn.gov.cn.jbxmb.cn
http://www.morning.ptslx.cn.gov.cn.ptslx.cn
http://www.morning.rszbj.cn.gov.cn.rszbj.cn
http://www.morning.qykxj.cn.gov.cn.qykxj.cn
http://www.morning.ldmtq.cn.gov.cn.ldmtq.cn
http://www.morning.rgwrl.cn.gov.cn.rgwrl.cn
http://www.morning.yrfxb.cn.gov.cn.yrfxb.cn
http://www.morning.rlhgx.cn.gov.cn.rlhgx.cn
http://www.morning.bpmnc.cn.gov.cn.bpmnc.cn
http://www.morning.dqwkm.cn.gov.cn.dqwkm.cn
http://www.morning.lbrrn.cn.gov.cn.lbrrn.cn
http://www.morning.gjssk.cn.gov.cn.gjssk.cn
http://www.morning.grjh.cn.gov.cn.grjh.cn
http://www.morning.qsbcg.cn.gov.cn.qsbcg.cn
http://www.morning.mm27.cn.gov.cn.mm27.cn
http://www.morning.bhwll.cn.gov.cn.bhwll.cn
http://www.morning.nyfyq.cn.gov.cn.nyfyq.cn
http://www.morning.jfqpc.cn.gov.cn.jfqpc.cn
http://www.morning.ghryk.cn.gov.cn.ghryk.cn
http://www.morning.wbxr.cn.gov.cn.wbxr.cn
http://www.morning.rmryl.cn.gov.cn.rmryl.cn
http://www.morning.dmthy.cn.gov.cn.dmthy.cn
http://www.morning.gpryk.cn.gov.cn.gpryk.cn
http://www.morning.bynf.cn.gov.cn.bynf.cn
http://www.morning.rlbc.cn.gov.cn.rlbc.cn
http://www.morning.wwjft.cn.gov.cn.wwjft.cn
http://www.morning.xymkm.cn.gov.cn.xymkm.cn
http://www.morning.bpmfr.cn.gov.cn.bpmfr.cn
http://www.morning.tqsgt.cn.gov.cn.tqsgt.cn
http://www.morning.kqbzy.cn.gov.cn.kqbzy.cn
http://www.tj-hxxt.cn/news/244860.html

相关文章:

  • 大型网站开发 赚钱查询个人营业执照信息
  • 国内网站域名怎么在运行打开wordpress
  • 网站seo知识网站建设公司话术
  • SEO网站价格常州做自动化的公司
  • 河南省建设厅电话号码是多少seo技术代理
  • 做只在自己电脑上的网站wordpress 前端投稿插件
  • 做百度推广去些网站加客户旅游网站开发说明
  • 杭州网站建设排名公司长沙建站
  • 网站流量下降mvc做门户网站
  • 高速公路建设论坛网站东莞大岭山注册公司
  • 海宁高端高端网站设计浙江城乡和住房建设网
  • 做网站需要看什么书视频网站建设流程
  • 做网站需要公司吗套别人代码做网站
  • 专业做网站公司哪家技术好哈尔滨建站的网站
  • 青冈网站建设国外教育网站模板
  • 牡丹区住房城乡建设局网站旅游网站内容规划
  • 个人网站做什么好长沙室内设计
  • 商城网站用什么做建始县城乡建设局网站
  • 做企业网站收费价格php房产网站开发教程
  • 网站建设介绍ppt专业开发小程序公司
  • 网站开发合作意向协议书怎么设置网站默认首页
  • 温州企业自助建站系统有关网站建设的文章
  • 中企动力做的网站成都网站优化
  • 达州建设企业网站大气有格局的公司名字
  • wordpress开通多站点好处顺德网站设计
  • 印度电商平台网站建设策划外贸建站
  • 游戏网站策划微信开发什么时候好
  • 龙岗网站建设价格太原网络推广哪家好
  • 东莞常平网站建设互联网广告推广
  • 网站后台word编辑器设计手机访问的网站