Chinaunix首页 | 论坛 | 博客
  • 博客访问: 37156
  • 博文数量: 11
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-15 10:09
文章分类

全部博文(11)

文章存档

2015年(2)

2014年(9)

我的朋友

分类: Android平台

2014-09-01 10:49:57

转自:http://hi.baidu.com/xdyang1986/blog/item/1681d3d4ef4a63d251da4bd5.html


这个函数的主要功能是根据模块ID寻找硬件模块动态链接库德地址,然后调用load去打开动态链接库并从中获取硬件模块结构体地址。具体的源码如下:

代码@/hardware/libhardware/hardware.c

  1. int hw_get_module(const char *id, const struct hw_module_t **module)  
  2.   
  3. 120 {  
  4.   
  5. 121     int status;  
  6.   
  7. 122     int i;  
  8.   
  9. 123     const struct hw_module_t *hmi = NULL;  
  10.   
  11. 124     char prop[PATH_MAX];  
  12.   
  13. 125     char path[PATH_MAX];  
  14.   
  15.     /* Loop through the configuration variants looking for a module */  
  16.   
  17. 135     for (i=0 ; i
  18.   
  19. /* 
  20.  
  21. *这个地方我们来看一下下面将要用到的一个数组variant_keys,因为HAL_VARIANT_KEYS_COUNT这个就是 
  22.  
  23. *数组variant_keys的大小。 
  24.  
  25. * 
  26.  
  27. *44 static const char *variant_keys[] = { 
  28.  
  29. * 45     "ro.hardware",  /* This goes first so that it can pick up a different 
  30.  
  31. * 46                        file on the emulator. */  
  32.   
  33. * 47     "ro.product.board",  
  34.   
  35. * 48     "ro.board.platform",  
  36.   
  37. *  49     "ro.arch"  
  38.   
  39. * 50 };  
  40.   
  41. *这里我们记住这个数组,下面我就将用到它。   
  42.   
  43. */  
  44.   
  45. 136         if (i < HAL_VARIANT_KEYS_COUNT) {  
  46.   
  47. 137             if (property_get(variant_keys[i], prop, NULL) == 0) {  
  48.   
  49. 138                 continue;  
  50.   
  51. 139             }  
  52.   
  53. /* 
  54.  
  55. *这个地方prop得到的就似乎相应的权限,variant_keys[i]对应的如下: 
  56.  
  57. * 
  58.  
  59. *trout\msm7k\ARMV6就是这三个值,那个ro.hardware没有找到。这个地方我也是看注册的,没有弄懂 
  60.  
  61. *知道的同学指教一些,谢谢。 
  62.  
  63. */  
  64.   
  65. 140             snprintf(path, sizeof(path), "%s/%s.%s.so",//把相应的路径及文件名保存到path中  
  66.   
  67. 141                     HAL_LIBRARY_PATH, id, prop);  
  68.   
  69. /* 
  70.  
  71. *看到没有,这个地方其实就是把HAL_LIBRARY_PATH/id.***.so保存到path中,其中***就是上面我们所分析的variant_keys各个元素所对应的值。 
  72.  
  73. */  
  74.   
  75. 142         } else {  
  76.   
  77. /* 
  78.  
  79. *这个地方就体现了为什么我们上面for循环用的是HAL_VARIANT_KEYS_COUNT+1而不是*HAL_VARIANT_KEYS_COUNT。因为我们在最后还有加载一个default的属性。 
  80.  
  81. */  
  82.   
  83. 143             snprintf(path, sizeof(path), "%s/%s.default.so",  
  84.   
  85. 144                     HAL_LIBRARY_PATH, id);  
  86.   
  87. 145         }  
  88.   
  89. 146         if (access(path, R_OK)) {  
  90.   
  91. 147             continue;  
  92.   
  93. 148         }  
  94.   
  95. 149         /* we found a library matching this id/variant */  
  96.   
  97. 150         break;  
  98.   
  99. 151     }  
  100.   
  101. 152  
  102.   
  103. 153     status = -ENOENT;  
  104.   
  105. 154     if (i < HAL_VARIANT_KEYS_COUNT+1) {  
  106.   
  107. 155         /* load the module, if this fails, we're doomed, and we should not try 
  108.  
  109. 156          * to load a different variant. */  
  110.   
  111. 157         status = load(id, path, module);//load相应库。并把它们的HMI保存到module中。//具体见西分析  
  112.   
  113. 158     }  
  114.   
  115. 159  
  116.   
  117.   return status;  
  118.   
  119. 161 }  
阅读(1136) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~