v4l2 编程接口(二) ― driver(三)

2014-11-24 09:08:17 · 作者: · 浏览: 4
ct v4l2_subdev *sd, struct v4l2_sliced_vbi_cap *cap);
int (*s_std_output)(struct v4l2_subdev *sd, v4l2_std_id std); /* 设置标准输出 */
int (*querystd)(struct v4l2_subdev *sd, v4l2_std_id *std); /* 查询标准 */
int (*g_input_status)(struct v4l2_subdev *sd, u32 *status); /* 获取输入状态 */
int (*s_stream)(struct v4l2_subdev *sd, int enable); /* 设置数据流 */
int (*enum_fmt)(struct v4l2_subdev *sd, struct v4l2_fmtdesc *fmtdesc); /* 枚举视频格式 */
int (*g_fmt)(struct v4l2_subdev *sd, struct v4l2_format *fmt); /* 获取视频格式 */
int (*try_fmt)(struct v4l2_subdev *sd, struct v4l2_format *fmt); /* 尝试设置视频格式 */
int (*s_fmt)(struct v4l2_subdev *sd, struct v4l2_format *fmt); /* 设置视频格式 */
int (*cropcap)(struct v4l2_subdev *sd, struct v4l2_cropcap *cc); /* 视频剪辑功能 */
int (*g_crop)(struct v4l2_subdev *sd, struct v4l2_crop *crop); /* 获取剪辑功能 */
int (*s_crop)(struct v4l2_subdev *sd, struct v4l2_crop *crop); /* 设置剪辑功能 */
int (*g_parm)(struct v4l2_subdev *sd, struct v4l2_streamparm *param); /* 获取参数 */
int (*s_parm)(struct v4l2_subdev *sd, struct v4l2_streamparm *param); /* 设置参数 */
int (*enum_framesizes)(struct v4l2_subdev *sd, struct v4l2_frmsizeenum *fsize); /* 枚举帧大小 */
int (*enum_frameintervals)(struct v4l2_subdev *sd, struct v4l2_frmivalenum *fival); /* 枚举帧间隔 */
};
因为 v4l2 设备一般用 i2c 总线通信,所以注册函数需要提供 i2c_client,函数原型如下:
[cpp]
/**
* v4l2_i2c_subdev_init - 注册一个 v4l2_subdev
* @sd: v4l2_subdev 结构
* @client: 通信用的i2c设备
* @ops: v4l2_subdev_ops 操作合集
*/
void v4l2_i2c_subdev_init(struct v4l2_subdev *sd, struct i2c_client *client, const struct v4l2_subdev_ops *ops)
当 video_device 中的接口需要调用 v4l2_subdev 的成员函数时一般采用如下宏定义:
[cpp]
/* 调用成员函数之前需要先检查成员函数是否被设置
* v4l2_subdev_call - 调用 v4l2_subdev 成员函数
* @sd: v4l2_subdev 结构
* @o: v4l2_subdev_ops 成员名称
* @f: v4l2_subdev 成员函数
* @args: v4l2_subdev 成员函数的参数

使用示例: err = v4l2_subdev_call(sd, core, g_chip_ident, &chip);
*/
#define v4l2_subdev_call(sd, o, f, args...) \
(!(sd) -ENODEV : (((sd) && (sd)->ops->o && (sd)->ops->o->f) \
(sd)->ops->o->f((sd) , ##args) : -ENOIOCTLCMD))