POWERPC860T实现多以太网口通信

2006-05-07 15:50:09来源: 互联网

嵌入式高端通信设备的首选。该系列芯片配合主流的实时多任务操作系统VxWorks,可满足大多数高端通信设备的要求的低功耗、高性能、高可靠性的要求。本文阐述在摩托罗拉公司MPC860系列芯片上实现以太网口通信的方法,并给出实现的具体源代码。

通过TCP/IP协议栈来实现数据通信,是目前大多数通信设备所必备的。在以太网上实现TCP/IP更是一种价廉物美的选择。本文描述的正是这种通信设备一种实现方法。

通信控制设备大多是嵌入式系统,求CPU功耗低、接口种类丰富。POWERPC 860T芯片是摩托罗拉公司MPC860系列通信专用嵌入式CPU的产品,主要特点是增加了1个10/100M自适应以太网口,工作频率可达80MHz,广泛地用于中、高档通信设备。其内部结构框图如图1所示。

从图1中可以看出,860T芯片主要由微处理器内核(embedded POWEPRPC core)、系统接口单元SIU(System Interface Unit)、通信处理器单元CPM(Communication Processor Module)和快速以太网模块FEM(Fast Ethernet Module)等组成。由于860T中集成了许多外围接口的控制器,同FLASH、SRAM、SDRAM等各种存储器可实现无缝隙连接。外部通信接口一般只需添加线路接口单元。本文实现的系统硬件框图如图2所示。FLASH采用的是AM29LV017,SRAM为SODIMM SDRAM条。

    CPU部分的4个SCC均可配置为10M以太网控制器,FEM为一个10/100M以太网自适应控制器。通过这些以太网控制器,只需简单的线路接口单元就可构成10M以太网口和10/100M自适应网口。该以太网口符合IEEE802.3规范。实际使用中,860T设备多少个网口,应根据芯片的运行主频和接口要求来统筹考虑。在设计时,相关的性能计算可使用摩托罗拉公司推供的软件进行估算。我们在50 MHz MPC860T芯片上,实现了1个10M网口(采用SCC1实现,如图3所示)和1个10/100M自适应网口(如图4所示)。

MPC860T中I/O口引脚几乎都有多种功能,通过对有关的寄存器进行设置或将某些引脚设置成指定电位,使得有关I/O口的功能为设计指定的功能。在设计时,可能会发现某些多功能引脚要么只能处于A功能,要么处于B功能,无法使得A、B功能同时满足。由于MPC860T的引脚多、各引脚的功能也多,为了能够尽快地确定各引脚的功能,可利用摩托罗拉公司提供的引脚功能安排工具,检查引脚功能上的冲突。

MPC860T是遵照POWERPC结构体系的嵌入式芯片系列,因此可实现多任务操作,并支持多种内存映射方式,完全能够运行实时多任务操作系统,以便满足通信控制设备所要求的实时性。

Wind River公司的VxWorks实时多任务嵌入式操作系统是大多数实时嵌入式系统的首选,具有其它嵌入式操作系统无法比拟的内核代码少、裁剪性强、实时性强、软件模块多等优点。本文的多网口通信实现是在VxWorks集成环境TORNADO 2.0下开发的。关于VxWorks实时嵌入式操作系统可参见Wind River公司的相关资料。

VxWorks支持TCP/IP协议栈,用户程序可通过BSD套接字方式访问网络,工作方式和Windows下的BSD套接字方式基本一样。

VxWorks的TCP/IP协议栈与网络设备驱动的接口有两种。一种是标准的BSD4驱动程序。它将驱动程序和协议紧密关联在一起,不利于多协议的支持(后期BSD进行了改进,可实现多协议的支持)。VxWorks不推荐使用BSD4驱动程序。另一种标准是VxWorks专有的END(Enhanced Network Driver)驱动程序。它通过一个称为MUX的薄层,将驱动程序和协议栈隔离开,达到驱动程序独立于具体协议的目的,从而实现多协议的支持。END驱动程序技术多播和轮询通信方式。因此,我们采用END驱动程序方式来实现网络设备驱动程序,扩展通信功能。

VxWorks的驱动程序既可以在启动时加载,也可以在系统启动后加载。不过网络驱动程序,最好是在启动时加载(本文采用此方式)。VxWorks启动时,发起的tUsrRoot任务初始化网络任务的JOB队列,同时发起tNetTask任务来处理网络任务中的JOB队列,调用muxDevLoad()装载用户网络设备驱动程序。之后,通过muxDevStart()启动该网络设备驱动程序。

用户驱动程序的中断例程,通过sysIntConnect()挂接在系统的中断结构上。一般在muxDevStart()中完成该工作。

驱动程序的中断例程,一般尽可能少地做一些将接收的数据包搬移工作,以减少中断关闭的时间。用户的实际中断处理服务例程放在netJob任务中完成(中断例程通过netJobAdd()函数将实际中断处理服务例程加到netJob任务的队列中)。

