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

驱动开发11-1 编写IIC驱动-读取温湿度数据

头文件 head.h

#ifndef __HEAD_H__
#define __HEAD_H__
#define GET_HUM _IOR('m', 1, int)
#define GET_TEM _IOR('m', 0, int)
#endif

应用程序 si7006.c

#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include "head.h"int main(int argc, char const *argv[])
{char buf[128]={0};unsigned short hum,tem;float hum1,tem1;int fd = open("/dev/si7006",O_RDWR);if(fd < 0){printf("打开设备文件失败\n");exit(-1);}while(1){//读取温湿度数据ioctl(fd,GET_HUM,&hum);ioctl(fd,GET_TEM,&tem);//进行字节序转换hum = ntohs(hum);tem = ntohs(tem);//数据转换hum1 = (float)hum*125/65536-6;tem1 = (float)tem*175.72/65536-46.85;printf("hum = %f    tem = %f\n",hum1,tem1);sleep(1);}close(fd);return 0;
}

驱动程序 iic.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/i2c.h>
#include <linux/fs.h>
#include <linux/device.h>
#include "head.h"struct i2c_client *client1;
unsigned int major;
struct class *cls;
struct device *dev;
//封装读取温湿度数据的函数
short read_hum_tem_value(char reg)
{short value; //保存读到的温湿度数据char r_buf[] = {reg};//消息结构体的封装struct i2c_msg r_msg[] = {[0] = {.addr = client1->addr,.flags = 0,.len = sizeof(r_buf),.buf = r_buf,},[1] = {.addr =client1->addr,.flags = 1,.len = 2,.buf = (char *)&value,},};//发送消息int ret = i2c_transfer(client1->adapter,r_msg,2);if(ret != 2){printk("消息传输失败\n");return -1;}return value;
}
int mycdev_open(struct inode *inode, struct file *file)
{printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);return 0;
}
long mycdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{short hum,tem;int ret;switch ((cmd)){case GET_HUM:hum = read_hum_tem_value(0xE5);ret = copy_to_user((void *)arg,&hum,2);if(ret){printk("coyp_to_user err %d\n",__LINE__);}break;case GET_TEM:tem = read_hum_tem_value(0xE5);ret = copy_to_user((void *)arg,&tem,2);if(ret){printk("coyp_to_user err %d\n",__LINE__);}break;}return 0;
}
int mycdev_close(struct inode *inode, struct file *file)
{printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);return 0;
}
//定义操作方法结构体变量并复制
struct file_operations fops = {.open = mycdev_open,.unlocked_ioctl = mycdev_ioctl,.release = mycdev_close,
};
//给对象分配空间并且初始化
int i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
{client1 = client;int ret;//float hum1,tem1;printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);//字符设备驱动的注册major = register_chrdev(0,"si7006",&fops);if(major < 0){printk("字符设备驱动注册失败\n");ret = major;goto out1;}printk("字符设备驱动注册成功\n");//向上提交目录cls = class_create(THIS_MODULE,"si7006");if(IS_ERR(cls)){printk("向上提交目录失败\n");ret = -PTR_ERR(cls);goto out2;}printk("向上提交目录成功\n");//向上提交设备节点信息dev = device_create(cls,NULL,MKDEV(major,0),NULL,"si7006");if(IS_ERR(dev)){printk("向上提交设备节点失败\n");ret = -PTR_ERR(dev);goto out3;}printk("向上提交设备节点成功\n");return 0;
out3:class_destroy(cls);
out2:unregister_chrdev(major,"si7006");
out1:return ret;
}
int i2c_remove(struct i2c_client *client)
{printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);//设备信息的注销device_destroy(cls,MKDEV(major,0));//设备节点的销毁class_destroy(cls);//驱动的注销unregister_chrdev(major,"si7006");return 0;
}
//定义设备树匹配的表
struct of_device_id oftable[]={{.compatible="hqyj,si7006",},{},
};
struct i2c_driver i2c_drv={.probe=i2c_probe,.remove=i2c_remove,.driver={.name="si7006",.of_match_table=oftable,},
};
module_i2c_driver(i2c_drv);
MODULE_LICENSE("GPL");

效果演示

相关文章:

驱动开发11-1 编写IIC驱动-读取温湿度数据

头文件 head.h #ifndef __HEAD_H__ #define __HEAD_H__ #define GET_HUM _IOR(m, 1, int) #define GET_TEM _IOR(m, 0, int) #endif 应用程序 si7006.c #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #inc…...

上海中优城市万豪酒店推出全新国际IP童趣主题房,独特住宿体验中国首秀

2023年10月30日&#xff0c;中国上海 – 近日&#xff0c;上海中优城市万豪酒店正式推出由全球品牌娱乐公司孩之宝官方授权打造的小马宝莉和变形金刚主题客房&#xff0c;以创意客房、新奇体验和丰富礼遇&#xff0c;为童游家庭或年轻的动漫迷们开启沉浸式入住之旅&#xff0c;…...

zsh和bash之间互相切换

zsh->bash exec bashbash->zsh exec zsh...

