学习资料: 韦东山第三期 可参考:https://www.cnblogs.com/lethe1203/p/18097351
video_device ->.fops ->v4l2_file_operations ->.ioctl_ops ->v4l2_ioctl_opsv4l2_ioctl_ops可分为两类:
- INFO_FL_STD:标准的,无需特殊的代码来处理,APP的调用可以直达这些处理函数
- INFO_FL_FUNC:这类ioctl需要特殊处理,比如对于VIDIOC_ENUM_FMT,它需要根据设备的类型分别枚举:
- INFO_FL_STD:APP发出的ioctl直接调用底层的video_device->ioctl_ops->xxxx(....)
- INFO_FL_FUNC:APP发出的ioctl,交给drivers\media\v4l2-core\v4l2-ioctl.c,它先进行一些特殊处理后,再调用底层的video_device->ioctl_ops->xxxx(....)
- 使用IOCTL_INFO_FNC定义的数组项,表示它是INFO_FL_FUNC类型的
- 使用IOCTL_INFO_STD定义的数组项,表示它是INFO_FL_STD类型的
上层调用ioctl ->v4l2_ioctl // 次设备号找到video_device ->vdev->fops->unlocked_ioctl(filp, cmd, arg); // 一般这个unlocked_ioctl都等于内核提供的video_ioctl2 ->video_usercopy(file, cmd, arg, __video_do_ioctl); // 调用__video_do_ioctl ->__video_do_ioctl // v4l2_ioctl_ops *ops = vdev->ioctl_ops ->v4l2_ioctls // 根据cmd找到ioctl是标准的还是特殊处理的,标准和特殊的处理如下:标签:INFO,调用,ops,V4L2,ioctl,video,FL,v4l2 From: https://www.cnblogs.com/lethe1203/p/18097354