第九章 硬件抽象层:HAL

摘要:
因为HAL有一个标准的调用接口,所以您可以使用HAL来屏蔽Linux驱动程序的复杂和不一致的接口。步骤2:编写HAL模块的开放函数:开放函数是HAL模块入口点。第3步:定义hw_模块_方法_T结构变量第4步:定义HAL_模块_ INFO_ SYM变量第5步:编写HAL模块的关闭函数第6步:编写控制LED的函数编写调用HAL模块服务调用HAL模件涉及一个非常重要的hw_ get_模块函数。如果在/system/lib/hw目录中找不到库文件,hw_get_模块将搜索。HAL模块库文件位于/vvendor/lib/hw目录中。命名规则为ID.suffix.so。
  1. 为什么要在Android中加入HAL

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

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

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

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

  1. android HAL架构 
  2. 第九章 硬件抽象层:HAL第1张
  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.

免责声明:文章转载自《第九章 硬件抽象层:HAL》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇关于常用 软件授权 Licence说明selenium URL重定向检查下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

GIS中的数据库.gdb与.mdb的区别

Gdb是文件地理数据库,mdb是个人地理数据库,两者都是数据库文件类型。个人地理数据库是基于access数据库的个人数据库格式mdb,可存储不超过2G的文件,仅适用于Windows系统;文件数据库是保存在文件系统文件夹中的各种类型的GIS数据集的集合。请参阅文章“GIS中database.gdb和.mdb之间的区别是什么?”,m892832piczpec5。...

Android Exception 10(server)' ~ Channel is unrecoverably broken and will be disposed!)

08-1119:22:35.028:W/MemoryDealer(2123):madvise(0x43e1600012288,MADV_REMOVE)返回操作不支持传输端点08-1119:22-35.038:W/InputDispatcher(2714):channel'4236b890com.tongyan.activi...

eventUtil

}elseif(element.attachEvent){element.aattchEvent('on'+类型,}else{element['on'+type]=处理程序;}else{element['on'+类型]=null;函数(事件){returnevent.type;}否则{event.returnValue=false;...

k8s集群上删除pod及service

删除k8s集群中的pod:找到pod的名称空间,并根据名称空间删除pod1。首先删除pod2,然后删除相应的部署。否则,删除pod是无用的。您还将看到pod,因为deployment.yaml文件中定义的副本数如下:delete the pod[root@test2~]#kubectlgetpod-njenkinsNAMEREADYSTATUSRESTART...

mysql修改字段防止锁表

步骤1:修改大表、addcolumn或dropcolumn的字段,操作完成后将锁定该表。此时,查询ok、insert和update将等待锁定。...

Spring Boot 核心配置文件 bootstrap & application

boostrap由父ApplicationContext加载,比applicaton优先加载boostrap里面的属性不能被覆盖3、bootstrap/application的应用场景application配置文件这个容易理解,主要用于SpringBoot项目的自动化配置。这个父级的SpringApplicationContext是先加载的,在加载appli...