背景需求:通常在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处理后的视频节点。