《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 基于Windows CE的OLED驅(qū)動(dòng)程序設(shè)計(jì)與實(shí)現(xiàn)
基于Windows CE的OLED驅(qū)動(dòng)程序設(shè)計(jì)與實(shí)現(xiàn)
來(lái)源:微型機(jī)與應(yīng)用2011年第20期
王星全, 蘭明蛟, 鄭振華
(總參謀部通信訓(xùn)練基地,, 河北 張家口 075100)
摘要: 介紹了Windows CE 的體系結(jié)構(gòu)和中斷處理機(jī)制,,研究了Windows CE 設(shè)備驅(qū)動(dòng)程序的類型和初始化過(guò)程,以維信諾VGG13264C 132×64 OLED 顯示模塊的WindowsCE 驅(qū)動(dòng)程序設(shè)計(jì)為例,,詳細(xì)闡述了嵌入式Windows CE 驅(qū)動(dòng)程序的開發(fā)過(guò)程,。
Abstract:
Key words :

摘  要:介紹了Windows CE 的體系結(jié)構(gòu)和中斷處理機(jī)制,研究了Windows CE 設(shè)備驅(qū)動(dòng)程序的類型和初始化過(guò)程,,以維信諾VGG13264C 132×64 OLED 顯示模塊的WindowsCE 驅(qū)動(dòng)程序設(shè)計(jì)為例,,詳細(xì)闡述了嵌入式Windows CE 驅(qū)動(dòng)程序的開發(fā)過(guò)程
關(guān)鍵詞: Windows CE,; 驅(qū)動(dòng)模型,; OLED驅(qū)動(dòng)程序; 開發(fā)過(guò)程

    隨著計(jì)算機(jī)技術(shù)和嵌入式技術(shù)的迅猛發(fā)展,,嵌入式軟,、硬件設(shè)計(jì)需求越來(lái)越廣泛,嵌入式軟件開發(fā),,特別是嵌入式軟件的驅(qū)動(dòng)開發(fā),,成為一個(gè)熱點(diǎn)。
    Windows CE 是一個(gè)新的,、可移植的,、實(shí)時(shí)的,、模塊化的操作系統(tǒng)[1],具有簡(jiǎn)捷、高效的完全搶先式多任務(wù)操作核心,,支持強(qiáng)大的通信和圖形顯示功能,,能夠適應(yīng)廣泛的系統(tǒng)需求,在最新一代的工業(yè)和家用電子設(shè)備中得到了廣泛的應(yīng)用,。
    在進(jìn)行嵌入式Windows CE項(xiàng)目開發(fā)的過(guò)程中,,經(jīng)常需要根據(jù)需求定制顯示屏,如何為定制的顯示屏開發(fā)Windows CE驅(qū)動(dòng)程序成為嵌入式系統(tǒng)開發(fā)的關(guān)鍵步驟,。本文在深入研究Windows CE 驅(qū)動(dòng)程序工作原理的基礎(chǔ)上,,以維信諾VGG13264C 132×64 OLED 顯示模塊的WindowsCE 驅(qū)動(dòng)程序設(shè)計(jì)為例,詳細(xì)闡述了嵌入式Windows CE 驅(qū)動(dòng)程序的開發(fā)過(guò)程,,并對(duì)設(shè)計(jì)實(shí)現(xiàn)的驅(qū)動(dòng)程序進(jìn)行了測(cè)試,。
1 Window CE的系統(tǒng)體系結(jié)構(gòu)
    Windows CE是微軟設(shè)計(jì)開發(fā)的一種可升級(jí)的搶先式多任務(wù)32 位實(shí)時(shí)操作系統(tǒng)。一個(gè)基于Windows CE的平臺(tái)主要由以下幾部分組成:Windows CE內(nèi)核組件,、OAL層和驅(qū)動(dòng)程序,。OAL層和驅(qū)動(dòng)程序作為目標(biāo)設(shè)備和Windows CE內(nèi)核組件之間的接口,將操作系統(tǒng)上層與硬件隔離,,便于支持硬件擴(kuò)展和即插即用功能[2],,圖1詳細(xì)描述了三者之間的關(guān)系。

