Android HAL 分析
2010-05-26 06:40:00 来源:WEB开发网sLedDevice->set_off(sLedDevice, led);
7 HAL stub编写方法
(1)定义自己的HAL结构体,编写头文件led.h, hardware/hardware.h
struct led_module_t {
struct hw_module_t common;
};
struct led_control_device_t {
struct hw_device_t common;
int fd; /* file descriptor of LED device */
/* supporting control APIs go here */
int (*set_on)(struct led_control_device_t *dev, int32_t led);
int (*set_off)(struct led_control_device_t *dev, int32_t led);
};
继承关系如下图:
图5:HAL stub与HAL module继承关系
(2)设计led.c 完成功能实现和HAL stub注册
(2.1)led_module_methods继承hw_module_methods_t,实现open的callback
struct hw_module_methods_t led_module_methods = {
open: led_device_open
};
(2.2)用HAL_MODULE_INFO_SYM实例led_module_t,这个名称不可修改
tag:需要制定为 HARDWARE_MODULE_TAG
id:指定为 HAL Stub 的 module ID
methods:struct hw_module_methods_t,为 HAL 所定义的「method」
const struct led_module_t HAL_MODULE_INFO_SYM = {
common: {
tag: HARDWARE_MODULE_TAG,
version_major: 1,
version_minor: 0,
id: LED_HARDWARE_MODULE_ID,
name: "Sample LED Stub",
author: "The Mokoid Open Source Project",
methods: &led_module_methods,
}
/* supporting APIs go here. */
};
(2.3)open是一个必须实现的callback API,负责申请结构体空间,填充信息,注册具体操作API接口,打开Linux驱动。
由于存在多重继承关系,只需对子结构体hw_device_t对象申请空间即可。
int led_device_open(const struct hw_module_t* module, const char* name,
更多精彩
赞助商链接