第九章 硬件抽象层:HAL
Goggle為Android 加入HAL主要有如下目的:
統(tǒng)一硬件的調(diào)用接口。由于HAL有標(biāo)準(zhǔn)的調(diào)用接口,所以可以利用HAL屏蔽Linux驅(qū)動(dòng)復(fù)雜、不統(tǒng)一的接口。
解決了GPL版權(quán)問題。由于 Linux 內(nèi)核基于GPL協(xié)議,而Android基于Apache Licence 2 . 0協(xié)議。
針對(duì)一些特殊的要求。對(duì)于有些硬件,可能需要訪問一些用戶空間的資源,或在內(nèi)核空間不方便完成的工作以及特殊需求。
第 1 步: 編寫 Linux 驅(qū)動(dòng);第 2 步:編寫 HAL Library;第 3 步:編寫 Service Library
基本原理是只從指定存器讀取或?qū)懭?個(gè)字節(jié).第 1 個(gè)字節(jié)用于指定讀寫的動(dòng)作以及寄存器類型.后 4 個(gè)字節(jié)是讀寫的實(shí)際的數(shù)據(jù)(因?yàn)長(zhǎng)ED驅(qū)動(dòng)只涉及操作一個(gè)int類型數(shù)據(jù)的寄存器 ,因此使用4個(gè)字節(jié)來表示一個(gè)int類型的數(shù)據(jù)〉。 在與LED驅(qū)動(dòng)交互時(shí),只要向設(shè)備文件(/dev/s3c64IO_leds_hal) 讀取或發(fā)送 5 個(gè)字節(jié)的數(shù)據(jù),就可以讀寫指定的寄存器。
在編寫 Linux 驅(qū)動(dòng)以及與驅(qū)動(dòng)相關(guān)的程序的過程中應(yīng)分段測(cè)試每一部分程序。
使用下面的命令執(zhí)行相應(yīng)目錄中的build.sh腳本文件,即可測(cè)試LED代碼的準(zhǔn)確性:sh build.sh
編寫 HAL模塊的步驟和原理如下:
第l步:定義結(jié)構(gòu)體和宏:編寫 HAL 模塊需要使用到 3 個(gè)非常重要的結(jié)構(gòu)體( hw_module_t 、 hw_device_t 和hw _ module_ method_ t), 在第 l 步需要定義兩個(gè)新的結(jié)構(gòu)體, 這兩個(gè)結(jié)構(gòu)體的第 l 個(gè)變量的數(shù)據(jù)類型必須是 hw_module_t和 bw_device_t。 除此之外, 還需要為HAL模塊定義一個(gè)ID. 實(shí)際上在這 l 步就是編寫leds_hal.h 頭文件的代碼。
第 2 步:編寫 HAL模塊的 open 函數(shù):
- open 函數(shù)是 HAL 模塊的入口點(diǎn)。該函數(shù)主要做如下 3 項(xiàng)工作:初始化 hw device_t 的子結(jié)構(gòu)體。打開設(shè)備文件。初始化寄存器。
第3 步:定義 hw_module_methods_ t 結(jié)構(gòu)體變量
第4 步: 定義 HAL_MODULE_INFO_SYM 變量
第5步:編寫 HAL模塊的 close 函數(shù)
第 6步:編寫控制 LED 的函數(shù)
調(diào)用 HAL 模塊涉及一個(gè)非常重要的 hw_get_ module 函數(shù)。該函數(shù)可以通過在 leds_hal.h 中定義的 LED_HARDWARE_MODULE_ID 宏查找LED HAL 模塊,并獲得 led_module_t 結(jié)構(gòu)體。然后調(diào)用led _module_ t.hw _ module.methods.open 函數(shù)來初始化 LED 驅(qū)動(dòng), 并通過 open 函數(shù)返回 led_control_device_t 結(jié)構(gòu)體。在 led_control_device_ t 結(jié)構(gòu)體中包含了在 HAL 模塊中定義的控制 LED 驅(qū)動(dòng)的函數(shù)指針(set_on 和 set_off)。
HAL 棋塊庫文件的存放路徑有兩個(gè): /system/lib/hw 和/vendor/lib/hw。 hw_get_module 函數(shù)會(huì)先從/system/lib/hw 目錄根據(jù)庫文件命名規(guī)則尋找?guī)煳募H绻?#xff0f;system/lib/hw 目錄中未找到庫文 件, hw_get_ module 會(huì)按同樣的規(guī)則在/vendor/lib/hw 目錄中尋找.
? HAL 模塊庫文件的命名規(guī)則是 ID.suffix.so。其中 ID 通過 hw_get_ module 函數(shù)的 id 參數(shù)指 定。 suffix (后綴〉通過屬性文件指定。
? hw _get_module 會(huì)在 Android 系統(tǒng)的屬性文件中根據(jù) variant_keys 數(shù)組中定義的 4 個(gè) key 依次查找 suffix. 如果未找到 suffix, 使用默認(rèn)的 suffix (default)。
實(shí)際上, Android 系統(tǒng)的屬性文件具有如下4 個(gè):
?/default.prop;/system/build.prop; /system/default.prop; /data/local.prop.
可以將調(diào)用 Service程序庫的 Java 類單獨(dú)封裝在jar文件中,這樣做任何的 Android 應(yīng)用程序中只要引用了這個(gè)jar文件就可以像調(diào)用普通Java 類一樣訪問 LED 驅(qū)動(dòng)了.
本節(jié)實(shí)現(xiàn)的測(cè)試程序?qū)⑼ㄟ^調(diào)用 LedHalService.setOn 和 LedHalService.setOff方法控制 LED.
轉(zhuǎn)載于:https://www.cnblogs.com/beatrice/p/5656052.html
總結(jié)
以上是生活随笔為你收集整理的第九章 硬件抽象层:HAL的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开启本地MySql数据库远程连接
- 下一篇: slf4j 和 log4基础入门(Mav