大家好,mcvip_test.out运行到MCVIP_getbuf中的OSA_queGet时跳出,不继续执行MCVIP_getBufInfo函数了,请问是什么原因啊?
5158寄存器0x00 7e,0x01 a0
Shane Huang1:
你确定是跳出吗?
OSA_queGet是有一个超时时间的,如果超时时间设为无限,队列中又没有buffer,就停在这里面了
Michael_zhang:
回复 Shane Huang1:
Dear Shane
谢谢您的回答,我设置的是OSA_TIMEOUT_FOREVER,确实是一直停在那里等待数据,
可是5158打印的寄存器显示数据已经锁定了,为什么还是获取不到数据呢? 也没有提示出错…..
Michael_zhang:
回复 Shane Huang1:
MCVIP的队列机制有没有相关文档,只能对着源代码看么? VPFE的配置你指的是内核里面的吗? 还是?
Shane Huang1:
回复 Michael_zhang:
没有相关文档,看代码吧
是内核里的,看看中断有没有发生
Michael_zhang:
回复 Shane Huang1:
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中断么?
附件为板子的配置信息做参考…..
Shane Huang1:
回复 Michael_zhang:
没错,是这个中断,你要在驱动里加个打印什么的,看看VD中断有没有来。
正常情况下,每一帧是会有一个中断的
Michael_zhang:
回复 Shane Huang1:
能获取到中断,然后进入中断函数中,但是数据传到哪了,不是在中断处理函数中传递么?
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; }
Shane Huang1:
回复 Michael_zhang:
数据是DMA过来的,中断里做的事是把填满的buffer通知给上层,另外把下一个空buffer的地址更新给DMA。
这里用的是V4L2吧?再看看dequeue出来的buffer对不对吧
Michael_zhang:
回复 Shane Huang1:
我在MCVIP里面保存了数据data为.BIN格式的,然后我调试OSA的时候发现 其中的hndl->count一直是0,导致osa_queget一直停在那…..