Android HAL层实现与调用
AndroidHAL层实现与调用
1.HAL层实现
在这篇文章中我们讨论下HAL层代码的简单组成,以及jni是如何调用HAL层代码。文章尽量避免了一些无用信息,直接写有实际的东西。
在这里我用一个简单的HAL层代码(电子防眩目的hal代码)来开始我们的讲解。
在一个hal代码中主要的工作是实现一个名为HAL_MODULE_INFO_SYM的module实例,其结构定义为
[cpp]
<span xmlns="http://www.w3.org/1999/xhtml" style="">
struct lcd_reflect_module_t {
struct hw_module_t common;
};</span>
可以看到这个结构的名字是随意的,一般用(模块名_module_t)来表示,可以看到它只有一个成员变量hw_module_t,也就是说主要的工作就是填充这个hw_module_t这个结构了。
[cpp]
<span xmlns="http://www.w3.org/1999/xhtml" style=""><span xmlns="http://www.w3.org/1999/xhtml" style="">
const struct lcd_reflect_module_t HAL_MODULE_INFO_SYM = {
.common = {
.tag = HARDWARE_MODULE_TAG,
.version_major = 1,
.version_minor = 0,
.id = LCD_REFLECT_HARDWARE_MODULE_ID,
.name = "LCD Reflect",
.author = "Archermind Tech.",
.methods = &lcd_reflect_module_methods,
}
};
</span></span>
tag:需要指定为HARDWARE_MODULE_TAG,不能修改
id:指定为HALStub的moduleID,这里#defineLCD_REFLECT_HARDWARE_MODULE_ID "lcdreflect"
接下来就要实现另外一个重要的结构了---structhw_module_methods_t methods.
来看一下这个结构体的定义:
[cpp]
<span xmlns="http://www.w3.org/1999/xhtml" style=""><span xmlns="http://www.w3.org/1999/xhtml" style="">
typedef struct hw_module_methods_t {
/** Open a specific device */
int (*open)(const struct hw_module_t* module, const char* id,
struct hw_device_t** device);
} hw_module_methods_t;
</span></span>
可以看到其中只有一个open函数指针,作为module的callback。
前面我们已经接触了两个重要的结构体,hw_module_t和hw_module_methods_t,下面我们还需要来看一下hal层中第三个重要的结构体hw_device_t。
下面我们来看一下hw_module_methods_t中的open函数lcd_reflect_module_methods。
[cpp]
<span xmlns="http://www.w3.org/1999/xhtml" style=""><span xmlns="http://www.w3.org/1999/xhtml" style="">
static int
lcd_reflect_open(const struct hw_module_t *module,
const char *name, struct hw_device_t **device)
{
int status = -EINVAL;
LOGV("lcd_reflect_open\n");
if (!strcmp(name, LCD_REFLECT_HARDWARE)) {
struct lcd_reflect_device_t *dev;
dev = malloc(sizeof (*dev));
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 = lcd_reflect_close;
*device = &dev->common;
dev->get_level = &lcd_reflect_get_level;
dev->set_level = &lcd_reflect_set_level;
dev->get_state = &lcd_reflect_get_state;
dev->set_state = &lcd_reflect_set_state;
status = 0;
}
return status;
}</span></span>
可以看到hw_device_t作为open的形参传入open函数中,并且我们还发现了另外一个结构体structlcd_reflect_device_t*dev;这个结构是我们模块自己定义的,用于存放一些我们模块需要的操作,jni层中就是通过这个结构体来调用hal层中提供的接口的。看一下它的定义。
[cpp]
<span xmlns="http://www.w3.org/1999/xhtml" style=""><span xmlns="http://www.w3.org/1999/xhtml" style="">
struct lcd_reflect_device_t {
struct hw_device_t common;
/**
* Get the mxc_reflect state
*
* Returns: 0 on success, error code on failure
*/
int (*get_state)(struct lcd_reflect_device_t *dev,
int *stat);
/**
* Set the mxc_reflect state
*
* Returns: 0 on success, error code on failure
*/
int (*set_state)(struct lcd_reflect_device_t *dev,
int stat);
/**
* Get the mxc_reflect level
*
* Returns: 0 on success, error code on failure
*/
int (*get_level)(struct lcd_reflect_device_t *dev,
int *level);
/**
&nbs
补充:移动开发 , Android ,