(一)为什么要在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. 【图像】Matlab图像标定工具箱

    参考教程: Matlab工具箱教程  http://www.vision.caltech.edu/bouguetj/calib_doc/ 摄像机模型  http://oliver.zheng.blog ...

  2. latex 竖排子图的生成

    latex命令如下: 需要的包为: \usepackage{graphicx} \usepackage{subfigure} \begin{figure*}%加*的作用是跨栏(双栏和单栏latex的区 ...

  3. python迭代器

    首先解释以下迭代器跟可迭代对象(Iterable)的区别,可以直接作用于for循环或者实现了__iter__的对象统称为可迭代对象(Iterable).可以被next()函数调用并不断返回下一个值的对 ...

  4. laravel 安装完成后安装 vendor 目录

    composer  install 就是将composer.js 中的配置下载安装 生成vendor目录

  5. asp.net登录时验证码的制作与验证

    1.新建一个页面,ImageCode.aspx 2.在Page_Load中添加如下代码 string tmp = RndNum(4); HttpCookie a = new HttpCookie(&q ...

  6. Python中文乱码

    1,注意:请使用智慧型浏览器 "CHROME" 配合理解和运作本文中提到的程序. 2,提示:谷歌的CHROME浏览器是迄今为止最智慧的浏览器,没有之一,只有第一. 3,谷歌的CHR ...

  7. 51nod 1174 1174 区间中最大的数

    题目链接:51nod 1174 1174 区间中最大的数 ST(Sparse Table)算法学习参考博客:http://blog.csdn.net/niushuai666/article/detai ...

  8. js动态替换数据的点击事件

    做项目时遇到的,具体是界面如下图:当点击X号时,出现删除.取消按钮,当点击删除时,这一行删除,当点击取消时又恢复到初始状态. 需要关注的问题是,js动态添加的删除.取消按钮的点击事件.当点击取消时恢复 ...

  9. YY前端课程-自习

    1. 默认的浏览器字体 100% = 1em  =1rem =16px  =12pt em继承父元素,rem只继承html根元素 2. text-align水平对齐影响一个元素中文本的水平对齐方式,控 ...

  10. Hibernate与MyBatis

    一. Hibernate与MyBatis Hibernate 是当前最流行的O/R mapping框架,它出身于sf.net,现在已经成为Jboss的一部分. Mybatis 是另外一种优秀的O/R ...