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

news2025/7/12 13:35:02

头文件 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");

效果演示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1158096.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人人都能看懂的DDPM反向降噪过程公式推导

0 前言 上一篇介绍了前向加噪过程&#xff0c;得到如下从 x 0 x_0 x0​ 一步到 x t x_t xt​ 过程&#xff1a; α t β t 1 \alpha_t \beta_t1 αt​βt​1&#xff0c;其中 β t \beta_t βt​ 是正态分布方差&#xff0c;即第 t t t 步产生的噪声从 N ( 0 , β t ) …

伽马函数 简要总结

1、定义公式&#xff1a; &#xff08;上面一个△ 意为“定义为”&#xff09; 例1&#xff1a; 例2&#xff1a; 2、性质 3、举例 例1&#xff1a; 例2&#xff1a; 例3&#xff1a; 笔记记录时间&#xff1a;2023.11.01&#xff0c;笔记记录自汤老师讲解的伽马函数内容。…

算法与数据结构-回溯算法

文章目录 如何理解“回溯算法”&#xff1f;两个回溯算法的经典应用0-1 背包正则表达式 如何理解“回溯算法”&#xff1f; 笼统地讲&#xff0c;回溯算法很多时候都应用在“搜索”这类问题上。不过这里说的搜索&#xff0c;并不是狭义的指我们前面讲过的图的搜索算法&#xf…

损失函数总结(十一):Huber Loss、SmoothL1Loss

损失函数总结&#xff08;十一&#xff09;&#xff1a;Huber Loss、SmoothL1Loss 1 引言2 损失函数2.1 Huber Loss2.2 SmoothL1Loss 3 总结 1 引言 在前面的文章中已经介绍了介绍了一系列损失函数 (L1Loss、MSELoss、BCELoss、CrossEntropyLoss、NLLLoss、CTCLoss、PoissonNL…

c语言基础:L1-067 洛希极限

科幻电影《流浪地球》中一个重要的情节是地球距离木星太近时&#xff0c;大气开始被木星吸走&#xff0c;而随着不断接近地木“刚体洛希极限”&#xff0c;地球面临被彻底撕碎的危险。但实际上&#xff0c;这个计算是错误的。 洛希极限&#xff08;Roche limit&#xff09;是一…

01-开发第一个Vue程序,了解Vue构造函数的配置项data,template,插值语法,el

Vue的快速入门 下载并安装vue.js Vue是一个基于JavaScript实现的框架, 要使用它就需要从Vue官网下载 vue.js文件 第一步&#xff1a;打开Vue2官网&#xff0c;点击下图所示的起步 第二步&#xff1a;继续点击下图所示的安装 第三步&#xff1a;在安装页面向下滚动&#xff0…

永恒之蓝(MS17-010)漏洞利用

永恒之蓝&#xff08;eternalblue) 永恒之蓝&#xff08;Eternal Blue&#xff09;爆发于2017年4月14日晚&#xff0c;是一种利用Windows系统的SMB协议漏洞来获取系统的最高权限&#xff0c;以此来控制被入侵的计算机。甚至于2017年5月12日&#xff0c; 不法分子通过改造“永恒…

k8s约束调度

Kubernetes 是通过 List-Watch **** 的机制进行每个组件的协作&#xff0c;保持数据同步的&#xff0c;每个组件之间的设计实现了解耦。 list-watch核心组件为Controller Manager、Scheduler 和 kubelet&#xff0c;这三者协助完成了pod节点的建立过程。 在 Kubernetes 中&…

89 柱状图中最大的矩形

柱状图中最大的矩形 类似接雨水&#xff08;反过来&#xff0c;相当于找接雨水最少的一段&#xff09;题解1 暴力搜索&#xff08;超时&#xff09; O ( N 2 ) O(N^2) O(N2)另一种 题解2 单调栈【重点学习】常数优化 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的…

【接口测试】目前市面上流行的接口大多有哪几种协议的接口?

