初探HAL层:

一、HAL层的前世今生
二、HAL层的通用结构剖析
三、一个例子
四、击破Audio HAL Module
五、小的总结
一、HAL层的前世今生

HAL(Hardware Abstraction Layer),硬件抽象层。由于部分硬件厂商不想把自己的核心代码公开,如果把代码放在内核空间里就需要遵循GUN License,会损害厂家的利益。所以,Google为了响应厂家在Android的架构里提出HAL的概念,把对硬件的支持分为用户空间和内核空间,而HAL层就属于这里面的用户空间,该部分代码遵循Apache License,所以厂家可以把核心的代码实现在HAL层,无需对外开放源代码。

HAL层的新旧架构

上层通过jni直接调用so库,在so库中实现底层驱动的操作(Module)

上层查找已经注册的Stub,返回硬件对象的操作接口,后续直接通过接口操作硬件(ModuleStub)

二、HAL层的通用结构剖析

通用的321架构 
HAL层的主要框架是由三个结构体,两个常量,一个函数构成,所有的硬件抽象模块都是必须遵循321架构,在此基础上扩展自有的功能。 
三个结构体
//文件位置:hardware/libhardware/include/hardware/hardware.h
/**
 * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM
 * and the fields of this data structure must begin with hw_module_t
 * followed by module specific information.
 */
typedef struct hw_module_t {
    /** tag must be initialized to HARDWARE_MODULE_TAG */
    uint32_t tag;
......
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;

/**
 * Every device data structure must begin with hw_device_t
 * followed by module specific public methods and attributes.
 */
typedef struct hw_device_t {
    /** tag must be initialized to HARDWARE_DEVICE_TAG */
    uint32_t tag;
......
hw_module_methods_t是封装在hw_module_t里的,里面提供的一个open方法需要具体的实现模块去重载;hw_module_t里面有很多关于模块的信息需要在初始化的时候去填充,非常关键的一个就是重载hw_module_methods_t中的open函数;hw_device_t里主要是和硬件设备相关的一些操作,各硬件模块需要继承该结构体。 
- 两个常量和一个函数
--------------------- 
作者:冇二哥 
来源:CSDN 
原文:https://blog.csdn.net/flappy_boy/article/details/81150290 
版权声明:本文为博主原创文章,转载请附上博文链接!

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