本帖最后由 技术大佬 于 2026-8-6 14:24 编辑
米尔电子技术实战: 五路摄像头同时拉流,MIPI CRC错误刷屏?DPHY锁不住时钟?VBLANK和ISP打架?通通不存在
本文基于 MYD-LR3576开发板测试,完整记录使用米尔电子的5路1080P摄像头从驱动修复到五路同时预览、H.265硬件编码的全流程。四个驱动级Bug,逐一拆解,附完整验证命令和实测截图。 五路摄像头模组与测试板硬件接线图 五路摄像头模组实测效果 软硬件环境
| 项目 | 配置 | | | | | | | | drivers/media/i2c/ov5640.c |
五路 MIPI 通道映射
RK3576拥有独立的5路MIPI CSI-2接口,每路对应独立的DPHY和CSI2 Host。五颗摄像头分别挂载如下: | 摄像头 | I2C 总线 | DPHY | CSI2 Host | CIF 节点 | ISP 节点 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
驱动修改总结
commit: FIX: OV5640 -correct link_freq to 336MHz, fix VBLANK race condition 在五路高密度MIPI场景下暴露了四个问题。需要对通用摄像头驱动进行调整,以下按排查顺序逐一拆解。 1MIPI 链路频率修正 问题 V4L2_CID_LINK_FREQ默认值=19(对应192MHz),DPHY按384Mbps/lane配置时序参数。但OV5640 PLL实际输出672Mbps/lane。频率不匹配,DPHY冷启动时时钟锁定失败,产生MIPI CRC/ECC错误。 修复 将默认链路频率索引从19改为15(对应336MHz → 672Mbps/lane),同步修正pixel_rate使其匹配PLL实际输出。 //ov5640.c:183 - 修正默认链路频率 -#defineOV5640_DEFAULT_LINK_FREQ 19 // 192MHz → 384Mbps +#defineOV5640_DEFAULT_LINK_FREQ 15 // 336MHz → 672Mbps
//ov5640.c:992 - 1080P模式 pixel_rate 匹配PLL -.pixel_rate= OV5640_PIXEL_RATE_148M, // 148M×8/4 =296MHz(不匹配PLL) +.pixel_rate= OV5640_PIXEL_RATE_168M, // 168M×8/4 =336MHz(匹配PLL: 84M×8/2) 验证方法:冷启动后拉流,dmesg应显示data_rate_mbps672,而不是384。 2VBLANK 竞态条件修复 问题 ov5640_update_pixel_rate()中调用__v4l2_ctrl_modify_range+ __v4l2_ctrl_s_ctrl修改VBLANK控制值,与ISP(rkaiq)的s_ctrl(VBLANK)路径产生锁竞争。ISP在每帧都可能调VBLANK,handlerlock短暂阻塞sensor寄存器写入,MIPI链路失步导致持续CRC错误。 修复 从ov5640_update_pixel_rate()中彻底移除VBLANK相关操作(参考gc05a2.c的做法)。VBLANK仅通过ov5640_s_ctrl()回调路径修改,与ISP的控制变更走同一入口,避免锁竞争。 // 删除ov5640_update_pixel_rate() 中以下代码段: -vblank= ((fie_num * pixel_rate / fie_denom) / timings->htot) - mode->height; -__v4l2_ctrl_modify_range(sensor->ctrls.vblank,...); -__v4l2_ctrl_s_ctrl(sensor->ctrls.vblank,vblank); 3MIPI 时钟模式声明 问题 OV5640使用非连续MIPI时钟模式(寄存器0x4800 bit[5]=1,帧间隙时钟gated到LP11),但驱动未向DPHY声明此特性。DPHY按连续时钟模式等待,帧间隙超时触发错误。 修复 在g_mbus_config中显式声明V4L2_MBUS_CSI2_NONCONTINUOUS_CLOCK标志,让DPHY正确处理帧间隙。 //ov5640.c:2872 - g_mbus_config config->bus.mipi_csi2.num_data_lanes= OV5640_LANES; +config->bus.mipi_csi2.flags= V4L2_MBUS_CSI2_NONCONTINUOUS_CLOCK; 4current_link_freq 初始化修正 问题 current_link_freq存储的是频率值(Hz),初始化时误赋为menu index(15),导致后续计算全部基于15Hz而非336MHz。 修复 初始化时查表取实际频率值,而非存储索引。 -sensor->current_link_freq= OV5640_DEFAULT_LINK_FREQ; +sensor->current_link_freq= ov5640_csi2_link_freqs[OV5640_DEFAULT_LINK_FREQ]; PLL 时钟配置
1080P30 RAW8 2-lane模式下,OV5640 PLL寄存器配置: 时钟推导链路: sysclk = 24MHz / 3 × 84 / 1 = 672 MHz mipi_ddr_clk = 672 / (1 × 2) = 336 MHz per_lane_rate= 336 × 2 (DDR) = 672 Mbps pixel_clk = 672 / (2×2×1×2) = 84 MHz VTS = 84M / (2500 × 30) = 1120 vblank = 1120 - 1080 = 40 一句话总结:24MHz晶振经过PLL倍频到672MHz系统时钟,MIPIDDR分频后每lane跑672Mbps。DPHY必须按这个速率配置,否则冷启动锁不住。 预览验证流程
单路 RAW 抓流验证 先停掉rkaiq 3Aserver,用CIF节点直接抓RAW数据,验证MIPI链路本身是否干净: # 停止 rkaiq3A server /etc/init.d/S40rkaiq_3Astop sleep1 逐路执行RAW抓流,每路100帧: #Camera1 (CIF节点 /dev/video0) v4l2-ctl-d /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat=BGGR \ --stream-mmap=3 --stream-count=100--stream-skip=10 --stream-to=/root/test_cam0.raw
#Camera2 (CIF节点 /dev/video11) v4l2-ctl-d /dev/video11 --set-fmt-video=width=1920,height=1080,pixelformat=BGGR \ --stream-mmap=3 --stream-count=100--stream-skip=10 --stream-to=/root/test_cam1.raw
#Camera3 (CIF节点 /dev/video22) v4l2-ctl-d /dev/video22 --set-fmt-video=width=1920,height=1080,pixelformat=BGGR \ --stream-mmap=3 --stream-count=100--stream-skip=10 --stream-to=/root/test_cam2.raw
#Camera4 (CIF节点 /dev/video33) v4l2-ctl-d /dev/video33 --set-fmt-video=width=1920,height=1080,pixelformat=BGGR \ --stream-mmap=3 --stream-count=100--stream-skip=10 --stream-to=/root/test_cam3.raw
#Camera5 (CIF节点 /dev/video44) v4l2-ctl-d /dev/video44 --set-fmt-video=width=1920,height=1080,pixelformat=BGGR \ --stream-mmap=3 --stream-count=100--stream-skip=10 --stream-to=/root/test_cam4.raw 实测结果:五路均稳定30fps,无MIPI错误: cam0: /dev/video0 — 稳定 30.00 fps cam1: /dev/video11 — 稳定 30.00 fps cam2: /dev/video22 — 稳定 29.97~29.99 fps cam3: /dev/video33 — 稳定 29.97~29.99 fps cam4: /dev/video44 — 稳定 29.97~29.99 fps · dmesg中每个DPHY应显示data_rate_mbps 672 · 不应出现 MIPI_CSI2 ERR1 / MIPI_CSI2 ERR2 错误 · 帧率应稳定在 30fps(实测29.97~30.00,正常) 单路 ISP 预览(GStreamer) RAW链路确认干净后,启动rkaiq3A server,走ISP路径验证图像质量: # 如果前面停止了rkaiq 3A server,这里需要重新启动 /etc/init.d/S40rkaiq_3Astart
# ISP 路径预览(逐路验证) #Camera1: gst-launch-1.0v4l2src device=/dev/video55 !'video/x-raw,width=1920,height=1080,framerate=30/1' ! waylandsink
#Camera2: gst-launch-1.0v4l2src device=/dev/video64 !'video/x-raw,width=1920,height=1080,framerate=30/1' ! waylandsink
#Camera3: gst-launch-1.0v4l2src device=/dev/video73 !'video/x-raw,width=1920,height=1080,framerate=30/1' ! waylandsink
#Camera4: gst-launch-1.0v4l2src device=/dev/video82 !'video/x-raw,width=1920,height=1080,framerate=30/1' ! waylandsink
#Camera5: gst-launch-1.0v4l2src device=/dev/video91 !'video/x-raw,width=1920,height=1080,framerate=30/1' ! waylandsink 五路同时预览 五路摄像头同时预览实录效果 IQ 文件帧率配置 IQ文件路径:/etc/iqfiles/ov5640_default_default.json 如需修改帧率,在IQ文件中调整: "frmRate": { "sw_aeT_frmRate_mode": "ae_frmRate_fix_mode", "sw_aeT_frmRate_val": 30 } 录像存储验证流程
H.265 硬件编码(MPP) RK3576内置硬件编码器,通过MPP接口直接调用,CPU几乎零负载。 单路录像(1080P30CBR 6Mbps,录300帧即10秒): mpi_enc_test-w 1920 -h 1080 -rc 1 -bps 6000000:6000000:6000000 \ -f 300 -t 16777220 -i /dev/video55 -o./output0.h265 实测编码输出,PSNR稳定在38dB以上,QP 20~21,码率精确锁定6Mbps: MPP H.265编码实测:CBR 6Mbps, PSNR≈38.5dB, QP 20~21 五路同时录像(输出到U盘/SD卡): mpi_enc_test-w 1920 -h 1080 -rc 1 -bps 6000000:6000000:6000000 -f 300 -t 16777220 -i/dev/video55 -o /run/media/sda/output0.h265 & mpi_enc_test-w 1920 -h 1080 -rc 1 -bps 6000000:6000000:6000000 -f 300 -t 16777220 -i/dev/video64 -o /run/media/sda/output1.h265 & mpi_enc_test-w 1920 -h 1080 -rc 1 -bps 6000000:6000000:6000000 -f 300 -t 16777220 -i/dev/video73 -o /run/media/sda/output2.h265 & mpi_enc_test-w 1920 -h 1080 -rc 1 -bps 6000000:6000000:6000000 -f 300 -t 16777220 -i/dev/video82 -o /run/media/sda/output3.h265 & mpi_enc_test-w 1920 -h 1080 -rc 1 -bps 6000000:6000000:6000000 -f 300 -t 16777220 -i/dev/video91 -o /run/media/sda/output4.h265 & 码率参考(1080P30 H.265) CBR vs VBR 怎么选? -rc 1 为恒定码率(CBR),带宽可预测,适合嵌入式监控和网络传输;-rc 0 为可变码率(VBR),同码率下画质更好,适合本地存储。五路监控场景推荐CBR,带宽规划更可控。 GStreamer 录像(MP4封装) gst-launch-1.0-e v4l2src device=/dev/video55 ! \ 'video/x-raw,width=1920,height=1080,framerate=30/1,format=NV12' ! \ videoconvert ! mpph265enc ! h265parse !mp4mux ! \ filesink location=/root/csi1.mp4 写在最后
五路MIPI CSI-2同时工作,本质上考验的是三件事:PLL频率对齐、DPHY时序匹配、驱动与ISP的控制权边界。把这三个问题解决了,RK3576的五路摄像头方案就能稳定落地。 从单路RAW抓流验证链路干净,到ISP预览确认画质,再到五路H.265硬件编码同时录像——整条链路在MYD-LR3576上已跑通,30fps稳定无丢帧,编码PSNR 38dB+。 如果你对这套方案感兴趣,可以直接联系米尔
|