Android HAL分析報告

2021-05-22 13:21:36 字數 3777 閱讀 4327

1 hal簡介

android 的 hal(hardware abstract layer硬體抽象層)是google因應廠商「希望不公開原始碼」的要求下,所推出的新觀念,其架構如下圖。雖然 hal 現在的「抽象程度」還不足,現階段實作還不是全面符合 hal的架構規劃,不過也確實給了我們很好的思考空間。

圖1:android hal 架構規劃

這是 patrick brady (google) 在2008 google i/o 所發表的演講「anatomy & physiology of an android」中,所提出的 android hal 架構圖。從這張架構圖我們知道,hal 的目的是為了把 android framework 與 linux kernel 完整「隔開」。讓 android 不至過度依賴 linux kernel,有點像是「kernel independent」的意思,讓 android framework 的開發能在不考慮驅動程式的前提下進行發展。

在 android 原始碼裡,hal 主要的實作儲存於以下目錄:

1. libhardware_legacy/ - 過去的實作、採取鏈結庫模組的觀念進行

2. libhardware/ - 新版的實作、調整為 hal stub 的觀念

3. ril/ - radio inte***ce layer

在 hal 的架構實作成熟前(即圖1的規劃),我們先就目前 hal 現況做乙個簡單的分析。另外,目前 android 的 hal實作,仍舊散布在不同的地方,例如 camera、wifi 等,因此上述的目錄並不包含所有的 hal 程式**。

2 hal 的過去

圖2:android hal / libhardware_legacy

過去的 libhardware_legacy 作法,比較是傳統的「module」方式,也就是將 *.so 檔案當做「shared library」來使用,在runtime(jni 部份)以 direct function call 使用 hal module。透過直接函式呼叫的方式,來操作驅動程式。當然,應用程式也可以不需要透過 jni 的方式進行,直接以載入 *.so 檔(dlopen)的做法呼叫*.so 裡的符號(symbol)也是一種方式。總而言之是沒有經過封裝,上層可以直接操作硬體。

3 hal 的現況

圖3:android hal / libhardware

現在的 libhardware 作法,就有「stub」的味道了。hal stub 是一種**人(proxy)的概念,stub 雖然仍是以 *.so檔的形式存在,但 hal 已經將 *.so 檔隱藏起來了。stub 向 hal「提供」操作函式(operations),而 runtime 則是向 hal 取得特定模組(stub)的 operations,再 callback 這些操作函式。這種以 indirect function call 的實作架構,讓hal stub 變成是一種「包含」關係,即 hal 裡包含了許許多多的 stub(**人)。runtime 只要說明「型別」,即 module id,就可以取得操作函式。對於目前的hal,可以認為android定義了hal層結構框架,通過幾個介面訪問硬體從而統一了呼叫方式。

4 hal_legacy和hal的對比

5 hal module架構

hal moudle主要分為三個結構:

struct hw_module_t;

struct hw_module_methods_t;

struct hw_device_t;

他們的繼承關係如下圖:

圖4:android hal結構繼承關係

6 hal使用方法

(1)native code通過hw_get_module呼叫獲取hal stub:

hw_get_module (led_hardware_module_id, (const hw_module_t**)&module)

(2)通過繼承hw_module_methods_t的callback來open裝置:

module->methods->open(module,

led_hardware_module_id, (struct hw_device_t**)device);

(3)通過繼承hw_device_t的callback來控制裝置:

sleddevice->set_on(sleddevice, led);

sleddevice->set_off(sleddevice, led);

7 hal stub編寫方法

(1)定義自己的hal結構體,編寫標頭檔案led.h, hardware/hardware.h

struct led_module_t ;

struct led_control_device_t ;

繼承關係如下圖:

圖5:hal stub與hal module繼承關係

(2)設計led.c 完成功能實現和hal stub註冊

(2.1)led_module_methods繼承hw_module_methods_t,實現open的callback

struct hw_module_methods_t led_module_methods = ;

(2.2)用hal_module_info_sym例項led_module_t,這個名稱不可修改

tag:需要制定為 hardware_module_tag

id:指定為 hal stub 的 module id

methods:struct hw_module_methods_t,為 hal 所定義的「method」

const struct led_module_t hal_module_info_sym =

/* supporting apis go here. */

};(2.3)open是乙個必須實現的callback api,負責申請結構體空間,填充資訊,註冊具體操作api介面,開啟linux驅動。

由於存在多重繼承關係,只需對子結構體hw_device_t物件申請空間即可。

int led_device_open(const struct hw_module_t* module, const char* name,

struct hw_device_t** device)

(2.4)填充具體api操作**

int led_on(struct led_control_device_t *dev, int32_t led)

return 0;

}int led_off(struct led_control_device_t *dev, int32_t led)

return 0;

}來自: http://hi.baidu.com/aokikyon/blog/item/a66e0f87d8f55326c75cc32b.html

Android HAL 例 藍芽模組

1,hw module 裝置模組型別定義 hardware libhardware include hardware hardware.h 開啟hw module hardware.c int hw get module const char id,const structhw module t m...

android HAL層驅動對接例項

我們將通過裝置檔案 dev hello來連線硬體抽象層模組和linux核心驅動程式模組。二.進入到在hardware libhardware include hardware目錄,新建hello.h檔案 user name machine name android cd hardware libha...

Android HAL的被呼叫流程

每個硬體模組都有乙個包含hw module t 為第乙個成員 資料結構的例項,且例項的名字為 hal module info sym,它本身是乙個巨集定義,其定義如下 hardware.h 通用的東東都在hardware.h和hardware.c中 cpp view plain copy name ...