RK3562:MIPI多摄配置

前面介绍了RK3562有2路MIPI DPHY,4个MIPI CSI HOST,意味着最多的情况下,RK3562可以同时接入4个2lane的MIPI摄像头。这里介绍一下4路MIPI同时接入的时候,dts需要如何配置。

目录

(1)多摄连接框图

①2x4lane 双摄连接框图

② 4x2lane 四摄连接框图

(2)多摄DTS配置

①dts配置

②XML对应配置

③cameraHAL添加多路支持

(3)总结


(1)多摄连接框图

①2x4lane 双摄连接框图

当RK3562接入两个4lane的摄像头,对应的连接框图如下:

dts按照上图进行配置即可,需要注意的是当多摄同时接入isp的时候,ISP必须使用回读模式,也就是必须将aiq运行起来,因此驱动注册成功之后,可以先在RKCIF的节点抓数据流确定驱动是否正常,或者单摄的场景下确认是否正常。

② 4x2lane 四摄连接框图

当RK3562同时接入4个2lane的摄像头时,对应的连接框图如下:

 硬件连接需要注意:两个DPHY采用split mode的分割模式。

(2)多摄DTS配置

①dts配置

这边主要介绍一下4路2lane的摄像头同时接入的场景下的dts配置,参考如下:

&csi2_dphy1 {
	status = "okay";

	ports {
		#address-cells = <1>;
		#size-cells = <0>;
		port@0 {
			reg = <0>;
			#address-cells = <1>;
			#size-cells = <0>;

			mipi_in_ucam0: endpoint@1 {
				reg = <1>;
				remote-endpoint = <&gc8034_out0>;
				data-lanes = <1 2>;
			};
		};
		port@1 {
			reg = <1>;
			#address-cells = <1>;
			#size-cells = <0>;

			csidphy1_out: endpoint@0 {
				reg = <0>;
				remote-endpoint = <&mipi0_csi2_input>;
			};
		};
	};
};

&csi2_dphy2 {
	status = "okay";

	ports {
		#address-cells = <1>;
		#size-cells = <0>;
		port@0 {
			reg = <0>;
			#address-cells = <1>;
			#size-cells = <0>;

			mipi_in_ucam2: endpoint@1 {
				reg = <1>;
				remote-endpoint = <&ov5695_out0>;
				data-lanes = <1 2>;
			};
		};
		port@1 {
			reg = <1>;
			#address-cells = <1>;
			#size-cells = <0>;

			csidphy2_out: endpoint@0 {
				reg = <0>;
				remote-endpoint = <&mipi1_csi2_input>;
			};
		};
	};
};

&csi2_dphy4 {
	status = "okay";

	ports {
		#address-cells = <1>;
		#size-cells = <0>;
		port@0 {
			reg = <0>;
			#address-cells = <1>;
			#size-cells = <0>;

			mipi_in_ucam1: endpoint@1 {
				reg = <1>;
				remote-endpoint = <&gc8034_out1>;
				data-lanes = <1 2>;
			};
		};
		port@1 {
			reg = <1>;
			#address-cells = <1>;
			#size-cells = <0>;

			csidphy4_out: endpoint@0 {
				reg = <0>;
				remote-endpoint = <&mipi2_csi2_input>;
			};
		};
	};
};

&csi2_dphy5 {
	status = "okay";

	ports {
		#address-cells = <1>;
		#size-cells = <0>;
		port@0 {
			reg = <0>;
			#address-cells = <1>;
			#size-cells = <0>;

			mipi_in_ucam3: endpoint@1 {
				reg = <1>;
				remote-endpoint = <&ov5695_out1>;
				data-lanes = <1 2>;
			};
		};
		port@1 {
			reg = <1>;
			#address-cells = <1>;
			#size-cells = <0>;

			csidphy5_out: endpoint@0 {
				reg = <0>;
				remote-endpoint = <&mipi3_csi2_input>;
			};
		};
	};
};

