请问RDK X3接入mipi红外相机的问题[249.765269]comm_dq_no_data[1025]: G0 MIPI_SIF_MODULE module dq too much timeout error_detail -3

利用X3M的开发板,接入一款红外的传感器,mipi接口输出的。红外相机是上电直接输出mipi数据的,不需要i2c进行寄存器配置。

前端输入是连续时钟模式,UYVY8bit packed的数据格式,mipi-csi2。 2lane 640x512的分辨率, 50fps。

接到开发板的mipi_host0,mipi_host2的加插件上。示波器测试管脚的clk和dat的数据都是

sensor_lt9211.txt (8.5 KB)

正常的。

配置是按照sdk中sample/get_sif_data进行的,配置文件见附件。

其中的settle值从10-120,每隔10进行了配置,都无法接到数据。
运行报错如下:
root@ubuntu:~/qm_track# ./get_sif_data

Horizon Robotics Sensor Test Tools V1.0

********************** Sensor Lists *************************
0 – IMX415
1 – F37
2 – lgc6122
3 – lt9211
4 – SC850


Please select :3
set_sensor_param
bus_num 2
bus_type 0
sensor_name lt9211
reg_width 8
sensor_mode 1
sensor_addr 0x3c
serial_addr 0x0
resolution 512
hb sensor init success…
hb isp init success…
hb mipi init success…
devId: 0 snsinfo.sensorInfo.entry_index:0
camera_info->mipi_attr.mipi_host_cfg.lane: 2
[ERROR][“vio_devop”][utils/dev_ioctl.c:280] [246.364328]dev_get_buf_timeout[280]: pipe(0)TIME OUT ,sec(1699889237)usec(702203)!

[ERROR][“vio_devop”][utils/dev_ioctl.c:283] [246.364366]dev_get_buf_timeout[283]: pipe(0)Get buf sem_timedwait failed Connection timed out!

[ERROR][“vin”][vin/hb_vin_api.c:1381] [246.364392]HB_VIN_GetDevFrame[1381]: devId 0 GetDevFrame BUFFER_OUT_DONE timeout

HB_VIN_GetDevFrame error!!!
********************** Command Lists *************************
q – quit
g – get one frame
l – get a set frames
h – print help message

Command: Command: [ERROR][“vio_core”][commom_grp/binding_main.c:1025] [248.564789]comm_dq_no_data[1025]: G0 MIPI_SIF_MODULE module dq too much timeout error_detail -3

[ERROR][“vio_core”][commom_grp/binding_main.c:1025] [248.764856]comm_dq_no_data[1025]: G0 MIPI_SIF_MODULE module dq too much timeout error_detail -3

[ERROR][“vio_core”][commom_grp/binding_main.c:1025] [248.964916]comm_dq_no_data[1025]: G0 MIPI_SIF_MODULE module dq too much timeout error_detail -3

[ERROR][“vio_core”][commom_grp/binding_main.c:1025] [249.164987]comm_dq_no_data[1025]: G0 MIPI_SIF_MODULE module dq too much timeout error_detail -3

[ERROR][“vio_core”][commom_grp/binding_main.c:1025] [249.365096]comm_dq_no_data[1025]: G0 MIPI_SIF_MODULE module dq too much timeout error_detail -3

[ERROR][“vio_core”][commom_grp/binding_main.c:1025] [249.565200]comm_dq_no_data[1025]: G0 MIPI_SIF_MODULE module dq too much timeout error_detail -3

[ERROR][“vio_core”][commom_grp/binding_main.c:1025] [249.765269]comm_dq_no_data[1025]: G0 MIPI_SIF_MODULE module dq too much timeout error_detail -3

[ERROR][“vio_core”][commom_grp/binding_main.c:1025] [249.965313]comm_dq_no_data[1025]: G0 MIPI_SIF_MODULE module dq too much timeout error_detail -3

[ERROR][“vio_core”][commom_grp/binding_main.c:1025] [250.165377]comm_dq_no_data[1025]: G0 MIPI_SIF_MODULE module dq too much timeout error_detail -3

