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. 1. 解压 tar -xvf i2c-tools-3.1.1.tar.bz2
  2. 2. 解压后修改Makefile
  3. CC =arm-linux-gnueabihf-gcc
  4. LDFLAGS += -static
  5. 3. make成功后会在tools目录下生成 i2cdetect i2cdump i2cget i2cset等工具
  6. 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,内容如下:


  
  
  1. LOCAL_PATH:= $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_MODULE_TAGS := optional
  4. LOCAL_C_INCLUDES += $(LOCAL_PATH) $(LOCAL_PATH)/ $(KERNEL_DIR)/ include
  5. LOCAL_SRC_FILES := tools/i2cbusses.c tools/util.c
  6. LOCAL_MODULE := i2c-tools
  7. include $(BUILD_STATIC_LIBRARY)
  8. include $(CLEAR_VARS)
  9. LOCAL_MODULE_TAGS := optional
  10. LOCAL_SRC_FILES:=tools/i2cdetect.c
  11. LOCAL_MODULE:=i2cdetect
  12. LOCAL_CPPFLAGS += -DANDROID
  13. LOCAL_SHARED_LIBRARIES:=libc
  14. LOCAL_STATIC_LIBRARIES := i2c-tools
  15. LOCAL_C_INCLUDES += $(LOCAL_PATH) $(LOCAL_PATH)/ $(KERNEL_DIR)/ include
  16. include $(BUILD_EXECUTABLE)
  17. include $(CLEAR_VARS)
  18. LOCAL_MODULE_TAGS := optional
  19. LOCAL_SRC_FILES:=tools/i2cget.c
  20. LOCAL_MODULE:=i2cget
  21. LOCAL_CPPFLAGS += -DANDROID
  22. LOCAL_SHARED_LIBRARIES:=libc
  23. LOCAL_STATIC_LIBRARIES := i2c-tools
  24. LOCAL_C_INCLUDES += $(LOCAL_PATH) $(LOCAL_PATH)/ $(KERNEL_DIR)/ include
  25. include $(BUILD_EXECUTABLE)
  26. include $(CLEAR_VARS)
  27. LOCAL_MODULE_TAGS := optional
  28. LOCAL_SRC_FILES:=tools/i2cset.c
  29. LOCAL_MODULE:=i2cset
  30. LOCAL_CPPFLAGS += -DANDROID
  31. LOCAL_SHARED_LIBRARIES:=libc
  32. LOCAL_STATIC_LIBRARIES := i2c-tools
  33. LOCAL_C_INCLUDES += $(LOCAL_PATH) $(LOCAL_PATH)/ $(KERNEL_DIR)/ include
  34. include $(BUILD_EXECUTABLE)
  35. include $(CLEAR_VARS)
  36. LOCAL_MODULE_TAGS := optional
  37. LOCAL_SRC_FILES:=tools/i2cdump.c
  38. LOCAL_MODULE:=i2cdump
  39. LOCAL_CPPFLAGS += -DANDROID
  40. LOCAL_SHARED_LIBRARIES:=libc
  41. LOCAL_STATIC_LIBRARIES := i2c-tools
  42. LOCAL_C_INCLUDES += $(LOCAL_PATH) $(LOCAL_PATH)/ $(KERNEL_DIR)/ include
  43. 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. 1. 查看设备拥有I2C总线列表
  2. i2cdetect -l
  3. 2. 检测I2C总线7上挂载的设备(I2C 设备的位置显示为UU或者表示设备地址的数值,UU表示该设备在 driver 中被使用)
  4. i2cdetect-r -y 7
  5. 3. 检测I2C总线7的0x50地址上挂在的设备的所有寄存器的值
  6. i2cdump -f -y 7 0x50
  7. 4. 设置挂载在I2C总线7的0x50地址上的设备的0x00寄存器的值为0xff
  8. i2cset -f -y 7 0x50 0x00 0xff
  9. 5. 获取挂载在I2C总线7的0x50地址上的设备的0x00寄存器的值
  10. i2cget -f -y 7 0x50 0x00
  11. 千万注意,这里只可以用于示意来阐述如何设置寄存器的值,但是在TX2实际使用时,第7路,0x50实际上是EEPROM固定格式的定义,万万不可修改,否则后患无穷!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值