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.

转载于:https://www.cnblogs.com/beatrice/p/5656052.html

第九章 硬件抽象层:HAL相关推荐

  1. 第九章 硬件抽象层:HAL 心得笔记

    1.HAL(Handerware Abstraction Layer,硬件抽象层)是建立在linux程序上的一套程序库,这套程序库并不属于内核,而是属于内核之上的应用层. 2.要在Android中加入 ...

  2. 嵌入式硬件抽象层HAL的设计实现

    硬件抽象层对下必须检验查看目前硬件配置的能力与限制,以及将来可能的扩展性,对上得倾听系统软件得需求.简单得说,HAL就是我们系统的"硬件",而"硬件"的功能就是 ...

  3. gd32f303 设计中断优先级_ALIENTEK 阿波罗 STM32F767 开发板资料连载第九章 外部中断实验...

    1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第九章 外部中断实验 这 ...

  4. thinkPython2考试周吐血整理(第一章到第九章)

    第二章 球体体积是三分之四倍的圆周率乘以半径立方,求半径为5的球体体积. 假如一本书的封面标价是24.95美元,书店打六折.第一本运费花费3美元,后续每增加一本的运费是75美分.问买60本一共得花多少 ...

  5. 机器学习-第九章 聚类

    机器学习-第九章 聚类 D系鼎溜已关注 2020.02.19 10:36:17字数 3,312阅读 375 9.1 聚类任务 在无监督学习任务中,包括了密度估计.异常检测以及聚类等.其中应用最广泛的是 ...

  6. 【Vue.js 牛刀小试】:第九章 - 组件基础再探(data、props)

    系列目录地址 一.基础知识概览 第一章 - 一些基础概念(posted at 2018-10-31) 第二章 - 常见的指令的使用(posted at 2018-11-01) 第三章 - 事件修饰符的 ...

  7. 【机器学习实战 第九章】树回归 CART算法的原理与实现 - python3

    本文来自<机器学习实战>(Peter Harrington)第九章"树回归"部分,代码使用python3.5,并在jupyter notebook环境中测试通过,推荐c ...

  8. C#程序设计笔记(第九章)

    第九章    接口 1.理解接口和类的区别: a)类是具有属性和在这些属性上操作的方法的集合 b)接口是定义行为特性或能力,并在类中应用这些行为,而不管类层次如何 c)它们之间最大的区别就是类不可以多 ...

  9. 计算机软件基础操作,计算机软件基础 第九章 Excel基本操作(1页)-原创力文档...

    第九章 Excel基本操作 历年考点分布 2005A 2005B 2006A 2006B 2007 2008 2009 2010 工作簿.工作表.单元格的基本概念 3 1 1 2 1 工作表的编辑 4 ...

最新文章

  1. AI视频行为分析系统项目复盘——技术篇3:tensorRT技术梳理
  2. 基于机器视觉的手机产品条码检测方案
  3. tomcat中conf/server.xml配置线程池不生效的问题注意添加线程池节点executor后要在connector中增加executor属性
  4. java array 元素的位置_数据结构与算法:动态图解十大经典排序算法(含JAVA代码实现)...
  5. Express框架实现原理
  6. sqlserver leftjoin出现重复数据_数据库存数据时,逻辑上防重了为啥还会出现重复记录?...
  7. Domino学习笔记之邮件发送程序
  8. android (12) Fragment使用
  9. WPF设计の画刷(Brush)
  10. 欧几里得算法、扩展欧几里得算法、求逆元、中国剩余定理、扩展中国剩余定理
  11. Ubuntu系统上使用锐捷客户端有线连接校园网
  12. 传输线特性阻抗与阻抗匹配关系【转】
  13. at24c32 linux,AT24C32使用方法总结
  14. Office 如何双面打印Word文档
  15. 转载:“凤求凰”的解释,有才
  16. 关于nodebb中ns-custom-fields插件的使用
  17. 【干货分享】使用Inno Setup设计扁平化风格的安装包
  18. 快来生成你专属的英文名吧(使用字符级RNN)!
  19. BADI OVERVIEW
  20. 剑指OFFER——正则表达式匹配

热门文章

  1. java:socket通信
  2. Framework7 4.1.0 发布,全功能 HTML 框架
  3. CCAI 2017 中国人工智能大会 6.4 折抢票倒计时!
  4. 从功能测试到性能测试的转型之路
  5. 全球买全球卖 国际化的技术挑战
  6. android:imeOptions属性
  7. DOS下处理含特殊字符[如:]的字符串
  8. 设计模式 分析模式 华容道 中文分词算法......
  9. AE 各分析适用数据
  10. C++ 对象动态建⽴和释放 new 和 delete