TI中文支持网
TI专业的中文技术问题搜集分享网站

C6678 SRIO Doorbell中断总是收不到

大家好:

     我最近在用TI C6678DSP调试SRIO部分。我的系统是:6678通过交换芯片TSI578与PowerPC P2020相连。P2020接switch的port2, C 6678接switch的port8,配置4x,3.125gbps, 由p2020做host,枚举系统。开发环境CCS5.4.

    我使用了CCS5.4安装路径下的drv->srio->tesr->benworking工程,貌似这是基于SYSBIOS的工程。编译运行,能与系统连接上,P2020也能正确枚举到C6678。再修改参数,能向P2020发送Doorbell。问题是P2020向6678发送Doorbell时,6678总是进不了中断。但我读DOORBELL_ICSR寄存器却发现好像硬件已经收到了P2020发过来的Doorbell。

    我的配置是,将Doorbell0~4所有的bit都映射到INTDST16,由core0响应。我的理解是:SRIO中断可直接由core0的内部中断控制器intc来响应而不需要由CIC通过Event Combiner来映射,所以我直接调用CSL API来配置srio中断,配置如下:

1、先配置doorbell 映射到INTDST16:

CSL_SRIO_SetDoorbellRoute (hSrio, 0);

for (i = 0; i < 16; i++)

    {

        CSL_SRIO_RouteDoorbellInterrupts (hSrio, 0, i, 0);

        CSL_SRIO_RouteDoorbellInterrupts (hSrio, 1, i, 1);

        CSL_SRIO_RouteDoorbellInterrupts (hSrio, 2, i, 2);

        CSL_SRIO_RouteDoorbellInterrupts (hSrio, 3, i, 3);

}

2、然后是配置intc

{
Uint32 rawStatus;
Uint16 index;

CSL_EventHandlerRecord    EventHandler[30];

intcContext.eventhandlerRecord = EventHandler;
intcContext.numEvtEntries = 10;
if (CSL_intcInit(&intcContext) != CSL_SOK)
{
    System_printf("Error: GEM-INTC initialization failed\n");
     return;
}

if (CSL_intcGlobalNmiEnable() != CSL_SOK)
{
      System_printf("Error: GEM-INTC global NMI enable failed\n");
      return;
}

if (CSL_intcGlobalEnable(&state) != CSL_SOK)
{
       System_printf ("Error: GEM-INTC global enable failed\n");
       return;
}

vectId = CSL_INTC_VECTID_4;
hTest = CSL_intcOpen (&intcObj, 20, &vectId , NULL);
if (hTest == NULL)
{
        System_printf("Error: GEM-INTC Open failed\n");
         return;
}

EventRecord.handler = &myIsr;
EventRecord.arg = 0;
if (CSL_intcPlugEventHandler(hTest,&EventRecord) != CSL_SOK)
{
         System_printf("Error: GEM-INTC Plug event handler failed\n");
         return;
}

if (CSL_intcHwControl(hTest,CSL_INTC_CMD_EVTENABLE, NULL) != CSL_SOK)
{
          System_printf("Error: GEM-INTC CSL_INTC_CMD_EVTENABLE command failed\n");
          return;
}

System_printf ("Debug: GEM-INTC Configuration Completed\n");
}

以上就是我的相关配置了,我是初学DSP的,感觉DSP的中断做的比较复杂,有较多的映射等。也不知道我的理解和上面的配置是不是存在差错和误区,还请社区的各位同仁指点一二,在此先谢过了。

              静候各位佳音。谢谢。

Allen35065:

Allen35065:

上图是doorbell时间的路径,你可以根据这个路径查看SRIO,CP_INTC,INTC这些寄存器哪一个被置位,哪一个没有被置位,就能找到你的问题所在了。

Chengfu Dan:

回复 Allen35065:

 Allen Yin:

 你好,感谢你的回答。现在我有以下2点疑问想请教:

1、根据上图,INTDST16是Doorbell专用中断,直接由core0处理,是不是就不用配置CP_intc了?是直接配置INTC就行了吗?

2、根据手册Table7-38,event 20 即 INTDST(16+n),代表的是SRIO中断,我的配置里面有将event 20映射到VECT4,但是event20和Doorbell怎么联系起来呢? 也就是说CSL API的配置将event20和中断向量表做了映射,但是我怎么也联系不起来event20和Doorbell之间的关系。是只要Doorbell产生了就会触发event20吗?还是说我必须进行一些配置才能在Doorbell产生的时候触发event20?

Allen35065:

回复 Chengfu Dan:

这个图对应的是6670,所以只有4个核,对应6678有8个核,对应core0的事件是16,不用cp_intc,直接处理。

Doorbell route到哪一个事件是在SRIO里进行设置的。

Chengfu Dan:

回复 Allen35065:

Allen Yin:

    你好,再次感谢你的回答。你的回答使我清晰了许多。结合KeyStone的SRIO例程,我对Doorbell的中断感觉也理解了不少。但是结合我的工程,我又感到许多不惑,还请Allen Yin指教:

1、    我将中断选择寄存器INTMUX1等相关寄存器打印出来,发现:

    INTMUX1=0x00000014,说明我已经将Event20 事件挂接到了中断4上面

    P2020发送Doorbell给C6678时,得到EVTFLAG[0]=0x00100000,说明event20已经被intc获取到了。

    但是为什么不进入isr呢?我应该怎么看我的VECT4挂接上了我的isr呢?

2、  如果我使用的是CCS自带的基于SYSBIOS的工程,我能在此工程上添加并使用自己定义的vector.asm吗?因为我知道基于SYSBIOS的工程是不能使用自定义的.cmd文件的。

Chengfu Dan:

回复 Chengfu Dan:

再附加一点:3、我读IFR发现INT4(第5bit)也被置位了,设置的ISTP为0x800000,注释说这是LL2的起始地址,但是我在.cmd文件里面找不到MEMORY的定义,请问在SYSBIOS的工程里面,怎么定义.cmd文件中的MEMORY呢?直接添加好像不行。

Zhan Xiang:

回复 Chengfu Dan:

1. Keystone SRIO的例程应该是已经支持doorbell的中断了,你可以参考里面的中断初始化代码。

2. 如果要有sys/bios你要使用sys/bios的hwi来处理中断,在cfg中加入该模块,通过cfg文件或者函数来挂接中断回调函数,详情参考sys/bios的手册。

赞(0)
未经允许不得转载:TI中文支持网 » C6678 SRIO Doorbell中断总是收不到
分享到: 更多 (0)