基于中标麒麟操作系统的SRIO路由设计与实现
2021-06-16赵润卓王春燕汤新广
吕 鹏,赵润卓,王春燕,汤新广
(1.河北省电磁频谱认知与管控重点实验室,河北 石家庄 050000; 2.中国电子科技集团公司第五十四研究所,河北 石家庄 050081; 3.南开大学 物理科学学院,天津 300071; 4.河北轨道运输职业技术学院 机电系,河北 石家庄 050000)
0 引言
面对瞬息万变的国际形式,国家正在全力推行利用国产化操作系统替换国外的操作系统,并完成关键技术的研制,这已经成为目前的主要任务。而高速数据的传输又是所有技术发展的一个关键的技术基础。
现在高速数据传输技术已经在图像处理、数字信号处理等多个领域的应用变得越来越复杂,速率要求越来越高。为了提升数据高速传输、解析的能力,需要使用一种更加灵活、快捷的传输方式。当前主流的高速数据传输技术主要包括PCIE(PCI Express)、SRIO(Serial RapidIO)、万兆网等,其中SRIO串行传输技术主要是面向嵌入式系统开发的高可靠、高性能,基于包交换的新一代高速互联技术[1]。该技术利用串行背板、FPGA、DSP和相关串行数据平面,通过SRIO路由配置构建一个星型或网状的拓扑结构,实现系统内所有节点任意、高速的数据传输[2]。
传统的SRIO路由配置方式为PPC或DSP 为主的架构,该方式主要实现PPC或DSP对具有SRIO功能的设备芯片进行初始化、状态查询、路由配置等功能。这种架构不仅对主配芯片功能压力较大,需要考虑各种芯片的工作时序、运行状态等多种影响因素,而且对嵌入式操作系统在程序调试、后期维护上也极不方便。
本文在VPX结构的板卡上采用国产中标麒麟操作系统。该系统有着高安全性,其功能、稳定性、效率方面都达到国外同类产品水平,部分指标还要优于国外同类水平,并且具有编程容易、调试方便、应用广泛的优点,实现对SRIO的快速配置[3],极大地减少了板卡启动时间,功能划分更加简单、清晰明了。
1 系统设计
1.1 总体设计
利用SRIO串行总线传输效率高、拓扑灵活、高可靠性、高实时性的特点,保证对多种不同来源数据连续性传输的要求,研制了如图1所示的板卡。
图1 板卡连接框图Fig.1 Board connection block diagram
该板卡主要由中标麒麟操作系统、桥芯片TSI721、交换芯片CPS1848、单片机和FPGA五部分组成。其中麒麟操作系统运行在X86架构的Intel E2680 CPU上,该CPU为8核,2.8 GHz主频,并自带集成GPU,运算处理能力突出。单片机型号为C8051F041,该芯片不仅性价比高,而且体积小、集成度高,便于简单程序的开发和应用。桥芯片TSI721解决了X86架构下PCIE总线和SRIO总线互联的问题。交换芯片CPS1848可以实现同时向不同节点传输多路数据的目的,极大提升程序的开发效率和拓宽课题的复杂应用。FPGA选用Xlinx公司的K7 325T,主要用于信号处理等功能。
1.2 SRIO总线路由配置原理
SRIO总线作为一种串行高速总线,因其传输速率高、低功耗、低延迟特性,已经在越来越多的方面得到应用[4]。其主要通过嵌入式系统内部互联和嵌入式设备与背板的连接,实现各芯片间的数据传输[5]。不同的SRIO总线终端器件以器件 ID 区分,作为数据包的源节点或目的节点,器件 ID分为8位和16位2种,最多可容纳 256 或 65 536个终端器件[6]。
SRIO总线分为维护包和数据包2种,数据传输速率高达6.25 Gb/s,维护包可以访问DSP、FPGA、TSI721和CPS1848等具有SRIO总线接口的芯片。通过对芯片的配置,实现所有芯片的互联,利用维护包还可以实现对指定芯片的SRIO维护,具体包括端口状态获取、端口维护、路由配置、路由修复、ID修改、速率更改等功能。由于维护包和数据包可以同时使用,因此可以在数据传输过程中,通过实时检测所有芯片路由状态,及时做出相应处理。
数据传输的模式是通过配置路由方式实现的,路由不仅可以决定任意数据是直接传输到目的节点还是“绕道”传输到目的节点,还能决定数据同时发送给指定的几个目的节点。合理有效的路由配置,能够极大地提升后期数据处理能力和数据的传输带宽,最终达到提升整个系统处理能力的目的。
SRIO路由配置已经成为数据高速传输的一个必要环节。本文通过单片机+麒麟操作系统的方式,同时利用桥芯片TSI721和交换芯片CPS1848,在VPX机箱上开发出一套高速、灵活的数据处理板卡。其中单片机主要负责交换芯片上电初始化功能,麒麟操作系统主要负责后期的路由配置、数据传输和算法处理等。
1.3 桥芯片TSI721工作原理
TSI721是IDT公司推出的一款桥芯片,支持1路PCIE 2.1 X1/X2/X4及1路SRIO X1/X2/X4接口,实现PCIE与SRIO总线间协议无缝转换[7],保证数据传输在转换过程中的高效性和可靠性[8]。本板卡如图1所示,TSI721一端通过1,利用PCIE总线与麒麟操作系统相连,另一端的2则是SRIO总线连接到CPS1848交换芯片上。这样麒麟操作系统不仅可以获取TSI721的VEN、DEV、SRIO ID、端口状态、SRIO速率等信息,同时通过路由程序可以访问交换芯片CPS1848,进而访问FPGA和其余板卡的SRIO芯片,最终实现数据通信的目的[9]。
1.4 CPS1848的交换原理
CPS1848与TIS721一样,都是由IDT 公司研发的,具有SRIO 2.1标准。主要实现芯片间多端口数据互联功能[10]。该芯片有48个双向数据差分对(lane),具有 1x、2x和4x三种端口模式,3种模式下的端口个数配置方式为48/端口模式,比如4x的端口个数为12个(48/4),每个lane支持1.25,2.5,3.125,5或6.25 Gb/s四种传输速率[11]。
本文使用SRIO为X4模式,一共12个端口,具体连接方式如图1所示。其中1个SRIO X4通过2与1个TSI721相连,板卡总共使用了2个TSI721,则连接了2个SRIO X4,达到增加SRIO传输带宽的目的。同时与FPGA通过标号4的一个SRIO X4相连,6号则表示CPS1848与背板连接的剩余9对SRIO,实现与其余板卡通信的目的。通过对CPS1848寄存器的访问,可以实现对整个板卡甚至分机的路由维护和更新,主要寄存器功能如表1所示[12]。
表1 CPS1848寄存器功能介绍Tab.1 Introduction to CPS1848 register function
1.5 实现步骤
具体实现过程为:
① 系统上电后,单片机首先设置SRIO速率并通过FPGA对交换芯片CPS1848进行复位操作,当等待交换芯片复位后,对所有端口进行读写使能操作;
② 麒麟操作系统通过PCIE总线确定桥芯片TSI721端口链接状态,并利用SRIO总线维护包对TSI721进行ID修改和路由配置;
③ 利用SRIO维护包对桥芯片TSI721与交换芯片CPS1848间的路由进行配置;
④ 配置交换芯片CPS1848的ID及路由信息;
⑤ 判断FPGA的端口连接状态,配置FPGA与CPS1848间的路由,并通过维护包修改FPGA的节点ID及更新路由信息;
⑥ 如果分机内部插有其余板卡,则CPS1848对外的9个端口中的一个或几个与其相连,通过背板的连线关系,利用SRIO维护包可以访问到其余板卡上的交换芯片或者节点芯片(FPGA/DSP等),并对其进行ID修改和路由配置。
通过以上6步配置,可以实现对板卡SRIO的数据操作。
如果需要将一种数据,同时发送给多个设备节点,可以利用广播路由的方式加以实现。而当整个路由系统中有一个设备节点,比如FPGA,在不断电情况下程序进行了更新,SRIO状态被还原,可以通过路由维护的方式,将该节点维护到之前的路由系统中,保证系统运行的完整性。
1.6 单片机工作流程
单片机主要使用I2C总线,该总线是一种“二线”结构,分别使用串行数据传输线SDA和串行时钟控制线SCL实现数据传输[13]。该总线具有自动找寻从器件地址,使较高速率设备与较低速率设备间实现同步传输和优化挑选需要的从器件进行高性能数据传送的特点[14]。因此采用单片机对板卡上SRIO链路和交换芯片进行初始化操作,具体流程如下:
① 通过板卡原理图,查找单片机与CPS1848的连接管脚,如图2所示。
② C8051与CPS1848管脚连接图如图3所示,通过专用软件Configuration Wizard 2对指定管脚按照原理图的连接关系进行定义后生成如下代码:
P3MDOUT = 0x18;
XBR0 = 0x01;
XBR2 = 0x40;
③ 编写单片机程序,利用单片机的I2C总线配置交换芯片CPS1848的速率,控制FPGA对CPS1848上电复位,使能交换芯片所有数据传输端口,具体程序如下所示:
CPS1848_REG_Write(96,CPS1848_PORT_X_CTL_1_CSR(nPort),value | 0x00800000);
CPS1848_REG_Write(96,CPS1848_PLL_X_CTL_1(nPortNum),1);
CPS1848_REG_Write(96,CPS1848_LANE_X_CTL(nPortNum*4),0x00001e0a);
CPS1848_REG_Write(96,CPS1848_LANE_X_CTL(nPortNum*4 + 1),0x00001e0a);
CPS1848_REG_Write(96,CPS1848_LANE_X_CTL(nPortNum*4 + 2),0x00001e0a);
CPS1848_REG_Write(96,CPS1848_LANE_X_CTL(nPortNum*4 + 3),0x00001e0a);
CPS1848_REG_Write(96,CPS1848_DEVICE_RESET_CTL,0x80040000 | (1< for(i = 0;i<12;i++) { CPS1848_REG_Write(96,CPS1848_PORT_X_CTL_1_CSR(i),0xD0600001);∥enable input and output*/ } 图2 C8051与CPS1848管脚连接Fig.2 CPS1848 and CPS1848 pin connector CPS1848_REG_Write的第一个参数为dev_address,表示CPS1848 I2C的设备地址。通过图4的连接关系可知,图中ID0~ID9 十个管脚上ID5和ID6接上拉电阻值为1,其余值为0,则该函数第一个参数值为96。 图3 C8051与CPS1848管脚连接图Fig.3 C8051 and CPS1848 pin connector 图4 CPS1848 dev_address连接关系Fig.4 CPS1848 dev_address connection relationship 中标麒麟操作系统为国内首款自主、高安全等级的可信操作系统。该系统是我国“核高基”项目的重要研究成果,具有重要意义。麒麟系统兼容主流的软硬件和自主CPU平台,能够完全满足项目应用开发和系统定制的需求[15]。 由于麒麟操作系统通过PCIE总线与TSI721相连,并利用TSI721的SRIO连接到CPS1848上。因此,如果想利用麒麟操作系统配置整个板卡甚至整个分机的路由,则需要同时使用PCIE总线和SRIO总线。具体使用方式为: ① 打开板卡。由于本板卡连接2个TSI721,因此需要分别设置打开的板卡号为0和1; ② 利用PCIE总线查询麒麟操作系统与TSI721的连接状态和TSI721的原始ID信息; ③ 利用SRIO总线维护包进行路由配置,数据包进行数据收发。 在配置数据包的时候需要创建发送窗和接收窗(发送窗 8个,接收窗 4个)、SRIO总线的基地址、读写传输模式(NWRITE、NREAD)、模式使能及访问的窗口大小等参数[16]。同时为了适应不同系统规模的需求,设备ID分为大端模式和小端模式2种,其中小端模式为8 bit,大端模式ID为16 bit[17]。 通过2.6节单片机操作后,板卡上所有SRIO链路状态均为正常,同时编写C++程序,实现板卡路由配置和数据通信。具体功能实现代码如下所示: status = Config_Route_Init(myTsi721,&srio_route,masterSlot); if(status = OK) { Config_Route_Master(myTsi721,&srio_route); Config_Route_Slave(myTsi721,&srio_route,masterSlot); Scan_ConfigRoute_DifSlots(myTsi721,&srio_route); } if(!myTsi721->IbwinFree(0)) { printf("free is wrong
"); } if(!myTsi721->IbwinCreate(0,0,0,1024*1024)) { printf("create is wrong
"); } dmaCtrl.bits.Iof = 0; dmaCtrl.bits.Crf = 0; dmaCtrl.bits.Prio= 0; dmaCtrl.bits.Rtype = LAST_NWRITE_R; dmaCtrl.bits.XAddr = 0; partnDestId = 0x68; dwDataSize = 4; data = 0x01215643; dwErr=TSI721SrioWrite(myTsi721->m_hDev,partnDestId,0,0x01000000,&data,&dwDataSize,dmaCtrl); partnDestId = 0x68; dmaCtrl.bits.Prio = 1; dwDataSize = 4; dwErr=TSI721SrioRead(myTsi721->m_hDev,partnDestId,0,0x01000000,&dataret,&dwDataSize,dmaCtrl) 为了进行数据测试,将该板块插到了一个8槽的VPX分机内,分机中除了本板卡外还有一块带有SRIO总线的DSP设备,利用麒麟操作系统进行SRIO路由配置,并对2个板卡状态、分机内部各节点(麒麟操作系统、FPGA、DSP)进行测试,验证上节的配置过程、板卡工作状态和SRIO数据通信的正确性,并测试传输速率。其中数据传输采用DMA方式,数据包大小为1 MB,传输方式为NWRITE和NREAD双向传输。具体测试过程如下: ① 分别通过PCIE总线设置TSI721的SRIO速率及利用SRIO维护包设置CPS1848的端口速率,如果速率设置的不一致,则访问不到对方的设置信息。 ② 利用PCIE总线读取麒麟操作系统与TSI721链接状态,并利用SRIO维护包分别读取CPS1848与TSI721、FPGA、DSP板卡的链接状态信息,如果链接状态为0xc0000002或0xe0000002,则SRIO链接状态正确;如果为0xc0000001或0xe0000001,则表示没有链接成功,其余值则表示链接状态信息有误,通过复位本方或者对方端口的方式,修复链接状态。对应的寄存器偏移量为0x158+n×0x20(n为端口号),具体信息如图5所示。 ③ 通过SRIO维护包访问CPS1848。如果访问成功,则说明单片机对CPS1848上电复位操作正确。 图5 端口状态寄存器信息Fig.5 Port status register information ④ 通过配置麒麟操作系统与2个TSI721的自环方式,测试CPS1848与2个TSI72通信是否正确;同样测试麒麟操作系统与FPGA的数据收发可以测试CPS1848与FPGA的端口通信是否正确;测试CPS1848的对外的端口,则需要DSP板卡分别插到不同的槽位上,测试麒麟操作系统与DSP的通信是否正确来验证CPS1848的对应端口通信是否正确。 ⑤ 通过④ 的不同配置方式,测试了不同节点的通信正确性的同时,可以测试不同节点之间的数据传输速率,具体测试结果如表2所示。 表2 板卡功能测试统计Tab.2 Function test statistics of board card 最后在调试过程中需要注意以下几点: ① 分机上电后要优先进行单片机的所有操作,并确保所有状态正常。 ② 利用麒麟操作系统给分机内交换芯片及DSP节点分配ID,要求ID必须唯一。 ③ 麒麟操作数据传输开始需要创建窗申请资源,最后需要释放窗资源。 ④ 数据传输尽量不要在一个通道上进行多种数据传输,会影响传输效率。 ⑤ 麒麟操作系统数据传输的时候最好使用门铃的方式,这样传输的效率更高。 通过单片机和X86架构下麒麟操作系统配置SRIO路由的设计方法不仅充分发挥单片机和操作系统易于开发和维护的优点,同时将SRIO高速串行总线与桥芯片TSI721和交换芯片CPS1848配合使用。既实现了数据的高速传输,保证数据的实时性,又达到了数据可以任意节点互联传输的目的。该技术的实现为后续算法的调试提供坚实的基础。1.7 麒麟操作系统工作原理
2 实验与测试
3 结束语