HAL ( Hardware Abstraction Layer ,硬件抽象层,是建立在 Linux 驱动之上的一套程序库,传统的 linux系统中 Linux 驱动一般有两种类型的代码:访问硬件寄存器的代码和业务逻辑代码HAL 并不是 Linux 内核的 部分,而是位于Android的系统运行库。也就是说在 Linux驱动中不应该保留任何不想公开的业务逻辑代码 这些代码都放在 HAI 层中,而只保留与寄存器交互的代码,访问寄存器只有 Linux 内核的相关函数能做到。如果这样安排 Linpx 驱动就只剩下一个空壳了,唯 一的功能就是接收由 HA L传过来的数据,并将这些数据 写入指定的寄存器中,或从寄存器读取数据,并返回给 HA L。总而言之Google为Android加入HAL主要有如下目的:
硬件的调用接口。由 HAL 有标准的调用接口,所以可以利用 HA L屏蔽 Linux 驱动
复杂,不统一的调用接口。
解决了 GPL 版权问题。由于Linux 内核基于GPL协议,而 Android 基于 Apache Licence 2 .0协议.因 此Google 玩了个“穿越“将原本位于 Linux 驱动中的敏感代码向上移了一个层次,这样这些敏感代码就摆脱 GPL 协议的束缚, 那些不想开源的 Linux 驱动作者也就没必要开源了。
针对一些特殊的要求 对于有些硬件,可能需要访问一些用户空间的资源,或在内核空间不方便完成的工作以及特殊需求。在这种情况下,可以利用位于用户空间 HAL 代码来辅助 Linux驱动完成 些工作。
编写一款支持 HAL Linux 驱动程序的步骤
- 编写linux驱动
- 编写HAL library
- 编写Service Library
实现的LED 驱动包含了 Linux 驱动 ,HAL 摸块、 Service 程序库、 NDK 程序和 Java 程序,所有的 HAL 程序都必须要有 HAL_MODULE_ INFO_SYM 变量
编写HAL模块步骤
- 定义结构体和宏
- 编写HAL模块的open函数
- 定义hw_module_methods_t结构体变量
- 定义HAL_MODULE_INFO_SYM变量
- 编写HAL模块的close函数
- 编写控制LED的函数