RK3399平台开发系列讲解(内核调试篇)9.22I2C tools的使用

Posted 内核笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RK3399平台开发系列讲解(内核调试篇)9.22I2C tools的使用相关的知识,希望对你有一定的参考价值。

在这里插入图片描述

当你拿到开发板或者是从公司的硬件同事拿到一个带有I2C外设的板子,我们应该如何最快速的使用起来这个I2C设备呢?既然我们总是说这个I2C总线在嵌入式开发中被广泛的使用,那么是否有现成的测试工具帮我们完成这个快速使用板子的I2C设备呢?答案是有的,而且这个测试工具的代码还是开源的,它被广泛的应用在linux应用层来快速验证I2C外设是否可用,为我们测试I2C设备提供了很好的捷径。

一、如何使用I2C tools测试I2C外设

1、I2C tools概述:

I2C tools包含一套用于Linux应用层测试各种各样I2C功能的工具。它的主要功能包括:总线探测工具、SMBus访问帮助程序、EEPROM解码脚本、EEPROM编程工具和用于SMBus访问的python模块。只要你所使用的内核中包含I2C设备驱动,那么就可以在你的板子中正常使用这个测试工具。


2、下载I2C tools源码:

前面我们已经说过了这个I2C tools工具是开源的,那么这个源码在哪里可以找到呢?

  • 下载方法一:直接在内核的网站i2c-tools下载I2C tools代码的压缩包
  • 下载方法二:利用git管理工具下载这个I2C tools的源代码,命令为git clone git://git.kernel.org/pub/scm/utils/i2c-tools/i2c-tools.git

强烈建议读者采用第二种方法下载这个代码,因为你可以通过git快速地了解这个开源代码的不同版本的功能改进及bug修复,而且使用git开发也是作为一名优秀的开发人员必备的一项技能。


3、编译I2C tools源码:

进入刚才利用git下载好的i2c-tools源码目录,修改编译工具为你当前使用的交叉编译工具:

26	 CC  ?= arm-linux-gnueabi-gcc
27	 AR  ?= arm-linux-gnueabi-ar

编译源码:如果你想编译静态版本,你可以输入命令:make USE_STATIC_LIB=1;如果使用动态库的话,可以直接输入make进行编译。
在这里插入图片描述

  1. tools目录下的5个可执行文件i2cdetecti2cdumpi2cgeti2cseti2ctransfer复制到板子的/usr/sbin/中;
  2. adb push传输失败:Read-only file system,说明系统是只读权限,需要修改权限:mount -o remount,rw /
  3. chmod 777 i2cdetect…文件修改为可执行的权限。
  4. lib目录下的libi2c.so.0.1.1文件复制到板子的/usr/lib/libi2c.so.0

在这里插入图片描述


4、i2cdetect

i2cdetect的主要功能就是I2C设备查询,它用于扫描I2C总线上的设备。它输出一个表,其中包含指定总线上检测到的设备的列表。
该命令的常用格式为:i2cdetect [-y] [-a] [-q|-r] i2cbus [first last]。具体参数的含义如下:
在这里插入图片描述

参数含义
-y取消交互模式。默认情况下,i2cdetect将等待用户的确认,当使用此标志时,它将直接执行操作。
-a强制扫描非规则地址。一般不推荐。
-q使用SMBus“快速写入”命令进行探测。一般不推荐。
-r使用SMBus“接收字节”命令进行探测。一般不推荐。
-F显示适配器实现的功能列表并退出。
-V显示I2C工具的版本并推出。
-l显示已经在系统中使用的I2C总线。
i2cbus表示要扫描的I2C总线的编号或名称。
first last表示要扫描的从设备地址范围。

