linux i2c 读写函数,Linux下读写芯片的I2C寄存器
要想在Linux下读写芯片的I2C寄存器,一般需要在Linux编写一份该芯片的I2C驱动,关于Linux下如何编写I2C驱动,前一篇文章《手把手教你写Linux I2C设备驱动》已经做了初步的介绍,并且留下了两个疑问尚未解决,第一个是如何对Linux提供的I2C操作函数进行进一步封装,实现对芯片寄存器的读写;另一个是如何在用户空间调用该I2C驱动代码。本文将讨论前一个问题。
首先,我们要了解Linux系统提供的I2C操作函数怎么使用,上篇文章已经提到过,对I2C设备的读写,Linux系统提供了多种接口,这些接口可以在内核的 i2c.h 中找到,这里我主要介绍下面这组读写接口:
extern int i2c_master_send(struct i2c_client *,const char* ,int);
extern int i2c_master_recv(struct i2c_client *,char* ,int);
第一个参数是 i2c_client 对象指针,第二个参数是要传输的数据buffer指针,第三个参数为buffer的大小。
接口函数已经有了,下面我们要解决的问题就是以何种形式/规则去使用这些接口才能正确地读写芯片的相关寄存器。
首先,我们需要查询芯片手册,找到芯片手册中,关于寄存器的I2C读写时序,其实,大多数芯片的I2C寄存器的读写时序都是一样的,下面我还是以手头的TVP5158芯片为例。
首先分析写操作,该芯片的手册中给出的I2C寄存器写时序图如下:
从上图可以看出,真正需要执行写操作的有两处,Step4 和 Step6 ,Step4首先写入寄存器的偏移地址,而Step6则是写入到该寄存器的值。由此已经很清楚了,对于写I2C寄存器,我们需要做的就是给 i2c_master_send 函数传入两个字节的数据即可,第一个字节为寄存器的地址,第二个字节为要写入寄存器的数据。示例如下:
static int tvp5158_i2c_write( struct i2c_client* client,uint8_t reg,uint8_t data)
{
unsigned char buffer[2];
buffer[0] = reg;
buffer[1] = data;
if( 2!= i2c_master_send(client,buffer,2) ) {
printk( KERN_ERR " tvp5158_i2c_write fail! \n" );
return -1;
}
return 0;
}
其实挺简单的,没有什么复杂的代码。下面再看看读时序。
由上图可以,读时序需要做的操作是,先向I2C总线上写入需要读的寄存器地址,然后读I2C总线上的值。代码写起来也不难,示例如下:
static int tvp5158_i2c_read( struct i2c_client* client,uint8_t reg,uint8_t *data)
{
// write reg addr
if( 1!= i2c_master_send(client,®,1) ) {
printk( KERN_ERR " tvp5158_i2c_read fail! \n" );
return -1;
}
// wait
msleep(10);
// read
if( 1!= i2c_master_recv(client,data,1) ) {
printk( KERN_ERR " tvp5158_i2c_read fail! \n" );
return -1;
}
return 0;
}
到此为止,Linux下具体如何封装读写芯片寄存器的方法已经介绍完毕,其实并不复杂,希望对初学者有所帮助,文中有什么讲述不正确的地方,欢迎留言或者来信lujun.hust@gmail.com交流。
linux i2c 读写函数,Linux下读写芯片的I2C寄存器相关推荐
- linux中i2c读写函数,Linux下的eeprom读写操作(IIC)
/* *************************************************************************** * File name: eeprom_i ...
- linux使用模板函数,Linux常用C函数
Linux常用C函数Tag内容描述: 1.Linux常用C函数 接口处理篇 accept(接受socket连线) 相关函数 socket,bind,listen,connect 表头文件 #inclu ...
- linux c 绝对值函数,linux c 简介
--- title: linux c 简介 date: 2020-07-19 updated: 2020-07-19 --- # Preface # todo linux c http://blog. ...
- linux i2c 读写函数,Linux内核调用I2C驱动_实现MPU6050的数据读取
0. 导语 最近一段时间都在恶补数据结构和C++,加上导师的事情比较多,Linux内核驱动的学习进程总是被阻碍.不过,十一假期终于没有人打扰,有这个奢侈的大块时间,可以一个人安安静静的在教研室看看Li ...
- linux socket读写函数,Linux网络编程入门
第一个函数是socket函数. socket函数的Linux头文件以及函数定义如下: #include int socket(int domain, int type, int protocal); ...
- linux 文件操作函数,Linux下的文件操作函数及creat用法
编写Linux应用程序要用到如下工具: (1)编译器:GCC GCC是Linux平台下最重要的开发工具,它是GNU的C和C++编译器,其基本用法为:gcc [options] [filenames]. ...
- linux拷贝文件函数,linux下文件操作的各个函数
作者:HoytEmail:hoytluo@21cn.com 前言: 我们在这一节将要讨论linux下文件操作的各个函数. 文件的创建和读写 文件的各个属性 目录文件的操作 管道文件 --------- ...
- linux中iconv函数,Linux下编码转换(iconv函数族)
转自:http://www.linuxdiyf.com/viewarticle.php?id=45164 在Linux上进行编码转换时,既可以利用iconv函数族编程实现,也可以利用iconv命令来实 ...
- linux扩展堆函数,linux下进程堆栈下溢出判断及扩展实现
一.堆栈扩展 在进程创建的时候,内核并没有为进程分配太多的堆栈,即使是逻辑地址空间也没有,这样做的好处就是如果说用户态的程序堆栈向下溢出(对386来说,就是访问了更低地址的内存空间),这样内核可以比较 ...
最新文章
- nojy 105 九的余数
- 内核中的对象操作的方法模块 和 C++ 构造和析构的对比
- linux mysql 自动加斜杠_【实战演练】Linux操作系统19-Mysql主主复制加Keepalived高可用...
- html 访问 php 变量
- Aspnet Core 对 Resetful API版本的支持
- IDEA忽略不必要提交的文件
- 轻轻松松看懂Spring AOP源码
- [JAVA][算法] [字符串匹配]KMP
- 从框架源码中学习结构型设计模式
- php二进制保存到本地,C# 将二进制字符串保存到本地
- 用Java实现一个简单的链表迭代器
- 从“中国听”到“听中国”!全球化下的音乐产业 迈向5G时代
- java继承的性质,浅谈Java三大特性之继承
- Python生成器教程
- 少年Pi的奇幻漂流-我们的后台自动化发布方案
- [HOJ1864]Fibonacci
- <input>:1: UserWarning: The .grad attribute of a Tensor that is not a leaf Tensor is being accessed.
- XMind ,石墨笔记, Effie ,你用什么应用来完成采编工作?
- Java毕设项目共享充电宝系统(java+VUE+Mybatis+Maven+Mysql)
- 【项目】磁盘文件管理工具
热门文章
- 漫谈可视化Prefuse(四)---被玩坏的Prefuse API
- [转载] 高等应用数学问题的matlab求解——第1章 计算机数学语言概述
- 通过命令行使用 JAX-WS调用webservice
- 一种简单又有效的设置虚拟机网络的方法
- json字符串转换成json对象,json对象转换成字符串,值转换成字符串,字符串转成值...
- servlet配置web.xml问题
- 【BZOJ1010】【HNOI2008】玩具装箱(斜率优化,动态规划)
- 第7课第2节_Binder系统_c++实现_编译测试
- 苹果应用ipa图片提取
- STL学习小记--与C++模板相关的几个特性