android HAL介面的編碼小結

來源:互聯網
上載者:User

android HAL介面的編碼小結
定義一個modulestruct xxx_module_t { hw_module_t common; xxx,這裡的主要是一些在未open時就可以操作該模組的ops介面,有時候可以不填充}
struct xxx_mdoule HAL_MODULE_INFO_SYM ={ 填充該結構體,以填充hw_module_t為主
}//所有的hal模組的名字都一樣,該結構在編譯時間會轉為一個hmi的描述符,供load對應的so時的使用。同時load的id要與hw_module_t相一致。
其中hw_module_t 的methods一般需要指定並實現一個open的介面,如下所示:typedef struct hw_module_methods_t { /** Open a specific device */
int (*open)(const struct hw_module_t* module, const char* id, struct hw_device_t** device);} hw_module_methods_t;

一般在open後需要返回一個模組需要用到的裝置xxx_device_t介面,一般結構如下,需要注意的是多重封裝時,也需要確保hw_device_t 位於返回首地址即可:typedef struct xxx_device_t { hw_device_t common; xxx各種可操作device的ops函數。 }或則class xxx_xxxx_t: public struct xxx_device_t{ xxx_xxx_t();}
在建構函式中xxx_xxxx_t(){ 完成對xxx_device_t 的初始化包括common和各種framework層需要的ops}
hw_device_t的結構體定義:typedef struct hw_device_t { uint32_t tag; uint32_t version; struct hw_module_t* module; uint32_t reserved[12]; int (*close)(struct hw_device_t* device);

} hw_device_t;

綜上所述,HAL是通過struct xxx_device_t這個結構體向上層提供介面的.

即:介面包含在struct xxx_device_t這個結構體內。

而具體執行是通過struct xxx_module_t HAL_MODULE_INFO_SYM這個結構體變數的函數列表成員下的open函數來返回給上層的.
附加:之所以將HAL所有的模組命名為HAL_MODULE_INFO_SYM原因在於該名字會被替換為一個宏名HMI,即最終編譯器對每一個模組的CPP進行組合生產so庫時,內部是由一個HMI的符號表存在的。而這個符號表再load module時會首先進行dlsym的操作,其中明確規定要尋找的符號入口為“HMI”,這就要求當前模組必須含有這個符號名。也就要求每一個HAL庫要確保自己的名字是HAL_MODULE_INFO_SYM因為只有這個名字才會被替換為HMI後編譯進入SO檔案中,從而被load出HMI的入口即hw_module_t.

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.