该功能的常用方式:

  • 第一,先通过i2cdetect -l查看当前系统中的I2C的总线情况:
    在这里插入图片描述

  • 第二,若总线上挂载I2C从设备,可通过i2cdetect扫描某个I2C总线上的所有设备。可通过控制台输入i2cdetect -r -y 1:(其中"--"表示地址被探测到了,但没有芯片应答; "UU"因为这个地址目前正在被一个驱动程序使用,探测被省略;
    在这里插入图片描述

  • 第三,查询I2C总线2 (I2C -2)的功能,命令为i2cdetect -F 2
    在这里插入图片描述


5、i2cget

i2cget的主要功能是获取I2C外设某一寄存器的内容。
该命令的常用格式为:i2cget [-f] [-y] [-a] i2cbus chip-address [data-address [mode]]
在这里插入图片描述
具体参数的含义如下:

参数含义
-f强制访问设备,即使它已经很忙。默认情况下,i2cget将拒绝访问已经在内核驱动程序控制下的设备。
-y取消交互模式。默认情况下,i2cdetect将等待用户的确认,当使用此标志时,它将直接执行操作。
-a取消交互模式。默认情况下,i2cdetect将等待用户的确认,当使用此标志时,它将直接执行操作。
i2cbus表示要扫描的I2C总线的编号或名称。这个数字应该与i2cdetect -l列出的总线之一相对应。
chip-address要操作的外设从地址。
data-address被查看外设的寄存器地址。
mode显示数据的方式:b (read byte data, default)w (read word data)c (write byte/read byte)

下面是完成读取0总线上从地址为0x50的外设的0x10寄存器的数据,命令为:

i2cget -y -f 2 0x18 0x10

在这里插入图片描述


6、i2cdump

i2cdump的主要功能查看I2C从设备器件所有寄存器的值。
该命令的常用格式为:i2cdump [-f] [-r first-last] [-y] [-a] i2cbus address [mode [bank [bankreg]]]
在这里插入图片描述
具体参数的含义如下:

参数含义
-f强制访问设备,即使它已经很忙。默认情况下,i2cget将拒绝访问已经在内核驱动程序控制下的设备。
-r限制正在访问的寄存器范围。 此选项仅在模式bwcW中可用。对于模式Wfirst必须是偶数,last必须是奇数。
-y取消交互模式。默认情况下,i2cdetect将等待用户的确认,当使用此标志时,它将直接执行操作。
-V显示I2C工具的版本并推出。
i2cbus表示要扫描的I2C总线的编号或名称。这个数字应该对应于i2cdetect -l列出的总线之一。
first last表示要扫描的从设备地址范围。
modeb: 单个字节、w16位字、sSMBus模块、iI2C模块的读取大小、c: 连续读取所有字节,对于具有地址自动递增功能的芯片(如EEP​​ROM)非常有用、Ww类似,只是读命令只能在偶数寄存器地址上发出;这也是主要用于EEPROM的。

下面是完成读取2总线上从地址为0x18的数据,命令为:i2cdump -f -y 2 0x18在这里插入图片描述


7、i2cset

i2cset的主要功能是通过I2C总线设置设备中某寄存器的值。该命令的常用格式为:
i2cset [-f] [-y] [-m mask] [-r] i2cbus chip-address data-address [value] ...[mode]
在这里插入图片描述
具体参数的含义同i2cdump
下面是完成向2总线上从地址为0x180x10寄存器写入0x55,然后用i2cget读取确认。
在这里插入图片描述


8、i2ctransfer

i2ctransfer的主要功能是在一次传输中发送用户定义的I2C消息。i2ctransfer是一个创建I2C消息并将其合并为一个传输发送的程序。对于读消息,接收缓冲区的内容被打印到stdout,每个读消息一行。
该命令的常用格式为:i2ctransfer [-f] [-y] [-v] [-a] i2cbus desc [data] [desc [data]]
在这里插入图片描述
具体参数的含义如下:

参数含义
-f强制访问设备,即使它已经很忙。
默认情况下,i2cget将拒绝访问已经在内核驱动程序控制下的设备。
-y取消交互模式。默认情况下,i2cdetect将等待用户的确认,当使用此标志时,它将直接执行操作。
-v启用详细输出。它将打印所有信息发送,即不仅为读消息,也为写消息。
-V显示I2C工具的版本并推出。
-a允许在0x00 - 0x02和0x78 - 0x7f之间使用地址。一般不推荐。
i2cbus表示要扫描的I2C总线的编号或名称。这个数字应该对应于i2cdetect -l列出的总线之一。

下面是完成向2总线上从地址为0x180x10开始的4个寄存器写入0x01,0x02,0x03,0x04
命令为:i2ctransfer -f -y 2 w5@0x18 0x10 0x01 0x02 0x03 0x04
在这里插入图片描述

然后再通过命令i2ctransfer -f -y 2 w1@0x18 0x10 r40x10地址的4个寄存器数据读出来,见下图:
在这里插入图片描述

以上是关于RK3399平台开发系列讲解(内核调试篇)9.22I2C tools的使用的主要内容,如果未能解决你的问题,请参考以下文章

RK3399平台开发系列讲解(内核调试篇)常用Linux内核调试手段介绍 - 视频介绍

RK3399平台开发系列讲解(内核调试篇)常用Linux内核调试手段介绍 - 视频介绍

RK3399平台开发系列讲解(内核调试篇)2.51什么是硬件断点

RK3399平台开发系列讲解(内核调试篇)9.37如何分析性能问题?

RK3399平台开发系列讲解(内核调试篇)2.51什么是硬件断点

RK3399平台开发系列讲解(内核调试篇)2.50systrace的使用