V4L2 soc-camera 数据结构

转载于: http://blog.csdn.net/kickxxx/article/details/8444727
 

V4L2 soc-camera 数据结构

分类: 多媒体   344人阅读  评论(0)  收藏  举报

[cpp]  view plain copy
  1. static LIST_HEAD(hosts)  
所有的host都在hosts指向的链表上

[cpp]  view plain copy
  1. 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接口的方式。



[cpp]  view plain copy
  1. struct soc_camera_device {  
  2.     struct list_head list;  
  3.     struct device dev;  
  4.     struct device *pdev;        /* Platform device */  
  5.     s32 user_width;  
  6.     s32 user_height;  
  7.     enum v4l2_colorspace colorspace;  
  8.     unsigned char iface;        /* Host number */  
  9.     unsigned char devnum;       /* Device number per host */  
  10.     struct soc_camera_sense *sense; /* See comment in struct definition */  
  11.     struct soc_camera_ops *ops;  
  12.     struct video_device *vdev;  
  13.     const struct soc_camera_format_xlate *current_fmt;  
  14.     struct soc_camera_format_xlate *user_formats;  
  15.     int num_user_formats;  
  16.     enum v4l2_field field;      /* Preserve field over close() */  
  17.     void *host_priv;        /* Per-device host private data */  
  18.     /* soc_camera.c private count. Only accessed with .video_lock held */  
  19.     int use_count;  
  20.     struct mutex video_lock;    /* Protects device data */  
  21.     struct file *streamer;      /* stream owner */  
  22.     struct videobuf_queue vb_vidq;  
  23. };  

每一个soc_camera_device都会对应一个/dev/videoX设备节点,除非在soc_camera_probe时失败。

@list:soc_came_device通过这个成员连接到全局devices链表上

@pdev:每一个soc_camera_device,都会有一个platform device,pdev就是这个platform device结构的dev成员

@user_width, @user_height:这个camera的缺省width和height

@iface:camera bus id,也是host id,一个host可以对应多个soc_camera_device

@devnum:device number,每个soc_camera_device都会自动分配一个device number

@ops:操作集合,sensor,video AD(也许还有host)驱动要实现这个接口

@use_count:soc camera使用计数,每次打开这个设备加1,关闭则减1


soc_camera_host

[cpp]  view plain copy
  1. struct soc_camera_host {  
  2.     struct v4l2_device v4l2_dev;  
  3.     struct list_head list;  
  4.     unsigned char nr;               /* Host number */  
  5.     void *priv;  
  6.     const char *drv_name;  
  7.     struct soc_camera_host_ops *ops;  
  8. }  

@v4l2_dev:每个host都是一个v4l2_device

@list:soc_camera_host通过这个成员链接到全局hosts链表上

@nr:host number,每个host接口对应一个host

@priv:一般存放平台特定的camera参数,比如irq,DMA


[cpp]  view plain copy
  1. struct soc_camera_ops {  
  2.     int (*suspend)(struct soc_camera_device *, pm_message_t state);  
  3.     int (*resume)(struct soc_camera_device *);  
  4.     unsigned long (*query_bus_param)(struct soc_camera_device *);  
  5.     int (*set_bus_param)(struct soc_camera_device *, unsigned long);  
  6.     int (*enum_input)(struct soc_camera_device *, struct v4l2_input *);  
  7.     const struct v4l2_queryctrl *controls;  
  8.     int num_controls;  
  9. };    
这个是由sensor,video AD或者host实现的回调函数集。

@suspend,@resume:系统休眠唤醒时的回调函数,如果不考虑电源管理,可以不实现这两个函数

@query_bus_param:获取sensor和host之间的总线信息,比如HSYNC VSYNC极性,数据总线宽度,数据线极性等

@set_bus_param:设置sensor和host之间的总线参数。

@enum_input:枚举给定的input number,上层通过@v4l2_input->index指定要查看哪个input,一般可以不实现。

@controls:controls

@num_controls:@controls数目

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值