1.编写设备树,添加蜂鸣器等设备

驱动代码:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/i2c.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/device.h>
#include "si7006.h"
#include <linux/of_gpio.h>
#include <linux/gpio.h>
int major;
struct class *cls;
struct device *dev;
//tclient指向的结构体,存储设备驱动和总线驱动匹配成功的信息
struct i2c_client *tclient;
//指向gpio节点
struct device_node *node;
//定义结构体指针指向gpio编号
struct gpio_desc *gpiono;
int rcv;
//获取温湿度的函数
int i2c_read_hum_tem(unsigned char reg)
{int  ret;char r_buf[]={reg}; //地址放到数组中,读取消息unsigned short val; //读的数据//设备驱动将要收发的消息放到结构体中struct i2c_msg r_msg[]={[0]={.addr=tclient->addr,.flags=0,.len=1,  //发送的地址长度是8bit一字节.buf=r_buf,},[1]={.addr=tclient->addr,.flags=1,.len=2,.buf=(char*)&val,}};//消息传输ret=i2c_transfer(tclient->adapter,r_msg,ARRAY_SIZE(r_msg));if(ret!=ARRAY_SIZE(r_msg)){printk("获取温湿度数据失败\n");return -EAGAIN;}return val;
}
int si7006_open(struct inode *inode, struct file *file)
{printk("open\n");return 0;
}
long si7006_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{int tem,hum;int ret;switch(cmd){case GET_HUM:hum=i2c_read_hum_tem(0xe5);ret=copy_to_user((void*)arg,(void*)&hum,sizeof(int));if(ret){printk("copy to user failed\n");return -EINVAL;}break;case GET_TEM:tem=i2c_read_hum_tem(0xe3);ret=copy_to_user((void*)arg,(void*)&tem,sizeof(int));if(ret){printk("copy to user failed\n");return -EINVAL;}break;case FENGM:gpiod_set_value(gpiono,1);break;}return 0;
}
int si7006_close(struct inode *inode, struct file *file)
{printk("close\n");return 0;
}
struct file_operations fops={.open=si7006_open,.unlocked_ioctl=si7006_ioctl,.release=si7006_close,
};
//注册字符设备驱动
int chrdev(void){major=register_chrdev(0,"si7006",&fops);if(major<0){printk("字符设备驱动注册失败\n");return major;}printk("字符设备驱动注册成功\n");//自动创建设备节点cls=class_create(THIS_MODULE,"si7006");if(IS_ERR(cls)){printk("向上提交目录失败\n");return PTR_ERR(cls);}printk("向上提交目录成功\n");dev=device_create(cls,NULL,MKDEV(major,0),NULL,"si7006");if(IS_ERR(dev)){printk("向上提交设备信息失败\n");return PTR_ERR(dev);}printk("向上提交设备信息成功\n");return 0;}//定义一个probe函数int si7006_probe(struct i2c_client *client,const struct i2c_device_id *id){tclient=client;//将总线驱动指针编程全局的//注册字符设备驱动rcv=chrdev();//获取节点信息node=of_find_node_by_name(NULL,"extend_dev");if(node==NULL){printk("通过名字解析设备树节点失败\n");return -EFAULT;}printk("设备树解析成功\n");//获取并申请gpio编号,键值fengmgpiono=gpiod_get_from_of_node(node,"fengm",0,GPIOD_OUT_LOW,NULL);if(IS_ERR(gpiono)){printk("获取gpiono 失败\n");return PTR_ERR(gpiono);}printk("获取gpiono 成功\n");return 0;}//设备分离后执行removeint si7006_remove(struct i2c_client *client){gpiod_set_value(gpiono,0);//销毁设备节点device_destroy(cls,MKDEV(major,0));//销毁目录class_destroy(cls);//驱动注销unregister_chrdev(major,"si7006");printk("%s:%d",__func__,__LINE__);return 0;}struct of_device_id oftable[]={{.compatible="hqyj,si7006",},{},};//热插拔宏,可以在插入硬件时,自动安装驱动MODULE_DEVICE_TABLE(of,oftable);//对象初始化struct i2c_driver si7006={.probe=si7006_probe,.remove=si7006_remove,  .driver={.name="tem_hum_driver",  //按名字匹配,只能匹配一个设备.of_match_table=oftable,//设备树匹配     }, };module_i2c_driver(si7006);
MODULE_LICENSE("GPL");

应用层代码:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include "si7006.h"
int main(int argc, char const *argv[])
{int hum,tem;float hum1,tem1;int ret;int ubuf[20];int fd=open("/dev/si7006",O_RDWR);if(fd<0){printf("打开设备文件失败\n");exit(-1);}while(1){//通过ioctl获取温湿度,放到tem,hum所在的地址ioctl(fd,GET_TEM,&tem);ioctl(fd,GET_HUM,&hum);//大端转小端hum=ntohs(hum);tem=ntohs(tem);//温湿度转换hum1=125.0*hum/65536-6;tem1=175.72*tem/65536-46.85;printf("tem:%f hum=%f\n",tem1,hum1);//当湿度达到70触发警报---PB6蜂鸣器if(hum1>=70){ioctl(fd,FENGM);printf("警报\n");}sleep(1);}return 0;
}

头文件:

#ifndef __SI7006_H__
#define __SI7006_H__
//命令码封装,方向,大小,类型m,功能0
#define GET_TEM _IOR('m',0,int)
#define GET_HUM _IOR('m',1,int)
#define FENGM _IOW('u',3,int)
#endif

报错:

[root@fsmp1a /]#rmmod driver.ko
rmmod: can't unload module 'driver': Device or resource busy

解决办法:

vi  /proc/devices

删除驱动信息,重启开发板

实验现象:

当湿度达到70蜂鸣器警报相关推荐

  1. linux关闭硬件蜂鸣器,deepin linux使用日记之如何关闭主板蜂鸣器警报

    故事要从我安装deepin那一天说起 当我听说华为系笔记本要预装deepin的时候,心里只有一个念头 难道国产linux系统成熟了? 我是不是可以从此摆脱windows学习linux走上人生巅峰,成为 ...

  2. 认识蜂鸣器和声音奥秘

    1.编程知识点(循环逻辑.变量) 2.模块知识点(蜂鸣器模块) 3.科学知识点(声音的奥秘) 环境:网络及手机/电脑 准备:小龟小车主控板 第一节:认识蜂鸣器和声音频率(约15分钟) [课程内容] 1 ...

  3. 湿度传感器行业调研报告 - 市场现状分析与发展前景预测

    [出版商]贝哲斯咨询 [免费目录下载]湿度传感器是指用湿敏电阻或湿敏电容元件的传感器件,主要用于湿度测量.湿度传感器可以通过警报来提醒用户湿度的变化. 湿度传感器市场的企业竞争态势 该报告涉及的主要国 ...

  4. 使用Arduino制作激光警报安全系统

    在本篇文章中,我们使用Arduino开发板设计了一款带警报的激光安全系统,该系统使用了激光模块KY-008.本项目的想法围绕着创建安全系统.只要有任何物体遮挡激光射线,蜂鸣器警报就会响起. 该项目可以 ...

  5. 改造一台智能空气净化器【APP控制,滤芯NFC识别、寿命计算】

    文章目录 一. 硬件方案 1. 硬件框图 2. 特性描述 3. 设计方案 3.1 主控单元 3.2 电机控制 3.3 按键与感光传感器 3.4 显示电路 3.5 NFC驱动 3.6 四合一传感器驱动 ...

  6. 智能温室系统 1 arduino采集数据 lora收发数据 控制电机水泵等

    @[智能温室系统第一步传感器数据采集   Arduino # 开发板用的是arduino开发板 使用的是arduino ide   可以去官网下载 我的代码里涉及到了三个外部包LORA     温湿度 ...

  7. 数据中心机房温湿度监测

    现在,数据中心运营商都知道监测数据中心温度的重要性.数据中心温度变化,就可能会为数据中心的冷却系统和敏感设备带来不必要的压力,特别是在温度较高或在炎热的夏季. 虽然许多数据中心运营商积极监测数据中心的 ...

  8. 基于STC89C51单片机的温湿度检测系统

    基于STC89C51单片机的温湿度检测系统 摘 要:设计一种计算机教室温度.湿度检测系统,用于控制机房的温.湿度.整个系统采用STC89C51微处理器作为主控系统,硬件电路主要包括51单片机.DHT1 ...

  9. 基于RFID技术的考勤系统设计

    基于RFID技术的考勤系统设计 目录 基于RFID技术的考勤系统设计 前言 一.设计方案 1.1 总设计框图 1.2功能简述 1.3硬件仿真图 二.基于RFID考勤管理系统设计 2.1单片机STC89 ...

最新文章

  1. row number mysql_MySQL中的ROW_NUMBER()
  2. [Share]2008年国外最佳Web设计/开发技巧、脚本及资源总结
  3. IT外企那点事[转载]
  4. 【60岁老人年审】老来网app养老保险年审的好伙伴【本地年审】【异地年审】【不参加年审无法领取养老保险金】...
  5. python最基础_python的最基础的知识点
  6. 【leetcode】937. Reorder Log Files
  7. 云原生数据库 2.0:一站式全链路数据管理与服务
  8. springBoot Maven改成war包
  9. 转:RMAN 备份与恢复 实例
  10. 同比暴增3700%!百度取代谷歌成世界第二
  11. 【Java】Java之Collections.emptyList()、emptySet()、emptyMap()的作用和好处以及要注意的地方
  12. arduino 舵机接线图_用fritzing绘制arduino硬件连线图
  13. 关于JXL读写以及修改EXCEL文件转
  14. 软件工程师如何自学成才?
  15. python核心理念_《三天搞定Python基础概念之第一天》中文版
  16. 标准C程序设计七---121
  17. proDAD Mercalli 2020V5.0.461注册激活码版视频稳定防抖软件
  18. EXCEL制作统计图表
  19. sqlyog错误号码2058解决方式
  20. Excel-查找与引用函数

热门文章

  1. Python黑客技术必备知识点【一】
  2. HQChart报价列表高级应用教程2-东方财富数据对接自选股列表
  3. pycharm输出中文乱码解决方案
  4. 关于 SAP UI5 Container 控件 aggregation 的深入分析试读版
  5. java面试资料(一)
  6. Java程序员在面试中不通过的五个原因
  7. 《大道至简》-观后感2
  8. Columbia Biosciences 山羊抗鸡 IgY说明
  9. 工作流参与者和工作项模式分析
  10. 改变eclipse的主题,使用IDEA的黑色主题