当湿度达到70蜂鸣器警报
创始人
2024-03-04 00:11:54
0

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

 驱动代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include "si7006.h"
#include 
#include 
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 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#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

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

实验现象: 

相关内容

热门资讯

党建擎旗三十载,广州律师以“四... 红色,始终是广州律师行业最鲜明的底色。 自1995年广州市律师协会党总支成立,广州律师行业党建已走过...
快手称遭黑灰产攻击出现涉黄内容... 极目新闻记者 郭奕 12月22日晚,不少网友反映快手直播间出现大量色情内容,包括播放淫秽影片、主播擦...
2025年“法规体检”发现纠正... 12月22日,全国人大常委会法工委关于2025年备案审查工作情况的报告提请全国人大常委会会议审议。在...
政策“扶上马” 青春“创未来” 青年逐梦正当时,创业建功新时代。南宁市将高校毕业生创业扶持作为促进高质量充分就业的关键抓手,以“真金...
准确把握高职资源下沉政策精髓 《教育强国建设规划纲要(2024—2035年)》明确提出“推动有条件地区将高等职业教育资源下沉到市县...
双阳法院“苔花工程”太平联合工... 广大农民朋友们,关于土地的相关法律知识,你知道多少?你知道土地的哪些合法权益是受法律保护的?倘若你也...
减负超600亿元,我国将推动长... 2025年全国长期护理保险高质量发展大会昨天在浙江宁波举行。记者从大会上了解到,我国自2016年开展...
《纽约时报》记者就AI训练侵犯... 12月23日消息,据路透社报道,一位因揭露硅谷血液检测初创公司Theranos的欺诈行为而闻名的调查...
亿达中国面临6.12亿元债务清... 观点网讯:12月22日,亿达中国发布内幕消息,涉及诉讼公告。 此前,亿达中国附属公司荣泰公司、郑州亿...
以技术化、制度化、法治化提升公... □江秋伟 党的二十届四中全会提出,推进国家安全体系和能力现代化,建设更高水平平安中国。近年来,美国等...