编写android HAL举例: lights

来源:互联网 发布:linux挂载ntfs硬盘 编辑:程序博客网 时间:2024/06/06 12:29
androidHAL层主要在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 structhw_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 structhw_module_methods_t lights_module_methods = {
   .open = open_lights,
};
上层用这个函数打开一个lights设备的实例。
static intopen_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(structlight_device_t));
   memset(dev, 0, sizeof(*dev));
   dev->common.tag =HARDWARE_DEVICE_TAG;
   dev->common.version =0;
   dev->common.module = (structhw_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"
staticint 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会自动加载这个模块来设背光
0 0
原创粉丝点击