Android 怎么样调用HAL的
Android 怎么样调用HAL的
Android HAL 是如何被调用的
Android对硬件的调用,google推荐使用HAL的方式进行调用,对于Andriod HAL的写法,可以参考android源码里的hardware目录下几个模块的模版。
在看HAL的编写方法的过程中,会发现整个模块貌似没有一个入口。一般说来模块都要有个入口,比如应用程序有main函数,可以为加载器进行加载执行,dll文件有dllmain,而对于我们自己写的动态链接库,我们可以对库中导出的任何符号进行调用。
问题来了,Android中的HAL是比较具有通用性的,需要上层的函数对其进行加载调用,Android的HAL加载器是如何实现对不同的Hardware Module进行通用性的调用的呢?
带着这个疑问查看Android源码,会发现Android中实现调用HAL是通过hw_get_module实现的。
int hw_get_module(const char *id, const struct hw_module_t **module);
这是其函数原型,id会指定Hardware的id,这是一个字符串,比如sensor的id是
#define SENSORS_HARDWARE_MODULE_ID “sensors”,如果找到了对应的hw_module_t结构体,会将其指针放入*module中。看看它的实现。
Java代码:
- for (i=0 ; i if (i < HAL_VARIANT_KEYS_COUNT) {
- //获取ro.hardware/ro.product.board/ro.board.platform/ro.arch等key的值。
- if (property_get(variant_keys[i], prop, NULL) == 0) {
- continue;
- }
- snprintf(path, sizeof(path), "%s/%s.%s.so",
- HAL_LIBRARY_PATH, id, prop);
- //如果开发板叫做mmdroid,那么这里的path就是system/lib/hw/sensor.mmdroid.so
- } else {
- snprintf(path, sizeof(path), "%s/%s.default.so",
- HAL_LIBRARY_PATH, id);//默认会加载/system/lib/hw/sensor.default.so
- }
- if (access(path, R_OK)) {
- continue;
- }
- /* we found a library matching this id/variant */
- break;
- }
- status = -ENOENT;
- if (i < HAL_VARIANT_KEYS_COUNT+1) {
- /* load the module, if this fails, we're doomed, and we should not try
- * to load a different variant. */
- status = load(id, path, module);//调用load函数打开动态链接库
- }
|
评论暂时关闭