歡迎您光臨本站 登入註冊首頁

ucos WiFi網卡驅動程序的開發

admin @ 2014-03-25 , reply:0

概述

   嵌入式系統是設計完成複雜功能的硬體和軟體,並使其緊密耦合在一起的計算機系統。目前,嵌入式系統已經存在於各種數據採集、工業控制、娛樂、通信等應用領域。在一些應用場合,……

    嵌入式系統是設計完成複雜功能的硬體和軟體,並使其緊密耦合在一起的計算機系統。目前,嵌入式系統已經存在於各種數據採集、工業控制、娛樂、通信等應用領域。在一些應用場合,需要嵌入式設備具有與其它系統交換信息的能力,因此必須為嵌入式系統增加通信功能。通信功能的實現可以採用很多方式,例如乙太網,ADSL,GPRS以及其它方式。在一個嵌入式終端中使用WiFi網卡,實現無線網路通信的功能是一種較新的通信方式。由於在uCOS實時操作系統中還沒有WiFi的驅動程序,因此下面將介紹WiFi的驅動程序的編寫。

1 WiFi介紹
    WiFi(Wireless Fidelity),又稱802.1lb標準,IEEE於1997年6月批准了該標準。802.11標準的體系結構組成包括:無線站點STA(Station),無線接入點AP(Access Point),獨立基本服務組IBSS(Independent Basic Service Set),基本服務組BSS(BasicService Set),分散式系統DS(Distribution System)和擴展服務組ESS(Extended Service Set).
    該標準定義了兩種工作模式:ad hoc模式和infrastructure模式。ad hoc即對點模式,包含兩個無線站點(STA,即帶無線網卡的設備)。而infrastructure即AP模式,無線站點(STA)通過AP與現有的骨幹網相連接,組成一個基本服務組(BSS)。在BSS中,AP不僅提供STA之間通信的橋接功能,還提供STA與有線區域網的連接,可以實現有線Hub幾乎所有的功能。

2 嵌入式終端系統結構
2.1 硬體結構
    嵌入式終端硬體系統(如圖1所示)以Philips公司的LPC2210嵌入式處理器為核心,LPC2210是基於16/32位ARM7TDMI-S,並支持實時模擬和跟蹤的CPU。LPC2210的數據和地址匯流排是開放的,片內有16K位元組的RAM。嵌入式終端需要較大存儲空間運行實時操作操作系統、TCP/IP協議、圖形用戶界面(GUI)、串口驅動程序、WiFi驅動程序、英文及漢字字型檔等,因此在外部擴展了一片容量為256K×16的靜態RAM 1S61LV25616及一片容量為1M×16的Flash 39VF160。為了方便調試程序,使用了LPC2210的串口診斷程序的運行結果。
 
圖1 嵌入式終端的硬體結構
    系統中選擇了使用Prism 2晶元的網卡,型號為COMPAQ NC5004,支持IEEE802.11b,最高速率為11Mb/s.網卡的物理驅動介面為PCMCIA,供電電壓為3.3V.由於LPC2210沒有PCMCIA控制器,因此LPC2210與NC5004的PCMCIA 介面是通過LPC2210的通用埠連接的,匯流排時序通過軟體模擬來完成,即PCMCIA介面的驅動程序。
    PCMCIA匯流排有控制線、數據線、地址線、電源線。其中數據線寬度可選為16位或8位,NC5004的數據線寬度是16位的,即D15~D0。地址線寬度為26位,但在WiFi網卡中只須用10位地址線A9~A0。WiFi網卡的PCMCIA 的控制線有10根,其中RESET為複位,該線為低電平時網卡回到初始狀態。CE1,CE2為卡的地址控制,當CE1,CE2為低時,分別表示偶地址和奇地址的位元組有效。OE,WE分別為Memory空間的讀寫控制線,IORD,IOWR為I/O空間的讀寫控制線,均為低電平有效。REG用於選擇地址訪問空間,包括I/O空間和存儲器空間。IREQ提示處理器處理網卡的內部事件,可以不用。在對網卡進行讀寫操作時,只有當HWAIT變高表示讀或寫的數據進入存儲器,才能進行下一步匯流排操作。
