RK3399—i2ctools工具移植

1. i2ctools

  i2ctools是linux系统下一款i2c调试利器,方便对i2c总线和i2c设备调试,i2ctools工具支持的功能包括:

  • 检测cpu i2c总线
  • 检测i2c总线挂载的设备
  • i2c设备读写访问

  第一点一般用于cpu i2c总线驱动调试,但是一般情况下,cpu原厂已经提供i2c总线驱动,除非是原厂驱动开发,否则大多数驱动编写场景都是基于i2c总线驱动开发i2c设备驱动。后两点对于i2c设备驱动前期开发工作来说,十分帮助性。

  • 检测硬件是否有误,驱动不正常时首先检测电路连接是否正常
  • 实时检测状态寄存器,比如图像sensor、视频处理芯片一般通过i2c配置和获取状态信息
  • 实时更改i2c设备配置,最终确定好配置信息后,再修改驱动程序
  • 验证驱动的读写功能是否正确

2. i2ctools移植到rk3399

2.1 源码下载

下载地址:

【1】https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/
【2】https://i2c.wiki.kernel.org/index.php/I2C_Tools
在这里插入图片描述
  目前版本更新到4.1,根据自己linux系统已有的解压工具选择对应的压缩文件,这里我下载的是 “.gz”格式,方便解压。执行“tar -xvzf i2c-tools-4.1.tar.gz ”解压。
在这里插入图片描述


2.2 编译

  修改Makefile,选择rk3399的交叉编译器,然后执行make编译。

CC      := aarch64-linux-gnu-gcc

  编译完成, 在“tools”目录生成可执行文件i2cdetect、i2cdump、i2cget、i2cset、i2ctransfer;在“lib”目录生成“libi2c.so.0.1.1”动态库文件。将执行文件拷贝到rk3399板子任意目录,将库文件“libi2c.so.0.1.1”拷贝到rk3399板子“/lib”目录下。但此时执行i2ctools相关操作,应该是不成功的。

在这里插入图片描述

创建软链接

  根据提示错误信息,i2ctools执行文件依赖“libi2c.so.0”文件,在板子上直接执行会提示加载库文件失败。通过编译后“lib”目录发现“libi2c.so.0”实际上为一个软链接文件,连接到“libi2c.so.0.1.1”。

在这里插入图片描述

注:
软连接,可以类比为Windows下的快捷方式。

  因此,我们在板子上“/lib”目录下创建一个“libi2c.so.0”的软链接。虽然编译生成了软链接文件,但软连接文件是拷贝不了的,所以需要手动创建。

ln -s libi2c.so.0.1.1 libi2c.so.0

  执行“ls -l”查看软链接是否创建成功。创建成功,再执行i2ctools工具就不会报错了。
在这里插入图片描述

注:
如果不用软链接,可以直接把板子“/lib”目录下的“libi2c.so.0.1.1”文件名称修改为“libi2c.so.0”的,就像Windows下可以通过快捷方式访问文件,也可以直接进入文件目录下访问。


另外,rk3399板子官方提供的Ubuntu16.04已带有编译器,可以直接把i2ctools源码文件拷贝到板子上编译,然后执行。


2.3 命令使用语法

  如果i2cdetect、i2cdump、i2cget、i2cset、i2ctransfer工具命令执行失败,查看文件的属性和权限,如果没有“可执行”属性,则执行“chmod 777 file”增加可执行属性;如果需要root权限则使用sudo命令。


  • 查看板子i2c总线
./i2cdetect -l

在这里插入图片描述

  • 查看i2c总线挂载的设备
./i2cdetect -r -y i2c-no
./i2cdetect -r -y 4	/* 查看i2c4挂载的设备 */

在这里插入图片描述
  i2c4上挂载了2个设备,地址分别是0x22和0x77,0x22是已经被系统加载了该驱动,显示“UU”;0x77是外挂的一个气压传感器BMP180。

注:
如果i2c设备驱动已经被系统加载,地址显示“UU”。


  • 读取i2c设备所有寄存器值
./i2cdump -f -y i2c-no i2c-addr
./i2cdump -f -y 4 0x77	/* 读取i2c4上的bmp180(0x77)所有寄存器值 */	

在这里插入图片描述

  • 读取i2c设备指定寄存器
./i2cget -f -y i2c-no i2c-addr reg
./i2cget -f -y 4 0x77 0xD0	/* 读取i2c4上的bmp180(0x77)的芯片ID(0xD0)寄存器 */

在这里插入图片描述

  • 写i2c设备指定寄存器
./i2cset -f -y i2c-no i2c-addr reg reg-value

  • 读取i2c设备多个字节数据
./i2ctransfer -f -y i2c-no w-num@i2c-addr data-0 data-1 data-n r-num
./i2ctransfer -f -y 4 w1@0x77 0x01 r3		/* 从0x01寄存器开始连续读取3字节数据 */

注:
也可以用来读寄存器地址大于8位的设备,比如从某个地址为0xab的i2c设备0x1234寄存器读取2字节数据
./i2ctransfer -f -y 4 w2@0xab 0x12 0x34 r2


  • 写i2c设备多个字节数据
./i2ctransfer -f -y i2c-no w-num@i2c-addr data-0 data-1 data-2
./i2ctransfer -f -y 4 w3@0x77 0x01 0x0a	0x0b	/* 往0x01寄存器写入0x0b0a */

注:
也可以用来写寄存器地址大于8位的设备,比如往某个地址为0xab的i2c设备0x1234寄存器写入0x0a
./i2ctransfer -f -y 4 w3@0xab 0x12 0x34 0x0a


总结:i2cget 、i2cset 用于8位寄存器的单字节数据访问,i2ctransfer 可以访问大于8位寄存器地址及访问多个字节。


3. 参考

【1】https://blog.csdn.net/mantis_1984/article/details/18254767/

原创文章 128 获赞 147 访问量 36万+

猜你喜欢

转载自blog.csdn.net/qq_20553613/article/details/104030500