RK3506 RGB屏幕

说明

调试RGB屏幕,串口屏,大的步骤还是先配置背光,再配置RGB的显示。

步骤

1. 配置背光

有个背光en脚,高电平有效。原理图如下:

alt text

发现背光的en脚,是mipi屏幕的传输脚,第一次遇到这种情况。按理说差分的PAD一般只有他自己的差分的功能的。

alt text

这个脚搞的半天,iomux查看复用是正常的,sysfs导出控制是正常的,可以控制背光,但是到内核控制就不行了,查看cat /sys/kernel/debug/gpio 也一直是低。

root@rk3506-buildroot:/# cat /sys/kernel/debug/gpio
gpiochip0: GPIOs 0-31, parent: platform/ff940000.gpio, gpio0:
 gpio-1   (                    |enable              ) out lo ACTIVE LOW
 gpio-2   (                    |qywatchdog          ) out lo ACTIVE LOW
 gpio-7   (                    |reset               ) out hi ACTIVE LOW
 gpio-8   (                    |rs485-de            ) out lo
 gpio-11  (                    |rs485-de            ) out lo

gpiochip1: GPIOs 32-63, parent: platform/ff870000.gpio, gpio1:
 gpio-36  (                    |pwr4g_3v3-regulator ) out lo
 gpio-48  (                    |spk_pwren-regulator ) out lo

gpiochip2: GPIOs 64-95, parent: platform/ff1c0000.gpio, gpio2:

gpiochip3: GPIOs 96-127, parent: platform/ff1d0000.gpio, gpio3:
 gpio-109 (                    |vcc3v3regulator     ) out hi

gpiochip4: GPIOs 128-159, parent: platform/ff1e0000.gpio, gpio4:
 gpio-128 (                    |led_run             ) out lo ACTIVE LOW
 gpio-129 (                    |enable              ) out lo

到最后发现不是内核不控制,而是 RGB的panel节点没起来,导致背光节点 backlight 起开之后,自动关闭了,就是只注册了背光节点,然后RGB没起来就把背光给power off了。 cat /sys/kernel/debug/gpio 这个命令查看引脚一直是低电平应该是引脚的寄存器没有配置。类似于IMX6ULL的那个引脚的问题,回环读取的寄存器配置。

设备树节点:

/ {
	backlight: backlight {
		compatible = "pwm-backlight";
		pwms = <&pwm0_4ch_2 0 25000 1>;
        pinctrl-names = "default";
        pinctrl-0 = <&backlight_en_pin>;
		enable-gpios = <&gpio4 RK_PA1 GPIO_ACTIVE_HIGH>;
		brightness-levels = <
			  0  20  20  21  21  22  22  23
			 23  24  24  25  25  26  26  27
			 27  28  28  29  29  30  30  31
			 31  32  32  33  33  34  34  35
			 35  36  36  37  37  38  38  39
			 40  41  42  43  44  45  46  47
			 48  49  50  51  52  53  54  55
			 56  57  58  59  60  61  62  63
			 64  65  66  67  68  69  70  71
			 72  73  74  75  76  77  78  79
			 80  81  82  83  84  85  86  87
			 88  89  90  91  92  93  94  95
			 96  97  98  99 100 101 102 103
			104 105 106 107 108 109 110 111
			112 113 114 115 116 117 118 119
			120 121 122 123 124 125 126 127
			128 129 130 131 132 133 134 135
			136 137 138 139 140 141 142 143
			144 145 146 147 148 149 150 151
			152 153 154 155 156 157 158 159
			160 161 162 163 164 165 166 167
			168 169 170 171 172 173 174 175
			176 177 178 179 180 181 182 183
			184 185 186 187 188 189 190 191
			192 193 194 195 196 197 198 199
			200 201 202 203 204 205 206 207
			208 209 210 211 212 213 214 215
			216 217 218 219 220 221 222 223
			224 225 226 227 228 229 230 231
			232 233 234 235 236 237 238 239
			240 241 242 243 244 245 246 247
			248 249 250 251 252 253 254 255
		>;
		default-brightness-level = <200>;
		status = "okay";
	};
};
&pinctrl {
    backlight {
        backlight_en_pin: backlight_en_pin {
            rockchip,pins = <4 RK_PA1 RK_FUNC_GPIO &pcfg_output_high>;
        };
    };
};

因为pwm输出到背光的供电的负极,所以 pwms = <&pwm0_4ch_2 0 25000 1>; 里面最后的极性设置为1。

