Edit online

接口设计

16 Jul 2024
Read time: 5 minute(s)

ioctl 接口

用户态通过 /dev/videoX 节点的 ioctl() 接口与内核态 V4L2 框架、DVP 驱动进行交互。主要功能有:

  • 获取、设置格式

  • 申请、释放 Buf

  • QBuf、DQBuf

  • 导出 dma-buf 文件描述符

  • 启动、停止 Stream

定义在include/uapi/linux/videodev2.h
#define VIDIOC_QUERYCAP      _IOR('V',  0, struct v4l2_capability)
#define VIDIOC_ENUM_FMT         _IOWR('V',  2, struct v4l2_fmtdesc)
#define VIDIOC_G_FMT        _IOWR('V',  4, struct v4l2_format)
#define VIDIOC_S_FMT        _IOWR('V',  5, struct v4l2_format)
#define VIDIOC_REQBUFS      _IOWR('V',  8, struct v4l2_requestbuffers)
#define VIDIOC_QUERYBUF     _IOWR('V',  9, struct v4l2_buffer)
#define VIDIOC_G_FBUF        _IOR('V', 10, struct v4l2_framebuffer)
#define VIDIOC_S_FBUF        _IOW('V', 11, struct v4l2_framebuffer)
#define VIDIOC_OVERLAY       _IOW('V', 14, int)
#define VIDIOC_QBUF     _IOWR('V', 15, struct v4l2_buffer)
#define VIDIOC_EXPBUF       _IOWR('V', 16, struct v4l2_exportbuffer)
#define VIDIOC_DQBUF        _IOWR('V', 17, struct v4l2_buffer)
#define VIDIOC_STREAMON      _IOW('V', 18, int)
#define VIDIOC_STREAMOFF     _IOW('V', 19, int)
#define VIDIOC_G_PARM       _IOWR('V', 21, struct v4l2_streamparm)
#define VIDIOC_S_PARM       _IOWR('V', 22, struct v4l2_streamparm)
#define VIDIOC_G_STD         _IOR('V', 23, v4l2_std_id)
#define VIDIOC_S_STD         _IOW('V', 24, v4l2_std_id)
#define VIDIOC_ENUMSTD      _IOWR('V', 25, struct v4l2_standard)
#define VIDIOC_ENUMINPUT    _IOWR('V', 26, struct v4l2_input)
#define VIDIOC_G_CTRL       _IOWR('V', 27, struct v4l2_control)
#define VIDIOC_S_CTRL       _IOWR('V', 28, struct v4l2_control)
#define VIDIOC_QUERYCTRL    _IOWR('V', 36, struct v4l2_queryctrl)
#define VIDIOC_QUERYMENU    _IOWR('V', 37, struct v4l2_querymenu)
#define VIDIOC_G_INPUT       _IOR('V', 38, int)
#define VIDIOC_S_INPUT      _IOWR('V', 39, int)
#define VIDIOC_G_OUTPUT      _IOR('V', 46, int)
#define VIDIOC_S_OUTPUT     _IOWR('V', 47, int)
#define VIDIOC_ENUMOUTPUT   _IOWR('V', 48, struct v4l2_output)
#define VIDIOC_G_FREQUENCY  _IOWR('V', 56, struct v4l2_frequency)
#define VIDIOC_S_FREQUENCY   _IOW('V', 57, struct v4l2_frequency)
#define VIDIOC_CROPCAP      _IOWR('V', 58, struct v4l2_cropcap)
#define VIDIOC_G_CROP       _IOWR('V', 59, struct v4l2_crop)
#define VIDIOC_S_CROP        _IOW('V', 60, struct v4l2_crop)
#define VIDIOC_G_JPEGCOMP    _IOR('V', 61, struct v4l2_jpegcompression)
#define VIDIOC_S_JPEGCOMP    _IOW('V', 62, struct v4l2_jpegcompression)
#define VIDIOC_QUERYSTD      _IOR('V', 63, v4l2_std_id)
#define VIDIOC_TRY_FMT      _IOWR('V', 64, struct v4l2_format)
#define VIDIOC_G_PRIORITY    _IOR('V', 67, __u32) /* enum v4l2_priority */
#define VIDIOC_S_PRIORITY    _IOW('V', 68, __u32) /* enum v4l2_priority */
#define VIDIOC_G_SLICED_VBI_CAP _IOWR('V', 69, struct v4l2_sliced_vbi_cap)
#define VIDIOC_LOG_STATUS         _IO('V', 70)
#define VIDIOC_G_EXT_CTRLS  _IOWR('V', 71, struct v4l2_ext_controls)
#define VIDIOC_S_EXT_CTRLS  _IOWR('V', 72, struct v4l2_ext_controls)
#define VIDIOC_TRY_EXT_CTRLS    _IOWR('V', 73, struct v4l2_ext_controls)
#define VIDIOC_ENUM_FRAMESIZES  _IOWR('V', 74, struct v4l2_frmsizeenum)
#define VIDIOC_ENUM_FRAMEINTERVALS _IOWR('V', 75, struct v4l2_frmivalenum)
#define VIDIOC_G_ENC_INDEX       _IOR('V', 76, struct v4l2_enc_idx)
#define VIDIOC_ENCODER_CMD      _IOWR('V', 77, struct v4l2_encoder_cmd)
#define VIDIOC_TRY_ENCODER_CMD  _IOWR('V', 78, struct v4l2_encoder_cmd)

