Android Graphic HAL&Driver(一)

来源:互联网 发布:js主动触发微信分享 编辑:程序博客网 时间:2024/06/08 15:50

Android Graphic HAL&Driver(一)

工作很久,一直不怎么写博客,今天开始准备写写博客,坚持一下把过去所学的东西积累一下。学而不思则罔,思而不学则殆。一直加班解解bug,发现自己变得越来越笨。一直是做Driver的,最近准备把Android Graphic的HAL&Driver串一串。

一、Android架构概述

就跟以前毕业论文一致,写东西肯定先得写一个系概述了,
根据官方给的图片Android主要分成了Android Application Framework,Binder IPC,System service,HAL,Linux kernel这五层。本文主要集中的是HAL层和Linux kernel,等HAL层和Linux kernel整理完了会继续看看graphic相关的service和Application Framework。

二、Android HAL概述

HAL(硬件抽象层)是Google定义的一个标准的接口给硬件供应商实现,允许Android系统忽略低级别的驱动程序实现,所以HAL层一般是由IC原厂设计实现,并且会被封装成模块文件(.so),并会由Android系统适时地加载。

2.1 标准HAL层结构

HAL接口包含了两个通用的组件:一个模块和一个设备。位于hardware/libhardware/include/hardware/hardware.h,统一定义的接口能让Android系统以一致的方式加载HAL模块。

2.1.1 HAL模块

模块表示被封装且被存储为共享库的HAL实现。hardware/libhardware/include/hardware/hardware.h 标头文件会定义一个表示模块的结构体 (hw_module_t),其中包含模块的版本、名称和作者等元数据。Android 会根据这些元数据来找到并正确加载 HAL 模块。另外,hw_module_t 结构体还包含指向另一个结构体 hw_module_methods_t 的指针,后面这个结构体会包含一个指向相应模块的 open 函数的指针。此 open 函数用于与相关硬件(此 HAL 是其抽象形式)建立通信。每个特定于硬件的 HAL 通常都会使用附加信息为该特定硬件扩展通用的 hw_module_t 结构体。例如,在相机 HAL 中,camera_module_t 结构体会包含一个 hw_module_t 结构体以及其他特定于相机的函数指针:
typedef struct camera_module {hw_module_t common;int (*get_number_of_cameras)(void);int (*get_camera_info)(int camera_id, struct camera_info *info);} camera_module_t;
实现 HAL 并创建模块结构体时,您必须将其命名为 HAL_MODULE_INFO_SYM。以下是 Nexus 9 音频 HAL 的示例:
struct audio_module HAL_MODULE_INFO_SYM = {.common = {.tag = HARDWARE_MODULE_TAG,.module_api_version = AUDIO_MODULE_API_VERSION_0_1,.hal_api_version = HARDWARE_HAL_API_VERSION,.id = AUDIO_HARDWARE_MODULE_ID,.name = "NVIDIA Tegra Audio HAL",.author = "The Android Open Source Project",.methods = &hal_module_methods,},};

2.1.2 HAL设备

设备是产品硬件的抽象表示。例如,一个音频模块可能包含主音频设备、USB 音频设备或蓝牙 A2DP 音频设备。设备由 hw_device_t 结构体表示。与模块类似,
每类设备都定义了一个通用 hw_device_t 的详细版本,其中包含指向硬件特定功能的函数指针。例如,audio_hw_device_t 结构体类型会包含指向音频设备操作的函数指针:
struct audio_hw_device {    struct hw_device_t common;    /**     * used by audio flinger to enumerate what devices are supported by     * each audio_hw_device implementation.     *     * Return value is a bitmask of 1 or more values of audio_devices_t     */    uint32_t (*get_supported_devices)(const struct audio_hw_device *dev);  ...};typedef struct audio_hw_device audio_hw_device_t;
除了这些标准属性之外,每个特定于硬件的 HAL 接口都可以定义更多的自有功能和要求。有关详情,请参阅 HAL 参考文档以及各 HAL 的单独说明。

2.1.3 HAL模块编译

HAL 实现会内置在模块 (.so) 文件中,并由 Android 适时地动态链接。您可以为每个 HAL 实现创建 Android.mk 文件并指向源文件,从而编译模块。一般来说,
您的共享库必须以特定格式命名,以方便找到并正确加载。各模块的命名方案略有不同,但它们都遵循以下通用模式:<module_type>.<device_name>。
要详细了解如何为每个 HAL 设置模块编译,请参阅本网站“移植”部分中特定于 HAL 的文档。

原创粉丝点击