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

主要是看android源代码,根据源代码得到的思路。(看源代码比看什么著作书籍都管用)

android HAL是什么?为什么有它?

硬件抽象层是介于android内核kernel和上层之间的抽象出来的一层结构。他是对linux驱动的一个封装,对上层提供统一接口,上层应用不必知道下层硬件具体怎么实现工作的,它屏蔽了底层的实现细节。

它在整个android架构中的位置如下图所示:

传统的linux对硬件的操作基本上在内核空间的linux驱动程序中实现了,那么现在为什么那么多此一举把对硬件的操作分为两部分,hal和linux驱动呢?

而且hal属于用户空间,linux驱动属于内核空间。其实并不多余。那么为什么要高出这么个东西,理由是很多的:

1.谷歌搭好了hal的框架,为上层framework打通过jni调用hal提供了统一的api,硬件开发商或者移植人员只需要按照框架开发即可,无需话费精力在与上层的交互上的实现上,将精力放在hal层本身的实现上即可。

2.从商业角度,许多硬件厂商不愿意将自己硬件相关一些核心的东西开源出去,假如将对自己硬件的驱动程序全部放入内核空间驱动程序实现,那么必须遵循GPL协议,是必需开源的。有了HAL层之后,他们可以把一些核心的算法之类的东西的实现放在HAL层,而hal层位于用户空间,不属于linux内核,和android源码一样遵循的是appache协议,这个是可以开源或者不开的。

搞清楚了hal的存在意义,下面来根据hal层源码分析一下hal到底是怎么样个架构和实现原理,深入剖析一下。

android hal层的代码主要位于/hardware/libhardware下面我们从上往下走。

在hal层中,各类硬件的都是以硬件模块的形式描述的hal层中是用hw_module_t结构体来描述的,而每一类硬件模块中又有各个独立的硬件,hal中是用hw_device_t结构体来描述的。

上层app通过jni调用硬件时,首先得获取到hw_module_t结构体,也即是硬件模块,有了这个才能再对硬件进行操作。那么我们来看看看看这两个结构体定义是什么样子的。

它们的定义在/hardware/libhardware/include/hardware/hardware.h里面。

a.  hw_module_t表示硬件模块,它主要包含了一些硬件模块的信息,结构体的定义:

  1. /**
  2. * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM
  3. * and the fields of this data structure must begin with hw_module_t
  4. * followed by module specific information.
  5. */
  6. typedef struct hw_module_t {
  7. /** tag must be initialized to HARDWARE_MODULE_TAG */
  8. uint32_t tag; //tag,根据引文注释可以看到必须被初始化为HARDWARE_MODULE_TAG
  9.  
  10. /** major version number for the module */
  11. uint16_t version_major;//主版本号
  12.  
  13. /** minor version number of the module */
  14. uint16_t version_minor;//次版本号
  15.  
  16. /** Identifier of module */
  17. const char *id;//模块id字符串
  18.  
  19. /** Name of this module */
  20. const char *name;//模块名
  21.  
  22. /** Author/owner/implementor of the module */
  23. const char *author;//作者
  24.  
  25. /** Modules methods */
  26. struct hw_module_methods_t* methods;//硬件模块方法结构体
  27.  
  28. /** module's dso */
  29. void* dso;//打开硬件模块的库时得到的句柄
  30.  
  31. /** padding to 128 bytes, reserved for future use */
  32. uint32_t reserved[-];
  33.  
  34. } hw_module_t;

前面tag,name那几个成员属性就不说了,看了注释相信大家都知道了,下面看看hw_module_methods_t,这个指针methods它指向的是与本硬件模块相关的方法的结构体,里面不用看可以猜出肯定有一些函数指针,但是它里面只有一个函数指针。可以看看定义:

  1. typedef struct hw_module_methods_t {
  2. /** Open a specific device */
  3. int (*open)(const struct hw_module_t* module, const char* id,//打开硬件设备函数指针
  4. struct hw_device_t** device);
  5.  
  6. } hw_module_methods_t;

我们可以看到确实只有一个函数指针,open它是打开硬件模块中硬件设备的函数。

然后是成员void* dso,它是打开硬件模块相关的额设备之后返回的句柄给它,这个在后面看hw_get_module函数源码的时候你就会明白。

b.  下面我们再来看看hw_device_t结构体,这个结构体主要是用来描述模块中硬件设备的属性信息什么的。一个硬件模块可能有多个硬件设备。

比如说,传感器模块,sensor_module,是一个硬件模块,但是手机中的传感器就对应的有好多种,比如加速度acc_sensor,磁传感器M_sensor等,那么他们都属于sensor_module,但是他们有都有自己的

