第九章讲了硬件的抽象层HAL,HAL是建立在linux驱动上的一套程序库,不属于linux内核,属于linux内核层之上的应用层,对传统的linux系统中linux驱动一般有两类型的代码,访问硬件寄存器的代码和业务逻辑代码,因为都是调用linux内核的标准函数进行的便准操作,google为了满足不想开源的linux驱动者的需求,在android层次中的系统运行层增加了一个HAL。HAL并不是linux内核的一部分,而是位于android的系统运行库层,HAL主要有以下目的:
1统一硬件调用接口,可以利用HAL屏蔽linux驱动复杂、不统一的接口
2解决了GPL版权问题
3针对特殊要求,对于有些硬件,可能需要访问一些用户空间的资源,或在内核空间不方便完成的工作及特殊要求,可以利用位于用户空间的HAL代码辅助linux驱动完成一些工作。
加入了HAL的led驱动不需要再关心linux驱动和设备文件的交互方式,只需要像访问普通API一样就可以和linux驱动进行交互。首先编写一款支持HAL的linux驱动要比平常的复杂一些,但是易维护,完成之后,去掉led驱动中所有与读写寄存器规则相关的代码,只保留创建设备文件以及与寄存器交互的代码,只从制定寄存器读取或写入5个字节,就可以完成实现新的linux驱动。
编写HAL模块的步骤和原理如下:
1定义结构体和宏
hw_module.t hw_device.t hw_module_methods.t
2编写HAL模块的open函数
初始化hw_device.t的子结构体
打开设备文件
初始化寄存器
3定义hw_module_methods.t结构体变量
4定义HAL_MODULE_INFO_SYM变量
5编写HAL模块的close函数
6编写控制led的函数
HAL模块的存放路径通常放在/system/lib/hw目录,文件名中一般有一个default
HAL模块本质上就是通过liunx共享库与linux驱动交互,然后应用程序再访问linux共享库。