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,
具体可以参考SRIO user guider sprue13 Table23 (Examples of DOORBELL_INFO Designations). 通过配置DOORBELLx_ICRR寄存器,并填写合适的door bell info 来生成SRIO 事件。 SRIO事件到CPU中断的配置方式类同LSU中断。
Jane Lu你好,你说的这个表我看了,还有一点疑问,我的6474是工作在slave状态下的,FPGA为maste 当FPGA向dsp发送doorbell时,会触发dsp的中断,请问这个中断应该怎么初始化?中断函数如何注册?有没有类似的例子提供呢?谢谢
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;
}
Hi Jane
我按照你说的做了一下修改,然后查看了下导致异常中断的原因,看到ERR_RST_EVNT_ICSR这个寄存器中的值是0x00000200,对应的位BIT9
ICS9 0 Error not detected on port 1
1 Error detected on port 1
说明我在使用PORT0的时候PORT1有错误中断发生,请问这种情况是什么引起的?