android系统开发(六)-HAL层开发基础
Android HAL層,即硬件抽象層,是Google響應(yīng)廠家“希望不公開源碼”的要求推出的新概念 
 1,源代碼和目標(biāo)位置 
 源代碼: /hardware/libhardware目錄,該目錄的目錄結(jié)構(gòu)如下: 
 /hardware/libhardware/hardware.c編譯成libhardware.so,目標(biāo)位置為/system/lib目錄 
 /hardware/libhardware/include/hardware目錄下包含如下頭文件: 
 hardware.h 通用硬件模塊頭文件 
 copybit.h copybit模塊頭文件 
 gralloc.h gralloc模塊頭文件 
 lights.h 背光模塊頭文件 
 overlay.h overlay模塊頭文件 
 qemud.h qemud模塊頭文件 
 sensors.h 傳感器模塊頭文件 
 /hardware/libhardware/modules目錄下定義了很多硬件模塊 
 這些硬件模塊都編譯成xxx.xxx.so,目標(biāo)位置為/system/lib/hw目錄
2,HAL層的實(shí)現(xiàn)方式 
 JNI->通用硬件模塊->硬件模塊->內(nèi)核驅(qū)動(dòng)接口 
 具體一點(diǎn):JNI->libhardware.so->xxx.xxx.so->kernel 
 具體來說:android frameworks中JNI調(diào)用/hardware/libhardware/hardware.c中定義的hw_get_module函數(shù)來獲取硬件模塊, 
 然后調(diào)用硬件模塊中的方法,硬件模塊中的方法直接調(diào)用內(nèi)核接口完成相關(guān)功能
3,通用硬件模塊(libhardware.so) 
 (1)頭文件為:/hardware/libhardware/include/hardware/hardware.h 
 頭文件中主要定義了通用硬件模塊結(jié)構(gòu)體hw_module_t,聲明了JNI調(diào)用的接口函數(shù)hw_get_module 
 hw_module_t定義如下: 
 typedef struct hw_module_t { 
 /* tag must be initialized to HARDWARE_MODULE_TAG / 
 uint32_t tag;
} hw_module_t; 
 硬件模塊方法結(jié)構(gòu)體hw_module_methods_t定義如下: 
 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; 
 只定義了一個(gè)open方法,其中調(diào)用的設(shè)備結(jié)構(gòu)體參數(shù)hw_device_t定義如下: 
 typedef struct hw_device_t { 
 /* tag must be initialized to HARDWARE_DEVICE_TAG / 
 uint32_t tag;
} hw_device_t; 
 hw_get_module函數(shù)聲明如下: 
 int hw_get_module(const char *id, const struct hw_module_t **module); 
 參數(shù)id為模塊標(biāo)識,定義在/hardware/libhardware/include/hardware目錄下的硬件模塊頭文件中, 
 參數(shù)module是硬件模塊地址,定義了/hardware/libhardware/include/hardware/hardware.h中
(2)hardware.c中主要是定義了hw_get_module函數(shù)如下:
#define HAL_LIBRARY_PATH "/system/lib/hw"static const char *variant_keys[] = { 
 “ro.hardware”, 
 “ro.product.board”, 
 “ro.board.platform”, 
 “ro.arch” 
 }; 
 static const int HAL_VARIANT_KEYS_COUNT = 
 (sizeof(variant_keys)/sizeof(variant_keys[0]));
int hw_get_module(const char *id, const struct hw_module_t **module) 
 { 
 int status; 
 int i; 
 const struct hw_module_t *hmi = NULL; 
 char prop[PATH_MAX]; 
 char path[PATH_MAX]; 
 for (i=0 ; i
4,硬件模塊 
 硬件模塊的開發(fā)主要是完成/hardware/libhardware/include/hardware目錄下對應(yīng)的頭文件中的內(nèi)容,主要是硬件模塊頭文件和hardware.h中 
 的結(jié)構(gòu)體中定義了一些函數(shù)指針,調(diào)用內(nèi)核提供的接口將具體的函數(shù)實(shí)現(xiàn),然后編譯成指定名稱的動(dòng)態(tài)鏈接庫放到/system/lib/hw目錄下即可。 
 用一句話來概括:硬件模塊的開發(fā)就是定義一個(gè)hardware.h中定義的hw_module_t結(jié)構(gòu)體,結(jié)構(gòu)體名稱為宏HAL_MODULE_INFO_SYM,然后實(shí)現(xiàn)結(jié)構(gòu)體 
 的相關(guān)內(nèi)容即可。
5,內(nèi)核驅(qū)動(dòng) 
 主要是要向用戶層開放接口,讓硬件模塊和內(nèi)核可以交互。
總結(jié)
以上是生活随笔為你收集整理的android系统开发(六)-HAL层开发基础的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 为什么计算机连不上无线网络,电脑连不上w
 - 下一篇: 应用wms仓库管理系统,提高第三方物流企