<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于安卓的非標準驅動(dòng)程序設計

基于安卓的非標準驅動(dòng)程序設計

作者: 時(shí)間:2013-10-23 來(lái)源:網(wǎng)絡(luò ) 收藏

基于安卓的非標準驅動(dòng)程序設計
從LED控制功能的架構來(lái)分,整個(gè)功能可以分成五個(gè)模塊:LED驅動(dòng)模塊、LED Stub模塊、LED本地服務(wù)模塊、LED服務(wù)管理模塊和LED應用模塊。

2.2 HAL中的Stub的設計與實(shí)現

圖4是LED Stub的實(shí)現過(guò)程。LED Stub是中LED控制的代理,當LED控制的本地服務(wù)需要調用LED Stub時(shí),通過(guò)函數hw_get_module( )結合LED Stub的模塊ID向HAL申請LED Stub,本地服務(wù)獲得Stub對象后,可以把Stub看作一個(gè)抽象硬件進(jìn)行操作。
基于安卓的非標準驅動(dòng)程序設計
下面是定義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初始化一個(gè)實(shí)例名為HAL_MODULE_INFO_SYM,這個(gè)名稱(chēng)不能修改,實(shí)例里包含了Stub的模塊信息,主要包括:

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

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

2.3 硬件控制服務(wù)的JNI實(shí)現

LED控制本地庫編譯后為“l(fā)ibled.so”保存在文件系統的“/sysem/lib/”目錄下面,LED控制服務(wù)的進(jìn)程運行后由虛擬機實(shí)例裝入本地庫,具體實(shí)現過(guò)程如圖5所示。
基于安卓的非標準驅動(dòng)程序設計
LED控制服務(wù)調用System.load()函數,它的虛擬機實(shí)例就會(huì )裝入LED控制本地庫,虛擬機會(huì )首先調用 JNI_OnLoad()函數完成:
(1) 把虛擬機環(huán)境信息保存到本地庫的一個(gè)結構體“JNIEnv”的實(shí)例中;
(2) 建立一個(gè)應用層中的LED控制服務(wù)與本地庫的JNI函數表;
(3) 返回虛擬機本地庫使用的JNI版本。
加載完后,應用層中的LED控制服務(wù)就可以通過(guò)虛擬機中的JNI函數表把運行的Java函數轉換為本地函數執行。在LED控制服務(wù)類(lèi)中定義有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開(kāi)發(fā)板上進(jìn)行的,以給開(kāi)發(fā)板上的LED燈增加驅動(dòng)程序為例,展示了一種為平臺非標準硬件增加驅動(dòng)程序的設計方案,對于實(shí)現其他設備的驅動(dòng)具有一定的借鑒意義。由于各種硬件設備及其接口差異較大,本文著(zhù)重于驅動(dòng)程序的設計方案,沒(méi)有討論相關(guān)的硬件接口驅動(dòng)細節。隨著(zhù)Android平臺日漸成熟以及應用數量的增加,它在嵌入式領(lǐng)域的應用范圍將會(huì )更加廣泛。為Android設備編寫(xiě)不同于標準Linux系統的設備驅動(dòng)程序會(huì )變得越來(lái)越多。


上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>