文獻標識碼: B
文章編號: 0258-7998(2012)01-0024-04
BM3803MG是由北京微電子技術研究所研制的、具有自主知識產權的SPARC V8構架的國產高可靠嵌入式控制器,能夠穩定運行VxWorks實時操作系統,其性能高、功耗低,可應用于航空、航天等高可靠領域的32 bit抗輻射RISC芯片。本文用該款控制器以及工業級以太網芯片KSZ8851-16mll為某型號研制了系統主控板,該板采用實時操作系統VxWorks編程,并對主控板的板級支持包(BSP)進行設計,從而實現了基于以太網的高可靠和實時的數據處理。本文主要介紹主控板以太網芯片KSZ8851-16mll的VxWorks驅動設計。
1 硬件系統構成
如圖1所示,硬件系統由BM30803MG、FPGA、SDRAM和以太網控制器構成硬件系統。
BM3803MG是基于SPARC V8體系結構的32 bit處理器,可用于板上嵌入式實時計算機系統。BM3803MG芯片內部包含有:整數處理單元、浮點處理單元、獨立的指令和數據Cache、硬件乘法器和除法器、中斷控制器、帶有跟蹤緩沖器的硬件調試單元、2個24 bit定時器、通用I/O接口、看門狗;能夠支持PROM、SRAM、SDRAM和I/O映射空間訪問的存儲器控制器;具有軟件可以控制的省電工作模式;具有可實現 PCI 主機橋(Host bridge)和從屬橋(Guest bridge)功能的PCI 控制器;符合PCI2.3規范的33 MHz PCI接口;完全的三模冗余設計、 EDAC和奇偶校驗。
主要性能指標[1]:
(1)用Dhrystone 2.1作為測試程序、CPU主頻為100 MHz時,處理能力為86 MIPS;用Whetstone作為測試程序、CPU主頻為100 MHz時,浮點處理能力為23 MFLOPS。
(2)抗輻性能:總劑量抗輻能力為100 Krad(Si), 優于1 E-5錯誤/器件/day的SEU事件,優于70 MeV cm2/mg的抗閂鎖能力。BM3803MG總體結構框圖如圖2所示。
2 VxWorks BSP設計
VxWorks是美國風河公司(現已被Intel收購)推出的一款高性能、可裁減的嵌入式實時操作系統,它以其良好的可靠性和卓越的實時性被廣泛地應用在通信、軍事、航空、航天等高精尖技術及實時性要求極高的領域中[2]。由于操作系統廠商不能對所有設備的處理器驅動提供支持,故需要針對不同的硬件平臺進行相關驅動的開發。
2.1 BSP
板級支持包BSP(Board Support Package)是介于底層硬件和上層軟件之間的底層軟件開發包,它將系統中與硬件直接相關的一層軟件獨立出來。本設計中BSP的主要功能是屏蔽硬件、提供操作系統的驅動及硬件驅動。具體功能包括[3]:(1)目標板硬件初始化。主要是CPU的初始化,為整個系統提供底層硬件支持;(2)為操作系統提供設備驅動程序和系統中斷服務程序;(3)定制操作系統的功能。為軟件系統提供一個實時多任務的運行環境;(4)初始化操作系統。為操作系統的正常運行做好準備。
在網卡驅動開發之前,BSP中包括makefile、depend.bm3803、config.h、bm3803.h、romlnit.S、sysALib.S、sysLib.c、sysSeria1.c等,其中config.h中包含特定CPU板的所有包含文件和定義。
2.2 KSZ8851-16mll以太網控制器
KSZ8851-16mll是美國Micrel公司研制的單端口嵌入式控制芯片,它包括一個快速以太網的 MAC控制器、一個8/16 bit的普通主機處理器接口以及在 RXQ(12 KB)和 TXQ(6 KB)之間進行共享的18 KB內部緩沖存儲器,并提供了Wake-on-LAN技術,可有效地解決快速以太網的應用[4];支持大端(Big-Endian)和小端(Little-Endian)的處理器、多幀數據傳輸和接收、IPv4/ IPv6 checksum和32 bit CRC的生成與校驗。此外,KSZ8851-16mll還提供了強大的功率管理功能。
2.3 驅動程序的實現
2.3.1 SENS協議棧
VxWorks支持可裁減的增強型網絡堆棧SENS(Scalable Enhanced Networks Stack),提供了可替換的網絡設備驅動程序。SENS 的基本層次結構與傳統的TCP/IP網絡協議棧相似,但SENS最大的特點是在數據鏈路層和網絡協議層之間多了MUX層。在SENS中,網絡接口的驅動程序即END網絡驅動程序處于數據鏈路層。IP層和TCP/ UDP層合稱為網絡協議層。在數據鏈路層和網絡協議層之間有應用程序接口(API),這個接口在SENS中稱為MUX(Multiplexer)接口。MUX層直接與END 驅動程序相交互,其應用程序提供了獨立于網絡協議的驅動程序接口,可以與多個獨立的END驅動程序同時交互。接口層MUX 起到了隔離網絡協議和網絡驅動程序的作用,并管理協議層和數據鏈路層之間的通信,使數據的發送和接收過程變得簡單,而不需要通過掛接鉤子函數來解決[5]。
2.3.2 編程架構
KSZ8851-16mll BIU主機接口是間接存取數據的總線接口。共享數據總線SD[15:0]由CMD控制信號來決定是地址線還是數據線。由于KSZ8851-16mll 是單端口芯片,外界與芯片只能通過單端口進行交互。下面簡單介紹KSZ8851-16mll 的寄存器的讀寫以及數據的接收與發送過程。
(1)寄存器讀寫操作
訪問KSZ8851-16mll寄存器需要兩個步驟:①置CMD為高,寫寄存器的偏移地址和字節使能號(BEn)到共享數據總線上;②置CMD為低,讀或者寫數據到共享數據總線上。
本文網卡芯片采用大端模式,并且芯片的CMD管腳與主機的地址線A2相連,可以得到KSZ8851-16mll 讀寫寄存器的兩個重要操作程序:
讀寄存器:
*((volatile unsigned short*)(KS8851_IO_BASE+CMD_HIGH))=(unsigned short)(addr | ((BE1 | BE0) <<
((addr+2) & 0x02)));
*data= *((volatile unsigned short *)(KS8851_IO_BASE +
CMD_LOW ));
寫寄存器:
*((volatile unsigned short * )(KS8851_IO_BASE +
CMD_HIGH )) =(UINT16)( addr | ((BE1 | BE0) <<
((addr+2) & 0x02)));
*((volatile unsigned short *)(KS8851_IO_BASE +
CMD_LOW )) = ( UINT16 )( data );
其中,KS8851_IO_BASE表示網卡芯片基地址,CMD_LOW=0(CMD=0),表示共享數據總線是數據線;CMD_HIGH=4(CMD=1),表示共享數據總線是地址線。
(2)數據包接收
KSZ8851-16mll軟件驅動以中斷方式接收數據包,當操作系統接收到中斷時,會調用中斷向量表的中斷服務程序處理網卡中斷(包括對錯誤的檢查和狀態的改變),中斷服務程序把從網卡的接收緩存傳輸到系統緩存的所有費時工作都放在任務層里完成。KSZ8851-16mll接收包的具體流程如圖3所示。
(3)數據包發送
上層應用程序調用KSZ8851-16mll的發送程序實現通過以太網控制器傳送連續的數據塊,如圖4所示。數據包的發送主要是依靠KSZ8851-16mll中的發送數據緩存區, 軟件驅動將發送數據寫入發送數據緩沖區。當網卡芯片檢測到處理器發來的數據發送信號后,將寫入發送緩沖區的數據包處理成Ethernet數據包的形式進行發送。如果以太網控制器傳輸數據時出現錯誤,用戶可以決定重新發送該幀數據還是丟棄該幀數據。
2.4 END網絡驅動程序
網絡設備發送和接收數據包一般有中斷和輪詢兩種方式,本文采用中斷方式。
2.4.1 END驅動程序中的基本數據結構
END_0BJ:END_0BJ中定義所有網絡相關的部分,提供一個獨立于設備的數據結構,在這個數據結構中包含了設備名稱、設備編號、設備描述以及設備指針等與設備相關的基本信息。這些信息只是提供設備的一個描述,不包含控制信息[5]。
2.4.2 END驅動程序的函數實現
在END驅動程序中,需要實現設備的加載、卸載、控制、發送和接收、設備啟動和停止、輪詢發送和接收等功能函數。下面給出幾個重要功能函數的實現:
(1)加載網絡設備函數KS8851EndLoad():是KSZ8851-
16mll驅動程序的初始化入口點。KS8851EndLoad()中執行幾個必要操作:初始化END_OBJ結構、初始化網絡緩沖內存、初始化MIB、設置網絡準備好標志。
(2)啟動設備函數KS8851Start():其作用是使設備處于活動狀態和注冊中斷服務程序。函數實現如下:
STATUS KS8851Start(DRV_CTRL * pDrvCtrl)
{
/*驅動程序的中斷服務程序和設備中斷連接*/
intConnect((VOIDFUNCPTR *)IVEC_EXTINT0,
(VOIDFUNCPTR)ks8851EndInt, (int)pDrvCtrl);
/*打開中斷設備*/
(* ks8851IntEnable) (INUM_TO_LVL(pDrvCtrl->ilevel));
}
其中,intConnect()函數實現注冊驅動程序的中斷服務程序,KS8851IntEnable是對CPU與網卡相連的中斷進行使能。
(3)發送數據包函數KS8851EndSend():獲得發送器的使用權、查詢發送緩沖區、啟動設備發送數據、統計MIB的錯誤數和釋放已經發送的數據包[6]。當要發送數據包時,上層應用程序將要發送的數據包寫入協議層的緩沖區中交由協議層進行處理,經協議層處理的包含了協議層附加信息的數據包將被發送給MUX層的接口函數muxSend( ),再由KS8851EndSend()函數寫入緩沖由網卡發送出去。
(4)接收數據包函數KS8851reveive( ):當接收一個數據包時會觸發一個中斷,網卡的中斷服務程序(KS8851EndInt( ))將通過調用netJobAdd( )向任務隊列注冊一個網絡任務,此網絡任務為數據包接收函數(KS8851reveive( )),負責接收數據包。KS8851reveive( )由tNettask來調用。接收到的數據包由MUX的接口函數muxReveive調用協議層的接口函數stackRcvRtn傳遞到協議層,最終數據到達應用層的緩沖區中。應用層程序通過read( )函數對其讀取。數據包經過物理層到達數據鏈路層,然后通過MUX 層到達網絡層,再通過TCP/IP 協議層到達應用層,即完成了數據包接收的全過程[7]。
3 向BSP中添加驅動程序
已經編寫好的網卡驅動程序加入BSP中需要以下幾步:
(1)修改sysLib.c:
使能外部中斷0,并設置中斷觸發方式為邊沿觸發。
(2)在config.h中添加如下語句:
#define INCLUDE_END
#define INCLUDE_KS8851_END
(3)在configNet.h中添加新的裝載函數:
END_TBL_ENTRY endDevTbl [] =
{
.....
#ifdef INCLUDE_KS_8851_END
{0,KS8851_LOAD_FUNC, KS8851_LOAD_STRING,
KS8851_BUFF_LOAN,NULL, FALSE},
#endif
.....
};
通過以上步驟,驅動程序已經添加到BSP中,編譯后生成所需要的帶有KSZ8851-16mll驅動的VxWorks_rom鏡像文件,下載到開發板里,實現開發板與主機間的網絡通信。
4 基于ROM的VxWorks鏡像下載流程
網卡的驅動程序完成之后,需對驅動程序進行測試,查出驅動程序潛在的缺陷以及驗證驅動功能是否完善。測試環境如圖5所示。
本文使用BM3803MG專用燒寫軟件燒寫VxWorks_rom鏡像的過程如下:(1)把生成VxWorks_rom鏡像轉換成存儲器鏡像VxWorks_rom.bin;(2)運行BM3803MG的專用燒寫軟件,使用Flash映像生成功能,在VxWorks_rom的工程目錄下,自動生成flash_content.bin、program_flash_in_ram.exe和program_flash_in_ram.bin。其中,flash_content.bin為待引導VxWorks_rom.bin的flash映像,program_flash_in_ram.exe為燒寫flash_content.bin的燒寫程序,program_flash_in_ram.bin為此燒寫程序的RAM映像;(3)將program_flash_in_ram.bin燒寫到Flash中后,即完成了VxWorks_rom鏡像下載到目標板的任務。
BSP程序的開發與單純的應用軟件不同,BSP程序在開發過程中會遇到很多硬件的問題,如時序匹配和信號完整性問題等。因此,在開發BSP之前,需盡量熟悉嵌入式系統的硬件以及硬件的初始化、寄存器訪問方式以及硬件的時序等,并完成相關的調試工作,為開發BSP打好基礎[5]。
本文實現了VxWorks下基于BM3803MG的KSZ8851以太網BSP,滿足了空間應用項目的嵌入式控制系統的高可靠、實時數據處理的需求,為空間高可靠控制系統提供了一種解決方案。
參考文獻
[1] 北京微電子技術研究所.BM3101 SoC芯片用戶手冊v1.4 [M].2010:2-10.
[2] 強新建,田澤,淮治華.VxWorks下驅動程序的設計[J].西安石油大學學報,2010,25(3):83-84.
[3] 袁浩,肖沙里.基于MPC8260的VxWorks系統的BSP實現[J].微處理機,2009(1):170-173.
[4] Micrel Inc.Micrel_datasheet_ksz8851-16mll[M].2009:26- 30.
[5] 成銳,雷志勇,王浩,等.基于VxWorks的DM9000網卡驅 動[J].計算機應用技術,2007,269(6):24-26.
[6] 王景剛,鄧如玉,楊小平.基于VxWorks的驅動程序設計[J].中國新技術與產品,2010,10(27):28-29.
[7] 劉玉彬.基于VxWorks 的S3C2440開發板上DM9000網絡芯片驅動開發[D].西安:西安電子科技大學,2007:37-50.