V4L2 soc-camera 数据结构

static LIST_HEAD(hosts)

所有的host都在hosts指向的链表上

static LIST_HEAD(devices);

所有soc camera device都挂在devices指向的链表上。 

系统内可能有多个soc_camera_host,每个soc_camera_host可以对应1 ~ n个soc_camera_device。每个soc_camera_device通过soc_camera_video_start函数创建设备节点/dev/videoX

soc_camera_host对应着系统camera处理模块,尽管理论上可以有多个camera host,但是大部分系统仅有一个camera host

在soc_camera_host_register中调用v4l2_device_register为这个soc_camera_host注册一个v4l2_device设备。

在soc_camera_probe中调用soc_camera_init_i2c,为soc_camera_device注册一个v4l2_subdev,我们从soc_camera_probe代码可以看出,只有i2C的设备可以使用这种方式,对于非I2C设备来说,需要soc_camera_link提供add_device来增加子设备。

 

soc_camera_host, soc_camera_device,v4l2_device,v4l2_subdev关系如下:

  • 理论上系统内可以有多个soc_camera_host,物理上soc_camera_host就是系统的camera处理模块驱动
  • 一个soc_camera_host可以对应多个soc_camera_device,物理上soc_camera_device是一个camera接口,每个soc_camera_host对应一个v4l2_dev
  • 每个soc_camera_device,系统会为他们创建设备节点/dev/videoX。
  • 每个soc_camera_device有多个v4l2_subdev,物理上v4l2_subdev可以是sensor,video AD芯片
  • v4l2_subdev可以通过i2c挂接到v4l2_device,也可以通过soc_camera_link提供的add_device来增加,这依赖于sensor和video AD芯片挂接到MCU camera接口的方式。

struct soc_camera_device {
    struct list_head list;
    struct device dev;
    struct device *pdev;        /* Platform device */
    s32 user_width;
    s32 user_height;
    enum v4l2_colorspace colorspace;
    unsigned char iface;        /* Host number */
    unsigned char devnum;      /* Device number per host */
    struct soc_camera_sense *sense; /* See comment in struct definition */
    struct soc_camera_ops *ops;
    struct video_device *vdev;
    const struct soc_camera_format_xlate *current_fmt;
    struct soc_camera_format_xlate *user_formats;
    int num_user_formats;
    enum v4l2_field field;      /* Preserve field over close() */
    void *host_priv;        /* Per-device host private data */
    /* soc_camera.c private count. Only accessed with .video_lock held */
    int use_count;
    st