位置: 编程技术 - 正文

Android HAL模块实现(android深度探索(卷1):hal与驱动开发)

编辑:rootadmin
1. HAL介绍

推荐整理分享Android HAL模块实现(android深度探索(卷1):hal与驱动开发),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:androidhelper模块,android haxm,android haxm,android模块开发,android 模块化,android hal层框架,androidhelper模块,android hal层框架,内容如对您有帮助,希望把文章链接给更多的朋友!

Android的HAL(Hardware Abstract Layer硬件抽象层)是为了保护一些硬件提供商的知识产权而提出的,是为了避开linux的GPL束缚。思路是把控制硬件的动作都放到了Android HAL中,而linux driver仅仅完成一些简单的数据交互作用,甚至把硬件寄存器空间直接映射到user space。而Android是基于Aparch的license,因此硬件厂商可以只提供二进制代码,所以说Android只是一个开放的平台,并不是一个开源的平台。

总结下来,Android HAL存在的原因主要有:

并不是所有的硬件设备都有标准的linux kernel的接口KERNEL DRIVER涉及到GPL的版权。某些设备制造商并不原因公开硬件驱动,所以才去用HAL方式绕过GPL。针对某些硬件,Android有一些特殊的需求。不同的平台厂商可在遵循HAL调用接口的前提下实现自己的HAL,不会影响到上层的调用者,这样降低了模块间的耦合度,可以让平台开发者只关心HAL本身的实现即可。

下图是HAL在android系统中所处的位置:

从这张图中可以看出,HAL把内核和framework隔离开来,使上层的开发可以不依赖内核与驱动的实现。在android源码中,HAL大致位于下面几个位置:

libhardware_legacy/ - 旧的架构、采取链接库模块的模式进行。libhardware/ - 新架构、调整为 HAL stub 的概念。ril/ - Radio Interface Layer。msm7k QUAL平台相关。

主要包含以下一些模块:Gps、Vibrator、Wifi、Copybit、Audio、Camera、Lights、Ril、Gralloc等。

2. HAL的两种实现方式

下图分别为旧的HAL实现与新的HAL实现框图:

libhardware_legacy 是将 *.so 文件当作shared library来使用,在runtime(JNI 部份)以 direct function call 使用 HAL module。通过直接函数调用的方式,来操作驱动程序。当然,应用程序也可以不需要通过 JNI 的方式进行,直接加载 *.so (dlopen)的做法调用*.so 里的符号(symbol)也是一种方式。总而言之是没有经过封装,上层可以直接操作硬件。

现 在的 libhardware 作法,就有「stub」的味道了。HAL stub 是一种代理人(proxy)的概念,stub 虽然仍是以 *.so檔的形式存在,但 HAL 已经将 *.so 档隐藏起来了。Stub 向 HAL「提供」操作函数(operations),而 runtime 则是向 HAL 取得特定模块(stub)的 operations,再 callback 这些操作函数。这种以 indirect function call 的实作架构,让HAL stub 变成是一种「包含」关系,即 HAL 里包含了许许多多的 stub(代理人)。Runtime 只要说明「类型」,即 module ID,就可以取得操作函数。对于目前的HAL,可以认为Android定义了HAL层结构框架,通过几个接口访问硬件从而统一了调用方式。

由上可大致看出这两种实现方式的优劣:

HAL_legacy方式的HAL是一个模块,采用共享库形式,在编译时会调用到。由于采用function call形式调用,因此可被多个进程使用,但会被mapping到多个进程空间中,造成浪费,同时需要考虑代码能否安全重入的问题(thread safe)。而新式的HAL采用HAL module和HAL stub结合形式,HAL stub不是一个share library,编译时上层只拥有访问HAL stub的函数指针,并不需要HAL stub。上层通过HAL module提供的统一接口获取并操作HAL stub,so文件只会被mapping到一个进程,也不存在重复mapping和重入问题。

3. HAL模块的结构与编写方法

HAL模块主要有二个结构:

struct hw_module_t-代表抽象硬件模块,包含硬件模块的一些基本信息,例如版本号,开发者等,还有一个成员函数结构体。