首先&#xff0c;关于协议这个词&#xff0c;你要清楚。 接口测试它是基于什么进行测试的&#xff0c;接口测试是什么测试类型&#xff0c;其实有有时候问到一个问题&#xff0c;关联性很强。很多关联性的问题你都可以去考虑。 首先接口测试一个功能黑盒测试&后端&#x…

Snackbar使用介绍及自定义

Snackbar使用介绍及自定义 前言一、Snackbar是什么&#xff1f;二、简单使用三、进阶使用参考 [Android 快别用Toast了&#xff0c;来试试Snackbar](https://blog.csdn.net/g984160547/article/details/121269520) 总结 前言 有个UI要显示自定义样式的toast&#xff0c;并居中…

APISpace 天气预报查询API接口案例代码

1.天气预报查询API产品介绍 APISpace 的 天气预报查询&#xff0c;支持全国以及全球多个城市的天气查询&#xff0c;包含国内3400个城市以及国际4万个城市的实况数据&#xff0c;同时也支持全球任意经纬度查询&#xff0c;接口会返回该经纬度最近的站点信息&#xff1b;更新频率…

【JavaScript】jQuery 使用案例

使用JS实现猜数字游戏 原生JS版&#xff1a; <!DOCTYPE html> <html lang"cn"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Docum…

视频编码转换技巧:视频批量转码H264转H265,高效且顺畅

随着数字媒体的广泛应用&#xff0c;视频编码转换已成为一种普遍的需求。不同的视频格式和编码标准使得在不同设备上播放视频成为可能&#xff0c;同时也带来了兼容性和传输效率的问题。本文讲解引用云炫AI智剪使视频编码转换技巧&#xff0c;即批量将H264编码转换为H265编码&a…

Java修仙传之神奇的ES(基础使用)

前言 ES是什么&#xff1a;一款强大的搜索引擎ES拓展&#xff1a;elasticsearch结合kibana、Logstash、Beats&#xff0c;也就是elastic stack&#xff08;ELK&#xff09; kibana&#xff1a;可视化 ES&#xff1a;搜索引起 Logstash&#xff1a;数据抓取&#xff0c;数据同步…

Element UI的table不同应用

目录 一、自定义表头 二、纵向表头(动态表头) 2.1、分别拿到表头和表头中日期对应的行数据 2.2、拿到每个日期对应的列数据 一、自定义表头 <el-table-column prop"chu" align"center"><!-- 自定义表头 --><template slot"header…

uniapp 微信小程序 授权隐私流程 网上没有的踩坑记录!

首先什么时候我们需要授权操作&#xff0c;比如下图我们调用这些接口时候首先必须让用户授权&#xff0c;这个政策是2022年2月21日24时起对一下接口增加用户授权操作&#xff0c;详情可以看微信文档 授权的逻辑按照官网的意思是&#xff1a; 这个时候就踩坑了&#xff0c;我把…

Linux命令超详细

Linux基础命令 Linux的目录结构 /&#xff0c;根目录是最顶级的目录了Linux只有一个顶级目录&#xff1a;/路径描述的层次关系同样适用/来表示/home/itheima/a.txt&#xff0c;表示根目录下的home文件夹内有itheima文件夹&#xff0c;内有a.txt ls命令 功能&#xff1a;列出…

高级文本编辑软件 UltraEdit mac中文版介绍说明

UltraEdit mac是一款在Windows系统中非常出名的文本编辑器&#xff0c; UltraEdit for mac对于IT程序猿来说&#xff0c;更是必不可少&#xff0c;可以使用UltraEdit编辑配置文件、查看16进制文件、代码高亮显示等&#xff0c;虽然Mac上已经有了很多优秀的文本编辑器&#xff0…

NOA赛道研究:预计2024年渗透率10%!中算力平台迎窗口期

从基础L2到L3的产业演进中&#xff0c;NOA是至关重要的一步&#xff0c;值得被密切关注。 对于产业链不同位置的玩家&#xff0c;其关注的点有所不同&#xff1a;①对于整车厂来说&#xff0c;根据高工智能汽车监测的数据&#xff0c;基础L2的一体机产品已经趋向于成熟&#x…