[ERROR][“vio_core”][commom_grp/binding_main.c:1025] [250.365473]comm_dq_no_data[1025]: G0 MIPI_SIF_MODULE module dq too much timeout error_detail -3
每次运行的时候,利用demsg | grep “mipi“查看驱动的报错如下:
settle<70的时候:
[ 848.540239] vps mipi_host0: close as 0
[ 848.540251] vps mipi_host0: sensor0_mclk set(0) 0 as 113142858
[ 854.086054] vps mipi_host0: init cmd: 0 real
[ 854.086061] vps mipi_host0: init begin
[ 854.086065] vps mipi_host0: 2 lane 640x512 50fps datatype 0x1e
[ 854.086119] vps mipi_host0: sensor0_mclk set(1) 115200000 as 113142858
[ 854.086122] vps mipi_host0: snrclk set enable
[ 854.086126] vps mipi_host0: ipiclk limit 20766600 up to 102000000
[ 854.086132] vps mipi_host0: ipiclk set 102000000 get 102000000
[ 854.087163] vps mipi_host0: linelenth: 747, framelenth: 556, fps: 50, bits_per_pixel: 16, pixclk: 102000000, rx_bit_clk: 332265600
[ 854.087166] vps mipi_host0: time to transmit last pixel in ppi: 35971
[ 854.087169] vps mipi_host0: minium hsdtime: 3021
[ 854.087172] vps mipi_host0: time to transmit last pixel in ipi: 35970
[ 854.087178] vps mipi_host0: config 1/1 ipi done
[ 854.087180] vps mipi_host0: init end
[ 854.088956] yuv_format 8 mipi_rx_index 0
[ 854.088966] sif_set_mipi_rx: vc_index[0] = 0
[ 854.097683] vps mipi_host0: start cmd: 0 real
[ 854.097688] vps mipi_host0: check phy stop state
[ 854.098911] vps mipi_host0: irq status 0x1
[ 854.099450] vps mipi_host0: phy_fatal: 0x3
[ 854.118912] vps mipi_host0: irq status 0x1
[ 854.119453] vps mipi_host0: phy_fatal: 0x3
[ 854.138913] vps mipi_host0: irq status 0x1
[ 854.139451] vps mipi_host0: phy_fatal: 0x3
[ 854.158916] vps mipi_host0: irq status 0x1
[ 854.159457] vps mipi_host0: phy_fatal: 0x3
[ 854.178909] vps mipi_host0: irq status 0x1
[ 854.179447] vps mipi_host0: phy_fatal: 0x3
[ 854.198913] vps mipi_host0: irq status 0x1
[ 854.199452] vps mipi_host0: phy_fatal: 0x3
[ 854.218916] vps mipi_host0: irq status 0x1
[ 854.219455] vps mipi_host0: phy_fatal: 0x3
[ 854.238911] vps mipi_host0: irq status 0x1
[ 854.239446] vps mipi_host0: phy_fatal: 0x3
[ 854.258908] vps mipi_host0: irq status 0x1
[ 854.259441] vps mipi_host0: phy_fatal: 0x3
[ 854.278909] vps mipi_host0: irq status 0x1
[ 854.279440] vps mipi_host0: phy_fatal: 0x3
[ 854.298909] vps mipi_host0: irq status 0x1
[ 854.299440] vps mipi_host0: phy_fatal: 0x3

