linux的V4L2子系统分析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1、drivers/media/video/v4l2-dev.c

1.1、

static DECLARE_BITMAP(devnode_nums[VFL_TYPE_MAX], VIDEO_NUM_DEVICES);

分析:静态全局变量定义,宏定义展开后的形式为:

static unsigned long devnode_nums[4][BITS_TO_LONG(256)];

实际上相当于定义了一个全局的二维数组,这个二维数组的第一维对应V4L2规范支持的4种设备(分别为VFL_TYPE_GRABBER、VFL_TYPE_VBI、VFL_TYPE_RADIO、

VFL_TYPE_SUBDEV),第二维中8个long型元素总共256个bit,每个bit用来作为位图的一个位使用。这种以数组形式出现,以位为单位来使用的方式,在内核很多地方都有,譬如input子系统中的struct input_dev中。

1.2、static struct video_device *video_device[VIDEO_NUM_DEVICES];

在v4l2-dev.c中定义了全局变量 video_device,这是一个指针数组,共包含256个指针,该数组用来记录系统中注册的所有video_device结构体的首地址,是video子系统用来管理所有注册设备的总索引。struct video_device 中的minor成员用来记录本vodeo_device实例(每个在系统中注册的video设备都是video_device的一个实例)在数组vodeo_device中的索引值。

1.3、

struct video_device

{

#if defined(CONFIG_MEDIA_CONTROLLER)

struct media_entity entity;

#endif

/* device ops */

const struct v4l2_file_operations *fops;

/* sysfs */

struct device dev; /* v4l device */

struct cdev *cdev; /* character device */

/* Set either parent or v4l2_dev if your driver uses v4l2_device */ struct device *parent; /* device parent */

struct v4l2_device *v4l2_dev; /* v4l2_device parent */

/* Control handler associated with this device node. May be NULL. */ struct v4l2_ctrl_handler *ctrl_handler;

/* Priority state. If NULL, then v4l2_dev->prio will be used. */

struct v4l2_prio_state *prio;

/* device info */

char name[32];

// 4种V4L2设备的类型码,视频抓取类设备为0

int vfl_type;

/* 'minor' is set to -1 if the registration failed */

// 次设备号,同时又是全局变量video_deivce数组中对应下标索引

int minor;

// 设备名编号后缀,如/dev/video0, /dev/video3中0和3就记录在这里u16 num;

/* use bitops to set/clear/test flags */

unsigned long flags;

/* attribute to differentiate multiple indices on one physical device */

int index;

/* V4L2 file handles */

spinlock_t fh_lock; /* Lock for all v4l2_fhs */

struct list_head fh_list; /* List of struct v4l2_fh */

int debug; /* Activates debug level*/

/* Video standard vars */

v4l2_std_id tvnorms; /* Supported tv norms */

v4l2_std_id current_norm; /* Current tvnorm */

/* callbacks */

void (*release)(struct video_device *vdev);

/* ioctl callbacks */

const struct v4l2_ioctl_ops *ioctl_ops;

/* serialization lock */

struct mutex *lock;

};

相关文档
最新文档