第9章:硬件抽象层HAL
第9章:硬件抽象层HAL
1.HAL ( Hardware Abstraction Layer,硬件抽象层) 是建立在Linux驱动之上的一套翻字库。这套程序库并不属于 Linux 内核, 而是属于 Linux 内核层之上的应用层。
2.编写一款支持 HAL 的 Linux 驱动程序的步骤
编写一款支持 HAL 的 Linux 驱动程序要比编写普通的 Linux 驱动程序复杂一些,加入HAL 会使组成 Linux 驱动的一整套 Library 的各部分更独立,更容易维护。
第 1 步:编写 Linux 驱动
“编写 Linux 驱动”,从表明上看是废话,但如果要为 Linux 驱动添加 HAL,而且想尽量保护敏感数据。 Linux 驱动的代码就要尽量简洁,尽可能将业务逻辑放到 HALLibrary 中。 第 2 步:编写 HAL Library
HAL Library 就是普通的 Linux Library (*.so )文件。但这类库文件有一个接口。通过 HAL _MODULE_INFO _ SYM 变量实现。 Service Library 就是通过在这个接口中定义的 ID 定位 HAL Library 的。
第 3 步:编写 Service Library
Service Library 也是 Linux Library。 这一步比较灵活。 Service Library 可以是一般的 Linux Library,也可以是别I Library。在本章的 LED 驱动例子中将 Service Library和JNI Library 合到了一起。也就是说, Service Library就是JNI Library. 实际上这一步除了用 C/C++实现的*.so 库文件外,还应该包含一个用 Java 编写的服务管理类 ( ServiceManager)。 ServiceManager会调用 Service Library。而 APK 程序会调用 ServiceManager类来访问 Service Library。
3.编写调用LED驱动的HAL模块
编写HAL模块的步骤和原理如下。
第1步:定义结构体和宏
第2步:编写HAL模块的 open 函数
第3步:定义 hw_ module _methods_ t 结构体变量
第4步:定义 HAL_MODULE_INFO_SYM 变量
第5步:编写 HAL模块的 close 函数
第6步:编写控制 LED 的函数
4.编写调用 HAL 模缺的 Service
5.编写调用 Service 的 Java 库
其实到现在为止基于HAL的LED驱动已经编写完成了,可以在Android应用程序中通过NDK 调用前面实现的Service程序库。 但为了使程序更易于使用, 可以将调用Service程序库的Java 类单独封装在jar文件中,这样做任何的Android应用程序中只要引用了这个阳文件就可以向调用普通Java类一样访问LED驱动了。
在Android系统中使用Linux.驱动有两种方式。 一种就是通过传统的方式直接与 Linux 驱动交互。例如,直接读写设备文件的数据。另外一种是Android特有的,就是通过HAL 模块,HAL模块本质上就是通过Linux共享库(.so)与Linux驱动交互,然后应用程序再访问Linux共享库。早期的 HAL 模块由应用程序直接按访问 Linux 共字库的方式调用。而高版本的Android系统为HAL添加了Stub。换句话说,就是为每一个HAL共享库指定一个ID,再利用这个ID配合一定的规则找到Linux共享库。这样 Linux 共享库更换文件名,移动位置都很方便(因为 HAL 共享库的路径和文件名都不是定死的)。