第九章 硬件抽象层:HAL 心得笔记

      1.HAL(Handerware Abstraction Layer,硬件抽象层)是建立在linux程序上的一套程序库,这套程序库并不属于内核,而是属于内核之上的应用层。

      2.要在Android中加入HAL的原因:在linux驱动中一般有两种类型的代码:访问硬件寄存器的代码和业务逻辑代码。对于访问硬件寄存器的代码而言,并没有秘密,这都是调用linux内核的标准函数进行的标准操作。

       3.Google为android加入HAL其主要目的在于:

        统一硬件的调用接口;

        解决了GPL版权问题;

        针对一些特殊要求。

       4.andriod HAL架构

         在Andriod系统中使用程序库,条用位于内核空间的Linux驱动,然后Andriod应用程序。

         HAL的基本原理是在android系统中使用程序库调用内核空间的linux驱动。

       5. 为LED增加HAL:将所有业务逻辑从LED驱动移植到HAL模块,而LED驱动模块只保留读写寄存器的工程能。加入HAL会使组成linux驱动的一整套library更加独立,更加容易维护。

       6.编写一款支持HAL的LINUX程序驱动程序的步骤:

          1>Linux驱动程序;

          2>编写HAL Library;

          3>编写Service Library。

       7.编写HAL模块的步骤和原理:

          1>定义结构体和宏

             3个重要的结构体hw_module_t、hw_device_t、hw_module_methods_t

        2>编写HAL模块的open函数

             Open函数是HAL模块的入口点。初始化hw_device_t的子结构体;打开设备文件;初 始化寄存器

          3>定义hw_module_methods_t结构体变量

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

          4>定义HAL_MODULE_INFO_SYM变量

              id表示HAL模块中Android系统中的标识。通过id找到并装载HAL模块。

              methods变量需要指向第3步定义的hw_module_methods_t结构体的地址,当调用者通过id找到并装载HAL模块后,就会通过methods变量找到hw_module_methods_t结构体,并调用hw_module_methods_t.open函数。

          5>编写HAL模块的close函数

              当HAL模块被卸载后会调用close函数

          6>编写控制LED的函数

              根据设备类型和功能的不同,编写相应的函数 

 

原文地址:https://www.cnblogs.com/bigcrazy/p/5651713.html