Java - window系统快捷键大全

Ctrl 快捷键 介绍 Ctrl F 在当前文件进行文本查找 &#xff08;必备&#xff09; Ctrl R 在当前文件进行文本替换 &#xff08;必备&#xff09; Ctrl Z 撤销 &#xff08;必备&#xff09; Ctrl Y 删除光标所在行 或 删除选中的行 &#xff08;必备&#xff09; Ctrl X …...

深入理解数据结构(1)—用链表实现栈

栈是一种数据结构&#xff0c;链表也是一种数据结构。它们都是由基础的语法实现的。 如果一个数据结构可以用另外的数据结构来实现&#xff0c;那么可以有力的证明——“数据结构是一种思想”&#xff0c;是一种讲语法组合起来实现某种功能的手段 一、栈的特点——要实现哪些功…...

Jtti:debian安装firewalld错误怎么办

如果在Debian系统上安装Firewalld时出现错误&#xff0c;可以尝试以下步骤来解决问题&#xff1a; 更新软件包列表&#xff1a; 首先确保您的Debian系统的软件包列表是最新的。运行以下命令&#xff1a; sudo apt update 安装Firewalld&#xff1a; 使用以下命令安装Firewalld&…...

如何理解python中的*args和**kwargs

args用于表示可变数量的位置参数&#xff08;Positional Arguments&#xff09; kwargs 用于表示可变数量的关键字参数&#xff08;Keyword Arguments&#xff09;。 *args 来接收不定数量的位置参数 实例: def exampleFunc(*args):print(type(args))for arg in args:print…...

软考之软件工程基础理论知识

软件工程基础 软件开发方法 结构化方法 将整个系统的开发过程分为若干阶段&#xff0c;然后依次进行&#xff0c;前一阶段是后一阶段的工作依据按顺序完成。应用最广泛。特点是注重开发过程的整体性和全局性。缺点是开发周期长文档设计说明繁琐&#xff0c;工作效率低开发前要…...

香港服务器不稳定的几种情况

​  近年来&#xff0c;随着互联网的迅猛发展&#xff0c;香港作为一个重要的网络枢纽地区&#xff0c;扮演着连接中国内地和国际网络的重要角色。一些用户表示在使用香港服务器时可能会遇到不稳定的情况&#xff0c;导致访问困难、加载缓慢甚至无法连接。 为什么香港服务器会…...

报修软件有什么用?企业如何做好设备管理与维护?

在当今的商业环境中&#xff0c;设备设施的维护和管理已经成为企业运营的重要环节。无论是学校、酒店、物业等大型企事业单位&#xff0c;还是运维集成商、制造工厂等企业单位&#xff0c;都需要对设备设施进行有效的管理。报修软件作为一种智能化的解决方案&#xff0c;为设备…...

Go语言的键盘输入和打印输出

键盘输入和打印输出 一、打印输出 1.1 fmt包 fmt包实现了类似C语言printf和scanf的格式化I/O。格式化verb&#xff08;‘verb’&#xff09;源自C语言但更简单。 详见官网fmt的API&#xff1a;https://golang.google.cn/pkg/fmt/ 1.2 导入包 import "fmt"1.3 常…...

jenkins实践篇(2)—— 自动打tag的可回滚发布模式

大家好&#xff0c;我是蓝胖子&#xff0c;在上一篇我简单介绍了如何基于特定分支做自动编译和发布&#xff0c;在生产环境中&#xff0c;为了更加安全和快速回滚&#xff0c;我采取的是通过对代码打tag的方式来进行部署&#xff0c;下面我将详细介绍整个发布过程的逻辑。 发布…...

golang worker channel 模式

大概流程就是job -> JobQueue调度器循环获取JobQueue &#xff0c;获取到的job &#xff0c;再去异步获取等待可用的 worker&#xff0c;取出 chan Job,将job 写入改worker的 chan Jobworker 处理任务&#xff0c;先处理 case job : <-w.JobChannel: 处理完成后再将 chan…...

舔狗日记之好一条舔狗

闲来没事&#xff0c;爬了下vx《舔狗日记》&#xff0c;感觉挺有意思的&#xff0c;分享出来给大家看看。 PS&#xff1a;仅供娱乐&#xff0c;侵删。 舔狗2023 舔狗日记 2023年10月11日 晴天 你们根本不懂舔狗的快乐。被舔的人&#xff0c;无法预知接下来会不会继续被舔&…...

【地理位置识别】IP归属地应用的特点

IP归属地应用是一类用于确定特定IP地址的地理位置信息&#xff08;通常是城市、地区或国家&#xff09;的工具和服务。以下是IP归属地应用的几个主要特点&#xff1a; 地理位置识别&#xff1a; IP归属地应用主要用于确定IP地址的地理位置。这可以帮助组织更好地了解其网站访问…...

华为实验基础(2):路由器基础

一、路由器的分类 1、从功能、性能和应用方面划分&#xff1a; &#xff08;1&#xff09; 骨干路由器 &#xff1a;骨干路由器是实现主干网络互连的关键设备&#xff0c;通常采用模块化结构&#xff0c;通过热备 份、双电源和双数据通路等冗余技术提高可靠性 &#xff0c;华…...