2 Windows CE中斷處理
    Windows CE將中斷處理分為兩個(gè)步驟:中斷服務(wù)例程(ISR)和中斷服務(wù)線程(IST)[3],。把每個(gè)硬件的設(shè)備中斷請(qǐng)求(IRQ)和一個(gè)ISR聯(lián)系起來(lái),,當(dāng)一個(gè)中斷發(fā)生并未被屏蔽時(shí),內(nèi)核調(diào)用該中斷注冊(cè)的ISR,。因?yàn)镮SR運(yùn)行于內(nèi)核模式,,所以應(yīng)設(shè)計(jì)得盡可能短,ISR引導(dǎo)內(nèi)核調(diào)度和啟動(dòng)合適的IST,,IST在設(shè)備驅(qū)動(dòng)程序軟件模塊中編寫,,運(yùn)行于用戶模式,它從硬件獲取或向硬件發(fā)送數(shù)據(jù)和控制代碼,,并進(jìn)一步處理設(shè)備中斷,。Windows CE還提供了中斷嵌套功能,即在一個(gè)ISR運(yùn)行時(shí),,內(nèi)核并不關(guān)閉中斷,,當(dāng)優(yōu)先級(jí)比之高的中斷發(fā)生時(shí),內(nèi)核保存當(dāng)前執(zhí)行的中斷服務(wù)例程ISR的運(yùn)行狀態(tài),,掛起該ISR,,轉(zhuǎn)而執(zhí)行更高優(yōu)先級(jí)中斷的ISR。等到高優(yōu)先級(jí)中斷的ISR執(zhí)行完后,被掛起的低優(yōu)先級(jí)中斷的ISR才重新開始被CPU調(diào)度執(zhí)行,。Windows CE的中斷處理框圖如圖2所示,。

3 Windows CE設(shè)備驅(qū)動(dòng)程序
    設(shè)備驅(qū)動(dòng)程序?qū)⒉僮飨到y(tǒng)和設(shè)備連接起來(lái),使操作系統(tǒng)能夠識(shí)別設(shè)備,,并為應(yīng)用程序提供服務(wù),。
3.1 設(shè)備驅(qū)動(dòng)程序模型
    Windows CE提供了用于驅(qū)動(dòng)開發(fā)的模型[4],其中包括來(lái)自其他操作系統(tǒng)的驅(qū)動(dòng)程序模型,。
    因?yàn)橛羞@些多變的驅(qū)動(dòng)程序模型,,使Windows CE可以適應(yīng)大部分的內(nèi)部和外圍設(shè)備。目前,,Windows CE提供了4種設(shè)備模型,,其中兩種是專用于Windows CE模型,另外兩種外部模型來(lái)自其他的操作系統(tǒng),,匯總?cè)鐖D3所示,。

3.2 本機(jī)驅(qū)動(dòng)程序

 


    要把Windows CE移植到目標(biāo)平臺(tái)上,必須為平臺(tái)上已建立的設(shè)備提供驅(qū)動(dòng)程序,。一些類型的設(shè)備,,如鍵盤、顯示器和PC卡插槽等對(duì)操作系統(tǒng)都有一個(gè)自定義接口,。因?yàn)檫@些接口是專門用于Windows CE的,,所以稱這類驅(qū)動(dòng)程序?yàn)楸緳C(jī)驅(qū)動(dòng)程序,。Windows CE 平臺(tái)生成器提供本機(jī)設(shè)備驅(qū)動(dòng)程序的樣本,,可考慮把本機(jī)設(shè)備驅(qū)動(dòng)程序樣本應(yīng)用到平臺(tái)上,而不需要再?gòu)念^開發(fā)自己的本機(jī)驅(qū)動(dòng)程序,。用戶可根據(jù)驅(qū)動(dòng)程序樣本快速開發(fā)自己的驅(qū)動(dòng)程序,。
3.3 流接口驅(qū)動(dòng)程序
    流接口驅(qū)動(dòng)程序由設(shè)備管理應(yīng)用程序加載、管理和卸載,,與具有單獨(dú)目的接口的本機(jī)驅(qū)動(dòng)程序相比,,所有流接口驅(qū)動(dòng)程序使用同一個(gè)接口并調(diào)用同一個(gè)函數(shù)集——流接口函數(shù)。流接口驅(qū)動(dòng)程序把外設(shè)抽象成一個(gè)文件,,使用標(biāo)準(zhǔn)文件I/O函數(shù)和電源管理函數(shù),,這些函數(shù)由Windows CE 操作系統(tǒng)的內(nèi)核使用。流接口驅(qū)動(dòng)程序的入口點(diǎn)函數(shù)為: XXX_ Init,、XXX_Deinit,、XXX_IOControl、XXX_Open,、XXX_Close,、 XXX_PowerDown、 XXX_PowerUp、XXX_Read,、XXX_Seek,、XXX_Write 。流接口驅(qū)動(dòng)程序函數(shù)的作用及調(diào)用關(guān)系如表1所示,。
    流接口驅(qū)動(dòng)程序從設(shè)備管理器和通過(guò)文件系統(tǒng)調(diào)用的應(yīng)用程序接受命令,,裝入驅(qū)動(dòng)將這些命令翻譯成其所控制設(shè)備的適當(dāng)操作的所有信息。所有的流接口驅(qū)動(dòng),,無(wú)論它管理的是內(nèi)置式設(shè)備還是可安裝式設(shè)備,,是系統(tǒng)引導(dǎo)加載還是動(dòng)態(tài)加載,它們與其他的系統(tǒng)組件都有類似的交互過(guò)程,。

