摘 要:隨著嵌入式操作系統(tǒng)VxWorks的廣泛應(yīng)用,如何讓VxWorks支持各種硬件平臺成了急需解決的問題。首先介紹大幅面掃描儀的發(fā)展趨勢以及嵌入式操作系統(tǒng)VxWorks的優(yōu)勢。然后通過分析VxWorks的SENS協(xié)議棧;VxWorks下END網(wǎng)絡(luò)驅(qū)動程序的結(jié)構(gòu);S3C2440A 板載DM9000網(wǎng)卡的硬件特性和操作特點,實現(xiàn)基于VxWorks的DM9000 END驅(qū)動程序。最后修改相應(yīng)bsp,使S3C2440A可以跨平臺通信。
關(guān)鍵詞:S3C2440A;DM9000;VxWorks;EDN;網(wǎng)卡驅(qū)動程序
中圖分類號:TP311.11 文獻標識碼:B
文章編號:1004-373X(2008)06-024-03
Driver of DM9000 Base on VxWorks
CHENG Rui LEI Zhiyong WANG Hao2,LI Jing ZHAO Xiongtao1
(1.Electronic Information Engineering College,Xi′an Technological University,Xi′an,710032,China;
[JZ]2.Department of Computer Science,Xidian University,Xi′an,710071,China)
Abstract:With the extensive application of VxWorks,how to make VxWorks support various hardware platforms is an urgent problem must to be solved.Firstly this article introduces the development direction of Large Format Scanner and the superiority of VxWorks.Then,analyzes the SENS protocol in VxWorks stressed;the frame of END driver base on VxWorks;the peculiarity of hardware and the trait of operate which DM9000 network card has,then the end driver of DM9000 based on VxWorks achieved.Finally,modified the bsp,ensure the S3C2440A can communicate between different operating system.
Keywords:S3C2440A;DM9000;VxWorks;END;network card driver
1 引 言
大幅面圖像輸入掃描儀是目前我軍和我國地理信息系統(tǒng)、建筑、電子、水利、石油、市政、郵電、電力、航天、航空、管道線路布置等企事業(yè)單位迫切需要的設(shè)備。基于大幅面工程掃描儀強大的需求背景,對與掃描儀配合使用體積小、實時性高的嵌入式系統(tǒng)的需求也是相當緊迫。針對這一需求,所在項目組設(shè)計開發(fā)了“工程掃描儀嵌入式系統(tǒng)”,旨在實現(xiàn)掃描儀設(shè)備的圖像能夠?qū)崟r、準確的通過嵌入式開發(fā)板(RSC S3C2440A開發(fā)板)傳入上位機,從而由上位機對圖像進行處理。
2 軟件及硬件平臺簡介
2.1 VxWorks操作系統(tǒng)簡介
VxWorks操作系統(tǒng)是美國風(fēng)河公司(Wind-River-System 公司,WRS)推出的一款高性能、可裁減的嵌入式實時操作系統(tǒng)。他以良好的可靠性和卓越的實時性被廣泛地應(yīng)用在通信、軍事、航空、航天等高精尖技術(shù)及實時性要求極高的領(lǐng)域中。隨著Internet和嵌入式技術(shù)的飛速發(fā)展,需要接入網(wǎng)絡(luò)的嵌入式設(shè)備越來越多,新版本的VxWorks也增加了更多的網(wǎng)絡(luò)功能。然而,由于嵌入式設(shè)備硬件的多樣性和操作系統(tǒng)廠商不可能對所有設(shè)備的聯(lián)網(wǎng)提供支持。因此,開發(fā)自己的VxWorks下運行的網(wǎng)絡(luò)驅(qū)動程序就顯得越來越重要。本文將針對自己的硬件平臺(RSC S3C2440A),進行相應(yīng)的網(wǎng)卡驅(qū)動開發(fā)。
2.2 DM9000芯片介紹
DM9000芯片是一款高度集成、低功耗的10/100 Mb/s以太網(wǎng)芯片,擁有一個通用的處理器接口、一個E2PROM接口、和4 k-dword SRAM緩存數(shù)據(jù)區(qū)(3 kB Tx 先進先出緩沖;13 kb Rx 先進先出緩沖)。此款芯片是為低功耗的處理器設(shè)計的,支持3.3 V供電,I/O端口最高可接入5 V電壓。DM9000芯片可以根據(jù)處理器情況提供8/16/32 b三種不同的連接方式,從而支持更多型號處理器。在RSC S3C2440A開發(fā)板上采用的是16 b的連接方法與三星S3C2440型ARM芯片相連,為開發(fā)板提供嵌入式的以太網(wǎng)接口。
3 DM9000 END網(wǎng)絡(luò)驅(qū)動程序的實現(xiàn)
3.1 SENS協(xié)議棧
VxWorks支持可裁減的增強型網(wǎng)絡(luò)堆棧(Scalable Enhanced Networks Stack,SENS),并且提供了可替換的網(wǎng)絡(luò)設(shè)備驅(qū)動程序——增強的網(wǎng)絡(luò)驅(qū)動程序(Enhanced Networks Driver,END)。SENS協(xié)議棧層次如圖1所示:
SENS的基本層次結(jié)構(gòu)和傳統(tǒng)的TCP/IP網(wǎng)絡(luò)協(xié)議棧相似,但從圖1中可以看SENS最大的特點是在數(shù)據(jù)鏈路層和網(wǎng)絡(luò)協(xié)議層之間多了MUX層。在SENS中,網(wǎng)絡(luò)接口的驅(qū)動程序,即END網(wǎng)絡(luò)驅(qū)動程序處于數(shù)據(jù)鏈路層。IP層和TCP/UDP層合稱為網(wǎng)絡(luò)協(xié)議層。在數(shù)據(jù)鏈路層和網(wǎng)絡(luò)協(xié)議層之間有應(yīng)用程序接口(API),這個接口在SENS中叫做MUX(Multiplexer)接口。MUX層直接與END驅(qū)動程序相交互,其應(yīng)用程序提供了獨立于網(wǎng)絡(luò)協(xié)議的驅(qū)動程序接口,可以與多個獨立的END驅(qū)動程序同時交互。
從圖1可以看出,接口層MUX起到了隔離網(wǎng)絡(luò)協(xié)議和網(wǎng)絡(luò)驅(qū)動程序的作用。并且管理協(xié)議層和數(shù)據(jù)鏈路層之間的通信,使數(shù)據(jù)的發(fā)送和接受過程變的簡單,而不需要通過掛接鉤子函數(shù)來解決。
3.2 DM9000 的編程方法
DM9000通過兩個端口實現(xiàn)對他的基本操作。這2個地址是:數(shù)據(jù)端口(DATA port)和地址端口(ADDRESS port)。外界只能通過這2個端口和DM9000進行交互。下面簡單介紹DM9000進行數(shù)據(jù)收發(fā)的過程。
3.2.1 寄存器的讀寫
在訪問DM9000數(shù)據(jù)之前,要設(shè)置地址寄存器,將指針指向要訪問的數(shù)據(jù)空間。這時再訪問數(shù)據(jù)端口就會得到相應(yīng)寄存器中的數(shù)據(jù)。同樣,地址端口被賦值后,對數(shù)據(jù)端口的操作就會完全映到相應(yīng)的片內(nèi)內(nèi)存空間,這樣當于對DM9000片內(nèi)地址空間進行1次映射。
讀寫過程如圖2所示。
3.2.2 數(shù)據(jù)包的接收
DM9000在接收數(shù)據(jù)時采用中斷方式,即當數(shù)據(jù)到來時,并通過DM9000內(nèi)部CRC校驗后,會產(chǎn)生一個接收中斷。中斷發(fā)生時可以將DM9000所接收到的數(shù)據(jù)包讀出并且交給上層協(xié)議進行處理。
接收到的數(shù)據(jù)在存放到接收緩沖內(nèi)存中的結(jié)構(gòu)如圖3所示。
3.2.3 數(shù)據(jù)包的發(fā)送
數(shù)據(jù)包的發(fā)送主要是依靠DM9000中的發(fā)送數(shù)據(jù)緩存區(qū)。發(fā)送數(shù)據(jù)時要求驅(qū)動函數(shù)將發(fā)送數(shù)據(jù)寫入DM9000的發(fā)送數(shù)據(jù)緩沖區(qū),當DM9000檢測到處理器發(fā)來的數(shù)據(jù)發(fā)送信號后,將寫入緩沖區(qū)的數(shù)據(jù)包處理成Ethernet數(shù)據(jù)包形式進行發(fā)送,在發(fā)送的過程中還可以繼續(xù)接受數(shù)據(jù)包的寫入,所以有2組狀態(tài)寄存器和控制寄存器實現(xiàn)發(fā)送的控制和狀態(tài)檢查。
3.3 DM9000 END 驅(qū)動程序
網(wǎng)絡(luò)設(shè)備和系統(tǒng)之間的數(shù)據(jù)交換實際上是數(shù)據(jù)的發(fā)送和接受問題,數(shù)據(jù)的發(fā)送和接受一般有2種方式:中斷和輪詢。本文采用的是中斷方式。
3.3.1 END驅(qū)動程序中的基本數(shù)據(jù)結(jié)構(gòu)
END_OBJ:END_OBJ中定義所有網(wǎng)絡(luò)相關(guān)的部分,提供一個獨立于設(shè)備的數(shù)據(jù)結(jié)構(gòu)。在定義驅(qū)動程序控制數(shù)據(jù)結(jié)構(gòu)(如:DM9000END_DEVICE)時,要包含END_OBJ結(jié)構(gòu),并且必須將其放在結(jié)構(gòu)體第一位。END_OBJ中有2個重要的數(shù)據(jù)結(jié)構(gòu),DEV_OBJ和NET_FUNCS。同時還包含接受過程的回調(diào)函數(shù)指針以及與協(xié)議相關(guān)的數(shù)據(jù),這些數(shù)據(jù)都是為MUX層提供服務(wù)的。
DEV_OBJ:DEV_OBJ包括設(shè)備名、設(shè)備描述等信息,用戶驅(qū)動程序使用該結(jié)構(gòu)來控制設(shè)備。其中最重要的是他包含一個指向用戶頂?shù)尿?qū)動程序控制結(jié)構(gòu)的指針——pDevice。
NET_FUNCS:NET_FUNCS包含了網(wǎng)絡(luò)驅(qū)動程序各個函數(shù)的入口點。包括:開始和停止網(wǎng)絡(luò)設(shè)備函數(shù)、發(fā)送網(wǎng)絡(luò)數(shù)據(jù)包函數(shù)、網(wǎng)絡(luò)設(shè)備控制函數(shù)、在輪詢模式下發(fā)送和接受函數(shù)等。
3.3.2 END驅(qū)動程序的函數(shù)實現(xiàn)
在END驅(qū)動程序中,需要實現(xiàn)設(shè)備加載、設(shè)備卸載、設(shè)備控制、發(fā)送和接收、設(shè)備啟動和停止設(shè)備、輪詢發(fā)送和接受等功能函數(shù)。下面給出幾個重要功能函數(shù)的實現(xiàn)。
加載網(wǎng)絡(luò)設(shè)備:DM9000EndLoad()是DM9000驅(qū)動程序的初始化入口點,該函數(shù)的參數(shù)由tUserRoot任務(wù)在調(diào)用muxDevLoad()傳入,muxDevLoad()進而使用該參數(shù)調(diào)用DM9000EndLoad()。DM9000EndLoad()中執(zhí)行幾個必要操作:初始化END_OBJ結(jié)構(gòu)、初始化網(wǎng)絡(luò)緩沖內(nèi)存、初始化MIB、設(shè)置網(wǎng)絡(luò)準備好標志。其函數(shù)格式:END_OBJ * DM9000EndLoad(char*initString)。其中initString由網(wǎng)絡(luò)設(shè)備表(endDevTbl[])中的成員提供。設(shè)備的所有特殊參數(shù)都是通過initString參數(shù)進行傳遞的。他包含如下特殊參數(shù):設(shè)備寄存器基地址、中斷向量、中斷級、共享緩沖區(qū)地址等。
啟動網(wǎng)絡(luò)設(shè)備:DM9000Start()函數(shù)實現(xiàn)設(shè)備停止校驗操作、注冊驅(qū)動程序的中斷服務(wù)程序、打開設(shè)備中斷、記錄設(shè)備啟動和啟動設(shè)備。他調(diào)用bsp的函數(shù)連接中斷和驅(qū)動程序設(shè)備,使設(shè)備工作在中斷模式下。其函數(shù)格式:STATUS DM9000Start(DM9000END_DEVICE *pDrvCtrl)。啟動設(shè)備成功時,返回OK。函數(shù)實現(xiàn)如下:
STATUS DM9000Start(DM9000END_DEVICE * pDrvCtrl)
{
…
/*驅(qū)動程序的中斷服務(wù)程序和設(shè)備中斷連接*/
SYS_INT_CONNECT(pDrvCtrl,DM9000Int,(int) pDrvCtrl,result);
if( result == ERROR)return ERROR;
…
/*打開中斷設(shè)備*/
SYS_INT_ENABLE(pDrvCtrl);
…
}
發(fā)送數(shù)據(jù)包:DM9000Send()實現(xiàn)如下功能:獲得發(fā)送器的使用權(quán)、查詢發(fā)送緩沖區(qū)、啟動設(shè)備發(fā)送數(shù)據(jù)、統(tǒng)計MIB-Ⅱ錯誤數(shù)和釋放已經(jīng)發(fā)送的數(shù)據(jù)包。函數(shù)原形如下所示:STATUS DM9000Send(DM9000END_DEVICE *pDrvCtrl,M_BLK_ID pBuf)。該函數(shù)從發(fā)送數(shù)據(jù)緩沖區(qū)M_BLK_ID中取出數(shù)據(jù)包,因此在安裝驅(qū)動程序的時候必須給出這個緩沖區(qū)的地址信息。然后通過semTake()獲得發(fā)送權(quán),發(fā)送成功后,釋放已發(fā)送數(shù)據(jù)包的緩沖區(qū)。函數(shù)實現(xiàn)如下:
STATUS DM9000Send(DM9000END_DEVICE *pDrvCtrl,M_BLK_ID pBuf)
{
…
/*獲得發(fā)送權(quán)*/
if(!(pDrvCtrl->flagsDM9000_POLLING))
END_TX_SEM_TAKE(pDrvCtrl->end,WAIT_FOREVER);
…
/*釋放緩沖區(qū)*/
if(freeNow)
netMblkClChainFree(pMblk);
return (OK);
}
4 加入DM9000驅(qū)動程序
首先在config.h文件中添加:
#defineINCLUDE_END
#defineINCLUDE_DM9000_END
然后在configNet.h文件中的endDecTbl[]表添加新的裝載函數(shù)。如下:
END_TBL_ENTRY endDevTbl[] = {
…
#ifdef INCLUDE_DM9000_END
{0,DM9000EndLoad,DM9000LaodString,DM900BuffLoan,NULL,F(xiàn)ALSE}
#endif
…
};
通過以上步驟,DM9000的驅(qū)動程序已經(jīng)添加到bsp中,只要進行編譯,就可以生成所需要的帶有DM9000驅(qū)動的VxWorks鏡像文件。實現(xiàn)RSC S3C2440A和主機的網(wǎng)絡(luò)通信。
5 結(jié) 語
通過分析VxWorks嵌入式實時操作系統(tǒng)的網(wǎng)絡(luò)協(xié)議棧以及END網(wǎng)絡(luò)驅(qū)動程序模型,以網(wǎng)絡(luò)控制器DM9000為實例,重點介紹DM9000驅(qū)動程序中加載網(wǎng)絡(luò)設(shè)備、啟動網(wǎng)絡(luò)設(shè)備和發(fā)送數(shù)據(jù)包的函數(shù)實現(xiàn)。由于不同網(wǎng)卡控制器存在內(nèi)部差異,因此在網(wǎng)卡驅(qū)動程序開發(fā)過程中,針對不同的網(wǎng)卡要注意一些細節(jié)的區(qū)別。
參考文獻
[1]Wind River.VxWorks Network Programmer′s Guide 5.5[D].USA:Wind River System,Inc.2002.
[2]DM9000 Datasheet[D].2002.
[3]周啟平.VxWorks下設(shè)備驅(qū)動程序及BSP開發(fā)指南[M].北京:中國電力出版社,2004.
[4]周啟平.VxWorks開發(fā)指南與Tornado使用手冊[M].北京:中國電力出版社,2004.
[5]高超,郝燕玲,吳潤.VxWorks下網(wǎng)卡驅(qū)動程序的開發(fā)[J].微計算機信息,2004(9):10-11.
[6]王姍姍,秦開宇,談秀娟.VxWorks下的交互式用戶界面開發(fā)\\[J\\].現(xiàn)代電子技術(shù),2007,30(4):58-60.
作者簡介 成 銳 男,1983年出生,山東泰安人,在讀碩士研究生。研究方向為控制理論和控制工程。
王 浩 男,1981年出生,寧夏吳忠人,碩士研究生。主要研究方向為嵌入式操作系統(tǒng)。