HAL编程(引用)

编写android HAL举例: lights(2009-11-30 11:27:27)

标签:it android linux 杂谈 

分类: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会自动加载这个模块来设背光

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值