由于 GC2145.c 只用一根 lane(D2) ,所以设备树也配置为只用一根lane(D2也就是1)

注释现有的摄像头模块

CONFIG_VIDEO_GC2053=m
CONFIG_VIDEO_IMX415=m
CONFIG_VIDEO_OS04A10=m
CONFIG_VIDEO_SC200AI=m
CONFIG_VIDEO_SC3336=m
CONFIG_VIDEO_SC401AI=m
CONFIG_VIDEO_SC4336=m
CONFIG_VIDEO_SC450AI=m
CONFIG_VIDEO_SC530AI=m
#CONFIG_VIDEO_GC2053 is not set
#CONFIG_VIDEO_IMX415 is not set
#CONFIG_VIDEO_OS04A10= is not set
#CONFIG_VIDEO_SC200AI= is not set
#CONFIG_VIDEO_SC3336= is not set
#CONFIG_VIDEO_SC401AI= is not set
#CONFIG_VIDEO_SC4336= is not set
#CONFIG_VIDEO_SC450AI= is not set
#CONFIG_VIDEO_SC530AI= is not set

启用GC2145模块

内核配置文件,rv1106-evb.config(推荐)或者rv1106_defconfig加上

CONFIG_VIDEO_GC2145=m
配置状态作用
CONFIG_VIDEO_GC2145=mGC2145 传感器
CONFIG_VIDEO_ROCKCHIP_CIF=mCIF 视频采集
CONFIG_VIDEO_ROCKCHIP_ISP=mISP 图像处理
CONFIG_ROCKCHIP_DVBM=mISP 依赖的缓冲管理
CONFIG_PHY_ROCKCHIP_CSI2_DPHY=mMIPI DPHY 硬件驱动

开机自动挂载GC2145

/sysdrv/drv_ko/insmod_ko.sh
#__insmod imx415.ko
#__insmod os04a10.ko
#__insmod sc4336.ko
#__insmod sc3336.ko
#__insmod sc530ai.ko
#__insmod gc2053.ko
#__insmod sc200ai.ko
#__insmod sc401ai.ko
#__insmod sc450ai.ko

__insmod gc2145.ko

配置GC2145设备树

jw_rv1106-mipi-csi.dtsi

// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
/*
 * GC2145 MIPI CSI Camera on RV1106 — 完全对照可用 DTB
 *
 * 通路: GC2145 → csi2-dphy2 → mipi1-csi2 → rkcif-mipi-lvds1
 * GC2145 输出 UYVY, 不走 ISP
 */

/* I2C4 M2:SCL=GPIO3_C7(Pin5), SDA=GPIO3_D0(Pin7) */
&i2c4 {
	status = "okay";
	clock-frequency = <400000>;
	pinctrl-names = "default";
	pinctrl-0 = <&i2c4m2_xfer>;

	gc2145: gc2145@3c {
		compatible = "galaxycore,gc2145";
		status = "okay";
		reg = <0x3c>;
		orientation=<90>;
		clocks = <&cru MCLK_REF_MIPI0>;
		clock-names = "xvclk";

		reset-gpios = <&gpio3 RK_PC5 GPIO_ACTIVE_LOW>;

		pinctrl-names = "default";
		pinctrl-0 = <&mipi_refclk_out0>;

		rockchip,camera-module-index = <0>;
		rockchip,camera-module-facing = "back";
		rockchip,camera-module-name = "CMK-OT2115-PC1";
		rockchip,camera-module-lens-name = "30IRC-F16";

		port {
			gc2145_out: endpoint {
				remote-endpoint = <&csi_dphy2_input>;
				data-lanes = <1>;
			};
		};
	};
};

/* csi2-dphy2 — 对照可用 DTB */
&csi2_dphy_hw {
	status = "okay";
};

&csi2_dphy2 {
	status = "okay";

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

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

			csi_dphy2_input: endpoint@2 {
				reg = <2>;
				remote-endpoint = <&gc2145_out>;
				data-lanes = <1>;
			};
		};

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

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

/* mipi1-csi2 — 对照可用 DTB */
&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 = <&csi_dphy2_output>;
			};
		};

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

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

&rkcif {
	status = "okay";
	pinctrl-names = "default";
	pinctrl-0 = <&mipi_pins>;
};

&rkcif_mipi_lvds1 {
	status = "okay";

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

测试

读一帧数据

#设备支持的分辨率
v4l2-ctl -d /dev/video0 --list-formats-ext
#读一帧数据
v4l2-ctl -d /dev/video0 --set-fmt-video=width=800,height=600,pixelformat=YUYV --stream-mmap --stream-count=1 --stream-to=frame.raw

GC2145 IQ 文件配置

GC2145 → MIPI CSI → rkcif(采集) → rkisp(ISP处理) → /dev/video0 (YUV)
                         ↓ 不经过 ISP
                    /dev/video0 (RAW Bayer)
  • 路径一:走 ISP → YUV 输出(当前 DTSI 的配置)

    GC2145 → ... → rkcif → rkisp → rkisp_vir0 → /dev/video0
                                                  YUYV 格式
    
    • ✅ 自动做 AWB/AE/去马赛克/降噪
    • ✅ 应用层直接读 YUV 画质可用
    • 需要 IQ 文件,否则颜色偏绿/偏紫、曝光不对
    • 需要 build_media(AIQ 用户态库负责加载 IQ 文件并控制 ISP 参数)

    路径二:不经过 ISP → RAW 输出(不需要任何 IQ)

    GC2145 → ... → rkcif → /dev/video0
                             RAW Bayer (GBRG)
    
    • 不需要 IQ 文件
    • 不需要 build_media(完全在内核里完成)
    • 拿到的是 RAW Bayer 数据,需要自己在 app 里做去马赛克、白平衡
    • 如果要显示彩色图像,应用层工作量比较大