V4L2框架
V4L2有三层,应用层(SCI),核心层(V4L2_dev.c),硬件相关层(uvc_driver.c)
一、应用层(SCI)
通过调用open,read,write,ioctl函数访问到底层设备驱动
二、核心层(V4L2_dev.c)
这层是通过字符设备驱动实现一套标准V4L2_fops.这个结构体中的所有成员将对应调用到硬件相关层video_device->fops(程序员实现的)中的成员函数。
三、硬件相关层(uvc_driver.c)
提供给程序员一套调用接口函数,如 V4L2_device_register video_device_alloc video_register_device
怎么写V4L2驱动
1、分配/设置/注册 V4L2_device (注册函数V4L2_device_register 作用:辅助作用,用于初始化自旋锁,引用计数)
2、分配video_device (用video_device_alloc函数)
3、设置:
a 、vfd->v4l2_dev=v4l2_device(第一步分配的v4l2_device)
b、设置vfd->fops(被上层的V4L2_fops调用),设置vfd->ioctl_ops(ioctl调用)
c、APP可能通过IOCTL来设置/获得亮度等信息,驱动程序里,谁来接收/存储/设置到硬件?
属性:v4l2_ctrl 提供信息
管理:v4l2_ctrl_handler 步骤如下
v4l2_ctrl_handler_init 初始化
v4l2_ctrl_new_std v4l2_ctrl_new_custom 创建一个v4l2_ctrl 并放入v4l2_ctrl_handler链表
v4l2_dev->ctrl_handler=handler 这样就跟video_device关联起来了
4、注册video_device 用函数video_register_device