hw_device_t结构体来描述。hw_device_t定义:

  1. /**
  2. * Every device data structure must begin with hw_device_t
  3. * followed by module specific public methods and attributes.
  4. */
  5. typedef struct hw_device_t {
  6. /** tag must be initialized to HARDWARE_DEVICE_TAG */
  7. uint32_t tag; //设备tag
  8.  
  9. /** version number for hw_device_t */
  10. uint32_t version;//版本
  11.  
  12. /** reference to the module this device belongs to */
  13. struct hw_module_t* module;//本设备归属的硬件模块
  14.  
  15. /** padding reserved for future use */
  16. uint32_t reserved[];//保留
  17.  
  18. /** Close this device */
  19. int (*close)(struct hw_device_t* device);//关闭设备的函数指针
  20.  
  21. } hw_device_t;

其中,第三个成员module指向的是这个设备归属的硬件模块结构体。

最后一个函数指针close指向的肯定是关闭设备的函数。

恩,到此,hal的主要的两个结构体讲完了,下次我们继续,将结合源码,看看hal层到底是怎么工作的,看看上层怎么获取到硬件模块,硬件设备的,到底是怎么加载解析动态共享库的。

Android硬件抽象层(HAL)深入剖析(一)【转】的更多相关文章

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

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

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

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

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

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

  4. 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口(老罗学习笔记4)

    在上两篇文章中,我们介绍了如何为Android系统的硬件编写驱动程序,包括如何在Linux内核空间实现内核驱动程序和在用户空间实现硬件抽象层接口.实现这两者的目的是为了向更上一层提供硬件访问接口,即为 ...

  5. Android - 硬件抽象层(HAL)

    以下资料摘录整理自老罗的Android之旅博客,是对老罗的博客关于Android底层原理的一个抽象的知识概括总结(如有错误欢迎指出)(侵删):http://blog.csdn.net/luosheng ...

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

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

  7. 为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口

    在上两篇文章中,我们介绍了如何为Android系统的硬件编写驱动程序,包括如何在Linux内核空间实现内核驱动程序和在用户空间实现硬件抽象层接 口.实现这两者的目的是为了向更上一层提供硬件访问接口,即 ...

  8. Android硬件抽象层(HAL)概要介绍和学习计划

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6567257 Android的硬件抽象层,简单来 ...

  9. Android硬件抽象层(HAL)概要介绍【转】

    本文转载自:http://blog.csdn.net/luoshengyang/article/details/6567257 Android的硬件抽象层,简单来说,就是对Linux内核驱动程序的封装 ...

随机推荐

  1. springMVC 开涛 Controller接口控制器

    通过注解实现控制器类,所以不用看Controller接口了.把之前的笔记保存下. 笔记(图片):http://pan.baidu.com/s/1mgMNDna 第三章看不太懂,3.2 3.3.只了解到 ...

  2. java递归和反向递归

    1. 递归查询树tree结构有两种做法: 第一种,递归查询数据库结构, 第二种,一次性将数据库表中的所有数据查出来,然后再递归查出来的list集合, 第一种做法适合数据量较少的tree结构,因为要一直 ...

  3. [翻译][HTML]CELLPADDING and CELLSPACING

    w3school手册:http://www.w3schools.com/tags/att_table_cellspacing.asp 一直以来都发现自己对cellpadding&cellspa ...

  4. 获得硬盘的ID序列号(XE10.1+WIN8.1)

    疯狂delphi DelphiXE公开课群:100162924.58593121 朱建强QQ:513187410 获得硬盘的ID序列号(XE10.1+WIN8.1) 相关资料: https://zhi ...

  5. WPF 标签预览可以显示图片运行后不显示

    使用<Image HorizontalAlignment="Left" Height="100" Margin="106,111,0,0&quo ...

  6. C#之23中设计模式

    本身打算把二十三种设计模式,总结一下.总结了几个设计模式后发现已经有博主总结的非常详细,内容丰富,我看了后也是受益良多.大家可以参考他的博客,地址如下: https://www.cnblogs.com ...

  7. Spring Boot 学习系列(10)—SpringBoot+JSP的使

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 解决问题 随着spring boot 框架的逐步使用,我们期望对于一些已有的系统进行改造,做成通用的脚手架, ...

  8. 740. Delete and Earn

    Given an array nums of integers, you can perform operations on the array. In each operation, you pic ...

  9. struts+spring+hibernate两张表字段名一样处理方法

    在利用struts2+spring+hibernate(利用Hibernate进行分页查询)三大框架进行开发项目的时候,出现一个问题:居然要进行关联查询的十几张表中有两张表的字段一样,并且这两张表中的 ...

  10. 使用win10自带邮件应用发送文件

    之前的电脑装过邮件客户端,想发送文件给别人时,只需要“右键文件——发送到邮件”,就能把文件作为附件发送给对方.新电脑win10系统自带邮件客户端,所以就想直接用.但是右键发送到邮件没有关联上,用不了. ...