&i2c4 {
	status = "okay";

	dw9714: dw9714@c {
		compatible = "dongwoon,dw9714";
		status = "okay";
		reg = <0x0c>;
		rockchip,vcm-start-current = <10>;
		rockchip,vcm-rated-current = <85>;
		rockchip,vcm-step-mode = <5>;
		rockchip,camera-module-index = <0>;
		rockchip,camera-module-facing = "back";
	};

	gc8034: gc8034@37 {
		compatible = "galaxycore,gc8034";
		reg = <0x37>;
		clocks = <&cru CLK_CAM0_OUT2IO>;
		clock-names = "xvclk";
		pinctrl-names = "default";
		pinctrl-0 = <&camm0_clk0_out>;
		reset-gpios = <&gpio4 RK_PB6 GPIO_ACTIVE_LOW>;
		pwdn-gpios = <&gpio3 RK_PC0 GPIO_ACTIVE_LOW>;
		// dvdd-supply = <&vcc_mipicsi0>;
		rockchip,camera-module-index = <0>;
		rockchip,camera-module-facing = "back";
		rockchip,camera-module-name = "RK-CMK-8M-2-v1";
		rockchip,camera-module-lens-name = "CK8401";
		lens-focus = <&dw9714>;
		port {
			gc8034_out0: endpoint {
				remote-endpoint = <&mipi_in_ucam0>;
				data-lanes = <1 2>;
			};
		};
	};

	ov5695: ov5695@36 {
		compatible = "ovti,ov5695";
		reg = <0x36>;
		clocks = <&cru CLK_CAM1_OUT2IO>;
		clock-names = "xvclk";
		pinctrl-names = "default";
		pinctrl-0 = <&camm0_clk1_out>;
		reset-gpios = <&gpio3 RK_PD3 GPIO_ACTIVE_HIGH>;
		pwdn-gpios = <&gpio3 RK_PD1 GPIO_ACTIVE_HIGH>;
		// dvdd-supply = <&vcc_mipicsi2>;
		rockchip,camera-module-index = <2>;
		rockchip,camera-module-facing = "back";
		rockchip,camera-module-name = "TongJu";
		rockchip,camera-module-lens-name = "CHT842-MD";
		port {
			ov5695_out0: endpoint {
				remote-endpoint = <&mipi_in_ucam2>;
				data-lanes = <1 2>;
			};
		};
	};
};

&i2c5 {
	status = "okay";

	dw9714_1: dw9714_1@c {
		compatible = "dongwoon,dw9714";
		status = "okay";
		reg = <0x0c>;
		rockchip,vcm-start-current = <10>;
		rockchip,vcm-rated-current = <85>;
		rockchip,vcm-step-mode = <5>;
		rockchip,camera-module-index = <1>;
		rockchip,camera-module-facing = "front";
	};

	gc8034_1: gc8034_1@37 {
		compatible = "galaxycore,gc8034";
		reg = <0x37>;
		clocks = <&cru CLK_CAM2_OUT2IO>;
		clock-names = "xvclk";
		pinctrl-names = "default";
		pinctrl-0 = <&cam_clk2_out>;
		reset-gpios = <&gpio4 RK_PB5 GPIO_ACTIVE_LOW>;
		pwdn-gpios = <&gpio3 RK_PC1 GPIO_ACTIVE_LOW>;
		// dvdd-supply = <&vcc_mipicsi1>;
		rockchip,camera-module-index = <1>;
		rockchip,camera-module-facing = "back";
		rockchip,camera-module-name = "RK-CMK-8M-2-v1";
		rockchip,camera-module-lens-name = "CK8401-1";
		lens-focus = <&dw9714_1>;
		port {
			gc8034_out1: endpoint {
				remote-endpoint = <&mipi_in_ucam1>;
				data-lanes = <1 2>;
			};
		};
	};

	ov5695_1: ov5695-1@36 {
		compatible = "ovti,ov5695";
		reg = <0x36>;
		clocks = <&cru CLK_CAM3_OUT2IO>;
		clock-names = "xvclk";
		pinctrl-names = "default";
		pinctrl-0 = <&cam_clk3_out>;
		reset-gpios = <&gpio3 RK_PD2 GPIO_ACTIVE_HIGH>;
		pwdn-gpios = <&gpio3 RK_PD0 GPIO_ACTIVE_HIGH>;
		// dvdd-supply = <&vcc_mipicsi2>;
		rockchip,camera-module-index = <3>;
		rockchip,camera-module-facing = "back";
		rockchip,camera-module-name = "TongJu";
		rockchip,camera-module-lens-name = "CHT842-MD-1";
		port {
			ov5695_out1: endpoint {
				remote-endpoint = <&mipi_in_ucam3>;
				data-lanes = <1 2>;
			};
		};
	};
};

&csi2_dphy0_hw {
	status = "okay";
};

&csi2_dphy1_hw {
	status = "okay";
};

&mipi0_csi2 {
	status = "okay";

	ports {
		#address-cells = <1>;
		#size-cells = <0>;

		port@0 {
			reg = <0>;
			#address-cells = <1>;
			#size-cells = <0>;

			mipi0_csi2_input: endpoint@1 {
				reg = <1>;
				remote-endpoint = <&csidphy1_out>;
			};
		};

		port@1 {
			reg = <1>;
			#address-cells = <1>;
			#size-cells = <0>;

			mipi0_csi2_output: endpoint@0 {
				reg = <0>;
				remote-endpoint = <&cif_mipi_in0>;
			};
		};
	};
};

