linux的V4L2子系统分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;
};