感觉写完了其实也没怎么理解这个函数,但是还是这里保存一下,希望大家予以拍砖指导:
下面分析一下video_register_device这个函数:位于include/media/v4l2-dev.h头文件中:
参考文献:http://blog.sina.com.cn/s/blog_602f87700101a52s.html
static inline int__must_check video_register_device(struct video_device *vdev,
int type, int nr)
{
return __video_register_device(vdev, type, nr, 1,vdev->fops->owner);
}
video_register_device函数:
其中:第一个参数struct video_device *vdev是想注册的video device的结构体;
第二个参数是视频设备类型,在此头文件(v4l2-dev.h中),定义了几种视频设备类型:
#defineVFL_TYPE_GRABBER 0 //图像采集设备
#defineVFL_TYPE_VBI 1 //从视频消隐的时间段获得信息的设备
#defineVFL_TYPE_RADIO 2 //无线电设备
#defineVFL_TYPE_SUBDEV 3 //视频设备(不确定)
#defineVFL_TYPE_MAX 4 //最大值
第三个参数是注册的设备节点号;
video_register_device函数主要是注册一个V4L2device,指定类型,然后指定device node number。函数只是简单的调用了__video_register_device函数。
按照参考文档的说明:这个__video_register_device函数主要做的工作有:1、初始化一些值;2、创建字符模式驱动;3、注册字符设备等。
下面我来分析这个函数,这个函数的定义在v4l2-dev.c中,声明在v4l2-dev.h中:
int__video_register_device(struct video_device *vdev, int type, int nr,
int warn_if_nr_in_use, struct module *owner)
前三个参数与video_register_device中相同,第四个参数不知道,第五个参数表面指向当前的模块;
int i =0;
intret;
intminor_offset = 0;
intminor_cnt = VIDEO_NUM_DEVICES;
constchar *name_base;
声明了一些变量;其中minor_cnt的赋值VIDEO_NUM_DEVICES仍定义在v4l2-dev.c中:
#defineVIDEO_NUM_DEVICES 256
声明最大的设备数量为256个?
/* A minor value of -1marks this video device as never
having beenregistered */
vdev->minor = -1;
-1表明这个video device从未被注册过(其实是指之前注册失败)。
/* the release callbackMUST be present */
if (WARN_ON(!vdev->release))
return -EINVAL;
声明release回调函数。
/* v4l2_fh support */
spin_lock_init(&vdev->fh_lock);
INIT_LIST_HEAD(&vdev->fh_list);
调用自旋锁和初始化链表。
下面开始进入各个部分的工作:
第一部分:
/* Part 1: check devicetype */
switch (type) {<