日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

视频驱动V4L2子系统驱动架构 - ioctl

發(fā)布時間:2025/3/21 windows 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 视频驱动V4L2子系统驱动架构 - ioctl 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

基于linux4.6.3,最后會附上一張ioctl調(diào)用總圖,分析代碼還是要用圖來說明,這樣更清晰一點,我就是這么分析的,不過平時分析的圖很隨便,而且很大,所以就不能在這里呈現(xiàn),我在這里會貼出一個簡略圖

ioctl詳解

進入ioctl都是從cdev->ops->ioctl進入的,一般的驅(qū)動cdev都是驅(qū)動自己初始化的,在v4l2架構(gòu)中,cdev都已經(jīng)初始化完成,不需要驅(qū)動開發(fā)者來初始化,下面是v4l2的cdev->ops結(jié)構(gòu)體v4l2_fops :

static const struct file_operations v4l2_fops = {.owner = THIS_MODULE,.read = v4l2_read,.write = v4l2_write,.open = v4l2_open,.get_unmapped_area = v4l2_get_unmapped_area,.mmap = v4l2_mmap,.unlocked_ioctl = v4l2_ioctl, #ifdef CONFIG_COMPAT.compat_ioctl = v4l2_compat_ioctl32, #endif.release = v4l2_release,.poll = v4l2_poll,.llseek = no_llseek, };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

可以看到ioctl有兩個,一個unlocked_ioctl,另一個是compat_ioctl 兼容性的,其中的區(qū)別這里不多說,我們來看函數(shù)v4l2_ioctl:

static long v4l2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) {struct video_device *vdev = video_devdata(filp);int ret = -ENODEV;if (vdev->fops->unlocked_ioctl) {struct mutex *lock = v4l2_ioctl_get_lock(vdev, cmd);if (lock && mutex_lock_interruptible(lock))return -ERESTARTSYS;if (video_is_registered(vdev))ret = vdev->fops->unlocked_ioctl(filp, cmd, arg);--正常進入函數(shù)|video_device->fopsif (lock)mutex_unlock(lock);} elseret = -ENOTTY;return ret; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

從上可以看到要調(diào)用vdev->fops->unlocked_ioctl(filp, cmd, arg);具體驅(qū)動實現(xiàn)不同,以davinci平臺為例來介紹,在vpfe_capture.c文件中,初始化過程中有

vfd->fops = &vpfe_fops;
  • 1
static const struct v4l2_file_operations vpfe_fops = {.owner = THIS_MODULE,.open = vpfe_open,.release = vpfe_release,.unlocked_ioctl = video_ioctl2,.mmap = vpfe_mmap,.poll = vpfe_poll };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

那么是要調(diào)用video_ioctl2:

long video_ioctl2(struct file *file,unsigned int cmd, unsigned long arg) {return video_usercopy(file, cmd, arg, __video_do_ioctl);--這個函數(shù)最終是要調(diào)用__video_do_ioctl,當然他會做其他事,有興趣的可以去了解 }
  • 1
  • 2
  • 3
  • 4
  • 5
static long __video_do_ioctl(struct file *file,unsigned int cmd, void *arg) {struct video_device *vfd = video_devdata(file);const struct v4l2_ioctl_ops *ops = vfd->ioctl_ops;----|video_device->ioctl_ops(注意 video_device這幾個函數(shù)的調(diào)用,要明白他們的作用)bool write_only = false;struct v4l2_ioctl_info default_info;const struct v4l2_ioctl_info *info;void *fh = file->private_data;struct v4l2_fh *vfh = NULL;int dev_debug = vfd->dev_debug;long ret = -ENOTTY;if (ops == NULL) {pr_warn("%s: has no ioctl_ops.\n",video_device_node_name(vfd));return ret;}if (test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags))vfh = file->private_data;if (v4l2_is_known_ioctl(cmd)) {------------------------檢查命令是否可用info = &v4l2_ioctls[_IOC_NR(cmd)];if (!test_bit(_IOC_NR(cmd), vfd->valid_ioctls) &&!((info->flags & INFO_FL_CTRL) && vfh && vfh->ctrl_handler))goto done;if (vfh && (info->flags & INFO_FL_PRIO)) {ret = v4l2_prio_check(vfd->prio, vfh->prio);if (ret)goto done;}} else {default_info.ioctl = cmd;default_info.flags = 0;default_info.debug = v4l_print_default;info = &default_info;}write_only = _IOC_DIR(cmd) == _IOC_WRITE;if (info->flags & INFO_FL_STD) {-----進入正題,這幾個if會判斷cmd的類型,然后調(diào)用不同的函數(shù),這里留個尾巴,詳情見下一節(jié)typedef int (*vidioc_op)(struct file *file, void *fh, void *p);const void *p = vfd->ioctl_ops;const vidioc_op *vidioc = p + info->u.offset;/*調(diào)用驅(qū)動自定義的函數(shù)*/ret = (*vidioc)(file, fh, arg);------------調(diào)用video_device->ioctl_ops} else if (info->flags & INFO_FL_FUNC) {/*調(diào)用架構(gòu)定義的函數(shù)ops,ops最終還是要調(diào)用驅(qū)動自定義的函數(shù)*/ret = info->u.func(ops, file, fh, arg);----調(diào)用video_device->ioctl_ops} else if (!ops->vidioc_default) {ret = -ENOTTY;} else {ret = ops->vidioc_default(file, fh,vfh ? v4l2_prio_check(vfd->prio, vfh->prio) >= 0 : 0,cmd, arg);----調(diào)用video_device->ioctl_ops->vidioc_default}done:if (dev_debug & (V4L2_DEV_DEBUG_IOCTL | V4L2_DEV_DEBUG_IOCTL_ARG)) {if (!(dev_debug & V4L2_DEV_DEBUG_STREAMING) &&(cmd == VIDIOC_QBUF || cmd == VIDIOC_DQBUF))return ret;v4l_printk_ioctl(video_device_node_name(vfd), cmd);if (ret < 0)pr_cont(": error %ld", ret);if (!(dev_debug & V4L2_DEV_DEBUG_IOCTL_ARG))pr_cont("\n");else if (_IOC_DIR(cmd) == _IOC_NONE)info->debug(arg, write_only);else {pr_cont(": ");info->debug(arg, write_only);}}return ret; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80

ioctl命令分類

ioctl命令在文件v4l2-ioctl.c文件中實現(xiàn),上面分析的函數(shù)__video_do_ioctl就在此文件中,在分析這個函數(shù)的過程中留了個尾巴,下面來分析一下

從上面的分析過程可以看出最終都是要調(diào)用video_device->ioctl_ops,而且調(diào)用時還需判斷是INFO_FL_STD還是INFO_FL_FUNC,怎么判斷呢,v4l2-ioctl.c有定義:

IOCTL_INFO_FNC(命令, 實現(xiàn)函數(shù), 打印信息(debug使用), flag),同樣?
IOCTL_INFO_STD(命令, 實現(xiàn)函數(shù), 打印信息(debug使用), flag)

static struct v4l2_ioctl_info v4l2_ioctls[] = {IOCTL_INFO_FNC(VIDIOC_QUERYCAP, v4l_querycap, v4l_print_querycap, 0),IOCTL_INFO_FNC(VIDIOC_ENUM_FMT, v4l_enum_fmt, v4l_print_fmtdesc, INFO_FL_CLEAR(v4l2_fmtdesc, type)),IOCTL_INFO_FNC(VIDIOC_G_FMT, v4l_g_fmt, v4l_print_format, 0),IOCTL_INFO_FNC(VIDIOC_S_FMT, v4l_s_fmt, v4l_print_format, INFO_FL_PRIO),IOCTL_INFO_FNC(VIDIOC_REQBUFS, v4l_reqbufs, v4l_print_requestbuffers, INFO_FL_PRIO | INFO_FL_QUEUE),IOCTL_INFO_FNC(VIDIOC_QUERYBUF, v4l_querybuf, v4l_print_buffer, INFO_FL_QUEUE | INFO_FL_CLEAR(v4l2_buffer, length)),IOCTL_INFO_STD(VIDIOC_G_FBUF, vidioc_g_fbuf, v4l_print_framebuffer, 0),IOCTL_INFO_STD(VIDIOC_S_FBUF, vidioc_s_fbuf, v4l_print_framebuffer, INFO_FL_PRIO),IOCTL_INFO_FNC(VIDIOC_OVERLAY, v4l_overlay, v4l_print_u32, INFO_FL_PRIO),IOCTL_INFO_FNC(VIDIOC_QBUF, v4l_qbuf, v4l_print_buffer, INFO_FL_QUEUE),IOCTL_INFO_STD(VIDIOC_EXPBUF, vidioc_expbuf, v4l_print_exportbuffer, INFO_FL_QUEUE | INFO_FL_CLEAR(v4l2_exportbuffer, flags)),IOCTL_INFO_FNC(VIDIOC_DQBUF, v4l_dqbuf, v4l_print_buffer, INFO_FL_QUEUE),IOCTL_INFO_FNC(VIDIOC_STREAMON, v4l_streamon, v4l_print_buftype, INFO_FL_PRIO | INFO_FL_QUEUE),IOCTL_INFO_FNC(VIDIOC_STREAMOFF, v4l_streamoff, v4l_print_buftype, INFO_FL_PRIO | INFO_FL_QUEUE),IOCTL_INFO_FNC(VIDIOC_G_PARM, v4l_g_parm, v4l_print_streamparm, INFO_FL_CLEAR(v4l2_streamparm, type)),IOCTL_INFO_FNC(VIDIOC_S_PARM, v4l_s_parm, v4l_print_streamparm, INFO_FL_PRIO),IOCTL_INFO_STD(VIDIOC_G_STD, vidioc_g_std, v4l_print_std, 0),IOCTL_INFO_FNC(VIDIOC_S_STD, v4l_s_std, v4l_print_std, INFO_FL_PRIO),IOCTL_INFO_FNC(VIDIOC_ENUMSTD, v4l_enumstd, v4l_print_standard, INFO_FL_CLEAR(v4l2_standard, index)),IOCTL_INFO_FNC(VIDIOC_ENUMINPUT, v4l_enuminput, v4l_print_enuminput, INFO_FL_CLEAR(v4l2_input, index)),IOCTL_INFO_FNC(VIDIOC_G_CTRL, v4l_g_ctrl, v4l_print_control, INFO_FL_CTRL | INFO_FL_CLEAR(v4l2_control, id)),IOCTL_INFO_FNC(VIDIOC_S_CTRL, v4l_s_ctrl, v4l_print_control, INFO_FL_PRIO | INFO_FL_CTRL),IOCTL_INFO_FNC(VIDIOC_G_TUNER, v4l_g_tuner, v4l_print_tuner, INFO_FL_CLEAR(v4l2_tuner, index)),IOCTL_INFO_FNC(VIDIOC_S_TUNER, v4l_s_tuner, v4l_print_tuner, INFO_FL_PRIO),IOCTL_INFO_STD(VIDIOC_G_AUDIO, vidioc_g_audio, v4l_print_audio, 0),IOCTL_INFO_STD(VIDIOC_S_AUDIO, vidioc_s_audio, v4l_print_audio, INFO_FL_PRIO),IOCTL_INFO_FNC(VIDIOC_QUERYCTRL, v4l_queryctrl, v4l_print_queryctrl, INFO_FL_CTRL | INFO_FL_CLEAR(v4l2_queryctrl, id)),IOCTL_INFO_FNC(VIDIOC_QUERYMENU, v4l_querymenu, v4l_print_querymenu, INFO_FL_CTRL | INFO_FL_CLEAR(v4l2_querymenu, index)),IOCTL_INFO_STD(VIDIOC_G_INPUT, vidioc_g_input, v4l_print_u32, 0),IOCTL_INFO_FNC(VIDIOC_S_INPUT, v4l_s_input, v4l_print_u32, INFO_FL_PRIO),IOCTL_INFO_STD(VIDIOC_G_EDID, vidioc_g_edid, v4l_print_edid, 0),IOCTL_INFO_STD(VIDIOC_S_EDID, vidioc_s_edid, v4l_print_edid, INFO_FL_PRIO),IOCTL_INFO_STD(VIDIOC_G_OUTPUT, vidioc_g_output, v4l_print_u32, 0),IOCTL_INFO_FNC(VIDIOC_S_OUTPUT, v4l_s_output, v4l_print_u32, INFO_FL_PRIO),IOCTL_INFO_FNC(VIDIOC_ENUMOUTPUT, v4l_enumoutput, v4l_print_enumoutput, INFO_FL_CLEAR(v4l2_output, index)),IOCTL_INFO_STD(VIDIOC_G_AUDOUT, vidioc_g_audout, v4l_print_audioout, 0),IOCTL_INFO_STD(VIDIOC_S_AUDOUT, vidioc_s_audout, v4l_print_audioout, INFO_FL_PRIO),IOCTL_INFO_FNC(VIDIOC_G_MODULATOR, v4l_g_modulator, v4l_print_modulator, INFO_FL_CLEAR(v4l2_modulator, index)),IOCTL_INFO_FNC(VIDIOC_S_MODULATOR, v4l_s_modulator, v4l_print_modulator, INFO_FL_PRIO),IOCTL_INFO_FNC(VIDIOC_G_FREQUENCY, v4l_g_frequency, v4l_print_frequency, INFO_FL_CLEAR(v4l2_frequency, tuner)),IOCTL_INFO_FNC(VIDIOC_S_FREQUENCY, v4l_s_frequency, v4l_print_frequency, INFO_FL_PRIO),IOCTL_INFO_FNC(VIDIOC_CROPCAP, v4l_cropcap, v4l_print_cropcap, INFO_FL_CLEAR(v4l2_cropcap, type)),IOCTL_INFO_FNC(VIDIOC_G_CROP, v4l_g_crop, v4l_print_crop, INFO_FL_CLEAR(v4l2_crop, type)),IOCTL_INFO_FNC(VIDIOC_S_CROP, v4l_s_crop, v4l_print_crop, INFO_FL_PRIO),IOCTL_INFO_STD(VIDIOC_G_SELECTION, vidioc_g_selection, v4l_print_selection, INFO_FL_CLEAR(v4l2_selection, r)),IOCTL_INFO_STD(VIDIOC_S_SELECTION, vidioc_s_selection, v4l_print_selection, INFO_FL_PRIO | INFO_FL_CLEAR(v4l2_selection, r)),IOCTL_INFO_STD(VIDIOC_G_JPEGCOMP, vidioc_g_jpegcomp, v4l_print_jpegcompression, 0),IOCTL_INFO_STD(VIDIOC_S_JPEGCOMP, vidioc_s_jpegcomp, v4l_print_jpegcompression, INFO_FL_PRIO),IOCTL_INFO_FNC(VIDIOC_QUERYSTD, v4l_querystd, v4l_print_std, 0),IOCTL_INFO_FNC(VIDIOC_TRY_FMT, v4l_try_fmt, v4l_print_format, 0),IOCTL_INFO_STD(VIDIOC_ENUMAUDIO, vidioc_enumaudio, v4l_print_audio, INFO_FL_CLEAR(v4l2_audio, index)),IOCTL_INFO_STD(VIDIOC_ENUMAUDOUT, vidioc_enumaudout, v4l_print_audioout, INFO_FL_CLEAR(v4l2_audioout, index)),IOCTL_INFO_FNC(VIDIOC_G_PRIORITY, v4l_g_priority, v4l_print_u32, 0),IOCTL_INFO_FNC(VIDIOC_S_PRIORITY, v4l_s_priority, v4l_print_u32, INFO_FL_PRIO),IOCTL_INFO_FNC(VIDIOC_G_SLICED_VBI_CAP, v4l_g_sliced_vbi_cap, v4l_print_sliced_vbi_cap, INFO_FL_CLEAR(v4l2_sliced_vbi_cap, type)),IOCTL_INFO_FNC(VIDIOC_LOG_STATUS, v4l_log_status, v4l_print_newline, 0),IOCTL_INFO_FNC(VIDIOC_G_EXT_CTRLS, v4l_g_ext_ctrls, v4l_print_ext_controls, INFO_FL_CTRL),IOCTL_INFO_FNC(VIDIOC_S_EXT_CTRLS, v4l_s_ext_ctrls, v4l_print_ext_controls, INFO_FL_PRIO | INFO_FL_CTRL),IOCTL_INFO_FNC(VIDIOC_TRY_EXT_CTRLS, v4l_try_ext_ctrls, v4l_print_ext_controls, INFO_FL_CTRL),IOCTL_INFO_STD(VIDIOC_ENUM_FRAMESIZES, vidioc_enum_framesizes, v4l_print_frmsizeenum, INFO_FL_CLEAR(v4l2_frmsizeenum, pixel_format)),IOCTL_INFO_STD(VIDIOC_ENUM_FRAMEINTERVALS, vidioc_enum_frameintervals, v4l_print_frmivalenum, INFO_FL_CLEAR(v4l2_frmivalenum, height)),IOCTL_INFO_STD(VIDIOC_G_ENC_INDEX, vidioc_g_enc_index, v4l_print_enc_idx, 0),IOCTL_INFO_STD(VIDIOC_ENCODER_CMD, vidioc_encoder_cmd, v4l_print_encoder_cmd, INFO_FL_PRIO | INFO_FL_CLEAR(v4l2_encoder_cmd, flags)),IOCTL_INFO_STD(VIDIOC_TRY_ENCODER_CMD, vidioc_try_encoder_cmd, v4l_print_encoder_cmd, INFO_FL_CLEAR(v4l2_encoder_cmd, flags)),IOCTL_INFO_STD(VIDIOC_DECODER_CMD, vidioc_decoder_cmd, v4l_print_decoder_cmd, INFO_FL_PRIO),IOCTL_INFO_STD(VIDIOC_TRY_DECODER_CMD, vidioc_try_decoder_cmd, v4l_print_decoder_cmd, 0),IOCTL_INFO_FNC(VIDIOC_DBG_S_REGISTER, v4l_dbg_s_register, v4l_print_dbg_register, 0),IOCTL_INFO_FNC(VIDIOC_DBG_G_REGISTER, v4l_dbg_g_register, v4l_print_dbg_register, 0),IOCTL_INFO_FNC(VIDIOC_S_HW_FREQ_SEEK, v4l_s_hw_freq_seek, v4l_print_hw_freq_seek, INFO_FL_PRIO),IOCTL_INFO_STD(VIDIOC_S_DV_TIMINGS, vidioc_s_dv_timings, v4l_print_dv_timings, INFO_FL_PRIO),IOCTL_INFO_STD(VIDIOC_G_DV_TIMINGS, vidioc_g_dv_timings, v4l_print_dv_timings, 0),IOCTL_INFO_FNC(VIDIOC_DQEVENT, v4l_dqevent, v4l_print_event, 0),IOCTL_INFO_FNC(VIDIOC_SUBSCRIBE_EVENT, v4l_subscribe_event, v4l_print_event_subscription, 0),IOCTL_INFO_FNC(VIDIOC_UNSUBSCRIBE_EVENT, v4l_unsubscribe_event, v4l_print_event_subscription, 0),IOCTL_INFO_FNC(VIDIOC_CREATE_BUFS, v4l_create_bufs, v4l_print_create_buffers, INFO_FL_PRIO | INFO_FL_QUEUE),IOCTL_INFO_FNC(VIDIOC_PREPARE_BUF, v4l_prepare_buf, v4l_print_buffer, INFO_FL_QUEUE),IOCTL_INFO_STD(VIDIOC_ENUM_DV_TIMINGS, vidioc_enum_dv_timings, v4l_print_enum_dv_timings, 0),IOCTL_INFO_STD(VIDIOC_QUERY_DV_TIMINGS, vidioc_query_dv_timings, v4l_print_dv_timings, 0),IOCTL_INFO_STD(VIDIOC_DV_TIMINGS_CAP, vidioc_dv_timings_cap, v4l_print_dv_timings_cap, INFO_FL_CLEAR(v4l2_dv_timings_cap, type)),IOCTL_INFO_FNC(VIDIOC_ENUM_FREQ_BANDS, v4l_enum_freq_bands, v4l_print_freq_band, 0),IOCTL_INFO_FNC(VIDIOC_DBG_G_CHIP_INFO, v4l_dbg_g_chip_info, v4l_print_dbg_chip_info, INFO_FL_CLEAR(v4l2_dbg_chip_info, match)),IOCTL_INFO_FNC(VIDIOC_QUERY_EXT_CTRL, v4l_query_ext_ctrl, v4l_print_query_ext_ctrl, INFO_FL_CTRL | INFO_FL_CLEAR(v4l2_query_ext_ctrl, id)), };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84

上面的分析中一直說到video_device->ioctl_ops,那么ioctl_ops有多少函數(shù)呢。。很多見下:?
算了還是不粘貼了自己去代碼中看吧,這里只粘一點:

struct v4l2_ioctl_ops {/* ioctl callbacks *//* VIDIOC_QUERYCAP handler */int (*vidioc_querycap)(struct file *file, void *fh, struct v4l2_capability *cap);/* VIDIOC_ENUM_FMT handlers */int (*vidioc_enum_fmt_vid_cap) (struct file *file, void *fh,struct v4l2_fmtdesc *f);int (*vidioc_enum_fmt_vid_overlay) (struct file *file, void *fh,struct v4l2_fmtdesc *f);int (*vidioc_enum_fmt_vid_out) (struct file *file, void *fh,struct v4l2_fmtdesc *f);int (*vidioc_enum_fmt_vid_cap_mplane)(struct file *file, void *fh,struct v4l2_fmtdesc *f);int (*vidioc_enum_fmt_vid_out_mplane)(struct file *file, void *fh,struct v4l2_fmtdesc *f);int (*vidioc_enum_fmt_sdr_cap) (struct file *file, void *fh,struct v4l2_fmtdesc *f);int (*vidioc_enum_fmt_sdr_out) (struct file *file, void *fh,struct v4l2_fmtdesc *f);。。。/* DV Timings IOCTLs */int (*vidioc_s_dv_timings) (struct file *file, void *fh,struct v4l2_dv_timings *timings);int (*vidioc_g_dv_timings) (struct file *file, void *fh,struct v4l2_dv_timings *timings);int (*vidioc_query_dv_timings) (struct file *file, void *fh,struct v4l2_dv_timings *timings);int (*vidioc_enum_dv_timings) (struct file *file, void *fh,struct v4l2_enum_dv_timings *timings);int (*vidioc_dv_timings_cap) (struct file *file, void *fh,struct v4l2_dv_timings_cap *cap);int (*vidioc_g_edid) (struct file *file, void *fh, struct v4l2_edid *edid);int (*vidioc_s_edid) (struct file *file, void *fh, struct v4l2_edid *edid);int (*vidioc_subscribe_event) (struct v4l2_fh *fh,const struct v4l2_event_subscription *sub);int (*vidioc_unsubscribe_event)(struct v4l2_fh *fh,const struct v4l2_event_subscription *sub);/* For other private ioctls */long (*vidioc_default) (struct file *file, void *fh,bool valid_prio, unsigned int cmd, void *arg); };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

ioctl調(diào)用總圖

總結(jié)

以上是生活随笔為你收集整理的视频驱动V4L2子系统驱动架构 - ioctl的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。