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;
}
Hi Wang,
由于ICRR寄存器的默认值是0, 所以很多情况会导致这个事件生成,不仅仅是程序中配置的doorbell事件。 在中断函数中出不来说明该事件在持续发生。 建议看一下LSU, doorbell等的ICSR寄存器,看一下是哪些事件导致的中断。
另外,如果您希望用CSL_INTC_EVENTID_RIOINT0,下面这行代码需要改为赋值0.
*(VUINT*)DOORBELL0_ICRR = 0x1;
你好,
我们针对C6474/C6487的BSP中有Doorbell的全套源码。
如果项目时间紧迫,可以考虑商用软件。 如果选择OSEck,你们在C6474上,将和世界知名通信公司NSN等,使用相同的平台软件。
William.dong@enea.com
Hi Jane
我按照你说的做了一下修改,然后查看了下导致异常中断的原因,看到ERR_RST_EVNT_ICSR这个寄存器中的值是0x00000200,对应的位BIT9
ICS9 0 Error not detected on port 1
1 Error detected on port 1
说明我在使用PORT0的时候PORT1有错误中断发生,请问这种情况是什么引起的?