1 MPC8280 处理器特性及MCC 概述
MPC8280 是一款集成了高性能的PowerPC? RISC 微处理器和诸多外围通信控制器的多用途通信处理器,在通信和网络系统有较为广泛的应用。
MPC8280 模块组成如图1 所示。其中,G2_LE 内核是MPC603e 微处理器的嵌入式版本,具有16KB 的指令缓存和16KB 的数据缓存;系统接口单元SIU 主要完成系统复位、中断管理、时钟配置、总线接口及内存控制等功能;通信处理模块CPM 包括一个32 位的RISC 处理器CP,三个全双工的快速串行通信控制器FCC,两个多通道控制器MCC,四个全双工的串行通信控制器SCC,两个全双工的串行管理控制器SMC,SPI 接口,I2C 总线控制器等。时隙分配器可将SCC、FCC、SMC、MCC 的数据复用到八个时分复用接口TDM。
图1 MPC8280 模块结构图
MPC8280 有两个具有时隙分配器的串行接口,分别为SI1 和SI2。每个SI 有四个时分复用接口。SI1 和SI2 分别对应为TDMa1,TDMb1,TDMc1,TDMd1 和TDMa2,TDMb2,TDMc2,TDMd2。SI 可以根据SIRAM 的配置将TDM 的某一时隙路由到特定的接口(如TDMa1 的第2个时隙到MCC1 的第3 个通道,TDMb2 的第1 个时隙到FCC1 等)。
一个MCC 可以支持最多128 路独立的时分串行通道。MPC8280 具有两个MCC,每个MCC连接到一个SI。MCC 的数据流可以通过SI 的四个时分复用接口TDM 中的任何一个进行数据传输。
一个MCC 中的128 个通道以32 个为一组连接到某一个TDM 接口上。MCC1 的通道(0-127)只能连接到SI1 上,MCC2 的通道(128-255)只能连接到SI2 上。MCC 的每一个通道都可独立配置为不同于其它通道的工作模式。通过配置SI 和SIRAM 可以将TDM 数据中的时隙路由到特定的MCC 通道。
每个MCC 都具有以下特性:最多达128 路独立的HDLC 或者透明传输通道,或者64 路SS7 通道;独立的发送和接收路由;每一通道都可支持HDLC、透明传输或者SS7 协议。
2 MCC 操作概述
MPC8280 的内核G2_LE 和外部的通信是由CPM 来完成。CP 根据相应的接口控制寄存器配置来执行数据发送或接收操作,操作完成后再向G2_LE 内核的中断寄存器写入中断值。
G2_LE 内核根据中断值调用相应的中断处理函数,由此完成数据交互过程。
每一个MCC 能通过相应的SI 连接到TDM 接口上。一旦SI 的某个TDM 被配置为包含有MCC 通道的时隙并且TDM 开始工作,CP 就将MCC 通道发送缓冲区内的数据复制到发送FIFO内,然后SI 在时钟驱动下将MCC 通道的发送FIFO 内数据发送到TDM 接口上,或者将数据从TDM 接口上接收下来并存入到MCC 通道的接收FIFO 内,然后CP 再将接收FIFO 内的数据复制到MCC 通道的接收缓存区内。
CP 通过一系列与MCC 相关的数据结构来实现对MCC 通道FIFO 的管理。MCC Globalparameters 管理着MCC 模块的各个通道,以及操作这些通道所用到的门限参数和基址指针的配置。每个通道还有一组channel-specific parameters 和channel-extra parameters,包含了该通道的协议状态信息和指向该通道的接收及发送缓存描述符的指针。
Channel-specific parameters 会因该通道所工作的协议不同而作不同的解释。如果TDM的配置含有MCC 超通道(super-channel)时隙的话还要用到超通道表(Super-channelTable)。
● global Parameters MCC1 的global parameters 适用于通道0—127,MCC2 的global parameters 适用于通道128—255,分别位于相对于DPRAM 基址偏移0x8700 和0x8800 处。
●Channel-specific Parameters 这些参数仅局限于相应的MCC 通道,位于相对于DPRAM 基址偏移64×CH_NUM 处。
● Channel Extra Parameters 包含相应通道缓存描述符的基址和指针。位于相于对DPRAM 基址偏移XTRABASE+8×CH_NUM 处。其中XTRABASE 是MCC Global Parameters 之一。
● Super-channel Table 仅当在SIRAM 中配置了超通道时使用。位于相对于DPRAM基址偏移SCTPBASE 处。其中SCTPBASE 是MCC Global Parameters 之一。由于我们的应用场合未使用到超通道,所以未对该参数进行配置。
● BD Tables 位于外部存储器。接收通道的缓存描述符表位于相对于DPRAM 基址偏移MCCBASE+8×RBASE 处。发送通道的缓存描述符表位于相对于DPRAM 基址偏移MCCBASE+8×TBASE 处。MCCBASE 是Global Parameters 之一,RBASE/TBASE 是Channel Extra Parameters之一。
● Interrupt Queues 位于外部存储器。共有一个发送中断表和一至四个接收中断表。TINTBASE 指向发送中断表,RINTBASE指向接收中断表。TINTBASE 和RINTBASE均为Global Parameters。
3 MCC 驱动的设计与实现
该驱动运行在嵌入式操作系统VxWorks5.5 之上,开发环境为Tornado 2.2.1 for PPC。
MCC 驱动主要分为以下几部分:
3.1 MCC 驱动初始化
主要完成 MCC 模块的初始化,具体内容包括:为MCC 控制数据结构分配内存,并根据初始化参数初始化数据结构的相关内容;初始化MCC 相关的控制寄存器;创建接收消息队列以及相应接收处理任务;最后启动MCC 进行数据收发。
(1) 分配并初始化MCC 操作所需的内存空间。
申请数据缓冲区、缓冲区描述符及循环中断表所需的存储空间。由于MCC 通过DMA 与主存进行发送数据和接收数据的交换,所以内存分配时必须要考虑缓存一致性问题,否则程序运行时可能出现较为严重的错误。VxWorks 提供了一个函数cacheDmaMalloc,可以为DMA 设备或者驱动程序分配缓存安全的内存空间。
(2) 初始化循环中断表。
将循环中断表中的条目初始化为 0x00000000,并将最后一个条目初始化为0x40000000以标记结束位置。
(3) 配置SI 寄存器和SIRAM。
设置每组MCC 通道所使用的TDM,并且配置SIRAM 以建立TDM 时隙和MCC 通道的对应关系。
(4) 初始化MCC Global Parameters。主要包括:
● MCCBASE MCC 基址指针,指向位于外部存储器的缓冲区描述符表,为最大512KB 的连续空间。
● MRBLR 最大接收缓冲区长度。必须是8 整数倍。
●GRFTHR 全局接收帧门限。用于减少由于频繁产生中断而造成的开销。
● GRFCNT 全局接收帧计数。初始化为GRFTHR。
● TINTBASE 多通道发送循环中断表基址指针。
● TINTPTR 指向可用的发送循环中断表条目。初始化为TINTBASE。
● SCTPBASE 指向超通道表。
● RINTBASE 多通道接收循环中断表基址指针。
(5) 初始化缓冲区描述符BD 和数据缓冲区。
BD 表位于外部存储器,其组织结构如图2 所示。
图 2 MCC 缓冲区描述符结构组织图
(6) 安装数据接收回调函数。
(7) 初始化所使用通道的MCC Channel-specific Parameters。
(8) 初始化所使用通道的MCC Channel-extra Parameters。
(9) 如使用了超通道则初始化Super-channel Table。
(10) 配置系统接口单元SIU,根据需要设置与MCC 相关的中断并安装中断处理函数。
(11) 配置TDM 所用到的并行接口和时钟信号。
(12) 执行MCC INIT 命令。
(13) 使能TDM。
3.2 中断处理
当一个MCC 通道产生中断请求时,CP 将中断信息写入循环中断表,然后修改T/RINTPTRR并设置MCCM 寄存器中相应的TINT 或者RINTx 比特。当MCC 中断到达内核后由内核调用中断处理函数。中断处理函数首先清除中断,然后根据MCCE[RINTx]和MCCE[TINT]的值来处理相应的循环中断表。
3.3 接收数据
数据接收程序通过一个先进先出的消息队列和中断处理程序相配合来完成数据的接收。当MCC 的某个通道接收到数据后会设置相应的中断事件比特位。之后中断处理函数将收到的数据进行封装后发送到消息队列。数据接收任务从消息队列接收数据,然后根据 MCC 通道号调用相应的由用户安装的数据接收回调函数。最后由回调函数完成数据的处理。
3.4 发送数据
数据的发送过程由通信协处理器完成。数据发送函数将所发送的数据复制到所使用通道的缓冲区,然后设置相应的控制寄存器,由通信协处理器完成数据从缓冲区到线路接口的发送。数据发送完成后通信协处理器设置中断寄存器MCCE 相应的RINT 比特位。并由中断处理程序通知数据发送函数数据发送已完成。
4 结束语
该驱动程序在基于MPC8280 处理器的VxWorks5.5 操作系统上进行了测试。MCC 通道工作在Transparent 模式下,对多种数据模式进行长时间的数据收发表明该驱动能较稳定地运行。
由于该驱动的中断处理函数检查所有循环中断表的条目并将收到的数据从 MCC 通道的数据缓存发送到消息队列,由此引入了较大的处理延迟,在数据量较大时甚至有可能会造成数据丢失。改进的关键在于中断处理函数和数据接收函数的配合。作为一种改进方法可考虑在中断处理函数内仅执行那些必须的操作,如清除中断,重新设置相关寄存器参数等。将数据处理放在另外一个单独的任务中去执行,并尽量减少数据搬移次数,优化所执行的操作等。最终在程序运行的速度和所完成的功能之间作合适的折中,从而获得所需的性能。