VxWorks是美國風河公司(Wind River)推出的具備網(wǎng)絡(luò)功能的實時嵌入式操作系統(tǒng)。VxWorks以其良好的可靠性和卓越的實時性被廣泛應用于航海、軍事、航窄、通信等高精尖技術(shù)及實時性要求極高的領(lǐng)域中。vxWorks在各種CPU平臺上提供了統(tǒng)一的編程接口和一致的運行特性,盡可能屏蔽不同CPU之間的底層差異。所以,VxWorks可以方便地移植到不同的CPU平臺上,如ARM、PowerPC、x86等。
增強犁網(wǎng)絡(luò)驅(qū)動(Enhanced Network Driver,END)是一個使用MUX(多路復用)功能來與網(wǎng)絡(luò)協(xié)議進行通信的數(shù)據(jù)鏈路層驅(qū)動。本文主要研究基于sumsang公司S3C2410A處理器的網(wǎng)絡(luò)硬件環(huán)境下VxWorks嵌入式操作系統(tǒng)增強型網(wǎng)絡(luò)驅(qū)動程序的構(gòu)建和編寫。
1 S3C2410A的網(wǎng)絡(luò)硬件平臺
S3C2410A微處理器是sumsang半導體公司為手持設(shè)備等相關(guān)應用設(shè)計的一款低功耗、高集成度的處理器,包含一個ARM920T芯片。S3C2419A內(nèi)嵌的CS8900A作為主控芯片的以太網(wǎng)模塊,是一款低成本的以太局域網(wǎng)控制器,包含片上RAM、10Base-T傳輸和接收濾波器,以及帶24mA驅(qū)動的直接ISA總線接口,還集成了一個10Mbps的以太網(wǎng)收發(fā)器.以及所有用于和局域網(wǎng)通信的模擬及數(shù)字電路,通過一個電磁隔離器E2023直接和局域網(wǎng)相連。RJ45為網(wǎng)絡(luò)接頭,可連接10M/100M的網(wǎng)絡(luò)集線器。CS8900A工作在全艤工模式下.支持包括用于流控的暫停操作的IEEE802.3MAC控制層協(xié)議。其硬件原理圖如圖1所示。
2 增強型網(wǎng)絡(luò)驅(qū)動END
VxWorks支持兩種模式的網(wǎng)絡(luò)設(shè)備驅(qū)動程序,即BSD 4.3網(wǎng)絡(luò)驅(qū)動程序和可裁剪的增強型網(wǎng)絡(luò)設(shè)備驅(qū)動SENS。SENS(Sealable Enhanced Network Stack)是由BSD 4.3 TCP/IP網(wǎng)絡(luò)協(xié)議棧發(fā)展而來的,并包含了許多原協(xié)議棧沒有的協(xié)議。而且SENS在實現(xiàn)新的協(xié)議時增加了一些新特性,如在IP協(xié)議實現(xiàn)時增加了多播功能。為實現(xiàn)網(wǎng)絡(luò)接口程序可替換,WindRiver專為SENS設(shè)計了一種增強的網(wǎng)絡(luò)驅(qū)動程序END。SENS模型包含3個部分:協(xié)議驅(qū)動程序、多路復用接口(MUX)和增強的網(wǎng)絡(luò)驅(qū)動(END)。在驅(qū)動程序和上層協(xié)議之間,SENS模型提供了協(xié)議驅(qū)動層。在協(xié)議驅(qū)動層和END驅(qū)動層之間,SENS模型提供了MUX層,使其直接與END驅(qū)動程序進行交互。它們之間的結(jié)構(gòu)關(guān)系如圖2所示。
在BSD 4.3模型下,VxWorks網(wǎng)絡(luò)驅(qū)動程序與協(xié)議緊密結(jié)合,它們依賴于彼此的數(shù)據(jù)結(jié)構(gòu);而在基于MUX模型下,網(wǎng)絡(luò)驅(qū)動程序和協(xié)議之間沒有內(nèi)部交換數(shù)據(jù),它們只通過MUX間接相互作用。MUX接口的作用便是分解網(wǎng)絡(luò)驅(qū)動程序和協(xié)議,使它們幾乎獨立。這種獨立使得添加新的驅(qū)動程序和協(xié)議變得非常簡單。
3 END網(wǎng)絡(luò)驅(qū)動程序的裝載和啟動
在基于S3C2410A的VxWorks BSP設(shè)計中,configNet.h文件定義了一個END_TBL_ENTRY結(jié)構(gòu)的數(shù)組endDevTbl[],該數(shù)組將網(wǎng)絡(luò)設(shè)備驅(qū)動程序的裝載函數(shù)cs8900EndLoad()入口點及相關(guān)參數(shù)添加到網(wǎng)絡(luò)設(shè)備表endDevTbl[]中。endDevTbl[]數(shù)組描述了系統(tǒng)所有網(wǎng)絡(luò)設(shè)備的裝載入口點及其相關(guān)參數(shù).其中的一個參數(shù)CS_LOAD_STRING進行資源字符串的初始化工作。資源字符串的描述和加載程序的處理有關(guān),需要包含網(wǎng)卡基地址、中斷向量號、中斷號、偏移、配置值、MAC地址等。不同網(wǎng)卡的資源字符串有所不同,而且排列順序也沒有硬性的規(guī)定,只要提供的數(shù)據(jù)能滿足endLoad()的需要即可。
在使用編寫好的vxworks BSP引導操作系統(tǒng)時,系統(tǒng)將執(zhí)行usrRoot()函數(shù)來實現(xiàn)以下功能:首先初始化網(wǎng)絡(luò)任務的工作隊列,然后調(diào)用tNetTask()任務來處理網(wǎng)絡(luò)任務工作隊列中的任務。tNetTask()通過調(diào)用muxDevLoad()來裝載網(wǎng)絡(luò)接口驅(qū)動,在tNetTask()中已經(jīng)定義了網(wǎng)絡(luò)驅(qū)動設(shè)備的endLoad()接入點,muxDevLoad()也要執(zhí)行endLoad()。endLoad()執(zhí)行設(shè)備初始化并返回一個名為END_OBJ的結(jié)構(gòu)體。MUX在END_OBJ上加一個指針,指向能夠?qū)?shù)據(jù)包向MUX上層發(fā)送的函數(shù)。然后MUX把返同的END_OBJ加入到END_OBJ結(jié)構(gòu)鏈表中。當從muxDevLoad()返回后,網(wǎng)絡(luò)設(shè)備就準備好可以使用了。設(shè)備裝載完成后,muxDevload()調(diào)用muxDevStart()啟動函數(shù),該函數(shù)通過intConnect()和intEnable()實現(xiàn)中斷服務的注冊并打開中斷宏。當有數(shù)據(jù)交換時,打開中斷服務程序,調(diào)用排列網(wǎng)絡(luò)任務處理函數(shù)netJobAdd(),指派網(wǎng)絡(luò)系統(tǒng)任務tNeflask(),由tNetTask()數(shù)據(jù)接收和發(fā)送任務。其網(wǎng)絡(luò)設(shè)備的驅(qū)動程序安裝順序如圖3
所示。
圖3 END加載順序圖
在VxWorks中添加END網(wǎng)絡(luò)驅(qū)動,需要在文件config.h中添加#define INCLUDEEE_NETWORK和#define INCLUDE_END。在configNet.h中添加END驅(qū)動的入口函數(shù)#define LOAD_FUNC_0 cs8900aLoad和一些相關(guān)的初始化字符串。這樣就會在生成的BSP中包含END/MUX。
調(diào)試時,配置Tomado的目標服務器(Target Server),通過選擇Tools-》Target Server-》Configure來啟動目標服務器的配置程序.選擇wbdrpc后臺,選中Add description to menu,根據(jù)BSP中的配置填寫IP地址。
4 END驅(qū)動程序相關(guān)函數(shù)的設(shè)計
END網(wǎng)絡(luò)驅(qū)動程序相關(guān)處理函數(shù)的設(shè)計是網(wǎng)絡(luò)驅(qū)動和管理的關(guān)鍵部分,它包括ioctl、收/發(fā)處理、中斷處理函數(shù)和網(wǎng)絡(luò)驅(qū)動程序函數(shù)。
(1) ioctl函數(shù)的編寫
ioctl函數(shù)主要完成網(wǎng)卡的啟動和停止,以及MAC地址的設(shè)置等,由文件cs8900aEnd.c中的es8900aloctl()函數(shù)實現(xiàn)。在函數(shù)中可以通過輸入命令行參數(shù)分別對設(shè)置MAC地址請求、獲取MAC地址請求、設(shè)置設(shè)備標志、獲取設(shè)備標志、啟動輪詢操作、結(jié)束輪詢操作、返網(wǎng)MIB信息、返同第一個最小的緩沖區(qū)和返同頭的大小等進行參數(shù)設(shè)置。
(2)數(shù)據(jù)接收函數(shù)的編寫
為了保證數(shù)據(jù)幀接收的實時性,在cs8900aRecv()函數(shù)中使用中斷的方式處理數(shù)據(jù)幀的接收。中斷中應盡可能做較少的處理,所以當網(wǎng)絡(luò)設(shè)備產(chǎn)生中斷時,用戶中斷服務程序最好包含任務級別的處理服務程序.可以通過調(diào)用netJobAdd()實現(xiàn)。它接收一個程序指針和多達5個附加自變量,可以將應用程序用來處理數(shù)據(jù)包的入口點設(shè)定為任務級別。然后把任務放入tNetTask隊列,可以用tNetTask來處理任務級別的網(wǎng)路處理。只要tNetTask隊列中有函數(shù),它就會一直工作,直到隊列為空,進入睡眠狀態(tài)。
當有數(shù)據(jù)到達網(wǎng)絡(luò)設(shè)備時,觸發(fā)中斷進入中斷服務程序cs8900aEndInt。在中斷服務程序里查看中斷狀態(tài)寄存器,如果ReceiveComplete位為高則進入cs8900aMacRxInt()。在cs8900aMacRxInt()中關(guān)閉中斷.并調(diào)用BeOobAdd()將cs8900aEndHandleRcvInt()添加到tNetTask要處理的網(wǎng)絡(luò)任務隊列中。cs8900aEndHandleRevlnt()主要完成以下工作:
通過netClBtkGet()來預定一個clBlk結(jié)構(gòu);
通過netClBlkJoin()把clBlk結(jié)構(gòu)鏈接到包含數(shù)據(jù)包的cluster;
通過netMblkGet()來預定一個mBlk結(jié)構(gòu);
通過netMblkClJoin()把mBlk連接到clBlk、cluster;
通過netClusterGel()重新預定一個cluster給收緩沖描述符供下次接收使用;
重新開啟中斷。
(3)數(shù)據(jù)發(fā)送函數(shù)的編寫
數(shù)據(jù)幀的發(fā)送不采用中斷模式,直接調(diào)用底層驅(qū)動發(fā)送函數(shù)cs8900aEndSend()。發(fā)送的步驟如下:1.用戶凋用write()通過socket套接字訪問網(wǎng)絡(luò);2.網(wǎng)絡(luò)協(xié)議拷貝到網(wǎng)絡(luò)緩沖區(qū),并調(diào)用協(xié)議驅(qū)動的發(fā)送程序;3.協(xié)議驅(qū)動發(fā)送程序調(diào)用muxSend()啟動發(fā)送;4.muxSend()通過調(diào)用send()回調(diào)函數(shù),把緩沖區(qū)傳遞給END;5.數(shù)據(jù)發(fā)送程序cs8900aEndSend()調(diào)用netMblkToBufCopy()將數(shù)據(jù)拷貝到緩沖中,并立即發(fā)送出去??截愅瓿珊?,調(diào)用netMblkClChainFree()釋放所有鏈中的mBlk緩沖并歸還到內(nèi)存池。
(4)修改cs8900a.h文件
由于S3C2410A芯片內(nèi)部集成了MAC控制器,由芯片內(nèi)部寄存器進行控制。因此不需要為網(wǎng)卡模塊另外分配外設(shè)端口或映射寄存器地址。雖然S3C2410A芯片和物理層接口芯片在外部足兩個部分,但是從開發(fā)的角度看它們是一個整體。在cs8900a.h文件中主要完成一些基本配置的設(shè)定:
#define CS_CHIP_FRAME_BUF_SIZE (2048)
#define CS_PKTPG_DMA_NUM (0x0024)
#define CS_INIT_DMA_NUM (3)
#define CS_INIT_INT_NUM (0)
#define CS_CHIP_MEM_BASE (0x28100000)
#define CS_CHlP_IO_BASE (0x28000000)
#define CS_CHIP_IO_0FFSET (0x300)
#define CS_CHIP_MEM_OFFSET (0)
(5)修改cs8900aEND.c文件
cs8900aEND.c 主要完成設(shè)備驅(qū)動程序函數(shù)的編寫:
//從MIB獲取硬件地址
#define END_HADDR(pEnd) ((pEnd)-》mib2Tbl.ifPhysAddress.phyAddress)
#defitae END_HADDR_LEN(pEnd) ((pEnd)-》mib2Tbl.ifPhysAddress.addrLength)
//配置設(shè)定
#define END_BUFSIZ (ETHERMTU+SIZEOF_ETHERHEADER+6)
#define END_SPEED_10M 10000000 /*10Mbs*/
#define END_SPEED END_SPEED_10M
//定義名稱
#define DRV_NAME “cs”
。。.。。.
然后添加驅(qū)動控制結(jié)構(gòu),其結(jié)構(gòu)如下:
typedef struct end device
{
END_0BJ end //繼承的END_OBJ結(jié)構(gòu)
int unit; //設(shè)備單元數(shù)
int ivecBdmaTx; //bdmaTx中斷向量
int ivecBdmaRx; //bdmaRx中斷向量
。。.。。.
UCHAR csAddr[6]; //以太網(wǎng)地址
CACHE_FUNS * cacheFuns; //高速緩沖功能函數(shù)指針
。。.。。.
}
該結(jié)構(gòu)中的內(nèi)容是根據(jù)網(wǎng)絡(luò)設(shè)備和用戶需要而設(shè)計的,其中END_OBJ結(jié)構(gòu)必須包含。并放置在結(jié)構(gòu)的第一項。
5 結(jié)束語
VxWorks下增強型網(wǎng)絡(luò)驅(qū)動是一個鏈路層驅(qū)動程序,它通過MUX層函數(shù)與網(wǎng)絡(luò)協(xié)議層進行通信,本文分析了基于samsung公司的S3C2410A處理器的VxWorks操作系統(tǒng)嵌入式網(wǎng)絡(luò)硬件平臺,闡述了VxWorks操作系統(tǒng)下增強型網(wǎng)絡(luò)接口結(jié)構(gòu),并根據(jù)硬件的設(shè)計環(huán)境詳盡描述并給出了適合該硬件系統(tǒng)的END型網(wǎng)卡驅(qū)動的編寫及其在vxWorks系統(tǒng)中的加載,滿足系統(tǒng)網(wǎng)絡(luò)傳輸?shù)囊?。由于硬件環(huán)境不間,所以不同開發(fā)板上END的設(shè)計會在驅(qū)動的初始化、發(fā)送和接收函數(shù)的配置上有所不同,但根據(jù)相應的硬件用戶手冊稍加改動即可使用,對其他開發(fā)板的網(wǎng)絡(luò)驅(qū)動開發(fā)具有一定的參考和借鑒價值。
本文作者創(chuàng)新點:本文闡述了vxworks操作系統(tǒng)下增強型網(wǎng)絡(luò)驅(qū)動的構(gòu)成原理,給出了基于S3C2410A芯片的增強型網(wǎng)絡(luò)驅(qū)動的具體實現(xiàn)方法。
責任編輯:gt
-
處理器
+關(guān)注
關(guān)注
68文章
18927瀏覽量
227228 -
嵌入式
+關(guān)注
關(guān)注
5046文章
18817瀏覽量
298548 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
6545瀏覽量
122743
發(fā)布評論請先 登錄
相關(guān)推薦
評論