[RK3576 Android14] 开发之EDP屏幕

前言

Embedded DisplayPort(eDP) 作为一种高效、低功耗的显示接口标准,广泛应用于嵌入式设备、平板电脑、笔记本电脑以及工业控制设备中。RK3576 是瑞芯微电子(Rockchip)推出的一款高性能处理器,其内置的显示子系统支持 eDP 接口,能够满足高分辨率、高刷新率的显示需求。

本文档旨在为开发者提供 RK3576 处理器上 eDP 接口的配置指南,涵盖硬件连接、软件驱动配置、时钟设置、时序调整等内容。通过本文档,开发者可以快速了解如何在 RK3576 平台上实现 eDP 显示功能的初始化与调试,确保显示系统稳定运行。

一、eDP的配置方式

1:edp在Rk上基本上就2中配置方式,一种就是我们常规的固定屏,一种就是支持热拔插,而我在项目中主要使用到的是固定屏的方式。

二、使用步骤

1.根据硬件提供的原理图

我们要确认几个点,背光、使能、是否支持热拔插(hpd),还有信号线这几组,还有各个电压点是否正确。

2.首先根据我们的原理图我们是不支持hpd的,只需要添加force-hpd就行了

&edp0 {
    force-hpd;
    status = "okay";
        ports {
            port@1 {
                reg = <1>;
                edp0_out_panel: endpoint {
                    remote-endpoint = <&panel_in_edp0>;
                        };
                    };
            };
};

3.如果eDP 外接显示器,支持 HPD 参考配置如下(HPD FUNC 功能引脚)

hdmim0_tx0_hpd (gpio1_a5)
hdmim1_tx0_hpd (gpio3_d4)
&edp0 {
    pinctrl-names = "default";
    pinctrl-0 = <&hdmim0_tx0_hpd>;
    status = "okay";
};

&edp0_in_vp0 {
    status = "disabled";
};

&edp0_in_vp1 {
    status = "disabled";
};

&edp0_in_vp2 {
    status = "okay";
};

HPD GPIO 自定义引脚设置:

&edp0 {
 pinctrl-names = "default";
 pinctrl-0 = <&edp0_hpd>;
 hpd-gpios = <&gpio1 RK_PA5 GPIO_ACTIVE_HIGH>;
 status = "okay";
};

&pinctrl {
    edp {
        edp0_hpd: edp0-hpd {
        rockchip,pins = <1 RK_PA5 0 &pcfg_pull_none>;
        };
    };
};

&edp0_in_vp0 {
    status = "disabled";
};

&edp0_in_vp1 {
    status = "disabled";
};

&edp0_in_vp2 {
    status = "okay";
};

4.eDP Panel dts 配置

4.1首先第一个就是我们根据屏幕厂家给的规格书,我们获取到了屏幕的相关参数,

4.2根据这些参数我们知道了我们的屏幕参数

panel-edp {
		compatible = "simple-panel";
		backlight = <&backlight>;
	
		prepare-delay-ms = <120>;
		enable-delay-ms = <120>;
		unprepare-delay-ms = <120>;
		disable-delay-ms = <120>;

		display-timings {
			native-mode = <&timing_4kp60>;
			timing_4kp60: timing1 {
				clock-frequency = <147840000>;
				hactive = <1920>;
				vactive = <1080>;
				hfront-porch = <48>;
				hsync-len = <32>;
				hback-porch = <200>;
				vfront-porch = <3>;
				vsync-len = <6>;
				vback-porch = <31>;
				hsync-active = <0>;
				vsync-active = <0>;
				de-active = <0>;
				pixelclk-active = <0>;
			};
		};

		port {
			panel_in_edp: endpoint {
				remote-endpoint = <&edp_out_panel>;
			};
		};
	};
};

4.3各个参数的说明

