乐于分享
好东西不私藏

小白也能懂-camera系统架构(软件篇-linux V4L2框架)

小白也能懂-camera系统架构(软件篇-linux V4L2框架)
大家好,我是快乐学习,开心分享的科技探索员,今天继续和大家分享camera软件层面的系统架构,主要是基于linux系统层面来讲解camera的软件架构。
从2个方面来讲解,V4L2框架讲解(关键结构体的作用及相互关联),以及在V4L2框架下如何实现camera驱动。
一、V4L2框架讲解
v4l2是linux系统针对多媒体设备的一套框架,主要是针对用户空间提供统一的接口(通过字符节点控制:/dev/videoX),用于支持不同的硬件设备,硬件设备可以支持各种不同的外设。
1、V4L2框架
    (1)用户空间:字符设备节点/dev/videoX
        应用层通过系统接口read/mmap进行数据流传输。
        应用层通过系统接口open/write/ioctl/close进行控制及参数设置。
    2)内核空间V4L2核心层、驱动层两部分组成
        V4L2核心层提供给用户空间提供统一的设备节点【/dev/videoX】和标准化的操作接口【v4l2_file_operations】。
       V4L2核心层提供给多媒体驱动标准的注册流程和操作接口的实现【v4l2_subdev_ops】
        驱动层按照v4l2_subdev设备方式注册,实现硬件控制的接口。
    (3)硬件模块:提供对应的硬件功能。
    2、关键结构体

    (1)video_device

    • 抽象对象:代表一个可被用户空间访问的视频设备实例,是用户空间与内核空间中视频设备交互的桥梁。
    • 主要作用:为用户空间应用程序提供统一的接口,使用户可以通过标准的文件操作,对视频设备进行控制和数据交互。

    (2)v4l2_device

    • 抽象对象:对整个视频设备系统的高层抽象,代表一个完整的视频设备集合,可能包含多个不同功能的子组件。
    • 主要作用:管理和协调多个子设备的工作,提供公共的设备操作和状态管理。它就像一个 “大管家”,统筹整个视频设备系统的资源和任务。

    (3)v4l2_subdev

    • 抽象对象:用于抽象视频设备中的各个子组件,如图像传感器、ISP(图像信号处理器)、闪光灯等。每个子组件具有独立的功能和操作逻辑。
    • 主要作用:实现子组件的独立管理和操作,允许对每个子设备进行单独的配置和控制,提高系统的模块化和可维护性。
    3、用户空间ioctl的如何一步步调用到驱动中函数?
    (1)用户空间应用程序使用 ioctl 系统调用向 /dev/videoX 设备节点发送控制命令。
    (2)内核空间调用video_devicefops成员中的 unlocked_ioctl
    (3)在unlocked_ioctl函数中,根据ioctl命令码去查找并调用v4l2_ioctl_ops中相应的操作函数根据命令的具体要求遍历v4l2_device的subdevs链表,找到合适的v4l2_subdev子设备
    (4)调用v4l2_subdevv4l2_subdev_ops结构体里的相应操作函数,完成具体的控制操作
    二、基于v4l2实现camera驱动
    主要分两部分,video_device驱动、v4l2_subdev驱动
    (1)video_device驱动:实现用户空间的ioctl的支持的命令
    • 注册video_device设备
    • 实现video_device设备的v4l2_file_operations函数集
    • v4l2_ioctl_ops的函数集(分三类:v4l2通用函数、videobuf2框架函数、v4l2子设备需要实现的函数)
    (2)v4l2_subdev驱动【I2C设备,I2C设备相关内容没有加入】
    • 注册v4l2_device设备【v4l2_device_register
    • 注册v4l2_subdev子设备【v4l2_device_register_subdev】
    • 实现v4l2_device设备的v4l2_device_ops,主要subdev_notify(子设备通知回调处理)【当帧率变化、曝光过度等,能够及时通知到用户空间的应用程序】
    • 实现v4l2_subdev子设备的v4l2_subdev_ops函数(子设备初始化、参数控制、视频流控制)
    关于v4l2_subdev中实现ops函数集,与camera硬件设备息息相关,就不做详细的说明。【camera驱动均可套用v4l2框架来实现
    下一期预告,将和大家分享最新火爆的deepseek为什么如此强大,以及如何高效使用提示词。