我在v4l2驱动程序中使用vb2_ops。有时在我的v4l2驱动程序中未调用buf_prepare和buf_queue。因此,v4l2线程中的队列变为空,因此不再执行任何缓冲区操作。下面是vb2_ops和v4l2线程的代码段。
static const struct vb2_ops v4l2_vb2_qops = {
.queue_setup = queue_setup,
.buf_prepare = buffer_prepare,
.buf_queue = buffer_queue,
.start_streaming = start_streaming,
.stop_streaming = stop_streaming,
.wait_prepare = vb2_ops_wait_prepare,
.wait_finish = vb2_ops_wait_finish,
};
下面是my_v4l2驱动程序中遵循的步骤。
1) queue_setup
2) buffer_prepare
3) buffer_queue
4) start_streaming
4.1) create thread(happens only once)
4.2) DMA transfer
4.3) update buffer state to VB2_BUF_STATE_DONE
4.4) Process the next buffer in queue, go to step 4.2.
4.5) when all buffers are processed, goto step 2.
V4l2驱动程序类似于vivi驱动程序,可以在以下路径中找到: https://elixir.bootlin.com/linux/v3.17/source/drivers/media/platform/vivi.c#L875
查询:
1)我想知道为什么有时v4l2框架没有调用buffer_prepare和buffer_queue吗?
2)在执行上述过程时,我是否错过了缓冲区管理方面的工作?
预先感谢
此致
库尔卡尼。