新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于安卓的非標準驅動程序設計

        基于安卓的非標準驅動程序設計

        作者: 時間:2013-10-23 來源:網絡 收藏

        基于安卓的非標準驅動程序設計
        從LED控制功能的架構來分,整個功能可以分成五個模塊:LED驅動模塊、LED Stub模塊、LED本地服務模塊、LED服務管理模塊和LED應用模塊。

        2.2 HAL中的Stub的設計與實現

        圖4是LED Stub的實現過程。LED Stub是中LED控制的代理,當LED控制的本地服務需要調用LED Stub時,通過函數hw_get_module( )結合LED Stub的模塊ID向HAL申請LED Stub,本地服務獲得Stub對象后,可以把Stub看作一個抽象硬件進行操作。
        基于安卓的非標準驅動程序設計
        下面是定義LED Stub的HAL結構體:
        struct led_module_t {
        struct hw_module_t common;
        }
        struct led_module_t {
        struct hw_module_t common;
        int fd;
        int(*ns_set_on)(struct led_control_device_t*dev,int32_t led);
        int(*ns_set_off)(struct led_control_device_t*dev,int32_t led);
        }

        將結構體led_module_t初始化一個實例名為HAL_MODULE_INFO_SYM,這個名稱不能修改,實例里包含了Stub的模塊信息,主要包括:

        tag:標記了結構體的類型,這里的值為HARDWARE_MODULE_TAG;
        id:LED Stub的模塊ID,在本地服務向HAL獲取Stub時調用的函數hw_get_module()中,通過這里的id查找LED Stub;
        methods:是結構體hw_module_methods_t的實例,為HAL定義回調函數open()。
        這里的open()函數是一個必須實現的回調函數接口,在本地服務獲得Stub對象后調用,它負責申請結構體led_control_device_t的空間,填充信息,注冊具體操作的回調函數接口并打開LED驅動。
        結構體led_control_device_t繼承了hw_device_t,在open()函數調用時填充的主要信息包括:
        tag:結構體的類型,這里的值為HARDWARE_DEVICE_TAG;
        module:Stub的模塊,也就是實例HAL_MODULE_INFO_SYM中的hw_module_t部分;
        close:釋放LED Stub的回調函數;
        fd:打開設備驅動文件返回的文件描述符;
        ns_set_on:打開LED燈的回調函數指針;
        ns_set_off:關閉LED燈的回調函數指針。

        回調函數指針“*ns_set_on”和“*ns_set_off”分別指向實現函數hal_ led_on()和hal_led_off(),在實現函數中通過系統調用ioctl()對LED燈進行開關控制。

        2.3 硬件控制服務的JNI實現

        LED控制本地庫編譯后為“libled.so”保存在文件系統的“/sysem/lib/”目錄下面,LED控制服務的進程運行后由虛擬機實例裝入本地庫,具體實現過程如圖5所示。
        基于安卓的非標準驅動程序設計
        LED控制服務調用System.load()函數,它的虛擬機實例就會裝入LED控制本地庫,虛擬機會首先調用 JNI_OnLoad()函數完成:
        (1) 把虛擬機環境信息保存到本地庫的一個結構體“JNIEnv”的實例中;
        (2) 建立一個應用層中的LED控制服務與本地庫的JNI函數表;
        (3) 返回虛擬機本地庫使用的JNI版本。
        加載完后,應用層中的LED控制服務就可以通過虛擬機中的JNI函數表把運行的Java函數轉換為本地函數執行。在LED控制服務類中定義有JNI函數的方式,例如下面的代碼段:
        public final class LedService extends IledService.Stub {
        …….
        static {
        System.load(“/system/lib/libled.so”);
        }
        ……
        private static native boolean as_init();
        private static native boolean as_set_on(int led);
        private static native boolean as_set_off(int led);
        }

        本文的研究工作是在S3C2440開發板上進行的,以給開發板上的LED燈增加驅動程序為例,展示了一種為平臺非標準硬件增加驅動程序的設計方案,對于實現其他設備的驅動具有一定的借鑒意義。由于各種硬件設備及其接口差異較大,本文著重于驅動程序的設計方案,沒有討論相關的硬件接口驅動細節。隨著Android平臺日漸成熟以及應用數量的增加,它在嵌入式領域的應用范圍將會更加廣泛。為Android設備編寫不同于標準Linux系統的設備驅動程序會變得越來越多。


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 鹤壁市| 德昌县| 大兴区| 阿勒泰市| 泽州县| 井研县| 且末县| 靖边县| 尖扎县| 丘北县| 夏河县| 内黄县| 凉城县| 浪卡子县| 舞钢市| 远安县| 北安市| 乌兰县| 嵊州市| 察哈| 文成县| 清涧县| 英吉沙县| 始兴县| 临沭县| 开鲁县| 连江县| 灵川县| 隆子县| 玛曲县| 且末县| 察哈| 离岛区| 琼结县| 安康市| 竹山县| 汤原县| 同德县| 浠水县| 东宁县| 白银市|