linux i2c v4l2驱动核心的知识 platform,Video4Linux框架簡介(7) - V4L2框架和v4l2_subdev

V4L2框架

譯注:這是目前看到關於V4L2框架內眾多結構關系最提綱挈領的一張圖。

linux i2c v4l2驱动核心的知识 platform,Video4Linux框架簡介(7) - V4L2框架和v4l2_subdev_第1张图片

子設備: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:也顯示參數

你可能感兴趣的:(linux,i2c,v4l2驱动核心的知识,platform)