1126bp是25年新发的 kernel6.1版本 比较新资料少,调试难度大
1,debug思路汇总
ai写的 有可能是瞎编的。
这些底层的时钟、数据处理细节完全可以不依赖 v4l2 抓果,通过内核标准节点、驱动日志、中断状态就能排查,刚好适配你们「先确认时钟再看数据通路」的调试思路,我按排查顺序整理下方法,适配你们现在 FPGA 做前端输出的场景:
先确认前提(避免 SOC 侧无意义调测)
因为现在 FPGA 相当于直接扮演了「摄像头 + 信号源」的角色,XVCLK 已经是 FPGA 给 CMOS、FPGA 再输出标准摄像头信号(MIPI/DVP)给 SOC,所以先对齐 FPGA 侧的输出配置,再查 SOC:
-
FPGA 输出的接口参数和 SOC 设备树 / 驱动配置完全一致:比如 MIPI 的 Lane 数、速率、VC 通道、数据类型(RAW8/RAW10/YUV 等);如果是 DVP 并行接口的话,HSYNC/VSYNC 极性、PCLK 频率 / 相位、数据位宽对齐;
-
建议 FPGA 先输出固定测试图案(比如彩条、固定字节序列 0xAA/0x55),不要直接送真实 CMOS 采集数据,方便后面对比 SOC 接收是否正确。
一、SOC 侧时钟状态排查方法
你不需要管给 CMOS 的 XVCLK,重点看SOC 侧 CSI/DSI 接收链路的时钟状态,通用方法如下(所有 Linux 平台基本都适用,不需要改代码):
- 先查错误日志,快速定位时钟失败问题
直接搜 dmesg 里的时钟相关报错:
dmesg | grep -iE 'clk|csi|mipi|isp' | grep -iE 'err|fail|warn'
如果有clk_get fail、clk_set_rate failed、dphy pll unlock这类日志,直接就定位是时钟配置问题,比如 CSI 模块申请时钟失败、MIPI 接收端的锁相环没锁住(FPGA 送的时钟和 SOC 配置不匹配)。
- 用 clk 子系统节点看所有时钟的实时状态
只要内核开了CONFIG_DEBUG_FS(绝大多数嵌入式 Linux 默认开),挂载 debugfs 后直接看时钟总表:
mount -t debugfs none /sys/kernel/debug # 没挂载的话先执行
cat /sys/kernel/debug/clk/clk_summary
重点找和 CSI/MIPI/ISP 相关的时钟项,确认 3 个点:
-
enable_count> 0:说明时钟已经正常使能; -
rate和预期一致:比如 MIPI HS 速率对应时钟、DVP 的 PCLK 输入频率,和 FPGA 输出的参数是否匹配; -
父时钟正确:如果是用 FPGA 送的随路时钟做采样,确认 CSI 采样时钟的父时钟是
ext_csi_clk这类外部输入时钟,不是 SOC 内部 PLL(如果配成内部时钟会导致采样不同步,全是 CRC 错误)。
- 特殊接口时钟补充:MIPI DPHY 状态
如果是 MIPI 接口,大部分 SOC 会在 debugfs 下出 DPHY 的专属节点,比如/sys/kernel/debug/mipi_csi0/dphy_status,直接看pll_lock状态是否为 1:
-
锁不住 = FPGA 输出的 MIPI 时钟质量 / 速率不匹配、或者是 FPGA 用了时钟 burst 模式(有些 SOC 不支持非连续 MIPI 时钟);
-
锁住了 = 前端时钟链路正常,接下来可以查数据通路。
二、SOC 侧数据处理细节排查方法
时钟确认没问题后,不用等 v4l2 抓图,从「中断→链路配置→底层数据」逐层查:
- 先看中断状态,确认有没有收到数据
看 CSI/MIPI/ISP 的中断有没有正常上报:
cat /proc/interrupts | grep -iE 'csi|mipi|isp'
-
FPGA 开始送流后,对应中断的计数会持续增长(比如帧结束中断、MIPI 包接收中断),如果完全不涨 = 根本没识别到数据流,优先查接口配置(VC 通道、数据类型、同步极性不对);
-
如果计数涨但伴随大量错误中断,dmesg 里会有对应报错:
-
全是 CRC 错误 = MIPI 信号质量差、PCLK 采样相位反了、数据位宽不匹配;
-
帧同步错误 = FPGA 输出的分辨率 / 行长度和 SOC 配置不一致、VSYNC/HSYNC 极性错;
-
FIFO 溢出错误 = CSI 接收时钟配慢了、后端总线带宽不够。
-
- 看 CSI/ISP 的 debug 节点,看数据接收统计
几乎所有 SOC 的摄像头驱动都会在 debugfs 下导出接收统计,路径一般是/sys/kernel/debug/csiX/或者/sys/kernel/debug/ispX/,可以直接读:
-
frame_cnt:统计收到的完整帧数,FPGA 送流时应该和帧率匹配增长,说明 SOC 已经能完整识别帧; -
error_cnt:各类错误的计数,比如同步错误、CRC 错误的次数,判断是偶发还是全错; -
部分厂商还支持直接 dump CSI 接收到的原始 RAW 数据(不需要走 v4l2),直接和 FPGA 输出的测试图案对比,100% 确认采样是否正确。
- 开驱动 debug 日志,看逐包 / 逐帧处理细节
如果需要看更细的处理逻辑,可以动态开摄像头驱动的 debug 日志:
-
方法 1:如果驱动有模块参数,加载时加
debug_level=7,会打印所有帧接收、缓冲区处理的日志; -
方法 2:内核开了**
CONFIG_DYNAMIC_DEBUG**的话,用 dyndbg 动态打开对应驱动的 debug 打印,比如:echo 'file drivers/media/platform/xxx-csi.c +p' > /sys/kernel/debug/dynamic_debug/control开了之后 dmesg 会打印每一个 MIPI 短包、帧头帧尾、缓冲区提交的细节,能直接看到 SOC 是不是收到了正确的帧长度、有没有把数据正常送到 v4l2 缓冲区。
- 查 v4l2 链路配置,确认格式匹配
如果前面都没问题,再确认 v4l2 链路的格式配置,不用抓图,用media-ctl就能看:
media-ctl -p # 看整个media拓扑
确认从 CSI 接收单元→ISP→v4l2 设备节点的整个链路的格式(分辨率、像素格式、场序)和 FPGA 输出完全一致,比如 FPGA 送的是 1080P RAW8,结果 CSI 节点配的是 720P RAW10,肯定抓不到正确数据。
也可以用v4l2-ctl -d /dev/video0 --all看最终视频节点的格式配置是否正确。
三、什么时候需要看 v4l2 抓图结果?
只有当前面所有检查项都正常:
-
时钟全部使能、频率正确、DPHY 锁定;
-
中断正常增长、没有错误报错;
-
帧计数正常增长、链路格式配置完全匹配;
这时候如果还是有问题(比如色彩不对、有条纹),才需要抓图分析,大概率是小的配置问题(比如 Bayer 序配反、gamma 没关)或者 FPGA 输出的测试图案本身有问题。
常用调试顺序参考
-
FPGA 输出固定测试图案→确认 FPGA 侧参数和 SOC 配置对齐;
-
查 dmesg 有没有时钟 / DPHY 报错→读 clk_summary 确认时钟状态→确认 DPHY 锁存;
-
开 FPGA 送流→看中断是否增长→查 error_cnt 有没有错误;
-
确认帧计数正常增长→查 media 拓扑格式匹配→最后 v4l2 抓图验证。