1. 背景
在嵌入式设备中,绝大部分传感器芯片都是挂在 i2c 上,通过 i2c 和 SOC 进行通信和控制,譬如adv7180、max9288等摄像头处理芯片,那么在调试这些芯片的驱动时,经常需要读写该芯片的各个寄存器的值,如果通过打印的方式将非常麻烦(需要不停的加打印和编译kernel),其实Linux kernel官网有提供一个 i2c 读写的应用程序工具,今天就来移植一下子!
其实小编一开始也不知道还有这么一个现成的 i2c 工具,小编也是自己通过在驱动代码中添加 IOCTL 命令码,对 i2c_read()和i2c_write()两个函数进行再封装,然后写个应用程序,通过 IOCTL 来间接读写 i2c 设备的寄存器,花了两三天的时间,总算是勉强可以用了,小编还激动了一会儿,觉得自己真棒,结果一位老师傅看了我的成果之后说,有一个 i2c 工具可以实现读写i2c设备,移植一下就好了。我·····裂了,Linux牛逼!
2. 下载地址
https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/
3. 移植到Linux设备
-
1. 解压 tar -xvf i2c-tools-3.1.1.tar.bz2
-
2. 解压后修改Makefile
-
CC =arm-linux-gnueabihf-gcc
-
LDFLAGS += -static
-
3. make成功后会在tools目录下生成 i2cdetect i2cdump i2cget i2cset等工具
-
4. 将tools目录下文件拷贝到Linux设备的/usr/bin/目录下
4. 移植到Android设备
4.1 创建Android.mk文件
将external/i2c-tools-3.1.1/源码拷贝到Android源码externel目录下,然后在external/i2c-tools-3.1.1/目录下创建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.2 编译
执行命令:mmm external/i2c-tools-3.1.1/
4.3 输出
在目录out/target/product/项目名称/system/bin下会生成四个i2c工具,分别为i2cdetect、i2cdump、i2cget和i2cset。
5. 使用方法
-
1. 查看设备拥有I2C总线列表
-
i2cdetect -l
-
-
2. 检测I2C总线7上挂载的设备(I2C 设备的位置显示为UU或者表示设备地址的数值,UU表示该设备在 driver 中被使用)
-
i2cdetect-r -y 7
-
-
3. 检测I2C总线7的0x50地址上挂在的设备的所有寄存器的值
-
i2cdump -f -y 7 0x50
-
-
4. 设置挂载在I2C总线7的0x50地址上的设备的0x00寄存器的值为0xff
-
i2cset -f -y 7 0x50 0x00 0xff
-
-
5. 获取挂载在I2C总线7的0x50地址上的设备的0x00寄存器的值
-
i2cget -f -y 7 0x50 0x00
-
-
千万注意,这里只可以用于示意来阐述如何设置寄存器的值,但是在TX2实际使用时,第7路,0x50实际上是EEPROM固定格式的定义,万万不可修改,否则后患无穷!!!