要想在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,&reg,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寄存器相关推荐

  1. linux中i2c读写函数,Linux下的eeprom读写操作(IIC)

    /* *************************************************************************** * File name: eeprom_i ...

  2. linux使用模板函数,Linux常用C函数

    Linux常用C函数Tag内容描述: 1.Linux常用C函数 接口处理篇 accept(接受socket连线) 相关函数 socket,bind,listen,connect 表头文件 #inclu ...

  3. linux c 绝对值函数,linux c 简介

    --- title: linux c 简介 date: 2020-07-19 updated: 2020-07-19 --- # Preface # todo linux c http://blog. ...

  4. linux i2c 读写函数,Linux内核调用I2C驱动_实现MPU6050的数据读取

    0. 导语 最近一段时间都在恶补数据结构和C++,加上导师的事情比较多,Linux内核驱动的学习进程总是被阻碍.不过,十一假期终于没有人打扰,有这个奢侈的大块时间,可以一个人安安静静的在教研室看看Li ...

  5. linux socket读写函数,Linux网络编程入门

    第一个函数是socket函数. socket函数的Linux头文件以及函数定义如下: #include int socket(int domain, int type, int protocal); ...

  6. linux 文件操作函数,Linux下的文件操作函数及creat用法

    编写Linux应用程序要用到如下工具: (1)编译器:GCC GCC是Linux平台下最重要的开发工具,它是GNU的C和C++编译器,其基本用法为:gcc [options] [filenames]. ...

  7. linux拷贝文件函数,linux下文件操作的各个函数

    作者:HoytEmail:hoytluo@21cn.com 前言: 我们在这一节将要讨论linux下文件操作的各个函数. 文件的创建和读写 文件的各个属性 目录文件的操作 管道文件 --------- ...

  8. linux中iconv函数,Linux下编码转换(iconv函数族)

    转自:http://www.linuxdiyf.com/viewarticle.php?id=45164 在Linux上进行编码转换时,既可以利用iconv函数族编程实现,也可以利用iconv命令来实 ...

  9. linux扩展堆函数,linux下进程堆栈下溢出判断及扩展实现

    一.堆栈扩展 在进程创建的时候,内核并没有为进程分配太多的堆栈,即使是逻辑地址空间也没有,这样做的好处就是如果说用户态的程序堆栈向下溢出(对386来说,就是访问了更低地址的内存空间),这样内核可以比较 ...

最新文章

  1. nojy 105 九的余数
  2. 内核中的对象操作的方法模块 和 C++ 构造和析构的对比
  3. linux mysql 自动加斜杠_【实战演练】Linux操作系统19-Mysql主主复制加Keepalived高可用...
  4. html 访问 php 变量
  5. Aspnet Core 对 Resetful API版本的支持
  6. IDEA忽略不必要提交的文件
  7. 轻轻松松看懂Spring AOP源码
  8. [JAVA][算法] [字符串匹配]KMP
  9. 从框架源码中学习结构型设计模式
  10. php二进制保存到本地,C# 将二进制字符串保存到本地
  11. 用Java实现一个简单的链表迭代器
  12. 从“中国听”到“听中国”!全球化下的音乐产业 迈向5G时代
  13. java继承的性质,浅谈Java三大特性之继承
  14. Python生成器教程
  15. 少年Pi的奇幻漂流-我们的后台自动化发布方案
  16. [HOJ1864]Fibonacci
  17. <input>:1: UserWarning: The .grad attribute of a Tensor that is not a leaf Tensor is being accessed.
  18. XMind ,石墨笔记, Effie ,你用什么应用来完成采编工作?
  19. Java毕设项目共享充电宝系统(java+VUE+Mybatis+Maven+Mysql)
  20. 【项目】磁盘文件管理工具

热门文章

  1. 漫谈可视化Prefuse(四)---被玩坏的Prefuse API
  2. [转载] 高等应用数学问题的matlab求解——第1章 计算机数学语言概述
  3. 通过命令行使用 JAX-WS调用webservice
  4. 一种简单又有效的设置虚拟机网络的方法
  5. json字符串转换成json对象,json对象转换成字符串,值转换成字符串,字符串转成值...
  6. servlet配置web.xml问题
  7. 【BZOJ1010】【HNOI2008】玩具装箱(斜率优化,动态规划)
  8. 第7课第2节_Binder系统_c++实现_编译测试
  9. 苹果应用ipa图片提取
  10. STL学习小记--与C++模板相关的几个特性