Android的硬件驱动调用流程分为以下几层:

1、内核驱动;

2、硬件抽象层(HAL层);

3、通过JNI方法提供java调用接口;

4、在应用程序框架层()增加硬件服务接口供应用程序使用;

5、app层最终调用硬件;

以下重点解释下硬件抽象层:

简单来说,就是对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节。也就是说,把对硬件的支持分成了两层,一层放在用户空间(User Space),一层放在内核空间(Kernel Space),其中,硬件抽象层运行在用户空间,而Linux内核驱动程序运行在内核空间。为什么要这样安排呢?把硬件抽象层和内核驱动整合在一起放在内核空间不可行吗?从技术实现的角度来看,是可以的,然而从商业的角度来看,把对硬件的支持逻辑都放在内核空间,可能会损害厂家的利益。我们知道,Linux内核源代码版权遵循GNU License,而Android源代码版权遵循Apache License,前者在发布产品时,必须公布源代码,而后者无须发布源代码。如果把对硬件支持的所有代码都放在Linux驱动层,那就意味着发布时要公开驱动程序的源代码,而公开源代码就意味着把硬件的相关参数和实现都公开了,在手机市场竞争激烈的今天,这对厂家来说,损害是非常大的。因此,Android才会想到把对硬件的支持分成硬件抽象层和内核驱动层,内核驱动层只提供简单的访问硬件逻辑,例如读写硬件寄存器的通道,至于从硬件中读到了什么值或者写了什么值到硬件中的逻辑,都放在硬件抽象层中去了,这样就可以把商业秘密隐藏起来了。也正是由于这个分层的原因,Android被踢出了Linux内核主线代码树中。大家想想,Android放在内核空间的驱动程序对硬件的支持是不完整的,把Linux内核移植到别的机器上去时,由于缺乏硬件抽象层的支持,硬件就完全不能用了,这也是为什么说Android是开放系统而不是开源系统的原因。

撇开这些争论,学习Android硬件抽象层,对理解整个Android整个系统,都是极其有用的,因为它从下到上涉及到了Android系统的硬件驱动层、硬件抽象层、运行时库和应用程序框架层等等,下面这个图阐述了硬件抽象层在Android系统中的位置,以及它和其它层的关系:

接下来,我们将会学习如何在内核空间编写硬件驱动程序、如何在硬件抽象层中添加接口支持访问硬件、如何在系统启动时提供硬件访问服务以及 如何编写JNI使得可以通过Java接口来访问硬件,而作为中间的一个小插曲,我们还将学习一下如何在Android系统中添加一个C可执行程序来访问硬件驱动程序。由于这是一个系统的学习过程,我们将分成五篇文章来描述每一个学习过程,包括:

(一)为Android系统编写Linux内核驱动程序HelloWorld

(二)在Android硬件抽象层增加接口模块访问硬件驱动程序

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

(四)为Android系统的Application Frameworks层增加硬件访问服务

(五)编写Android App测试Hello驱动程序API

android平台硬件驱动原理学习(总)相关推荐

  1. 高通Android平台硬件调试之Camera篇

    之前一段时间有幸在高通android平台上调试2款camera sensor,一款是OV的5M YUV sensor,支持jpeg out,同时也支持AF,调试比较比较简单,因为别的项目已经在使用了, ...

  2. Android平台_驱动_SD_软件 概要设计说明书

    1.引言 1.1 编写目的 手机项目中描述SD部分的驱动设计架构.设计方法.为上层应用提供底层的函数接口和功能,方便上层对SD应用的正确调用,作为开发和测试人员制定测试规范的参考文档.主要读者适用于手 ...

  3. Android底层HAL驱动开发学习笔记

    2017.3.27 1.确定任务:加快摄像头的信息获取速率:缩减驱动程序.减小帧的大小,缩减一个像素点的比特流(6/8/10bit) 2.重点了解函数:camerabuffer *buffer=mPr ...

  4. python硬件驱动_Python学习:计算机基础之计算机硬件

    本节重点: 1.编程语言的作用及与操作系统和硬件的关系: Python是编程语言,简之,Python即语言. 语言有汉语,外语,是人与人之间沟通交流的介质,编程语言即人与计算机之间的语言,目的是为了让 ...

  5. 高通 android平台LCD驱动分析

    目前手机芯片厂家提供的源码里包含整个LCD驱动框架,一般厂家会定义一个xxx_fb.c的源文件,注册一个平台设备和平台驱动,在驱动的probe函数中来调用register_framebuffer(), ...

  6. android 副屏驱动_高通 android平台LCD驱动分析

    目前手机芯片厂家提供的源码里包含整个LCD驱动框架,一般厂家会定义一个xxx_fb.c的源文件,注册一个平台设备和平台驱动,在驱动的probe函数中来调用register_framebuffer(), ...

  7. Android 平台应用软件开发(学习中)

    Android 中的五种布局 1,LinearLayout(线性布局),RelativeLayout(相对布局),FrameLayout(帧布局),AbsoluteLayout(绝对布局),Table ...

  8. mtk android平台学习,MTK平台的驱动学习——(阶段1规划篇)

    受老罗的影响,由于本人还是菜鸟,不能像老罗一样重头开始研究整个系统,决定从就近的工作开始,从android MTK 的驱动-->中间层-->应用层,一步一步研究. 一边看书,一边搜集网上的 ...

  9. Linux设备驱动模型3——platform平台总线工作原理

    以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除. 四.platform平台总线工作原理1 1.何为平台总线? (1)属于总线中的一种,相对于usb.pci.i2c等物理总线来说,platfo ...

最新文章

  1. mybatis 大于小于转义_10 HTML5特性、转义字符和注释
  2. 力扣: 231. 2的幂 【位运算】
  3. spring cloud全家桶_阿里架构师玩转spring全家桶(实战篇),附赠3本spring电子书...
  4. 在windows上模拟linux环境,MSYS2——Windows平台下模拟linux环境的搭建-Go语言中文社区...
  5. Docker / 深入理解的容器和镜像
  6. 2017.0612.《计算机组成原理》总线结构
  7. lua php 触摸精灵,lua程序设计主要学习路径
  8. halcon 3D Object Model 三维物体模型算子,持续更新
  9. 为什么总是喜欢看我桌面呢?
  10. [前端记录] --- vue axios 等调用完再执行后面的语句
  11. Java并发编程知识总结
  12. 【云周刊】 第211期:“阿里巴巴小程序繁星计划”:20亿扶持200万小程序开发者和100万商家...
  13. docker:编排与部署小神器Compose
  14. 数学建模评价类模型——模糊综合评价
  15. Mac OS X 窗口操作快捷键
  16. 五子棋-进阶版:C#窗体编写
  17. Ad Hoc网络的概述
  18. 09.JSP自定义标签01
  19. 《O N E 影视厅》管理系统——WAMP架构win10+apache+mysql+php
  20. Java中的CST-UTC时间格式相互转换

热门文章

  1. SLAM十四讲(五)非线性优化
  2. kali渗透测试工具方法
  3. Python和sendfile
  4. 浅谈微信公众号营销背后的技术
  5. Ubuntu实用工具安装(不断更新)
  6. 怎么把webp格式转换成jpg,webp转jpg的四种快速方法
  7. 2018.10.22 cogs2471. [EZOI 2016]源氏的数学课(线段树)
  8. 写一个可以使用kingfisher加载图片的轮播器PPTView
  9. JAVA图片数组实现方式
  10. 帮信罪:一种空前可怕的连坐制度