Windows CE6.0的DM9000A流接口驅(qū)動(dòng)開(kāi)發(fā)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
摘要:針對(duì)Windows CE系統(tǒng)下專用網(wǎng)絡(luò)驅(qū)動(dòng)接口開(kāi)發(fā)難度大的情況,本文介紹一種基于Windows CE流接口驅(qū)動(dòng)的工作機(jī)制及開(kāi)發(fā)方法。相比于Windows CE對(duì)各種硬件設(shè)備所提供的專用接口,流接口驅(qū)動(dòng)具有更大的靈活性,且能夠?qū)崿F(xiàn)應(yīng)用層到底層硬件的控制。以含有ARM11內(nèi)核的S3C6410結(jié)合以太網(wǎng)通信芯片DM9000A為例,逐步分析流接口驅(qū)動(dòng)程序的開(kāi)發(fā)流程,并利用PC機(jī)抓取以太網(wǎng)通信數(shù)據(jù),驗(yàn)證了流接口驅(qū)動(dòng)程序開(kāi)發(fā)的正確性。
關(guān)鍵詞:Windows CE 6.0;S3C6410;DM9000A;流接口驅(qū)動(dòng)
引言
嵌入式技術(shù)在各個(gè)領(lǐng)域的應(yīng)用與日俱增,基于微軟公司研發(fā)的Windows CE嵌入式操作系統(tǒng)的電子設(shè)備更是滲透到各行各業(yè)。隨著網(wǎng)絡(luò)技術(shù)的發(fā)展,以太網(wǎng)幾乎成為了電子通信設(shè)備首選的通信方式。Windows CE 6.0提供的網(wǎng)絡(luò)接口驅(qū)動(dòng)器標(biāo)準(zhǔn)(NIDS)固然得到系統(tǒng)的良好支持,但其驅(qū)動(dòng)程序的實(shí)現(xiàn)較為復(fù)雜,且通過(guò)NIDS實(shí)現(xiàn)應(yīng)用程序?qū)W(wǎng)絡(luò)底層驅(qū)動(dòng)的操作難度較大。
針對(duì)Windows CE6.0系統(tǒng)下應(yīng)用程序?qū)υO(shè)備硬件難以靈活控制的問(wèn)題,本文介紹一種使用流接口驅(qū)動(dòng)實(shí)現(xiàn)應(yīng)用程序?qū)τ布M(jìn)行控制的方法??紤]到Windows CE6.0在內(nèi)核訪問(wèn)機(jī)制上有別于以往版本,且以太網(wǎng)接口的廣泛使用及其基于NIDS的開(kāi)發(fā)難度較大,故而以DM9000A網(wǎng)絡(luò)芯片的驅(qū)動(dòng)及控制為例進(jìn)行介紹。
1 Windows CE 6.0的設(shè)備驅(qū)動(dòng)機(jī)制
Windows CE所有的驅(qū)動(dòng)程序都是以DLL文件的形式存在的,系統(tǒng)在執(zhí)行驅(qū)動(dòng)程序代碼之前必須先將相應(yīng)的DLL文件加載到地址空間。Wind owsCE 6.0提供3個(gè)系統(tǒng)進(jìn)程來(lái)加載和執(zhí)行驅(qū)動(dòng)程序的DLL文件,它們分別是Device.exe、GWES.exe和FileSys.exe。它們各自加載的驅(qū)動(dòng)類型如圖1所示。
2 流接口驅(qū)動(dòng)工作原理
2.1 流接口驅(qū)動(dòng)架構(gòu)
應(yīng)用程序根據(jù)加載的流驅(qū)動(dòng)的名稱和操作碼調(diào)用文件API,文件API被系統(tǒng)轉(zhuǎn)發(fā)到FileSys.exe進(jìn)程中;FileSys.exe一旦發(fā)現(xiàn)轉(zhuǎn)發(fā)過(guò)來(lái)的文件API是對(duì)設(shè)備的操作,則會(huì)交給設(shè)備管理器進(jìn)行處理;設(shè)備管理器將根據(jù)具體的請(qǐng)求,調(diào)用相應(yīng)的流驅(qū)動(dòng)接口程序。對(duì)于Windows CE系統(tǒng)應(yīng)用層而言,使用流接口驅(qū)動(dòng)的硬件設(shè)備被抽象為一個(gè)具有固定接口函數(shù)的動(dòng)態(tài)鏈接庫(kù)(DLL)。應(yīng)用程序調(diào)用文件API函數(shù)與流接口驅(qū)動(dòng)程序進(jìn)行通信,把對(duì)硬件的操作轉(zhuǎn)化為對(duì)文件的讀寫控制,從而達(dá)到應(yīng)用程序操作硬件的目的。流接口驅(qū)動(dòng)程序的體系結(jié)構(gòu)如圖2所示。
2.2 流驅(qū)動(dòng)接口函數(shù)
流接口驅(qū)動(dòng)程序具有統(tǒng)一的接口函數(shù),只需根據(jù)硬件沒(méi)備的操作時(shí)序在相應(yīng)的接口函數(shù)里編寫控制指令。Windows CE系統(tǒng)下流接口函數(shù)功能描述如表1所列。
表1中XXX代表驅(qū)動(dòng)文件的名稱,Windows CE中流接口驅(qū)動(dòng)的文件名稱規(guī)定為3個(gè)大寫的字母/數(shù)字。在進(jìn)行流接口驅(qū)動(dòng)程序編程時(shí),并非所有的接口函數(shù)都要編寫,一般比較重要的是XXX_Init()和XXX_IOControl()兩個(gè)函數(shù)。前者在設(shè)備驅(qū)動(dòng)被加載時(shí)調(diào)用,主要編寫初始化硬件設(shè)備的相應(yīng)控制指令,其中包括很是關(guān)鍵的地址映射操作;后者則主要實(shí)現(xiàn)對(duì)硬件設(shè)備的各種控制,可以實(shí)現(xiàn)數(shù)據(jù)的讀寫等操作,對(duì)設(shè)備的所有控制都可以在這個(gè)接口函數(shù)下實(shí)現(xiàn),只需分配好相應(yīng)的控制碼。對(duì)于本文介紹的DM9000A,DM9_Init()實(shí)現(xiàn)虛擬地址的獲取及初始化操作,DM9_IOControl()則實(shí)現(xiàn)數(shù)據(jù)的發(fā)送與接收,其中發(fā)送控制碼定義為DM9_SendData,接收控制碼為DM9_ReceiveData。
3 DM9000A流驅(qū)動(dòng)程序的實(shí)現(xiàn)
DM9000A支持IEEE802.3x全雙工模式流控制,提供IP/TCP/UDP校驗(yàn)、產(chǎn)生及檢測(cè)功能;內(nèi)部集成10/100M自適應(yīng)PHY,同時(shí)具有13 KB的接收緩沖區(qū)和3 KB的發(fā)送緩沖區(qū),支持8位和16位數(shù)據(jù)接口。
S3C6410與DM9000A的接口電路如圖3所示。在流驅(qū)動(dòng)程序中是將DM9000A內(nèi)部寄存器地址空間映射到S3C6410內(nèi)部劃分的SROM的BANK1空間上,物理基地址是0x18000000。在Windows CE 6.0系統(tǒng)下對(duì)硬件寄存器的訪問(wèn)首先需要進(jìn)行地址映射,將寄存器物理地址映射為系統(tǒng)可訪問(wèn)的虛擬地址。最為簡(jiǎn)單的方法就是從系統(tǒng)目錄(C:\wince600\platform\studk6410\src\inc)下找到基于OEM層的地址配置表(oemaddrt ab_cfg.inc),從文件中找到所使用的SROM的BANK1的虛擬地址,在驅(qū)動(dòng)程序中直接訪問(wèn)該地址(如同訪問(wèn)芯片的寄存器地址)。
流接口驅(qū)動(dòng)的實(shí)現(xiàn)將集中體現(xiàn)在對(duì)初始化接口函數(shù)和I/O控制接口函數(shù)的操作,函數(shù)主要代碼如下:
其中,0x94000000正是從地址配置表文件中獲取的虛擬地址,dwEthernetIOBase經(jīng)映射后則如同DM9000A內(nèi)部寄存器的首地址。由于硬件線路上是使用S3C6410的地址線中的位2作為DM9000A的數(shù)據(jù)/地址訪問(wèn)信號(hào)(高電平為訪問(wèn)數(shù)據(jù)),故以“dwEthernetIOBase+4”作為訪問(wèn)數(shù)據(jù)的基地址。
其中,參數(shù)Handle為流接口設(shè)備的句柄;dwIoControICode為I/O控制碼,可以根據(jù)需要自由定義;pInBuf為傳入數(shù)據(jù)指針;nInBufSize為數(shù)據(jù)長(zhǎng)度。除了初始化函數(shù)和I/O控制函數(shù)外的其他流驅(qū)動(dòng)接口函數(shù)無(wú)需任何處理,直接給出返回值即可。
發(fā)送函數(shù)dm9000_send(pInBuf,nInBufSize)獲取流接口函數(shù)傳入的發(fā)送數(shù)據(jù)指針和相應(yīng)數(shù)據(jù)長(zhǎng)度,然后驅(qū)動(dòng)DM9000A發(fā)送數(shù)據(jù),其工作流程如圖4所示。
4 Windows CE 6.0系統(tǒng)下流驅(qū)動(dòng)程序的使用
4.1 流驅(qū)動(dòng)程序的加載
流接口驅(qū)動(dòng)程序需要按一定的方式配置后才能被系統(tǒng)識(shí)別并編譯。其配置的主要流程如圖5所示。
將流驅(qū)動(dòng)程序加入定制系統(tǒng)之后還需要添加相應(yīng)的注冊(cè)表啟動(dòng)信息,在platform.reg文件中添加以下內(nèi)容:
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\DM9]
“Index”=dword:1
“Order”=dword:30
“Prefix”=“DM9”
“DLL”=“DM9.dll”
為使生成的DLL文件能夠被包括在燒寫文件中并下載到開(kāi)發(fā)板上,還需在platform.bib文件中加入相應(yīng)代碼,內(nèi)容如下:
IF BSP_NODM91
DM9.dll $(FLATRELEASEDIR)\DM9.dll NK SHK
ENDIF BSP_NODM9 !
經(jīng)過(guò)以上的配置之后,流接口驅(qū)動(dòng)程序已經(jīng)配置完成,只需要對(duì)Windows CE 6.0的系統(tǒng)定制工程重新編譯,并將生成的鏡像文件下載到開(kāi)發(fā)板上,即可通過(guò)文件API操作DM9000A的數(shù)據(jù)收發(fā)。
4.2 應(yīng)用程序?qū)α黩?qū)動(dòng)程序的調(diào)用
Windows CE啟動(dòng)時(shí)會(huì)自動(dòng)枚舉注冊(cè)表HKEY_LOCAL_MACHINE\Drivers\BuiltIn目錄下的驅(qū)動(dòng)信息,并加載相應(yīng)驅(qū)動(dòng)程序的動(dòng)態(tài)鏈接庫(kù),然后執(zhí)行初始化接口函數(shù)——DM9_Init()。在驅(qū)動(dòng)程序成功加載之后,應(yīng)用程序?qū)τ布牟僮骶椭恍枵{(diào)用文件API便可實(shí)現(xiàn),但前提是相應(yīng)的操作必須在驅(qū)動(dòng)程序中有定義,并且分配了操作碼。對(duì)于DM9000A的數(shù)據(jù)發(fā)送,其文件API代碼如下:
……
hDm9=CreateFile(TEXT(“DM91:”),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
該代碼調(diào)用文件API打開(kāi)設(shè)備進(jìn)行讀寫操作,得到文件操作的句柄名hDm9。
DeviceIoControl(hDm9,DM9_SendFrame,&SendData,sizeof(SendData),NULL,0,&dwReturn,Null);
……
該代碼調(diào)用文件API對(duì)設(shè)備發(fā)送操作命令。其中,hDm9告訴系統(tǒng)要操作的設(shè)備為DM9000A;DM9 SendFrame為發(fā)送數(shù)據(jù)的操作碼,這必須與驅(qū)動(dòng)程序中定義的相一致,也就是讓系統(tǒng)知道進(jìn)行的是什么操作;&SendData為發(fā)送的數(shù)據(jù)幀首地址;sizeof(SendData)為發(fā)送數(shù)據(jù)的長(zhǎng)度……
4.3 實(shí)驗(yàn)驗(yàn)證
將基于Windows CE 6.0的DM9000A流接口驅(qū)動(dòng)程序應(yīng)用于電子式互感器合并單元的以太網(wǎng)數(shù)據(jù)通信模塊設(shè)計(jì)中,其通過(guò)DM9000A發(fā)送的數(shù)據(jù)幀在PC機(jī)上使用WinPcap軟件進(jìn)行以太網(wǎng)數(shù)據(jù)包抓取,從而驗(yàn)證流驅(qū)動(dòng)程序及其應(yīng)用程序是否正確實(shí)現(xiàn)Windows CE下以太網(wǎng)數(shù)據(jù)的發(fā)送。在實(shí)驗(yàn)中以IEC61850-9-2數(shù)據(jù)幀格式發(fā)送標(biāo)識(shí)為NCEPU的采樣值測(cè)試數(shù)據(jù),其實(shí)驗(yàn)結(jié)果如圖6所示。
抓取的以太網(wǎng)數(shù)據(jù)說(shuō)明了PC機(jī)接收到的數(shù)據(jù)和開(kāi)發(fā)板上通過(guò)流接口驅(qū)動(dòng)發(fā)送過(guò)來(lái)的數(shù)據(jù)是一致的,從而驗(yàn)證了流接口驅(qū)動(dòng)程序正確可行。
結(jié)語(yǔ)
本文介紹的流接口驅(qū)動(dòng)雖然不支持WIndwos CE提供的標(biāo)準(zhǔn)接口,無(wú)法通過(guò)系統(tǒng)標(biāo)準(zhǔn)函數(shù)庫(kù)進(jìn)行操作,但可以直接根據(jù)硬件設(shè)備的操作時(shí)序編寫驅(qū)動(dòng),具有極大的操作靈活性,非常適合在Windows CE應(yīng)用程序中對(duì)硬件設(shè)備底層進(jìn)行操作。