项目场景:
在RK3399项目中编译i2c-tools
首先先下载代码:git clone git://git.kernel.org/pub/scm/utils/i2c-tools/i2c-tools.git
修改makefile:
添加自己的交叉编译工具链路径,比如我们是
COMPILE_PREFIX = /rk3399_git/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
CC = $(COMPILE_PREFIX)gcc
AR = $(COMPILE_PREFIX)ar
STRIP = $(COMPILE_PREFIX)strip
使用make命令编译,会生成可以执行文件i2ctransfer、i2cset、i2cget、i2cdump、i2cdetect等可执行文件,然后把文件push到安卓下的、system/bin文件下。
问题描述:
1、进入adb使用使用上面编译出来的命令:./i2cdetect打印出如下错误
/system/bin/sh: /system/bin/i2cdetect: No such file or directory
2、我们使用file 命令测试:file /system/bin/i2cdetect
/system/bin/i2cdetect: ELF executable, 64-bit LSB arm64, dynamic (/lib/ld-linux-aarch64.so.1), BuildID=c448d89f1e0d50f45ede8dc7e64b76db49acfb65, not stripped
3、可以看到这个可执行文件依赖/lib/ld-linux-aarch64.so.1,这个动态库,然后我们去到我们的板子下ls查看并没有这个动态库,所以问题就出现在这里缺少某些动态库。
解决方案:
1、去到我们交叉编译工具链的地址:/rk3399_git/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/
find -name “ld-linux-aarch64.so.1” 查找我们缺失的动态库的存放的地方。
然后将这个动态库“ld-linux-aarch64.so.1” 和动态库 “libc.so.6” 使用adb push 到 lib文件夹
2、然后会到i2c-tools的目录下,也要将一些动态库push到我们的开发板中。将i2c-tools的目录下lib中的libi2c.so.0.1.1 push到开发板的lib文件夹。然后建立链接文件,类似windows下的快捷方式:
建立链接命令:
ln -s libi2c.so.0.1.1 libi2c.so.0
3、如果运行还出现“没有权限”这个错误,还需要把上面的库修改权限 +777。
命令使用方法
i2cset和i2cget使用方法:
./i2cset -f -y 1 0x20 0x77 0x3f (设置i2c-1上0x20器件的0x77寄存器值为0x3f)
./i2cget -f -y 1 0x20 0x77 (读取i2c-1上0x20器件的0x77寄存器值)
i2cdetect使用方法:
i2cdetect检测挂载在i2c总线上器件,输入 ./i2cdetect-r -y 1(检测i2c-1上的挂载情况)
备注:如果 i2cdetect使用这个命令检测比较慢证明这个总线的dts没有使能,正常情况下检测是非常快的。
i2cdump使用方法:
i2cdump来看i2c-1上0x49地址的i2c设备中所有register的值 :./i2cdump -f -y 1 0x49