HAL层概述
名称: HAL, Hardware Abstracting Layer,中文名字:硬件抽象层。
作用:对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节。向上衔接Android Runtime和Framework,向下衔接驱动程序
产生原因:利益,竞争
Android代码结构中,HAL层的内容主要集中在Hardware目录中,结合之前讲解Camera模块的时候提到的
system/lib/hw/camera.$(TARGET_BOARD_PLATFORM).so
HAL层的内容集成在动态库中,然后CameraService通过这个So访问其中的内容。
如何访问
void CameraService::onFirstRef()
hw_get_module(CAMERA_HARDWARE_MODULE_ID, (const hw_module_t **)&rawModule)
每一个独立的HAL层的so,有一个与其对应的Id
#define CAMERA_HARDWARE_MODULE_ID “camera”
定义在hardware/libhardware/include/hardware/camera_common.h
又或者
system/lib/hw/audio.primary.$(TARGET_BOARD_PLATFORM)
frameworks/av/services/audioflinger/AudioFlinger.cpp
rc = hw_get_module_by_class(AUDIO_HARDWARE_MODULE_ID, if_name, &mod);
#define AUDIO_HARDWARE_MODULE_ID “audio”
定义在
hardware/libhardware/include/hardware/audio.h
当然这里只是举个例子,Audio需要加载的模块不止这一个。
基本上每一个模块对应一个So,命名方式也是比较相似,xxx.$(TARGET_BOARD_PLATFORM),存放路径
system/lib/hw
system/lib64/hw
hw_get_module ->hw_get_module_by_class
定义在hardware/libhardware/include/hardware/hardware.h
实现在hardware/libhardware/hardware.c
1 | int hw_get_module(const char *id, const struct hw_module_t **module) |
再看看hw_module_exists这个方法
1 | static int hw_module_exists(char *path, size_t path_len, const char *name, |
以audio其中的一个so为例,在源码中找一个芯片平台高通msm8974
system/lib/hw/audio.primary.msm8974.so
顺着以上的代码很好理解,当然这个msm8974必然是可以用过循环的那几个配置项其中的一个获取,否则就是
system/lib/hw/audio.promary.default.so
如何加载
以上代码跳转到found之后
return load(class_id, path, module);
1 | static int load(const char *id, |
最后上层拿到的就是hw_module_t * 然后通过这个入口操作库中的内容,并且每一个HAL模块在定义自己的结构的时候也是需要按照一定的规范来执行。这个留着明天再写吧……