摘 要:隨著嵌入式操作系統VxWorks的廣泛應用,如何讓VxWorks支持各種硬件平臺成了急需解決的問題。首先介紹大幅面掃描儀的發展趨勢以及嵌入式操作系統VxWorks的優勢。然后通過分析VxWorks的SENS協議棧;VxWorks下END網絡驅動程序的結構;S3C2440A 板載DM9000網卡的硬件特性和操作特點,實現基于VxWorks的DM9000 END驅動程序。最后修改相應bsp,使S3C2440A可以跨平臺通信。
關鍵詞:S3C2440A;DM9000;VxWorks;EDN;網卡驅動程序
中圖分類號: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 引 言
大幅面圖像輸入掃描儀是目前我軍和我國地理信息系統、建筑、電子、水利、石油、市政、郵電、電力、航天、航空、管道線路布置等企事業單位迫切需要的設備。基于大幅面工程掃描儀強大的需求背景,對與掃描儀配合使用體積小、實時性高的嵌入式系統的需求也是相當緊迫。針對這一需求,所在項目組設計開發了“工程掃描儀嵌入式系統”,旨在實現掃描儀設備的圖像能夠實時、準確的通過嵌入式開發板(RSC S3C2440A開發板)傳入上位機,從而由上位機對圖像進行處理。
2 軟件及硬件平臺簡介
2.1 VxWorks操作系統簡介
VxWorks操作系統是美國風河公司(Wind-River-System 公司,WRS)推出的一款高性能、可裁減的嵌入式實時操作系統。他以良好的可靠性和卓越的實時性被廣泛地應用在通信、軍事、航空、航天等高精尖技術及實時性要求極高的領域中。隨著Internet和嵌入式技術的飛速發展,需要接入網絡的嵌入式設備越來越多,新版本的VxWorks也增加了更多的網絡功能。然而,由于嵌入式設備硬件的多樣性和操作系統廠商不可能對所有設備的聯網提供支持。因此,開發自己的VxWorks下運行的網絡驅動程序就顯得越來越重要。本文將針對自己的硬件平臺(RSC S3C2440A),進行相應的網卡驅動開發。
2.2 DM9000芯片介紹
DM9000芯片是一款高度集成、低功耗的10/100 Mb/s以太網芯片,擁有一個通用的處理器接口、一個E2PROM接口、和4 k-dword SRAM緩存數據區(3 kB Tx 先進先出緩沖;13 kb Rx 先進先出緩沖)。此款芯片是為低功耗的處理器設計的,支持3.3 V供電,I/O端口最高可接入5 V電壓。DM9000芯片可以根據處理器情況提供8/16/32 b三種不同的連接方式,從而支持更多型號處理器。在RSC S3C2440A開發板上采用的是16 b的連接方法與三星S3C2440型ARM芯片相連,為開發板提供嵌入式的以太網接口。
3 DM9000 END網絡驅動程序的實現
3.1 SENS協議棧
VxWorks支持可裁減的增強型網絡堆棧(Scalable Enhanced Networks Stack,SENS),并且提供了可替換的網絡設備驅動程序——增強的網絡驅動程序(Enhanced Networks Driver,END)。SENS協議棧層次如圖1所示:

