V4L2 ioctl调用流程分析

学习资料:
韦东山第三期
 
video_device 
    ->.fops ->v4l2_file_operations
    ->.ioctl_ops ->v4l2_ioctl_ops
0
v4l2_ioctl_ops可分为两类:
  • INFO_FL_STD:标准的,无需特殊的代码来处理,APP的调用可以直达这些处理函数
  • INFO_FL_FUNC:这类ioctl需要特殊处理,比如对于VIDIOC_ENUM_FMT,它需要根据设备的类型分别枚举:
0
简单地说,这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
  • 使用IOCTL_INFO_STD定义的数组项,表示它是INFO_FL_STD类型的
0
 
两类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
 
 
 
 
posted @ 2024-03-26 18:55  lethe1203  阅读(64)  评论(0编辑  收藏  举报