VB2(以omap3isp为例)

VB2几种操作模式必须要实现的ops

1. userptr

mem_ops->get_userptrmem_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->allocmem_ops->putmem_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_dmabufmem_ops->detach_dmabufmem_ops->map_dmabufmem_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:

  1. ops->queue_setup: 在VIDIOC_REQBUFS()和VIDIOC_CREATE_BUFS()中被调用,在分配内存之前调用此接口获取分配内存需要的参数。
  2. ops->buf_init:在分配内存之后(MMAP方式)或者获取内存之后(USERPTR方式),调用这个接口去做一些额外的初始化操作,可选。
  3. ops->buf_prepare:在每次用户态qbuf之后调用,或者在VIDIOC_PREPARE_BUF() ioctl之后,在硬件操作之前,驱动可以在这个接口中执行一些初始化操作,可选。
  4. ops->buf_finish:在内次用户态dqbuf之前调用。驱动可以在用户空间访问buffer之前执行任何操作。可选。
  5. ops->buf_queue:给驱动传递一个vb buffer,驱动可以把这个vb配置到硬件中。此外,驱动应该在填充完这个vb buffer之后调用vb2_buffer_done来通知vb。
  6. ops->wait_prepare:在等待buffer之前被调用,释放在vb2接口中被调用的锁,防止死锁的发生。
  7. ops->wait_finish:在等待buffer之后被调用,可以重新获取之前释放的锁。
  8. ops->start_streaming:在开流时调用一次。驱动可以从入参count中获取已经有几个buffer被queued。
  9. ops->stop_streaming:在关流之后调用。驱动应该先停止DMA传输或者等待传输结束并且归还所有vb buffer。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值