Video4Linux框架简介(7) - V4L2框架和v4l2_subdev

V4L2框架


译注:这是目前看到关于V4L2框架内众多结构关系最提纲挈领的一张图。

Video4Linux框架简介(7) - V4L2框架和v4l2_subdev_第1张图片


子设备:v4l2_subdev struct

通常芯片连接到i2cSPI总线,或通过GPIO引脚控制,但它们也可以表示SoC / FPGA内部模块。

子设备驱动程序可以由不同的桥驱动程序使用,因此它们不能依赖于任何特定的桥驱动程序。

不能进行探测,因此桥接器驱动程序必须显式加载子驱动程序。

必须可以寻址一个,一个子集或所有子驱动程序。

API必须与总线无关。

大量的硬件导致大量的API:如何保持高效?


译注:由于V4L2框架本身支持的设备类型众多,而每种设备的操作函数又大有不同,因此除了核心回调v4l2_subdev_core_ops以外,每一种都各自封装。此外框架也提供了一个宏v4l2_subdev_call巧妙地调用不同的操作。

struct v4l2_subdev_ops {
const struct v4l2_subdev_core_ops *core;
const struct v4l2_subdev_tuner_ops *tuner;
const struct v4l2_subdev_audio_ops *audio;
const struct v4l2_subdev_video_ops *video;
const struct v4l2_subdev_vbi_ops *vbi;
const struct v4l2_subdev_ir_ops *ir;
const struct v4l2_subdev_sensor_ops *sensor;
const struct v4l2_subdev_pad_ops *pad;
};
struct v4l2_subdev_core_ops {
int (*log_status)(struct v4l2_subdev *sd);
int (*s_config)(struct v4l2_subdev *sd, int irq, void
*platform_data);
int (*s_io_pin_config)(struct v4l2_subdev *sd, size_t n,
struct v4l2_subdev_io_pin_config *pincfg);
…
};
#define v4l2_subdev_call(sd, o, f, args...) \
(!(sd) ? -ENODEV : (((sd)->ops->o && (sd)->ops->o->f) ? \
(sd)->ops->o->f((sd) , ##args) : -ENOIOCTLCMD))
ret = v4l2_subdev_call(sd, core, s_config, 0, &pdata); 

实用工具

实用工具

v4l2-ctlv4l2的瑞士军刀。

v4l2兼容性:V4L2驱动程序兼容性测试。

v4l2-dbg:允许访问DBG_G_CHIP_INFODBG_G / S_REGISTER

qv4l2Qt测试应用程序。

核心调试:“echo 1> / sys / class / video4linux /videoX / debug'

- 1:显示ioctl名称

- 2:也显示参数


你可能感兴趣的:(Linux,Kernel,Open,Source,V4L2,Camera)