V4L2学习笔记

#################  V4L2


1. V4L2的MAJOR = 81, MINOR = 0-255


MINOR = 0-63: 视频设备    (不一定)
MINOR = 64-127: Radio设备
MINOR = 192-223: Teletext设备
MINOR = 224-255: VBI设备

2.V4L2对应的设备节点


    /dev/videoX
    /dev/vbiX
    /dev/radioX

3.videoX,视频输入设备主要有:


    3.1 字符设备驱动程序核心:V4L2本身就是一个字符设备,具有字符设备所有的特性,暴露接口给用户空间。
    3.2 V4L2 驱动核心:主要是构建一个内核中标准视频设备驱动的框架,为视频操作提供统一的接口函数。
    3.3 平台V4L2设备驱动:在V4L2框架下,根据平台自身的特性实现与平台相关的V4L2驱动部分,包括注册video_device和v4l2_dev。
    3.4 具体的sensor驱动:主要上电、提供工作时钟、视频图像裁剪、流IO开启等,实现各种设备控制方法供上层调用并注册v4l2_subdev。

4.结构关系:


    /dev/videoX (81,X)
        \|/
    字符设备驱动程序核心(cdev)
      注册/|\          \|/调用
           V4L2驱动核心
      注册/|\          \|/调用
    平台V4L2驱动(video_device,v4l2_dev)
        \|/
    具体的sensor驱动(v4l2_subdev)
        \|/
              Camera

    video_device结构体主要用于控制Soc的video模块,
    v4l2_device包含多个v4l2_subdev,每个v4l2_subdev用来控制各自的子模块,有点驱动不需要v4l2_subdev,依靠video就可以完成功能。
    为了兼容更多硬件,Linux抽象了V4L2子系统。分为主设备和从设备,
    主设备为控制器,负责图像数据接收和传输,主设备可通过v4l2_subdev_call调用从设备提供的方法
    从设备为传感器,负责图像数据的采集(一般为i2c接口),从设备可以调用主设备的notify方法通知主设备


    
5. v4L2框架


    video_device
            \|/
    v4l2_device
            \|/
    v4l2_subdev[]
            \|/
    devicenode->v4l2_fh->v4l2_ctrl_handler->v4l2 ctrls
v4l2_devie: 整个输入设备的总结构体,V4L2框架的入口,有多少输入设备就有
    多少v4l2_device抽象,(一个USB摄像头整体看作一个v4l2_device)
    再细分就是v4l2_subdev例如:ISP\CSI\MIPi等设备,从属于一个V4L2device之下

v4l2_subdev: 子设备,包含了ops和ctrls,这部分代码与硬件相关,需要根据硬件实现,
    需要实现上下电、读取ID、饱和度、对比度和视频数据流打开关闭的接口函数

video_device:用于创建子设备节点,把操作设备接口暴露给用户空间

v4l2_fh: 是每个子设备的文件句柄,打开设备节点文件设置,方便上层索引到
    v4l2_ctrl_handler,v4l2_ctrl_hander管理设备的ctrls,这些ctrls包含
    调节饱和度,对比度,白平衡等

6.V4L2 core介绍
v4l2的驱动代码位于drivers\media\v4l2-core文件夹下,根据字面意思来理解其基本功能
    6.1  videobuf是实现视频的内存分配,对于v4l和v4l2对应不同的文件,videobuf-core和videobuf2-core
    6.2  其它结构体对应的文件
    v4l2-dev        对应    video_device
    v4l2-device    对应    v4l2_device
    v4l2-subdev    对应    v4l2_subdev
    v4l2-ioctl        对应    ioctl
目录表:
    v4l2驱动代码位于drivers/media/v4l2-core
├── tuner-core.c
├── v4l2-async.c
├── v4l2-clk.c
├── v4l2-common.c
├── v4l2-compat-ioctl32.c
├── v4l2-ctrls.c
├── v4l2-dev.c
├── v4l2-device.c
├── v4l2-dv-timings.c
├── v4l2-event.c
├── v4l2-fh.c
├── v4l2-flash-led-class.c
├── v4l2-fwnode.c
├── v4l2-i2c.c
├── v4l2-ioctl.c
├── v4l2-mc.c
├── v4l2-mem2mem.c
├── v4l2-spi.c
├── v4l2-subdev.c
├── v4l2-trace.c
├── videobuf-core.c
├── videobuf-dma-contig.c
├── videobuf-dma-sg.c
└── videobuf-vmalloc.c

    video驱动代码位于driver/media下
drivers/media/platform$ tree -L 1
.
├── am437x
├── aspeed-video.c
......
├── omap
├── omap3isp
├── pxa_camera.c
├── qcom
......
├── rockchip
......
├── seco-cec
├── sh_veu.c
├── sh_vou.c
├── sti
├── stm32
├── sunxi
......
└── xilinx
其中platform目录存放不同Soc驱动代码,对应video_device,其他大多子目录
如i2c、mmc、usb、tuners、radio对应subdev的实现

框架中最重要的是理解ioctl,v4l2驱动框架最主要的实现各个ioctl的功能

    模块        |    描述
    核心模块        |    由v4l2-dev.c实现,主要作用包括申请字符主设备号、注册class和提供video device注册注册等相关函数。
    V4L2框架        |    由v4l2-device.c、v4l2-subdev.c、v4l2-fh.c、v4l2-ctrls.c、v4l2-async.c、v4l2-fwnode.c、v4l2-i2c.c、v4l2-spi.c等文件实现,构建v4l2框架。
    videobuf管理    |     由videobuf2-core.c、videobuf2-dma-contig.c、videobuf-dma-sg.c、videobuf2-memops.c、videobuf2-vmalloc.c、v4l2-mem2mem.c等文件实现,完成videobuffer的分配、管理和注销。
    ioctl框架        |    由v4l2-ioctl.c、v4l2-compat-ioctl32.c 文件实现,构建v4l2_ioctl框架。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值