• 第九章 硬件抽象层:HAL


    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.

  • 相关阅读:
    建立一个能持续处理的C/S网络程序
    建立一个可以不停地接收客户端新的连接,但不能处理复杂的业务的C/S网络程序
    归并排序
    堆排序
    计数排序
    不要在PHP7中踩这些坑
    关于生活学习
    topthink/think-swoole 扩展包的使用 之 WebSocket
    PHP 三元运算符
    topthink/think-swoole 扩展包的使用 之 Task
  • 原文地址:https://www.cnblogs.com/beatrice/p/5656052.html
Copyright © 2020-2023  润新知