i2c-tools移植

Posted 四季帆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了i2c-tools移植相关的知识,希望对你有一定的参考价值。

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文件

 将i2c-tools源码拷贝到Android源码externel目录下,然后创建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固定格式的定义,万万不可修改,否则后患无穷!!! 

 

以上是关于i2c-tools移植的主要内容,如果未能解决你的问题,请参考以下文章

Linux I2C总线驱动调试之i2c-tools工具使用

i2c-tools测试工具

卡住了从活动到片段的移植

如何使用片段反向移植?

无需编写驱动直接访问设备\_I2C-Tools介绍

Android 平台下使用 i2c-tools