基于SRIO的DSP上MHAL的实现方法

申请号 CN201710373377.5 申请日 2017-05-24 公开(公告)号 CN107248867A 公开(公告)日 2017-10-13
申请人 中国航空无线电电子研究所; 发明人 孙仁强; 羿昌宇; 李裕; 张海辉; 吴敏; 张亦居; 李天;
摘要 本 发明 公开了基于SRIO的DSP上MHAL的实现方法,包含MHAL初始化过程,所述初始化过程包含以下步骤:配置SRIO 接口 的DeviceID和通信速率;配置SRIO交换网络路由为DSP自环通信方式,发送自环测试数据对DSP的SRIO接口进行自环测试;比较SRIO接口的各端口收发的自环测试数据,如果相同,自环测试通过;创建目的组件LD与目的设备PD的映射表;创建本地组件LD注册表;创建本地组件LD与组件任务 信号 量的映射表。本发明使不同 硬件 设备的组件之间进行通信时,只需要知道欲通信组件的LD即可获取到目的设备PD,使用SRIO接口完成通信数据的交互,达到 应用组件 通信时屏蔽SRIO接口的目的。
权利要求

1.基于SRIO的DSP上MHAL的实现方法,包含MHAL初始化过程,所述初始化过程包含以下步骤:
步骤1.1、配置SRIO接口的DeviceID和通信速率;
步骤1.2、使能SRIO接口中断;
步骤1.3、配置SRIO交换网络路由为DSP自环通信方式,发送自环测试数据对DSP的SRIO接口进行自环测试;
步骤1.4、比较SRIO接口的各端口收发的自环测试数据,如果相同,自环测试通过,执行步骤1.5,否则MHAL初始化失败;
步骤1.5、创建目的组件LD与目的设备PD的映射表;
步骤1.6、创建本地组件LD注册表;
步骤1.7、创建本地组件LD与组件任务信号量的映射表;
步骤1.8、检查步骤1.5-1.7的执行结果,若每步都成功执行,则MHAL初始化成功完成,否则MHAL初始化失败。
2.根据权利要求1所述的基于SRIO的DSP上MHAL的实现方法,其特征在于还包含消息发送过程,所述消息发送过程包含以下步骤:
步骤2.1、配置本地DSP和其他硬件平台的SRIO交换网络路由;
步骤2.2、从发送缓冲TX_Buffer中读取目的组件LD,根据目的组件LD从目的组件LD与目的器件PD的映射表查找目的器件PD;
步骤2.3、从发送缓冲TX_Buffer中读取数据,与目的器件的PD一起发送给DSP的SRIO接口;
步骤2.4、DSP的SRIO接口发送NWRITE事务,包含目的器件PD、数据长度,以及目的组件LD;
步骤2.5、SRIO接口发送MHAL消息,MHAL消息发送完成后发送一个DOORBELL数据包给目的器件。
3.根据权利要求1所述的基于SRIO的DSP上MHAL的实现方法,其特征在于还包含消息接收过程,所述消息接收过程包含以下步骤:
步骤3.1、检测SRIO接口是否收到DOORBELL数据包,如果检测到,则触发DOORBELL中断;
步骤3.2、从Rev_Ptr指针指向的缓存中读取本地组件LD,根据本地组件LD从本地组件LD与组件任务信号量的映射表从查找组件任务信号量,并释放该组件任务信号量;
步骤3.3、对应的组件检测到组件任务信号量到达后,将Rev_Ptr指针指向的缓存中接收到的MHAL消息写入接收Rx_Buffer中。

说明书全文

基于SRIO的DSP上MHAL的实现方法

技术领域

[0001] 本发明涉及SRIO(串行高速输入输出)总线架构下硬件平台的调制解调硬件抽象层设计方法,尤其涉及其中基于DSP(数字信号处理器)的调制解调硬件抽象层(以下简称MHAL)的实现方法。

背景技术