clock-frequency时钟频率:clock-frequency=(hactive+hfront-porch+hsync-len+hback-porch)×(vactive+vfront-porch+vsync-len+vback-porch)×refresh-rate

  • 示例:

    • 如果分辨率为 1920x1080,刷新率为 60Hz,则:

      clock-frequency=(1920+48+32+200)×(1080+3+6+31)×60clock-frequency=(1920+48+32+200)×(1080+3+6+31)×60

      计算得到 clock-frequency 约为 147.84 MHz。

    • hactive水平有效像素数(Horizontal Active Pixels)

    • vactive垂直有效行数(Vertical Active Lines)

    • hfront-porch水平前沿:作用水平同步信号(HSync)开始之前的时间

    • hback-porch水平后沿:HSync 信号结束后到下一行有效像素开始之前的时间

    • vfront-porch:垂直前沿(Vertical Front Porch)。

      • 作用:定义垂直同步信号(VSync)开始之前的时间。

      • 示例:vfront-porch = 3 表示 VSync 信号开始前有 3 行。

    • vsync-len:垂直同步信号宽度

      • 作用:定义 VSync 信号的持续时间。

      • 示例:vsync-len = 6 表示 VSync 信号持续 6 行。

    • vback-porch:垂直后沿

      • 作用:定义 VSync 信号结束后到下一帧有效行开始之前的时间。

      • 示例:vback-porch = 31 表示 VSync 信号结束后有 31 行。

    • hsync-active:水平同步信号极性

      • 作用:定义 HSync 信号的有效电平(0 表示低电平有效,1 表示高电平有效)。

      • 示例:hsync-active = 0 表示 HSync 信号低电平有效。

    • vsync-active:垂直同步信号极性

      • 作用:定义 VSync 信号的有效电平(0 表示低电平有效,1 表示高电平有效)。

      • 示例:vsync-active = 0 表示 VSync 信号低电平有效。

    • de-active:数据使能信号极性

      • 作用:定义数据使能信号的有效电平(0 表示低电平有效,1 表示高电平有效)。

      • 示例:de-active = 0 表示数据使能信号低电平有效。

    • pixelclk-active:像素时钟极性

      • 作用:定义像素时钟的采样边沿(0 表示上升沿采样,1 表示下降沿采样)。

      • 示例:pixelclk-active = 0 表示像素时钟在上升沿采样。

刷新率计算

刷新率(Refresh Rate)可以通过以下公式计算:

refresh-rate=clock-frequency/((hactive+hfront-porch+hsync-len+hback-porch)×(vactive+vfront-porch+vsync-len+vback-porch))

示例:

  • 根据提供的参数:

    refresh-rate=147840000/((1920+48+32+200)×(1080+3+6+31))

    计算得到刷新率约为 60Hz。

5.背光设置

根据原理图上我们可以知道我们的pwm使用了GPIO0 RB7引脚,通过RK3576-Pinctrl.dtsi可以知道使用到的pwm1m0_ch4

    /omit-if-no-ref/
        pwm1m0_ch4: pwm1m0-ch4 {
            rockchip,pins =
                /* pwm1_ch4_m0 */
                <0 RK_PB7 12 &pcfg_pull_none>;
        };

所以我们在pwm1_6ch_4中配置我们的pinctrl-0中去,如示例

&pwm1_6ch_1 {
    status = "okay";
    pinctrl-0 = <&pwm1m0_ch4>;
};

到此我们就可以将pwm1_6ch_4添加到我们的backlight中。

pwms = <&pwm1_6ch_4 0 25000 0>;

  • 使用 pwm1_6ch_4 控制器的第 0 通道。

  • PWM 信号周期为 25000 纳秒(40 kHz)。

  • 占空比为 0%(低电平)。

  • 默认极性(高电平有效)。

backlight: backlight {
		compatible = "pwm-backlight";
		pwms = <&pwm1_6ch_4 0 25000 0>;
		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>;
	};

6,常见的问题

1backlight驱动probe失败,一般原因是backlight节点下的配置与其他模块存在资源冲突。
console:/ # dmesg | grep backlight
[ 3.164274] pwm-backlight: probe of backlight failed with error -16
2panel驱动probe失败,一般原因是panel节点下的配置与其他模块存在资源冲突。
console:/ # dmesg | grep panel
[ 3.156813] panel-simple panel-edp: failed to get enable GPIO: -16
[ 3.156919] panel-simple: probe of panel-edp failed with error -16
3aux通信报错
console:/ # dmesg | grep edp
[ 3.236549] rockchip-dp fdec0000.edp: failed to read max link rate
[ 3.260422] rockchip-dp fdec0000.edp: failed to read max link rate
[ 3.284163] rockchip-dp fdec0000.edp: failed to read max link rate
log说明通过AUX读取DPCD失败,一般是panel没有正常工作导致无应答,需要检查panel的供电。