settle大于70时:
[ 875.614310] vps mipi_host0: close as 0
[ 875.614322] vps mipi_host0: sensor0_mclk set(0) 0 as 113142858
[ 907.014781] vps mipi_host0: init cmd: 0 real
[ 907.014786] vps mipi_host0: init begin
[ 907.014791] vps mipi_host0: 2 lane 640x512 50fps datatype 0x1e
[ 907.014844] vps mipi_host0: sensor0_mclk set(1) 115200000 as 113142858
[ 907.014847] vps mipi_host0: snrclk set enable
[ 907.014851] vps mipi_host0: ipiclk limit 20766600 up to 102000000
[ 907.014857] vps mipi_host0: ipiclk set 102000000 get 102000000
[ 907.015887] vps mipi_host0: linelenth: 747, framelenth: 556, fps: 50, bits_per_pixel: 16, pixclk: 102000000, rx_bit_clk: 332265600
[ 907.015891] vps mipi_host0: time to transmit last pixel in ppi: 35971
[ 907.015894] vps mipi_host0: minium hsdtime: 3021
[ 907.015897] vps mipi_host0: time to transmit last pixel in ipi: 35970
[ 907.015902] vps mipi_host0: config 1/1 ipi done
[ 907.015905] vps mipi_host0: init end
[ 907.017357] yuv_format 8 mipi_rx_index 0
[ 907.017367] sif_set_mipi_rx: vc_index[0] = 0
[ 907.023850] vps mipi_host0: start cmd: 0 real
[ 907.023854] vps mipi_host0: check phy stop state
[ 907.023885] vps mipi_host0: irq status 0x10000
[ 907.024465] vps mipi_host0: phy: 0x3
[ 907.024965] vps mipi_host0: irq status 0x100a3
[ 907.025539] vps mipi_host0: phy_fatal: 0x3
[ 907.026089] vps mipi_host0: pkt_fatal: 0x1
[ 907.026638] vps mipi_host0: pld_crc_fatal: 0x9
[ 907.027231] vps mipi_host0: ecc_corrected: 0xd
[ 907.027824] vps mipi_host0: phy: 0x3
[ 907.028326] vps mipi_host0: irq status 0x100e3
[ 907.028899] vps mipi_host0: phy_fatal: 0x3
[ 907.029448] vps mipi_host0: pkt_fatal: 0x1
[ 907.029996] vps mipi_host0: pld_crc_fatal: 0x4
[ 907.030589] vps mipi_host0: data_id: 0x4
[ 907.031116] vps mipi_host0: ecc_corrected: 0x4
[ 907.031709] vps mipi_host0: phy: 0x3
[ 907.032204] vps mipi_host0: irq status 0x100e3
[ 907.032779] vps mipi_host0: phy_fatal: 0x3
[ 907.033329] vps mipi_host0: pkt_fatal: 0x1
[ 907.033879] vps mipi_host0: pld_crc_fatal: 0x4
[ 907.034472] vps mipi_host0: ecc_corrected: 0x4
[ 907.035066] vps mipi_host0: phy: 0x3
[ 907.035551] vps mipi_host0: irq status 0x100a3
[ 907.036122] vps mipi_host0: phy_fatal: 0x3
[ 907.036670] vps mipi_host0: pkt_fatal: 0x1
请问有什么解决的办法吗?

我来帮你分析这个 MIPI 红外相机接入问题。先搜索一下社区中是否有类似的案例和解决方案。

根据您提供的详细日志和配置信息,问题已经比较清晰了。这是一个典型的 MIPI 物理层时序不匹配 导致的数据接收失败问题。

:magnifying_glass_tilted_left: 问题诊断

从您的 dmesg 日志可以看到两个关键现象:

1. settle < 70 时:phy_fatal: 0x3

[  854.099450] vps mipi_host0:   phy_fatal: 0x3

含义:PHY 层无法正确进入高速模式(HS mode),通常是 settle 时间太短,sensor 的 Ttx-zero + Ttx-prepare 时间不足。

2. settle > 70 时:多种 CRC 和包错误

[  907.026089] vps mipi_host0:   pkt_fatal: 0x1
[  907.026638] vps mipi_host0:   pld_crc_fatal: 0x9
[  907.027231] vps mipi_host0:   ecc_corrected: 0xd

含义:虽然能进入高速模式,但数据传输过程中出现 CRC 校验错误、包错误,说明时序仍然不匹配。

:white_check_mark: 解决方案

步骤 1:重新计算 settle 值

settle 值的计算公式:

settle = (Ttx-zero + Ttx-prepare) / Tclk

根据您的配置:

  • 分辨率:640×512
  • 帧率:50fps
  • 数据格式:UYVY 8bit packed (16bit/pixel)
  • Lane 数:2
  • mipiclk:需要重新计算

计算过程

像素时钟 = 640 × 512 × 50 × 16 = 262,144,000 bps = 262.144 Mbps
总 mipi bit rate = 262.144 Mbps (考虑 overhead 约 1.2 倍) ≈ 315 Mbps
单 lane 速率 = 315 / 2 = 157.5 Mbps

但您日志中显示:

[  854.087178] vps mipi_host0: rx_bit_clk: 332265600

实际速率是 332.2656 Mbps,单 lane 约 166 Mbps

建议 settle 值范围

  • 对于 166 Mbps/lane 的速率,settle 通常在 25-45 之间
  • 您测试的 10-120 范围太大,建议精细调试 20-50 区间

步骤 2:检查 datatype 配置

您使用的是 UYVY 8bit packed 格式,对应的 MIPI datatype 应该是:

  • 0x1e (YUV422 8-bit) - 您日志中显示正确

但需要确认 sensor 实际输出格式是否真的是 UYVY packed,有些 sensor 输出的是:

  • 0x24 (RAW8)
  • 0x2a (RAW10)

步骤 3:修改配置文件

根据您的附件配置(虽然我看不到具体内容),请重点检查以下参数:

MIPI_ATTR_S MIPI_LT9211_2LANE_50FPS_UYVY_ATTR = {
    .mipi_host_cfg = {
        .lane = 2,              // ✓ 正确
        .datatype = 0x1e,       // ✓ 正确 (YUV422 8-bit)
        .mclk = 2400,           // 确认 sensor 实际 MCLK 频率
        .mipiclk = 333,         // 修改为实际总速率 (Mbps),不是 332.2656
        .fps = 50,              // ✓ 正确
        .width = 640,           // ✓ 正确
        .height = 512,          // ✓ 正确
        .linelenth = 747,       // 确认 sensor 规格书
        .framelenth = 556,      // 确认 sensor 规格书
        .settle = 35,           // ⚠️ 重点调试:从 35 开始,±5 微调
        .channel_num = 1,
        .channel_sel = {0}
    },
    .dev_enable = 0
};

步骤 4:硬件排查

由于您的 sensor 是上电直接输出 MIPI 数据,不需要 I2C 配置,需要特别注意:

  1. MCLK 频率确认

    # 查看实际 MCLK 频率
    sudo cat /sys/class/vps/mipi_host0/param/snrclk_freq
    

    确保与配置中的 .mclk 一致。

  2. 检查 MIPI 线序

    • 确认 D0P/D0N、D1P/D1N、CLKP/CLKN 线序正确
    • 确认没有接反或短路
  3. 电源稳定性

    • 红外 sensor 功耗可能较大,确保供电稳定
    • 检查是否有电源纹波干扰 MIPI 信号

步骤 5:调试命令

# 1. 清除之前的 MIPI 配置
sudo bash -c "echo 0 > /sys/class/vps/mipi_host0/param/snrclk_en"

# 2. 重新使能时钟
sudo bash -c "echo 1 > /sys/class/vps/mipi_host0/param/snrclk_en"
sudo bash -c "echo 24000000 > /sys/class/vps/mipi_host0/param/snrclk_freq"

# 3. 运行测试程序
cd ~/qm_track
./get_sif_data

# 4. 实时监控 dmesg
dmesg -w | grep mipi

步骤 6:精细调试 settle 值

25-45 范围内,以 2 为步长进行测试:

settle = 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45

每次修改后重新编译配置并测试,观察:

  • phy_fatal 是否消失
  • pkt_fatalpld_crc_fatal 是否减少
  • 是否能成功获取帧数据

:clipboard: 补充建议

  1. 联系 sensor 厂商

    • 获取 LT9211 的官方 MIPI 时序参数(Ttx-zero、Ttx-prepare)
    • 确认 sensor 在 50fps 下的实际输出速率
  2. 参考社区类似案例

  3. 如果以上都无效

    • 尝试降低帧率(如 30fps)测试是否能正常工作
    • 尝试单 lane 模式(如果 sensor 支持)

建议您先按照上述步骤调整 settle 值到 35 左右测试,并确认 mipiclk 参数是否正确。 如果问题依旧,请提供:

  1. sensor 规格书中的 MIPI 时序参数
  2. 完整的配置文件内容
  3. 降低帧率后的测试结果

这样可以进一步定位问题。