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.

有关C6657上upp无法响应中断的问题



我是在CCSv5.5开发调试,uPP配置参考‘upp_dlb_test’。但有所不同的是,‘upp_dlb_test’使用Chan Q作为receive通道,Chan I作为transmit通道,而我程序内部对Chan Q/I 的配置刚好相反。


不过目前通过轮询方式已经能正常与fpga通讯,输出的图像也是OSD叠加后的正常图像,但不知道这是不是导致uPP中断无法响应的原因。由于使用了sys/bios,也就没有使用CSL配置uPP中断了;

Bios的中断配置,map应该都没问题,uartA、B都能正常响应中断,唯独uPP不能响应,怀疑uPP中断没有输出到CIC0上,也就没有map到corePac上;下面附上uPP寄存器截图,UPISR,UPIER 的EOWI都被置1,但不知道 UPIES 和 UPIEC 都是相同的val,是否会影响uPP的EOWI中断输出呢?

  • 另外,前两天我在与上位机联调串口协议时发现,数据已经到了串口,但是没有响应中断,在我手动对ISR对应的ISR6置1后,后续的中断触发就正常了,这是什么原因导致的呢?

    现在我是在中断配置map后,codes中加入了一行 ‘ISR = (1<<6);’,由此也不用我手动去修改ISR6的值了,上电后串口接收数据就能正常触发中断,进入注册的函数接口中了。不是很明白。

  • 1 串口中断调测加入ISR=1<<6才可以触发中断,说明你的中断链路还没调通,是这样么?正常UART是可以产生Tx/Rx 完成事件到CIC0然后根据配置路由到corepac内部的;

    2 UPIES及UPIEC读出来的值就应该是一样的,表示对应的中断事件是使能的;如果UPIER对应的bit已经是1,说明UPP已经产生相应的事件,说明UPP是配置工作ok的;接下来就要依次查看CIC及corepac INTC的配置寄存器,要确认事件是否到CIC0,可以查看CIC相关的状态寄存器RAW_STATUS_REG,对UPP产生的系统事件号为156,对应寄存器RAW_STATUS_REG[4] bit28,正常这个bit状态应该是1,CIC事件要路由到下一级,要配置CIC system event与host event的映射,并使能system and host event,and enable global host event。

    我觉得你的问题不在UPP,而在中断配置,请参考下面的中断配置wiki。

    http://processors.wiki.ti.com/index.php/Configuring_Interrupts_on_Keystone_Devices#Using_SYS.2FBIOS

  • hi,Andy

    感谢您的答复,其他事情耽搁了一下。另外串口中断配置加入ISR=1<<6,只是中断配置好后做一次,以后都不会再调用;如下图:

    我认同您认为问题还是在中断配置上的观点,我在查看Map到CIC0的时候发现,RAW_STATUS_REGx中system interrupt 156没有被置1,而我串口绑定UARTINT_A, UARTINT_B分别是164和40的system interrupt,但是RAW_STATUS_REGx被置1的反而是166(UTXEVT_A)和42(UTXEVT_B)的system interrupt,如下图所示:(0x02600000为CIC0的寄存器地址,红色选框中Offsets 0x200-0x27C为RAW_STATUS_REGx)


    我想请问,我只想在UART A/B有接收到数据时,响应中断处理接口的话,到底应该使用那个system interrupt来注册中断配置管理?


  • hi, Andy

    我确实也是参考http://processors.wiki.ti.com/index.php/Configuring_Interrupts_on_Keystone_Devices#Using_SYS.2FBIOS做的中断配置,代码中配置如下:(uPP的中断配置中:irq为156,intc为4,其他形参可以不管;串口的uart A、B也是调这个配置其中断管理的)

    Hwi_Handle myHwi[16] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};

    int request_irq_v2(int intc, unsigned int irq, CpIntc_FuncPtr handler, unsigned long flags, const char *name, void *context)
    {
            Hwi_Params params;
            int eventId = -1;
            static int cnt = 0;

            /* Map the System Interrupt i.e. the Interrupt Destination 0 interrupt to the UPP ISR Handler. */
            CpIntc_dispatchPlug(irq, (CpIntc_FuncPtr)handler, (UArg)0, TRUE);

            /* The configuration is for CPINTC0. We map system interrupt irq to Host Interrupt intc. */
            CpIntc_mapSysIntToHostInt(0, irq, intc);

            /* Enable the Host Interrupt. */
            CpIntc_enableHostInt(0, intc);

            /* Enable the System Interrupt */
            CpIntc_enableSysInt(0, irq);

            /* Get the event id associated with the host interrupt. */
            eventId = CpIntc_getEventId(intc);

            Hwi_Params_init(&params);

            /* Host interrupt value*/
            params.arg = intc;
            params.eventId = eventId;/* Event id for your host interrupt */
            params.enableInt = TRUE;/* Enable the Hwi */
            params.maskSetting = Hwi_MaskingOption_SELF;

            /* This plugs the interrupt vector intc and the ISR function. */
            myHwi[cnt] = Hwi_create(intc, &CpIntc_dispatch, &params, NULL);
            if(myHwi[cnt] == NULL){
                    DBG(DBG_ERR, "install irq %d failed\n", irq);
            }

            else
                    ++cnt;


            Hwi_enableInterrupt(intc);
            return cnt;
    }

    是我哪里配置得有问题吗?至少按您说的,RAW_STATUS_REG[4] bit28 并没有被置1啊!

  • URXEVT及UXEVT是在FIFIO mode下产生的中断,可以直接触发相应的EDMA channel,启动数据的接收及发送,UARTINT是在多种事件的组合输出信号,跟UART的配置有关,请对照UART user guide及STK uart例程看一下你的配置。

    UPP的问题很奇怪,产生的事件号就是156,我看你截图中寄存器ENA_STATUS_REG 对应地址0x02600280开始的值中,只有bit24置位,其他UPP及UART的中断都没有使能,这个寄存器是反应system event是否使能。

    在6657板子上跑一下UPP的例程看一下中断是否ok,再跟bios运行之后比较一下中断寄存器的配置。

  • hi,Andy

    我试着用之前卢工给我upp_dlb_test来测试我们板子上的upp中断是否响应,结果发现其绑定的INTC4没有Enable,ISR入口的断点也没有进入,我自己手动修改ISR4为1也触发不了注册的那个ISR,麻烦您帮我看下,是我的工程有什么问题吗?

    另外,原代码配置使用uPP Channel A作为发送端口,Channel B作为接收端口,但是没有触发进入中断处理函数;我们板子的原理图表明Channel A被作为了接收端口,Channel B被作为了发送端口,我对代码uPP配置处颠倒了A,B的配置,还是没有进入中断处理函数。

    麻烦您了,万分感激,祝好。

    upp_dlb_test.7z
  • 其中调用的函数CSL_intcInit中有使能interrupt vector ID,我之前在EVM6657测试中断是ok的,你单步调测看看代码是否把所有的初始化分支都跑到了,是否有异常退出了。

    interrupt vector4是否使能查看对应寄存器IER,另外可以查看中断矢量表寄存器ISTP对应地址存储的vectorID 4对应的注册函数地址是否为UPP ISR。