项目场景:

       应用于两个多核DSP进行SRIO通信,其中一块DSP向另一个DSP发送DOORBELL进行SRIO传输通知


问题描述:

        一块DSP的核0向另一块DSP的核7发送数据和门铃中断,对方能够成功接收数据,但收不到门铃。

        门铃发送函数代码如下:

//Send SRIO DoorBell packet
Int32 Keystone_SRIO_DoorBell(Uint32 uiPort, Uint32 uiLSU_No,Uint32 uiDestID, Uint32 uiDoorBellInfo)
{SRIO_LSU_Transfer lsuTransfer;lsuTransfer.rioAddressMSB=0;lsuTransfer.rioAddressLSB_ConfigOffset= 0;lsuTransfer.localDspAddress= 0;lsuTransfer.bytecount= 4; 	lsuTransfer.packetType= SRIO_PKT_TYPE_DOORBELL;lsuTransfer.dstID= uiDestID;lsuTransfer.doorbellInfo= uiDoorBellInfo;lsuTransfer.waitLsuReady= 1;lsuTransfer.lsuNum= uiLSU_No;lsuTransfer.doorbellValid = 1;lsuTransfer.intrRequest = 0;lsuTransfer.supGoodInt = 0;lsuTransfer.priority = 0;lsuTransfer.outPortID = uiPort;lsuTransfer.idSize = 0;lsuTransfer.srcIDMap = 0;lsuTransfer.hopCount = 0;Keystone_SRIO_LSU_transfer(&lsuTransfer);return Keystone_SRIO_wait_LSU_completion(uiLSU_No,lsuTransfer.transactionID, lsuTransfer.contextBit);}


原因分析:

     SRIO数据能够正常进行传输,那我们着重分析门铃无法接收到的问题。结合TMS320C6678手册中Table7-38,可以看到:SRIO的中断映射应该对应INTDST(n+16),即:核0对应INTDST16,核7对应INTDST23。

TMS320C6678:多核DSP间SRIO门铃收发问题-编程之家

 

解决方案:

①检查将SRIO放在核7的DSP的配置。在其SRIO_Interrupts_Init():

TMS320C6678:多核DSP间SRIO门铃收发问题-编程之家

核0对应16,核1对应17…,核7对应23

TMS320C6678:多核DSP间SRIO门铃收发问题-编程之家

故应将INTDAT_16修改为INTDAT_17。

②发送方DSP应将门铃发送函数Keystone_SRIO_DoorBell(0,0,8,0)修改为(0,7,8,0)。

③关于Keystone_SRIO_DoorBell函数的分析

Keystone_SRIO_DoorBell(Uint32 uiPort, Uint32 uiLSU_No, Uint32 uiDestID, Uint32 uiDoorBellInfo)有四个参数:

      uiPort(端口)、uiLSU_No(寄存器号)、uiDestID(目的ID)、uiDoorBellInfo(门铃信息)

A.这里的目的ID由交换机的路由表决定,此例中的目的ID为8;

B.当存在多个DSP同时给同一个DSP发送门铃中断时,利用不同的uiDoorBellInfo帮助接收中断的DSP分辨门铃中断来自哪一个DSP芯片。以我使用的门铃信息为例:

发送(0,7,8,0),接收端(doorbell&1)==1;

发送(0,7,8,1),接收端(doorbell&2)==1;

发送(0,7,8,2),接收端(doorbell&4)==1;

接收端门铃信息判别的具体实现代码如下:

TMS320C6678:多核DSP间SRIO门铃收发问题-编程之家