第9章 硬件抽象层:HAL
HAL是建立在Linux驱动上的一套程序库,这套程序库不属于linux内核,而是属于linux内核层之上的应用层,Google为Android增加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 )eg事cy 目录用来存储旧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
s。urce ./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 函数
第6步z 编写控制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