Linux下读写芯片的I2C寄存器
Linux下读写芯片的I2C寄存器 2012-01-10 11:40:18
要想在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下读写芯片的I2C寄存器,一般需要在Linux编写一份该芯片的I2C驱动,关于Linux下如何编写I2C驱动,前一篇文章<手把手教你写Linux I2C设备驱动>已经做了初 ...
- Linux uart寄存器读写,Linux下读写UART串口的代码
Linux下读写UART串口的代码,从IBM Developer network上拿来的东西,操作比較的复杂,就直接跳过了,好在代码能用,记录一下- 两个实用的函数- /** *@brief 设置串口 ...
- linux下IO口模拟I2C的一些总结
2019独角兽企业重金招聘Python工程师标准>>> 以前一直在用I2C接口,因为总是有线程的例子就一直没有去深入的了解,今天分析了一下在linux下通用GPIO模拟I2C的程序. ...
- Qt4 Linux下读写excel
背景 最近项目中涉及到excel的读写,因为是在Linux上操作,而且是Qt4的版本,所以相对有些麻烦.之前我们用的是直接通过python去读写excel,把数据存储到中间文件.然后读中间文件进行操作 ...
- linux 驱动读写文件,Linux下读写寄存器
arm裸机下读写寄存器很容易,各个寄存器和内存的地址是单一地址空间,他们是用相同的指令进行读写操作的.而在linux下就要复杂很多,因为linux支持多个体系架构的CPU.比如arm和x86就不一样, ...
- Linux下使用GPIO模拟I2C IIC驱动(PCF8563)
此代码实现LINUX下,创建/dev/algortc设备,但是没有实现rtc标准的读写接口,仅仅实现了IIC时序模拟,编译出.ko文件之后,使用insmod命令挂载,代码里面的线程就会循环读写PCF8 ...
- 通过mtd读写flash_【转】 Linux下读写FLASH驱动——MTD设备分析
最近在学习驱动读写flash的代码部分.经历了可笑的过程:开始我知道flash用通过spi口来读写.所以就到了driver/spi 下面看相关代码.发现有个spidev.c里面有read/write/ ...
- linux系统读写eth网卡PHY寄存器工具mdio_cmd
在用户层访问smi/mdio总线, 读写phy芯片寄存器的通用代码.Linux内核2.6以上通用. mdio_cmd.c #include <sys/types.h> #include & ...
- Linux下TIomap芯片MUX配置
在移植内核的时候,通常会遇到引脚复用(MUX)的配置问题.在现在的Linux内核中,对于TI的arm芯片,早已经有了比较通用的MUX配置框架.这对于许多TI的芯片都是通用的,这次看AM335X的代码顺 ...
最新文章
- MySQL优化篇:explain性能分析
- MapReduce天气案例
- hibernate mysql 模糊查询_服务器-hibernate操作mysql,模糊查询时中文查不到,数字和英文可以查到...
- 《计算机导论》微软ibm,3《计算机导论》第1章_认识计算机.pdf
- Python学习笔记19(算法)
- 容器精华问答 | 我们为什么需要容器?
- 从Flutter路由报错引申BuildContext详解
- 远程桌面连接下拉框IP地址删除
- 英语口语中的音变现象及读音规则
- KB,MB单位转换(Vue)
- 倒计时21天,房贷利率新政要来了,有银行已率先公布报价
- linux内核IDR机制详解(一)
- oracle 查看时间对应周,oracle数据获取当前自然周,当前周的起始和结束时间
- 4. ElasticSearch——aggregations聚合分析
- Quartus无法选择器件库
- SEED LABS初入
- APEX包管理器简述(二)
- 7-2 jmu-Java-03面向对象-06-继承覆盖综合练习-Person、Student、Employee、Company (15分)
- 几个目标检测算法的比较——yolov4,yolov4-tiny,faster-rcnn
- Spring框架中entity层、dao层、service层、mapper层、controller层详解