V4L2框架
譯注:這是目前看到關於V4L2框架內眾多結構關系最提綱挈領的一張圖。
子設備:v4l2_subdev struct
●通常芯片連接到i2c或SPI總線,或通過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-ctl:v4l2的瑞士軍刀。
●v4l2兼容性:V4L2驅動程序兼容性測試。
●v4l2-dbg:允許訪問DBG_G_CHIP_INFO,DBG_G / S_REGISTER。
●qv4l2:Qt測試應用程序。
●核心調試:“echo 1> / sys / class / video4linux /videoX / debug'。
- 1:顯示ioctl名稱
- 2:也顯示參數