i2ctools是linux系统下一款i2c调试利器,方便对i2c总线和i2c设备调试,i2ctools工具支持的功能包括:
第一点一般用于cpu i2c总线驱动调试,但是一般情况下,cpu原厂已经提供i2c总线驱动,除非是原厂驱动开发,否则大多数驱动编写场景都是基于i2c总线驱动开发i2c设备驱动。后两点对于i2c设备驱动前期开发工作来说,十分帮助性。
下载地址:
【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 ”解压。
修改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源码文件拷贝到板子上编译,然后执行。
如果i2cdetect、i2cdump、i2cget、i2cset、i2ctransfer工具命令执行失败,查看文件的属性和权限,如果没有“可执行”属性,则执行“chmod 777 file”增加可执行属性;如果需要root权限则使用sudo命令。
./i2cdetect -l
./i2cdetect -r -y i2c-no
./i2cdetect -r -y 4 /* 查看i2c4挂载的设备 */
i2c4上挂载了2个设备,地址分别是0x22和0x77,0x22是已经被系统加载了该驱动,显示“UU”;0x77是外挂的一个气压传感器BMP180。
注:
如果i2c设备驱动已经被系统加载,地址显示“UU”。
./i2cdump -f -y i2c-no i2c-addr
./i2cdump -f -y 4 0x77 /* 读取i2c4上的bmp180(0x77)所有寄存器值 */
./i2cget -f -y i2c-no i2c-addr reg
./i2cget -f -y 4 0x77 0xD0 /* 读取i2c4上的bmp180(0x77)的芯片ID(0xD0)寄存器 */
./i2cset -f -y i2c-no i2c-addr reg reg-value
./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
./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位寄存器地址及访问多个字节。
【1】https://blog.csdn.net/mantis_1984/article/details/18254767/