Android HAL層與Linux Kernel層驅動開發簡介


近日稍微對Android中的驅動開發做了一些簡要的了解。

這里寫圖片描述

HAL:Hardware Abstract Layer 硬件抽象層,由於Linux Kernel需要遵循GPL開源協議,硬件廠商為了保護自己硬件方面的各項參數不被外泄,而一個設備的驅動程序包含了硬件的一些重要參數,所以驅動的開源勢必會使硬件廠商蒙受損失,Google為了保護硬件廠商的利益,所以在Android系統中加入了HAL層,在HAL層中不必遵循GPL協議,所以代碼可以封閉。 
所以如果硬件驅動開源的寫在Kernel里,Framework直接調用,而不願意開源的就寫在HAL層里,實現閉源。

那究竟HAL怎樣實現閉源的呢?我們來畫個簡圖.(注意:本文只提供攥寫驅動的大致思路,不對細節代碼負責。) 
這里寫圖片描述

一,編寫驅動期以及LoadingTime: 
編寫驅動分為兩個部分,一個是HAL層的驅動代碼,一個是Kernel層的驅動代碼。

1,HAL框架提供了三個結構體,分別為hw_device_t , hw_module_t ,hw_module_methods_t。 
編寫HAL層驅動首先要依據這三個結構體作擴展,我們創建自己驅動的device_t,module_t代碼,並且寫hw_module_methods_t這個結構體中方法的實現代碼,這個部分叫做HAL Stub,編寫此部分驅動分為三個步驟: 
第一,創建myDeviceModel實例,第二,將hw_module_methods_t指針設定給myDeviceModel,實現hw_module_methods_t這個函數表里函數的代碼.

2,在Kernel層框架同樣提供了多個結構體(module,file,file_operations,cdev),我們可以對系統提供的結構體進行擴展,或者直接使用系統的結構體。這個部分叫做Linux Kernel Stub,編寫此部分代碼分為多個步驟:第一,創建myFile實例,第二 設定file_operations指針給myFile,第三 寫file_operations這個函數表中函數的實現代碼即開源部分代碼,第四,創建myDeviceModule裝配 cdev與myFile。

3,寫完以后編譯系統即將驅動封裝載入系統中,裝在過程首先會調用myDeviceModule的init,完成內核stub的載入,Hal層完成了對myDevice的創建.

二,調用驅動期(RunTime): 
上面提到在HAL層我們編寫了HAL_STUB部分,我們來分析下系統究竟怎么調用到硬件的,首先我們使用HAL框架為我們提供的函數get到我們寫的HALStub層的myDeviceModule,通過myDeviceModule獲取到myDevice,調用myDevice的setData或者getData方法,然后調用封閉代碼區的函數,封閉代碼區會調用systemCall調用linux內核的read(),write()函數,read(),write()往下就是硬件了。

總結:HALStub與KernelSutb部分為廠商開源部分,mydevice.so為閉源部分.本文只是對驅動開發思路以及代碼執行流程作了個簡介,如有錯誤的地方還請指正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM