嵌入式分享#22:嵌入式外设调试思路——MIPI CSI 调试篇

调试思路

以RK3588调试ov13850摄像头为例。

第 1 步: 确认模组上电时序是否正常

能正常识别摄像头chip id,说明上电时序没有问题,模组与RK3588能正常进行 i2c 通信。

bash 复制代码
dmesg | grep  13850

读不到 chip ID 的对比:

如上电时序不正常,先按本系列 I2C 设备篇的思路解决 i2c 通信问题,再往下一步调试。

第 2 步:确认驱动是否注册成功

Sensor 已经注册成一个 entity,说明已经注册成功。

bash 复制代码
media-ctl -d /dev/media0 -p | grep 13850

第 3 步:确认是否生成 videoX

查看生成设备节点,如下。

bash 复制代码
v4l2-ctl --list-devices

查看支持格式

bash 复制代码
v4l2-ctl --list-formats-ext -d /dev/video0

第 4 步:抓图是否有输出

抓数据流,不保存图,仅刷出帧率(该方法常用来调试,确认是否有MIPI输出数据)。

bash 复制代码
v4l2-ctl --verbose -d /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat='BG10' --stream-mmap=4

系统会不断刷数据,说明获取视频流正常。

如能正常抓取原始视频数据,则可以使用gst-launch-1.0命令获取图像数据从屏幕进行预览。

bash 复制代码
gst-launch-1.0 v4l2src device=/dev/video55 ! videoconvert ! video/x-raw,format=NV12,width=640,height=480,framerate=60/1 ! waylandsink

排查思路

(1)Sensor ID 无法识别,i2c 通信失败

请按以下顺序排查:

  • Sensor 的 7-bits i2c slave id 是否正确, 是否误写成8-bits。
  • mclk 是否有输出, 电压幅度是否正确。mclk 一般是 24Mhz,也有27Mhz。
  • Sensor 的上电时序是否满足要求,主要包括 avdd, dovdd, dvdd, power down, reset 等。

(2)没有收到帧数据,也没有看到 ISP/MIPI 有报错

  • 确认 kernel log 中有没有关于 MIPI 的报错,比如用 dmesg | grep MIPI 看看有没有出错信息。
  • 确认 kernel log 中有没有出现 Sensor 的 I2C 读写失败,如果 Sensor 在配置寄存器时失败了,Sensor也可能没有正确初始化并使能输出。
  • 实际量测下 MIPI 的 clk 及 data 线上有没有信息输出。如果没有,建议从 Sensor 初始化及硬件方面分析。
  • 实际量测有 MIPI 信号输出,但没报错也收不到数据,请再次检查MIPI 需要设置的参数(比如 sensor 分辨率、输出格式等)。
  • 请确认 I2C 通讯没有错,Sensor 的寄存器初始化列表有全部写到 Sensor 中,在 Sensor 驱动中,最后使能 MIPI 输出的是 s_stream() ,请确认在这个函数前,特别是s_power() ,不要让 MIPI 信号输出。这是因为在 s_stream() 前,MIPI 控制器还未实际准备好接收数据,如果在 s_stream() 前输出数据,可能导致 MIPI 协议头 SOT 信号丢失,也可以将 Camera Sensor 端 clock lane 由 continue 模式切换到 no continues。(这点需要对驱动较为熟悉)

(3)经常会出现抓 Raw 数据没数据返回,串口也没报错,抓图的时候报 select timeout 的错误

此现象可以按照如下排查:

  • 查看DPHY的状态
    根据TRM手册,查看dphy的stopstate 来判断是否有收到数,例如查看 RK3588 CSI0:io -4 -l 0x100 0xfdd30000,需要连续读取 10 次上述寄存器,正常有识别到 MIPI 信号的话,对应的stopstate会在0/1之间变化。
  • 测量 MIPI 信号。使用示波器测量是否有 MIPI 通道信号的输出。
  • 确认 sensor 寄存器
  • 确认 sensor mipi out的寄存器是正常的,可以使用i2c工具读取,推荐使用 i2ctransfer。
  • 确定芯片的睡眠和复位引脚电平是否正常。
相关推荐
用户8351414049493 小时前
const的四种位置,含义完全不同
嵌入式·源码
Zevalin爱灰灰1 天前
Linux入门第二部分(ARM裸机篇) 第二章 Cortex-A7 MPCore架构与ARM汇编基础
linux·汇编·arm开发·嵌入式
Zwawa1 天前
串口命令如何从字符串长成协议:帧头、长度、校验和与状态机
c语言·单片机·嵌入式
小李不想当小白1 天前
BKP备份寄存器与RTC实时时钟(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
La Pulga1 天前
【FreeRTOS源码学习笔记】链表的实现
数据结构·笔记·stm32·mcu·链表·嵌入式·freertos
凉、介1 天前
深入理解 ARMv7-A | Generic Timer
笔记·学习·嵌入式·arm
La Pulga1 天前
【FreeRTOS源码学习笔记】任务创建
笔记·stm32·mcu·学习·嵌入式·freertos·实时操作系统
Zevalin爱灰灰2 天前
Linux入门第二部分(ARM裸机篇) 第一章 开发环境搭建与了解
linux·arm开发·嵌入式
菜鸟小芯2 天前
【Quectel Pi M2 实战】Day3 USB 摄像头图像采集:拍照、录像与踩坑记录(V4L2 + FFmpeg)
ffmpeg·嵌入式
Zwawa3 天前
串口为什么会丢字节:从轮询到中断和环形缓冲区
c语言·单片机·嵌入式