MS1112驱动开发

news2024/11/19 3:33:27

作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生在读,研究方向无线联邦学习
擅长领域:驱动开发,嵌入式软件开发,BSP开发
作者主页:一个平凡而乐于分享的小比特的个人主页
文章收录专栏:IMX8MP,本专栏记录imx8mp开发板,学习开发过程中的问题及解决方法记录
欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

MS1112驱动开发

ms1112驱动代码及测试程序在ms1112驱动,如有需要自行下载

1.不带sysfs

1.1 时序图

根据MS1112数据芯片手册的写时序和读时序,编写MS1112驱动

在这里插入图片描述

在这里插入图片描述

1.2 驱动函数

写函数:


/*
 * @description	: 向ms1112多个寄存器写入数据
 * @param - dev:  ms1112设备
 * @param - reg:  要写入的寄存器首地址
 * @param - buf:  要写入的数据缓冲区
 * @param - len:  要写入的数据长度
 * @return 	  :   操作结果
 */
static s32 ms1112_write_regs(struct ms1112_dev *dev, u8 reg, u8 *buf, u8 len)
{
	u8 b[256];
	int ret;
	struct i2c_msg msg;
	
	struct i2c_client *client = (struct i2c_client *)dev->private_data;

	printk("write I2C device address: 0x%x\n", client->addr);
	
	memcpy(&b[0],buf,len);		/* 将要写入的数据拷贝到数组b里面 */
		
	msg.addr = client->addr;	/* ms1112地址 */
	msg.flags = 0;				/* 标记为写数据 */

	msg.buf = b;				/* 要写入的数据缓冲区 */
	msg.len = len;			/* 要写入的数据长度 */

	ret = i2c_transfer(client->adapter, &msg, 1);
	printk("write:%d\n",ret);
          	if(ret == 1) {
                	ret = 0;
        	} else {
                	ret = -EREMOTEIO;
        	}
        	return ret;
}

读函数:

/*
 * @description	: 从ms1112读取多个寄存器数据
 * @param - dev:  ms1112设备
 * @param - reg:  要读取的寄存器首地址
 * @param - val:  读取到的数据
 * @param - len:  要读取的数据长度
 * @return 		: 操作结果
 */
static int ms1112_read_regs(struct ms1112_dev *dev, u8 reg, void *val, u8 len)
{
	int ret;
	struct i2c_msg msg[1];
	struct i2c_client *client = (struct i2c_client *)dev->private_data;

	/* msg[1]读取数据 */
	msg[0].addr = client->addr;			/* ms1112地址 */
	msg[0].flags = I2C_M_RD;			/* 标记为读取数据*/
	msg[0].buf = val;					/* 读取数据缓冲区 */
	msg[0].len = len;					/* 要读取的数据长度*/

	ret = i2c_transfer(client->adapter, msg, 1);
	printk("read:%d\n",ret);
	if(ret == 1) {
		ret = 0;
	} else {
		ret = -EREMOTEIO;
	}
	return ret;
}

1.3 运行测试

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

会看到加载ms1112.ko驱动后,会在/dev/目录下生成ms1112设备,我们用应用程序对/dev/ms1112设备进行操作,读取电压值与测得的电压值相差不大

2.不带sysfs

不带sysfs和带sysfs的ms1112驱动大体相似,只需稍作修改

2.1 修改部分

主要修改如下:

static int ms1112_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
        int rv=0;

.....
        /* 5、创建sysfs文件初始化*/
        if(device_create_file(ms1112dev.device,&dev_attr_ms1112))
        {
                rv=-ENOMEM;
                goto undo_device;
        }
        printk("%s deiver init sysfs successfully!\n",MS1112_NAME);

        /* 6、保存私有数据*/
        ms1112dev.private_data = client;
        dev_set_drvdata(ms1112dev.device,&ms1112dev);
.....
}

