(一)为什么要在android中加入HAL

Linux系统中Linux驱动有两种类型的代码:访问硬件寄存器的代码——调用的Linux内核的标准函数进行的标准操作

                     业务逻辑代码——有些企业或个人并不想将源代码公开

Google为了满足这些不想开源的Linux驱动作者的要求,在android层次结构中的系统运行库增加了一个HAL,注意HAL并不是Linux内核的一部分。

主要目的:统一硬件的调用接口

     解决了GPL版权问题

      针对一些特殊的要求

(二)Android HAL架构

调用HAL模块的代码并不需要直接装载.so文件,而只需要通过一个ID来定位相应的.so文件(这里叫做Stub)。在Stub和JNI之间还有一层Service程序库,该层的库文件使用android系统提供的调用HAL的机制访问HAL中的Service程序库(就是在这一层通过ID定位了HAL Library),然后Android应用程序再调用Service程序库。

(了解)(三)为LED驱动增加HAL

应用程序不需要再关心Linux驱动和设备文件的交互方式,只需要像访问普通API一样就可以和Linux驱动进行交互,此次将所有业务逻辑从LED驱动移到HAL模块,LED驱动只保留读写寄存器的功能。

(1)编写一款支持HAL的Linux驱动程序的步骤:1.编写Linux驱动   Linux驱动的代码尽量简洁,尽可能将业务逻辑放到HAL Library中

2.编写HAL Library  这类库文件有一个接口,通过HAL_MODULE_INFO_SYM变量实现,Service Library就是通过这个接口中定义的ID定位HAL Library的

3.编写Service Library

(2)精简LED驱动:实现LED驱动在设备文件的read和write函数中读写指定的寄存器。基本原理是只从指定寄存器读取或写入5个字节。第一个字节用于指定读写的动作以及寄存器类型。后4个字节是读写的实际的数据。在与LED驱动交互时,只要想设备文件读取或发送5个字节的数据,就可以读写指定的寄存器。

(3)测试读写寄存器操作:在编写Linux驱动以及与驱动相关的程序的过程中应分段测试每一部分程序,以便将当前编写的程序的Bug降到最低

(4)编写调用LED驱动的HAL模块:HAL模块中包含了LED驱动的所有业务逻辑,实际上,HAL模块也是普通的Linux共享库,只不过HAL模块可以被Android系统自动装载,而不是开发人员自己去装载.so文件。任何被系统自动调用的程序都会有一个标准的接口。例如,C语言可执行程序都会有一个main函数,系统在运行程序时会试想执行main函数。Linux驱动init函数与main函数的性质类似。在装载Linux驱动的过程中系统会调用init函数。HAL模块有一个固定名称的结构体变量HAL_MODULE_INFO_SYM ,因此可以被android系统自动调用。

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

第1步:定义结构体和宏

3个重要的结构体hw_module_t、hw_device_t、hw_module_methods_t

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

Open函数是HAL模块的入口点。初始化hw_device_t的子结构体;打开设备文件;初始化寄存器

第3步:定义hw_module_methods_t结构体变量

HAL模块需要hw_module_methods_t结构体的open函数指针变量指定open入口函数

第4步:定义HAL_MODULE_INFO_SYM变量

id表示HAL模块中Android系统中的标识。通过id找到并装载HAL模块。

methods变量需要指向第3步定义的hw_module_methods_t结构体的地址,当调用者通过id找到并装载HAL模块后,就会通过methods变量找到hw_module_methods_t结构体,并调用hw_module_methods_t.open函数。

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

当HAL模块被卸载后会调用close函数

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

根据设备类型和功能的不同,编写相应的函数

(5)编写调用HAL模块的Service

(6)HAL模块的存放路径和命名规则

HAL模块通常存放在/system/lib/hw目录。文件名一般都有一个default。

(三)小结

在Android系统中使用驱动有两种方式:一种是通过传统的方式直接与Linux驱动交互;另一种是Android特有的,就是通过HAL模块。高版本的Android系统为HAL增加了Stub,为每一个HAL共享库指定一个ID,再利用这个ID配合一定的规则找到Linux共享库。

