1 下载i2c-tools
从开源网站http://dl.lm-sensors.org/i2c-tools/releases/下载i2c-tools
几个版本都可以用,可以选择下载i2c-tools-4.3
2 到官网下载交叉编译环境 gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
http://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/
3 到i2c-tools-4.3下打开Makefile修改指定交叉编译环境路径
COMPILE_PREFIX:= /code/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
PREFIX = system
CC := $(COMPILE_PREFIX)gcc
执行makefile生成i2cdetect等执行文件
4 对于基于平台mt6765的手机安卓系统,i2c-tools-4.3下添加Android.mk文件
参考https://www.cnblogs.com/lialong1st/p/11637011.html添加
LOCAL_PATH:= $(call my-dir)
################### i2c-tools #########################
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := eng
LOCAL_MODULE := i2c-tools
LOCAL_SRC_FILES := \
tools/i2cbusses.c \
tools/util.c \
lib/smbus.c
LOCAL_C_INCLUDES += \
$(LOCAL_PATH) \
$(LOCAL_PATH)/include
#LOCAL_CFLAGS := -g -Wall -Werror -Wno-unused-parameter
include $(BUILD_STATIC_LIBRARY)
################### i2cdetect #########################
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := eng
LOCAL_MODULE:=i2cdetect
LOCAL_SRC_FILES:= \
tools/i2cdetect.c
LOCAL_C_INCLUDES += \
$(LOCAL_PATH) \
$(LOCAL_PATH)/include
LOCAL_SHARED_LIBRARIES:= \
libc
LOCAL_STATIC_LIBRARIES := \
i2c-tools
LOCAL_CPPFLAGS += -DANDROID
include $(BUILD_EXECUTABLE)
#################### i2cget ###########################
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := eng
LOCAL_MODULE:=i2cget
LOCAL_SRC_FILES:= \
tools/i2cget.c
LOCAL_C_INCLUDES += \
$(LOCAL_PATH) \
$(LOCAL_PATH)/include
LOCAL_SHARED_LIBRARIES:= \
libc
LOCAL_STATIC_LIBRARIES := \
i2c-tools
LOCAL_CPPFLAGS += -DANDROID
include $(BUILD_EXECUTABLE)
##################### i2cset ##########################
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := eng
LOCAL_MODULE:=i2cset
LOCAL_SRC_FILES:= \
tools/i2cset.c
LOCAL_C_INCLUDES += \
$(LOCAL_PATH) \
$(LOCAL_PATH)/include
LOCAL_SHARED_LIBRARIES:= \
libc
LOCAL_STATIC_LIBRARIES := \
i2c-tools
LOCAL_CPPFLAGS += -DANDROID
include $(BUILD_EXECUTABLE)
##################### i2cdump #########################
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := eng
LOCAL_MODULE:=i2cdump
LOCAL_SRC_FILES:= \
tools/i2cdump.c
LOCAL_C_INCLUDES += \
$(LOCAL_PATH) \
$(LOCAL_PATH)/include
LOCAL_SHARED_LIBRARIES:= \
libc
LOCAL_STATIC_LIBRARIES := \
i2c-tools
LOCAL_CPPFLAGS += -DANDROID
include $(BUILD_EXECUTABLE)
################### i2ctransfer #######################
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := eng
LOCAL_MODULE:=i2ctransfer
LOCAL_SRC_FILES:= \
tools/i2ctransfer.c
LOCAL_C_INCLUDES += \
$(LOCAL_PATH) \
$(LOCAL_PATH)/include
LOCAL_SHARED_LIBRARIES:= \
libc
LOCAL_STATIC_LIBRARIES := \
i2c-tools
LOCAL_CPPFLAGS += -DANDROID
include $(BUILD_EXECUTABLE)
将i2c-tools-4.3拷贝至工程system/core下面
执行mmm system/core/i2c-tools-4.3
就会在system/bin下生成i2cdetect,i2cget,i2cset,i2cdump,i2ctransfer等文件
此时将这些执行文件加载进系统,可能会提示错误,如执行i2cdetect -y 1
Could not open file `/dev/i2c-1' or `/dev/i2c/1'
需要在kernel-4.9/arch/arm64/configs将对应的xxx_64_bsp_defconfig将如下编译开关打开,重新编译系统
CONFIG_I2C_CHARDEV=y
5 工具使用
(1)执行i2cdetect 1,扫描/dev/i2c-1后面的设备
k62v1_64_bsp:/ # i2cdetect 1
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-1.
I will probe address range 0x08-0x77.
Continue? [Y/n] y
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: 30 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- UU -- -- -- -- --
70: -- -- -- -- -- -- -- --
可以看到,i2c-1,后面挂的设备有
5B,6A
(2)用i2cdump查看器件所有寄存器的值,如:查看0x5B设备上的所有寄存器的值,i2cdump -f -y 1 0x5B
k62v1_64_bsp:/ # i2cdump -f -y 1 0x5B
No size specified (using byte-data access)
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
00: 00 00 ff ff 00 00 00 00 00 00 00 00 00 00 00 00 ................
10: 23 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 #...............
20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
40: 00 00 ff ff 00 00 00 00 00 00 00 00 00 00 00 00 ................
50: 23 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 #...............
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
80: 00 00 ff ff 00 00 00 00 00 00 00 00 00 00 00 00 ................
90: 23 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 #...............
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
c0: 00 00 ff ff 00 00 00 00 00 00 00 00 00 00 00 00 ................
d0: 23 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 #...............
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
通过i2cset设置单个寄存器值,用i2cget读取单个寄存器值,在调试阶段不断更新效果,带确定最终效果后,通过上面指令把寄存器值都读出来,写到驱动的初始化代码中去.
简单操作下如:
k62v1_64_bsp:/ # i2cget -f -y 1 0x5b 0xd0
0x23
读出0x5B设备的0xd0寄存器值为0x23
k62v1_64_bsp:/ # i2cset -f -y 1 0x5b 0xd0 0x24
设置0x5B设备的0xd0寄存器值为0x24
在调试的过程中,还可以接示波器通过发送读写指令抓取i2c波形.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)