This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
现在有一块6474板和FPGA使用SRIO进行通讯,当FPGA发送数据完之后想再发送一个Doorbell来触发6474的中断,现在是已经可以发送DOORBELL的数据包了,但是6474的中断不知道如何配置,中断路由如何设置,麻烦请帮忙看一下,谢谢
Wang,
抱歉,手上没有C6474的例子,您可以参考一下论坛上Keystone1 STK 的SRIO例程,里面有doorbell中断,流程基本是一样的。
简单来讲,流程如下:
FPGA侧: 负责填写正确的doorbell info, 这个值会指定使用哪个Doorbell ICRR 寄存器的哪个位域。 table 23中给了几个例子。 假设FPGA侧写的info值为0000, 即对应ICRR0的第9个位域 ICR9。
DSP侧:
1 初始化DOORBELL ICRR寄存器。 例如需要把doorbell ICR9中断路由到INTDST1 事件, 则将 Doorbell0 ICRR2寄存器赋值为0x10. 需注意,不同的INTDST事件会路由到不同的核,请按照您的实际情况选择INTDSTx值。
2 将事件INTDSTx路由到某个DSP中断号。 查器件手册就可以得到INTDSTx对应到CPU的哪个事件号,比如第71号事件,并将该事件挂接到某个中断上。 这个过程就是通用的中断挂接方法,不展开描述了,可以参考CSL的intc模块代码。
3 SRIO的中断处理流程会有些要求,比如清状态位,刷一下INTDSTn_RATE_CNTL寄存器,这些内容在SRIO 用户手册的interrupt章节都有描述。
Jane Lu你好
对于你的帮助非常感谢,我现在已经可以操作SRIO1通道的Doorbell中断了,但是改成0之后只要初始化中断函数,使能中断,就会直接进入中断函数里面无法跳出
中断初始化函数:
void Intc_Init()
{
intcContext.eventhandlerRecord = EventHandler;
intcContext.numEvtEntries = 11;
CSL_intcInit(&intcContext);
CSL_intcGlobalNmiEnable();
CSL_intcGlobalEnable(&state);
vectId = CSL_INTC_VECTID_4;
SRIO_PORT_NUM hIntcRIO = CSL_intcOpen (&intcObjRIO, CSL_INTC_EVENTID_RIOINT1,&vectId , NULL);
if (hIntcRIO == NULL)
{
printf("Intc open failed\n");
return;
}
EventRecord.handler = (CSL_IntcEventHandler)&DoorbellIntc;
EventRecord.arg = hIntcRIO;
CSL_intcPlugEventHandler(hIntcRIO,&EventRecord);
((CSL_IntcRegsOvly)CSL_INTC_0_REGS)->EVTCLR[0] = 0xffffffff;
((CSL_IntcRegsOvly)CSL_INTC_0_REGS)->EVTCLR[1] = 0xffffffff;
((CSL_IntcRegsOvly)CSL_INTC_0_REGS)->EVTCLR[2] = 0xffffffff;
((CSL_IntcRegsOvly)CSL_INTC_0_REGS)->EVTCLR[3] = 0xffffffff;
*(VUINT*)DOORBELL0_ICCR = 0xffffffff;
*(VUINT*)DOORBELL1_ICCR = 0xffffffff;
*(VUINT*)DOORBELL2_ICCR = 0xffffffff;
*(VUINT*)DOORBELL3_ICCR = 0xffffffff;
*(VUINT*)LSU_ICCR = 0xffffffff;
*(VUINT*)INTDST0_RATE_CNTL = 1;
*(VUINT*)INTDST1_RATE_CNTL = 1;
*(VUINT*)ERR_RST_EVNT_ICCR = 0xffffffff;
*(VUINT*)DOORBELL0_ICRR = 0x1;
CSL_intcHwControl(hIntcRIO,CSL_INTC_CMD_EVTCLEAR,NULL);
CSL_intcHwControl(hIntcRIO,CSL_INTC_CMD_EVTENABLE,NULL);
}
我是直接将代码中红色部分改成CSL_INTC_EVENTID_RIOINT0的,请问还需要进行其他设置吗?
中断函数:
void DoorbellIntc( )
{
((CSL_IntcRegsOvly)CSL_INTC_0_REGS)->EVTCLR[0] = 0xffffffff;
((CSL_IntcRegsOvly)CSL_INTC_0_REGS)->EVTCLR[1] = 0xffffffff;
((CSL_IntcRegsOvly)CSL_INTC_0_REGS)->EVTCLR[2] = 0xffffffff;
((CSL_IntcRegsOvly)CSL_INTC_0_REGS)->EVTCLR[3] = 0xffffffff;
*(VUINT*)DOORBELL0_ICCR=0xffffffff;
*(VUINT*)DOORBELL1_ICCR=0xffffffff;
*(VUINT*)DOORBELL2_ICCR=0xffffffff;
*(VUINT*)DOORBELL3_ICCR=0xffffffff;
*(VUINT*)LSU_ICCR=0xffffffff;
*(VUINT*)INTDST0_RATE_CNTL=1;
*(VUINT*)INTDST1_RATE_CNTL=1;
}