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代码:

  1. for (i=0 ; i if (i < HAL_VARIANT_KEYS_COUNT) {   
  2. //获取ro.hardware/ro.product.board/ro.board.platform/ro.arch等key的值。   
  3. if (property_get(variant_keys[i], prop, NULL) == 0) {   
  4. continue;   
  5. }   
  6. snprintf(path, sizeof(path), "%s/%s.%s.so",   
  7. HAL_LIBRARY_PATH, id, prop);   
  8. //如果开发板叫做mmdroid,那么这里的path就是system/lib/hw/sensor.mmdroid.so   
  9. else {   
  10. snprintf(path, sizeof(path), "%s/%s.default.so",   
  11. HAL_LIBRARY_PATH, id);//默认会加载/system/lib/hw/sensor.default.so   
  12.   
  13. }   
  14. if (access(path, R_OK)) {   
  15. continue;   
  16. }   
  17. /* we found a library matching this id/variant */  
  18. break;   
  19. }   
  20. status = -ENOENT;   
  21. if (i < HAL_VARIANT_KEYS_COUNT+1) {   
  22. /* load the module, if this fails, we're doomed, and we should not try  
  23. * to load a different variant. */  
  24. status = load(id, path, module);//调用load函数打开动态链接库   
  25. }   
  • 1
  • 2
  • 3
  • 下一页

相关内容