struct hw_module_methods_t ,里面只有一个用于打开抽象硬件设备hw_device_t的open函数指针。

Android HAL模块实现(android深度探索(卷1):hal与驱动开发)

struct hw_device_t-代表抽象硬件设备,里面包含了版本号,一个关闭硬件的close函数指针,以及一个指向hw_module_t的结构的指针。

这两个结构的定义在hardware/libhardware/include/hardware/hardware.h里面,在实现自己的hw module与hw device结构时,第一个成员变量必须是这两个结构,以达到类&#;C&#;&#;中的继承的目的。

这两个结构的定义如下所示:

4. 硬件模块库的使用

硬件模块库的装载与解析由hardware.c中的hw_get_module函数完成,它先按照一定的规则选择然后加载硬件模块库,然后由HAL_MODULE_INFO_SYM解析出库中的全局变量名,得到硬件模块库指针(hw_module_t结构),然后返回给调用者。

下面以camera为例子来说明如何使用HAL层。

在系统启动创建CameraService对象时,其函数onFirstRef被调用,在它里面,通过hw_get_module(CAMERA_HARDWARE_MODULE_ID, (const hw_module_t**)&mModule)函数获取camera的抽象硬件模块camera_module,其过程如上所说,通过Camera的HAL动态库然后解析HAL_MODULE_INFO_SYM符号得到全局变量,然后通过获取到的抽象硬件模块结构获取系统拥有的Camera数量等。具体代码参见CameraService.cpp。

其中camera_module即camera HAL的抽象硬件模块,其定义如下(camera_common.h):

由其定义看到,其第一个成员为hw_module_t common,即上面说的自己的硬件抽象模块必须包含hw_module结构,达到“继承”的目的。另外定义了几个自己的成员变量,比如获取camera个数,及camera信息等。使用hw_get_module获取到的camera_module_t变量位于平台的camera HAL实现库中,不同的厂家可能文件名字有所不同,但是肯定会实现下面类&#;的结构(CameraHAL.cpp)。

有了Camera的HAL层的硬件抽象模块camera_module,就可以通过camera_module获取到硬件抽象设备camera_device_t,不过它封装在CameraHardwareInterface中,在连接一个camera时(CameraService的connect函数,最后调到CameraClient::initialize),将先创建CameraHardwareInterface对象,然后在其初始化函数中得到camera_device_t:int rc = module->methods->open(module, mName.string(), (hw_device_t **)&mDevice);这个open函数就是gCameraModuleMethods里面的open函数,其实现如下所示:

这里面就返回了camera_device_t,而此结构的初始化在构造函数中:

至此,CameraService就得到了Camera的HAL层的硬件抽象模块camera_module_t和抽象设备camera_device_t。有了这两个结构,上层就可以使用camera的功能了。以上代码基于android4.4/hardware/libhardware/modules/camera,使用的是c&#;&#;的方式实现,不同硬件厂家的实现方式可能不同,但相同的是都必须实现这两个结构。

5. 总结HAL通过hw_get_module来获取hw_module_t结构。HAL通过hw_module_t->methods->open获取hw_device_t指针,并在在open中初始化hw_device_t中的结构,包括函数指针(close操作)等。两个重要结构:

hw_module_t:硬件抽象模块,可以用hw_get_module获取到。其中又包含了一个hw_module_methods_t结构,其中定义了打开设备open方法。

hw_device_t:硬件抽象设备,主要定义了硬件相关的一些函数,参数等。此结构通过hw_module_methods_t里面定义的open函数获取。

以上大致就是android hal模块的内容,下一篇会以android的一个重要的HAL模块gralloc来看看其具体的实现。

查看详情

关注微信公众平台:程序员互动联盟(coder_online),你可以第一时间获取原创技术文章,和(java/C/C&#;&#;/Android/Windows/Linux)技术大牛做朋友,在线交流编程经验,获取编程基础知识,解决编程问题。程序员互动联盟,开发人员自己的家。

版权声明:本文为博主原创文章,未经博主允许不得转载。

性能优化之数据库优化 本文为性能优化的第一篇——数据库性能优化,原理适用于大部分数据库包括Sqlite、Mysql、Oracle、Sqlserver,详细介绍了索引(优缺点、分类、场景、规则)

android 学习笔记-问题解决 Intent隐试启动ActivityNotFoundExceptionintent设置action隐试启动默认会加入,所以manifest文件中过滤器需要盖如改categoryandroid:configChanges设置android在manifest文件中

查看网络图片 1.运行效果图2.训练目标输入网络图片的地址,点击浏览按钮可以显示网络中的图片。3.开发步骤MainActivity.java代码:packageorg.bzu.imagebrowser;importjava.io.IOExce

标签: android深度探索(卷1):hal与驱动开发

本文链接地址:https://www.jiuchutong.com/biancheng/380985.html 转载请保留说明!

上一篇:性能优化系列总篇(性能优化报告)

下一篇:性能优化之数据库优化(性能优化是什么)

  • 固定资产处置营业外收入和发票金额不一致
  • 外出经营是什么意思
  • 销售不动产营业税纳税义务发生时间
  • 法人向公司账户汇款怎么做账
  • 房屋租赁发票票样
  • 无形资产摊销计算例题
  • 定额发票可以用旧的营业执照发票章吗
  • 预缴所得税更正怎么操作
  • 员工超过万人公司
  • 充电桩收入属于什么类别
  • 事业专款支出形成的固定资产如何入账?
  • 收到一笔支付宝转账,如何查看转账人
  • 超市送现金券怎么做账
  • 前年的票发现要不得,可以冲红吗
  • 公司管理层的作用
  • 计提社保个人部分需要计提吗
  • 贷款和应收款项在活跃市场中没有报价
  • 广告费用的增值税税率
  • 机构信用代码证是三证合一里的吗
  • 机打发票领回怎么录入
  • 电子承兑都是银行承兑吗
  • 商品流通企业代表企业
  • 劳务派遣用工工资标准
  • 建筑业劳务分包怎样算税
  • 购进农产品怎么做账
  • 收据和发票有什么区别?买家电
  • 对外支付和对外转账
  • 王者荣耀怎么快速获得金币
  • 企业签订的借款合同印花税
  • PHP:Memcached::getMulti()的用法_Memcached类
  • 非营利性组织收到政府拨款转出给其他部门怎么做账
  • 公司缴纳的公积金什么时候到账
  • php访问mysql的五个基本步骤
  • 固定资产清理的审计目标不包括
  • 房地产取得土地怎么做账
  • 零售金银首饰的商场要交消费税吗
  • 暂估成本的账务处理分录
  • php生成随机字母数字代码
  • 强化学习之stable_baseline3详细说明和各项功能的使用
  • vue.mixin是什么
  • 跨域问题是什么
  • 对公账户原路退回
  • 学电脑哪个网站比较好
  • mongodb连接数
  • 收到汇算清缴的退税需要交税吗
  • 跨年发票一般分为哪几类
  • 信用减值损失会影响营业利润吗
  • 收到缴纳个人所得税短信
  • 哪些费用可以进研发费用
  • 附加税印花税会计分录
  • 现金形式福利费个税软件怎么申报个税
  • 住宿费报销该怎么报
  • 增值税申报表中期初未缴税额指什么
  • 购买商品商家赠送怎么做分录
  • 小微企业免征的增值税属于政府补助吗
  • 开发成本转到哪里
  • 微信的业务
  • 工程完工结算报告范本
  • 新准则融资租赁承租人的会计处理
  • xp复制粘贴功能失效
  • win7系统怎么打开开机启动项
  • xp系统好奇怪哦
  • mac safari浏览器网页不能正常显示
  • 在linux操作系统中,/etc/rc.d/init.d
  • win8无法更新到win10
  • 苹果手机如何给视频添加字幕
  • js是函数式编程语言吗
  • jquery 滑块
  • fortune命令
  • js对象常用方法
  • nodejs 爬虫
  • android 更新apk
  • 下载python教程
  • js判断页面是否跳出弹窗
  • jquery获取指定元素
  • 如何登录黑龙江全省事
  • 国家税务总局郴州
  • 高新区地税办税服务厅
  • 代扣代缴企业所得税手续费
  • 北京市印花税减免政策
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设