3.4 設(shè)備驅(qū)動(dòng)程序的初始化過(guò)程
    在Windows CE中,,所有的設(shè)備驅(qū)動(dòng)程序都以動(dòng)態(tài)鏈接庫(kù)(DLL)的形式存在,需要通過(guò)進(jìn)程加載,。設(shè)備驅(qū)動(dòng)程序向外提供接口函數(shù),,應(yīng)用程序使用API對(duì)設(shè)備進(jìn)行訪問。Windows CE共有三類系統(tǒng)進(jìn)程用來(lái)加載驅(qū)動(dòng)程序:Device.exe,、GWES.exe,、FileSys.exe。驅(qū)動(dòng)程序的初始化過(guò)程為:設(shè)備上電——啟動(dòng)bootloader——啟動(dòng)NK.exe——啟動(dòng)Device.exe——初始化數(shù)據(jù)結(jié)構(gòu)和I/O——加載總線枚舉器——枚舉注冊(cè)表Driver/BuildIn下所有的子鍵,。這里的枚舉就是循環(huán)調(diào)用ActivateDeviceEx函數(shù)加載驅(qū)動(dòng)程序,。
4 Windows CE開發(fā)流接口驅(qū)動(dòng)程序?qū)嵗?/strong>
    以維信諾VGG13264C 132×64 OLED顯示模塊的驅(qū)動(dòng)程序?yàn)槔唧w闡述Windows CE驅(qū)動(dòng)開發(fā)的過(guò)程,。
4.1 硬件結(jié)構(gòu)
    系統(tǒng)硬件以飛凌OK6410-B開發(fā)板為主板,,以維信諾VGG13264C顯示模塊為OLED顯示屏。系統(tǒng)硬件框圖如圖4所示,。

    飛凌OK6410-B開發(fā)板基于三星公司最新的ARM11處理器S3C6410,,擁有強(qiáng)大的內(nèi)部資源和視頻處理能力,可穩(wěn)定運(yùn)行在667 MHz主頻以上,支持Mobile DDR和多種NAND Flash,。FL6410開發(fā)板上集成了多種高端接口,,如復(fù)合視頻信號(hào)、攝像頭,、USB,、SD卡、液晶屏,、以太網(wǎng)等,,豐富的接口可幫助用戶實(shí)現(xiàn)高端產(chǎn)品級(jí)設(shè)計(jì)。
    維信諾VGG13264C是132列×64行點(diǎn)陣的OLED單色,、字符,、圖形顯示模塊,使用單芯片SSD1303T6進(jìn)行驅(qū)動(dòng),具有8位并行數(shù)據(jù)接口,,模塊內(nèi)含132×64顯示數(shù)據(jù) RAM,通過(guò)用戶I/O接口連接到飛凌OK6410-B開發(fā)板,。
