Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> [Android的系統移植與平台開發]HAL Stub框架分析

[Android的系統移植與平台開發]HAL Stub框架分析

編輯:關於android開發

框架分析

HAL stub的框架比較簡單,三個結構體、兩個常量、一個函數,簡稱321架構,它的定義在:

@hardware/libhardware/include/hardware/hardware.h

@hardware/libhardware/hardware.c

  1. /*   
  2. 每一個硬件都通過hw_module_t來描述,我們稱之為一個硬件對象。你可以去“繼承”這個hw_module_t,然後擴展自己的屬性,硬件對象必須定義為一個固定的名字:HMI,即:Hardware Module Information的簡寫,每一個硬件對象裡都封裝了一個函數指針open用於打開該硬件,我們理解為硬件對象的open方法,open調用後返回這個硬件對應的Operation interface。  
  3. */ 
  4. struct hw_module_t{  
  5.     uint32_t tag;           // 該值必須聲明為HARDWARE_MODULE_TAG  
  6.     uint16_t version_major; // 主版本號  
  7.     uint16_t version_minor;     // 次版本號  
  8.     const char *id;         //硬件id名,唯一標識module  
  9.     const char *name;       // 硬件module名字  
  10.     const char * author;        // 作者  
  11.     struct hw_module_methods_t* methods;    //指向封裝有open函數指針的結構體  
  12.     void* dso;              // module’s dso  
  13.     uint32_t reserved[32-7];    // 128字節補齊  
  14. };  
  15.  
  16. /*   
  17. 硬件對象的open方法描述結構體,它裡面只有一個元素:open函數指針  
  18. */ 
  19. struct hw_module_methods_t{  
  20.     // 只封裝了open函數指針  
  21.     int (*open)(const struct hw_module_t* module, const char * id,  
  22.         struct hw_device_t** device);  
  23. };  
  24.  
  25. /*  
  26. 硬件對象hw_module_t的open方法返回該硬件的Operation interface,它由hw_device_t結構體來描述,我們稱之為:該硬件的操作接口  
  27. */ 
  28. struct hw_device_t{  
  29.     uint32_t tag;               // 必須賦值為HARDWARE_DEVICE_TAG  
  30.     uint32_t version;               // 版本號  
  31.     struct hw_module_t* module; // 該設備操作屬於哪個硬件對象,可以看成硬件操作接口與硬件對象的聯系  
  32.     uint32_t reserved[12];          // 字節補齊  
  33.     int (*close)(struct hw_device_t* device);   // 該設備的關閉函數指針,可以看做硬件的close方法  
  34. };  
  35.  

上述三個結構之間關系緊密,每個硬件對象由一個hw_module_t來描述,只要我們拿到了這個硬件對象,就可以調用它的open方法,返回這個硬件對象的硬件操作接口,然後就可以通過這些硬件操作接口來間接操作硬件了。只不過,open方法被struct hw_module_methods_t結構封裝了一次,硬件操作接口被hw_device_t封裝了一次而已。

那用戶程序如何才能拿到硬件對象呢?

答案是通過硬件id名來拿。

我們來看下321架構裡的:兩個符號常量和一個函數:
 

 

 

  1. // 這個就是HAL Stub對象固定的名字  
  2. #define HAL_MODULE_INFO_SYM             HMI  
  3. // 這是字符串形式的名字  
  4. #define HAL_MODULE_INFO_SYM_AS_STR      "HMI"  
  5. //這個函數是通過硬件名來獲得硬件HAL Stub對象  
  6. int hw_get_module(const char *id, const struct hw_module_t **module);  
  7.  

 

當用戶調用hw_get_module函數時,第一個參數傳硬件id名,那麼這個函數會從當前系統注冊的硬件對象裡查找傳遞過來的id名對應的硬件對象,然後返回之。

從調用者的角度,我們基本上沒有什麼障礙了,那如何注冊一個硬件對象呢?

很簡單,只需要聲明一個結構體即可,看下面這個Led Stub注冊的例子:

  1. const struct led_module_t HAL_MODULE_INFO_SYM = {  
  2.     common: {   // 初始化父結構hw_module_t成員  
  3.         tag: HARDWARE_MODULE_TAG,  
  4.         version_major: 1,  
  5.         version_minor: 0,  
  6.         id: LED_HARDWARE_MODULE_ID,  
  7.         name: "led HAL Stub",  
  8.         author: "farsight",  
  9.         methods: &led_module_methods,  
  10.     },   
  11.     // 擴展屬性放在這兒  
  12. };  
  13.  

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved