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