RK3576——MIPI CSI之v4l2-ctl、media-ctl命令分析

背景需求:通常在Linux系统下开发camera进行调试时v4l2-ctl、media-ctl是非常有用的调试工具。通常使用media-ctl配置拓扑结构,再用v4l2-ctl配置具体设备节点。

1.v4l2-ctl简介

v4l2-ctl是Video for Linux Two(V4L2)接口的命令行工具,主要用于管理和控制Linux系统中的视频设备。

功能特点:

(1)查询设备信息:列出设备支持的格式、分辨率、帧率等。
(2)设置视频格式:调整分辨率、像素格式(如 `YUYV`、`MJPG`、`H264`)。
(3)控制摄像头参数:调整曝光、白平衡、增益、对焦等。
(4)捕获图像/视频:保存单帧图像或视频流。
(5)流控制:启动/停止视频流,设置帧率。

命令使用:下述以RK3576为例进行演示

(1)查看设备信息:

v4l2-ctl -d /dev/video0 --info

v4l2-ctl -d /dev/video55 --list-formats 列出设备支持的图像格式。

v4l2-ctl -d /dev/video55 --list-formats-ext列出支持的格式和分辨率。

(2)设置参数: 将 /dev/video55 设备的图像格式设置为YUYV,分辨率为640x480。

v4l2-ctl -d /dev/video55 --set-fmt-video=width=640,height=480,pixelformat=NV12

查看配置是否成功:v4l2-ctl -d /dev/video55 --get-fmt-video

(3) 捕捉视频帧:设备捕获10帧视频数据,并保存为test_frame.yuv文件。

v4l2-ctl -d /dev/video55 --stream-mmap --stream-count=10 --stream-to=test_frame.yuv

更详细参数命令:

v4l2-ctl -d  /dev/video55 --set-fmt-video=width=1920,height=1080,pixelformat='NV12' --stream-mmap=4 --stream-skip=3 --stream-to=/userdata/1080p60_nv12.rgb --stream-count=1 --stream-poll

参数说明:

-d /dev/video55 指定video设备

–set-fmt-video 指定宽高及pxielformat

pixelformat=NV12 格式 FourCC编码

–stream-mmap 指定 buffer 的类型为 mmap

–stream-skip 指定丢弃(不保存到文件) 前 3 帧

–stream-to 指定帧数据保存的文件路径

–stream-count 指定抓取的帧数

–stream-poll 该选项指示 v4l2-ctl 采用异步 IO

(4)列出所有 V4L2 设备:v4l2-ctl --list-devices

2.media-ctl简介

media-ctl是 Linux 系统中用于配置和管理 V4L2(Video for Linux 2)子设备的命令行工具,它主要用于配置媒体控制器(Media Controller)框架下的复杂视频设备(如摄像头、图像传感器、CSI/DSI接口、图像处理单元等)的拓扑结构和数据流路径。

2.1.media拓扑结构了解

需要了解拓扑知道每个字段的含义,才能看懂拓扑结构,修改其配置,以RK3576为例

entity:代表实体,以entity 63为例表示一个sensor的实体,实体名称:m01_b_ov13850 6-0036。

        pads:表示该实体输入(Sink)或输出(Source),entity 63实体为例,该实体作为输出。

        link:表示一条链接,entity 63实体为例,-> "rockchip-csi2-dphy0":0 [ENABLED],表示链接到了rockchip-csi2-dphy0实体。

2.2.功能特点

(1)查看和配置媒体设备拓扑结构:管理视频硬件链路中的实体(entities)和链接(links)。

(2)设置格式(Format):配置子设备的输入/输出(pad)格式(如分辨率、像素格式等)。

(3)设置路由(Routing):控制数据流在实体间的路径。

(4)调试和可视化:生成设备拓扑图,便于理解硬件链路。

命令使用:

(1)列出设备:media-ctl -p  -d /dev/media0输出所有媒体设备及其实体(entities)、链接(links)和pad属性

(2)生成拓扑图:生成 media0.png文件,可视化设备链路。

 media-ctl -d /dev/media0 --print-dot > media0.dot

利用graphviz工具转换成图片方便查看

sudo apt install graphviz

dot -Tpng media0.dot -o media0.png

图形拓扑结构查看:绿色表示链路已使能

media0:

media5:

media10:

从这里就可以看出上面就是sensor到isp的一个完整路线

(3)设置格式(Format):media-ctl -V "<entity>:<pad> [fmt:<format>/<width>x<height>]

        示例:设置 CSI-2 接收器的输入格式为: SBGGR10_1X10,分辨率 :1920x1080。

        注意:只有支持缩放的节点才支持修改分辨率

        media-ctl -d /dev/media5 --set-v4l2 '"rkisp-isp-subdev":0[fmt:SBGGR10_1X10/1920x1080]'

        media-ctl -d /dev/media5 --set-v4l2 '"rkisp-isp-subdev":0[crop:(0,0)/1920x1080]'

(4)配置链路

     关闭摄像头:

        media-ctl -l '"m01_b_ov13850 6-0036":0->"rockchip-csi2-dphy0":0[0]'

        开启摄像头:

        media-ctl -l '"m01_b_ov13850 6-0036":0->"rockchip-csi2-dphy0":0[1]'

(5)设置路由(Routing)

        media-ctl -r "<source_entity>:<source_pad> -> <sink_entity>:<sink_pad> [enable]"

        示例:将摄像头传感器输出连接到dphy接收器输入

         media-ctl -r "'m01_b_ov13850 6-0036':0 [1] -> 'rockchip-csi2-dphy0':0 [1]"

        配置完后需要重新使能,否则不生效

        media-ctl -l '"m01_b_ov13850 6-0036":0->"rockchip-csi2-dphy0":0[1]'

(5)配置摄像头传感器

        设置传感器输出格式为 SRGGB10 (RAW10), 分辨率 2592x1944

        media-ctl -V "'m01_b_ov13850 6-0036':0 [fmt:SBGGR10_1X10/1920x1080]"

这里配置完后不生效,猜测是驱动不支持,有知道原因的可以留言。

(6)验证配置

        media-ctl --get-v4l2 "<entity>:<pad>"

        检查实体 `m01_b_ov13850 6-0036` 的 pad 0 的格式

        media-ctl --get-v4l2 "'m01_b_ov13850 6-0036':0"

拓展知识:如何确认视频设备节点/dev/video55对应的是ov13850摄像头?

分析设备树:

sensor:

phy:

mipi_csi2:

rkcif:

isp:

到这里最终确认OV13850对应的ISP的虚拟vir0节点。

与其对应的media5设备节点,其下的MP节点即/dev/video55是经过ISP处理后的视频节点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值