一、使用i2c-tools工具让调试i2c外围设备方便很多,有必要推荐一下。
二、在android源码里面编译i2c-tools。源码下载路径:androidlinuxi2c调试工具源码i2c-tools-3.0.0.zip_i2ctools源码-Linux代码类资源-CSDN下载
1、下载i2c-tools source code,如下
2、把代码放到external下,添加Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_C_INCLUDES += $(LOCAL_PATH) $(LOCAL_PATH)/$(KERNEL_DIR)/include
LOCAL_SRC_FILES := tools/i2cbusses.c tools/util.c
LOCAL_MODULE := i2c-tools
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES:=tools/i2cdetect.c
LOCAL_MODULE:=i2cdetect
LOCAL_CPPFLAGS += -DANDROID
LOCAL_SHARED_LIBRARIES:=libc
LOCAL_STATIC_LIBRARIES := i2c-tools
LOCAL_C_INCLUDES += $(LOCAL_PATH) $(LOCAL_PATH)/$(KERNEL_DIR)/include
include $(BUILD_EXECUTABLE)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES:=tools/i2cget.c
LOCAL_MODULE:=i2cget
LOCAL_CPPFLAGS += -DANDROID
LOCAL_SHARED_LIBRARIES:=libc
LOCAL_STATIC_LIBRARIES := i2c-tools
LOCAL_C_INCLUDES += $(LOCAL_PATH) $(LOCAL_PATH)/$(KERNEL_DIR)/include
include $(BUILD_EXECUTABLE)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES:=tools/i2cset.c
LOCAL_MODULE:=i2cset
LOCAL_CPPFLAGS += -DANDROID
LOCAL_SHARED_LIBRARIES:=libc
LOCAL_STATIC_LIBRARIES := i2c-tools
LOCAL_C_INCLUDES += $(LOCAL_PATH) $(LOCAL_PATH)/$(KERNEL_DIR)/include
include $(BUILD_EXECUTABLE)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES:=tools/i2cdump.c
LOCAL_MODULE:=i2cdump
LOCAL_CPPFLAGS += -DANDROID
LOCAL_SHARED_LIBRARIES:=libc
LOCAL_STATIC_LIBRARIES := i2c-tools
LOCAL_C_INCLUDES += $(LOCAL_PATH) $(LOCAL_PATH)/$(KERNEL_DIR)/include
include $(BUILD_EXECUTABLE)
3、可以单独执行mmm mmm external/i2c-tools-3.0.0/进行编译, 会在out/xxx/system/bin/目录下生成 i2cdetect、i2cget 、i2cdump 、i2cset可执行文件。
4、也可以在编译系统的时候把该模块添加进来,在device/xxx/device.mk里面添加:
PRODUCT_PACKAGES += \
i2cdetect \
i2cget \
i2cdump \
i2cset
这样在整个系统编译的时候(比如make -j16)能够生成那几个可执行文件。
5、也可以用单独的arm编译器进行编译,Makefile文件如下,修改你的编译器路径。
# I2C tools for Linux
#
# Copyright (C) 2007 Jean Delvare <khali@linux-fr.org>
#
# Licensed under the GNU General Public License.
DESTDIR =
prefix = /usr/local
bindir = $(prefix)/bin
sbindir = $(prefix)/sbin
mandir = $(prefix)/share/man
man8dir = $(mandir)/man8
incdir = $(prefix)/include
INSTALL := install
INSTALL_DATA := $(INSTALL) -m 644
INSTALL_DIR := $(INSTALL) -m 755 -d
INSTALL_PROGRAM := $(INSTALL) -m 755
RM := rm -f
CROSS_COMPILE ?=~/xxxxxxxxxx/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc
#CC := gcc
CC := $(CROSS_COMPILE)
CFLAGS := -Wall
LDFLAGS+=-static
CFLAGS += -O2
# When debugging, use the following instead
#CFLAGS += -O -g
KERNELVERSION := $(shell uname -r)
.PHONY: all strip clean install uninstall
all:
include eeprom/Module.mk
include include/Module.mk
include tools/Module.mk
三、如何使用i2c-tools?
1、通过 adb push 之间将编译生成的4个文件复制到 Android 平台的 /system/bin 目录下,修改可以执行权限。
2、用i2cdetect检测系统上有几组i2c总线:
i2cdetect -l
3、用i2cdetect检测有哪些设备挂载在i2c_n总线上:
i2cdetect -r -y 0
i2cdetect -r -y 1
...
4、用i2cdump查看器件所有寄存器的值,这个很有用,输入 i2cdump -f -y 1 0x2b (查看总线1地址是0x20设备寄存器值)
5、用i2cset设置单个寄存器值,用i2cget读取单个寄存器值。
i2cset -f -y 1 0x2b 0x32 0x3f (设置i2c-1上0x2b器件的0x32寄存器值为0x3f)
PS:新版需要在后面加个b,例如:i2cset -f -y 4 0x48 0x10 0x01 b
i2cget -f -y 1 0x2b 0x32 (读取i2c-1上0x2b器件的0x32寄存器值)
五、注意用i2cdetect检测有哪些设备挂载在i2c_n总线上的时候,有的地方用i2cdetect -y 1,不带-r;而有的地方用 i2cdetect -r -y 1。
六、i2ctransfer 使用
6.1 i2ctransfer -f -y 0 w3@0x31 0x42 0x22 0x12
0:代表 IIC 的总线号
w:代表写
3:代表写 3 Byte
0x32:代表 IIC 设备地址
后边三个数据代表要写的数据
6.2 i2ctransfer -f -y 0 w1@0x3A 0x08 r3
从0x3A地址上偏移0x08之后读取3个Byte
6.3 i2ctransfer -f -y 0 w16@0x49 0x48 0xff-
代表的是从 0x49 地址上偏移0x48的地方写入 0xff,偏移 0x49 的地方写 0xfe...以此类推
6.4 实际操作