硬件抽象层——HAL的更多相关文章

  1. Android架构分析之使用自定义硬件抽象层(HAL)模块

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android版本:2.3.7_r1 Linux内核版本:android-goldfish-2.6.29 在上一篇博 ...

  2. 硬件抽象层:HAL

    本节我们研究硬件抽象层:HALHAL,它是建立在Linux驱动之上的一套程序库.刚开始介绍了为什么要在Android中加入HAL,目的有三个,一,统一硬件的调用接口.二,解决了GPL版权问题.三,针对 ...

  3. Android硬件抽象层(HAL)深入剖析(一)【转】

    作为一个搞android驱动或者说搞底层的人,我觉得对于hal那是必须要掌握的,而且必须达到一定深度,于是我总结了一下,将整个自己的分析思路写下来. 主要是看android源代码,根据源代码得到的思路 ...

  4. Android硬件抽象层(HAL)深入剖析(三)【转】

    前面分析了android HAL层是如何搜索硬件模块的动态共享库的,其实就是在"system/lib/hw/"或者"/vendor/lib/hw/"这两个路径下 ...

  5. Android硬件抽象层(HAL)深入剖析(二)【转】

    上一篇我们分析了android HAL层的主要的两个结构体hw_module_t(硬件模块)和hw_device_t(硬件设备)的成员,下面我们来具体看看上层app到底是怎么实现操作硬件的? 我们知道 ...

  6. Android硬件抽象层(HAL)深入剖析(二)

    上一篇我们分析了android HAL层的主要的两个结构体hw_module_t(硬件模块)和hw_device_t(硬件设备)的成员,下面我们来具体看看上层app到底是怎么实现操作硬件的? 我们知道 ...

  7. BSP与HAL关系(转)

    板级支持包(BSP)(Board Support Package)是介于主板硬件和操作系统中驱动层程序之间的一层,一般认为它属于操作系统一部分,主要是实现对操作系统的支持,为上层的驱动程序提供访问硬件 ...

  8. 深入解析Windows操作系统笔记——CH2系统结构

    2.系统结构 本章主要介绍系统的总体结构,关键部件之间的交互,以及运行在什么环境. 2.系统结构 2.1 需求和设计目标 2.2 操作系统模型 2.3 总体结构 2.3.1 可移植性 2.3.2 对称 ...

  9. Skyfree的毕业论文 《系统封装与部署的深入研究》

    Skyfree的毕业论文 <系统封装与部署的深入研究> https://www.itsk.com/thread-197-1-4.html Skyfree 发表于 2007-9-13 07: ...

随机推荐

  1. numpy函数白板

    numpy.linspace(start, stop, num=50, endpoint=True, retstep=False) start 起始位置 stop 终止位置 num 个数 endpoi ...

  2. hdu acm 简单暴力1004

    字符串匹配函数strcmp 直接使用来判断两字符串是否完全相等 用数组存每个单词的个数时  初始化为零就错 初始化为一时就正确  也不知道为什么

  3. Android布局整理Relative/Linear

    1.RelativeLayout布局 android:layout_centerHorizontal 水平居中 android:layout_centerVertical 垂直居中 android:l ...

  4. 跟小静读《jQuery权威指南》——目录

    前言 2014年开始了,年底给自己制订的学习计划,第一步先从学习<jQuery权威指南>开始. jQuery大家都很比较熟悉,但是我经常是边用的时候边对照着API,这次找本书通读一遍,记录 ...

  5. qt 编译问题总结

    1)使用make命令编译Qt原码时出现了 /usr/bin/ld: cannot find -lXrender 问题: /usr/bin/ld: cannot find -lXrender      ...

  6. WCF初探-26:WCF中的会话

    理解WCF中的会话机制 在WCF应用程序中,会话将一组消息相互关联,从而形成对话.会话”是在两个终结点之间发送的所有消息的一种相互关系.当某个服务协定指定它需要会话时,该协定会指定所有调用(即,支持调 ...

  7. 15个实用的jQuery代码片

    (function($) { var cache = []; // Arguments are image paths relative to the current page. $.preLoadI ...

  8. iOS9 +http请求不能用的解决办法

    报错NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802); 查询得知 iOS9引入了新特性App ...

  9. P53 T5

    北京某高校可用的电话号码有以下几类:校内电话号码由4位数字,第1位数字不是0:校外电话又分为本市电话和外地电话两类,拔校外电话需先拔0,若是本市电话则再接着拔8位数字(第一位不是0),若是外地电话则拔 ...

  10. [并查集] POJ 1611 The Suspects

    The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 35206   Accepted: 17097 De ...