2.2 軟體結構
    嵌入式終端的軟體系統(如圖2所示)包括實時操作系統、PCMCIA驅動程序、WiFi網卡驅動程序、TCP/IP協議、串口驅動程序、圖形界面等。本系統中的實時操作系統vCOS II是一個公開源代碼、結構小巧、具有可剝奪實時內核的實時操作系統。最多可以支持64個任務,分別對應優先順序0~63,其中0為最高優先順序。vCOS需要移植才能用於不同的處理器平台,移植需要改寫的文件:OS_CPU.H,OS_CPU_A.S,OS_CPU_C.C.對於LPC2210嵌入式處理器,廠家的技術支持一般提供了該型號處理器的這三個移植文件,將這三個文件代替原文件即可使用。
 
圖2 嵌入式終端的軟體結構
    但uCOS II缺少對外圍設備和介面的支持,如沒有文件系統、網路協議、圖形界面。在廠家提供的開發資料中有其自行開發的TCP/IP協議和串口驅動程序。但該TCP/IP協議是與乙太網卡驅動程序介面的,因此在該TCP/IP協議中,需要修改與網卡介面的API函數。其餘的PCMCIA驅動程序、WiFi網卡驅動程序需要自己進行編寫。

3 驅動程序的編寫
3.1 PCMCIA驅動程序
    PCMCIA 驅動程序包括五個主要函數,分別是initPCMCIAPorts(),pcmcia_WriteMem(),pcmcia_WriteReg(),pcmcia_ReadMem (),pcmcia_Read_Reg()。initPCMCIAPorts()函數用於PCMCIA設備的複位,其作用是通過控制RESET複位線為低電平,延遲一段時間以後,再恢復為高電平。
    PCMCIA設備內部空間分為Memory空間和I/O空間,對Memory空間讀寫分別為pcmcia_ReadMem(),pcmcia_WriteMem(),而I/O空間的讀寫為pcmcia_ReadReg(),pcmcia_WriteReg().這幾個函數區別在於控制線WE,OE,IORD,IOWR的操作不一樣。
    PCMCIA驅動程序函數按照PCMCIA時序設置LPC2210相應的通用埠。PCMCIA匯流排的工作時序是這樣,首先在地址線上設置數據地址,並將CE1,CE2設為低電平,然後REG設為低電平將地址鎖存。接下來進行讀或寫操作,讀操作中,Memory空間和I/O空間的讀操作分別將OE,IORD設為低電平,然後等待HWAIT變為高電平。HWAIT變為高電平后,將數據線上的狀態讀入。寫操作中,首先按照待寫數據設置數據線上的狀態,然後Memory空間的寫操作和I/O空間的寫操作分別將WE,IOWE設置為低電平。接下來,HWAIT變為高電平后說明數據已經寫入。在讀寫操作完成以後,依次將OE或者IORD(讀操作),WE或者IOWR(寫操作),CE2,CE1,REG恢復為高電平。
3.2 網卡驅動程序
    Prism 2網卡內部操作是封閉的,外部對其操作都是通過存儲器操作完成的,Memory空間的存儲器有COR(Configuration Option Register)寄存器,I/O空間的存儲器有BAP(Baffuer Access Path)寄存器,命令/狀態寄存器,FID管理寄存器,事件寄存器,控制寄存器,主機軟體寄存器,輔助埠寄存器等,這些寄存器的含義及偏移地址見文獻[2].LPC2210管理、配置網卡的數據項都是載入一個特定的RID(Resource IDentifiers)到BAP寄存器,讀取或者寫入一個特定的緩衝區。WiFi網卡驅動程序中的函數功能都是通過訪問這些存儲器完成的,下面將介紹這些API函數的功能。
    wlandrv_ProbeDevice()函數用於檢測網卡是否存在,函數首先訪問COR寄存器,設置網卡進入I/O模式,設置操作屬於Memory空間的讀寫操作。然後,使用pcmcia_WriteReg()函數寫一個值到地址為0x28的寄存器中,再用pcmcia_ReadReg()函數讀取這個寄存器的值,與原來的值相比較,如果值相同,則說明網卡是存在的:
