发现很多人不会RK3588DVP摄像头的驱动配置,这里简单分享一下,各位老铁点个赞,一键三连,给点动力。 这篇主要讲一下DTS设备树的配置,下篇写具体的驱动设计。
因为瑞芯微的大部分芯片都支持DVP摄像头,配置都大同小异,这里以当下最流行的RK3588为例,从文档资料中我们可以看到对DVP的支持能力。
重点看看dts中如何实现的。
先看下rk3588_sdk/kernel/arch/arm64/boot/dts/rockchip/rk3588s-pinctrl.dtsi。这是管脚信息描述。其中有cif。在瑞芯微的早期芯片都是用的cif接口来描述,实际就是连接的dvp接口。
这里可以看到cif_dvp_bus8和cif_dvp_bus16,即8位数据线和16位数据线。如果是8位线宽,一般就是YUYV、UYVY来传输数据,如果是16位线宽,一般就是8位Y数据,8位UV数据传输。
cif {/omit-if-no-ref/cif_clk: cif-clk {rockchip,pins =/* cif_clkout */<4 RK_PB4 1 &pcfg_pull_none>;};/omit-if-no-ref/cif_dvp_clk: cif-dvp-clk {rockchip,pins =/* cif_clkin */<4 RK_PB0 1 &pcfg_pull_none>,/* cif_href */<4 RK_PB2 1 &pcfg_pull_none>,/* cif_vsync */<4 RK_PB3 1 &pcfg_pull_none>;};/omit-if-no-ref/cif_dvp_bus16: cif-dvp-bus16 {rockchip,pins =/* cif_d8 */<3 RK_PC4 1 &pcfg_pull_none>,/* cif_d9 */<3 RK_PC5 1 &pcfg_pull_none>,/* cif_d10 */<3 RK_PC6 1 &pcfg_pull_none>,/* cif_d11 */<3 RK_PC7 1 &pcfg_pull_none>,/* cif_d12 */<3 RK_PD0 1 &pcfg_pull_none>,/* cif_d13 */<3 RK_PD1 1 &pcfg_pull_none>,/* cif_d14 */<3 RK_PD2 1 &pcfg_pull_none>,/* cif_d15 */<3 RK_PD3 1 &pcfg_pull_none>;};/omit-if-no-ref/cif_dvp_bus8: cif-dvp-bus8 {rockchip,pins =/* cif_d0 */<4 RK_PA0 1 &pcfg_pull_none>,/* cif_d1 */<4 RK_PA1 1 &pcfg_pull_none>,/* cif_d2 */<4 RK_PA2 1 &pcfg_pull_none>,/* cif_d3 */<4 RK_PA3 1 &pcfg_pull_none>,/* cif_d4 */<4 RK_PA4 1 &pcfg_pull_none>,/* cif_d5 */<4 RK_PA5 1 &pcfg_pull_none>,/* cif_d6 */<4 RK_PA6 1 &pcfg_pull_none>,/* cif_d7 */<4 RK_PA7 1 &pcfg_pull_none>;};};
在实际的传输中,还有内同步外同步的区别,这根据使用的摄像头来。
下面就是核心的配置了。挂载在i2c下,不管摄像头有没有用到i2c,必须挂载在i2c下,因为驱动的设计就是这样的,走这个总线最方便。
&i2c1 {status = "okay";pinctrl-names = "default";pinctrl-0 = <&i2c1m2_xfer>;gc2145: gc2145@30 {status = "okay";compatible = "galaxycore,gc2145";reg = <0x30>;clocks = <&cru CLK_CIFOUT_OUT>;clock-names = "xvclk";power-domains = <&power RK3588_PD_VI>;pinctrl-names = "default";pinctrl-0 = <&cif_dvp_clk &cif_dvp_bus8>;rockchip,camera-module-index = <1>;rockchip,camera-module-facing = "front";rockchip,camera-module-name = "CameraKing";rockchip,camera-module-lens-name = "Largan";port {gc2145_out: endpoint {remote-endpoint = <&dvp_in_bcam1>;};};};
};&rkcif {status = "okay";
};&rkcif_dvp {status = "okay";ports {#address-cells = <1>;#size-cells = <0>;port@0 {#address-cells = <1>;#size-cells = <0>;/* Parallel bus endpoint */dvp_in_bcam1: endpoint@1 {reg = <1>;remote-endpoint = <&gc2145_out>;bus-width = <8>;/*16*/vsync-active = <0>;hsync-active = <1>;};};};
};&rkcif_mmu {status = "okay";
};
DVP摄像头的dts不用配置data-lanes。
vsync-active = <0>;
hsync-active = <1>;
指定 vsync, hsync 行场同步信号的有效状态,其中 0 表示低电平有效, 1 表示高电平有效。
这里使用的8位线宽配置。
这样DVP摄像头的dts就配置好了。