(一)为什么要在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. Find命令的用法

    1. 在某目录下查找文件 [root@localhost ~]# find /usr/local -name pci.ids* /usr/local/share/pci.ids.gz [root@lo ...

  2. 删除Kafka的topic

    刚接触Kafka,开始认为删除一个topic只是运行一下Kafka-topic.sh的delete命令就行了,但是,事实却不是这样,会出现两种情况:(1) 如果topic没有使用过即没有传输过消息,可 ...

  3. 20155229-付钰涵-分析自我技能延展到c语言学习状况

    我的小技能 我记得幼儿园时表演的舞蹈,也记得从水彩到素描的学习,还记得小学和初中获得的钢琴省级奖项. 舞蹈止于一年级,绘画止于三年级,钢琴从学前班到高一那十年的时间里有过断续. 03年-04年的那个冬 ...

  4. loadrunner将参数文件转换为UTF-8编码

    在使用loadrunner进行参数化的时候,对于有些信息,比如地址.人名等,很多时候需要传入中文,但是有的时候会碰到字符编码不对导致脚本出错. 下面介绍两种loadrunner中可以使用的编码转化为U ...

  5. 再战江湖。vuforia 初试

    AR 里发现一个可用的项目  vuforia,  试着用用. 也是在很久不写博客后(以前全在百度博客上) 再次写

  6. Z表数据EXCEL导入

    很多项目都有这种需求,虽然别人用的各有不同,不过闲来无事,还是自己搞了一个出来.基于EXCEL的导入. *&------------------------------------------ ...

  7. CSS轮廓outline

    http://www.cnblogs.com/xiaohuochai/p/5277416.html

  8. 《Linux内核设计与实现》课本第四章自学笔记——20135203齐岳

    <Linux内核设计与实现>课本第四章自学笔记 进程调度 By20135203齐岳 4.1 多任务 多任务操作系统就是能同时并发的交互执行多个进程的操作系统.多任务操作系统使多个进程处于堵 ...

  9. 让ie6对png透明图片支持起来

    [声明:此文仅是对低版本ie使用透明图片的一个研究,当时出于工作要求,所以花费了一番心思在兼容旧版本ie上,现在对ie8都是做降级处理了.不培养用户坏习惯.引导用户跟随潮流体验新技术应是我们前端开发者 ...

  10. java中调用xml的方法:DocumentBuilderFactory

    具体的使用方法如下: (1)得到 DOM 解析器的工厂实例 DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance(); (2 ...