婚姻管理系统-使用bbst数据结构

使用到希尔排序和归并排序&#xff0c;文件存储 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <string.h> //名字的最大长度 #define NameMax 30 //全局的文件指针变量 FILE* file, * file_admin, * file_divorce; /…...

软件架构的概念

1.软件架构演化 为了适应用户的新需求、业务环境和运行环境的变化等&#xff0c;软件架构需要不断地进行自身的演化&#xff0c;也就是说软件架构的演化就是为了维持软件架构自身的有用性。 本质上讲&#xff0c;软件架构的演化就是软件整体结构的演化&#xff0c;演化过程涵盖…...

kubernetes存储-secrets

一、从文件创建 二、编写yaml文件 三、将Secret挂载到Volume中 四、向指定路径映射 secret 密钥 五、将Secret设置为环境变量 六、存储docker registry的认证信息...

Springboot使用EasyExcel导入导出Excel文件

1&#xff0c;准备Excel文件和数据库表结果 2&#xff0c;导入代码 1&#xff0c;引入依赖 <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifac…...

实时手机检测-通用GPU算力优化:TensorRT加速后吞吐量提升3.2倍

实时手机检测-通用GPU算力优化&#xff1a;TensorRT加速后吞吐量提升3.2倍 1. 引言&#xff1a;当手机检测遇上性能瓶颈 想象一下&#xff0c;在一个大型活动现场&#xff0c;安保系统需要实时分析数百路监控视频&#xff0c;精准识别出每一部正在使用的手机&#xff0c;以防…...

回文数. Leetcode

给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。例如&#xff0c;121 是回文&#xff0c;而 12…...

色彩心理学与品牌情感:vibrant.js颜色提取终极指南 [特殊字符]

色彩心理学与品牌情感&#xff1a;vibrant.js颜色提取终极指南 &#x1f3a8; 【免费下载链接】vibrant.js Extract prominent colors from an image. JS port of Androids Palette. 项目地址: https://gitcode.com/gh_mirrors/vi/vibrant.js 在数字时代&#xff0c;色彩…...

从零到一:在CentOS 8上构建LNMP环境并部署WordPress实战

1. 环境准备与基础配置 在开始搭建LNMP环境之前&#xff0c;我们需要确保CentOS 8系统处于最佳状态。我建议使用全新的系统环境&#xff0c;这样可以避免各种依赖冲突问题。首先通过SSH连接到服务器&#xff0c;使用dnf update命令更新所有系统软件包。这个步骤很重要&#xff…...

作业2:6位数码管静态显示

文章目录1、数码管显示6个91.1 效果图截屏1.2 代码2、数码管显示2个7&#xff08;一头一尾&#xff09;2.1 效果图截屏2.2 代码3、数码管轮播显示6位3.1 效果图截屏3.2 代码4、数码管轮播显示2位4.1 效果图截屏4.2 代码1、数码管显示6个9 1.1 效果图截屏 1.2 代码 #include&l…...

打工人必备!8个AI办公神器,每天准时下班不是梦

文档处理工具Notion AI 集成在Notion中的AI功能&#xff0c;支持自动生成文档大纲、会议纪要整理、多语言翻译。通过自然语言输入需求&#xff0c;快速输出结构化内容&#xff0c;适合项目管理与知识库搭建。ChatPDF 上传PDF文件后可直接对话式提问&#xff0c;提取关键信息或总…...

Keploy实战:基于真实流量的API自动化测试与Mock生成

1. Keploy是什么&#xff1f;它能解决什么问题&#xff1f; 第一次听说Keploy时&#xff0c;我也和大多数开发者一样疑惑&#xff1a;这工具到底能干嘛&#xff1f;简单来说&#xff0c;Keploy就像是你团队里的一个"影子测试工程师"&#xff0c;它能悄无声息地记录下…...

【数据可视化实战】从API到图表:一步步构建奥运奖牌榜与运动员数据分析平台

1. 数据获取&#xff1a;从API到结构化数据 做数据分析的第一步永远是获取数据。这次我们选择奥运奖牌榜和运动员数据作为案例&#xff0c;主要是因为这类数据公开透明且结构清晰&#xff0c;非常适合新手练手。我实测下来&#xff0c;咪咕视频的奥运数据接口非常稳定&#xf…...

从零开始:用NumPy手搓一个多层感知机(MLP),并和PyTorch结果对齐

从零构建MLP&#xff1a;用NumPy实现与PyTorch对齐的神经网络训练全流程 在深度学习框架高度封装的今天&#xff0c;许多开发者已经习惯了调用现成的API搭建神经网络。但当你真正用NumPy从零实现一个多层感知机&#xff08;MLP&#xff09;&#xff0c;并与PyTorch的结果进行严…...

Nigate:Mac NTFS全功能读写解决方案——面向跨平台用户的高效文件交互指南

Nigate&#xff1a;Mac NTFS全功能读写解决方案——面向跨平台用户的高效文件交互指南 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting…...