v4l2框架分析

来源:互联网 发布:linux 安装 net snmp 编辑:程序博客网 时间:2024/05/17 00:58
1.如何写驱动程序:
  1.构造file_operations结构体
实现其中的open,read,write成员。
  2.告诉内核:register_chrdev(主设备号,&file_operations,name);
  3.入口函数,出口函数。


2.对于复杂的字符设备驱动程序,使用分层概念。
如对于LCD设备驱动程序分为两层:fbmem.c和硬件相关层两层。
fbmem.c中:完成分配,设置,注册file_operations结构体。
硬件相关层中:分配、设置、注册fb_info结构体,以及一些硬件相关的操作。
当应用程序调用open等函数时,会调用fbmem.c中的file_operations中的open成员,里面又调用硬件相关中的fb_info结构体中用于操作硬件的函数。


3.怎么写分层驱动:分配某结构体,设置,注册,硬件相关操作。


4.V4L2框架也是基于这种分层模型:有核心层和硬件相关层。
dmesg查看内核打印信息。
在硬件相关层uvc_driver.c中的video_register_device函数,分配设置注册了一个video_device结构体。
反推得知核心层为v4l2_dev.c:
cdev_alloc();
cdev->ops=v4l2_fops;//file_operations结构体,供应用层调用。
cdev_add();


5.虚拟视频驱动分析:vivi.c
1.分配video_device
2.设置
3.注册:video_device


vivi_init
vivi_create_instance
v4l2_device_register//不重要,只是初始化工作
video_device_alloc
video_register_device(video_device,type:VFL_TYPE_GRABBER,nr);
vdev_cdev=cdev_alloc();
vdev_cdev->fops=&v4l2_fops;
cdev_add();


总体来说:当应用程序调用open,read等函数时,会调用驱动程序中的cdev_add函数所注册的vdev_cdev结构体,这里属于上一层,继续调用这个结构体中的file_operations结构体v4l2_fops,它来自下一层,这就实现了分层结构,下一层主要实现的仍然是硬件相关的操作。
至于应用程序调用ioctl函数时,驱动中的下一层会将用户空间中的参数进行拷贝并且对这些参数进行处理:设置属性,设置、获得优先级。


6.怎么写v4l2驱动:
1.分配、设置、注册v4l2_device(辅助作用)
2.分配video_device vfd;
3.设置vfd中的fops结构体//到这里的代码仍是驱动的上一层,fops成员开始调用下一层的file_operations结构体提取硬件操作函数。
0 0