上一章学习了从C空间访问Linux内核驱动程序,这一章我们一起来学习如何在硬件抽象层中增加硬件模块来访问内核驱动程序。本章还是跟上一章一样,通过传统设备/dev/hello来连接硬件抽象层模块和内核驱动程序。
1.进入到/hardware/libhardware/include/hardware目录
新建hello.h
1 | #ifndef ANDROID_HELLO_INTERFACE_H |
这里定义了模块ID—hello,模块结构体,硬件接口结构体。
2.进入到hardware/libhardware/modules目录,新建hello目录
添加hello.c文件
1 | #define LOG_TAG "HelloStub" |
该程序主要实现了/dev/hello驱动的打开和关闭,信号量的读写操作。
3.编译环境配置:
在hello目录中创建Android.mk文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
LOCAL_SHARED_LIBRARIES := liblog
LOCAL_SRC_FILES := hello.c
LOCAL_MODULE := hello.default
include $(BUILD_SHARED_LIBRARY)
这里的LOCAL_MODULE用的不是hello,而是hello.default,这样的好处是能够保证我们的模块总能被硬件抽象层访问到。
4.编译:
mmm hardware/libhardware/modules/hello
编译目录:out/target/product/generic/system/lib/hw/hello.default.so
5.打包成system.image
make snod
这样我们在为自己的设备驱动增加了一个硬件抽象层模块,后面我们一起学习JNI方法调用硬件抽象层接口的操作。
注:代码程序主要参考《老罗的Android之旅》来完成。