USB摄像头ioctl的处理
app调用那么多的ioctl驱动是怎么处理的无论怎么样驱动程序都会调用到v4l2_ioctl在去调用到具体的设备驱动的unlocked_ioctl在uvc_driver.c中使用下面的函数这里就进入到了v4l2-ioctl.c层在__video_do_ioctl中来处理各种ioctl来看看都支持哪些cmd,太多太多了举个例子应用程序来发送这个cmdVIDIOC_G_FBUF驱动程序收到之后内核就会构造一个函数,然后调用它怎么构造的这个函数呢通过下面的宏最后得到的函数就是调用上一层注册进来的v4l2_ioctl_ops里面的vidioc_g_fbuf这个函数static int v4l_stub_g_fbuf(const struct v4l2_ioctl_ops *ops,struct file *file, void *fh, void *p) {return ops-vidioc_g_fbuffile,fh,p //直接调用无需特殊处理}对于uvc_driver.c并没有提供这个vidioc_g_fbuf我找到了其他的例子。再来一个例子说明应用程序来发送VIDIOC_ENUM_FMT来枚举格式驱动程序从__video_do_ioctl的v4l2_ioctls表里会找到这一项调用里面的v4l_enum_fmt函数v4l_enum_fmt会调用上层注册的v4l2_ioctl_ops里面的vidioc_enum_fmt_vid_cap。可以把这些ioctl分为两类特殊处理的和标准处理。特殊处理的ioctl不能直接调用v4l2_ioctl_ops里面的ioctl比如 v4l_querycap哪些是标准的ioctl下图都是直接调用v4l2_ioctl_ops里面的ioctl最后来一张总体的架构图吧下一章V4L2 Buffer管理-CSDN博客