Android i2c-tools

RK3568 SDK Android-11 i2c-tools移植

前言:

RK3568 安卓项目开发,需要移植第三方开源库到固件里面,文档里有描述:

也就拿i2c-tools来实践一下。

一、下载I2C-tools工具:

最近在移植i2c-tools工具,下载地址:https://i2c.wiki.kernel.org/index.php/I2C_Tools

将git下载到external目录下:

cd ~/rk3568_android_11_sdk/external
git clone git://git.kernel.org/pub/scm/utils/i2c-tools/i2c-tools.git

二、编写Android.mk

网上[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)

三、编译安装:

cd i2c-tools
mma

四、出错处理

在RK3568 安卓11 的SDK 实践出现报错:

[100% 277/277] writing build rules ...
FAILED: 
build/make/core/base_rules.mk:492: error: overriding commands for target `out/target/product/rk3568_r/system/bin/i2cdetect', previously defined at build/make/core/base_rules.mk:516
13:53:35 ckati failed with: exit status 1

#### failed to build some targets (38 seconds) ####

d3@d3-X99:~/rk3568_android_11_sdk/external/i2c-tools$ 

根据参考[1]里的链接找到参考[2],使用参考[2]的Andriod.mk编译还是出现类似报错。

然后就找到[3],[4]学习研究了Android.mk的用法

最终解决:加参数LOCAL_MODULE_PATH

LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)
#LOCAL_MODULE_PATH := $(TARGET_OUT)  
#LOCAL_MODULE_PATH := $(TARGET_OUT_DATA)  

在android.mk中,可以指定最后目标安装路径,使用以下两个宏来指定:

LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)  

不同文件系统使用以下宏来进行选择:

  • TARGET_ROOT_OUT:根文件系统,路径为:out/target/product/xxxx/root
  • TARGET_OUT:表示system文件系统,路径为:out/target/product/xxxx/system
  • TARGET_OUT_DATA:表示data文件系统,路径为:out/target/product/xxxx/data

最终修改后的Android.mk,并添加了libi2c-tools.so的生成

ifneq ($(TARGET_SIMULATOR),true)

LOCAL_PATH := $(call my-dir)

i2c_includes := $(LOCAL_PATH) $(LOCAL_PATH)/include

#libi2c-tools.so
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 := libi2c-tools
include $(BUILD_SHARED_LIBRARY)

# i2cdetect
include $(CLEAR_VARS)

LOCAL_SRC_FILES := \
	tools/i2cdetect.c \
	tools/i2cbusses.c \
	lib/smbus.c

LOCAL_C_INCLUDES := $(i2c_includes)
LOCAL_MODULE := i2cdetect
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_PATH := $(TARGET_OUT) 
include $(BUILD_EXECUTABLE)

# i2cdump
include $(CLEAR_VARS)

LOCAL_SRC_FILES := \
	tools/i2cdump.c \
	tools/i2cbusses.c \
	tools/util.c \
	lib/smbus.c

LOCAL_C_INCLUDES := $(i2c_includes)
LOCAL_MODULE := i2cdump
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_PATH := $(TARGET_OUT) 
include $(BUILD_EXECUTABLE)

# i2cset
include $(CLEAR_VARS)

LOCAL_SRC_FILES := \
	tools/i2cset.c \
	tools/i2cbusses.c \
	tools/util.c  \
	lib/smbus.c

LOCAL_C_INCLUDES := $(i2c_includes)
LOCAL_MODULE := i2cset
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_PATH := $(TARGET_OUT) 
include $(BUILD_EXECUTABLE)

# i2cget
include $(CLEAR_VARS)

LOCAL_SRC_FILES := \
	tools/i2cget.c \
	tools/i2cbusses.c \
	tools/util.c \
	lib/smbus.c

LOCAL_C_INCLUDES := $(i2c_includes)
LOCAL_MODULE := i2cget
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_PATH := $(TARGET_OUT) 
include $(BUILD_EXECUTABLE)

endif

五、验证结果

在~/rk3568_android_11_sdk/external/i2c-tools下mma编译后的结果:



总结:主要学习理解安卓工程管理与构建系统,学习运用Android.mk,其实Android.mk安卓旧的方法管理,新的使用Android.bp(Blueprint)管理构建,还需持续学习!


参考:

[1] Android i2c-tools移植-腾讯云开发者社区-腾讯云 - https://cloud.tencent.com/developer/article/1054059?areaId=106001

[2] android-i2c-tools/Android.mk at master · edaplayer/android-i2c-tools · GitHub - https://github.com/edaplayer/android-i2c-tools/blob/master/Android.mk

[3] Android.mk 详解 - yooooooo - 博客园 - https://www.cnblogs.com/linhaostudy/p/8934735.html

[4] Android.mk - maxiongying - 博客园 - https://www.cnblogs.com/senior-engineer/p/4848842.html

END!

posted @ 2024-04-12 17:48  Yaction  阅读(382)  评论(0)    收藏  举报