ucos WiFi網(wǎng)卡驅(qū)動程序的開發(fā)
嵌入式系統(tǒng)是設(shè)計完成復(fù)雜功能的硬件和軟件,并使其緊密耦合在一起的計算機系統(tǒng)。目前,嵌入式系統(tǒng)已經(jīng)存在于各種數(shù)據(jù)采集、工業(yè)控制、娛樂、通信等應(yīng)用領(lǐng)域。在一些應(yīng)用場合,需要嵌入式設(shè)備具有與其它系統(tǒng)交換信息的能力,因此必須為嵌入式系統(tǒng)增加通信功能。通信功能的實現(xiàn)可以采用很多方式,例如以太網(wǎng),ADSL,GPRS以及其它方式。在一個嵌入式終端中使用WiFi網(wǎng)卡,實現(xiàn)無線網(wǎng)絡(luò)通信的功能是一種較新的通信方式。由于在uCOS實時操作系統(tǒng)中還沒有WiFi的驅(qū)動程序,因此下面將介紹WiFi的驅(qū)動程序的編寫。
本文引用地址:http://cafeforensic.com/article/152125.htm
1 WiFi介紹
WiFi(Wireless Fidelity),又稱802.1lb標(biāo)準(zhǔn),IEEE于1997年6月批準(zhǔn)了該標(biāo)準(zhǔn)。802.11標(biāo)準(zhǔn)的體系結(jié)構(gòu)組成包括:無線站點STA(Station),無線接入點AP(Access Point),獨立基本服務(wù)組IBSS(Independent Basic Service Set),基本服務(wù)組BSS(BasicService Set),分布式系統(tǒng)DS(Distribution System)和擴展服務(wù)組ESS(Extended Service Set).
該標(biāo)準(zhǔn)定義了兩種工作模式:ad hoc模式和infrastructure模式。ad hoc即對點模式,包含兩個無線站點(STA,即帶無線網(wǎng)卡的設(shè)備)。而infrastructure即AP模式,無線站點(STA)通過AP與現(xiàn)有的骨干網(wǎng)相連接,組成一個基本服務(wù)組(BSS)。在BSS中,AP不僅提供STA之間通信的橋接功能,還提供STA與有線局域網(wǎng)的連接,可以實現(xiàn)有線Hub幾乎所有的功能。
2 嵌入式終端系統(tǒng)結(jié)構(gòu)
2.1 硬件結(jié)構(gòu)
嵌入式終端硬件系統(tǒng)(如圖1所示)以Philips公司的LPC2210嵌入式處理器為核心,LPC2210是基于16/32位ARM7TDMI-S,并支持實時仿真和跟蹤的CPU。LPC2210的數(shù)據(jù)和地址總線是開放的,片內(nèi)有16K字節(jié)的RAM。嵌入式終端需要較大存儲空間運行實時操作操作系統(tǒng)、TCP/IP協(xié)議、圖形用戶界面(GUI)、串口驅(qū)動程序、WiFi驅(qū)動程序、英文及漢字字庫等,因此在外部擴展了一片容量為256K×16的靜態(tài)RAM 1S61LV25616及一片容量為1M×16的Flash 39VF160。為了方便調(diào)試程序,使用了LPC2210的串口診斷程序的運行結(jié)果。
圖1 嵌入式終端的硬件結(jié)構(gòu)
系統(tǒng)中選擇了使用Prism 2芯片的網(wǎng)卡,型號為COMPAQ NC5004,支持IEEE802.11b,最高速率為11Mb/s.網(wǎng)卡的物理驅(qū)動接口為PCMCIA,供電電壓為3.3V.由于LPC2210沒有PCMCIA控制器,因此LPC2210與NC5004的PCMCIA 接口是通過LPC2210的通用端口連接的,總線時序通過軟件仿真來完成,即PCMCIA接口的驅(qū)動程序。
PCMCIA總線有控制線、數(shù)據(jù)線、地址線、電源線。其中數(shù)據(jù)線寬度可選為16位或8位,NC5004的數(shù)據(jù)線寬度是16位的,即D15~D0。地址線寬度為26位,但在WiFi網(wǎng)卡中只須用10位地址線A9~A0。WiFi網(wǎng)卡的PCMCIA 的控制線有10根,其中RESET為復(fù)位,該線為低電平時網(wǎng)卡回到初始狀態(tài)。CE1,CE2為卡的地址控制,當(dāng)CE1,CE2為低時,分別表示偶地址和奇地址的字節(jié)有效。OE,WE分別為Memory空間的讀寫控制線,IORD,IOWR為I/O空間的讀寫控制線,均為低電平有效。REG用于選擇地址訪問空間,包括I/O空間和存儲器空間。IREQ提示處理器處理網(wǎng)卡的內(nèi)部事件,可以不用。在對網(wǎng)卡進行讀寫僮魘保只有當(dāng)HWAIT變高表示讀或?qū)懙臄?shù)據(jù)進入存儲器,才能進行下一步總線操作。
2.2 軟件結(jié)構(gòu)
嵌入式終端的軟件系統(tǒng)(如圖2所示)包括實時操作系統(tǒng)、PCMCIA驅(qū)動程序、WiFi網(wǎng)卡驅(qū)動程序、TCP/IP協(xié)議、串口驅(qū)動程序、圖形界面等。本系統(tǒng)中的實時操作系統(tǒng)vCOS II是一個公開源代碼、結(jié)構(gòu)小巧、具有可剝奪實時內(nèi)核的實時操作系統(tǒng)。最多可以支持64個任務(wù),分別對應(yīng)優(yōu)先級0~63,其中0為最高優(yōu)先級。vCOS需要移植才能用于不同的處理器平臺,移植需要改寫的文件:OS_CPU.H,OS_CPU_A.S,OS_CPU_C.C.對于LPC2210嵌入式處理器,廠家的技術(shù)支持一般提供了該型號處理器的這三個移植文件,將這三個文件代替原文件即可使用。
圖2 嵌入式終端的軟件結(jié)構(gòu)
但uCOS II缺少對外圍設(shè)備和接口的支持,如沒有文件系統(tǒng)、網(wǎng)絡(luò)協(xié)議、圖形界面。在廠家提供的開發(fā)資料中有其自行開發(fā)的TCP/IP協(xié)議和串口驅(qū)動程序。但該TCP/IP協(xié)議是與以太網(wǎng)卡驅(qū)動程序接口的,因此在該TCP/IP協(xié)議中,需要修改與網(wǎng)卡接口的API函數(shù)。其余的PCMCIA驅(qū)動程序、WiFi網(wǎng)卡驅(qū)動程序需要自己進行編寫。
3 驅(qū)動程序的編寫
3.1 PCMCIA驅(qū)動程序
PCMCIA 驅(qū)動程序包括五個主要函數(shù),分別是initPCMCIAPorts(),pcmcia_WriteMem(),pcmcia_WriteReg(),pcmcia_ReadMem (),pcmcia_Read_Reg()。initPCMCIAPorts()函數(shù)用于PCMCIA設(shè)備的復(fù)位,其作用是通過控制RESET復(fù)位線為低電平,延遲一段時間以后,再恢復(fù)為高電平。
PCMCIA設(shè)備內(nèi)部空間分為Memory空間和I/O空間,對Memory空間讀寫分別為pcmcia_ReadMem(),pcmcia_WriteMem(),而I/O空間的讀寫為pcmcia_ReadReg(),pcmcia_WriteReg().這幾個函數(shù)區(qū)別在于控制線WE,OE,IORD,IOWR的操作不一樣。
PCMCIA驅(qū)動程序函數(shù)按照PCMCIA時序設(shè)置LPC2210相應(yīng)的通用端口。PCMCIA總線的工作時序是這樣,首先在地址線上設(shè)置數(shù)據(jù)地址,并將CE1,CE2設(shè)為低電平,然后REG設(shè)為低電平將地址鎖存。接下來進行讀或?qū)懖僮?,讀操作中,Memory空間和I/O空間的讀操作分別將OE,IORD設(shè)為低電平,然后等待HWAIT變?yōu)楦唠娖?。HWAIT變?yōu)楦唠娖胶?,將?shù)據(jù)線上的狀態(tài)讀入。寫操作中,首先按照待寫數(shù)據(jù)設(shè)置數(shù)據(jù)線上的狀態(tài),然后Memory空間的寫操作和I/O空間的寫操作分別將WE,IOWE設(shè)置為低電平。接下來,HWAIT變?yōu)楦唠娖胶笳f明數(shù)據(jù)已經(jīng)寫入。在讀寫操作完成以后,依次將OE或者IORD(讀操作),WE或者IOWR(寫操作),CE2,CE1,REG恢復(fù)為高電平。
3.2 網(wǎng)卡驅(qū)動程序
Prism 2網(wǎng)卡內(nèi)部操作是封閉的,外部對其操作都是通過存儲器操作完成的,Memory空間的存儲器有COR(Configuration Option Register)寄存器,I/O空間的存儲器有BAP(Baffuer Access Path)寄存器,命令/狀態(tài)寄存器,F(xiàn)ID管理寄存器,事件寄存器,控制寄存器,主機軟件寄存器,輔助端口寄存器等,這些寄存器的含義及偏移地址見文獻[2].LPC2210管理、配置網(wǎng)卡的數(shù)據(jù)項都是加載一個特定的RID(Resource IDentifiers)到BAP寄存器,讀取或者寫入一個特定的緩沖區(qū)。WiFi網(wǎng)卡驅(qū)動程序中的函數(shù)功能都是通過訪問這些存儲器完成的,下面將介紹這些API函數(shù)的功能。
wlandrv_ProbeDevice()函數(shù)用于檢測網(wǎng)卡是否存在,函數(shù)首先訪問COR寄存器,設(shè)置網(wǎng)卡進入I/O模式,設(shè)置操作屬于Memory空間的讀寫操作。然后,使用pcmcia_WriteReg()函數(shù)寫一個值到地址為0x28的寄存器中,再用pcmcia_ReadReg()函數(shù)讀取這個寄存器的值,與原來的值相比較,如果值相同,則說明網(wǎng)卡是存在的:
評論