大家好:
我最近在用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的中断做的比较复杂,有较多的映射等。也不知道我的理解和上面的配置是不是存在差错和误区,还请社区的各位同仁指点一二,在此先谢过了。
静候各位佳音。谢谢。