&mipi1_csi2 {
	status = "okay";

	ports {
		#address-cells = <1>;
		#size-cells = <0>;

		port@0 {
			reg = <0>;
			#address-cells = <1>;
			#size-cells = <0>;

			mipi1_csi2_input: endpoint@1 {
				reg = <1>;
				remote-endpoint = <&csidphy2_out>;
			};
		};

		port@1 {
			reg = <1>;
			#address-cells = <1>;
			#size-cells = <0>;

			mipi1_csi2_output: endpoint@0 {
				reg = <0>;
				remote-endpoint = <&cif_mipi_in1>;
			};
		};
	};
};

&mipi2_csi2 {
	status = "okay";

	ports {
		#address-cells = <1>;
		#size-cells = <0>;

		port@0 {
			reg = <0>;
			#address-cells = <1>;
			#size-cells = <0>;

			mipi2_csi2_input: endpoint@1 {
				reg = <1>;
				remote-endpoint = <&csidphy4_out>;
			};
		};

		port@1 {
			reg = <1>;
			#address-cells = <1>;
			#size-cells = <0>;

			mipi2_csi2_output: endpoint@0 {
				reg = <0>;
				remote-endpoint = <&cif_mipi_in2>;
			};
		};
	};
};

&mipi3_csi2 {
	status = "okay";

	ports {
		#address-cells = <1>;
		#size-cells = <0>;

		port@0 {
			reg = <0>;
			#address-cells = <1>;
			#size-cells = <0>;

			mipi3_csi2_input: endpoint@1 {
				reg = <1>;
				remote-endpoint = <&csidphy5_out>;
			};
		};

		port@1 {
			reg = <1>;
			#address-cells = <1>;
			#size-cells = <0>;

			mipi3_csi2_output: endpoint@0 {
				reg = <0>;
				remote-endpoint = <&cif_mipi_in3>;
			};
		};
	};
};

&rkcif {
	status = "okay";
};

&rkcif_mipi_lvds {
	status = "okay";

	port {
		cif_mipi_in0: endpoint {
			remote-endpoint = <&mipi0_csi2_output>;
		};
	};
};

&rkcif_mipi_lvds1 {
	status = "okay";

	port {
		cif_mipi_in1: endpoint {
			remote-endpoint = <&mipi1_csi2_output>;
		};
	};
};

&rkcif_mipi_lvds2 {
	status = "okay";

	port {
		cif_mipi_in2: endpoint {
			remote-endpoint = <&mipi2_csi2_output>;
		};
	};
};

&rkcif_mipi_lvds3 {
	status = "okay";

	port {
		cif_mipi_in3: endpoint {
			remote-endpoint = <&mipi3_csi2_output>;
		};
	};
};

&rkcif_mipi_lvds_sditf {
	status = "okay";

	port {
		mipi_lvds_sditf: endpoint {
			remote-endpoint = <&isp_vir0>;
		};
	};
};

&rkcif_mipi_lvds1_sditf {
	status = "okay";

	port {
		mipi_lvds1_sditf: endpoint {
			remote-endpoint = <&isp_vir1>;
		};
	};
};

&rkcif_mipi_lvds2_sditf {
	status = "okay";

	port {
		mipi_lvds2_sditf: endpoint {
			remote-endpoint = <&isp_vir2>;
		};
	};
};

&rkcif_mipi_lvds3_sditf {
	status = "okay";

	port {
		mipi_lvds3_sditf: endpoint {
			remote-endpoint = <&isp_vir3>;
		};
	};
};

&rkcif_mmu {
	status = "okay";
};

&rkisp {
	status = "okay";
};

&rkisp_mmu {
	status = "okay";
};

&rkisp_vir0 {
	status = "okay";

	port {
		#address-cells = <1>;
		#size-cells = <0>;

		isp_vir0: endpoint@0 {
			reg = <0>;
			remote-endpoint = <&mipi_lvds_sditf>;
		};
	};
};

&rkisp_vir1 {
	status = "okay";

	port {
		#address-cells = <1>;
		#size-cells = <0>;

		isp_vir1: endpoint@0 {
			reg = <0>;
			remote-endpoint = <&mipi_lvds1_sditf>;
		};
	};
};

&rkisp_vir2 {
	status = "okay";

	port {
		#address-cells = <1>;
		#size-cells = <0>;

		isp_vir2: endpoint@0 {
			reg = <0>;
			remote-endpoint = <&mipi_lvds2_sditf>;
		};
	};
};

&rkisp_vir3 {
	status = "okay";

	port {
		#address-cells = <1>;
		#size-cells = <0>;

		isp_vir3: endpoint@0 {
			reg = <0>;
			remote-endpoint = <&mipi_lvds3_sditf>;
		};
	};
};

