• V4L2视频驱动框架---meida_device管理模块简述


    v4l2框架由4个主要的部分(数据结构)组成:
    v4l2_devices(包括v4l2_subdev) :v4l2_device管理所有的设备
    media_device : meida_device框架管理运行时的pipeline
    videobuf2:videobuf存储缓冲的数据
    controls :controls包含主要控制接口


    理解:
    media framework 的引入是为了 将各个 subdev 抽象为单独的模块,并将各个模块以管道的概念连接起来,从而组装成一个完整的数据流。 media framework 就是为了可以方便的抽象并连接自己想要的模块,组成自己想要的数据流。

    作用
    提供实时的 pipeline 管理,pipeline 就理解为管道,想象一下水管,里面的水就是数据流,输入设备中的 csi->isp->video 就组成一个 pipeline 线路。media framework 提供 pipeline 的开启、关停、效果控制、节点控制等功能。

    说明
    内核当中主要利用四个结构体把众多的节点组织起来: media_device ,media_entity, media_link ,media_pad 。整个 media framework 都围绕这四个结构体来进行使用的,下文会对这些进行详细介绍。

    1、media_entity:硬件设备模块抽象(类比电路板上面的各个元器件、芯片)

    2、media_pad :硬件设备端口抽象(类比元器件、芯片上面的管脚)

    3、media_link :硬件设备的连接抽象,link 的两端是 pad(类比元器件管脚之间的连线)

    media_entity、media_pad、media_link等结构体会添加到media_device的链表中,同时它们结构体的开始字段都需是struct media_gobj,该结构中的mdev将会指向它所属的media_device。这种设计方便结构之间的查找;

    media_entity中包含多个media_pad,同时media_pad又会指向它所属的media_entity;

    #------------#                #------------#
    |          __|__            __|__          |
    |         |  |  |   link   |  |  |         |
    |         | pad |<-------->| pad |         |
    |         |__|__|          |__|__|         |
    |            |                |            |
    |   entity   |                |   entity   |
    #------------#                #------------# 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    可以想象一下,如果各个 entity 之间需要建立连接的话,就需要在 pad 中存储 link 以及 entity 信息,link 中需要存储 pad 与 entity 信息,entity 里面需要存储 link 与 pad 信息,属于你中有我,我中有你的情况。

    4、media_device: 与v4l2_device类似,也是负责将各个子模块集中进行管理,同时在注 册的时候,会向系统注册设备节点,方便用户层进行操作

    media_device 主要有下面几个部件构成:

    media_entity :media_device基本构件块
    media_pad:pad是一个连接端点,通过它可以保证entity之间通信,pad分source pad和sink pad
    media_link:link在两个pad之间定向连接,数据由source pad 流向 sink pad
    
    					  
    |---------------------------------------------------------------|		
    |			         media_device(多媒体设备)                   |
    |																|
    |		#------------#                #------------#            |
    |		|          __|__            __|__          |            |
    |		|         |  |  |   link   |  |  |         |            |
    |		|         | pad |<-------->| pad |         |            |
    |		|         |__|__|          |__|__|         |            |
    |		|            |                |            |            |
    |		|   entity   |                |   entity   |            |
    |		#------------#                #------------#            |
    |		                                                        |
    |		                                                        |
    |---------------------------------------------------------------|
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  • 相关阅读:
    [Docker 教学] 常用的Docker 命令
    将 List 转换为 String
    不重启Docker能添加自签SSL证书镜像仓库吗?
    高德地图 JS API用于绘画船舶轨迹
    亮度问题还是动态问题确认
    飞天使-k8s基础组件分析-安全
    【无标题】
    最新Spring 6手写实现Sping IOC保姆级教程
    【JavaSE】网络编程
    vue3环境搭建
  • 原文地址:https://blog.csdn.net/LinuxArmbiggod/article/details/128090636