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