②XML对应配置

xml需要配置4路,主要关键如下:

<Profiles cameraId="0" name="gc8034" moduleId="m00">
......
<aiq.multicamera value="true"/> <!-- true or false -->
<Profiles cameraId="0" name="gc8034" moduleId="m01">
......
<aiq.multicamera value="true"/> <!-- true or false -->
<Profiles cameraId="0" name="ov5695" moduleId="m02">
......
<aiq.multicamera value="true"/> <!-- true or false -->
<Profiles cameraId="0" name="ov5695" moduleId="m03">
......
<aiq.multicamera value="true"/> <!-- true or false -->

③cameraHAL添加多路支持

cameraHAL默认只支持2路,需要添加多路的支持:

diff --git a/psl/rkisp2/RKISP2PSLConfParser.cpp b/psl/rkisp2/RKISP2PSLConfParser.cpp
old mode 100644
new mode 100755
index 0e835ca..3e12530
--- a/psl/rkisp2/RKISP2PSLConfParser.cpp
+++ b/psl/rkisp2/RKISP2PSLConfParser.cpp
@@ -1297,7 +1297,7 @@ std::string RKISP2PSLConfParser::getImguMediaDevice(int cameraId,std::shared_ptr
     HAL_TRACE_CALL(CAM_GLBL_DBG_HIGH);
     std::vector<std::string> mediaDevicePaths;
     std::vector<std::string> mediaDevicePath;
-    std::vector<std::string> mediaDeviceNames {"rkisp1","rkisp0"};
+    std::vector<std::string> mediaDeviceNames {"rkisp3","rkisp2","rkisp1","rkisp0"};
 //    for (auto it : mediaDeviceNames) {
 //        mediaDevicePath = getMediaDeviceByModuleName(it);
 //        LOGD("@%s : %s,mediaDevicePathSize:%d", __FUNCTION__,it.c_str(),mediaDevicePath.size());

(3)总结

RK3562多MIPI摄像头主要配置分享完毕。

### RK3562 MIPI 触摸屏驱动支持与配置 对于RK3562芯片,MIPI触摸屏的支持和配置过程与其他RK356x系列芯片相似。为了确保触摸屏能够正常工作,在设备树(Device Tree Source, DTS)文件中需要正确设置触摸屏的相关参数。 #### 设备树中的触摸屏节点配置 在DTS文件中定义触摸屏的具体属性非常重要。这些属性通常包括但不限于: - `compatible`: 定义使用的具体触摸控制器型号。 - `reg`: I/O地址范围或其他硬件资源分配。 - `interrupt-parent` 和 `interrupts`: 中断父节点及中断线编号。 - `touch-gpio`, `reset-gpio`: GPIO引脚用于控制触摸屏的中断信号和复位操作[^1]。 - `tp-size`: 描述触摸板尺寸信息。 - `max-x`, `max-y`: 屏幕X轴Y轴的最大分辨率值[^3]。 ```c &i2c0 { status = "okay"; gt9xx: touchscreen@5d { compatible = "goodix,gt9xx"; reg = <0x5d>; interrupt-parent = <&gpio1>; interrupts = <7 IRQ_TYPE_LEVEL_LOW>; /* GPIO1_7 */ reset-gpios = <&gpio1 8 GPIO_ACTIVE_HIGH>; /* GPIO1_8 */ max-x = <1080>; max-y = <1920>; tp-size = <...>; }; }; ``` 这段代码展示了如何在一个假设性的I²C总线上挂载Goodix GT9XX触控IC作为子节点,并指定了必要的GPIO连接和其他特性。实际应用时应根据具体的硬件设计调整相应的寄存器地址、GPIO编号以及其他特定于所选传感器的数据字段。 #### 驱动程序加载验证 当内核成功加载并初始化了触摸屏驱动之后,日志输出应当包含来自该模块的消息,比如版本字符串或是探测(`probe`)成功的提示。这表明系统已经识别到了外接的触摸装置并且尝试启动其对应的固件或软件栈。 如果遇到任何问题,如无法看到预期的日志条目,则可能是由于DTS设定不准确造成的;此时建议仔细对照官方文档和技术手册来修正错误之处。 #### 坐标映射校准 有时即使触摸功能可用,也可能存在坐标系错乱的情况——即手指点击的位置未能精确对应到屏幕上相应的地方。针对这类现象,可以通过调用制造商提供的工具命令(例如`gtp_change_x2y`),或者直接编辑内核源码里的某些宏定义来进行手动干预,从而实现更精准的操作体验优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人生苦短,菜的抠脚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值