第九章 硬件抽象层: 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共享库。

时间: 2024-10-12 16:15:44

第九章 硬件抽象层: HAL的相关文章

第九章 硬件抽象层:HAL

1.在传统的Linux系统中Linux驱动一般有两种类型的代码:访问硬件寄存器的代码和业务逻辑代码. 2.android的层次结构:应用层,应用框架层,系统运行库层,linux内核层 3.为android加入HAL的目的: (1)统一硬件的调用接口.由于HAL有标准的调用接口,所以可以利用 HAL屏蔽Linux驱动复杂,不统一的接口. (2)解决GPL版权问题.由于 Linux 内核基于GP协议,而Android基于Apache Licence2.0协议 (3)针对一些特殊的要求.对于有些硬件,

第九章 硬件抽象层:HAL

本章的主要内容是硬件抽象层:HAL.本章中了解的是编写HAL的Linux驱动程序的步骤,具体如下: 第一步:编写Linux驱动 “编写Linux驱动”,从表面上看没什么意义,但如果要为Linux驱动添加HAL,而且像尽量保护敏感数据.Linux驱动的代码就要尽量简洁,尽可能将业务逻辑放到HAL Library中. 第二步:编写HAL Library HAL Library就是普通的Linux Library(*.so)文件.但这类文件库有一个接口.通过HAL_MODULE_INFO_SYM变量实

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

1.HAL(Handerware Abstraction Layer,硬件抽象层)是建立在linux程序上的一套程序库,这套程序库并不属于内核,而是属于内核之上的应用层. 2.要在Android中加入HAL的原因:在linux驱动中一般有两种类型的代码:访问硬件寄存器的代码和业务逻辑代码.对于访问硬件寄存器的代码而言,并没有秘密,这都是调用linux内核的标准函数进行的标准操作. 3.Google为android加入HAL其主要目的在于: 统一硬件的调用接口: 解决了GPL版权问题: 针对一些特

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

Android HAL层,即硬件抽象层,是Google响应厂家“希望不公开源码”的要求推出的新概念1,源代码和目标位置源代码: /hardware/libhardware目录,该目录的目录结构如下:/hardware/libhardware/hardware.c编译成libhardware.so,目标位置为/system/lib目录2,HAL层的实现方式JNI->通用硬件模块->硬件模块->内核驱动接口具体一点:JNI->libhardware.so->xxx.xxx.so-

第九章硬件抽象层:HAL

1.HAL是建立在Linux驱动之上的一套程序库,这套程序库并不属于Linux内核,而是属于Linux内核层之上的应用层. 2.Google为Android加入HAL主要有如下的目的: 统一硬件的调用接口.解决了GPL版权问题. 3.加入HAL的驱动使应用程序不需要再关心Linux驱动和设备文件的交互方式,而只需要像访问普通API一样就可以和Linux驱动进行交互. 4.编写一款支持HAL的Linux驱动程序的步骤: 第一步:编写Linux驱动. 第二步:编写HAL Library 第三步:编写

Android深度探索(卷1)HAL与驱动开发 第九章 硬件抽象层:HAL 读书笔记

HAL是建立在Linux驱动之上的一套程序库.这套程序库并不属于Linux内核,而是属于Linux内核层之上的应用层.HAL的主要目的一个是用来保护"私人财产",另一个是尽量避免应用程序直接访问Linux驱动程序. 传统的Linux系统中Linux驱动一般有两种类型的代码,访问硬件寄存器和业务逻辑代码.对于访问硬件寄存器代码,并无秘密可言,因为都是调用Linux内核的标准函数进行的标准操作.而Linux的业务逻辑部分对于有些企业或者个人并不想讲源代码公开.Linux内核采用GPL协议,

第九章 读书笔记

第九章 硬件抽象层 HAL 在传统的Linux.系统中Linux驱动一般有两种类型的代码:访问硬件寄存器的代码和业务逻辑有码.对于访问硬件寄存器的代码,并没有什么秘密可言,因为这都是调用的 Linux 内核的标准函数进行的标准操作4 而Linux驱动的业务逻辑部分对击有些企业或个人并不想将源代码公开.尽管这些Lipux.驱动都是免费给用户使用的,由于这些Linux 驱动的实现涉及一些,技术专利或商业秘窑,如果公开源代码会有很大麻烦.但作为Linux.驱动,又不得不公开源代码.这 是由于Linux

第九章 HAL

<Android深度探索>第九章讲的是硬件抽象层:HAL.HAL是建立在Linux驱动之上的一套程序库.这套程序库并不属于Linux内核,而是属 于Linux内核层之上的应用层.Google为Android加入HAL主要的目的:统一硬件的调用接口:解决了GPL版权问题:针对一些特殊的要求. 编写一款支持HAL的Linux驱动程序的步骤,第1步:编写Linux驱动:第2步:编写HAL Library:第3步:编写Server Library.在编写Linux驱动以及驱动相关的程序的过程中应分段测

Android深度探索(卷一)HAL与驱动开发 第九章

通过学习Android深度探索(卷一)HAL与驱动开发的第九章让我知道了HAL硬件抽象层,为什么要在Android中加入HAL和Android HAL架构. HAL是建立在Linux驱动之上的一套程序库.这套程序库并不属于Linux内核,而是属于Linux内核层之上的应用层,其主要目的除了尽量避免应用程序直接访问Linux驱动外,还有一个重要原因,那就是保护“私人财产”. 在传统的Linux系统中Linux驱动一般有两种类型的代码:访问硬件寄存器代码和业务逻辑代码.所以加入HAL的主要原因就是: