欢迎来到天天文库
浏览记录
ID:37909436
大小:306.50 KB
页数:20页
时间:2019-06-02
《Android HAL的框架及Sensor HAL stub的实现方法_20110603lgm》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、AndroidHAL框架及SensorHALstub的实现方法收集网络上的这部分信息,系统整理如下,如发现有谬误或有更好的建议,请联系:第一部分AndroidHAL框架1.1.HAL简介Android的HAL(HardwareAbstractLayer硬件抽象层)是Google因应厂商「希望不公开源码」的要求下,所推出的新观念,其架构如下图。虽然HAL现在的「抽象程度」还不足,现阶段实作还不是全面符合HAL的架构规划,不过也确实给了我们很好的思考空间。图1:AndroidHAL架构规划这是PatrickBrady(Goog
2、le)在2008GoogleI/O所发表的演讲「Anatomy&PhysiologyofanAndroid」中,所提出的AndroidHAL架构图。从这张架构图我们知道,HAL的目的是为了把Androidframework与Linuxkernel完整「隔开」。让Android不至过度依赖Linuxkernel,有点像是「kernelindependent」的意思,让Androidframework的开发能在不考虑驱动程序的前提下进行发展。在Android原始码里,HAL主要的实作储存于以下目录:1.hardware/lib
3、hardware_legacy/-过去的实作、采取链接库模块的观念进行2.hardware/libhardware/-新版的实作、调整为HALstub的观念3.hardware/ril/-RadioInterfaceLayer在HAL的架构实作成熟前(即图1的规划),我们先就目前HAL20现况做一个简单的分析。另外,目前Android的HAL实作,仍旧散布在不同的地方,例如Camera、WiFi等,因此上述的目录并不包含所有的HAL程序代码。1.1.HAL的过去和现在(1)HAL的过去:图2:AndroidHAL/libh
4、ardware_legacy过去的libhardware_legacy作法,比较是传统的「module」方式,也就是将*.so档案当做「sharedlibrary」来使用,在runtime(JNI部份)以directfunctioncall使用HALmodule。透过直接函数呼叫的方式,来操作驱动程序。当然,应用程序也可以不需要透过JNI的方式进行,直接以加载*.so檔(dlopen)的做法呼叫*.so里的符号(symbol)也是一种方式。总而言之是没有经过封装,上层可以直接操作硬件。(2)HAL的现状:20图3:Andr
5、oidHAL/libhardware现在的libhardware作法,就有「stub」的味道了。HALstub是一种代理人(proxy)的概念,stub虽然仍是以*.so檔的形式存在,但HAL已经将*.so档隐藏起来了。Stub向HAL「提供」操作函数(operations),而runtime则是向HAL取得特定模块(stub)的operations,再callback这些操作函数。这种以indirectfunctioncall的实作架构,让HALstub变成是一种「包含」关系,即HAL里包含了许许多多的stub(代理人)
6、。Runtime只要说明「类型」,即moduleID,就可以取得操作函数。对于目前的HAL,可以认为Android定义了HAL层结构框架,通过几个接口访问硬件从而统一了调用方式。(3)HAL_legacy和HAL的对比:HAL_legacy:旧式的HAL是一个模块,采用共享库形式,在编译时会调用到。由于采用functioncall形式调用,因此可被多个进程使用,但会被mapping到多个进程空间中,造成浪费,同时需要考虑代码能否安全重入的问题(threadsafe)。HAL:新式的HAL采用HALmodule和HALstu
7、b结合形式,HALstub不是一个sharelibrary,编译时上层只拥有访问HALstub的函数指针,并不需要HALstub。上层通过HALmodule提供的统一接口获取并操作HALstub,so文件只会被mapping到一个进程,也不存在重复mapping和重入问题。1.1.HALmodule的架构HALmoudle主要分为三个结构:structhw_module_t;structhw_module_methods_t;structhw_device_t;它们的继承关系如下图:20图4:AndroidHAL结构继承关
8、系1.1.HAL的使用方法(1)Nativecode通过hw_get_module调用获取HALstub:hw_get_module(LED_HARDWARE_MODULE_ID,(consthw_module_t**)&module)(2)通过继承hw_module_methods_t的callbac
此文档下载收益归作者所有