1. 为什么要在Android中加入HAL

Goggle为Android 加入HAL主要有如下目的:

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

解决了GPL版权问题。由于 Linux 内核基于GPL协议,而Android基于Apache Licence 2 . 0协议。

针对一些特殊的要求。对于有些硬件,可能需要访问一些用户空间的资源,或在内核空间不方便完成的工作以及特殊需求。

  1. android HAL架构 
  1. 为LED驱动增加HAL
    1. 编写一款支持 HAL 的 Linux 驱动程序的步骤:

第 1 步: 编写 Linux 驱动;第 2 步:编写 HAL Library;第 3 步:编写 Service Library

  1. 精简 LED 驱动

基本原理是只从指定存器读取或写入5个字节.第 1 个字节用于指定读写的动作以及寄存器类型.后 4 个字节是读写的实际的数据(因为LED驱动只涉及操作一个int类型数据的寄存器 ,因此使用4个字节来表示一个int类型的数据〉。 在与LED驱动交互时,只要向设备文件(/dev/s3c64IO_leds_hal) 读取或发送 5 个字节的数据,就可以读写指定的寄存器。

  1. 测试读写寄存器操作

在编写 Linux 驱动以及与驱动相关的程序的过程中应分段测试每一部分程序。

使用下面的命令执行相应目录中的build.sh脚本文件,即可测试LED代码的准确性:sh build.sh

  1. :编写诵点LED驱动的HAL模块;

编写 HAL模块的步骤和原理如下:

第l步:定义结构体和宏:编写 HAL 模块需要使用到 3 个非常重要的结构体( hw_module_t 、 hw_device_t 和hw _ module_ method_ t), 在第 l 步需要定义两个新的结构体, 这两个结构体的第 l 个变量的数据类型必须是 hw_module_t和 bw_device_t。 除此之外, 还需要为HAL模块定义一个ID. 实际上在这 l 步就是编写leds_hal.h 头文件的代码。

第 2 步:编写 HAL模块的 open 函数:

  • open 函数是 HAL 模块的入口点。该函数主要做如下 3 项工作:初始化 hw device_t 的子结构体。打开设备文件。初始化寄存器。

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

第4 步: 定义 HAL_MODULE_INFO_SYM 变量

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

第 6步:编写控制 LED 的函数

  1. 编写调用 HAL 模块的 Service

调用 HAL 模块涉及一个非常重要的 hw_get_ module 函数。该函数可以通过在 leds_hal.h 中定义的 LED_HARDWARE_MODULE_ID 宏查找LED HAL 模块,并获得 led_module_t 结构体。然后调用led _module_ t.hw _ module.methods.open 函数来初始化 LED 驱动, 并通过 open 函数返回 led_control_device_t 结构体。在 led_control_device_ t 结构体中包含了在 HAL 模块中定义的控制 LED 驱动的函数指针(set_on 和 set_off)。

  1. HAL模块的存放路径和命名规则:

HAL 棋块库文件的存放路径有两个: /system/lib/hw 和/vendor/lib/hw。 hw_get_module 函数会先从/system/lib/hw 目录根据库文件命名规则寻找库文件。如果/system/lib/hw 目录中未找到库文 件, hw_get_ module 会按同样的规则在/vendor/lib/hw 目录中寻找.

  HAL 模块库文件的命名规则是 ID.suffix.so。其中 ID 通过 hw_get_ module 函数的 id 参数指 定。 suffix (后缀〉通过属性文件指定。

  hw _get_module 会在 Android 系统的属性文件中根据 variant_keys 数组中定义的 4 个 key 依次查找 suffix. 如果未找到 suffix, 使用默认的 suffix (default)。

实际上, Android 系统的属性文件具有如下4 个:

 /default.prop;/system/build.prop; /system/default.prop; /data/local.prop.

  1. 编写调用 Service 的 Java 库

可以将调用 Service程序库的 Java 类单独封装在jar文件中,这样做任何的 Android 应用程序中只要引用了这个jar文件就可以像调用普通Java 类一样访问 LED 驱动了.

  1. 测试 LED 驱动

本节实现的测试程序将通过调用 LedHalService.setOn 和 LedHalService.setOff方法控制 LED.

posted on 2016-07-09 16:11  Y-Beatrice  阅读(216)  评论(0编辑  收藏  举报