HAL ( Hardware Abstraction Layer,硬件抽象层,〉是建立在 Linux 驱动之上的一套程序库。这套程序库并不属于 Linux 内核 而是属于 Linux 内核层之上的应用层。

1.为什么要在Android中加入HAL

(1)在传统的Linux系统中Linux驱动一般有两种类型的代码:访问硬件寄存器的代码和业务逻辑代码。对于访问硬件寄存器的代码,并么有什么秘密可言,因为这都是调用的Linux内核的标准函数进行的标准操作。而Linux驱动的业务逻辑部分对于有些企业或个人并不想将源代码公开。因而引出了HAL

(2)Google为Android加入HAL主要有以下目的:

1)统一硬件的调用接口。由于HAL有标准的调用接口,所以可以利用HAL屏蔽了Linux驱动复杂、不统一的接口;

2)解决了GPL协议;

3)针对一些特殊的要求。对于一些硬件,可能需要访问一些用户空间的资源,或在内核空间不方便完成的工作以及特殊需求。在这种情况下,可以利用位于空间的HAL代码来辅助Linux完成一些工作。

2.为LED驱动增加HAL

(1)编写一款支持 HAL的Linux 驱动程序的步骤

1)编写linux驱动

2)编写hal library

3)编写service library。

(2)颠覆 Linux 驱动的设计理念:精简 LED 驱动

基本原理是只从指定都存器读取或写入5个字节,第一个字节用于指定读写的动作以及寄存器类型,后4个字节是读写的实际的数据(因LED 驱动只涉及操作一个int 类型数据的寄存器,因此梗用4个字节来示一个 int 类型的数据〉。 在与 LED驱动交互时,只要向设备文件(/dev/s3c64IO led hal) 读取或发送5个字节的数据,就可以读写指定的寄存器.

3.编写HAL模块的步骤和原理如下:

    (1)定义结构体和宏;需要使用3个非常重要的结果提(hw_module_t、hw_device_t、hw_module_methods_t)

    (2)编写HAL模块的open函数;3项工作A初始化hw_device_t的子结构体B打开设备文件C初始化寄存器

     (3)定义hw_module_methods_t结构体变量;HAL模块需要hw_module_methods_t结构体的open函数指针变量指定open入口函数

    (4)定义HAL_MODULE_INFO_SYM变量;所有的HAL模块都必须有一个HAL_MODULE_INFO_SYM 变量。该变量一般为hw_module_t或其子结构体。

(5)编写HAL模块的close函数;当HAL模块被卸载后会调用close函数。

4.HAL模块本质上就是通过Linux共享库(.so)与Linux驱动交互,然后应用程序再访问Linux共享库与Linux驱动交互,然后应用程序再访问Linux共享库。每一个HAL共享库指定一个ID,再利用这个ID配合一定的规则找到Linux共享库。

posted on 2016-07-08 10:56  花糜海棠  阅读(167)  评论(0编辑  收藏  举报