视频口是通过SAA7121芯片输出的图像,而且可以输出720*576的图像。但是有时候启动测试程序,打开视频口后,程序卡死在VIDIOC_DQBUF中,具体位置为:
case VIDIOC_DQBUF: davincihd_display.c
/* Call videobuf_dqbuf for blocking mode */
ret = videobuf_dqbuf(&common->buffer_queue,(struct v4l2_buffer *)arg, 0);
在videobuf_dqbuf()函数中: video-buf.c
retval = videobuf_waiton(buf, nonblocking, 1);
if (retval < 0) {
printk(1,"dqbuf: waiton returned %d\n",retval);
goto done;
}
在videobuf_waition()函数中:video-buf.c
printk("\n\n%s the state is vb->state = %d, intr = %d\n", __FUNCTION__, vb->state, intr);
if (vb->state == STATE_ACTIVE || vb->state == STATE_QUEUED)
schedule(); //sched.c
1.解释卡死现象:
驱动程序我已经贴在下面,具体demo就是和前期做的视频口测试demo一样,当打开设备,设置属性,可以工作时,我开始发送图像流,即 进行ioctl,操作这个宏VIDIOC_DQBUF 也就是写数据到驱动缓冲区里。但是该ioctl不能返回,卡死在我贴出来的驱动函数处。就在这个卡死的时候,是没有中断的。
2.解释设置寄存器的问题
寄存器我已经设置中断了,而且我在操作时,图像是可以发送出去的,并且显示能看到720*576的图像,认为这是正确的。
3.图像时有时无的问题
由于1的问题,图像输不出来,为无。2的问题为有。寄存器的值都是一样的0x148b(通道2寄存器CH2_CTRL的设置值).
4.解释第一次的问题
第一次,就是我去执行demo程序,如果demo程序上来就执行sched.c文件处的printk函数(我自己添加的,这个地方是内核的调度),那此时就卡死了。如果一上来没有执行调度,既可以顺利工作,但是图像很卡,不流畅。 |