Android HAL 2019-11-26

最近要做的東西可能涉及HAL的概念,看看<<android源代碼情景分析 >>

Headware Abstract Layer (HAL)

  • 為什么Android的driver分UMD和KMD實(shí)現(xiàn)?
    如果實(shí)現(xiàn)在UMD,遵循Apache license就可以閉源,做HAL層。
    KMD遵循GPL,driver只提供簡(jiǎn)單硬件訪問(wèn)通道。

  • android體系:

Android體系
App
App framework
lib&Runtime
HAL
------------------上面是UMD,下面是KMD----------------------
HAL
Driver
Process/Memory manager

KMD Driver


HAL層

HAL層是一個(gè)硬件模塊,是一個(gè)動(dòng)態(tài)庫(kù)so,其命名有命名規(guī)范。
內(nèi)部:

結(jié)構(gòu)體
硬件抽象層 hw_module_t
硬件設(shè)備 hw_device_t

命名規(guī)范


結(jié)構(gòu)體定義規(guī)范

//.h 聲明結(jié)構(gòu)體:
//自定義模塊結(jié)構(gòu)體,開(kāi)頭包含hw_module_t,
struct freg_module_t {
    struct hw_module_t common; //里面有個(gè)hw_module_methods_t *method
};

//自定義設(shè)備結(jié)構(gòu)體,開(kāi)頭包含hw_device_t
struct freg_device_t {
    struct hw_device_t common;
    int fd;
    int (*own_func)();
};
//cpp 定義結(jié)構(gòu)體:
//hw_module_mothods_t只有一個(gè)int (*open) (strcut hw_module_t* module, id, strcut hw_device_t** device)
struct hw_module_mothods_t freg_module_methods = {
    .open : freg_device_open
};

struct freg_module_t HAL_MODULE_INFO_SYM = {
    .common: { //填hw_module_t的結(jié)構(gòu)體變量
        tag: HARDWARE_MODULE_TAG, //必須為此
        ...
        methods : &freg_module_methods, //傳了open方法
    }
}

int freg_device_open(struct hw_module_t *module, id, struct hw_device_t **device) {
    struct frag_device_t *dev;
    //填dev->common
    //填dev->ownFunc = ownFunc();
}

//定義ownFunc();
//Andriod.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TQAGS := optional
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
LOCAL_SHARED_LIBRARIES := liblog
LOCAL_SRC_FILES := freg.cpp
LOCAL_MODULE := freg.default
include $(BUILD_SHARED_LIBRARY)

HAL的加載

//誰(shuí)要使用HAL都要通過(guò)hw_get_module(struct hw_module_t **module)來(lái)拿到hw_module,
//這個(gè)module就是當(dāng)年定義的HAL_MODULE_INFO_SYM
int hw_get_module(id, struct hw_module_t **module)
{
    //asscess(path)查找可用路徑
    load(id, path, module);
}
int load(id, char *path, struct hw_module_t **pHmi)
{
    void *handle = dlopen(path, RTLD_NOW);
    //得到struct hal_module_info的地址
    const char *sym = HAL_MODULE_INFO_SYM;
    struct hw_module_t *hmi ;
    hmi = (struct hw_module_t *)dlsym(handle, sym);
    hmi->dso = handle;
    *pHmi = hmi;
}

Java Native Interface (JNI)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android系統(tǒng)對(duì)硬件設(shè)備的支持是分兩層的。一層實(shí)現(xiàn)在內(nèi)核空間中(只有內(nèi)核空間才有特權(quán)操作硬件設(shè)備),另一層實(shí)現(xiàn)...
    passerbywhu閱讀 772評(píng)論 0 0
  • 眾所周知,現(xiàn)代的計(jì)算機(jī)系統(tǒng)由硬件系統(tǒng)以及軟件系統(tǒng)兩個(gè)部分組成,再好的硬件,如果沒(méi)有軟件的支持,就不能發(fā)揮其應(yīng)有的作...
    哲影閱讀 3,098評(píng)論 0 5
  • 版權(quán)說(shuō)明:本文為 開(kāi)開(kāi)向前沖 原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處;注:限于作者水平有限,文中有不對(duì)的地方還請(qǐng)指教 注: An...
    開(kāi)開(kāi)向前沖閱讀 1,291評(píng)論 1 1
  • 轉(zhuǎn)載于 http://www.uml.org.cn/mobiledev/201211063.asp#2 功耗控制 ...
    ghroost閱讀 2,198評(píng)論 1 20
  • [TOC] 以下內(nèi)容基于Android 8.0 Project Treble Project treble是And...
    Joe_HUST閱讀 3,188評(píng)論 0 1

友情鏈接更多精彩內(nèi)容