Other Parts Discussed in Thread: TVP5158
大家好,mcvip_test.out运行到MCVIP_getbuf中的OSA_queGet时跳出,不继续执行MCVIP_getBufInfo函数了,请问是什么原因啊?
5158寄存器0x00 7e,0x01 a0
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.
Other Parts Discussed in Thread: TVP5158
大家好,mcvip_test.out运行到MCVIP_getbuf中的OSA_queGet时跳出,不继续执行MCVIP_getBufInfo函数了,请问是什么原因啊?
5158寄存器0x00 7e,0x01 a0
你确定是跳出吗?
OSA_queGet是有一个超时时间的,如果超时时间设为无限,队列中又没有buffer,就停在这里面了
Dear Shane
谢谢您的回答,我设置的是OSA_TIMEOUT_FOREVER,确实是一直停在那里等待数据,
可是5158打印的寄存器显示数据已经锁定了,为什么还是获取不到数据呢? 也没有提示出错.....
还要看下你的VPFE配的对不对,有没有VD中断
不知道您对MCVIP的队列机制了不了解,您要获得的buffer是从demux过来的
所以沿着数据通路来查吧。先排除了5158的问题,接下来看VPFE的VD中断。。。
MCVIP的队列机制有没有相关文档,只能对着源代码看么? VPFE的配置你指的是内核里面的吗? 还是?
没有相关文档,看代码吧
是内核里的,看看中断有没有发生
VPFE的配置如下:
static struct vpfe_config vpfe_cfg = {
.setup_input = dm365evm_setup_video_input,
.num_subdevs = ARRAY_SIZE(vpfe_sub_devs),
.sub_devs = vpfe_sub_devs,
.card_name = "DM365 EVM",
.ccdc = "DM365 ISIF",
.num_clocks = 1,
.clocks = {"vpss_master"},
};
在程序跑起来以后,我用cat查看interrupts增加了两个vpfe_capture0 是你说的VD中断么?
附件为板子的配置信息做参考.....
没错,是这个中断,你要在驱动里加个打印什么的,看看VD中断有没有来。
正常情况下,每一帧是会有一个中断的
能获取到中断,然后进入中断函数中,但是数据传到哪了,不是在中断处理函数中传递么?
static irqreturn_t vpfe_isr(int irq, void *dev_id)
{
struct vpfe_device *vpfe_dev = dev_id;
enum v4l2_field field;
int fid;
field = vpfe_dev->fmt.fmt.pix.field;
/* if streaming not started, don't do anything */
if (!vpfe_dev->started)
return IRQ_HANDLED;
if (field == V4L2_FIELD_NONE) {
/* handle progressive frame capture */
if (vpfe_dev->cur_frm != vpfe_dev->next_frm)
vpfe_process_buffer_complete(vpfe_dev);
if (vpfe_dev->imp_chained) {
vpfe_dev->skip_frame_count--;
if (!vpfe_dev->skip_frame_count) {
vpfe_dev->skip_frame_count =
vpfe_dev->skip_frame_count_init;
if (imp_hw_if->enable_resize)
imp_hw_if->enable_resize(1);
} else {
if (imp_hw_if->enable_resize)
imp_hw_if->enable_resize(0);
}
}
return IRQ_HANDLED;
}
数据是DMA过来的,中断里做的事是把填满的buffer通知给上层,另外把下一个空buffer的地址更新给DMA。
这里用的是V4L2吧?再看看dequeue出来的buffer对不对吧
我在MCVIP里面保存了数据data为.BIN格式的,然后我调试OSA的时候发现 其中的hndl->count一直是0,导致osa_queget一直停在那.....
最后找到demux里面把图像数据保存下来,然后确实是采到了图像,只是图像被压缩了一半或者是隔行、逐行的问题,我再解决吧,不过谢谢Shane Huang1的帮助。。。
我觉得被压缩了一半是正常现象,就是你说的隔行的问题,你显示出来的只是一场,只是奇数行或偶数行,所以只看到一半是对的。
后面还要做个de-interlace,把两场合成一场
这个 de-interlace有参考的么?这个对我来说有点难度啊 。。。。
这个有一些算法,我记得MCVIP是已经做了最简单的de-interlace,就是把奇偶场直接拼接成一场。
你看一看DMA是怎么搬数据的,demux里面会分析每行的FID