SENS的基本層次結構和傳統的TCP/IP網絡協議棧相似,但從圖1中可以看SENS最大的特點是在數據鏈路層和網絡協議層之間多了MUX層。在SENS中,網絡接口的驅動程序,即END網絡驅動程序處于數據鏈路層。IP層和TCP/UDP層合稱為網絡協議層。在數據鏈路層和網絡協議層之間有應用程序接口(API),這個接口在SENS中叫做MUX(Multiplexer)接口。MUX層直接與END驅動程序相交互,其應用程序提供了獨立于網絡協議的驅動程序接口,可以與多個獨立的END驅動程序同時交互。
從圖1可以看出,接口層MUX起到了隔離網絡協議和網絡驅動程序的作用。并且管理協議層和數據鏈路層之間的通信,使數據的發送和接受過程變的簡單,而不需要通過掛接鉤子函數來解決。
3.2 DM9000 的編程方法
DM9000通過兩個端口實現對他的基本操作。這2個地址是:數據端口(DATA port)和地址端口(ADDRESS port)。外界只能通過這2個端口和DM9000進行交互。下面簡單介紹DM9000進行數據收發的過程。
3.2.1 寄存器的讀寫
在訪問DM9000數據之前,要設置地址寄存器,將指針指向要訪問的數據空間。這時再訪問數據端口就會得到相應寄存器中的數據。同樣,地址端口被賦值后,對數據端口的操作就會完全映到相應的片內內存空間,這樣當于對DM9000片內地址空間進行1次映射。
讀寫過程如圖2所示。
3.2.2 數據包的接收
DM9000在接收數據時采用中斷方式,即當數據到來時,并通過DM9000內部CRC校驗后,會產生一個接收中斷。中斷發生時可以將DM9000所接收到的數據包讀出并且交給上層協議進行處理。
接收到的數據在存放到接收緩沖內存中的結構如圖3所示。
3.2.3 數據包的發送
數據包的發送主要是依靠DM9000中的發送數據緩存區。發送數據時要求驅動函數將發送數據寫入DM9000的發送數據緩沖區,當DM9000檢測到處理器發來的數據發送信號后,將寫入緩沖區的數據包處理成Ethernet數據包形式進行發送,在發送的過程中還可以繼續接受數據包的寫入,所以有2組狀態寄存器和控制寄存器實現發送的控制和狀態檢查。


