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.

关于C6474 SRIO中DOORBELL的问题

现在有一块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 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有错误中断发生,请问这种情况是什么引起的?

x 出现错误。请重试或与管理员联系。