欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

[RK3399]移植工具i2c-tools

程序员文章站 2022-06-24 18:35:37
Platform: ROCKCHIPChip: RK3399OS: Android7.1.2Kernel: 4.4.126简介i2c-tools 是一款免费开源的工具,是linux系统下一款i2c调试利器,方便对i2c总线和i2c设备调试,i2ctools工具支持的功能包括:检测cpu i2c总线:一般用于cpu i2c总线驱动调试,但是一般情况下,cpu原厂已经提供i2c总线驱动,除非是原厂驱动开发,否则大多数驱动编写场景都是基于i2c总线驱动开发i2c设备驱动。检测i2c总线挂载的设备...

Platform: ROCKCHIP
Chip: RK3399
OS: Android7.1.2
Kernel: 4.4.126

简介

i2c-tools 是一款免费开源的工具,是linux系统下一款i2c调试利器,方便对i2c总线和i2c设备调试,i2ctools工具支持的功能包括:

  1. 检测cpu i2c总线:一般用于cpu i2c总线驱动调试,但是一般情况下,cpu原厂已经提供i2c总线驱动,除非是原厂驱动开发,否则大多数驱动编写场景都是基于i2c总线驱动开发i2c设备驱动。
  2. 检测i2c总线挂载的设备
  3. i2c设备读写访问
    检测硬件是否有误,驱动不正常时首先检测电路连接是否正常;实时检测状态寄存器;实时更改i2c设备配置,最终确定好配置信息后,再修改驱动程序;验证驱动的读写功能是否正确。

源码下载地址

https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/
选择要安装的版本
[RK3399]移植工具i2c-tools
根据自己linux系统已有的解压工具选择对应的压缩文件,这里我下载的是 “.gz”格式,方便解压。执行“tar -xvzf i2c-tools-4.1.tar.gz ”解压。

i2ctools移植到rk3399

1.将上一步下载下来的源码解压后,可看到该路径下的文件
[RK3399]移植工具i2c-tools
2.在 android 平台使用 i2c-tools,就需要进行交叉编译或者直接编译成可执行程序

方案一、修改 Makefile 进行交叉编译
修改Makefile,选择rk3399的交叉编译器,然后执行make编译

CC	?= arm-linux-gcc
AR	?= arm-linux-ar

编译完成, 在“tools”目录生成可执行文件i2cdetect、i2cdump、i2cget、i2cset、i2ctransfer;在“lib”目录生成“libi2c.so.0.1.1”动态库文件。将执行文件拷贝到rk3399板子任意目录,将库文件“libi2c.so.0.1.1”拷贝到rk3399板子“/lib”目录下。然后创建软链接:根据提示错误信息,i2ctools执行文件依赖“libi2c.so.0”文件,在板子上直接执行会提示加载库文件失败。通过编译后“lib”目录发现“libi2c.so.0”实际上为一个软链接文件,链接到“libi2c.so.0.1.1”
[RK3399]移植工具i2c-tools

ln -s libi2c.so.0.1.1 libi2c.so.0

Makefile方式 生成的文件类型不是arm的,在设备上不可执行故选用第二种方案
[RK3399]移植工具i2c-tools
[RK3399]移植工具i2c-tools

方案二、编译成可执行程序
(1) 将 i2c-tools 文件夹拷贝到安卓工程external目录下
(2) 在 i2c-tools 目录添加 Android.mk 编译文件
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 指令进行模块化编译,步骤如下

1.source build/envsetup.sh 
2.lunch rk3399_all-userdebug
3.mmm external/i2c-tools-4.2/

编译完成后会在out\target\product\rk3399_all\system\bin下生成可执行文件
[RK3399]移植工具i2c-tools
查看下文件类型
[RK3399]移植工具i2c-tools
(4) 通过 adb push 到 设备上即可
这里举例i2cdetect:

-将i2cdetect push到设备的/data/local/tmp下
[RK3399]移植工具i2c-tools

  • 设备端进入/data/local/tmp目录下,此时i2cdetect没有执行权限,只需chmod+x i2cdetect给其执行权限即可

[RK3399]移植工具i2c-tools
[RK3399]移植工具i2c-tools

命令使用语法

i2cdetect
[RK3399]移植工具i2c-tools

  • 查看板子i2c总线: ./i2cdetect -l
    [RK3399]移植工具i2c-tools

  • 查看i2c总线挂载的设备

 ./i2cdetect -r -y i2c-no
./i2cdetect -r -y 0	/* 查看i2c0挂载的设备 */

[RK3399]移植工具i2c-tools
i2c0上挂载了4个设备,地址分别是0x1b和0x40,0x41与0x51;
如果i2c设备驱动已经被系统加载,地址显示“UU”。

读取i2c设备所有寄存器值

 ./i2cdump -f -y i2c-no i2c-addr
./i2cdump -f -y 0 0x51	/* 读取i2c0上的0x51所有寄存器值 */

[RK3399]移植工具i2c-tools
读取i2c设备指定寄存器

./i2cget -f -y i2c-no i2c-addr reg
读取i2c0上的i2c-addr的芯片reg寄存器

写i2c设备指定寄存器

./i2ctransfer -f -y i2c-no w-num@i2c-addr data-0 data-1 data-2	

读取i2c设备多个字节数据

./i2ctransfer -f -y i2c-no w-num@i2c-addr data-0 data-1 data-n r-num	

写i2c设备多个字节数据

./i2ctransfer -f -y i2c-no w-num@i2c-addr data-0 data-1 data-2

本文地址:https://blog.csdn.net/m0_38022615/article/details/110229742