<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于安卓的非標(biāo)準(zhǔn)驅(qū)動程序設(shè)計

          基于安卓的非標(biāo)準(zhǔn)驅(qū)動程序設(shè)計

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

          基于安卓的非標(biāo)準(zhǔn)驅(qū)動程序設(shè)計
          從LED控制功能的架構(gòu)來分,整個功能可以分成五個模塊:LED驅(qū)動模塊、LED Stub模塊、LED本地服務(wù)模塊、LED服務(wù)管理模塊和LED應(yīng)用模塊。

          2.2 HAL中的Stub的設(shè)計與實現(xiàn)

          圖4是LED Stub的實現(xiàn)過程。LED Stub是中LED控制的代理,當(dāng)LED控制的本地服務(wù)需要調(diào)用LED Stub時,通過函數(shù)hw_get_module( )結(jié)合LED Stub的模塊ID向HAL申請LED Stub,本地服務(wù)獲得Stub對象后,可以把Stub看作一個抽象硬件進行操作。
          基于安卓的非標(biāo)準(zhǔn)驅(qū)動程序設(shè)計
          下面是定義LED Stub的HAL結(jié)構(gòu)體:
          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);
          }

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

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

          回調(diào)函數(shù)指針“*ns_set_on”和“*ns_set_off”分別指向?qū)崿F(xiàn)函數(shù)hal_ led_on()和hal_led_off(),在實現(xiàn)函數(shù)中通過系統(tǒng)調(diào)用ioctl()對LED燈進行開關(guān)控制。

          2.3 硬件控制服務(wù)的JNI實現(xiàn)

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


          上一頁 1 2 下一頁

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();