第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 共享库的路径和文件名都不是定死的)。

posted @ 2016-07-05 17:37  未闻花名。  阅读(138)  评论(0编辑  收藏  举报