1. 程式人生 > >上層APP呼叫底層硬體驅動過程解析

上層APP呼叫底層硬體驅動過程解析

APP應用程式->應用框架層->硬體抽象層-> 硬體驅動程式

一、硬體驅動層

            進入kernel/drivers資料夾中,建立一資料夾,放入驅動程式。包括標頭檔案,C檔案,Makefile,Kconfig。同時對drivers下的Makefile跟Kconfig進行相應的新增,這樣配置編譯選項後,即可編譯。編譯完後,可以在/dev,/proc,/sys/class中得到相應的檔案,其中dev下的檔案即為該裝置檔案。

二、硬體抽象層

            進入原始碼根目錄下的hardware/libhardware/include/hardware新建標頭檔案,在hardware/libhardware/modules中新建目錄,在該目錄下放入C檔案呼叫裝置檔案(open函式開啟/dev/XXX裝置檔案),最後在該目錄下建立Android.mk檔案,編譯後得到XXX.default.so檔案。重新打包後,system.img就包含我們定義的硬體抽象層模組XXX.default。

三、應用框架層

            進入frameworks/base/services/jni目錄,建立com_android_server_XXXService.cpp檔案(#include  以此呼叫抽象層方法 ),實現jni方法。com_android_server字首表示的是包名,表示硬體服務XXXService是放在frameworks/base/services/java目錄下的com/android/server目錄的。對同目錄下的onload.cpp檔案進行修改,這樣,在Android系統初始化時,就會自動載入該JNI方法呼叫表。同時修改該目錄下的Android.mk。

           進入到frameworks/base/core/java/android/os目錄,新增IXXXService.aidl介面定義檔案,該檔案提供功能函式。在frameworks/base目錄下的Android.mk新增該aidl檔案。進入frameworks/base/services/java/com/android/server目錄,新增XXXService.java(主要是通過呼叫JNI方法來提供硬體服務),修改同目錄的SystemServer.java檔案,在ServerThread::run函式中增加載入HelloService的程式碼。

          這樣,重新打包後的system.img系統映象檔案就在Application Frameworks層中包含了我們自定義的硬體服務XXXService了,並且會在系統啟動的時候,自動載入XXXService。這時,應用程式就可以通過Java介面來訪問Hello硬體服務了。

四、APP應用層

           用eclipse編寫應用層的APP。程式通過ServiceManager.getService("XXX")來獲得XXXService,接著通過IXXXService.Stub.asInterface函式轉換為IXXXService介面。然後把出R檔案的其他檔案都拷到/packages/experimental下,在該APP目錄下建立Android.mk檔案。編譯後安裝該生成的apk即可使用該程式呼叫底層硬體驅動。

          大概整個過程就這樣,上層app呼叫框架層的java介面,java介面通過jni呼叫硬體抽象層,硬體抽象層則通過開啟裝置檔案呼叫底層硬體驅動。