编写android HAL举例: lights(2009-11-30 11:27:27)
分类:Android |
Android HAL层主要在hardware目录下,其中hardware/libhardware/下是同一用模块的概念来加载HAL的.so库。 这里以背光lights为例:
HAL模块要以MODULE_ID.platform.so的名字存放在文件系统的/system/lib/hw/下面。
看一下/hardware/libhardware/include/hardware/lights.h
我们要实现的lights主要是要实现下面这个接口:
struct light_device_t {
struct hw_device_t common;
int (*set_light)(struct light_device_t* dev,
struct light_state_t const* state);
};
1. 在hardware目录下创建我们的hal目录 hardware/myhal/liblights/
2. 编写Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := lights.c
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
LOCAL_SHARED_LIBRARIES := liblog
LOCAL_MODULE := lights.default
include $(BUILD_SHARED_LIBRARY)
3.编写lights.c
每个模块都要定义自己的hw_module_t结构:
const struct hw_module_t HAL_MODULE_INFO_SYM = {
.tag = HARDWARE_MODULE_TAG,
.version_major = 1,
.version_minor = 0,
.id = LIGHTS_HARDWARE_MODULE_ID,
.name = "myhal lights Module",
.author = "Google, Inc.",
.methods = &lights_module_methods,
};
模块方法:就一个open函数
static struct hw_module_methods_t lights_module_methods = {
.open = open_lights,
};
上层用这个函数打开一个lights设备的实例。
static int open_lights(const struct hw_module_t* module, char const* name,
struct hw_device_t** device)
{
int (*set_light)(struct light_device_t* dev,
struct light_state_t const* state);
set_light = set_light_backlight;
struct light_device_t *dev = malloc(sizeof(struct light_device_t));
memset(dev, 0, sizeof(*dev));
dev->common.tag = HARDWARE_DEVICE_TAG;
dev->common.version = 0;
dev->common.module = (struct hw_module_t*)module;
dev->common.close = (int (*)(struct hw_device_t*))close_lights;
dev->set_light = set_light;
*device = (struct hw_device_t*)dev;
return 0;
}
这里的light_device_t就是在lights.h里定义的lights设备结构。主要是里面的set_light回调函数。
最后实现自己的写背光函数,在这里面操作自己背光设备,如"/sys/class/leds/red/brightness"
static int set_light_backlight(struct light_device_t* dev,
struct light_state_t const* state)
{
return 0;
}
3. 编译make后在system/lib/hw/下生成lights.default.so
android会自动加载这个模块来设背光