wlandrv_ProbeDevice(void){
pcmcia_WriteMem(WI_COR_OFFSET,WI_COR_VALUE);//進入I/O模式
pcmcia_WriteReg(WI_HFA384X_SWSUP_PORT0_OFF,WI_PRISM2STA_MAGIC);
Value=pcmcia_ReadReg(WI_HFA384X_SWSUPPORT0_OFF);
if(Value==WI_PRISM2STA_MAGIC){
已找到網卡,此處做相應處理
}
}
    wlandrv_Attach()函數用於讀取網卡內部的一些參數,這些操作都是通過向BAP設定相應的RID,讀取相應緩衝區完成的:
wlandrv_Attach (void){
wi_read_rid(WI_RID_MAC_NODE,ic.ic_myaddr,&buflen);//讀取網卡地址
……類似地讀取NIC ID,可用通道,WEP加密支持,網路速率支持
}
wlandrv_Init()函數用於網路參數的初始化設置:
wlandrv_Init(){
wi_write_val(WI_RID_PORTTYPE,WI_PORTTYPE_BSS);//配製為站點
wi_write_ssid(WI_RID_DESIRED_SSID,ic_des_essid,7);//設置SSID
wi_write_txrate();//設置速率
wi_cmd(WI_CMD_ENABLE | WI_PORT0,0,0,0);//啟動網卡
}
    wlandrv_PutPacket()是被TCP/IP協議調用的函數,即IP協議將發送的數據打成IP包以後,將包傳遞給該函數。函數的工作首先是計算需要發送的位元組總長度,然後在IP包前添加添加邏輯鏈路控制層的幀頭,幀頭為4個雙字,分別表示訪問點地址、控制類型以及幀頭類型,最後將IEEE802.3的幀頭改成WiFi的幀頭。最後,將打好的包送入網卡的發送緩衝區。發送緩衝區的地址是通過設置FID管理寄存器后獲得的。
wlandrv_PutPacket(struct pkst *TxdData){
//TxdData為指向發送的IP包的指針
struct wi_frame frmhdr;
LLCS_SNAP_HEADER LLCSSNAPHeader ;
ETHERHDR *pMAC8023Header:
計算髮送數據長度len為TxdData指向的數據包添加格式為LLCS_SNAP_HEADER的邏輯鏈路控制層包頭
wi_write_bap(rid,off,TxdData,len);//發送數據包
)
    wlandrv_Event()函數主要查詢三個事件,即管理消息、接收數據、發送數據。通過查詢消息代碼,可知網卡是否已經找到AP並關聯起來以及何時脫離關聯。響應接收數據事件可以接收數據幀,去掉邏輯鏈路控制層的幀頭,然後將IP包傳遞給IP協議層。對於發送數據事件可以不做響應。這些操作都是先查詢FID寄存器后,獲取事件數據的緩衝區地址,然後訪問該地址的緩衝區獲取相應數據 函數如下:
wlandrv_Event(){
EventStatus=pcmcia_ReadReg (WI_EVENT_STAT);//讀取事件代碼
if(EventStatus&WI_EV_INFO){
wi_info_intr();//處理信息時間
}
else if(EventStatus& WI_EV_RX){
wi_rx_intr():
}
//處理接收事件
else if(EventStatus& WI_EV_TX_EXC){
}
3.3 驅動程序的使用
    驅動程序寫好以後,是通過TCP/IP程序調用這些API函數的,其調用過程如圖3所示。
 

4 結束語
    通過在嵌入式終端中加入WiFi網卡,並編寫基於vCOS II實時操作系統的網卡驅動程序,實現了嵌入式終端與PC機之間的網路通信。在實驗中,PC機通過無線網卡向嵌入式終端發送彩色圖片,嵌入式終端恢複數據后在彩色LCD上顯示該圖片,證明WiFi網卡驅動程序的開發是成功的。

參考文獻:
[1] ISO/EC 8802-II:1999(E).Wireless LAN Medium Access Control(MAC)and Physical Layer(PHY)Specifications[s].
[2] PRISM Driver Programmers Manual[EB/OL].http://www.intersil.com/prisim2.Intersil Americas Inc,2002-06-24.
[3] (美)JEAN J LABROSSE著,邵貝貝譯.uC/OS-II-源碼公開的實時嵌入式操作系統EM].北京:中國電力出版社,2001.356-360.


[admin via 研發互助社區 ] ucos WiFi網卡驅動程序的開發已經有3289次圍觀

http://cocdig.com/docs/show-post-42056.html