V4l2_subdev_ops回调函数

V4l2_subdev_ops回调函数是sensor驱动中逻辑控制的核心。回调函数包括非常多的功能,具体可以查看kernel代码include/media/v4l2-subdev.h。建议sensor驱动至少包括如下回调函数。以IMX219为例:
static const struct v4l2_subdev_core_ops imx219_core_ops = {
        .subscribe_event = v4l2_ctrl_subdev_subscribe_event,
        .unsubscribe_event = v4l2_event_subdev_unsubscribe,
};

static const struct v4l2_subdev_video_ops imx219_video_ops = {
        .s_stream = imx219_set_stream,
};

static const struct v4l2_subdev_pad_ops imx219_pad_ops = {
        .enum_mbus_code = imx219_enum_mbus_code,
        .get_fmt = imx219_get_pad_format,
        .set_fmt = imx219_set_pad_format,
        .get_selection = imx219_get_selection,
        .enum_frame_size = imx219_enum_frame_size,
};

static const struct v4l2_subdev_ops imx219_subdev_ops = {
        .core = &imx219_core_ops,
        .video = &imx219_video_ops,
        .pad = &imx219_pad_ops,
};
以下为上述代码块的参数说明:
  • s_stream:即set stream,包括stream on和stream off,一般在这里配置寄存器,使其输出图像。
  • .enum_mbus_code:枚举驱动支持的mbus_code。
  • .get_fmt:返回当前sensor选中的format/size。如果.get_fmt缺失,media-ctl工具无法查看sensor entity当前配置的fmt。
  • .set_fmt:设置sensor的format/size。
  • .enum_frame_size:枚举驱动支持的分辨率。