由于 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=m | ✅ | GC2145 传感器 |
CONFIG_VIDEO_ROCKCHIP_CIF=m | ✅ | CIF 视频采集 |
CONFIG_VIDEO_ROCKCHIP_ISP=m | ✅ | ISP 图像处理 |
CONFIG_ROCKCHIP_DVBM=m | ✅ | ISP 依赖的缓冲管理 |
CONFIG_PHY_ROCKCHIP_CSI2_DPHY=m | ✅ | MIPI 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 里做去马赛克、白平衡
- 如果要显示彩色图像,应用层工作量比较大