Android HAL简析

2017-10-15  本文已影响70人  Jimmy2012

前言

Android HAL是Hardware Abstract Layer的缩写,顾名思义,就是硬件抽象层的意思,为什么要搞这么个东西呢,大概是以下原因吧:

Android HAL支持以下模块:


module和device概念

Android HAL定义了两个概念,一个概念是module,即代表上图中的一个模块,表示一个so库,在程序中用hw_module_t表示;一个概念是device,代表module内一个抽象的设备,可以有多个,不一定要对应实际的硬件,在程序中用hw_device_t表示。以上两个结构体只定义通用的接口,每个具体的模块会继承定义本模块自己的接口。以gralloc图像buffer管理模块为例,相关结构体定义如下:

可见gralloc定义了一个private_module_t类型的module,定义了一个framebuffer_device_t类型和一个alloc_device_t类型的两个device。

HAL调用流程

上层应用按如下方式调用HAL接口:

int hw_get_module(const char *id, const struct hw_module_t **module)

关键代码如下:

#define HAL_MODULE_INFO_SYM_AS_STR  "HMI"

struct hw_module_t *hmi = NULL;
handle = dlopen(path, RTLD_NOW);
/* Get the address of the struct hal_module_info. */
const char *sym = HAL_MODULE_INFO_SYM_AS_STR;
hmi = (struct hw_module_t *)dlsym(handle, sym);
hmi->dso = handle;

其中path根据平台配置和指定的id拼接出来的,最后的路径类似这样子的:

/system/lib64/hw/gralloc.msm8952.so
int (*open)(const struct hw_module_t* module, const char* id,
            struct hw_device_t** device);

open函数的实现是根据设备id加载指定的device信息,这个加载一般是分配一个对应的device结构体变量,然后填充相关的函数指针等信息,最后将该结构体返回。如果是gralloc模块,返回的device就是一个framebuffer_device_t或者alloc_device_t变量了。

HAL调用示例

以下是GraphicBufferAllocator和GraphicBufferMapper调用gralloc模块的示例代码。

GraphicBufferAllocator::GraphicBufferAllocator()
    : mAllocDev(0)
{
    hw_module_t const* module;
    int err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module);
    gralloc_open(module, &mAllocDev);
}

static inline int gralloc_open(const struct hw_module_t* module, 
        struct alloc_device_t** device) {
    return module->methods->open(module, 
            GRALLOC_HARDWARE_GPU0, (struct hw_device_t**)device);
}

status_t GraphicBufferAllocator::alloc(uint32_t width, uint32_t height,
        PixelFormat format, uint32_t usage, buffer_handle_t* handle,
        uint32_t* stride)
{
    err = mAllocDev->alloc(mAllocDev, static_cast<int>(width),
            static_cast<int>(height), format, static_cast<int>(usage), handle,
            &outStride);
    return err;
}
GraphicBufferMapper::GraphicBufferMapper()
    : mAllocMod(0)
{
    hw_module_t const* module;
    int err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module);
    mAllocMod = reinterpret_cast<gralloc_module_t const *>(module);
}

status_t GraphicBufferMapper::registerBuffer(buffer_handle_t handle)
{
    err = mAllocMod->registerBuffer(mAllocMod, handle);
    return err;
}
上一篇下一篇

猜你喜欢

热点阅读