1 引言
無線局域網(wǎng)經(jīng)過幾年的發(fā)展,在技術(shù)上已經(jīng)日漸成熟。尤其是IEEE推出802.11-1999和802.11b以來,應(yīng)用也日漸廣泛。無線局域網(wǎng)硬件實(shí)現(xiàn)的兩大主要部分是基帶處理器和MAC控制器,軟件部分包括驅(qū)動(dòng)網(wǎng)卡本身工作的嵌入式軟件和網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序。在本文中,首先介紹了小端口驅(qū)動(dòng)程序的基本要點(diǎn),然后給出了基于Driver Studio開發(fā)PCMCIA接口編程I/O(Programmed IO)方式工作的無線局域網(wǎng)網(wǎng)卡NDIS(網(wǎng)絡(luò)驅(qū)動(dòng)程序接口標(biāo)準(zhǔn)),并討論了小端口驅(qū)動(dòng)程序?qū)崿F(xiàn)過程中的若干關(guān)鍵技術(shù)的細(xì)節(jié)。
2 小端口驅(qū)動(dòng)程序
在典型的網(wǎng)絡(luò)中,如以太網(wǎng)LLC子層及其上層協(xié)議均由軟件實(shí)現(xiàn),MAC及其以下層協(xié)議由硬件實(shí)現(xiàn)。微軟Windows操作系統(tǒng)下的網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序遵守NDIS規(guī)范,它在分層的網(wǎng)絡(luò)驅(qū)動(dòng)程序框架中規(guī)定了一個(gè)標(biāo)準(zhǔn)接口,從而使抽象低層次的硬件提供了高層次網(wǎng)絡(luò)上的網(wǎng)絡(luò)管理。因此,該規(guī)范極大簡(jiǎn)化了設(shè)備特定網(wǎng)絡(luò)驅(qū)動(dòng)程序的開發(fā)。
NDIS還用于網(wǎng)絡(luò)驅(qū)動(dòng)器的狀態(tài)信息和參數(shù)的維護(hù),包括函數(shù)的指針、句柄、鏈接的參數(shù)塊和其他的一些系統(tǒng)變量。NDIS規(guī)范下的網(wǎng)絡(luò)驅(qū)動(dòng)程序分為三類:小端口驅(qū)動(dòng)程序、中間驅(qū)動(dòng)程序和協(xié)議驅(qū)動(dòng)程序。普通網(wǎng)卡的驅(qū)動(dòng)程序都是小端口驅(qū)動(dòng)程序,它有兩種基本功能:管理一個(gè)網(wǎng)絡(luò)接口卡(NIC),包括通過NIC收、發(fā)數(shù)據(jù);與高級(jí)驅(qū)動(dòng)程序接口(如中間驅(qū)動(dòng)程序和傳輸協(xié)議驅(qū)動(dòng)程序)。一個(gè)小端口NIC驅(qū)動(dòng)程序通過NDIS庫和它的NIC與高層驅(qū)動(dòng)程序相互通訊。NDIS庫 導(dǎo)出一個(gè)完全的函數(shù)集合(NdisXXX函數(shù)),來裝入小端口需要調(diào)用的操作系統(tǒng)函數(shù)。然后,小端口必須導(dǎo)出一套MiniportX xx函數(shù)的實(shí)體指針,可供NDIS自己使用或代替高層驅(qū)動(dòng)程序訪問小端口。
關(guān)于網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序和Windows驅(qū)動(dòng)程序模型,感興趣的讀者可以參考文獻(xiàn)。
3 無線網(wǎng)卡驅(qū)動(dòng)程序框架
標(biāo)準(zhǔn)的驅(qū)動(dòng)程序都是C語言寫的,Nu Mega公司卻通過引入C++和封裝基本的函數(shù)庫簡(jiǎn)化了驅(qū)動(dòng)程序的設(shè)計(jì)。
使用DriverStudio編寫網(wǎng)絡(luò)驅(qū)動(dòng)程序,首先需要使用NetworkDriver Wizard生成驅(qū)動(dòng)程序的框架。該框架生成兩個(gè)驅(qū)動(dòng)程序的基本類:一個(gè)是 wlan_drvDriver,它是KndisMiniDriver的繼承類;另一個(gè)驅(qū)動(dòng)程序必須且只有一個(gè)KndisMiniDriver的繼承類。wlan_drvDriver的定義如下
wlan_drvDriver的唯一工作是定義DriverEntry。操作系統(tǒng)通過該函數(shù)得知驅(qū)動(dòng)程序的入口。DriverEntry例化NetworkDriver Wizard生成的另外一個(gè)類wlan_drvAdapter,并將本驅(qū)動(dòng)程序注冊(cè)。
wlan_drvDriver類不用開發(fā)者干預(yù)。開發(fā)者需要關(guān)心的是另外一個(gè)類wlan_drvAdapter,它是KndisMiniAdapter的子類。
4 驅(qū)動(dòng)程序的初始化
wlan_drvAdapter類的實(shí)現(xiàn)是整個(gè)驅(qū)動(dòng)程序的主體部分,包括初始化驅(qū)動(dòng)程序、發(fā)送數(shù)據(jù)、接收數(shù)據(jù)、中斷處理、網(wǎng)卡復(fù)位等。
驅(qū)動(dòng)程序在被裝入操作系統(tǒng)后的第一步工作是進(jìn)行初始化。該工作由wlan_drv Adapter::Initialize函數(shù)完成。該函數(shù)完成的工作如下:
(1)選擇媒體類型。對(duì)于無線局域網(wǎng)為 NDISMedium802_3,而不是NdisMedium-WirelessWan。聲明為 NdisMediumWirelessWan將支持各種無線媒體類型,NdisMedium802_3原本為以太網(wǎng)設(shè)計(jì),這里無線局域網(wǎng)似乎應(yīng)該聲明為NdisMediumWirelessWan媒體類型,但事實(shí)并不是這樣。通過查詢OID_GEN_PHYSICAL_MEDIUM,協(xié)議驅(qū)動(dòng)程序
可以得知物理媒體為NdisPhysical-MediumWirelessLan類型。
(2)從注冊(cè)表讀取網(wǎng)卡地址。
(3)注冊(cè)適配器的類型,如指定設(shè)備為 NdisInterfacePcMcia,代表網(wǎng)卡為PCMCIA標(biāo)準(zhǔn)的PC Card。這里需要強(qiáng)調(diào)的是PCMCIA接口的配置存儲(chǔ)器和功能寄存器都是由主機(jī)自行維護(hù)的,雖然驅(qū)動(dòng)程序也可以讀寫配置存儲(chǔ)器和功能寄存器,但這樣做會(huì)導(dǎo)致系統(tǒng)工作的不一致,除非特別需要,驅(qū)動(dòng)程序無需讀寫配置存儲(chǔ)器和功能寄存器。
(4)選擇并注冊(cè)IO端口。
(5)選擇并注冊(cè)中斷。
(6)設(shè)定網(wǎng)卡所支持的包種類,如廣播中的多播等。
(7)設(shè)定網(wǎng)卡的MAC屬性,如網(wǎng)卡是否支持環(huán)回等。
(8)初始化網(wǎng)卡硬件使其進(jìn)入工作狀態(tài)。該工作由wlan_drvAdapter::CardInit()完成。主要是設(shè)置相應(yīng)的寄存器,讀取永久網(wǎng)卡地址等。
(9)初始化自定義變量。
5 發(fā)送數(shù)據(jù)
當(dāng)需要發(fā)送數(shù)據(jù)包時(shí),NDIS調(diào)用MiniportSend 函數(shù),對(duì)應(yīng)本設(shè)計(jì)中wlan_drvAdapter::Send函數(shù)。如果當(dāng)前沒有數(shù)據(jù)包正在被發(fā)送,則調(diào)用 CopyDataDown(Packet)將數(shù)據(jù)發(fā)送給NIC,否則將數(shù)據(jù)插入發(fā)送隊(duì)列。當(dāng)中斷產(chǎn)生后,發(fā)現(xiàn)代表網(wǎng)卡準(zhǔn)備好接收下一個(gè)包,此時(shí)將數(shù)據(jù)包出列。
CopyDataDown(Packet)函數(shù)與具體的網(wǎng)卡實(shí)現(xiàn)有關(guān)。
6 接收數(shù)據(jù)
由于本設(shè)計(jì)中的網(wǎng)卡是程控I/O的網(wǎng)卡,速度較慢。每次產(chǎn)生中斷時(shí),如果發(fā)現(xiàn)NIC上緩存了一個(gè)數(shù)據(jù)包需要接收,則通過NdisMEthIndicateReceive 通知給NDIS,對(duì)應(yīng)于m_Lookahead.In di cate函數(shù)。如果是DMA設(shè)備,可以一次將整個(gè)數(shù)據(jù)包通知給上層,對(duì)于PIO方式的NIC,DDK建議只通知部分?jǐn)?shù)據(jù),然后讓NDIS調(diào)用MiniportTransferData來讀取余下的數(shù)據(jù)。當(dāng)然NDIS也許對(duì)該數(shù)據(jù)不感興趣,就不會(huì)讀剩下的數(shù)據(jù)。
7 中斷處理
與中斷處理有關(guān)的函數(shù)包括中斷服務(wù)程序 wlan_drvAdapter::Isr和延遲過程調(diào)用函數(shù)wlan_drvAdapter::HandleInterrupt。
中斷服務(wù)程序Isr工作在DIRL,會(huì)搶斷工作在更低中斷優(yōu)先級(jí)的線程,所以應(yīng)該盡快退出。該程序的主要任務(wù)是判斷中斷當(dāng)前是否是本網(wǎng)卡產(chǎn)生的,如果沒有應(yīng)該將*InterruptRecognized 設(shè)定為FALSE,并退出程序。如果是,則將中斷處理程序HandleInterrupt插入DPC列隊(duì),以在Passive Level上進(jìn)一步處理中斷。
中斷處理程序是真正處理中斷的函數(shù),它完成所有數(shù)據(jù)處理工作,它需要處理包括與統(tǒng)計(jì)信息有關(guān)的接收數(shù)據(jù)、發(fā)送數(shù)據(jù)等所有中斷。
8 結(jié)論
網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序是無線局域網(wǎng)網(wǎng)絡(luò)接口卡實(shí)現(xiàn)的關(guān)鍵部分,它與傳統(tǒng)的以太網(wǎng)卡稍有不同,但網(wǎng)卡與主機(jī)之間數(shù)據(jù)通信的基本格式與以太線網(wǎng)卡是相同的。本文首先介紹了小端口驅(qū)動(dòng)程序的特點(diǎn),然后給出了基于DriverStudio開發(fā)PCMCIA接口程控I/O方式工作的無線局域網(wǎng)網(wǎng)卡的NDIS小端口驅(qū)動(dòng)程序,其主體部分中包括驅(qū)動(dòng)程序框架、驅(qū)動(dòng)程序的初始化、發(fā)送和接收數(shù)據(jù)和中斷處理在內(nèi)的關(guān)鍵技術(shù)細(xì)節(jié)。本文所設(shè)計(jì)的網(wǎng)卡已經(jīng)在原型網(wǎng)卡中運(yùn)行,基本滿足了設(shè)計(jì)要求。
責(zé)任編輯:gt
-
嵌入式
+關(guān)注
關(guān)注
5082文章
19104瀏覽量
304790 -
無線
+關(guān)注
關(guān)注
31文章
5450瀏覽量
173237 -
局域網(wǎng)
+關(guān)注
關(guān)注
5文章
751瀏覽量
46277
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論