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 驱动程序的步骤

  1. 编写linux驱动
  2. 编写HAL library
  3. 编写Service Library

实现的LED 驱动包含了 Linux 驱动 ,HAL 摸块、 Service 程序库、 NDK 程序和 Java 程序,所有的 HAL 程序都必须要有 HAL_MODULE_ INFO_SYM 变量

编写HAL模块步骤

  1. 定义结构体和宏
  2. 编写HAL模块的open函数
  3. 定义hw_module_methods_t结构体变量
  4. 定义HAL_MODULE_INFO_SYM变量
  5. 编写HAL模块的close函数
  6. 编写控制LED的函数
posted on 2016-06-25 21:29  2101648015piO  阅读(93)  评论(0编辑  收藏  举报