引言
MPC860芯片是Motorola公司生产的基于PowerPC架构的嵌入式通信芯片,在嵌入式通信产品中得到了广泛的应用。它内部集成的CPM(Communication Processor Module)使其易于实现UART、HDLC、以太网等多种协议,可以扩展出多种接口。但是,由于它的FEC(Fast Ethernet Controller)只能实现一个10/100Mbps 自适应以太网口,而通过SCC(Serial Communication Controller)也只能扩展出工作于10Mbps 的以太网口,无法满足速率的要求,所以当系统需要两个以上的10/100Mbps 自适应全双工以太网口时,直接使用MPC860无法达到设计要求。基于这种考虑,本文提出了一种采用860所具有的双PCMCIA(Personal Computer Memory International Association)接口的10/100Mbps扩展以太网的实现。
关键问题分析
系统的设计要求基于MPC860,不使用FEC 而实现双网口,这两个以太网口能工作于10M/100Mbps方式,能全/半双工工作,能自适应线路的变化。问题的关键在于接口的选取以及如何基于860 芯片扩展这两个以太网口。
接口的选取
MPC860内部分为Embedded Core、SIU 和CPM 3部分。Core为860 的核心,进行数据和指令的处理,SIU集成了系统的基本功能,负责管理总线,而CPM为通信处理模块,扩展系统的对外通信接口。CPM模块能提供并口连接和通过SCC、SMC 等提供串口。使用并口不易实现以太网功能,而串口中只有SCC能工作在以太网模式,但它最高只能支持10Mbps的传输速率,因此也不满足设计要求。既然CPM 无法满足设计的要求,于是人们将目光投向了SIU模块中集成的PCMCIA接口。
MPC860芯片内部集成了PCMCIA 控制器,此接口符合PCMCIA 2.1规范,实现了两个16位插槽的接口,当使用PCMCIA接口扩展时,只需要对接口的电源进行控制和加入外部缓冲即可。而且,860芯片提供了丰富的寄存器,可以方便地对接口上的引脚进行状态监视和控制。因此,采用此接口扩展将简化系统的设计。
除了接口简单,容易实现外,采用PCMCIA接口同样也满足了速率的要求。PCMCIA采用系统总线,占用系统带宽,接口的速率应根据数据地址线的带宽计算。MPC860的工作时钟为50MHz,其实际的工作速率为66MMIPS,即每秒钟处理能力为66M。而数据总线为32 位宽度,因此,所能提供的吞吐量为66*32=2112Mbps。而以太网总线最大速率为100Mbps,即使全双工工作,以两个接口计算,其最大传输速率最多也只能达到400Mbps,因此采用PCMCIA 接口能完全满足速率的要求。
所以,采用PCMCIA接口实现两个10/100Mbps网口,既能满足速率的要求,实现起来又非常简单,只需要寻找合适的PCMCIA扩展以太网芯片连接即可。在实现时,我们选择了ASIX 公司的AX88790芯片扩展PCMCIA以太网口。AX88790芯片内部集成了10/100Mbps以太网MAC、PHY控制和收发芯片。它依据IEEE802.3/IEEE802.3以太网规范,实现了10Mbps和100Mbps以太网功能,并能在全双工和半双工工作方式间进行切换,同时向CPU 端提供标准的PCMCIA接口。在软件方面,它提供NE2000兼容的寄存器,便于控制,在我们采用的Linux平台上有标准的驱动程序可供参考,可大大减少开发时间。
引脚复用冲突
为了在有限的引脚中实现多种网络协议,提供各种接口,MPC860芯片通常在同一引脚上实现多种不同的功能,这些引脚具体使用哪种功能由用户配置,并由用户保证各种功能之间的引脚不产生冲突。
MPC860的这种设计可以节省其封装的成本,使芯片结构更加紧凑,但同时也给设计造成了困难:用户必须确认引脚是否有冲突,是否影响其他功能的使用。在双PCMCIA扩展的设计中,就存在这个问题。如图1所示。
图1 BDM与PCMCIA接口引脚复用冲突
MPC860的第1个PCMCIA槽的引脚相对独立,而第2个槽的部分信号与BDM(Background Debug Mode)共享了引脚。BDM接口用于对MPC860芯片进行在线仿真,对目标板上的Flash 芯片进行编程,在调试860最小系统的时候显得尤其重要。图中两种功能共享引脚可根据需要配置为BDM方式或者PCMCIA方式,同时对相应的寄存器进行必要的设置。为了使第3槽的PCMCIA能正常工作,需要将共享引脚分配给PCMCIA接口,使用替代引脚供给BDM接口使用。
实现
引脚复用问题的解决
MPC860的第2个PCMCIA接口的引脚中,有5个信号与BDM的功能冲突,如表1所示。
表1 PCMCIA与BDM冲突引脚列表
这些引脚使用哪种功能由860的启动配置字决定。启动时,若RSTCONF信号是低电平,860将在CLKOUT信号的上升沿对数据线的D[0-15]进行采样,得到的采样值对应于其配置字的16位,根据每位的意义决定启动方式和特殊引脚的配置。这几个有冲突引脚的配置对应于数据位的9-12位,若这4位全为0,则功能定义为PCMCIA信号方式,若全为1,则工作于BDM信号方式。
由前面分析可知,硬件配置字配置共享引脚为PCMCIA工作方式时,需要用替代引脚供给BDM接口使用。MPC860的BDM接口可以采用如图2所示的两种方式进行连接。
左图中启动配置字的D[9-12]被配置为全1,而右图为配置为全0时的引脚连接。这两种连接方法所使用的不同引脚列于表2中。
图2 MPC860的BDM引脚连接
在此表中,括号内的名称为此引脚的第2功能,即使用此BDM连接所产生冲突的功能。可以看出,当D[9-12]配置为全1 时,PCMCIA第2槽的相应5个引脚都无法使用,而配置为全0时,只占用1个IRQ6信号(CPU本身还有1个引脚可代替IRQ6的功能)和系统不使用的JTAG引脚信号,不会产生冲突。值得一提的是,产生FRZ信号的引脚本身具有FRZ和nIRQ6两种功能,此引脚功能的选择不能由启动配置字决定,而是由MPC860的SIUMCR编程决定。
表2 BDM 接口在两种配置下使用的不同引脚对比
PCMCIA 外围缓冲驱动逻辑实现
MPC860的PCMCIA信号无法直接连接外围接口,需要用外围电路进行数据缓冲和电平转换。
由于接口的引脚比较多,若使用分离元件搭建,容易给调试带来麻烦,由单元件带来的调试困难将影响电路的稳定,而且更换困难。相对而言,采用CPLD搭建外围电路可以灵活地调整和修改设计过程中的失误,不容易损坏,且设计的时候可以直接用画电路的方法实现功能,非常直观,设计上并不比分离元件搭建的电路困难。因此在实现的时候,采用了这种方法扩展MPC860的双PCMCIA的外围接口电路。
MPC860的PCMCIA接口信号经过外部缓冲后连接对应的扩展芯片,由扩展芯片向外提供两个10/100Mbps以太网接口。整个实现如图3 所示。其中,虚线部分为外部缓冲实现,它的一端连接MPC860的信号引脚, 一端产生标准的PCMCIA 接口信号连接AX88790芯片。缓冲区是本系统硬件实现上的重点。本文将这些缓冲信号分为4 类:数据线缓冲、地址线缓冲、控制线缓冲和接口状态缓冲,每一种缓冲对应相应的模块进行处理。
图3 基于MPC860的双PCMCIA以太网接口实现
数据线缓冲为双向缓冲,由RD/WR信号控制数据的流向,对应接口的CE1和CE2信号分别控制数据的低字节和高字节使能有效。数据宽度为16位,实现时采用总线缓冲器16245模型。
地址线缓冲为单向锁存缓冲,实现时采用锁存器373为模型。对于每个PCMCIA接口,MPC860有专用的缓冲输出使能,用以对地址线和控制线的输出进行控制。当不使用此接口时,让使能信号无效,不产生地址和控制线输出,以防对接口的误操作。AX88790的地址线宽度为10位,输出使能信号控制输出是否有效,对应接口的ALE 信号控制地址的锁存。需要注意的是,MPC860的A31是最低位地址线,对应于驱动后最低地址位,地址线A22对应于地址线的高位。
控制缓冲为PCMCIA接口提供控制信号,包括CE1、CE2、IORD、IOWR、OE、WE、RESET 和REG信号。这些信号为PCMCIA 控制器到接口端输出信号,由于单向,因此可由244模型实现,由输出使能信号控制是否有效。在这些信号中,只有CE1和CE2信号为各槽独立的,即有两组这样的信号,其他信号由860输出,缓冲后分配给两槽,当两槽的使能信号均有效时,对任一槽操作的信号会同时作用在两个槽上,由缓冲后的CE区分槽位和高低位字节存取。
接口状态缓冲反映接口的连接状态和信息,产生IO 中断。这块电路的作用主要是进行电压转换。标准的PCMCIA接口能提供5V和3.3V两种电压接口,因此对应的接口状态都应该是相对应于接口的工作电压所取得的状态电平。但是本系统实现的并非PCMCIA插槽,而是使用PCMCIA连接接口芯片进行扩展,其接口连接的芯片AX88790本身是工作在3.3V的芯片,与860的IO电压相同,因此不需要进行接口的电压转换,可直接连接。在设计时去掉了这部分的缓冲,直接连接860对应的引脚,由对内部寄存器的读取获得端口信息。
驱动程序设计
PCMCIA接口的驱动在Linux中实现时从下往上分成3层,即SS(Socket Service)层、CS(Card Service)层和CD(Client Driver)层。SS 层对应具体的体系架构实现底层的接口操作;CS 层为架构的核心,提供各种不同的服务;最上层的CD层对应具体连接的设备驱动。本系统中,CS核心层不需要调整,下层SS层和上层CD层应根据具体设计修改。
对于SS层, 因为本系统设计的时候不需要扩展出PCMCIA接口,而是使用PCMCIA连接两个网口芯片,所以在热插拔和电源管理方面不同于插槽的管理方式。标准的PCMCIA接口需要提供5V和3.3V两种电压供不同种类的插卡使用,卡片所采用的工作电压反映在VS(Voltage Sense)引脚上,卡片的插入和拔出反映在CD(Card Detect)引脚上。而用PCMCIA 扩展的芯片连接时,芯片所使用的电压是确知的,芯片也相当于一直插在槽中。所以这些反映端口状态的引脚可以按照规范的要求设定为对应值,使得芯片一直处于有效插入状态,而电压也直接供给,在驱动中去掉电压的切换。
对于CD层,在PCMCIA卡的规范中,规定用CIS(CardInformation Structure)保存卡的属性信息,这种信息一般存放在非易失存储器中。由于厂商没有提供本芯片的CIS中存放的内容,为了简化设计,在本系统的设计中,去掉了存放CIS的存储器,在驱动中固定的加入卡片的IO起始地址、端口属性和芯片使用电压等,省去了从存储器中读取信息并解析的过程。
结束语
这种基于MPC860的双PCMCIA接口的设计方案已经运用于采用以太网总线的通信控制模块中。经过测试,在系统满负荷运行的时候,驱动和硬件工作稳定,10Mbps/100Mbps均能正常工作,网络收发没有丢包,达到了系统设计的预期效果。