项目场景:rk3588s-摄像头适配gc8034
DTS配置:
原理图查看
DTS的适配要根据硬件实际原理图的接线方式去进行配置,首先要根据硬件工程师提供的原理图来确定如下几个关键信息:
硬件适用是哪路MIPI信号以及对应的phy,RK3588有MIPI_DPHY和MIPI_D/CPHY;备注:其中MIPI_D/CPHY对时序要求比较严格,如果做4lane的话一般建议是接到MIPI_DPHY这路;
确定配置是几lane信号,一般是2lane或者4lane;
确定24M mlk的输出引脚,一般MIPI摄像头的24M的mlk是有soc的pin脚输出的;
确定DTS要配置引脚,主要包括Power en脚以及sensor的复位引脚。
DTSI配置
RK3588或者RK3588S有路MIPI-PHY,驱动开发工程师需要根据对应的硬件原图进行配置,以下会讲解分别使用MIPI-DPHY和MIPI-D/CPHY如何在DTS配置mipi摄像头的回环链路。
如硬件设计接到MIPI-DPH0 RX这里,4lane配置,
/********对应的phy要使能****/
&csi2_dphy0 {
status = "okay";
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
#address-cells = <1>;
#size-cells = <0>;
dphy0_in: endpoint@1 {
reg = <1>;
remote-endpoint = <&gc8034_out>;
data-lanes = <1 2 3 4>;
};
};
port@1 {
reg = <1>;
#address-cells = <1>;
#size-cells = <0>;
csidphy0_out: endpoint@0 {
reg = <0>;
remote-endpoint = <&mipi2_csi2_input>;
};
};
};
};
&csi2_dphy0_hw {
status = "okay";
};
/*******配置mipi isp**********/
&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 = <&csidphy0_out>;
};
};
port@1 {
reg = <1>;
#address-cells = <1>;
#size-cells = <0>;
mipi2_csi2_output: endpoint@0 {
reg = <0>;
remote-endpoint = <&cif_mipi2_in0>;
};
};
};
};
&rkcif {
status = "okay";
};
&rkcif_mipi_lvds2 {
status = "okay";
port {
cif_mipi2_in0: endpoint {
remote-endpoint = <&mipi2_csi2_output>;
};
};
};
&rkcif_mipi_lvds2_sditf {
status = "okay";
port {
mipi_lvds2_sditf: endpoint {
remote-endpoint = <&isp0_vir0>;
};
};
};
&rkcif_mmu {
status = "okay";
};
&rkisp0 {
status = "okay";
};
&isp0_mmu {
status = "okay";
};
&rkisp0_vir0 {
status = "okay";
port {
#address-cells = <1>;
#size-cells = <0>;
isp0_vir0: endpoint@0 {
reg = <0>;
remote-endpoint = <&mipi_lvds2_sditf>;
};
};
};
如硬件设计接到MIPI-D/CPHY0 RX这里,4lane配置,需要按如下配置:
&csi2_dcphy0 {
status = "okay";
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
#address-cells = <1>;
#size-cells = <0>;
dcphy0_in: endpoint@1 {
reg = <1>;
remote-endpoint = <&gc8034_out>;
data-lanes = <1 2 3 4>;
};
};
port@1 {
reg = <1>;
#address-cells = <1>;
#size-cells = <0>;
csidcphy0_out: endpoint@0 {
reg = <0>;
remote-endpoint = <&mipi0_csi2_input>;
};
};
};
};
&mipi_dcphy0 {
status = "okay";
};
/*******配置mipi isp**********/
&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 = <&csidcphy0_out>;
};
};
port@1 {
reg = <1>;
#address-cells = <1>;
#size-cells = <0>;
mipi0_csi2_output: endpoint@0 {
reg = <0>;
remote-endpoint = <&cif_mipi_in0>;
};
};
};
};
&rkcif {
status = "okay";
};
&rkcif_mipi_lvds {
status = "okay";
port {
cif_mipi_in0: endpoint {
remote-endpoint = <&mipi0_csi2_output>;
};
};
};
&rkcif_mipi_lvds_sditf {
status = "okay";
port {
mipi_lvds_sditf: endpoint {
remote-endpoint = <&isp0_vir0>;
};
};
};
&rkcif_mmu {
status = "okay";
};
&rkisp0 {
status = "okay";
};
&isp0_mmu {
status = "okay";
};
&rkisp0_vir0 {
status = "okay";
port {
#address-cells = <1>;
#size-cells = <0>;
isp0_vir0: endpoint@0 {
reg = <0>;
remote-endpoint = <&mipi_lvds_sditf>;
};
};
};
DTS中对应的Sensor配置,需要按照硬件连接的对应I2C,以及对应的Power en脚和reset引脚进行配置:
具体参考配置如下,不同的sensor可能配置有差异,如马达控制等。
&i2c3 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&i2c3m0_xfer>;
gc8034: gc8034@37 {
compatible = "galaxycore,gc8034";
status = "okay";
reg = <0x37>;
clocks = <&cru CLK_MIPI_CAMARAOUT_M2>;
clock-names = "xvclk";
pinctrl-names = "default";
pinctrl-0 = <&mipim1_camera2_clk>;
power-domains = <&power RK3588_PD_VI>;
reset-gpios = <&gpio3 RK_PB1 GPIO_ACTIVE_HIGH>;
pwdn-gpios = <&gpio1 RK_PC2 GPIO_ACTIVE_HIGH>;
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";
port {
gc8034_out: endpoint {
remote-endpoint = <&dphy0_in>;
data-lanes = <1 2 3 4>;
};
};
};
};
以上配置要注意24M clk输出为SOC端pin脚输出,具体配置要根据硬件原理图(使用对应的pin脚)进行配置
如上:
clocks = <&cru CLK_MIPI_CAMARAOUT_M2>;
clock-names = "xvclk";
pinctrl-names = "default";
pinctrl-0 = <&mipim1_camera2_clk>;
具体核对需要参考rk3588s-pinctrl.dtsi中引脚pin-ctrl定义:
mipi {
/omit-if-no-ref/
mipim0_camera0_clk: mipim0-camera0-clk {
rockchip,pins =
/* mipim0_camera0_clk */
<4 RK_PB1 1 &pcfg_pull_none>;
};
/omit-if-no-ref/
mipim0_camera1_clk: mipim0-camera1-clk {
rockchip,pins =
/* mipim0_camera1_clk */
<1 RK_PB6 2 &pcfg_pull_none>;
};
/omit-if-no-ref/
mipim0_camera2_clk: mipim0-camera2-clk {
rockchip,pins =
/* mipim0_camera2_clk */
<1 RK_PB7 2 &pcfg_pull_none>;
};
/omit-if-no-ref/
mipim0_camera3_clk: mipim0-camera3-clk {
rockchip,pins =
/* mipim0_camera3_clk */
<1 RK_PD6 2 &pcfg_pull_none>;
};
/omit-if-no-ref/
mipim0_camera4_clk: mipim0-camera4-clk {
rockchip,pins =
/* mipim0_camera4_clk */
<1 RK_PD7 2 &pcfg_pull_none>;
};
/omit-if-no-ref/
mipim1_camera0_clk: mipim1-camera0-clk {
rockchip,pins =
/* mipim1_camera0_clk */
<3 RK_PA5 4 &pcfg_pull_none>;
};
/omit-if-no-ref/
mipim1_camera1_clk: mipim1-camera1-clk {
rockchip,pins =
/* mipim1_camera1_clk */
<3 RK_PA6 4 &pcfg_pull_none>;
};
/omit-if-no-ref/
mipim1_camera2_clk: mipim1-camera2-clk {
rockchip,pins =
/* mipim1_camera2_clk */
<3 RK_PA7 4 &pcfg_pull_none>;
};
/omit-if-no-ref/
mipim1_camera3_clk: mipim1-camera3-clk {
rockchip,pins =
/* mipim1_camera3_clk */
<3 RK_PB0 4 &pcfg_pull_none>;
};
/omit-if-no-ref/
mipim1_camera4_clk: mipim1-camera4-clk {
rockchip,pins =
/* mipim1_camera4_clk */
<3 RK_PB1 4 &pcfg_pull_none>;
};
/omit-if-no-ref/
mipi_te0: mipi-te0 {
rockchip,pins =
/* mipi_te0 */
<3 RK_PC2 2 &pcfg_pull_none>;
};
/omit-if-no-ref/
mipi_te1: mipi-te1 {
rockchip,pins =
/* mipi_te1 */
<3 RK_PC3 2 &pcfg_pull_none>;
};
};
注意:DTS配置中还需要核对使用的24M时钟pin、Power en pin以及reset pin是否有gpio复用情况。
24M时钟可以让硬件工程师使用示波器进行测试是否有波形输出,24M是否稳定输出。GPIO情况可以使用以下命令软件进行查看:
console:/ # cat /d/gpio
gpiochip0: GPIOs 0-31, parent: platform/fd8a0000.gpio, gpio0:
gpio-3 ( |vsel ) out lo
gpio-17 ( |vsel ) out lo
gpio-21 ( |bt_default_wake_host) in hi
gpio-22 ( |bt_default_wake ) out hi
gpio-23 ( |reset ) out hi ACTIVE LOW
gpio-27 ( |ts_irq_gpio ) in hi
gpio-28 ( |bt_default_reset ) out hi
gpio-30 ( |vsel ) out lo
gpiochip1: GPIOs 32-63, parent: platform/fec20000