第九章 硬件抽象层:HAL
一、Android增加HAL的主要目的除了尽量避免应用程序直接访问linux驱动之外,还有一个重要原因就是保护企业或个人的核心业务逻辑。在传统的linux系统中linux驱动一般有两种类型的代码:访问硬件寄存器的代码和业务逻辑代码,对于访问硬件寄存器的代码,都是调用linux内核的标准函数进行操作并没有什么秘密可言。而对于业务逻辑代码,它里面存在一些商业秘密或技术专利企业和个人并不想公开,所以在Android层次结构的系统运行库层增加了HAL,因此HAL就不属于linux内核的一部分而是在Android系统运行库层,自然就不必开源了。而linux驱动也就相当于一个“数据二传”了,唯一的功能就是接受来自HAL传过来的数据,并将数据写入指定寄存器中;或从寄存器读取数据,返回给HAL。HAL的主要目的如下:
1.统一硬件的调用接口
2.解决了GPL版权问题
3.真对一些特殊的要求
二、HAL架构
相比于旧的HAL架构,新的HAL架构加入了一些架构要求的入口代码,并多了一层service程序库(就在此层通过ID定位了HAL Library)。
注:虽然使用了新的HAL架构,但为了兼容性旧的HAL架构仍然支持。
三、编写支持HAL的linux驱动程序的步骤
1.编写linux驱动(linux驱动代码要尽量简洁,尽可能将业务逻辑代码放到HAL Library中)
2.编写HAL Library(类库文件有一个接口,通过HAL_MODULE_INFO_SYM 变量实现。Service Library 就是通过在这个接口中定义的 ID 定位 HAL Library)
编写HAL模块的步骤及原理:
(1)第 1步:定义结构体和宏,编写 HAL 模块需要使用到 3 个非常重 要的结构体 ( hw_module_t 、 hw_device_t和hw_ module_ method_t)
(2)第2步:编写HAL模块的open函数
(3)第3步:定义hw_ module_ method_t结构体变量
(4)第4步:定义HAL_MODULE_INFO_SYM结构体变量
(5)第5步:编写HAL模块的close函数
(6)第6步:编写控制LED的函数
3.编写Service Library