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.

tvp7002输入DM368的信号异常后,DM368无法正常捕获视频问题

Other Parts Discussed in Thread: TVP7002

大家好,

        我们在使用tvp7002+dm368进行720p视频编码,Ypbpr视频经过tvp7002变成数字信号后输入dm368进行编码,软件使用DVSDK开发包。

        正常情况下没有问题,但是在进行振动试验时发现当tvp7002的前端输入信号硬件连接不稳定时,tvp7002的输出时钟、行场同步等信号波形会变得异常,这些异常的信号输入给DM368后会造成编码中断,定位后发现是此时DM368无法正常捕获视频数据,capture线程一上来捕获视频的函数就卡死了;当振动结束,硬件连接稳定后,tvp7002的输出信号会变得正常,但DM368无法自行恢复,重新运行应用程序也无法恢复,必须重启芯片才可恢复(时间过长);

        我们想实现振动时可以异常,但是振动结束后整个系统可以自行恢复;一种思路是让tvp7002在输入异常时不要输出混乱的信号给dm368,另一种思路是让DM368可以不受前面错误信号的干扰,输入变正常后还可以自行恢复编码,尝试让异常后DM368复位视频处理子系统,研究代码后发现好像不是很好实现;

        这里想要请教一下大家有没有遇到类似的情况,有没有好的方法能够实现我们想要的功能,如果有更好的思路也请大家不吝赐教,多谢!!!

  • 你好,

    你可以做一个定时检查resizer中断是否有的task。如果太长时间没有resizer中断,timeout后,复位vpss。

  • 感谢您的回答,我们一开始也是想在异常后单独复位VPSS,但是没有找到很好的实现方式,您能不能详细说一下怎样能在不重启系统的前提下复位vpss,在dvsdk开发包中有没有相应的函数可以调用?多谢!

  • 你好,

    DVSDK里面应该没有复位代码。UBL里面有vpss复位流程,你参考一下。

  • 您好,

           我们使用的是DVSDK-4_02_00_01,在里面psp/flash-utils/common/ubl/src中,有个ubl.c,好像是UBL的代码,里面调用了一个叫VPSS_SYNC_RESET的函数,它对VPSS和PSC进行可相关的寄存器配置,不知道这个函数实现的是不是就是您说的那个复位流程?

  • 你好,

    核心是的。但是复位前后寄存器/环境变量的备份和恢复还需要你自己软件加上。

  • 您好,

            我们按照这个函数的流程做了一下,发现vpss复位后它所有寄存器的值都变成了0(包括一些默认值不是0的寄存器也是),然后我们按照之前备份的值进行寄存器恢复,发现此时寄存器无法写入,值永远是0,请问这种现象正常吗?应该如何解决?多谢!

  • 你好,

    现象不正常。你确认复位后有使能vpss,并且状态切换都是完成了?

  • 您说的状态切换指的是VPSS从复位状态回到正常状态的切换吗,这个有什么标志可以判断吗?

  • 你好,

    你的代码和下面的类似么?黄色部分有么?

    void DRV_SyncRst(unsigned int module, unsigned int domain, unsigned int state)
    {
     int pMem_map;

     unsigned int *pMDCTL = NULL;
     unsigned int *pPTCMD = NULL;
     unsigned int *pPTSTAT = NULL;
     unsigned int *pMDSTAT = NULL;

     pMem_map = 0x01C41000;

     pPTCMD = (unsigned int *)( pMem_map+0x120 );
     pPTSTAT = (unsigned int *)( pMem_map+0x128 );
     pMDSTAT = (unsigned int *)( pMem_map+0x800 );
     pMDCTL = (unsigned int *)( pMem_map+0xA00 );
     
     // Wait for any outstanding transition to complete
     while ( (*pPTSTAT) & (0x00000001 << domain) );

     // If we are already in that state, just return
     if (((pMDSTAT[module]) & 0x1F) == state) return;

     // Perform transition
     pMDCTL[module] = ((pMDCTL[module]) & (0xFFFFFFE0)) | (state);
     *pPTCMD |= (0x00000001 << domain);

     // Wait for transition to complete
     while ( (*pPTSTAT) & (0x00000001 << domain) );

     // Wait and verify the state
     while (((pMDSTAT[module]) & 0x1F) != state);
     
     return;
    }

  • 您好,

            我们的代码和您的结构基本是一致的,上面的代码只是让VPSS进入同步复位状态,此时DM368还是不能正常捕获视频,我们尝试后发现按照上述代码复位VPSS后(state = 1),使用同样的结构使VPSS进入使能状态(state = 3),再恢复VPSS的中断相关寄存器状态,DM368即可恢复捕获视频。感谢您的帮助。

  • 不好意思,又来麻烦您,这样写是可以复位的,但是我们发现运行复位函数20多次左右就可能出现一次复位函数卡死,定位发现是往PTCMD寄存器写1时会出现卡死,不往下执行,也不报错,我们是使用__raw_writel函数,地址用的是0xFEC41120的物理地址;写别的寄存器没有这种问题,就是这个寄存器会偶尔出现写不进去卡死的问题,请问这应该怎么解决,是这种写法(__raw_write)的问题还是由于这个寄存器相关的问题?多谢!

  • 你好,

    请确保在做vpss复位时候,所以vpss对DDR的读写操作都结束/关闭了,例如H3A统计,hist统计,ISIF输出,rez输出,CVBS本地显示等。需要disable这些功能,再加一点延时。