static ssize_t ms1112_show(struct device *dev, struct device_attribute *attr, char *buf)
{
        struct ms1112_dev *ms_dev = (struct ms1112_dev *)dev_get_drvdata(dev);

        ms1112_write_reg(&ms1112dev, MS1112_CFG_REG, MS1112_DEFAULT_CONFIG);

        ms1112_readdata(ms_dev);
        printk("dev->value: %d\n", ms_dev->value);
        return sprintf(buf, "adc=%d\n", ms_dev->value);
}


static ssize_t ms1112_store(struct device *dev,struct device_attribute *attr,const char *buf,size_t count)
{
        return count;
}

DEVICE_ATTR(ms1112,0644,ms1112_show,ms1112_store);

2.2 运行测试

在这里插入图片描述
在这里插入图片描述

测得电压与通过adc采样值算出的电压相近

3.遇到问题及解决方法

3.1驱动程序读出的adc值与测试程序不符

驱动读adc值函数:
在这里插入图片描述

测试程序:
在这里插入图片描述

运行结果:
在这里插入图片描述

然后我用逻辑分析仪抓波形,发现驱动程序没问题,是测试程序的问题
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

int16_t类型的数据不应该超过32767啊

问题解决

是我驱动程序写的不规范,导致的,具体原因:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

驱动程序的读adc函数,返回的是0,并没有对错误做处理,导致测试程序read()函数返回0,直接执行,这是不符合系统调用read函数规范的

我做了如下修改:
在这里插入图片描述
在这里插入图片描述

最终,测试程序的adc值与驱动相符。

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

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

相关文章

Mysql基础进阶速成2

看着篇文章之前先看我的前一章:MySQL基础进阶速成1 函数: 每个字段使用一个函数:select 函数(字段名)from 表名 upper:将字符串中的字母大写 lower:将字符串中的字符小写 max:得到最大值 min&#xf…

力扣hot100:295. 数据流的中位数(两个优先队列维护中位数)

LeetCode:295. 数据流的中位数 这个题目最快的解法应该是维护中位数,每插入一个数都能快速得到一个中位数。 根据数据范围,我们应当实现一个 O ( n l o g n ) O(nlogn) O(nlogn)的算法。 1、超时—插入排序 使用数组存储,维持数…

pyqt5 tablewidget实现excel拖曳填充

代码主要涉及鼠标事件和绘图,selectionModel,selectedIndexes。 import sys from PyQt5.QtCore import QPoint, Qt, QCoreApplication, pyqtSlot from PyQt5.QtGui import QBrush, QPixmap, QColor, QPainter,QIcon,QPolygon from PyQt5.QtWidgets imp…

GPT-4o:突出优势 和 应用场景

还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,ech…

NeMo Guardrails 大模型安全防护:这个框架牛逼,不会像强化学习 指令对齐限制灵活性死板回答,也不会像提示词约束容易被遗忘和清理

NeMo Guardrails 大模型安全防护:这个框架牛逼,不会像强化学习 指令对齐限制灵活性死板回答,也不会像提示词约束容易被遗忘和清理 提出背景对比传统方法结构图底层原理1. 对话管理运行时(DM-like runtime)2. 思维链&am…

大小堆运用巧解数据流的中位数

​​​​​​​​​​ 一、思路 我们将所有数据平分成两份,前面那一部分用小堆来存,后面的部分用大堆来存,这样我们就能立刻拿到中间位置的值。 如果是奇数个数字,那么我们就将把中间值放在前面的大堆里,所以会有两种…

SAP ABAP 创建表结构 SE11

目录 一,创建表 :T-code:SE11 二,编辑内容: 1,内容说明:必填项,属性:锁定不可更改 2,出荷と更新 3,項目 A:表的第一个项目必须是…

Flink中因java的泛型擦除导致的报错及解决

【报错】 Exception in thread "main" org.apache.flink.api.common.functions.InvalidTypesException: The return type of function Custom Source could not be determined automatically, due to type erasure. You can give type information hints by using th…

计算机网络面试基础(一)

文章目录 一、HTTP基本概念1.HTTP是什么?2.HTTP 常见的状态码有哪些?3.http常见字段 二、GET和POST1.get和post有什么区别 三、HTTP缓存技术1.HTTP 缓存有哪些实现方式?2.什么是强制缓存?3.什么是协商缓存?(不太懂) 四…

