本文对 V4L2 的运行时数据流设备管理做一个详细的介绍,包括什么叫「运行时设备管理」,它是干什么用的,怎么使用等等。本文的目标是掌握 media device 的编码使用方法以及功能运用。
一、media framework
- 简介:
相关的控制 API 在 Documentation/DocBook/media/v4l/media-controller.xml,本文档聚焦于内核测的media框架实现。注意:直接查看是看不出啥的,在内核的根目录下 make htmldocs 或者其它格式的都行,易于查看。
- 运行时设备控制:
也就是设备启动之后的数据流线路控制,就像一个工厂流水线一样,流水线上面的一个个节点(贴商标、喷丝印、打包)就形同于输入设备中的一个个子设备,运行时设备控制就是要达到能够控制节点的效果,比如贴商标的机器有好几台,应该选择哪一台进行此次流水线处理,要不要把喷丝印加上去,加哪一个机子等等。
- 作用:
提供实时的 pipeline 管理,pipeline 就理解为管道,想象一下水管,里面的水就是数据流,输入设备中的 csi->isp->video 就组成了一个 pipeline 线路。media framework 提供 pipeline 的开启、关停、效果控制、节点控制等功能。
- 如何使用:
内核当中主要利用四个结构体把众多的节点组织起来:
media_device,media_entity,media_link,media_pad。整个 media framework 都是围绕这四个结构体来进行使用的,下文会对这些进行详细介绍。
- 抽象设备模型:
media framework 其中一个目的是:在运行时状态下发现设备拓扑并对其进行配置。为了达到这个目的,media framework将硬件设备抽象为一个个的entity,它们之间通过links连接。
- entity:硬件设备模块抽象(类比电路板上面的各个元器件、芯片)
- pad:硬件设备端口抽象(类比元器件、芯片上面的管脚)
- link:硬件设备的连线抽象,link的两端是pad(类比元器件管脚之间的连线)
#------------# #------------#
| __|__ __|__ |
| | | | link | | | |
| | pad |<-------->| pad | |
| |__|__| |__|__| |
| | | |
| entity | | entity |
#------------# #------------#
可以想象一下,如果各个 entity 之间需要建立连接的话,就需要在 pad 中存储 link 以及 entity 信息,link 中需要存储 pad 与 entity 信息,entity 里面需要存储 link 与 pad 信息,属于你中有我,我中有你的情况。
二、media 设备:
一个 media 设备用一个 media_device 结构体来表示,通常情况下该结构体要嵌入到一个更大的设备自定义的结构体里面,并且大多数时候 media_device 与 v4l2_device 是处于并列的级别,还是以 omap3isp 的代码为例:
使用以下函数进行 meida 设备的注册:media_device_register(struct media_device *mdev);
函数的调用者需要在注册之前设置以下结构体成员(提前初始化该结构体是调用者的责任):
- dev:必须指向一个父设备,通常是平台设备的device成员。
- model:模型名字。
以下的成员是可选的:
- erial:序列号,必须是唯一的
- bus_info:总线信息,如果是PCI设备的话就可以设置成”PCI:”
- hw_revision:硬件版本。可以的话,应该用KERNEL_VERSION宏定义进行格式化
- driver_version:驱动版本。最终生成的设备节点的名称是media[0-9],节点号由内核自动生成。
使用以下函数进行设备卸载:
media_device_unregister(struct media_device *mdev);
需要注意的是,卸载一个并没有注册过的设备是不安全的。个人查看代码猜想不安全的原因主要有几个:1. 如果没有被注册,那么 media_device 内部的 entity 成员就有可能没有被初始化,如果其值为一个不确定的值,那么就会引起非法访问;2. 如果没有注册,内部的 devnode 成员就没有初始化,卸载时就会出现问题。
文章参考:https://yellowmax.blog.csdn.net/article/details/80889947
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。