V4L2之events

函数

V4L2 events 提供一种将event传递到用户空间的通用方式。

驱动需要调用下面的函数将event添加到队列中。并且只需要填充type、data,其它的由v4l2来填充。

v4l2_event_queue (vdev, ev)

通过下面的函数来订阅event,这个函数实际上是video_device-> ioctl_ops-> vidioc_subscribe_event的具体实现。需要注意的是在驱动中要先检查驱动是否能产生指定的事件。

v4l2_event_subscribe (fh, sub , elems, ops)

ops参数可以让驱动指定一个回调函数:add,del,replace,merge。一共有4个可选的回调函数,如果不需要也可以传入NULL参数。

通过下面的函数来取消event的订阅。实际上也是video_device-> ioctl_ops-> vidioc_unsubscribe_event的具体实现。

v4l2_event_unsubscribe (fh, sub)

通过下面的函数来查看是否有挂起的事件。函数返回事件的number。

v4l2_event_pending (fh)

应用

应用程序中ioctl使用和其它功能函数类似,它的的宏定义如下:
VIDIOC_SUBSCRIBE_EVENT-订阅事件
VIDIOC_UNSUBSCRIBE_EVENT-取消订阅事件

int ioctl(int fd, VIDIOC_SUBSCRIBE_EVENT, struct v4l2_event_subscription *argp)
int ioctl(int fd, VIDIOC_UNSUBSCRIBE_EVENT, struct v4l2_event_subscription *argp)

fd: 使用open()函数返回的文件描述符
argp: 指向struct v4l2_event_subscription的指针

驱动实例

/drivers/media/platform/omap3isp/ispccdc.c

static int ccdc_subscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh,
				struct v4l2_event_subscription *sub)
{
	if (sub->type != V4L2_EVENT_FRAME_SYNC)
		return -EINVAL;

	/* line number is zero at frame start */
	if (sub->id != 0)
		return -EINVAL;

	return v4l2_event_subscribe(fh, sub, OMAP3ISP_CCDC_NEVENTS, NULL);
}

static int ccdc_unsubscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh,
				  struct v4l2_event_subscription *sub)
{
	return v4l2_event_unsubscribe(fh, sub);
}

static const struct v4l2_subdev_core_ops ccdc_v4l2_core_ops = {
	.ioctl = ccdc_ioctl,
	.subscribe_event = ccdc_subscribe_event,
	.unsubscribe_event = ccdc_unsubscribe_event,
};

/* V4L2 subdev operations */
static const struct v4l2_subdev_ops ccdc_v4l2_ops = {
	.core = &ccdc_v4l2_core_ops,
	.video = &ccdc_v4l2_video_ops,
	.pad = &ccdc_v4l2_pad_ops,
};

相关内容阅读

链接: V4L2框架
链接: V4L2之设备注册
链接: V4L2之mmap()函数
链接: V4L2之events
链接: V4L2之buffer分配和映射

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android V4L2代理是一种用于在Android设备上访问Linux V4L2驱动机制V4L2代理为Android应用程序提供了一种简单的方式来控制和管理相机硬件。它充分利用了V4L2驱动的功能,使得开发人员可以更加灵活地操作相机。 Android V4L2代理工作流程如下:首先,应用程序通过调用Android相机API来请求访问相机硬件。然后,V4L2代理将这些请求翻译成V4L2驱动可以理解的指令,并将其发送到Linux内核中的V4L2驱动驱动完成请求后,将结果返回给V4L2代理,再由代理传递给应用程序。 通过使用Android V4L2代理,开发人员可以直接访问V4L2驱动的高级功能,如手动调整相机参数、设置相机模式、捕获图像和视频等。这使得开发人员可以更好地控制相机硬件,并实现各种复杂的图像处理操作。 与直接访问V4L2驱动相比,使用V4L2代理具有一定的优势。首先,它提供了一个统一的接口,简化了对各种不同相机硬件的管理。其次,它可以屏蔽底层驱动的复杂性,使开发人员能够更专注于应用程序的逻辑。此外,V4L2代理还提供了一套高级API,使得开发人员可以更快速地开发相机相关的功能。 综上所述,Android V4L2代理是一种为了简化相机硬件访问的机制,在Android设备上使用V4L2驱动的高级功能。它使开发人员能够更好地控制相机硬件,并提供了一种简化和加速应用程序开发的方式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值