当前位置:操作系统 > 安卓/Android >>

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 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,