<think>好的,用户的问题是关于在RK3576平台上进行EDP屏幕驱动移植或配置的。首先,我需要确认RK3576的相关硬件信息。根据提供的引用,RK3566支持的最大eDP分辨率是2560x1600@60Hz,而用户现在使用的是RK3576,可能需要查阅其数据手册来确认最大支持的分辨率。不过用户提到他们当前的屏幕是1920x1080,这在RK3566的支持范围内,所以RK3576应该也能支持,但最好还是核实一下。 接下来,用户需要的是驱动移植或配置的步骤。通常,嵌入式驱动的移植涉及内核配置、设备树修改、电源管理和背光调节等。首先,需要在内核中启用相关的eDP控制器驱动,比如在RK平台可能是rockchip的显示子系统驱动。然后,设备树中需要正确配置eDP节点,包括时序参数、电源控制引脚和GPIO设置。此外,背光控制通常通过PWM或GPIO,需要在设备树中正确关联。 用户可能遇到的问题包括屏幕无法点亮或显示异常,这可能是因为时序参数不正确,或者电源管理配置有误。调试时可能需要使用示波器检查时钟信号,或者通过内核日志查看驱动加载情况。另外,不同屏幕厂商的初始化序列可能不同,需要确认是否需要通过dts传递初始化命令。 还需要考虑用户使用的是Linux还是Android系统,因为配置方法可能有所不同。比如,Android可能需要额外的HAL层配置。同时,引用中提到的RK3566的eDP支持可以作为参考,但需要确认RK3576的差异,比如接口是否兼容,是否有新的驱动需求。 最后,生成相关问题时,应该覆盖硬件兼容性、设备树配置、调试方法、内核配置、背光控制、Android/Linux差异以及常见问题排查,这样用户能全面了解驱动移植的各个方面。</think>关于RK3576平台EDP屏幕驱动移植与配置,可按照以下步骤进行: ### 一、硬件验证阶段 1. **确认屏幕参数匹配性** - 核对屏幕分辨率是否在RK3576eDP接口支持范围内,根据同类芯片RK3566的参数参考,建议分辨率不超过$$2560 \times 1600@60Hz$$[^2] - 验证屏幕供电需求(通常3.3V/5V)与RK3576开发板的电源设计匹配 2. **物理接口检查** - 确认eDP连接器引脚定义与屏幕线序匹配 - 使用示波器测量eDP时钟信号质量(典型频率范围$$100-400MHz$$) ### 二、内核驱动配置 ```dts // 设备树示例(arch/arm64/boot/dts/rockchip/rk3576-edp.dtsi) &edp { status = "okay"; force-hpd; // 若屏幕无HPD信号时需启用 ports { edp_out: port@1 { reg = <1>; #address-cells = <1>; #size-cells = <0>; edp_out_panel: endpoint@0 { reg = <0>; remote-endpoint = <&panel_in_edp>; }; }; }; }; &pwm3 { status = "okay"; // 背光控制PWM通道 }; ``` ### 三、关键配置项 1. **内核编译选项** ```makefile CONFIG_DRM_PANEL_EDP=y CONFIG_DRM_ROCKCHIP=y CONFIG_DRM_DW_DP=y ``` 2. **屏幕时序配置** ```dts panel: panel { compatible = "panel-edp"; width-mm = <309>; height-mm = <174>; prepare-delay-ms = <120>; enable-delay-ms = <20>; display-timings { native-mode = <&timing0>; timing0: timing0 { clock-frequency = <138500000>; // $$f = \frac{(h_{total} \times v_{total} \times refresh\_rate)}{1000}$$ hactive = <1920>; vactive = <1080>; hfront-porch = <80>; hback-porch = <80>; hsync-len = <20>; vfront-porch = <16>; vback-porch = <16>; vsync-len = <4>; }; }; }; ``` ### 四、调试手段 1. **内核日志分析** ```bash dmesg | grep -i "drm\|edp\|panel" ``` 2. **信号质量检测** ```bash cat /sys/kernel/debug/dri/0/edp-link-status ``` 3. **EDID读取验证** ```bash hexdump -C /sys/class/drm/card0-eDP-1/edid ``` ### 五、常见问题处理 1. **屏幕无显示** - 检查`hpd-gpio`配置是否与硬件设计一致 - 测量VDD_LCD供电电压(正常范围$$3.0-3.3V$$) 2. **显示花屏** - 调整`lane-speed`参数(典型值$$1.62/2.7Gbps$$) - 验证时钟极性配置`bus-format = <MEDIA_BUS_FMT_RGB888_1X24>;`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值