[Android] i2c-toos 在 Android 上使用


CPU:RK3399

系統:Android 7.1

 

i2c-tools 是一款免費開源的工具,可以檢測 i2c 總線上的設備,可以讀寫寄存器等等

可以從下面路徑下載需要的版本:

https://www.kernel.org/pub/software/utils/i2c-tools/

如果系統安裝了 git,也可以使用 git 下載:

git clone git://git.kernel.org/pub/scm/utils/i2c‐tools/i2c‐tools.git

 

在 android 平台使用 i2c-tools,就需要進行交叉編譯或者直接編譯成可執行程序

1、修改 Makefile 進行交叉編譯

 暫時沒有使用這種方式

2、編譯成可執行程序

(1) 將 i2c-tools 文件夾拷貝到安卓任意目錄

(2) 在 i2c-tools 目錄添加 Android.mk 編譯文件

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)

(3) 使用 mmm 指令進行模塊化編譯,編譯后會在 tools 目錄下生成 5 個可執行程序

i2cdetect     i2cdump     i2cget     i2cset     i2ctransfer

(4) 通過 adb 將生成的文件 push 到 /system/bin 目錄下即可

 

指令使用方法:

i2cdetect:

Usage: i2cdetect [-y] [-a] [-q|-r] I2CBUS [FIRST LAST]
       i2cdetect -F I2CBUS
       i2cdetect -l
  I2CBUS is an integer or an I2C bus name
  If provided, FIRST and LAST limit the probing range.

-V:輸出當前版本號

# i2cdetect -V

-y:指令執行自動 yes,否則會提示確認執行Continue? [Y/n] Y

-a:輸出總線上所有地址(00-7f),沒有 -a,只顯示 08-77,UU 表示該設備在驅動中已使用

// 輸出 i2c0 總線上所有設備
# i2cdetect -y -a 0
# i2cdetect -y 0 // 輸出 i2c0 總線上地址從 0x10-0x55 之間的設備 # i2cdetect -y 0 0x10 0x55

-q:快速寫指令,-q 和 -r 不能同時使用

-r:讀指令,-q 和 -r 不能同時使用

I2CBUS:i2c 總線編號

-F:此 i2c 支持的功能

// i2c0 支持的功能
# i2cdetect -F 0

-l:輸出所有 i2c 總線

# i2cdetect -l

 

i2cdump:

Usage: i2cdump [-f] [-y] [-r first-last] [-a] I2CBUS ADDRESS [MODE [BANK [BANKREG]]]
  I2CBUS is an integer or an I2C bus name
  ADDRESS is an integer (0x08 - 0x77, or 0x00 - 0x7f if -a is given)
  MODE is one of:
    b (byte, default)
    w (word)
    W (word on even register addresses)
    s (SMBus block)
    i (I2C block)
    c (consecutive byte)
    Append p for SMBus PEC

-V:輸出當前版本號

# i2cdump -V

I2CBUS:i2c 總線編號

ADDRESS:設備地址,建議使用十六進制

-f:強制使用此設備地址,即使此設備地址已經被使用;若不添加此參數,地址可能寫失敗

-y:指令執行自動 yes,否則會提示確認執行Continue? [Y/n] Y

-r:讀取從 first-last 之間的寄存器值

// 讀取 i2c1 上設備地址為 0x10,從 0x50-0x70 之間的寄存器值
# i2cdump -f -y -r 0x50-0x7f 1 0x10

-a:暫時不知道什么含義

 

i2cget:

Usage: i2cget [-f] [-y] [-a] I2CBUS CHIP-ADDRESS [DATA-ADDRESS [MODE]]
  I2CBUS is an integer or an I2C bus name
  ADDRESS is an integer (0x08 - 0x77, or 0x00 - 0x7f if -a is given)
  MODE is one of:
    b (read byte data, default)
    w (read word data)
    c (write byte/read byte)
    Append p for SMBus PEC

-V:輸出當前版本號

# i2cget -V

-f:強制使用此設備地址,即使此設備地址已經被使用;若不添加此參數,地址可能寫失敗

-y:指令執行自動 yes,否則會提示確認執行Continue? [Y/n] Y

// 讀取i2c1總線上設備地址為0x10,寄存器0x03的值
# i2cget -f -y 1 0x10 0x03

-b:讀取長度是一個字節

-w:讀取長度是一個字 

 

i2cset:

Usage: i2cset [-f] [-y] [-m MASK] [-r] [-a] I2CBUS CHIP-ADDRESS DATA-ADDRESS [VALUE] ... [MODE]
  I2CBUS is an integer or an I2C bus name
  ADDRESS is an integer (0x08 - 0x77, or 0x00 - 0x7f if -a is given)
  MODE is one of:
    c (byte, no value)
    b (byte data, default)
    w (word data)
    i (I2C block data)
    s (SMBus block data)
    Append p for SMBus PEC

-V:輸出當前版本號

# i2cget -V

-f:強制使用此設備地址,即使此設備地址已經被使用;若不添加此參數,地址可能寫失敗

-y:指令執行自動 yes,否則會提示確認執行Continue? [Y/n] Y

// 設置i2c1總線上設備地址為0x10,寄存器0x03的值為0x20
# i2cget -f -y 1 0x10 0x03 0x20

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM