WEB开发网
开发学院手机开发Android 开发 Android HAL 分析 阅读

Android HAL 分析

 2010-05-26 06:40:00 来源:WEB开发网   
核心提示:图3:Android HAL / libhardware现在的 libhardware 作法,就有「stub」的味道了,Android HAL 分析(2),HAL stub 是一种代理人(proxy)的概念,stub 虽然仍是以 *.so?的形式存在,上层通过HAL module提供的统一接口获取并操作HAL stub

图3:Android HAL / libhardware

现在的 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层结构框架,通过几个接口访问硬件从而统一了调用方式。

4 HAL_legacy和HAL的对比

HAL_legacy:旧式的HAL是一个模块,采用共享库形式,在编译时会调用到。由于采用function

call形式调用,因此可被多个进程使用,但会被mapping到多个进程空间中,造成浪费,同时需要考虑代码能否安全重入的问题(thread safe)。

HAL:新式的HAL采用HAL module和HAL stub结合形式,HAL stub不是一个share library,编译时上层只拥有访问HAL stub的函数指针,并不需要HAL stub。上层通过HAL module提供的统一接口获取并操作HAL stub,so文件只会被mapping到一个进程,也不存在重复mapping和重入问题。

5 HAL module架构

HAL moudle主要分为三个结构:

struct hw_module_t;

struct hw_module_methods_t;

struct hw_device_t;

他们的继承关系如下图:

<a target=Android HAL 分析 - On<wbr>ce - 许兴旺的博客" src="http://tech.cncms.com/tech/UploadPic/2010911/20109110170673.jpg" width="432" height="525" border="0" onload="return imgzoom(this,550);" style="cursor:pointer;" onclick="javascript:window.open(this.src);"/>

图4:Android HAL结构继承关系

6 HAL使用方法

(1)Native code通过hw_get_module调用获取HAL stub:

hw_get_module (LED_HARDWARE_MODULE_ID, (const hw_module_t**)&module)

(2)通过继承hw_module_methods_t的callback来open设备:

module->methods->open(module,

LED_HARDWARE_MODULE_ID, (struct hw_device_t**)device);

(3)通过继承hw_device_t的callback来控制设备:

sLedDevice->set_on(sLedDevice, led);

上一页  1 2 3 4  下一页

Tags:Android HAL 分析

编辑录入:coldstar [复制链接] [打 印]
赞助商链接