收藏 分享(赏)

android系统开发--HAL层开发基础.doc

上传人:gnk289057 文档编号:6893141 上传时间:2019-04-25 格式:DOC 页数:5 大小:43KB
下载 相关 举报
android系统开发--HAL层开发基础.doc_第1页
第1页 / 共5页
android系统开发--HAL层开发基础.doc_第2页
第2页 / 共5页
android系统开发--HAL层开发基础.doc_第3页
第3页 / 共5页
android系统开发--HAL层开发基础.doc_第4页
第4页 / 共5页
android系统开发--HAL层开发基础.doc_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

1、android 系统开发 -HAL 层开发基础 Android HAL 层,即硬件抽象层,是 Google 响应厂家“希望不公开源码”的要求推出的新概念1,源代码和目标位置源代码: /hardware/libhardware 目录,该目录的目录结构如下:/hardware/libhardware/hardware.c 编译成 libhardware.so,目标位置为/system/lib 目录/hardware/libhardware/include/hardware 目录下包含如下头文件:hardware.h 通用硬件模块头文件copybit.h copybit 模块头文件gralloc.h

2、 gralloc 模块头文件lights.h 背光模块头文件overlay.h overlay 模块头文件qemud.h qemud 模块头文件sensors.h 传感器模块头文件/hardware/libhardware/modules 目录下定义了很多硬件模块这些硬件模块都编译成 xxx.xxx.so,目标位置为/system/lib/hw 目录2,HAL 层的实现方式JNI-通用硬件模块-硬件模块-内核驱动接口具体一点:JNI-libhardware.so-xxx.xxx.so-kernel具体来说:android frameworks 中 JNI 调用/hardware/libhard

3、ware/hardware.c 中定义的hw_get_module 函数来获取硬件模块,然后调用硬件模块中的方法,硬件模块中的方法直接调用内核接口完成相关功能3,通用硬件模块(libhardware.so)(1)头文件为:/hardware/libhardware/include/hardware/hardware.h头文件中主要定义了通用硬件模块结构体 hw_module_t,声明了 JNI 调用的接口函数hw_get_modulehw_module_t 定义如下:typedef struct hw_module_t /* tag must be initialized to HARDWAR

4、E_MODULE_TAG */uint32_t tag;/* major version number for the module */uint16_t version_major;/* minor version number of the module */uint16_t version_minor;/* Identifier of module */const char *id;/* Name of this module */const char *name;/* Author/owner/implementor of the module */const char *author

5、;/* Modules methods */struct hw_module_methods_t* methods; /硬件模块的方法/* modules dso */void* dso;/* padding to 128 bytes, reserved for future use */uint32_t reserved32-7; hw_module_t;硬件模块方法结构体 hw_module_methods_t 定义如下:typedef struct hw_module_methods_t /* Open a specific device */int (*open)(const stru

6、ct hw_module_t* module, const char* id,struct hw_device_t* device); hw_module_methods_t;只定义了一个 open 方法,其中调用的设备结构体参数 hw_device_t 定义如下:typedef struct hw_device_t /* tag must be initialized to HARDWARE_DEVICE_TAG */uint32_t tag;/* version number for hw_device_t */uint32_t version;/* reference to the mo

7、dule this device belongs to */struct hw_module_t* module;/* padding reserved for future use */uint32_t reserved12;/* Close this device */int (*close)(struct hw_device_t* device); hw_device_t;hw_get_module 函数声明如下:int hw_get_module(const char *id, const struct hw_module_t *module);参数 id 为模块标识,定义在 /har

8、dware/libhardware/include/hardware 目录下的硬件模块头文件中,参数 module 是硬件模块地址,定义了/hardware/libhardware/include/hardware/hardware.h 中(2)hardware.c 中主要是定义了 hw_get_module 函数如下:#define HAL_LIBRARY_PATH “/system/lib/hw“static const char *variant_keys = “ro.hardware“,“ro.product.board“,“ro.board.platform“,“ro.arch“;s