使用的驱动是 drivers/video/backlight/pwm_bl.c

测试

sysfs控制:

/sys/class/backlight/backlight
echo 100 > brightness
echo 200 > brightness

2. 配置RGB屏幕节点

驱动: drivers/gpu/drm/panel/panel-simple.c

根据屏幕的 datasheet 配置 display-timings 节点即可。

设备树:

/ {
	panel: panel {
		compatible = "simple-panel";
		bus-format = <MEDIA_BUS_FMT_RGB888_1X24>;
		backlight = <&backlight>;
		enable-gpios = <&gpio0 RK_PA1 GPIO_ACTIVE_LOW>;
		enable-delay-ms = <20>;
		reset-gpios = <&gpio0 RK_PA7 GPIO_ACTIVE_LOW>;
		reset-value = <0>;
		reset-delay-ms = <10>;
		status = "okay";

		display-timings {
			native-mode = <&q7050ith2641aa1t_timing>;

			q7050ith2641aa1t_timing: timing0 {
				clock-frequency = <51200000>;
				hactive = <1024>;
				vactive = <600>;
				hback-porch = <160>;
				hfront-porch = <160>;
				vback-porch = <23>;
				vfront-porch = <12>;
				hsync-len = <2>;
				vsync-len = <2>;
				hsync-active = <0>;
				vsync-active = <0>;
				de-active = <0>;
				pixelclk-active = <0>;
			};
		};

		port {
			panel_in_rgb: endpoint {
				remote-endpoint = <&rgb_out_panel>;
			};
		};
	};
};

&rgb {
	status = "okay";
	pinctrl-names = "default";
	pinctrl-0 = <&rgb888_pins>;

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

			rgb_out_panel: endpoint@0 {
				reg = <0>;
				remote-endpoint = <&panel_in_rgb>;
			};
		};
	};
};

&rgb_in_vop {
	status = "okay";
};

&route_rgb {
	status = "okay";
};

&cma {
	size = <0x1600000>;
};

IO_LCD_MODE引脚记得设置模式

0:SYNC MODE&DE=0
1:DE MODE&VS^HS=1

结束

无,主要是GPIO的配置问题,没有配置好,导致RGB屏幕没有起来。

把uboot的部分配置下:

yangx@u20:~/linux2/yangx/RK3506/u-boot$ git show d1ad57b3194aebc5c2a8951dff72bf90d3b96281
commit d1ad57b3194aebc5c2a8951dff72bf90d3b96281 (HEAD -> QY-RK3506-BASE-HMI, rk/QY-RK3506-BASE-HMI)
Author: yangx <yangx@.com>
Date:   Thu Mar 5 17:03:40 2026 +0800

    QY: 配置GPIO4_A1为GPIO,默认是被用作MIPI使用

diff --git a/arch/arm/mach-rockchip/board.c b/arch/arm/mach-rockchip/board.c
index 7abb7dffcb..67da051c6d 100644
--- a/arch/arm/mach-rockchip/board.c
+++ b/arch/arm/mach-rockchip/board.c
@@ -92,6 +92,19 @@ __weak int set_armclk_rate(void)
 __weak int rk_board_init(void)
 {
        gpio_set_value(1, 0);
+       // 开启 MIPI 时钟
+       writel(0x00200000, 0xff9a0804);
+       writel(0x30000000, 0xff9a0854);
+       writel(0x30000000, 0xff9a0a54);
+       // 禁用 MIPI
+       writel(0x03000300, 0xff288018);
+       writel(0x4, 0xff6400a0);
+       writel(0x4, 0xff67038c);
+       writel(0xfd, 0xff6703ac);
+       // GPIO4_A1 输出高
+       writel(0x00010001, 0xFF1E0008);
+       writel(0x00010001, 0xFF1E0000);
+       // gpio_set_value(129, 1);
        // printf("yx --- rk_board_init 11111111111111111111111111111111111\n");
        return 0;
 }

其他

alt text

注意内核的背光pinctrl会被uboot引用,pinctrl设置为输出高就会出现上面的问题,但是uboot阶段显示不正常。

例如以下:

	backlight {
	    backlight_en_pin: backlight_en_pin {
	        rockchip,pins = <4 RK_PA1 RK_FUNC_GPIO &pcfg_output_high>;
	    };
	};
posted @ 2026-01-22 14:32  杨旭0324  阅读(312)  评论(0)    收藏  举报