linux嵌入式设备测试wifi信号强度方法

首先我们要清楚设备具体链接在哪个wifi热点上 执行:nmcli dev wifi list rootubuntu:/home/ubuntu# nmcli dev wifi list IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS > * 14:EB:08:51:7D:20 wifi22222_5G Infr…

【96】write combine机制介绍

前言 这篇文章主要介绍了write combine的机制 一、write combine的试验 1.系统配置 (1)、CPU:11th Gen Intel(R) Core(TM) i7-11700 2.50GHz (2)、GPU:XX (3)、link status&am…

如何有效提问?

有效提问:正确地向别人提问是一种艺术,可以帮助你获得清晰、有用的答案。 明确表达问题:确保你的问题清晰明了,避免含糊不清或模棱两可的语言。这可以帮助对方更好地理解你的问题,并给出准确的答复。 尊重对方&#x…

[第五空间 2021]WebFTP、[HCTF 2018]Warmup

目录 [第五空间 2021]WebFTP ​[SWPUCTF 2021 新生赛]Do_you_know_http [NCTF 2018]签到题 [HNCTF 2022 Week1]What is Web [HNCTF 2022 Week1]Interesting_http [HCTF 2018]Warmup [第五空间 2021]WebFTP 使用dirsearch扫描,发现有git泄露 使用GitHack克隆目…

HBuilderX编写APP一、获取token

一、新建项目 二、从onenet获取key.js 1、下载之后的压缩包,解压 2、关键就是找到key.js 3、将这个key.js复制到刚才的目录下面去 4、这个key.js文件就是生成token的代码 5、只要调用createCommonToken(params)这个函数,就可以实现生成token了 其中on…

小米开放式耳机怎么样?倍思、西圣、小米开放式耳机测评比较!

作为一名热衷于分享真实体验的博主,我在过去两年开始接触开放式耳机,并因此受到许多朋友的咨询,询问哪款开放式耳机更加出色。为了找出最佳的开放式耳机,我进行了深入的调查和实地测试。我发现高价并不总是代表高质量,…

【全开源】Java共享茶室棋牌室无人系统支持微信小程序+微信公众号

打造智能化休闲新体验 一、引言:智能化休闲时代的来临 随着科技的飞速发展,智能化、无人化服务逐渐渗透到我们生活的各个领域。在休闲娱乐行业,共享茶室棋牌室无人系统源码的出现,不仅革新了传统的休闲方式,更为消费…

嵌入式移植jpeglib--Linux交叉编译ARM平台

一 、交叉编译jpeg库 1.下载源码tar.gz 2. 源码目录下执行 jpeglib配置文件 ./configure CCarm-none-linux-gnueabihf-gcc LDarm-none-linux-gnueabihf-ld --prefix/work/jpeg_arm_lib --exec-prefix/work/jpeg_arm_lib --enable-shared --enable-static --hostarm-none-linu…

高考试卷押运车视频监控解决方案

一、引言 高考作为我国教育领域的重要事件,其公正、公平和安全性一直备受社会关注。试卷押运作为高考的重要环节,其安全性直接关系到高考的顺利进行和考生的切身利益。因此,对高考试卷押运车实施视频监控解决方案,对于确保试卷安…

Asp .Net Core 系列:详解鉴权(身份验证)以及实现 Cookie、JWT、自定义三种鉴权 (含源码解析)

什么是鉴权(身份验证)? https://learn.microsoft.com/zh-cn/aspnet/core/security/authentication/?viewaspnetcore-8.0 定义 鉴权,又称身份验证,是确定用户身份的过程。它验证用户提供的凭据(如用户名和…

短视频直播教学课程小程序的作用是什么

只要短视频/直播做的好,营收通常都不在话下,近些年,线上自媒体行业热度非常高,每条细分赛道都有着博主/账号,其各种优势条件下也吸引着其他普通人冲入。 然无论老玩家还是新玩家,面对平台不断变化的规则和…