POWERPC860T實現(xiàn)多以太網(wǎng)口通信
摘要:摩托羅拉公司的POWER PC系列芯片是眾多嵌入式高端通信設(shè)備的首選。該系列芯片配合主流的實時多任務(wù)操作系統(tǒng)VxWorks,可滿足大多數(shù)高端通信設(shè)備的要求的低功耗、高性能、高可靠性的要求。本文闡述在摩托羅拉公司MPC860系列芯片上實現(xiàn)雙以太網(wǎng)口通信的方法,并給出實現(xiàn)的具體源代碼。
本文引用地址:http://www.ex-cimer.com/article/244638.htm關(guān)鍵詞:POWERPC860 VxWorks TCP/IP 多以太網(wǎng)接口 DRIVER加載 RTOS
通過TCP/IP協(xié)議棧來實現(xiàn)數(shù)據(jù)通信,是目前大多數(shù)通信設(shè)備所必備的。在以太網(wǎng)上實現(xiàn)TCP/IP更是一種價廉物美的選擇。本文描述的正是這種通信設(shè)備一種實現(xiàn)方法。
通信控制設(shè)備大多是嵌入式系統(tǒng),求CPU功耗低、接口種類豐富。POWERPC 860T芯片是摩托羅拉公司MPC860系列通信專用嵌入式CPU的產(chǎn)品,主要特點是增加了1個10/100M自適應(yīng)以太網(wǎng)口,工作頻率可達80MHz,廣泛地用于中、高檔通信設(shè)備。其內(nèi)部結(jié)構(gòu)框圖如圖1所示。
從圖1中可以看出,860T芯片主要由微處理器內(nèi)核(embedded POWEPRPC core)、系統(tǒng)接口單元SIU(System Interface Unit)、通信處理器單元CPM(Communication Processor Module)和快速以太網(wǎng)模塊FEM(Fast Ethernet Module)等組成。由于860T中集成了許多外圍接口的控制器,同F(xiàn)LASH、SRAM、SDRAM等各種存儲器可實現(xiàn)無縫隙連接。外部通信接口一般只需添加線路接口單元。本文實現(xiàn)的系統(tǒng)硬件框圖如圖2所示。FLASH采用的是AM29LV017,SRAM為SODIMM SDRAM條。
MPC860T中I/O口引腳幾乎都有多種功能,通過對有關(guān)的寄存器進行設(shè)置或?qū)⒛承┮_設(shè)置成指定電位,使得有關(guān)I/O口的功能為設(shè)計指定的功能。在設(shè)計時,可能會發(fā)現(xiàn)某些多功能引腳要么只能處于A功能,要么處于B功能,無法使得A、B功能同時滿足。由于MPC860T的引腳多、各引腳的功能也多,為了能夠盡快地確定各引腳的功能,可利用摩托羅拉公司提供的引腳功能安排工具,檢查引腳功能上的沖突。
MPC860T是遵照POWERPC結(jié)構(gòu)體系的嵌入式芯片系列,因此可實現(xiàn)多任務(wù)操作,并支持多種內(nèi)存映射方式,完全能夠運行實時多任務(wù)操作系統(tǒng),以便滿足通信控制設(shè)備所要求的實時性。
Wind River公司的VxWorks實時多任務(wù)嵌入式操作系統(tǒng)是大多數(shù)實時嵌入式系統(tǒng)的首選,具有其它嵌入式操作系統(tǒng)無法比擬的內(nèi)核代碼少、裁剪性強、實時性強、軟件模塊多等優(yōu)點。本文的多網(wǎng)口通信實現(xiàn)是在VxWorks集成環(huán)境TORNADO 2.0下開發(fā)的。關(guān)于VxWorks實時嵌入式操作系統(tǒng)可參見Wind River公司的相關(guān)資料。
VxWorks支持TCP/IP協(xié)議棧,用戶程序可通過BSD套接字方式訪問網(wǎng)絡(luò),工作方式和Windows下的BSD套接字方式基本一樣。
VxWorks的TCP/IP協(xié)議棧與網(wǎng)絡(luò)設(shè)備驅(qū)動的接口有兩種。一種是標(biāo)準(zhǔn)的BSD4驅(qū)動程序。它將驅(qū)動程序和協(xié)議緊密關(guān)聯(lián)在一起,不利于多協(xié)議的支持(后期BSD進行了改進,可實現(xiàn)多協(xié)議的支持)。VxWorks不推薦使用BSD4驅(qū)動程序。另一種標(biāo)準(zhǔn)是VxWorks專有的END(Enhanced Network Driver)驅(qū)動程序。它通過一個稱為MUX的薄層,將驅(qū)動程序和協(xié)議棧隔離開,達到驅(qū)動程序獨立于具體協(xié)議的目的,從而實現(xiàn)多協(xié)議的支持。END驅(qū)動程序技術(shù)多播和輪詢通信方式。因此,我們采用END驅(qū)動程序方式來實現(xiàn)網(wǎng)絡(luò)設(shè)備驅(qū)動程序,擴展通信功能。
VxWorks的驅(qū)動程序既可以在啟動時加載,也可以在系統(tǒng)啟動后加載。不過網(wǎng)絡(luò)驅(qū)動程序,最好是在啟動時加載(本文采用此方式)。VxWorks啟動時,發(fā)起的tUsrRoot任務(wù)初始化網(wǎng)絡(luò)任務(wù)的JOB隊列,同時發(fā)起tNetTask任務(wù)來處理網(wǎng)絡(luò)任務(wù)中的JOB隊列,調(diào)用muxDevLoad()裝載用戶網(wǎng)絡(luò)設(shè)備驅(qū)動程序。之后,通過muxDevStart()啟動該網(wǎng)絡(luò)設(shè)備驅(qū)動程序。
用戶驅(qū)動程序的中斷例程,通過sysIntConnect()掛接在系統(tǒng)的中斷結(jié)構(gòu)上。一般在muxDevStart()中完成該工作。
驅(qū)動程序的中斷例程,一般盡可能少地做一些將接收的數(shù)據(jù)包搬移工作,以減少中斷關(guān)閉的時間。用戶的實際中斷處理服務(wù)例程放在netJob任務(wù)中完成(中斷例程通過netJobAdd()函數(shù)將實際中斷處理服務(wù)例程加到netJob任務(wù)的隊列中)。
用戶在編寫好驅(qū)動程序后,應(yīng)根據(jù)要求修改板級支持軟件包(BSP)中confignet.h的內(nèi)容,以例系統(tǒng)正確加載。主要修改endTb1表。
修改config.h中的相關(guān)內(nèi)容:在默認(rèn)情況下,系統(tǒng)僅僅支持1個網(wǎng)絡(luò)接口。如果在config.h包含了#define FADS_860T,那么默認(rèn)啟動能夠工作的是100M的網(wǎng)絡(luò)接口(motfec0);如果在config.h中沒有包含#define FADS_860T,那么默認(rèn)啟動能夠工作的是10M的網(wǎng)絡(luò)接口(cpm0)。
操作系統(tǒng)根據(jù)啟動參數(shù)來對網(wǎng)絡(luò)接口進行配置,簡要流程如下:
①在usrRoot()中調(diào)用usrNetworkInit()(在prjConfig.c中)。在usrNetworkInit()中調(diào)用:
*usrNetProtoInit()初始化網(wǎng)絡(luò)協(xié)議堆棧(包括BSD Socket Support、Host Table、BSD4.4Ipv4、BSD4.4UDPv4、BSD4.4TCPv4、BSD4.4ICMPv4、BSD4.4IGMPv4以及調(diào)試和show facility部分等等)。
*muxLibInit()初始化連接協(xié)議與END driver的mux層。
*usrEndLibInit()(在comps/src/net/usrEndLib.c中)支持使用mux/END接口的網(wǎng)絡(luò)設(shè)備。
*usrNetworkBoot()使用啟動參數(shù)來初始化一個網(wǎng)絡(luò)設(shè)備。
*usrNetAppInit()初始化網(wǎng)絡(luò)應(yīng)用協(xié)議和一些server,比如RPC、rlogin、telnet server以及ftp server等等。
②在usrEndibInit()中,遍歷configNet.h內(nèi)的endDevTb1[]數(shù)組,調(diào)用muxDevLoad(…)裝載END驅(qū)動程序,并調(diào)用muxDevStart(…)將它啟動。
③在usrNetworkBoot()中調(diào)用:
*usrNetBoot()從命令參數(shù)行(bootline)提取網(wǎng)絡(luò)接口的IP地址、目標(biāo)名字(target name)以及單元號(unit number).
*usrNetmaskGet()獲取接口的網(wǎng)絡(luò)掩碼。
*usrNetworkDevStart()加入并配置一個網(wǎng)絡(luò)設(shè)備(cpm或者motfec)。
④在usrNetworkDevStart()中,調(diào)用usrNetEndDevStart(…)、usrNetBsdDevStart(…)以及usrNetLoopbackStart()。以上3個函數(shù)中,使用命令參數(shù)行啟動了1個物理網(wǎng)絡(luò)接口以及1個本地回路接口。
從以上流程來看,當(dāng)定義了FADS_860T時,默認(rèn)根據(jù)命令參數(shù)行(在config.h中,有一個初始的默認(rèn)值DEFAULT_BOOT_LINE)啟動并配置了一個motfec網(wǎng)絡(luò)接口。
支持雙網(wǎng)口時的修改:
①在config.h中加入#define INCLUDE_CPM這一行。
②在configNet.h中,于#ifndef IP_MAX_UNITS行之前加入1行:#undef IP_MAX_UNITS。在默認(rèn)情況下,由于僅僅支持motfec接口,IP_MAX_UNITS的值為1。因此,需要重新定義IP_MAX_UNITS,使其等于我們加入的mux有關(guān)的網(wǎng)絡(luò)接口的個數(shù)。
③在usrNetEndDevStart(…)中的#endif /*
CPU = =SIMNT*/行之后加入以下幾行代碼;
#ifdef FADS_860T
#ifdef INCLUDE_CPM
usrCPMEndDevStart(“cpm”,1,InInfo[0].target_name,InPnfo[0].ip_address,InInfo[0].netmask);
routeAdd(IpInfo[0].network,IpInfo[0].gateway);
#endif
#endif/*FADS_860T*/
以下是有關(guān)定義以及usrCPMEndDevStart(…)的源代碼:
struct cpmInInfo{
char *target_name; /*目標(biāo)的名稱*/
char *ip_address; /*目標(biāo)的IP地址*/
char *network; /*網(wǎng)絡(luò)*/
int netmask; /*網(wǎng)絡(luò)的掩碼*/
char *gateway; /*網(wǎng)關(guān)*/
};
struct cpmInInfo IpInfo[]= {
{NULL,NULL,NULL,0,NULL},
{NULL,NULL,NULL,0,NULL},
{NULL,NULL,NULL,0,NULL}
};
void usrCPMEndDevStart ();
void usrCPMEndDevStart (
char* pDevName, /*設(shè)備的名稱*/
int unitNum, /*單元號*/
char* pTgtName, /*目標(biāo)機名稱*/
char* pAddrString, /*網(wǎng)絡(luò)地址*/
int netmask /*網(wǎng)絡(luò)掩碼*/
)
{
END_OBJ* pEnd;
M2_INTERFACETBL endM2Tb1;
if(pDevName= =NULL)
return;
#ifdef INCLUDE_END
pEnd=endFindByName(pDevName,unitNum);
if(pEnd= =NULL){
printf(Could not find %s%d,pDevName,unitNum);
returm;
}
if(muxIoctl(pEnd,EIOCGMIB2,(caddr_t)endM2Tbl)= =ERROR)}
printf(Cannot perform EIOCMIB2 ioctl.);
return;
}
if(ipAttach(unitNum,pDevName)!=OK){
printf(Failed to attach to device %s,pDevName);
return;
}
printf(Failed to configure %s%d for IP.,pDevName,unitNum);
return;
}
printf(Attached TCP/IP interface to %s unit %d,
pDevName,unitNum);
#endif /*INCLUDE_END*/
return;
}
以上我們加入的設(shè)備名字由設(shè)備名和unit number組成。在加入第2個網(wǎng)絡(luò)接口之前,第1個網(wǎng)絡(luò)接口motfec0已經(jīng)可以正常工作了。由于所有的ENDDRIVER都是通過遍歷在configNet.h中的endDevTbl[]數(shù)組而啟動的,因此第2個網(wǎng)絡(luò)接口的unit number是1。依次數(shù)推,第3個網(wǎng)絡(luò)接口的unit number是2…。我們加入的第2個網(wǎng)絡(luò)接口的名字為cpml。
在支持雙網(wǎng)口時,不同的網(wǎng)口應(yīng)處在不同的網(wǎng)段上,每一個網(wǎng)口可支持多個網(wǎng)絡(luò)地址。
tcp/ip相關(guān)文章:tcp/ip是什么
評論