[0002] 传统的无线电系统采用不同的工作频段、调制方式、通信协议和加密方式实现不同的通信模式和功能,这些差异给不同通信设备间的连通带来了不便。与传统的无线电系统相比,软件无线电系统的A/D(模/数),D/A(数/模)变换尽可能的靠近射频前端,对整个系统从中频甚至射频开始就进行数字化处理,使通信的各部分功能都由软件来实现和控制,系统硬件结构与功能相对独立,基于通用的硬件平台,不同的电台、不同的系统只要通过加载不同的软件即可实现功能的差异化,不需要更改硬件平台的结构。这是软件无线电的一个突出特点。软件无线电的硬件设计以开放式总线结构为基础,所以硬件和软件都采用开放式物理接口和电气接口规范,按标准的通用模进行设计。
[0003] 在无线电通信系统中,较常用的硬件平台有DSP、FPGA(现场可编辑阵列) 和PowerPC(简称PPC)等,传统的设计方法是在不同硬件平台上开发不同的应用软件,使用不同的接口规范,且相同硬件平台也存在多样的型号、技术体制和原理,所以软件和接口规范也有差异。以这种方式在硬件平台上设计应用软件有如下弊端:
[0004] (1)移植性差。由于不同的系统有不同的接口,每次程序代码移植到新的系统中时,接口都需做相应改变。
[0005] (2)通用性差。在不同的硬件平台上各自采用不同的程序架构和接口,导致只能用于特定的硬件平台上,不能复用在其它硬件平台上。
[0006] SCA(软件通信体系结构)作为软件无线电的一种通用的体系规范,定义了调制解调硬件抽象层MHAL的概念。MHAL介于硬件平台和软件之间,它为了屏蔽硬件差异将硬件的实现抽象出来,负责处理软硬件差异,并完成相关接口功能。同时,软件无线电的硬件平台间通常通过高速总线连接。其中SRIO总线使用广泛,它是一种针对高性能嵌入式系统芯片间和板间互连而设计的总线技术,具有协议简单、软件开销小、延时小和打包效率高等优点,现今主流的DSP均提供了对外的SRIO接口。
[0007] 基于SRIO总线的DSP调制解调硬件抽象层是一种分层软件设计结构,该方法将DSP底层硬件与上层软件应用分开,采用标准的架构来约束软件的开发和部署,以确保软件的可移植性、可重用性和可扩展性。MHAL技术的使用极大提高了系统的灵活性和互操作性,减少了新波形应用的开发周期。

发明内容

