天天看點

i2c-tools工具4、i2c-tools工具

4、i2c-tools工具

i2c-tools是嵌入式常用的I2C調試工具,主要包含4個工具,分别有i2cdetect、i2cdump、i2cget、i2cset

工具 作用
i2cdetect 列出I2C總線上的所有裝置
i2cdump 列出指定裝置的所有寄存器值
i2cget 列出指定寄存器的值
i2cset 寫入指定值到裝置的寄存器

安裝i2c-tools工具

i2c-tools在多個平台均可使用,列舉以下平台中的安裝步驟

Ubuntu

$ sudo apt-get install i2c-tools python-smbus
           

Buildroot

buildroot系統menuconfig中添加以下選項

BR2_PACKAGE_I2C_TOOLS=y
           

Android

  1. 下載下傳i2c-tools源碼

    下載下傳位址:https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/

  2. 拷貝解壓到Android源碼external目錄下
    $ cp i2c-tools-3.0.0.tar.gz external/
    $ cd external
    $ tar -zxvf i2c-tools-3.0.0.tar.gz 
               
  3. 添加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)
               
  4. 編譯i2c-tools
    $ source build/envsetup.sh
    $ lunch
    $ mm external/i2c-tools-3.0.0
               
  5. i2c-tools工具生成路徑
    $ ls out/target/product/rk3399/system/bin/
    	i2cdetect	i2cdump		i2cget		i2cset
               
  6. 拷貝生成工具到開發闆系統
    $ adb push i2cdetect /system/bin/
               

常用示例

擷取開發闆的I2C總線數

$ i2cdetect -l
    i2c-0	i2c       	rk3x-i2c                        	I2C adapter
    i2c-1	i2c       	rk3x-i2c                        	I2C adapter
    i2c-2	i2c       	rk3x-i2c                        	I2C adapter
    i2c-4	i2c       	rk3x-i2c                        	I2C adapter
    i2c-7	i2c       	rk3x-i2c                        	I2C adapter
    i2c-8	i2c       	rk3x-i2c                        	I2C adapter
    i2c-9	i2c       	DesignWare HDMI                 	I2C adapter
    i2c-10	i2c       	DP-AUX                          	I2C adapter
           
目前開發闆I2C總線有8條,可确定I2C總線是否注冊成功

讀取總線上的所有裝置

$ i2cdetect -r -y 0
         0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
    00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
    10: UU -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- 
    20: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    30: -- -- -- -- 34 -- -- -- -- -- -- -- -- -- -- -- 
    40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    70: -- -- -- -- -- -- -- -- 
           

I2C0總線上有0x10、0x20、0x1c、0x34四個裝置

UU代表目前裝置被驅動占用

34代表I2C裝置位址,并且該裝置沒有驅動程式

-y 表示同意

讀取所有寄存器值

$ i2cdump -f -y 0 0x20
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8    ????????????????
10: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8    ????????????????
20: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8    ????????????????
30: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8    ????????????????
40: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8    ????????????????
50: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8    ????????????????
60: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8    ????????????????
70: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8    ????????????????
80: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 00 e8 e8 e8 b8 e8    ??????????.?????
90: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8    ????????????????
a0: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8    ????????????????
b0: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8    ????????????????
c0: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8    ????????????????
d0: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8    ????????????????
e0: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8    ????????????????
f0: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8    ????????????????
           
-f 表示強制通路該裝置,否則會通路失敗

寫寄存器(SMBus協定)

向I2C0總線上的0x20裝置的0xff寄存器寫入0x01值

$ i2cset -f -y 0 0x20 0xff 0x01
           

讀寄存器(SMBus協定)

$ i2cget -f -y 0 0x20 0xff			//讀取一個位元組
	0x01

$ i2cget -f -y 0 0x20 0xff w		//讀取兩個位元組
	0x0101
           

讀寄存器(I2C協定)

$ i2ctransfer -f -y 0 0x20 0xff
           

讀寫I2C裝置

利用i2c-tools實作I2C裝置初始化、讀寫資料

// 探測I2C裝置
$ i2cdetect -r -y 8

// 初始化裝置
$ i2cset -f -y 8 0x4a 0x01 0x00
$ i2cset -f -y 8 0x4a 0x02 0x80

// 讀取資料
$ i2cget -f -y 8 0x4a 0x03 w