首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Camera|6.v4l2拓扑架构(基于rk3568)

一、 设备节点、模块、拓扑结构关系

拓扑结构是我们了解MIPI-CSI内部模块以及与摄像头连接关系的最直观最便捷的方法。

1. 如何表示拓扑结构?

file视角

v4l2视角

来自:参考文档《RKISP_Driver_User_Manual_v1.3.pdf》

模块之间相互独立,通过struct media_entity来进行抽象,通常会将struct media_entity嵌入到其他结构中,以支持media framework功能;

entity模块包含struct media_pad,pad可以认为是端口,与其他模块进行联系的媒介,针对特定模块来说它是确定的;

pad通过struct media_link来建立连接,指定source和sink,即可将通路建立起来;

各个模块之间最终建立一条数据流,便是一条pipeline了,同一条pipeline中的模块,可以根据前一个模块查找到下一个模块,因此也可以很方便进行遍历,并做进一步的设置操作;

2. 设备节点-------少media的

在/sys/class/video4linux/下可以找到v4l2相关的设备节点:

udev文件系统会为我们在dev/目录下创建一个video0节点,即dev/video0

用户可以打开dev/video0节点,通过IOCTL命令和内核空间进行通信。

3. 拓扑结构图

命令media-ctl可以查看拓扑结构图

下面是根据显示内容绘制的拓扑图:

拓扑结构

该图中各个entity对应的设备节点名称已经标注。模块的上方的黄色pad默认是source pad,下方的黄色pad是sink pad

字符设备类型主要有两种(只考虑摄像头):

/dev/videox  (x取值0~8) (所有设备共用主设备号81,次设备号区分)

/dev/v4l-subdevx   (x取值0~3)

video设备主要用于图像操作,必须创建结构体struct video_device变量,v4l-subdev设备主要对应sensor等具体从设备,必须创建struct  v4l2_subdev变量,内部的isp和csi、csi-dphy也都需要注册为subdev

这些entity由media_entity模块负责维护,将他们连接起来。

4. 模块功能

这些entity瑞芯微已经设定了他们各自的功能:

这些entity我们可以理解为一个个功能模块。

这些功能模块有的用于驱动csi、有的驱动isp、有的用于预览图像、有的用于统计视频信息、有的用于配置参数。

这些功能模块,并不是都一定每个camera控制器都有的,有一些是通用的,比如,mainpath、selfpath,有一些要完全看SoC设计,即使瑞芯微的SoC,不同型号,差别也不小。所以具体问题要具体分析,不可教条。

v4l2只定义了基本架构,定义好了回调函数接口,要实现模块具体功能只需要填充好对应的回调函数即可,应用层通过这些字符设备文件和对应的ioctrl命令,就可以实现相应的功能。

二、 如何描述拓扑?

1. struct rkisp_device

rk3568的camera控制器使用结构体struct rkisp_device管理所有的资源。

其中与isp2.1拓扑结构相关的的几个结构体成员以及他们之间的关系:

2. 举例1:rkisp-csi-subdev注册到拓扑结构中

要添加到拓扑结构中,表示该模块的结构体中包含成员struct media_pad ,它和struct v4l2_subdev中的 struct media_entity entity;共同生成拓扑结构。

rkisp-csi-subdev设备结构体定义如下:

参考第二节的拓扑图中 entity6 :

由上图可知,该模块有6个pad,pad属性定义如下

pad的名称定义如下:

isp的in pad

根据该拓扑图,pads[0]sinkpads[1~5] 均为source

以下是驱动中pad初始化代码:

一些关键的宏汇总:

由代码可得,拓扑关系由csi_dev->pads描述。

最终调用函数media_entity_pads_init()注册。

大家也可以试着去分析其他的模块。

三、设备树如何描述摄像头拓扑结构?

1. 设备树说明文档

瑞芯微MIPI-CSI设备树节点属性说明参考内核说明文档:

这些文档中有关于port、remote-endpoint等节点的详细说明,如果不是厂家,我们只需要搞懂摄像头拓扑结构即可。

2. ov13850

我们移植的摄像头为ov13850,他的连接关系如下:

数据通道通过mipi接口连接到rk3568的mipi通道0

Camera控制器的csi2-dphy0模块负责从mipi通道中接收数据帧

外设摄像头拓扑关系由设备树来描述,内核会自动解析并帮我们自动注册。

千言万语,不如一图:

由上图可得:

摄像头ov13850设备树只有一个port子节点,所以pad为0,out表示该pad是source pad

remote-endpoint属性表示该pad连接的上游模块的pad名字:mipi_in_ucam0,而模块csi2_dphy0中包含pad:mipi_in_ucam0,所以ov13850连接到该模块

csi2_dphy0 port0节点的mipi_in_ucam0设备,通过remote-endpoint即可知道该pad所连接的是设备ov13850的pad

综上可得csi2_dphy0的pad0(sink pad)连接的ov13850的pad0(source pad)

文中各种mipi技术文档,后台回复关键字:mipi

后面还会继续更新几篇Camera文章,

建议大家订阅本专题!

也可以后台留言,加一口君好友yikoupeng,

拉你进高质量技术交流群。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230313A0327000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券