VB2几种操作模式必须要实现的ops
1. userptr
mem_ops->get_userptr | mem_ops->put_userptr |
---|
static int __verify_userptr_ops(struct vb2_queue *q)
{
if (!(q->io_modes & VB2_USERPTR) || !q->mem_ops->get_userptr ||
!q->mem_ops->put_userptr)
return -EINVAL;
return 0;
}
2. mmap
mem_ops->alloc | mem_ops->put | mem_ops->mmap |
---|
static int __verify_mmap_ops(struct vb2_queue *q)
{
if (!(q->io_modes & VB2_MMAP) || !q->mem_ops->alloc ||
!q->mem_ops->put || !q->mem_ops->mmap)
return -EINVAL;
return 0;
}
3. dmabuf
mem_ops->attach_dmabuf | mem_ops->detach_dmabuf | mem_ops->map_dmabuf | mem_ops->unmap_dmabuf |
---|
static int __verify_dmabuf_ops(struct vb2_queue *q)
{
if (!(q->io_modes & VB2_DMABUF) || !q->mem_ops->attach_dmabuf ||
!q->mem_ops->detach_dmabuf || !q->mem_ops->map_dmabuf ||
!q->mem_ops->unmap_dmabuf)
return -EINVAL;
return 0;
}
V4L2框架用到的vb2的ops
以yavta APP和omap3isp驱动为例,见下图:
需要用户实现的ops:
ops->queue_setup
: 在VIDIOC_REQBUFS()和VIDIOC_CREATE_BUFS()中被调用,在分配内存之前调用此接口获取分配内存需要的参数。ops->buf_init
:在分配内存之后(MMAP方式)或者获取内存之后(USERPTR方式),调用这个接口去做一些额外的初始化操作,可选。ops->buf_prepare
:在每次用户态qbuf之后调用,或者在VIDIOC_PREPARE_BUF() ioctl之后,在硬件操作之前,驱动可以在这个接口中执行一些初始化操作,可选。ops->buf_finish
:在内次用户态dqbuf之前调用。驱动可以在用户空间访问buffer之前执行任何操作。可选。ops->buf_queue
:给驱动传递一个vb buffer,驱动可以把这个vb配置到硬件中。此外,驱动应该在填充完这个vb buffer之后调用vb2_buffer_done
来通知vb。ops->wait_prepare
:在等待buffer之前被调用,释放在vb2接口中被调用的锁,防止死锁的发生。ops->wait_finish
:在等待buffer之后被调用,可以重新获取之前释放的锁。ops->start_streaming
:在开流时调用一次。驱动可以从入参count中获取已经有几个buffer被queued。ops->stop_streaming
:在关流之后调用。驱动应该先停止DMA传输或者等待传输结束并且归还所有vb buffer。