PowerPC MPC8260的
FCC工作在ATM模式的原理
MPC8260 PowerQUICCⅡ是飞思卡尔PowerPC系列CPU芯片主导产品,它的通信处理机模块(CPM)同时支持三个快速串行通信控制器(FCC),FCC支持同步高速率协议HDLC、Ethernet和ATM。FCC控制器工作在ATM模式时,通过UTOPIA接口与物理层连接,原理图如图1所示。
在设备接收数据时,对接收到的信元(cell,53字节)进行地址映射,把VPI/VCI映射为逻辑通道号,对应有缓冲描述符及缓冲内容。发送数据时,把带有数据缓冲信息的通道号通过ATM步长控制器调度,再由FCC发送到物理层设备,转换为光信号后通过光口发送出去。
VxWo
rks实时操作系统下
END程序框架设计
VxWorks是WindRiver 公司开发的高性能实时操作系统,其网络结构与OSI参考模型相比是在IP 层和链路层之间有一Mux层,屏蔽了网络层和数据链路的直接交互,通过END(增强型网络驱动:Enhanced Network Drivers) 实现IP 层与链路层之间的数据交互。END向上通过Mux 层与IP 层相连,向下与链路层直接相连,从而在IP 层与链路层之间建立一个数据传输通道。
END驱动程序的核心数据结构是END对象,即END_OBJ,在end.h中定义。驱动程序的装载函数返回一个指向数据结构END_OBJ的指针。这个数据结构为MUX提供了描述驱动程序的信息和指向数据结构NET_FUNCS的指针,而NET_FUNCS填充的是有关END驱动程序的标准进入配给函数。
END驱动程序输出到MUX的进入配给函数,即数据结构NET_FUNCS中用以输出到MUX接口的标准进入配给函数如表1所示。
ATM驱动程序的实现
驱动程序中重要的数据结构
DRV_CTRL
DRV_CTRL是定义的ATM设备控制结构,包括了MPC8260的FCC基地址、驱动的单元号、中断号、存储管理相关等信息。在驱动程序中,此结构是初始化、发送、接收、中断处理等主要函数的入口参数。
需要指出的是,此结构与以太网控制器中为其驱动定义的控制结构类似,不同之处在于以太网控制器是为一个FCC定义一个BD(缓冲描述符)链表;ATM要求每个通道都有一些特定参数并要求每个通道有一个BD链表。因此,需要定义连接控制结构来管理这些与通道相关的参数。
AtmConnectionData
连接控制结构是ATM建立链路时用到的最重要的数据结构,规定了链路的逻辑地址、信元速率等信元传输时用到的重要参数以及发送、接收数据帧时用到的BD表。在本驱动中,对每个通道建立了一个BD表,并采用了循环链表结构,提高了缓冲的利用效率。在建链前必须对该结构进行分配,并初始化。
驱动程序的实现
本END驱动主要是实现IP层与ATM层之间的数据交互,ATM网络是面向连接的,对于IPOA(IP over ATM)来说,TCP/IP只是将其作为像以太网一样的另一种物理网络来看待,因而,本驱动的设计可参考以太网驱动的设计思想。按照以上END的程序设计框架编制END所用到的全部基本函数,因这里的END 与地址处理无关,故endMCastAddrDel()、endMCastAddrGet()、endMCastAddrAdd()、endAddressForm()和endAddressGet()这几个函数
控制器的初始化
初始化包括两部分 ,一是配置:首先,在 config. h中定义 INCLUDE_ END,以保证在编译时加入 MUX接口 ;其次,在 configNet. h中定义指向本设备载入函数的宏 ,并定义初始化时要用到的字符串 ,定义增强型设备的列表结构体以保证正确登录本设备 。二是对本控制器设备加载,必须初始化一个 END_ OBJ结构体,载入函数首先要分配并初始化此结构体 ,以方便 MUX接口使用其中的工具管理堆栈及调用各接口函数。本控制器设备的初始化流程如下 :首先通过函数muxDevLoad()调用motFccEndLoad()实现对ATM驱动的加载,当成功加载后,接着用函数muxDevStart()调用motFccStart ()实现对驱动的启动,成功启动后,再接着用函数muxIoCtl()调用motFccIoCtl()实现对END网络接口控制,成功后用IpAttach函数将END
中断处理程序和内存管理
中断处理程序必须分为两个部分,第一部分是响应中断的函数,它需要被绑定到 BSP分配的中断向量上,不能有耗时较大的操作 (如对堆栈的操作 ) ,这是由中断的特点所决定的;第二部分是对数据帧的处理,这个函数可以用系统函数netJobAdd( )在响应中断的函数中向网络工作队列添加新的工作 ,这将唤醒网络处理任务去调用相应的数据帧处理函数(例如接收函数 )处理数据帧。
对于内存的管理,VxWorks定义了三种统一的存储结构:cluster(簇)、clBlk(簇模块)和 mBlk(存储模块)。其中簇是存储数据的最基本单元,长度灵活可变,在ATM控制器驱动程序中一般使用同样长度的簇,即最大的数据帧长9180字节。数据在协议栈内各层之间的传送过程中只需要传送数据帧的指针,这样,方便程序员设计数据的存储结构 ,并减少了在各层次之间数据的拷贝,节省了时间,提高了效率。VxWorks还给出了几个标准的系统函数统一管理内存的占用和释放,程序员可以很方便地调用这些系统函数创建这三级结构来接收数据帧,并在完成数据帧接收时调用相应系统函数释放内存。驱动程序中的内存管理函数是motFccInitMem()和motFccBdFree(),参数都为DRV_CTRL类型指针。motFccInit Mem()完成对存储池的初始化;motFccBdFree()由motFccStop()调用,释放与接收缓冲描述符链表相连的簇,以便在设备停止时彻底地释放资源。
数据帧的接收
一般情况下,数据帧的接收是用中断方式实现的 。当一个数据帧到来时触发一个中断,中断响应程序会向任务队列添加一个网络任务,这个任务将调用接收函数处理数据帧 。
接收函数负责将正确的数据帧放到利用系统函数取出的缓存中,然后将缓存交给 MUX接口的接收函数muxReceive( ),最后释放掉占用的缓存。循环以上过程直到将收到的数据全部处理完。
从数据帧经过的网络层次顺序看,数据帧先经过物理层到达数据链路层,在驱动中通过MUX接口调用函数motFccRecv(),在该函数中完成对链路层收到的ATM信元进行ATM适配层的处理(在本驱动中进行AAL5适配)并组装成IP 包,送到网络层 ,再经过 TCP协议层到达应用层 ,这就是数据接收的全过程 。
数据帧的发送
发送数据帧常常使用两种方式:轮询方式和中断方式。在本驱动中采用了轮询方式,从数据帧经过的网络层次顺序看,基本上是接收数据帧的反过程。数据帧由应用层开始产生,经过 TCP协议层和网络层的封装,通过 MUX接口调用本驱动程序中的发送函数motFccSend(),将IP包进行ATM适配处理并拆分为ATM信元然后交给物理层发出
结语
按照以上的方法,本文设计出了基于VxWorks实时操作系统的MPC8260的ATM控制器(提供一个155Mbps光口)驱动,并完成了主要功能的测试。测试函数中指定要建立的通道数、通道速率、发送的数据帧数、数据帧长度等参数,并让这些数据帧在以太网口和ATM端口间打环。实验数据显示设备工作正常。
调试中有几点注意事项:由于MPC8260为FCC提供的双口RAM容量有限,分配通道及对通道的各参数初始化时要特别小心,以免越界。由于ATM协议的复杂性,此驱动的很多函数的具体实现以及测试中还有很多复杂的细节,限于篇幅,本文只给出一些概述性的描述,以期和大家分享嵌入式驱动开发的一点心得。