第九章 硬件抽象层: HAL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第九章 硬件抽象层: HAL相关的知识,希望对你有一定的参考价值。


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

统一硬件的调用接口。由于HAL 有标准的调用接口,所以可以利用HAL屏蔽Linux 驱动复杂、不统一的接口。解决了GPL版权问题。由于Linux 内核基于GPL协议,而android 基于Apache Licence 2 .0 协议。因此Google 玩了个“穿越”,将原本位于Linux驱动中的敏感代码向上移了一个层次这样这些敏感代码就摆脱了GPL 协议的束缚。那些不想开源的Linux驱动作者也就没必要开源了。
在Android.系统中使用Linux 驱动有两种方式。一种就是通过传统的方式直接与Lmux 驱动交互。另外一种是Android特有的,就是通过HAL 模块。HAL 模块本质上就是通过Linux 共享库(.so)与Linux驱动交互,然后应用程序再访问Linux共享库。
HAL是建立在Linux驱动之上的一套程序库,这套程序库并不属于Linux内核,而是属于Linux内核层之上的应用层。Google为Android加入HAL主要有如下的目的:统一硬件的调用接口、解决了GPL版权问题。加入HAL的驱动使应用程序不需要再关心Linux驱动和设备文件的交互方式,而只需要像访问普通API一样就可以和Linux驱动进行交互。

实现LED驱动在设备文件的read和write函数中读写指定的寄存器。基本原理是只从指定寄存器读取或写入5个字节,第1个字节用于指定读写的动作以及寄存器类型。后4个字节是读写的实际的数据。在与LED驱动交互时,只要向设备文件读取或发送5个字节的数据,就可以读写指定的寄存器。由于LED驱动程序的设备文件接收的不是字符串,而是字节类型的数据,因此需要单独做一个程序向设备文件写入字节形式的数据,或从设备文件中读取字节类型的数据。

HAL模块可以被Android系统自动调用,自然也拥有类似main或init函数的接口,只不过这个接口不是函数,而是一个固定名称的结构体变量HAL_MODULE_INFO_SYM.也就是说,所有的HAL程序都必须要有一个HAL_MODULE_INFO_SYM变量。编写HAL模块的步骤和原理:定义结构体和宏,编写HAL模块的open函数,定义hw_module_methods_t结构体变量,定义HAL_MODULE_INFO_SYM变量,编写HAL模块的 close函数,编写控制LED的函数

在Android系统中使用Linux驱动有两种方式,一种就是通过传统的方式直接与Linux驱动交互,如直接读写设备文件的数据。另外一种是Android特有的,就是通过HAL模块。HAL模块本质上就是通过Linux共享库与Linux驱动交互,然后应用程序再访问Linux共享库。

以上是关于第九章 硬件抽象层: HAL的主要内容,如果未能解决你的问题,请参考以下文章

第九章:硬件抽象层:HAL

第九章 硬件抽象层:HAL

第九章 硬件抽象层: HAL

第九章 硬件抽象层:HAL

第九章:硬件抽象层:HAL

第九章 硬件抽象层:HAL 读后感