調試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的話出現彩條圖像,出來的效果如圖。