第九章

第9章  硬件抽象层:HAL

HAL是建立在Linux驱动上的一套程序库,这套程序库不属于linux内核,而是属于linux内核层之上的应用层,GoogleAndroid增加HAL是为了尽量避免应用程序直接访问Linux驱动外,还保护“私人财产”。

加入HAL的原因:

1统一硬件的调用接口,由于HAL有标准的调用接口,所以可以利用HAL屏蔽linux驱动复杂,不统一的接的接口。

2解决了GPL版权问题,由于linux内核基于GPL协议,而Android基于Apache licence 2.0协议,这些敏感代码就摆脱了GPL 协议的束缚, 。那些不想开源的Linux驱动作者也就没必要开源了。

3针对一些特殊的要求。对于有些硬件,可能需要访问→些用户空间的资源,或在内核空间不方便完成的工作以及特殊需求。在这种情况下,可以利用位于用户空间的HAL 代码来辅助Linux一些工作。

驱动完成一些工作。

Android HAL驱动构架

Android_.H现二的源代码存储的位置并不固定, →般会存储奋,<Android源代码目录>/hardware !§.

果中。其中<An~roid 源代码目录>/hai-dwiire/1\bbardware )egcy 目录用来存储旧liAL 架构的源代码γ

文件。新HAL 架构’的源优码在<Android 源代码目录>lhardwareli ibhardware_目录中,当然,这些源

, 代码文件也可以放在<Androi.d 糠代码目录>/hardware 或其他的国录。最终编译生成的.so 文件主要

放在Android 系统的/s~stem/fib/bw 目录(也可以放在其他的目录,详细内容将在后面的部分介绍〉。

LED驱动增加HAL

编写一款支持HAL Linux 驱动程序的步骤

1 g 编写Linux 驱动

“编写Linux 驱动”,从表明上看是废话,但如果要为Linux 驱动添加HAL,而且想尽量保护敏

感数据。Linux 驱动的代码就要尽量简洁,尽可能将业务逻辑放到HAL Library 中。

2 步:编写HAL Library

HAL Library 就是普通的Linux Library .so )文件。但这类库文件有一个接口。通过

HAL MODULE_INFO SYM 变量实现。Service Library 就是通过在这个接口中定义的ID 定位HAL

Library 的。

3 步:编写Service Library

尽管这步并不是必需的,但新的HAL 架构要求我们这样做。Service Library 也是Linux Library

这一步比较灵活。Service Library 可以是一般的Linux Library,也可以是别I Library。在本章的LED

驱动例子中将Service Libratγ 和刑I Library 合到了一起。也就是说, Service Library 就是JNI Library.

实际上这一步除了用CIC件实现的* .so 库文件外,还应该包含一个用Java 编写的服务管理类

( ServiceManager )。ServiceManager 会调用Service Library。而APK 程序会调用ServiceManager 类米

访问Service Library。、

编写程序后执行以下命令

# sh build. Sh

# build.sh

surce ./build s3c6410 .sh

测试读写寄存器操作

rwdev <r lw> <dev_file> <byte_count> [bytel] [byte2J ... [byten)

dev:命令行程序。

rlw>:读或写命令。r 表示读取寄存器中的数据「W 表示向寄存器写入数据。

<dev fl.le> :· 设备文件名,

<b¥te_count> : 写入或读取的字节数。

[bytel ]、[byte2] .. . [byten]: 写入的字节。如果读取字节, rwdev 会输出该字节的十进制数。

编写调用LED驱动的HAL模块

编写HAL 模块的步骤

l步:定义结构体和宏

2:编写HAL 模块的open 函数

3步:定义hw_module_methods_ t 结构体变量

4步: 定义HAL_MODULE_INFO_SYM 变量

5步:编写HAL 模块的close 函数

6z 编写控制LED 的函数

编写调用HAL 模缺的Serv i ce

编写调用Service Java

运衍Android

应用程序之前需要在开发板上安装如下3 个程序库。

LED 驱动: /data/locaνs3c6410 leds hal.ko

HAL 模块:/system/lib/hw/led_hal.default.so

Service 程序库: /system/lib/led_haljni.so .

android.系统中使用Linux 驱动有两种方式。一种是通过传统的方式直接与Lmux 驱动交交互。另外一种是Android特有的,就是通过HAL 模块,HAL 模块本质上就是通过Linux 共享库与linux驱动交互,然后应用程序再访问linux共享库。:早期的HAL模块白应用程序直接按访问Linux共字库的方式调用。而高版本的Android 系统为HAL增加了Stub ,就是为每一个HAL共享库指定一个ID,再利用这个ID 配合一定的规则找到linux共享库。

http://i.cnblogs.com/EditPosts.aspx?opt=1

posted @ 2016-07-05 14:28  千年等成灰  阅读(104)  评论(0编辑  收藏  举报