V4L2 ioctl调用流程分析
学习资料:
韦东山第三期
video_device ->.fops ->v4l2_file_operations ->.ioctl_ops ->v4l2_ioctl_ops
![0](https://img2024.cnblogs.com/blog/3261801/202403/3261801-20240326185552070-331711603.png)
v4l2_ioctl_ops可分为两类:
- INFO_FL_STD:标准的,无需特殊的代码来处理,APP的调用可以直达这些处理函数
- INFO_FL_FUNC:这类ioctl需要特殊处理,比如对于VIDIOC_ENUM_FMT,它需要根据设备的类型分别枚举:
![0](https://img2024.cnblogs.com/blog/3261801/202403/3261801-20240326185551347-1951201824.png)
简单地说,这2类ioctl的差别在于:
- 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(....)
drivers\media\v4l2-core\v4l2-ioctl.c
- 使用IOCTL_INFO_FNC定义的数组项,表示它是INFO_FL_FUNC类型的
![0](https://img2024.cnblogs.com/blog/3261801/202403/3261801-20240326185549797-1932841099.png)
- 使用IOCTL_INFO_STD定义的数组项,表示它是INFO_FL_STD类型的
![0](https://img2024.cnblogs.com/blog/3261801/202403/3261801-20240326185551060-447307154.png)
两类IOCTL调用流程:
上层调用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是标准的还是特殊处理的,标准和特殊的处理如下:
![0](https://img2024.cnblogs.com/blog/3261801/202403/3261801-20240326185549878-128852829.png)