3.3 DM9000 END 驅動程序
網絡設備和系統之間的數據交換實際上是數據的發送和接受問題,數據的發送和接受一般有2種方式:中斷和輪詢。本文采用的是中斷方式。
3.3.1 END驅動程序中的基本數據結構
END_OBJ:END_OBJ中定義所有網絡相關的部分,提供一個獨立于設備的數據結構。在定義驅動程序控制數據結構(如:DM9000END_DEVICE)時,要包含END_OBJ結構,并且必須將其放在結構體第一位。END_OBJ中有2個重要的數據結構,DEV_OBJ和NET_FUNCS。同時還包含接受過程的回調函數指針以及與協議相關的數據,這些數據都是為MUX層提供服務的。
DEV_OBJ:DEV_OBJ包括設備名、設備描述等信息,用戶驅動程序使用該結構來控制設備。其中最重要的是他包含一個指向用戶頂的驅動程序控制結構的指針——pDevice。
NET_FUNCS:NET_FUNCS包含了網絡驅動程序各個函數的入口點。包括:開始和停止網絡設備函數、發送網絡數據包函數、網絡設備控制函數、在輪詢模式下發送和接受函數等。
3.3.2 END驅動程序的函數實現
在END驅動程序中,需要實現設備加載、設備卸載、設備控制、發送和接收、設備啟動和停止設備、輪詢發送和接受等功能函數。下面給出幾個重要功能函數的實現。
加載網絡設備:DM9000EndLoad()是DM9000驅動程序的初始化入口點,該函數的參數由tUserRoot任務在調用muxDevLoad()傳入,muxDevLoad()進而使用該參數調用DM9000EndLoad()。DM9000EndLoad()中執行幾個必要操作:初始化END_OBJ結構、初始化網絡緩沖內存、初始化MIB、設置網絡準備好標志。其函數格式:END_OBJ * DM9000EndLoad(char*initString)。其中initString由網絡設備表(endDevTbl[])中的成員提供。設備的所有特殊參數都是通過initString參數進行傳遞的。他包含如下特殊參數:設備寄存器基地址、中斷向量、中斷級、共享緩沖區地址等。
啟動網絡設備:DM9000Start()函數實現設備停止校驗操作、注冊驅動程序的中斷服務程序、打開設備中斷、記錄設備啟動和啟動設備。他調用bsp的函數連接中斷和驅動程序設備,使設備工作在中斷模式下。其函數格式:STATUS DM9000Start(DM9000END_DEVICE *pDrvCtrl)。啟動設備成功時,返回OK。函數實現如下:
STATUS DM9000Start(DM9000END_DEVICE * pDrvCtrl)
{
…
/*驅動程序的中斷服務程序和設備中斷連接*/
SYS_INT_CONNECT(pDrvCtrl,DM9000Int,(int) pDrvCtrl,result);
if( result == ERROR)return ERROR;
…
/*打開中斷設備*/
SYS_INT_ENABLE(pDrvCtrl);
…
}
發送數據包:DM9000Send()實現如下功能:獲得發送器的使用權、查詢發送緩沖區、啟動設備發送數據、統計MIB-Ⅱ錯誤數和釋放已經發送的數據包。函數原形如下所示:STATUS DM9000Send(DM9000END_DEVICE *pDrvCtrl,M_BLK_ID pBuf)。該函數從發送數據緩沖區M_BLK_ID中取出數據包,因此在安裝驅動程序的時候必須給出這個緩沖區的地址信息。然后通過semTake()獲得發送權,發送成功后,釋放已發送數據包的緩沖區。函數實現如下:
STATUS DM9000Send(DM9000END_DEVICE *pDrvCtrl,M_BLK_ID pBuf)
{
…
/*獲得發送權*/
if(!(pDrvCtrl->flagsDM9000_POLLING))
END_TX_SEM_TAKE(pDrvCtrl->end,WAIT_FOREVER);
…
/*釋放緩沖區*/
if(freeNow)
netMblkClChainFree(pMblk);
return (OK);
}
4 加入DM9000驅動程序
首先在config.h文件中添加:
#defineINCLUDE_END
#defineINCLUDE_DM9000_END
然后在configNet.h文件中的endDecTbl[]表添加新的裝載函數。如下:
END_TBL_ENTRY endDevTbl[] = {
…
#ifdef INCLUDE_DM9000_END
{0,DM9000EndLoad,DM9000LaodString,DM900BuffLoan,NULL,FALSE}
#endif
…
};
通過以上步驟,DM9000的驅動程序已經添加到bsp中,只要進行編譯,就可以生成所需要的帶有DM9000驅動的VxWorks鏡像文件。實現RSC S3C2440A和主機的網絡通信。
5 結 語
通過分析VxWorks嵌入式實時操作系統的網絡協議棧以及END網絡驅動程序模型,以網絡控制器DM9000為實例,重點介紹DM9000驅動程序中加載網絡設備、啟動網絡設備和發送數據包的函數實現。由于不同網卡控制器存在內部差異,因此在網卡驅動程序開發過程中,針對不同的網卡要注意一些細節的區別。
參考文獻
[1]Wind River.VxWorks Network Programmer′s Guide 5.5[D].USA:Wind River System,Inc.2002.
[2]DM9000 Datasheet[D].2002.
[3]周啟平.VxWorks下設備驅動程序及BSP開發指南[M].北京:中國電力出版社,2004.
[4]周啟平.VxWorks開發指南與Tornado使用手冊[M].北京:中國電力出版社,2004.
[5]高超,郝燕玲,吳潤.VxWorks下網卡驅動程序的開發[J].微計算機信息,2004(9):10-11.
[6]王姍姍,秦開宇,談秀娟.VxWorks下的交互式用戶界面開發\\[J\\].現代電子技術,2007,30(4):58-60.
作者簡介 成 銳 男,1983年出生,山東泰安人,在讀碩士研究生。研究方向為控制理論和控制工程。
王 浩 男,1981年出生,寧夏吳忠人,碩士研究生。主要研究方向為嵌入式操作系統。