4.2 流接口驅(qū)動(dòng)程序開發(fā)過(guò)程
    Windows CE提供了兩種編寫流接口驅(qū)動(dòng)的方法:(1)通過(guò)編寫動(dòng)態(tài)鏈接庫(kù)的方法實(shí)現(xiàn); (2)通過(guò)修改BSP的方法實(shí)現(xiàn)。由于第二種方法可以加快開發(fā)進(jìn)度,,在該實(shí)例中,,使用修改BSP的方法進(jìn)行流接口驅(qū)動(dòng)程序開發(fā),其開發(fā)步驟為:首先在BSP中新建一個(gè)目錄,,編寫驅(qū)動(dòng)程序文件并確定驅(qū)動(dòng)程序向外提供的接口函數(shù),,然后進(jìn)行注冊(cè)表設(shè)置,最后進(jìn)行測(cè)試,。
     (1)驅(qū)動(dòng)程序代碼編寫
   設(shè)備初始化使用OED_Init函數(shù)實(shí)現(xiàn),,設(shè)備卸載使用OED_Deinit函數(shù)實(shí)現(xiàn)。在OED_Init函數(shù)中,,使用DrvLib_MapIoSpace函數(shù)實(shí)現(xiàn)物理地址到虛擬地址映射,;在OED_Deinit函數(shù)中,使用VirtualFree函數(shù)釋放驅(qū)動(dòng)程序使用的虛擬內(nèi)存從而實(shí)現(xiàn)了設(shè)備的卸載,。
  設(shè)備的I/O控制向設(shè)備發(fā)出命令,,按照維信諾VGG13264C OLED顯示模塊的時(shí)序關(guān)系,通過(guò)控制相應(yīng)管腳的電平高低實(shí)現(xiàn)向設(shè)備發(fā)出命令,。設(shè)備的I/O控制在OED_IOControl函數(shù)中實(shí)現(xiàn),,函數(shù)部分代碼如下:
  switch (dwIoControlCode) {
          case IOCTL_OLED_INIT:
          v_pIOPregs->GPPCON&=0xF000FFFF;
        v_pIOPregs->GPPCON|=0x5550000;
          ……
          Delay_ns(2);
          v_pIOPregs->GPEDAT|=(0x01<<4);
          Delay_ns(2);
        v_pIOPregs->GPEDAT|=(0x01<<2);
      break;
    case IOCTL_OLED_WRITECOMMAND:
          v_pIOPregs->GPEDAT&=~(0x01);               //A0低
        v_pIOPregs->GPEDAT|=(0x01<<3);            //CS高
        v_pIOPregs->GPEDAT|=(0x01<<1);           //WR高
        Delay_ns(1);
        v_pIOPregs->GPEDAT&=~(0x01<<3);         //CS低
        v_pIOPregs->GPEDAT&=~(0x01<<1);       //WR低
        if((0x01<<7)&(*pInBuf))
                    v_pIOPregs->GPQDAT|=(0x01<<6);
        else  v_pIOPregs->GPQDAT&=~(0x01<<6);
          ……
        Delay_ns(1);
        v_pIOPregs->GPEDAT|=(0x01<<1);           //WR高
               Delay_ns(1);
        v_pIOPregs->GPEDAT|=(0x01<<3);            //CS高
    break;
     case IOCTL_OLED_WRITEDATA:
        v_pIOPregs->GPEDAT|=(0x01);                  //A0高
       v_pIOPregs->GPEDAT|=(0x01<<3);            //CS高
          v_pIOPregs->GPEDAT|=(0x01<<1);           //WR高
          v_pIOPregs->GPEDAT&=~(0x01<<3);         //CS低
       v_pIOPregs->GPEDAT&=~(0x01<<1);        //WR低
          if((0x01<<7)&(*pInBuf))
               v_pIOPregs->GPQDAT|=(0x01<<6);
       else v_pIOPregs->GPQDAT&=~(0x01<<6);
       ……
    Delay_ns(1);
    v_pIOPregs->GPEDAT|=(0x01<<1);            //WR高
    Delay_ns(1);
    v_pIOPregs->GPEDAT|=(0x01<<3);             //CS高
    break;
      }
  (2)向外提供函數(shù)接口
  通過(guò)配置OED.def文件導(dǎo)出OLED提供的接口函數(shù),供設(shè)備管理器使用,。在OED.def 文件中添加如下代碼:
    LIBRARY     OED
    EXPORTS OED_Init
        OED _Deinit
         OED _Open
       OED _Close
            OED _Read
            OED _Write
            OED _Seek
            OED _PowerDown
            OED _PowerUp
             OED _IOControl
  (3)注冊(cè)表配置
     注冊(cè)表文件Platform. reg 用來(lái)配置與OLED驅(qū)動(dòng)有關(guān)的信息,,配置如下:
  [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\IoControler]
  “Prefix”=“OED”
  “Dll”=“OED.dll”
  “Index”=dword:0
    隨著嵌入式系統(tǒng)廣泛應(yīng)用到信息家電、工業(yè)控制,、移動(dòng)通信,、互聯(lián)網(wǎng)等領(lǐng)域,,大量嵌入式系統(tǒng)的開發(fā)必將對(duì)人類科技的發(fā)展起著重要的作用,。本文介紹的基于嵌入式操作系統(tǒng)Windows CE 的驅(qū)動(dòng)程序會(huì)幫助讀者開發(fā)出更多的嵌入式系統(tǒng)產(chǎn)品。
參考文獻(xiàn)
[1] GOGGIN T A. Windows CE 高級(jí)開發(fā)指南[M]. 尤滔,,張平,,周曉權(quán),譯,北京:電子工業(yè)出版社,,2001.
[2] Microsoft . Microsoft Windows CE Device Driver Kit[M]. 北京:北京希望電子出版社,,2000.
[3] 胡軍輝,王友釗.Windows CE設(shè)備驅(qū)動(dòng)程序開發(fā)[J].計(jì)算機(jī)工程,,2006,,32(16):41-43.
[4] 李長(zhǎng)河,王永強(qiáng),劉剛,,等.嵌入式Windows CE設(shè)備驅(qū)動(dòng)的研究實(shí)現(xiàn)[J].微機(jī)發(fā)展,,2003,13(7):69-72.

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權(quán)禁止轉(zhuǎn)載,。