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

原文地址:https://www.cnblogs.com/wyx13/p/5625790.html