调试i2c设备时大家肯定会遇到i2c读写的问题,如何读取某个设备指定的寄存器?如何把值写入到该寄存器?想必这些很多人都会遇到。android本身没有这样的工具,所以只能自己写或者使用其他开源的codes。i2c-tools-3.1.0是在网上找到的一个相当合适的工具,所以我们可以好好利用,好的工具可以让我们开发事半工倍。
其它就不用多说了,进入主题吧!
i2c-tools-3.1.0代码很容易获取,网上一搜一大把。下面是code的结构,这里我主要分析tools这一块。
1:在tools目录下创建Android.mk文件,用于编译用。配好android环境后,使用mmm来编译i2c-tools,最后在out目录下system/bin生成i2cdetect、i2cset、i2cget、i2cdump。
LOCAL_PATH:= $(call my-dir)
# HAL module implemenation, not prelinked and stored in
# hw/<COPYPIX_HARDWARE_MODULE_ID>.<ro.board.platform>.so
include $(CLEAR_VARS)
LOCAL_SRC_FILES := i2cdetect.c i2cbusses.c
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE_TAGS := optional
LOCAL_SHARED_LIBRARIES := liblog
LOCAL_MODULE := i2cdetect
include $(BUILD_EXECUTABLE)
########################################################################
include $(CLEAR_VARS)
LOCAL_SRC_FILES := i2cget.c i2cbusses.c util.c
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE_TAGS := optional
LOCAL_SHARED_LIBRARIES := liblog
LOCAL_MODULE := i2cget
include $(BUILD_EXECUTABLE)
########################################################################
include $(CLEAR_VARS)
LOCAL_SRC_FILES := i2cset.c i2cbusses.c util.c
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE_TAGS := optional
LOCAL_SHARED_LIBRARIES := liblog
LOCAL_MODULE := i2cset
include $(BUILD_EXECUTABLE)
########################################################################
include $(CLEAR_VARS)
LOCAL_SRC_FILES := i2cdump.c i2cbusses.c util.c
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE_TAGS := optional
LOCAL_SHARED_LIBRARIES := liblog
LOCAL_MODULE := i2cdump
include $(BUILD_EXECUTABLE)
2:i2cdetect分析
在终端输入i2cdetect显示帮助信息
#i2cdetect -l,列出系统可用的I2CBUS
#i2cdetect -y -r 2,查看总线2挂在有哪些设备,可以从下面看出挂了0x34的设备
其中AXP20_ADDR定义为0x34,可以看出挂载的设备是PMU
3:i2cdump分析
# i2cdump -f -y 0 0x21
查看总线0上地址为0x21设备(GC0309)上的寄存器值,可以看出寄存器0上的值为0xa0,它表示该设备的Chip_ID
4:i2cget分析
# i2cget -f -y 0 0x21 0
读取总线0地址为0x21寄存器为0的值
5:i2cset分析
# i2cset -f -y 0 0x21 0x2e 1
将总线0地址为0x21的寄存器0x2e写入1,从数据手册看的出来0x2e是用来调试的,写入1的话出现彩条图像,出来的效果如图。