[0008] 本发明的发明目的提供一种基于SRIO总线的DSP上MHAL的实现方法,当基于SRIO总线的软件无线电系统中的所有DSP硬件平台都使用该MHAL,用户或是应用组件(以下简称AC(Application Component))就可以通过使用MHAL提供的统一的接口来方便地进行系统内通信,并可以在不同型号和规格的DSP间任意移植程序,解决了基于SRIO总线的软件无线电系统中,DSP的应用软件移植性、通用性和灵活性差的问题。
[0009] 本发明的发明目的通过以下技术方案实现:
[0010] 基于SRIO的DSP上MHAL的实现方法,包含MHAL初始化过程,所述初始化过程包含以下步骤:
[0011] 步骤1.1、配置SRIO接口的DeviceID和通信速率;
[0012] 步骤1.2、使能SRIO接口中断;
[0013] 步骤1.3、配置SRIO交换网络路由为DSP自环通信方式,发送自环测试数据对DSP的SRIO接口进行自环测试;
[0014] 步骤1.4、比较SRIO接口的各端口收发的自环测试数据,如果相同,自环测试通过,执行步骤1.5,否则MHAL初始化失败;
[0015] 步骤1.5、创建目的组件LD与目的设备PD的映射表;
[0016] 步骤1.6、创建本地组件LD注册表;
[0017] 步骤1.7、创建本地组件LD与组件任务信号量的映射表;
[0018] 步骤1.8、检查步骤1.5-1.7的执行结果,若每步都成功执行,则MHAL初始化成功完成,否则MHAL初始化失败。
[0019] 基于SRIO的DSP上MHAL的实现方法还包含消息发送过程,所述消息发送过程包含以下步骤:
[0020] 步骤2.1、配置本地DSP和其他硬件平台的SRIO交换网络路由;
[0021] 步骤2.2、从发送缓冲TX_Buffer中读取目的组件LD,根据目的组件LD从目的组件LD与目的器件PD的映射表查找目的器件PD;
[0022] 步骤2.3、从发送缓冲TX_Buffer中读取数据,与目的器件的PD一起发送给DSP的SRIO接口;
[0023] 步骤2.4、DSP的SRIO接口发送NWRITE事务,包含目的器件PD、数据长度,以及目的组件LD;
[0024] 步骤2.5、SRIO接口发送MHAL消息,MHAL消息发送完成后发送一个DOORBELL 数据包给目的器件。
[0025] 基于SRIO的DSP上MHAL的实现方法还包含消息接收过程,所述消息接收过程包含以下步骤:
[0026] 步骤3.1、检测SRIO接口是否收到DOORBELL数据包,如果检测到,则触发 DOORBELL中断;
[0027] 步骤3.2、从Rev_Ptr指针指向的缓存中读取本地组件LD,根据本地组件 LD从本地组件LD与组件任务信号量的映射表从查找组件任务信号量,并释放该组件任务信号量;
[0028] 步骤3.3、对应的组件检测到组件任务信号量到达后,将Rev_Ptr指针指向的缓存中接收到的MHAL消息写入接收Rx_Buffer中。附图说明:
[0029] 图1是DSP MHAL通信系统框架示意图。
[0030] 图2是DSP MHAL整体框架示意图。
[0031] 图3是DSP MHAL初始化流程图
[0032] 图4是DSP MHAL发送数据流程图。
[0033] 图5是DSP MHAL接收数据流程图。
[0034] 图6是基于SRIO总线DSP MHAL实施方案系统框图。具体实施方式:
[0035] 下面给出实施例和附图对本发明作进一步的详细说明。
[0036] 图6为实施例的系统组成框图。整个系统主要包括两片TI公司的 TMS320C6455的DSP芯片,通过两片IDT公司的CPS1848的SRIO交换芯片搭建的SRIO交换网络,进行互连。每个DSP中都加载MHAL程序。下面用这两块DSP 通过MHAL进行SRIO总线的相互通信,使用CCSv3.3软件进行调试,通过该软件的内存查看窗口来比较应用源组件的发数据和目的组件的收数据,验证DSP MHAL的功能。
[0037] 图2为MHAL的整体设计框图。DSP调制解调硬件抽象层接口提供了7个函数,分别如下:
[0038] 1)Srio_Init函数;
[0039] 2)Local_LD_Attach函数;
[0040] 3)DestLD_MapTo_DestPD函数;
[0041] 4)LD_RouteTo_AC函数;
[0042] 5)MHALWrite函数;
[0043] 6)Srio_DoorBell_Int函数;
[0044] 7)MHALRead函数;
[0045] DSP MHAL的各个函数功能如下:
[0046] 1)Srio_Init函数
[0047] 函数原型:Uint32Srio_Init(Uint16RapidIO_ADDR,Uint8SPEED)。
[0048] 功能:实现DSP的SRIO接口的初始化、自环测试工作。在调制解调硬件抽象层API(应用接口)函数中,该函数必须首先被调用,配置本地器件的RapidIO 地址和通信速率,同时正确配置交换机路由,在函数内部配置了DSP自环通信的路由,否则无法通过自环检测。
[0049] 参数:RapidIO_ADDR:本地器件的RapidIO地址(DeviceID),类型为Uint16。 SPEED:3个有效值,1表示1.25Gbps、2表示2.5Gbps、3表示3.125Gbps。
[0050] 返回值:返回值0或1,0表示初始化失败,1表示初始化成功。
[0051] 2)Local_LD_Attach函数
[0052] 函数原型:Uint32Local_LD_Attach(Uint16Local_LD)。
[0053] 功能:该函数用于注册本地运行且需要接收MHAL消息的应用组件。在使用 LD_RouteTo_AC函数前必须调用该函数。
[0054] 参数:Local_LD:本地组件的LD,类型为Uint16。
[0055] 返回值:返回值0或1,0表示注册失败,1表示注册成功。
[0056] 3)DestLD_MapTo_DestPD函数
[0057] 函数原型:Uint32DestLD_MapTo_DestPD(Uint16DestLD,Uint16DestPD)[0058] 功能:该函数进行目的组件LD(逻辑地址)和目的器件PD(物理地址)之间的映射,以至于本地调制解调硬件抽象层能够根据目的组件LD找到对应的目的器件PD,将MHAL消息传送到对应目的器件上的调制解调硬件抽象层。在调用该函数前,需要对目的组件LD和目的器件PD进行统一分配。
[0059] 参数:DestLD:本地组件欲通信的目的组件的LD,类型为Uint16。DestPD:目的组件运行的物理设备RapidIO地址,类型为Uint16。
[0060] 返回值:返回值0或1,0表示映射失败,1表示映射成功。
[0061] 4)LD_RouteTo_AC函数
[0062] 函数原型:Uint32LD_RouteTo_AC(Uint16LOG_D,SEM_Handle new_SEM)。
[0063] 功能:该函数进行本地组件LD和其对应组件任务信号量之间的映射。用户在调用该函数前,首先为每个本地组件定义一个组件任务信号量,当调制解调硬件抽象层收到给本地某个组件的MHAL消息,则释放其对应的组件任务信号量,从而触发该组件的接收处理任务。
[0064] 参数:LOG_D:本地组件的LD,类型为Uint16。new_SEM:为目的组件LOG_D 定义的组件任务信号量,类型为SEM_Handle。
[0065] 返回值:返回值0或1,0表示映射失败,1表示映射成功。
[0066] 5)MHALWrite函数
[0067] 函数原型:Uint32MHALWrite(unsigned char*Tx_Buffer)。
[0068] 功能:当本地组件欲向其它组件进行通信时,调用该函数。首先去查找 Tx_Buffer指向的最低16位目的组件LD信息,根据DestLD_MapTo_DestPD函数所建立的目的组件LD与目的器件PD之间的映射表,找到目的器件PD,并根据下一组16位解析的数据长度,内部执行SRIO的NWRITE(SRIO总线的一种发包事件的类型)操作,向与目的设备协商好的内存(即指针Rev_Ptr指向的缓存) 写数据,数据发送完毕后,再发送一个DOORBELL包。
[0069] 参数:Tx_Buffer:包含发送MHAL消息的缓存指针,类型为unsigned char*。
[0070] 返回值:返回值0或1,0表示发送失败,1表示发送成功。
[0071] 6)Srio_DoorBell_Int函数
[0072] 函数原型:void Srio_DoorBell_Int(void)。
[0073] 功能:该函数用于响应DOORBELL中断包,通知DSP消息接收完毕,从Rev_Ptr 低16位获取本地组件LD,并通过查找LD_RouteTo_AC函数建立的映射表,释放组件对应的组件任务信号量,当组件任务信号量到达该组件后,会触发AC调用 MHALRead函数,为应用层提供MHAL消息。
[0074] 参数:无
[0075] 返回值:无
[0076] 7)MHALRead函数
[0077] 函数原型:Uint32MHALRead(Uint16LOG_D,unsigned char*Rx_Buffer)。
[0078] 功能:组件任务信号量到达后,说明本接收组件的数据到达,调用MHALRead 函数,从Rev_Ptr指针指向的缓存获得MHAL消息,写到Rx_Buffer指向的缓存,供应用组件使用,没有信号量到达则不能触发AC调用MHALRead函数。
[0079] 参数:Local_LD:当前组件的LD,类型为Uint16。Rx_Buffer:存放接收MHAL消息的缓存指针,类型为unsigned char*。
[0080] 返回值:返回值0,表示该组件没有向调制解调硬件抽象层注册它的LD,接收失败;返回值非0,表示MHAL消息的长度,接收成功。
[0081] 调制解调硬件抽象层在使用前需先进行初始化,在main函数中调用 Srio_Init函数、Local_LD_Attach函数、DestLD_MapTo_DestPD函数和 LD_RouteTo_AC函数。之后在DSP/BIOS内将应用组件函数作为一个任务启动,执行对MHAL消息的收发操作。如图3、图4、图5所示,DSP的MHAL主要实现 MHAL初始化、消息发送和消息接收3个功能。下面分别进行详细的介绍。
[0082] 1)MHAL初始化
[0083] MHAL初始化完成了DSP的SRIO接口初始化,主要包括本地器件ID的定义、 DSP通过SRIO网络进行自环通信测试等,确保DSP的SRIO接口和SRIO交换网络功能正常。同时MHAL初始化实现本地组件LD的注册、目的组件LD与目的器件PD的映射、本地组件LD与组件任务信号量的映射,这样不同硬件设备的组件之间进行通信时,组件只需要知道欲通信组件的LD即可,通过MHAL的地址映射关系,获取到目的设备PD,使用SRIO驱动接口完成通信数据的交互,达到应用组件通信时屏蔽SRIO底层驱动接口的目的。MHAL初始化具体的实现步骤如下:
[0084] 步骤1.1、初始化DSP的SRIO接口的DeviceID和通信速率。例如:对CPS1848 进行初始化,设置为4x模式,Lane速率为3.125G。然后对DSP1的SRIO接口进行初始化,同样配置为4x模式,速率为3.125G,同时设置RapidIO器件地址 PD为0x51。
[0085] 步骤1.2、使能SRIO中断。当数据接收完毕时,用来响应DOORBELL中断,进而能够处理Srio_DoorBell_Int中断服务函数。
[0086] 步骤1.3、配置SRIO交换网络路由为DSP自环通信方式,发送自环测试数据对DSP的SRIO接口进行自环测试。例如,配置SRIO交换网络路由时,当PD 为0x51时,将CPS1848-1的port6路由到port11,CPS1848-2的port11路由到port7,CPS1848-1的port7路由到port6,使DSP1自环,发送自环测试数据,
[0087] 步骤1.4、比较SRIO接口的各端口收发的自环测试数据,如果相同,自环测试通过,进行接下来的操作,否则MHAL初始化失败,步骤1.1-1.4均在 Srio_Init函数中执行,查看Srio_Init函数返回值,返回值为1,表示MHAL 初始化成功。
[0088] 步骤1.5调用DestLD_MapTo_DestPD函数,创建目的组件LD与目的设备PD 的映射表。例如:为DSP1定义一个组件,LD为0xAA,DSP2同样定义一个组件, LD为0xBB,定义DSP2的PD为0x52。那么DSP1使用DestLD_MapTo_DestPD函数创建0xBB和0x52的映射表。
[0089] 步骤1.6调用Local_LD_Attach函数,创建本地组件LD注册表。例如:DSP1 使用Local_LD_Attach函数将0xAA添加到本地组件LD注册表中。
[0090] 步骤1.7调用LD_RouteTo_AC函数,创建本地组件LD与组件任务信号量的映射表。例如:DSP1使用LD_RouteTo_AC函数建立本地组件0xAA与组件任务信号量SEM1的映射表;
[0091] 步骤1.8检查步骤1.5-1.7的返回值,若每步都成功执行,则MHAL初始化成功完成,否则MHAL初始化失败。
[0092] 对DSP2进行MHAL初始化,重复上述步骤1.1-1.8,不同的是DSP2的器件地址配置为0x52,在交换网络上为0x52配置自环路由,建立0xAA和0x51的目的组件LD与目的器件PD映射表,将0xBB添加到本地组件LD注册表中,建立 DSP2本地组件0xBB与组件任务信号量SEM2的映射表。
[0093] 2)消息发送
[0094] DSP1的AC使用MHAL需要对外发送数据时,将数据事先写到TX_Buffer这个缓存中。在调用MHALWrite函数发送数据时,首先取出TX_Buffer指向的最低16位,获得目的组件的LD,查找目的组件LD与目的设备PD的映射表,得到目的器件PD。接着读取TX_Buffer指向的下一组16位,判断要发送数据的长度。由于DSP的SRIO接口数据最大缓存为4K,且SRIO数据包最多携带256个字节的数据,所以若数据长度大于4K字节则每次取出4K个字节,每次分16个SRIO 数据包进行发送,直到全部取出,反之则一次全部取出,与目的器件地址PD一起传递给SRIO接口,采用NWRITE事务将数据发送出去。在完成MHAL初始化后,执行如下步骤:
[0095] 步骤2.1、配置本地DSP和其他硬件平台的SRIO交换网络路由。
[0096] 步骤2.2、应用组件(0xAA)调用MHALWrite函数发送数据。MHALWrite函数首先读取TX_Buffer指向的最低16位目的组件LD(0xBB),查找 DestLD_MapTo_DestPD函数所建立的目的组件LD与目的器件PD的映射表,获得目的器件PD。
[0097] 步骤2.3、MHALWrite函数接着读取TX_Buffer指向的下一组16位的数据包头,通过数据包头判断数据长度,若数据长度大于4K字节则每次从TX_Buffer 中取出最大4K字节数据,分16包发送给DSP的SRIO接口,直至全部取出;若数据长度小于4K字节,则一次取出给SRIO接口。
[0098] 步骤2.4、DSP的SRIO接口使用前面获得的目的器件PD、数据长度、 Tx_Buffer中的数据和目的组件LD等信息,发送NWRITE事务。
[0099] 步骤2.5、SRIO接口将数据发送出去,通过SRIO交换网络到指定器件地址的器件上,MHAL消息发送完毕后,发送一个DOORBELL包,向目的器件指示数据发送完毕。
[0100] 3)数据接收
[0101] 当DSP2接收到DOORBELL包时,指示MHAL消息接收完毕,DOORBELL中断触发执行Srio_DoorBell_Int函数,到数据接收Rev_Ptr指针指向的缓存读取低 16位LD信息,查找LD与组件信号量映射表,释放该LD对应的信号量,当释放的信号量到达该组件时,组件调用MHALRead函数,将接收到的MHAL消息写入 Rx_Buffer中,供应用层组件使用。
[0102] 具体实现步骤如下:
[0103] 步骤3.1、DSP2检测SRIO接口是否收到DOORBELL数据包,如果检测到,则触发DOORBELL中断。
[0104] 步骤3.2、执行Srio_DoorBell_Int中断服务函数,到MHAL接收内存,即Rev_Ptr指针指向的缓存读取低16位本地组件LD信息,查找LD_RouteTo_AC函数所建立的本地组件LD与组件任务信号量映射表,获得该组件任务的信号量,并释放该组件任务信号量。
[0105] 步骤3.2组件任务信号量释放后,对应的组件就会检测到相关组件任务信号量到达,从而调用MHALRead函数,从Rev_Ptr指针指向的缓存中将接收到的 MHAL消息写入Rx_Buffer中,供该组件使用。
[0106] 可以使用CCSv3.3软件观察DSP1的Tx_Buffer内存窗口和DSP2的 RX_Buffer内存窗口,判断接收到的数据以及数据长度是否与发送的数据以及数据长度相同,相同则证明收发数据功能正常。
[0107] 以上所述,仅为本发明的一个具体实例,所涉及到芯片不仅局限于 TMS320C6455这一款,SRIO交换芯片也不局限于CPS1848这一款,任何具有SRIO 接口的DSP芯片都可应用于本发明中,所以本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明所述的技术范围内,所做的变化或替换,都应涵盖在本发明的保护范围内。因此,本发明的保护范围应以权利要求书的保护范围为准。
QQ群二维码
意见反馈