硬件抽象层——HAL
(一)为什么要在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的更多相关文章
- Android架构分析之使用自定义硬件抽象层(HAL)模块
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android版本:2.3.7_r1 Linux内核版本:android-goldfish-2.6.29 在上一篇博 ...
- 硬件抽象层:HAL
本节我们研究硬件抽象层:HALHAL,它是建立在Linux驱动之上的一套程序库.刚开始介绍了为什么要在Android中加入HAL,目的有三个,一,统一硬件的调用接口.二,解决了GPL版权问题.三,针对 ...
- Android硬件抽象层(HAL)深入剖析(一)【转】
作为一个搞android驱动或者说搞底层的人,我觉得对于hal那是必须要掌握的,而且必须达到一定深度,于是我总结了一下,将整个自己的分析思路写下来. 主要是看android源代码,根据源代码得到的思路 ...
- Android硬件抽象层(HAL)深入剖析(三)【转】
前面分析了android HAL层是如何搜索硬件模块的动态共享库的,其实就是在"system/lib/hw/"或者"/vendor/lib/hw/"这两个路径下 ...
- Android硬件抽象层(HAL)深入剖析(二)【转】
上一篇我们分析了android HAL层的主要的两个结构体hw_module_t(硬件模块)和hw_device_t(硬件设备)的成员,下面我们来具体看看上层app到底是怎么实现操作硬件的? 我们知道 ...
- Android硬件抽象层(HAL)深入剖析(二)
上一篇我们分析了android HAL层的主要的两个结构体hw_module_t(硬件模块)和hw_device_t(硬件设备)的成员,下面我们来具体看看上层app到底是怎么实现操作硬件的? 我们知道 ...
- BSP与HAL关系(转)
板级支持包(BSP)(Board Support Package)是介于主板硬件和操作系统中驱动层程序之间的一层,一般认为它属于操作系统一部分,主要是实现对操作系统的支持,为上层的驱动程序提供访问硬件 ...
- 深入解析Windows操作系统笔记——CH2系统结构
2.系统结构 本章主要介绍系统的总体结构,关键部件之间的交互,以及运行在什么环境. 2.系统结构 2.1 需求和设计目标 2.2 操作系统模型 2.3 总体结构 2.3.1 可移植性 2.3.2 对称 ...
- Skyfree的毕业论文 《系统封装与部署的深入研究》
Skyfree的毕业论文 <系统封装与部署的深入研究> https://www.itsk.com/thread-197-1-4.html Skyfree 发表于 2007-9-13 07: ...
随机推荐
- Android 写模块化代码注意事项
模块化代码方便抽离注意事项 1. 访问控制符使用 多使用protect,包内访问控制,final关键字 2. 工具类最好不要相互引用,需要相互引用的地方考虑写到一个类里面 3. Activity ...
- MySQL DML 整理
DML(Data Manipulation Language)数据操纵语言statements are used for managing data within schema objects. 由D ...
- Swift函数的定义
//: Playground - noun: a place where people can play import Cocoa //基本的函数 //************************ ...
- 解决: org.iq80.leveldb.DBException: IO error: C:\data\trie\000945.sst: Could not create random access file.
以太坊MPT树的持久化层是采用了leveldb数据库,然而在抽取MPT树代码运行过程中,进行get和write操作时却发生了错误: Caused by: org.fusesource.leveldbj ...
- linux进程通信之使用匿名管道进行父子进程通信
管道:是指用于连接一个读进程和一个写进程,以实现它们之间通信的共享文件,又称pipe文件. 管道是单向的.先进先出的.无结构的.固定大小的字节流,它把一个进程的标准输出和另一个进程的标准输入连接在一起 ...
- java List 排序
List<Map.Entry<String, String>> infoIds = new ArrayList<Map.Entry<String, String&g ...
- 关于rem的学习
网页常见单位px.em.rem:其中rem是css3新出的单位,官网是这样定义的:“font size of the root element”,意思是:相对长度单位,相对于根元素(即html元素)f ...
- github使用
1.首先登录到https://github.com注册Github帐号,并且创建一个repository. 例如:注册的github帐号名为whu-zhangmin,创建的repository名称为w ...
- 微博开放平台开发(一)获取access_token
因为工作需要,接触到微博开放平台开发.特做此记录方便查用. 一.准备. 1.微博账号.注册很容易. 2.微博账号成为开发者. 登录微博开放平台 登录你注册的账号,然后进入管理中心完善开发者基本信息和 ...
- 字符编码笔记:ASCII,Unicode和UTF-8(转载)
作者: 阮一峰 日期: 2007年10月28日 今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料. 结果,这个问题比我想象的复杂,从午饭后一直看到晚上9点,才算初步 ...