摘要:討論了Windows CE環境下無線網卡的安裝,並提出了一種在系統斷電重啟時自動安裝無線網卡的解決方案。對Windows CE的系統定制、應用程序的開發及系統封裝進行了介紹。
關鍵詞:嵌入式系統 Windows CE 無線網卡 設備驅動
Windows CE是為多種嵌入式系統和產品而設計的緊湊、高效、可升級的操作系統,並特別為有限的硬件資源設計了多線程、多任務和完全優先的操作系統環境。在無線通信領域有很大的應用前景。
本文重點討論了Windows CE環境下無線網卡的安裝,並提出了一種在系統斷電重啟時自動安裝無線網卡的解決方案;還對Windows CE的系統定制、應用程序的開發及系統封裝進行了介紹。由於Windows CE與Windows的同源和相似,決定了學習Windows CE的簡易性,這樣就縮短了應用者的開發周期。
1 Windows CE簡介
Windows CE包括四大基本模塊,它們提供了操作系統的關鍵特性,分別是:內核(Kernel)模塊、對象存儲(Object Store)模塊、GWES(用戶、應用程序和操作系統之間的圖形用戶界面)模塊和通信(Communication)模塊。圖1為Windows CE的模塊化結構圖。
操作系統定制工具有Windows CE Platform Builder(簡稱PB),應用程序開發工具有嵌入式開發工具包Embedded Visual Tools,包括Embedded Visual C++(簡稱EVC)和Embedded Visual Basic(簡稱EVB)。
2 特定硬件平台Windows CE操作系統的開發
有了具體的嵌入式硬件平中後,就可以為其開發滿足特定功能需要的Windows CE系統。總之,可以分成三個步驟:操作系統的定制、特定功能應用程序模塊的開發、功能模塊封裝入
操作系統。
2.1 操作系統的初步定制
圖2為在PB中定制Windows CE操作系統的一般流程[3]。
首先,選擇操作系統的基本配置,並且為特定的平台選擇相應的微處理器和平台支持包BPS(Board Support Packet)。PB提供的BSP有CEPC(基於PC機的WinCE硬件開發平台)。開發者可以選擇其一或自己定制特定平台的BPS。其次,制定平台,在此階段可開發設備驅動,適當地裁剪、添加組件,如有必要還需對某些配置文件進行修改。然後,封裝所需要的各功能模塊,編譯生成OS鏡像文件。若設備為自己定制的目標設備,則需開發OAL(OEM Adaptation Layer)、BPS和BootLoader。接著,把鏡像文件下載到目標設備,進行調試;需要的話,進行重復配置、封裝、下載及調試,需要的話,進行重復配置、封裝、下載及調試,直到滿足要求,完成平台的創建。最後導出相應的SDK(Software Development Kit)軟件開發工具包,運行後加域到EVC中,使得可以進行特定硬件平台上的應用程序開發。SDK包含程序庫、頭文件、示例程序源代碼和庫函數使用文檔,同時還包括編程指導和API參與以及設備驅動工具包(DDK)。
2.2 特定功能應用程序模塊的開發
開發特定功能的應用程序模塊就是在EVC中編寫應用程序,滿足系統功能擴充的需要。重點要做以下工作:
(1)為特定平台選擇相應的微處理器,如WCE THUMB或WCE x86em等。
(2)編寫應用程序。方法上EVC與PC機上運行的VC差別不大。兩者的區別主要有:前者的API是後者API的子集,對不兼容的函數要做一些修改或者尋求可替代的函數;前者為Unicode環境,所有字符都是兩個字節,而後者為ANSI美國標准,每個字符一個字節,因此必要時兩者間要作數據類型轉換;另外在用戶界面編程和內存管理等方面也有些差異。
(3)對程序進行編譯和調試。編譯時一定要選擇特定的硬件平台。調試時可用微軟件包提供的工具Microsoft Activesync建立PC機上與目標機的連接,把系統鏡像從PC機下載到目標機上進行調試;另外EVC中帶有模擬器,可以在PC機上模擬目標平台上的大部分功能。
2.3 功能模塊封裝入系統
OEM開發者通常把必要的應用程序和操作系統封裝在一起發布給使用者,因此要把應用程序打包封裝入初步制定的操作系統中。需要做的工作主要有兩個:
(1)把編譯好的可執行文件拷貝到Windows CE系統相應的文件夾中。
(2)在PB中修改相應的系統配置文件。PB所提供的配置文件包括四種文件類型:.bib,說明需要打包進鏡像文件的Windows CE文件;.dat,文件系統、目錄和文件分配表描述;.db,Windows CE對象存儲數據庫的描述;.reg,系統注冊表。在開發過程中最常用到的配置文件有:Platform.bib、Platform.reg、Platform.dat、Config.bib。Platform.bib定義打包到OS鏡像文件時所需要的文件(files)和模塊(modules);Platform.reg定義目標平台冷啟動時所加載的注冊表鍵值;Platform.dat定義目標平台冷啟動時所加載的系統文件、目錄和鏈接等;Config.bib定義可用的物理地址,並進行一些屬性設置。
做好以上兩步以後,對操作系統重新編譯、下載、調試,最終得到功能完整的系統鏡像。
3 開發實例——Windows CE環境下無線網卡的自動安裝
3.1 項目介紹
項目要求實現一個獨立的嵌入式無線通信模塊,通過現有的IEEE80211b無線網卡接入無線局域網進行通信。系統采用Samsung公司的S3C2410芯片開發嵌入式系統硬件平台,需要在Windows CE環境驅勸PCMCIA無線網卡。
3.2 無線網卡安裝的問題和解決方案
Windows CE操作系統支持兩種類型的設備驅動程序:內置式設備驅動程序和可安裝設備驅動程序。當目標朵與PC機相鏈,且目標機有顯示屏和鏈盤時,對於可安裝的設備驅動程序,其安裝步驟為:建立目標機與PC機的連接,將設備驅動程序的.dll文件復制到Windows CE的Windows目錄下;當系統檢測到設備時,顯示屏中會出現相應的對話框,用鍵盤輸入驅動的名稱即可。
項目中要為現有的無線網卡安裝驅動程序。因為Windows CE系統運行時是基於RAM存儲的,ROM相當於只讀硬盤,一旦系統斷電或冷啟動後,RAM中的信息就會丟失,尤其是一些注冊表的信息,所以要對RAM持續供電。但由於本系統硬件電源不能保證持續供電,安裝了無線網卡的驅動程序後,信息存儲在RAM中,系統斷電或冷啟動後,相關的信息會丟失。而且,目標機在實際使用中無顯示屏和鍵盤。因此,斷電重啟時需要自動重新安裝無線網卡驅動程序。
解決方案為:從系統持久存儲SM卡中讀取網卡驅動程序xi825.dll和TCP/IP屬性配置文件config.txt,並按配置文件設備注冊表鍵值,然後為無線網卡安裝驅動程序。若需要根據具體應用環境更新TCP/IP屬性值,可用新的配置文件覆蓋SM卡中的舊文件,冷啟動後,重新設備屬性值,在安裝網卡驅動即可。
用EVC編寫應用程序完成自動安裝無線網卡驅動的功能,圖3為應用程序的大體流程。
首先,把兩個文件從SM卡的storage card文件夾拷貝到Windows CE系統的Windows目錄下;拷貝成功後,按config.txt的內容對注冊表進行操作,設置具體環境下的TCP/IP屬性值;系統檢測到無線網卡後,在彈出名為“Unidentified PCCard Adapter”的對話框中程序自動輸入網卡驅動程序名,完成無線網卡的自動安裝。
3.3 幾個具體問題的解決
下面,再討論一下本方案中幾個具體問題的解決辦法。包括對注冊表的操作、自動安裝功能的實現、程序流程的總體控制以及將程序打包封裝入操作系統的作法。
3.3.1 對注冊表的操作
Windows CE中有一系列API函數可以對注冊表進行操作,完成打開關閉注冊表、讀取或修改鍵值等功能。另外,Windows CE注冊表中值的類型為Unicode;而配置文件config.txt是在PC機上產生的,類別為ANSI。要按cogfing.txt中讀取的值設定注冊表值,就要進行數據類型的轉換,可以用函數MultiByteToWideChar()實現[4]。關鍵代碼如下:
RegOpenKeyEx(HKEY_LOCAL_MACHINE, //根鍵TEXT("Commxi8251ParmsTcpIP"),
//打開根鍵下的子鍵
0, //預留值,必設為0
0, //不支持此項,必設為0
&hKey //最終打開鍵的句柄指針
);
RegSetValueEx( hKey, //對鍵操作的句柄
TEXT("IpAddress"),//鍵中的數據項名
0, //預留值,必設為0
REG_GZ, //數據項中值的類型
(CONST BYE*)((LPCTSTR)regData),//存有數據項值的緩沖區
dwDataSize //值的字節數
); //對"IpAddress"數據項的值作修改,即改變IP值
3.3.2 自動安裝功能的實現
用FindWindows()函數判斷對話窗口的出現;用keybd_event()函數模擬鍵盤輸入。關鍵代碼如下:
TCHAR g_szTitle[80]=TEXT("Unidentified PCCard Adapter"); //指定對話框的標題
HWND hWnd=..FindWindows(NULL,g_szTitle); //判斷此標題名的窗口是否已出現,不論是否為前台窗口
if (hWnd! =NULL) //若窗口已出現
{..SetForegroundWindows(hWnd); //將此窗口設置前台窗口
keybd_event(0x58,0,0,0); //按下x鍵
keybd_event(0x58,0,KEYEVENTE_KEYUP,0); //抬起x鍵
//完成了按下和抬起x鍵的兩個動作,就模擬了鍵盤輸入字符x.
............//用同樣的方法輸入 'i825.dll'
keybd_event(0x0d,0,0,0);
keybd_ev