发现很多人不会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就配置好了。