Linux下读写芯片的I2C寄存器 2012-01-10 11:40:18

标签:Linux 寄存器 驱动 读写 I2C
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://ticktick.blog.51cto.com/823160/760965

要想在Linux下读写芯片的I2C寄存器,一般需要在Linux编写一份该芯片的I2C驱动,关于Linux下如何编写I2C驱动,前一篇文章《手把手教你写Linux I2C设备驱动》已经做了初步的介绍,并且留下了两个疑问尚未解决,第一个是如何对Linux提供的I2C操作函数进行进一步封装,实现对芯片寄存器的读写;另一个是如何在用户空间调用该I2C驱动代码。本文将讨论前一个问题。

首先,我们要了解Linux系统提供的I2C操作函数怎么使用,上篇文章已经提到过,对I2C设备的读写,Linux系统提供了多种接口,这些接口可以在内核的 i2c.h 中找到,这里我主要介绍下面这组读写接口:

  1. extern int i2c_master_send(struct i2c_client *,const char* ,int);
  2. 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 函数传入两个字节的数据即可,第一个字节为寄存器的地址,第二个字节为要写入寄存器的数据。示例如下:

  1. static int tvp5158_i2c_write( struct i2c_client* client,uint8_t reg,uint8_t data)
  2. {
  3. unsigned char buffer[2];
  4. buffer[0] = reg;
  5. buffer[1] = data;
  6. if( 2!= i2c_master_send(client,buffer,2) ) {
  7. printk( KERN_ERR " tvp5158_i2c_write fail! \n" );
  8. return -1;
  9. }
  10. return 0;
  11. }

其实挺简单的,没有什么复杂的代码。下面再看看读时序。

由上图可以,读时序需要做的操作是,先向I2C总线上写入需要读的寄存器地址,然后读I2C总线上的值。代码写起来也不难,示例如下:

  1. static int tvp5158_i2c_read( struct i2c_client* client,uint8_t reg,uint8_t *data)
  2. {
  3. // write reg addr
  4. if( 1!= i2c_master_send(client,&reg,1) ) {
  5. printk( KERN_ERR " tvp5158_i2c_read fail! \n" );
  6. return -1;
  7. }
  8. // wait
  9. msleep(10);
  10. // read
  11. if( 1!= i2c_master_recv(client,data,1) ) {
  12. printk( KERN_ERR " tvp5158_i2c_read fail! \n" );
  13. return -1;
  14. }
  15. return 0;
  16. }

到此为止,Linux下具体如何封装读写芯片寄存器的方法已经介绍完毕,其实并不复杂,希望对初学者有所帮助,文中有什么讲述不正确的地方,欢迎留言或者来信lujun.hust@gmail.com交流。

Linux下读写芯片的I2C寄存器相关推荐

  1. linux i2c 读写函数,Linux下读写芯片的I2C寄存器

    要想在Linux下读写芯片的I2C寄存器,一般需要在Linux编写一份该芯片的I2C驱动,关于Linux下如何编写I2C驱动,前一篇文章<手把手教你写Linux I2C设备驱动>已经做了初 ...

  2. Linux uart寄存器读写,Linux下读写UART串口的代码

    Linux下读写UART串口的代码,从IBM Developer network上拿来的东西,操作比較的复杂,就直接跳过了,好在代码能用,记录一下- 两个实用的函数- /** *@brief 设置串口 ...

  3. linux下IO口模拟I2C的一些总结

    2019独角兽企业重金招聘Python工程师标准>>> 以前一直在用I2C接口,因为总是有线程的例子就一直没有去深入的了解,今天分析了一下在linux下通用GPIO模拟I2C的程序. ...

  4. Qt4 Linux下读写excel

    背景 最近项目中涉及到excel的读写,因为是在Linux上操作,而且是Qt4的版本,所以相对有些麻烦.之前我们用的是直接通过python去读写excel,把数据存储到中间文件.然后读中间文件进行操作 ...

  5. linux 驱动读写文件,Linux下读写寄存器

    arm裸机下读写寄存器很容易,各个寄存器和内存的地址是单一地址空间,他们是用相同的指令进行读写操作的.而在linux下就要复杂很多,因为linux支持多个体系架构的CPU.比如arm和x86就不一样, ...

  6. Linux下使用GPIO模拟I2C IIC驱动(PCF8563)

    此代码实现LINUX下,创建/dev/algortc设备,但是没有实现rtc标准的读写接口,仅仅实现了IIC时序模拟,编译出.ko文件之后,使用insmod命令挂载,代码里面的线程就会循环读写PCF8 ...

  7. 通过mtd读写flash_【转】 Linux下读写FLASH驱动——MTD设备分析

    最近在学习驱动读写flash的代码部分.经历了可笑的过程:开始我知道flash用通过spi口来读写.所以就到了driver/spi 下面看相关代码.发现有个spidev.c里面有read/write/ ...

  8. linux系统读写eth网卡PHY寄存器工具mdio_cmd

    在用户层访问smi/mdio总线, 读写phy芯片寄存器的通用代码.Linux内核2.6以上通用. mdio_cmd.c #include <sys/types.h> #include & ...

  9. Linux下TIomap芯片MUX配置

    在移植内核的时候,通常会遇到引脚复用(MUX)的配置问题.在现在的Linux内核中,对于TI的arm芯片,早已经有了比较通用的MUX配置框架.这对于许多TI的芯片都是通用的,这次看AM335X的代码顺 ...

最新文章

  1. MySQL优化篇:explain性能分析
  2. MapReduce天气案例
  3. hibernate mysql 模糊查询_服务器-hibernate操作mysql,模糊查询时中文查不到,数字和英文可以查到...
  4. 《计算机导论》微软ibm,3《计算机导论》第1章_认识计算机.pdf
  5. Python学习笔记19(算法)
  6. 容器精华问答 | 我们为什么需要容器?
  7. 从Flutter路由报错引申BuildContext详解
  8. 远程桌面连接下拉框IP地址删除
  9. 英语口语中的音变现象及读音规则
  10. KB,MB单位转换(Vue)
  11. 倒计时21天,房贷利率新政要来了,有银行已率先公布报价
  12. linux内核IDR机制详解(一)
  13. oracle 查看时间对应周,oracle数据获取当前自然周,当前周的起始和结束时间
  14. 4. ElasticSearch——aggregations聚合分析
  15. Quartus无法选择器件库
  16. SEED LABS初入
  17. APEX包管理器简述(二)
  18. 7-2 jmu-Java-03面向对象-06-继承覆盖综合练习-Person、Student、Employee、Company (15分)
  19. 几个目标检测算法的比较——yolov4,yolov4-tiny,faster-rcnn
  20. Spring框架中entity层、dao层、service层、mapper层、controller层详解

热门文章

  1. Bishops Alliance—— 最大上升子序列
  2. XtraBackup全备与增量备份
  3. Underscore.js常用方法介绍
  4. Highcharts的饼图大小的控制
  5. 高并发的理解和使用场景-----特意区别和多线程的关系
  6. python腾讯语音合成
  7. ThinkPHP简单的验证码实现
  8. c# 流,字节数组及字符串之间的转换
  9. Vue组件通信原理剖析(一)事件总线的基石 $on和$emit
  10. [web性能优化] - 使用在线工具对html、js、css进行压缩