9、tatic const int HAL_VARIANT_KEYS_COUNT =(sizeof(variant_keys)/sizeof(variant_keys0);int hw_get_module(const char *id, const struct hw_module_t *module) int status;int i;const struct hw_module_t *hmi = NULL;char propPATH_MAX;char pathPATH_MAX;for (i=0 ; iHAL_VARIANT_KEYS_COUNT+1 ; i+) if (i HAL_VARIA

10、NT_KEYS_COUNT) if (property_get(variant_keysi, prop, NULL) = 0) continue;snprintf(path, sizeof(path), “%s/%s.%s.so“,HAL_LIBRARY_PATH, id, prop); else snprintf(path, sizeof(path), “%s/%s.default.so“,HAL_LIBRARY_PATH, id);if (access(path, R_OK) continue;/* we found a library matching this id/variant *

11、/break;status = -ENOENT;if (i HAL_VARIANT_KEYS_COUNT+1) /* load the module, if this fails, were doomed, and we should not try* to load a different variant. */status = load(id, path, module);return status;从源代码我们可以看出,hw_get_module 完成的主要工作是根据模块 id 寻找硬件模块动态连接库地址,然后调用 load 函数去打开动态连接库并从动态链接库中获取硬件模块结构体地址。硬

12、件模块路径格式如下:HAL_LIBRARY_PATH/id.prop.soHAL_LIBRARY_PATH 定义为/system/lib/hwid 是 hw_get_module 函数的第一个参数所传入 ,prop 部分首先按照 variant_keys 数组中的名称逐一调用 property_get 获取对应的系统属性,然后访问 HAL_LIBRARY_PATH/id.prop.so,如果找到能访问的就结束,否则就访问HAL_LIBRARY_PATH/id.default.so举例如下:假定访问的是背光模块,id 定义为 “lights“则系统会按照如下的顺序去访问文件:/system/li

13、b/hw/lights.ro.hardware 属性值.so/system/lib/hw/lights.ro.product.board 属性值.so/system/lib/hw/lights.ro.board.platform 属性值.so/system/lib/hw/lights.ro.arch 属性值 .so/system/lib/hw/lights.default.so所以开发硬件模块的时候 Makefile 文件(Android.mk)中模块的命名 LOCAL_MODULE 要参考上面的内容,否则就会访问不到没作用了。load 函数的关键部分代码如下:handle = dlopen(

14、path, RTLD_NOW); /打开动态链接库if (handle = NULL) char const *err_str = dlerror();LOGE(“load: module=%sn%s“, path, err_str?err_str:“unknown“);status = -EINVAL;goto done;const char *sym = HAL_MODULE_INFO_SYM_AS_STR;hmi = (struct hw_module_t *)dlsym(handle, sym); /从动态链接库中获取硬件模块结构体的指针if (hmi = NULL) LOGE(“lo

15、ad: couldnt find symbol %s“, sym);status = -EINVAL;goto done;HAL_MODULE_INFO_SYM_AS_STR 是硬件模块在动态链接库中的标志,定义在hardware.h 中如下:#define HAL_MODULE_INFO_SYM HMI#define HAL_MODULE_INFO_SYM_AS_STR “HMI“4,硬件模块硬件模块的开发主要是完成/hardware/libhardware/include/hardware 目录下对应的头文件中的内容,主要是硬件模块头文件和 hardware.h 中的结构体中定义了一些函数指针,调用内核提供的接口将具体的函数实现,然后编译成指定名称的动态链接库放到/system/lib/hw 目录下即可。用一句话来概括:硬件模块的开发就是定义一个 hardware.h 中定义的 hw_module_t 结构体,结构体名称为宏 HAL_MODULE_INFO_SYM,然后实现结构体的相关内容即可。5,内核驱动主要是要向用户层开放接口,让硬件模块和内核可以交互。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报