用户在编写好驱动程序后,应根据要求修改板级支持软件包(BSP)中confignet.h的内容,以例系统正确加载。主要修改endTb1表。

修改config.h中的相关内容:在默认情况下,系统仅仅支持1个网络接口。如果在config.h包含了#define FADS_860T,那么默认启动能够工作的是100M的网络接口(motfec0);如果在config.h中没有包含#define FADS_860T,那么默认启动能够工作的是10M的网络接口(cpm0)。

操作系统根据启动参数来对网络接口进行配置,简要流程如下:

①在usrRoot()中调用usrNetworkInit()(在prjConfig.c中)。在usrNetworkInit()中调用:

*usrNetProtoInit()初始化网络协议堆栈(包括BSD Socket Support、Host Table、BSD4.4Ipv4、BSD4.4UDPv4、BSD4.4TCPv4、BSD4.4ICMPv4、BSD4.4IGMPv4以及调试和show facility部分等等)。

*muxLibInit()初始化连接协议与END driver的mux层。

*usrEndLibInit()(在comps/src/net/usrEndLib.c中)支持使用mux/END接口的网络设备。

*usrNetworkBoot()使用启动参数来初始化一个网络设备。

*usrNetAppInit()初始化网络应用协议和一些server,比如RPC、rlogin、telnet server以及ftp server等等。

②在usrEndibInit()中,遍历configNet.h内的endDevTb1[]数组,调用muxDevLoad(…)装载END驱动程序,并调用muxDevStart(…)将它启动。

③在usrNetworkBoot()中调用:

*usrNetBoot()从命令参数行(bootline)提取网络接口的IP地址、目标名字(target name)以及单元号(unit number).

*usrNetmaskGet()获取接口的网络掩码。

*usrNetworkDevStart()加入并配置一个网络设备(cpm或者motfec)。

④在usrNetworkDevStart()中,调用usrNetEndDevStart(…)、usrNetBsdDevStart(…)以及usrNetLoopbackStart()。以上3个函数中,使用命令参数行启动了1个物理网络接口以及1个本地回路接口。

从以上流程来看,当定义了FADS_860T时,默认根据命令参数行(在config.h中,有一个初始的默认值DEFAULT_BOOT_LINE)启动并配置了一个motfec网络接口。

支持双网口时的修改:

①在config.h中加入#define INCLUDE_CPM这一行。

②在configNet.h中,于#ifndef IP_MAX_UNITS行之前加入1行:#undef IP_MAX_UNITS。在默认情况下,由于仅仅支持motfec接口,IP_MAX_UNITS的值为1。因此,需要重新定义IP_MAX_UNITS,使其等于我们加入的mux有关的网络接口的个数。

③在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*/

以下是有关定义以及usrCPMEndDevStart(…)的源代码:

struct cpmInInfo{

char *target_name; /*目标的名称*/

char *ip_address; /*目标的IP地址*/

char *network; /*网络*/

int netmask; /*网络的掩码*/

char *gateway; /*网关*/

};

struct cpmInInfo IpInfo[]= {

{NULL,NULL,NULL,0,NULL},

{NULL,NULL,NULL,0,NULL},

{NULL,NULL,NULL,0,NULL}

};

void usrCPMEndDevStart ();

void usrCPMEndDevStart (

char* pDevName, /*设备的名称*/

int unitNum, /*单元号*/

char* pTgtName, /*目标机名称*/

char* pAddrString, /*网络地址*/

int netmask /*网络掩码*/

{

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;

}

    if(usrNetIfConfig(pDevName,unitNum,pAddrString,pTgtName,netmask)!=OK){

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;

}

以上我们加入的设备名字由设备名和unit number组成。在加入第2个网络接口之前,第1个网络接口motfec0已经可以正常工作了。由于所有的ENDDRIVER都是通过遍历在configNet.h中的endDevTbl[]数组而启动的,因此第2个网络接口的unit number是1。依次数推,第3个网络接口的unit number是2…。我们加入的第2个网络接口的名字为cpml。

在支持双网口时,不同的网口应处在不同的网段上,每一个网口可支持多个网络地址。

关键字:实现  以太网  通信

编辑: 引用地址:http://www.eeworld.com.cn/wltx/qtjs/200605/2530.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
论坛活动 E手掌握
微信扫一扫加关注
论坛活动 E手掌握
芯片资讯 锐利解读
微信扫一扫加关注
芯片资讯 锐利解读
推荐阅读
全部
实现
以太网
通信

小广播

独家专题更多

富士通铁电随机存储器FRAM主题展馆
富士通铁电随机存储器FRAM主题展馆
馆内包含了 纵览FRAM、独立FRAM存储器专区、FRAM内置LSI专区三大部分内容。 
走,跟Molex一起去看《中国电子消费品趋势》!
走,跟Molex一起去看《中国电子消费品趋势》!
 
带你走进LED王国——Microchip LED应用专题
带你走进LED王国——Microchip LED应用专题
 
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2016 EEWORLD.com.cn, Inc. All rights reserved