调试流程
1. 硬件连线检查
- 数据线(MIPI Data Lanes) :
- 确认 IMX415 模组的 4 条数据线 + 1 条时钟线连接正确。
- 如果是 4-lane 输出,SoC 的 D-PHY 必须也配置成 4-lane 接收。
- 控制线:
原理图


- I²C SDA/SCL →
&i2c8控制器管脚。 - 复位(
reset-gpios)→ 对应 GPIO。 - 时钟输出(
xvclk)→ 摄像头 MCLK 引脚。 - 供电(
avdd-supply)→ 对应电源芯片或 LDO。
2. Device Tree (DTS) 配置确认
详细情况请看下面设备树详解
- 链路完整性:
- 用文本方式查找
remote-endpoint,确认 IMX415 → D-PHY → CSI-2 → CIF/ISP 的链路闭环。 - 确认
data-lanes数量与硬件一致(IMX415 默认是 4 条 lane)。
- 用文本方式查找
- 极性、时序:
reset-gpios极性是否与模组手册一致(IMX415 通常是低电平复位)。- 电源域、供电电压节点是否匹配(IMX415 的 AVDD、DVDD、IOVDD 电压要求要符合规格)。
- 模块状态:
- 所有链路上的核心节点(
&i2c8、&csi2_dcphy0、&mipi0_csi2、CIF/ISP)都要status = "okay"。
- 所有链路上的核心节点(
3. 上电与驱动加载检查
-
查看摄像头 I²C 识别情况:
i2cdetect -y 8 # i2c8 总线- 应该能看到地址
0x1a(IMX415)。 - 如果没有:
- 确认
xvclk在探测前已经输出。 - 确认复位引脚和电源时序 OK。
- 确认
- 应该能看到地址
-
检查驱动绑定日志:
dmesg | grep -i imx415- 应看到传感器驱动注册、解析 DTS、设置时钟/供电等步骤。
- 异常(比如
probe failed)时检查 I²C、供电和 GPIO 控制逻辑。
4. 时钟与复位验证
- 查看 MCLK 是否输出(用示波器测 SoC 输出脚):
- 正常应有 24MHz 方波(或 DTS 配置的频率)。
- 复位引脚:
- 上电初期保持复位电平(低),然后释放。
- 驱动中一般会延时 5~10ms 后再拉高/低以启动工作。
5. MIPI D-PHY/CSI-2 接收层检查
-
分析内核日志:
dmesg | grep -i mipi- 确认 CSI-2 控制器收到了帧同步信号(Frame Start/End)。
6. ISP/CIF 数据通路验证
-
启动视频采集:
media-ctl -p- 查看 media graph 链路,确认
imx415→csi-2 receiver→capture output有连接。
- 查看 media graph 链路,确认
-
抓取图像帧:
查看设备
v4l2-ctl --list-devicegst-launch-1.0 v4l2src device=/dev/video20 ! videoconvert ! autovideosink- 成功抓到数据说明链路正常。
- 如果 /dev/videoX 打不开:
- 检查 V4L2 驱动是否注册。
- 检查 media graph 链是否存在断链。
结构
IMX415 节点 和 csi2_dcphy0 节点 之间的连接

IMX415 → D-PHY → MIPI CSI-2 控制器 → CIF/ISP 的完整视频数据流向示意图

链路说明
- I²C SDA/SCL →
-
I²C 控制链
&i2c8通过reg = <0x1a>控制 IMX415 寄存器初始化(分辨率、帧率、MIPI 配置等)。- 不参与图像数据传输,仅用于控制。
-
视频数据链
- IMX415 的
port/endpoint(imx415_out0) 定义了它的 MIPI 输出端,data-lanes = <1 2 3 4>。 remote-endpoint = <&mipi_in_ucam0>让它和 D-PHY 输入端 建立连接。- D-PHY 节点(
&csi2_dcphy0)port@1(csidcphy0_out) 连接到 CSI-2 控制器输入端mipi0_csi2_input。 - CSI-2 控制器的输出
mipi0_csi2_output连接到 CIF/ISP 输入端cif_mipi_in0。
- IMX415 的
-
模块作用
- IMX415:CMOS 传感器,输出 MIPI CSI-2 数据。
- D-PHY:物理层收发器,将 MIPI 差分信号恢复为逻辑字节流。
- MIPI CSI-2 控制器:协议层解析器,按 CSI-2 协议拆包,准备送往图像处理单元。
- CIF/ISP:图像信号处理模块(去噪、白平衡、色彩校正等)。
-
DTS 关键路径对应表

设备树详解
csi2_dcphy0节点
/*
* csi2_dcphy0 代表第 0 路的 MIPI CSI-2 D-PHY 控制器节点
* 这个节点通常负责将来自摄像头模组的 MIPI D-PHY 信号(高速差分数据)接收下来,
* 然后交给后端的 CSI 控制器进行处理。
*/
&csi2_dcphy0 {
status = "okay"; /* 启用该硬件模块 */
ports { /* 声明该 PHY 节点的多端口连接关系 */
#address-cells = <1>;
#size-cells = <0>;
/*
* port@0 表示 D-PHY 的输入端口(从摄像头进来的信号)
*/
port@0 {
reg = <0>; /* 端口编号 0 */
#address-cells = <1>;
#size-cells = <0>;
/* endpoint@1:定义来自 imx415 摄像头的 MIPI 输入端 */
mipi_in_ucam0: endpoint@1 {
reg = <1>; /* 端点编号 */
/* 指向摄像头端的 remote-endpoint,用于建立连接关系 */
remote-endpoint = <&imx415_out0>;
/* 使用的数据通道,MIPI CSI-2 的 Lane 编号从 1 开始 */
data-lanes = <1 2 3 4>; /* 4-lane 配置, 用于高带宽传输 */
};
};
/*
* port@1 表示 D-PHY 的输出端口(往 SoC 内部 CSI 控制器送数据)
*/
port@1 {
reg = <1>; /* 端口编号 1 */
#address-cells = <1>;
#size-cells = <0>;
/* endpoint@0:定义输出到 mipi0_csi2_input 的连接 */
csidcphy0_out: endpoint@0 {
reg = <0>; /* 端点编号 */
/* 指向 CSI 控制器输入端的 remote-endpoint */
remote-endpoint = <&mipi0_csi2_input>;
};
};
};
};
解析要点
-
&csi2_dcphy0
这是设备树里对硬件 D-PHY 控制器的引用(&表示引用已定义的节点)。 -
status = "okay";
表示启用该模块,如果是"disabled"则驱动不会初始化这个硬件。 -
多端口结构 (
ports / port@x / endpoint@y)- 一个 D-PHY 节点通常有两个端口:
- port@0 → 输入端,接摄像头模组 MIPI 输出。
- port@1 → 输出端,接 SoC 内部 CSI 解析模块。
endpoint内的remote-endpoint是建立连接的关键,它在软件中会和目标节点的endpoint互相指向,实现拓扑绑定。
- 一个 D-PHY 节点通常有两个端口:
-
data-lanes
定义 MIPI 使用的 数据通道,高分辨率摄像头通常用 4 lanes 提高带宽。
i2c8 + imx415 摄像头节点
/*
* i2c8 总线节点
* 这个 I²C 控制器用于与摄像头模组(IMX415)进行寄存器配置通信。
* MIPI 输出数据不走 I²C,I²C 只用于初始化和控制。
*/
&i2c8 {
status = "okay"; /* 启用该 I²C 控制器 */
/* 选择 I²C8 使用的 pin 脚复用配置 */
pinctrl-0 = <&i2c8m1_xfer>;
/*
* imx415 摄像头节点
* @1a 表示 I²C 从设备地址是 0x1A
*/
imx415: imx415@1a {
/* 兼容字符串,对应内核里的摄像头驱动匹配项 */
compatible = "sony,imx415";
/* I²C 地址 */
reg = <0x1a>;
/* 摄像头主时钟来源(来自 SoC CRU) */
clocks = <&cru CLK_MIPI_CAMERAOUT_M0>;
clock-names = "xvclk"; /* 该时钟在驱动中命名为 xvclk */
/* 摄像头主时钟输出引脚复用配置 */
pinctrl-names = "default";
pinctrl-0 = <&cam_clk0m0_clk0>;
/* 摄像头所在的电源域 */
power-domains = <&power RK3576_PD_VI>;
/* 模组的模拟电源,电源管理用到 */
avdd-supply = <&vcc_mipidcphy0>;
/* 摄像头复位引脚连接到 GPIO1_PB6,低电平有效 */
reset-gpios = <&gpio1 RK_PB6 GPIO_ACTIVE_LOW>;
/* Rockchip 平台私有属性:摄像头模块索引(第 0 路) */
rockchip,camera-module-index = <0>;
/* 摄像头朝向(背面) */
rockchip,camera-module-facing = "back";
/* 模块型号 */
rockchip,camera-module-name = "CMK-OT2022-PX1";
/* 镜头型号 */
rockchip,camera-module-lens-name = "IR0147-50IRC-8M-F20";
/* MIPI 数据输出端口配置 */
port {
imx415_out0: endpoint {
/* 连接到 csi2_dcphy0 的输入端 mipi_in_ucam0 */
remote-endpoint = <&mipi_in_ucam0>;
/* MIPI 使用的数据通道编号,4 lane */
data-lanes = <1 2 3 4>;
};
};
};
};
解析重点
-
clocks/clock-names- SoC 会通过
CLK_MIPI_CAMERAOUT_M0输出一个稳定的 MCLK(常见 24MHz)到 IMX415 芯片。 - 驱动中通过
"xvclk"名来索引这个时钟。
- SoC 会通过
-
reset-gpios- 控制 IMX415 硬件复位引脚。上电初始化时通常:
- 拉低 → 延时 → 拉高 → 延时
- 保证芯片寄存器处于已知状态。
- 控制 IMX415 硬件复位引脚。上电初始化时通常:
-
avdd-supply- 指向电源管理节点,启动传感器前驱动会先 enable 电源,再给时钟,最后释放复位。
-
port/endpoint- 定义 MIPI 输出的拓扑连接关系。
remote-endpoint = <&mipi_in_ucam0>表示物理上 IMX415 输出连接到 D-PHY 控制器的输入端。
-
rockchip,camera-*属性- 这些是 Rockchip 平台定制的私有信息,方便上层 HAL 识别不同模组。
mipi0_csi2 节点
/*
* mipi0_csi2 节点
* 这是 MIPI CSI-2 接收控制器的实例(第 0 路)。
* 它的作用是把从 MIPI D-PHY 接收的原始像素数据按照 CSI-2 协议解析成
* 内部格式(例如 YUV、RAW),再送给 ISP 或 CIF(Camera Interface Framework)。
*/
&mipi0_csi2 {
status = "okay"; /* 启用该 MIPI CSI-2 控制器 */
ports { /* 定义该控制器的所有端口连接关系 */
#address-cells = <1>;
#size-cells = <0>;
/*
* port@0 表示它的输入端口(接收来自 D-PHY 的数据流)
*/
port@0 {
reg = <0>; /* 端口编号 0 */
#address-cells = <1>;
#size-cells = <0>;
/* endpoint@1:接收端点,连接到 D-PHY 输出端 */
mipi0_csi2_input: endpoint@1 {
reg = <1>; /* 端点编号 */
/* 连接到 csi2_dcphy0 节点的输出端 csidcphy0_out */
remote-endpoint = <&csidcphy0_out>;
};
};
/*
* port@1 表示它的输出端口(将解析后的数据送往下一级,比如 ISP/CIF)
*/
port@1 {
reg = <1>; /* 端口编号 1 */
#address-cells = <1>;
#size-cells = <0>;
/* endpoint@0:输出端点,连接到 CIF/ISP 输入端 */
mipi0_csi2_output: endpoint@0 {
reg = <0>; /* 端点编号 */
/* 连接到 cif_mipi_in0(CIF 模块的 MIPI 输入) */
remote-endpoint = <&cif_mipi_in0>;
};
};
};
};
解析重点
-
角色定位
mipi0_csi2是 协议层(Protocol Layer) 模块,它在 D-PHY(物理层)和 ISP/CIF 之间。- 数据流向:
摄像头 → D-PHY → CSI-2 接收控制器(本节点) → ISP/CIF。
-
端口关系
- port@0(输入)
接 csi2_dcphy0 的输出端csidcphy0_out。 - port@1(输出)
接 ISP/CIF 的输入端cif_mipi_in0。
- port@0(输入)
-
remote-endpoint的作用
通过remote-endpoint和对端的endpoint互相指针,使内核能识别整条 MIPI 通路。
剩下节点
/*
* rkcif:Rockchip Camera Interface Framework 总控节点
* 作用:管理整个平台上的摄像头接口模块(CIF、MIPI、LVDS)。
*/
&rkcif {
status = "okay"; /* 启用 CIF 框架 */
};
/*
* rkcif_mipi_lvds:MIPI/LVDS 接口的接收模块
* 作用:从 MIPI CSI-2 控制器接收像素数据。
*/
&rkcif_mipi_lvds {
status = "okay"; /* 启用该 MIPI/LVDS 接收器 */
port {
/* CIF MIPI 输入端,与 mipi0_csi2_output 相连 */
cif_mipi_in0: endpoint {
remote-endpoint = <&mipi0_csi2_output>; /* 从 CSI-2 控制器输出端接收数据 */
};
};
};
/*
* rkcif_mipi_lvds_sditf:MIPI/LVDS 的 SDI 接口(Stream Direct Interface)
* 作用:将接收到的像素数据直通给 ISP 虚拟端口。
*/
&rkcif_mipi_lvds_sditf {
status = "okay";
port {
/* MIPI/LVDS 到 ISP 的直通输出端 */
mipi_lvds_sditf: endpoint {
remote-endpoint = <&isp_vir0>; /* 连接 ISP 虚拟输入端口 isp_vir0 */
};
};
};
/*
* rkcif_mmu:CIF 模块的内存管理单元(MMU)。
* 作用:负责内存虚拟地址到物理地址转换,用于 DMA。
*/
&rkcif_mmu {
status = "okay"; /* 启用 CIF MMU */
};
/*
* rkisp:Rockchip ISP(Image Signal Processor)
* 作用:对来自 CIF/MIPI 的原始图像数据进行 ISP 处理(去噪、白平衡、颜色校正等)。
*/
&rkisp {
status = "okay"; /* 启用 ISP 模块 */
};
/* ISP 专用 MMU */
&rkisp_mmu {
status = "okay";
};
/*
* rkisp_vir0:ISP 虚拟通道 0
* 作用:ISP 的一个输入通道,可接收来自 CIF 的数据流。
*/
&rkisp_vir0 {
status = "okay";
port {
#address-cells = <1>;
#size-cells = <0>;
/* ISP 虚拟通道 0 的输入端,与 MIPI/LVDS SDI 输出相连 */
isp_vir0: endpoint@0 {
reg = <0>;
remote-endpoint = <&mipi_lvds_sditf>;
};
};
};
/* ISP 虚拟通道 0 的 SDI 接口(输出) */
&rkisp_vir0_sditf {
status = "okay";
};
/*
* rkvpss:Video Post Processing Subsystem
* 作用:视频后处理子系统(例如缩小、裁剪、色彩空间转换)。
*/
&rkvpss {
status = "okay";
};
/* VPSS 的 MMU */
&rkvpss_mmu {
status = "okay";
};
/* VPSS 虚拟通道 0 */
&rkvpss_vir0 {
status = "okay";
};
链路流程
1. 摄像头(通过 MIPI CSI-2 接口)输出原始图像数据
|
▼
2. MIPI CSI-2 控制器(例如 &mipi0_csi2)解析协议
|
▼
3. CIF MIPI/LVDS 接收模块(&rkcif_mipi_lvds)
- DTS: 接收端口 `cif_mipi_in0`
- remote-endpoint = <&mipi0_csi2_output>
- 作用:从 CSI-2 控制器获取像素流,准备送给下一级
|
▼
4. CIF MIPI/LVDS SDI 接口(&rkcif_mipi_lvds_sditf)
- DTS: 输出端口 `mipi_lvds_sditf`
- remote-endpoint = <&isp_vir0>
- 作用:将 CIF 接收到的数据直通给 ISP 虚拟通道
|
▼
5. ISP 虚拟通道 0(&rkisp_vir0)
- DTS: 输入端口 `isp_vir0`
- remote-endpoint = <&mipi_lvds_sditf>
- 作用:作为 ISP 的一个输入 Pad,接收 CIF 提供的原始数据
|
▼
6. ISP 模块(&rkisp)
- 作用:对 RAW 数据进行 ISP 处理(去噪、白平衡、色彩校正等),输出 YUV/RGB 格式
|
▼
7. ISP vir0 SDI 接口(&rkisp_vir0_sditf)
- 作用:ISP 处理后的图像流出口,可送给 VPSS
|
▼
8. VPSS 模块(&rkvpss)
- 作用:视频后处理(缩放、裁剪、旋转、格式转换等)
|
▼
9. VPSS 虚拟通道 0(&rkvpss_vir0)
- 作用:作为 VPSS 的一个输出通道,数据可送到显示、编码器或文件输出
图形化链路示意

5987

被折叠的 条评论
为什么被折叠?



