linux_驱动_iic总线获取si7006温湿度
应用层si7006.c
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include "head.h"int main(int argc,char const *argv[])
{int tem,hum;float tem1,hum1;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 = 125.0*hum/65536-6;tem1 = 175.72*tem/65536-46.85;printf("tem=%f,hum=%f\n",tem1,hum1);sleep(1);}return 0;
}
驱动层myiic.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/i2c.h>
#include <linux/fs.h>
#include <linux/device.h>
#include "head.h"unsigned int major;
struct class *cls;
struct device *dev;
struct i2c_client *client1;// 读取温湿度的函数
int i2c_read_hum_tem(char reg)
{short value;char r_buf[] = {reg};int ret;// 封装消息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,},};// 将消息传送ret = i2c_transfer(client1->adapter, r_msg, 2);if (ret != 2){printk("消息传输失败\n");return -EIO;}return value; // 将读取到的温度和湿度返回
}int si7006_open(struct inode *inode, struct file *file)
{printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);return 0;
}long si7006_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{int tem, hum, ret;switch (cmd){case GET_HUM: // 读取湿度// 读取湿度的逻辑hum = i2c_read_hum_tem(0XE5);ret = copy_to_user((void *)arg, &hum, 4);if (ret < 0){printk("向用户拷贝数据失败\n");return ret;}break;case GET_TEM: // 读取温度// 读取温度的逻辑tem = i2c_read_hum_tem(0XE3);ret = copy_to_user((void *)arg, &tem, 4);if (ret < 0){printk("向用户拷贝数据失败\n");return ret;}break;}return 0;
}int si7006_close(struct inode *inode, struct file *file)
{printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);return 0;
}struct file_operations fops = {.open = si7006_open,.unlocked_ioctl = si7006_ioctl,.release = si7006_close,
};// 给对象分配空间并初始化
int i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
{client1 = client;// 字符设备驱动的注册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;
}// remove 和设备信息分离时执行
int i2c_remove(struct i2c_client *client)
{// 销毁节点device_destroy(cls, MKDEV(major, 0));// 目录和设备信息的销毁class_destroy(cls);// 驱动的注销unregister_chrdev(major, "si7006");return 0;
}// 构建设备树匹配信息
struct of_device_id oftable[] = {{.compatible = "vivi,si7006",},{},
};// 分配iic驱动对象并初始化
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");
在根节点外添加设备树
*********添加************
在stm32mp157a-fsmp1a.dts文件的根节点外部,添加如下内容:&i2c1 {pinctrl-names = "default", "sleep";//关于pinctrl的一个列表,"default"表示默认工作模式//"sleep"表示低功耗模式pinctrl-0 = <&i2c1_pins_b>;//-0表示pinctrl-name列表中第一个值defaultpinctrl-1 = <&i2c1_sleep_pins_b>;//在stm32mp15-pinctrl.dtsi文件中存在内核添加的各种用于管脚复用的节点,i2c1_pins_a就是其中之一i2c-scl-rising-time-ns = <100>;i2c-scl-falling-time-ns = <7>;status = "okay";/delete-property/dmas; //删除不必要的属性/delete-property/dma-names;si7006@40{ //添加SI7006的从机节点compatible="hqyj,si7006";reg=<0X40>;};};
效果演示

相关文章:
linux_驱动_iic总线获取si7006温湿度
应用层si7006.c #include<stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <sys/ioctl.h> #include <arpa/inet.h>…...
虚拟机网络图标不见了
有3台虚拟机之前正常运行的,有一天打开虚拟机发现2台虚拟机的网络连接图标不见了,也ping不通另外两台。 解决:在终端执行以下命令,即可ping通 [roothadoop103 ~]# sudo nmcli network off [roothadoop103 ~]# sudo nmcli network…...
CTF:信息泄露.(CTFHub靶场环境)
CTF:信息泄露.(CTFHub靶场环境) “ 信息泄露 ” 是指网站无意间向用户泄露敏感信息,泄露了有关于其他用户的数据,例如:另一个用户名的财务信息,敏感的商业 或 商业数据 ,还有一些有…...
Redis学习总结
Redis学习总结 文章目录 Redis学习总结Radis基本介绍docker的安装基本数据结构通用命令字符型key的层次结构Hash类型Listset sortedset集合redis的java客户端jedis的使用jedis连接池的配置 SpringDataRedis自定义redistemplate的序列化与反序列化方式stringtemplate的使用 redi…...
云原生全栈体系(二)
Kubernetes实战入门 第一章 Kubernetes基础概念 一、是什么 我们急需一个大规模容器编排系统kubernetes具有以下特性: 服务发现和负载均衡 Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果进入容器的流量很大,Kubernetes 可以负…...
C++设计模式之建造者设计模式
C建造者设计模式 什么是建造者设计模式 建造者设计模式是一种创建型设计模式,它是一种将复杂对象的分解为多个独立部分的模式,以便于构建对象的过程可以被抽象出来并独立变化。 该模式有什么优缺点 优点 灵活性:建造者设计模式允许对象的…...
HDFS Erasure coding-纠删码介绍和原理
HDFS Erasure coding-纠删码介绍和原理 三副本策略弊端Erasure Coding(EC)简介Reed- Solomon(RS)码 EC架构 三副本策略弊端 为了提供容错能力,hdfs回根据replication factor(复制因子)在不同的…...
STM32 DHT11
DHT11 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。 使用单总线通信 该传感器包括一个电容式感湿元件和一个NTC测温元件,并于一个高性能8位单片机相连(模数转换)。 DHT11引脚说明 开漏模式下没有输出高电平的能…...
词法分析器
词法分析器 在早期编译1.0时代,我们的目标是完成程序语言到机器语言的翻译,所以重点在编译器前端,于是我们花费大量时间研究词法分析、语法分析、语义分析等内容。如今的本科编译原理课程,基本上也就到这一层面吧。 在编译2.0时…...
【Spring】Spring之启动过程源码解析
概述 我们说的Spring启动,就是构造ApplicationContext对象以及调用refresh()方法的过程。 Spring启动过程主要做了这么几件事情: 构造一个BeanFactory对象解析配置类,得到BeanDefinition,并注册到BeanFactory中 解析ComponentS…...
状态模式(State)
状态模式是一种行为设计模式,允许一个对象在其内部状态改变时改变它的行为,使其看起来修改了自身所属的类。其别名为状态对象(Objects for States)。 State is a behavior design pattern that allows an object to change its behavior when its inter…...
【uniapp】样式合集
1、修改uni-data-checkbox多选框的样式为单选框的样式 我原先是用的单选,但是单选并不支持选中后,再次点击取消选中;所以我改成了多选,然后改变多选样式,让他看起来像单选 在所在使用的页面上修改样式即可 <uni-d…...
【Spring框架】SpringBoot统一功能处理
目录 用户登录权限校验用户登录拦截器排除所有静态资源练习:登录拦截器拦截器实现原理 统一异常处理统一数据返回格式为什么需要统⼀数据返回格式?统⼀数据返回格式的实现 用户登录权限校验 用户登录拦截器 1.自定义拦截器 package com.example.demo.…...
51单片机学习--按键控制流水灯模式定时器时钟
TMOD负责确定T0和T1的工作模式,TCON控制T0和T1的启动或停止计数,同时包含定时器状态 TF1:定时器1溢出标志 TF0:定时器0溢出标志 0~65535 每隔1微秒计数器1,总时间65535微秒,赋上初值64535,则只…...
Django教程_编程入门自学教程_菜鸟教程-免费教程分享
教程简介 Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模版T。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统…...
VGG卷积神经网络-笔记
VGG卷积神经网络-笔记 VGG是当前最流行的CNN模型之一, 2014年由Simonyan和Zisserman提出, 其命名来源于论文作者所在的实验室Visual Geometry Group。 测试结果为: 通过运行结果可以发现,在眼疾筛查数据集iChallenge-PM上使用VGG…...
Python爬虫如何实现IP代理池搭建
大家好,作为一名IP代理产品供应商,我知道很多人在使用Python爬虫时遇到了一些麻烦。有时候,我们的爬虫在爬取过程中会被目标网站识别并封禁IP,导致我们的爬取任务受阻。今天我要分享的就是如何搭建一个高效稳定的IP代理池…...
单例模式:保证一个类只有一个实例
单例模式:保证一个类只有一个实例 什么是单例模式? 在软件开发中,有些类只需要一个实例,比如数据库连接池、线程池等。单例模式就是一种设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。 实…...
【新版系统架构补充】-七层模型
网络功能和分类 计算网络的功能 :数据通信、资源共享、管理集中化、实现分布式处理、负载均衡 网络性能指标:速率、带宽(频带宽度或传送线路速率)、吞吐量、时延、往返时间、利用率 网络非性能指标:费用、质量、标准化…...
第2章 C语言概述
本章介绍以下内容: 运算符: 函数:main()、printf() 编写一个简单的C程序 创建整型变量,为其赋值并在屏幕上显示其值 换行字符 如何在程序中写注释,创建包含多个函数的程序,发现程序的错误 什么是关键字 C程…...
Phi-3-mini-4k-instruct入门指南:Ollama中phi3:mini模型选择与加载验证方法
Phi-3-mini-4k-instruct入门指南:Ollama中phi3:mini模型选择与加载验证方法 想快速上手一个轻量级但能力强大的AI助手?Phi-3-mini-4k-instruct可能就是你要找的解决方案。这个只有38亿参数的小模型,在多项测试中表现出了惊人的能力࿰…...
JavaSE 基础语法 - 初始 Java
一、Java是什么? Java 是一门面向对象的、跨平台的高级编程语言,由 Sun Microsystems 公司(后被 Oracle 收购)于 1995 年推出,设计初衷是 “Write Once, Run Anywhere(一次编写,到处运行&#x…...
Phi-4-mini-reasoning惊艳效果展示:高精度数学推导+代码生成对比实测
Phi-4-mini-reasoning惊艳效果展示:高精度数学推导代码生成对比实测 1. 开篇:小模型的大智慧 Phi-4-mini-reasoning这款仅有3.8B参数的轻量级开源模型,正在重新定义我们对小型语言模型能力的认知。专为数学推理、逻辑推导和多步解题等强逻辑…...
Ubuntu音频架构演进:从PulseAudio到PipeWire的配置实战与蓝牙修复
1. Ubuntu音频架构演进:从PulseAudio到PipeWire的技术背景 如果你最近升级到Ubuntu 22.04或更高版本,可能会发现音频系统变得不太一样了。这背后是Ubuntu正在经历一场音频架构的重大变革——从传统的PulseAudio逐步过渡到新一代的PipeWire。我刚开始接触…...
智能规约员中的业务规则封装与验证逻辑
智能规约员中的业务规则封装与验证逻辑 在数字化时代,企业需要高效处理复杂的业务规则以确保运营合规性和决策准确性。智能规约员通过将业务规则封装为可复用的逻辑单元,并结合自动化验证技术,显著提升了规则管理的灵活性与可靠性。本文将深…...
嵌入式系统开发流程
嵌入式系统开发流程:从概念到产品的技术之旅 在智能设备无处不在的今天,嵌入式系统作为其核心“大脑”,驱动着从智能家居到工业控制的各类应用。开发一个高效可靠的嵌入式系统,需要严谨的流程和跨学科协作。本文将带你深入探索这…...
深入解析图像感知质量指标:从PSNR到Perceptual Index的实践指南
1. 图像质量评估的两种视角:从像素匹配到主观感知 当你用手机拍完照片准备发朋友圈时,可能会纠结要不要加滤镜——原图细节更丰富但略显平淡,滤镜版色彩鲜艳可细节模糊。这种选择困境背后,正是图像质量评估的两大流派:…...
ComfyUI-ControlNet进阶:多模态控制实战(姿势+深度+线稿)
1. ComfyUI-ControlNet多模态控制入门指南 第一次接触ComfyUI的ControlNet功能时,我被它强大的控制能力震撼到了。想象一下,你手里拿着一个魔法画笔,不仅能决定画什么,还能精确控制画面中每个元素的位置、距离和线条风格。这就是C…...
bge-large-zh-v1.5开源模型实践:符合信创要求的国产AI基础设施部署
bge-large-zh-v1.5开源模型实践:符合信创要求的国产AI基础设施部署 如果你正在寻找一个性能强劲、完全开源且符合信创要求的文本向量化模型,那么bge-large-zh-v1.5绝对值得你深入了解。今天,我们就来聊聊如何快速部署和使用这个优秀的国产嵌…...
开关柜局部放电检测:全场景FAQ与康高特技术解读
引言高压开关柜作为电力系统中的核心设备,其绝缘状态的健康与否直接关系到电网运行的可靠性与安全性。局部放电(Partial Discharge, PD)是评估电气设备绝缘劣化的关键早期指标,也是导致设备故障、引发事故的主要诱因之一。因此&am…...
