前面介绍了RK3562有2路MIPI DPHY,4个MIPI CSI HOST,意味着最多的情况下,RK3562可以同时接入4个2lane的MIPI摄像头。这里介绍一下4路MIPI同时接入的时候,dts需要如何配置。
目录
(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摄像头主要配置分享完毕。