V4l2 subdev 的外部接口

用户态通过/dev/v4l-subdevX 节点的 ioctl()接口与内核态 V4L2 框架、DVP 驱动、Sensor 驱动进行交互。主要功能有:
  • 获取、设置格式

  • 获取、设置帧间隔

  • 枚举支持的 MBUS 类型

  • 枚举支持的分辨率

  • 获取、设置区域裁剪

定义在 include/uapi/linux/v4l2-subdev.h
#define VIDIOC_SUBDEV_G_FMT         _IOWR('V',  4, struct v4l2_subdev_format)
#define VIDIOC_SUBDEV_S_FMT         _IOWR('V',  5, struct v4l2_subdev_format)
#define VIDIOC_SUBDEV_G_FRAME_INTERVAL      _IOWR('V', 21, struct v4l2_subdev_frame_interval)
#define VIDIOC_SUBDEV_S_FRAME_INTERVAL      _IOWR('V', 22, struct v4l2_subdev_frame_interval)
#define VIDIOC_SUBDEV_ENUM_MBUS_CODE        _IOWR('V',  2, struct v4l2_subdev_mbus_code_enum)
#define VIDIOC_SUBDEV_ENUM_FRAME_SIZE       _IOWR('V', 74, struct v4l2_subdev_frame_size_enum)
#define VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL   _IOWR('V', 75, struct v4l2_subdev_frame_interval_enum)
#define VIDIOC_SUBDEV_G_CROP            _IOWR('V', 59, struct v4l2_subdev_crop)
#define VIDIOC_SUBDEV_S_CROP            _IOWR('V', 60, struct v4l2_subdev_crop)
#define VIDIOC_SUBDEV_G_SELECTION       _IOWR('V', 61, struct v4l2_subdev_selection)
#define VIDIOC_SUBDEV_S_SELECTION       _IOWR('V', 62, struct v4l2_subdev_selection)
/* The following ioctls are identical to the ioctls in videodev2.h */
#define VIDIOC_SUBDEV_G_STD         _IOR('V', 23, v4l2_std_id)
#define VIDIOC_SUBDEV_S_STD         _IOW('V', 24, v4l2_std_id)
#define VIDIOC_SUBDEV_ENUMSTD           _IOWR('V', 25, struct v4l2_standard)
#define VIDIOC_SUBDEV_G_EDID            _IOWR('V', 40, struct v4l2_edid)
#define VIDIOC_SUBDEV_S_EDID            _IOWR('V', 41, struct v4l2_edid)
#define VIDIOC_SUBDEV_QUERYSTD          _IOR('V', 63, v4l2_std_id)
#define VIDIOC_SUBDEV_S_DV_TIMINGS      _IOWR('V', 87, struct v4l2_dv_timings)
#define VIDIOC_SUBDEV_G_DV_TIMINGS      _IOWR('V', 88, struct v4l2_dv_timings)
#define VIDIOC_SUBDEV_ENUM_DV_TIMINGS       _IOWR('V', 98, struct v4l2_enum_dv_timings)
#define VIDIOC_SUBDEV_QUERY_DV_TIMINGS      _IOR('V', 99, struct v4l2_dv_timings)
#define VIDIOC_SUBDEV_DV_TIMINGS_CAP        _IOWR('V', 100, struct v4l2_dv_timings_cap)