編輯:關於android開發
HAL stub的框架比較簡單,三個結構體、兩個常量、一個函數,簡稱321架構,它的定義在:
@hardware/libhardware/include/hardware/hardware.h
@hardware/libhardware/hardware.c
- /*
- 每一個硬件都通過hw_module_t來描述,我們稱之為一個硬件對象。你可以去“繼承”這個hw_module_t,然後擴展自己的屬性,硬件對象必須定義為一個固定的名字:HMI,即:Hardware Module Information的簡寫,每一個硬件對象裡都封裝了一個函數指針open用於打開該硬件,我們理解為硬件對象的open方法,open調用後返回這個硬件對應的Operation interface。
- */
- struct hw_module_t{
- uint32_t tag; // 該值必須聲明為HARDWARE_MODULE_TAG
- uint16_t version_major; // 主版本號
- uint16_t version_minor; // 次版本號
- const char *id; //硬件id名,唯一標識module
- const char *name; // 硬件module名字
- const char * author; // 作者
- struct hw_module_methods_t* methods; //指向封裝有open函數指針的結構體
- void* dso; // module’s dso
- uint32_t reserved[32-7]; // 128字節補齊
- };
- /*
- 硬件對象的open方法描述結構體,它裡面只有一個元素:open函數指針
- */
- struct hw_module_methods_t{
- // 只封裝了open函數指針
- int (*open)(const struct hw_module_t* module, const char * id,
- struct hw_device_t** device);
- };
- /*
- 硬件對象hw_module_t的open方法返回該硬件的Operation interface,它由hw_device_t結構體來描述,我們稱之為:該硬件的操作接口
- */
- struct hw_device_t{
- uint32_t tag; // 必須賦值為HARDWARE_DEVICE_TAG
- uint32_t version; // 版本號
- struct hw_module_t* module; // 該設備操作屬於哪個硬件對象,可以看成硬件操作接口與硬件對象的聯系
- uint32_t reserved[12]; // 字節補齊
- int (*close)(struct hw_device_t* device); // 該設備的關閉函數指針,可以看做硬件的close方法
- };
上述三個結構之間關系緊密,每個硬件對象由一個hw_module_t來描述,只要我們拿到了這個硬件對象,就可以調用它的open方法,返回這個硬件對象的硬件操作接口,然後就可以通過這些硬件操作接口來間接操作硬件了。只不過,open方法被struct hw_module_methods_t結構封裝了一次,硬件操作接口被hw_device_t封裝了一次而已。
那用戶程序如何才能拿到硬件對象呢?
答案是通過硬件id名來拿。
我們來看下321架構裡的:兩個符號常量和一個函數:
- // 這個就是HAL Stub對象固定的名字
- #define HAL_MODULE_INFO_SYM HMI
- // 這是字符串形式的名字
- #define HAL_MODULE_INFO_SYM_AS_STR "HMI"
- //這個函數是通過硬件名來獲得硬件HAL Stub對象
- int hw_get_module(const char *id, const struct hw_module_t **module);
當用戶調用hw_get_module函數時,第一個參數傳硬件id名,那麼這個函數會從當前系統注冊的硬件對象裡查找傳遞過來的id名對應的硬件對象,然後返回之。
從調用者的角度,我們基本上沒有什麼障礙了,那如何注冊一個硬件對象呢?
很簡單,只需要聲明一個結構體即可,看下面這個Led Stub注冊的例子:
- const struct led_module_t HAL_MODULE_INFO_SYM = {
- common: { // 初始化父結構hw_module_t成員
- tag: HARDWARE_MODULE_TAG,
- version_major: 1,
- version_minor: 0,
- id: LED_HARDWARE_MODULE_ID,
- name: "led HAL Stub",
- author: "farsight",
- methods: &led_module_methods,
- },
- // 擴展屬性放在這兒
- };
深入理解Activity啟動流程 深入理解Activity啟動流程(一)–Activity啟動相關類的類圖 Activity啟動時的概要交互
仿天天動聽5應用項目源碼,項目源碼這是一個高仿天天動聽5的android版音樂播放器,界面華麗功能完整,除了本地播放器應有的那些功能另外還添加了程序內直接在線匹配下載歌詞
基於鴻洋博客自定於View實現的android音量調節控件,android音量調節 1.在values建立attrs.xml,寫出你需要的屬性:  
Android項目實戰(二十九):酒店預定日期選擇,android酒店預定先看需求效果圖: 幾個需求點: 1、顯示