IMX93&IMX91在6.6.36版本下配置IMX296摄像头的问题

前言

我用的是6.6.36 2.10 版本的,新版本应该已经修复了这个问题。

国外客户适配 IMX296 (1-lane RAW10, 1188 Mbps) 出现问题的。

Camera: with the EVK device tree, the D-PHY receives our IMX296 (1-lane RAW10, 1188 Mbps) data with no errors (PKT_FATAL, CRC, ECC, sequence and boundary errors all 0). However, no pixels reach the ISI. The IPI FIFO overflows (INT_ST_IPI_FATAL = 0x2a), the gasket pixel counter (MEDIAMIX 0x40) stays 0, and the ISI never receives a frame.

To rule out the camera, we enabled the CSI controller's internal pattern generator (PPI_PG, status = active) with RAW10 and RGB888. The result is the same: no errors, but the gasket pixel counter stays 0 and no frames arrive. So the data stops between the CSI IPI and the ISI, inside the i.MX93.

解决

drivers/staging/media/imx/dwc-mipi-csi2.c:

dwc_mipi_csi2_param_init()(只在 probe() 里调用一次,第 1408 行)把 IPI 的 data type 写死了:

// dwc-mipi-csi2.c:1017-1031
} else {                                  /* 非 PG 分支,真实 sensor == 永远走这里 */
        ipi_cfg->data_type  = DT_YUV422_8;   /* 0x1E, 写死 */
        ipi_cfg->hline_time = 0x500;
        ipi_cfg->vactive_lines = 0x320;      /* 1280x800,也是写死的 */
        ...
}

dwc_mipi_csi2_set_fmt() 协商完 sensor 格式后既不保存 csi2h->format、也不同步 ipi_cfg。

IPI 只处理与自己 DT 匹配的包,所以 RAW10 像素在 IPI 就停下了,gasket 一个像素都收不到(计数器 0x40 恒为 0),IPI FIFO 反向溢出(0x2a = FIFO_OVERFLOW|FIFO_NOT_EMPTY|IF_FIFO_OVERFLOW),ISI 拿不到帧。D-PHY/Packet 层完全正常,所以 CRC/ECC/SEQ/BNDRY 全 0。

之前适配的OV5640 走 UYVY8_2X8 格式,正好等于写死的值。所以是正常的。

社区有对应的patch:

https://lkml.iu.edu/hypermail/linux/kernel/2605.0/07263.html

https://patchew.org/linux/20260423-csi2._5Fimx95-v2-0-934c02f3422a@oss.nxp.com/20260423-csi2._5Fimx95-v2-2-934c02f3422a@oss.nxp.com/

https://lore-kernel.gnuweeb.org/linux-devicetree/20250827-isi_imx93-v1-4-83e6b4b50c4d@nxp.com/t/

https://community.nxp.com/t5/i-MX-Processors/FRDM-i-MX93-using-MIPI-CSI-2-camera-with-a-Bayer-Pattern-RAW10/m-p/2417448

https://community.nxp.com/t5/i-MX-Processors/Issue-with-IMX93-MIPI-CSI2-RAW10-custom-camera-hanged-up-no-data/m-p/2178799

有说将内核映像升级到 6.1.55 版解决了我的问题。

额外

PPI 码型发生器(PPI Pattern Generator,PPI_PG)是 Synopsys DWC MIPI CSI-2 Host 控制器内部自带的一个"假摄像头":

它在控制器内部直接合成 CSI-2 数据包流,不需要 sensor、不需要 MIPI 排线、也不需要 D-PHY 真的收到 HS 信号。它是用来把"sensor/线缆/PHY 的问题"和"SoC 内部通路的问题"分开的。

IMX296 ─ D-PHY(lane RX) ─┬─► 包处理器 / data-ID 过滤 ─► IPI ─► 像素总线 ─► gasket ─► ISI
                         │   (0x10/0x14, 0x30/0x34)   (0x88)              (MEDIAMIX)
                    PPI_PG 注入点
                 (寄存器 0x60~0x70)

PPI = PHY Protocol Interface,是 D-PHY 和控制器之间的并行接口。

PG 就挂在这个边界上,冒充 D-PHY 输出,所以它绕过 sensor + 线缆 + lane 接收器,但完整地走过:包处理 → data-ID 过滤 → IPI → gasket → ISI。

posted @ 2026-10-10 11:28  杨旭0324  阅读(4)  评论(0)    收藏  举报