本次示例使用EDP,主要接口如下图:
开始前首先确认线序是否正确
一、配置VCC3V3_LCD的电压
1、所有的dts配置能关的都关掉后确认VCC3V3_LCD电压,此时如果有电压则说明可能存在回流,硬件有问题
&vcc3v3_lcd0_n {
gpio = <&gpio1 RK_PD0 GPIO_ACTIVE_HIGH>;
enable-active-high;
status = "okay";
};
2、有的板卡VCC_3V3供电也需要拉高,例如LY1024P,这个地方的电需要非常早给它供上,所以需要在Uboot阶段就给上电
&rk809 {
devices_pwr = <&gpio4 RK_PD2 GPIO_ACTIVE_HIGH>;
};
二、拉高背光的使能
1、如图1的BL_EN,这个是背光的使能,拉高了这个脚后背光才会亮
三、DTS
可以看到3568只有vp0和vp1通道支持edp
:对于有两个 VOP 的芯片,需要选择其一,如果有打开 LOGO,route_dsi 的 connect
属性也要指定为同一个 VOP// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
/*
* Copyright (c) 2022 Rockchip Electronics Co., Ltd.
*
*/
#include <dt-bindings/display/media-bus-format.h>
/ { //这是根节点,里面定义了两个节点,一个是panel-edp,一个是backlight
panel-edp {
status = "okay";
compatible = "simple-panel"; //和驱动绑定的关键字
power-supply = <&vcc3v3_lcd0_n>; //绑定VCC3V3_LCD, 可选,Regulator 配置
backlight = <&backlight>; //绑定背光
enable-delay-ms = <20>; //使能延迟,如果上电后过一会闪一下白屏可以改这个值
reset-delay-ms = <20>; //可选,具体时序参考屏驱动
prepare-delay-ms = <20>; //可选,具体时序参考屏驱动
unprepare-delay-ms = <20>; //可选,具体时序参考屏驱动
disable-delay-ms = <20>; //可选,具体时序参考屏驱动
//色彩显示会花或者颜色不对可以改这个值,通过屏幕的datasheet确认
bus-format = <MEDIA_BUS_FMT_RGB888_1X7X4_SPWG>;
width-mm = <170>; //LCD 物理宽度,按屏规格书填写
height-mm = <170>; //LCD 物理高度,按屏规格书填写
display-timings { //LCD 时序参数,按屏规格书填写
native-mode = <&timing0>; //选择屏参
timing0: timing0 { //根据规格书timming配置
clock-frequency = <147700000>;
hactive = <1920>;
vactive = <1080>;
hfront-porch = <48>;
hsync-len = <32>;
hback-porch = <132>;
vfront-porch = <3>;
vsync-len = <6>;
vback-porch = <66>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <0>;
pixelclk-active = <0>;
};
};
//这里是固定写法
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
panel_in_edp: endpoint@1 {
remote-endpoint = <&edp_out_panel>;
};
};
};
};
backlight: backlight {
compatible = "pwm-backlight";
/*pwms参数说明
参数 1,表示 index (per-chip index of the PWM to request),一般是 0,因为我们 Rockchip
PWM 每个 chip 只有一个
参数 2,表示 PWM 输出波形的时间周期,单位是 ns;例如下面配置的 25000 就是表示想要得到
的 PWM 输出周期是 40K 赫兹
参数 3,表示极性,为可选参数;下面例子中的配置为负极性
*/
pwms = <&pwm3 0 25000 0>;
/*brightness-levels 数组,我们一般以值 255 为一个 scale,所以一般的 brightness-levels 为 256
个元素的数组。当 PWM 设置为正极性时,从 0~255 表示背光为正极,占空比从 0%~100% 变
化,255~0 位负极性,占空比从 100%~0% 变化;当 PWM 设置为负极性时,反之
*/
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>; //默认亮度,只在uboot阶段有效
/*背光使能BL_EN, 有的硬件没有这个背光使能脚,那么将这个配置删除,背光驱动通过配置 brightness-levels 数组的第 0 个元素将背光关闭*/
enable-gpios = <&gpio1 RK_PB1 GPIO_ACTIVE_HIGH>;
};
};
&display_subsystem{ //route-edp的父节点,需要打开
status = "okay";
};
&edp {
force-hpd; //和热插拔有关,不写这句就得由一个gpio控制热插拔
status = "okay";
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 { //如图1 BL_PWM 可以看到用的是哪个pwm
status = "okay";
};
&vcc3v3_lcd0_n { //VCC3V3_LCD
gpio = <&gpio1 RK_PD0 GPIO_ACTIVE_HIGH>;
enable-active-high;
status = "okay";
};
&edp_phy { //和时钟相关,需要打开, RK3288/RK3399 不需要使能 phy 相关节点
status = "okay";
};
//对于有两个 VOP 的芯片,需要选择其一,如果有打开 LOGO,route_dsi 的 connect属性也要指定为同一个 VOP
&edp_in_vp0 { //通道0关闭,一般通道0给hdmi,因为支持4k分辨率
status = "disabled";
};
&edp_in_vp1 { //通道1打开,同一个通道只能支持一种屏,所以打开edp通道需要把其他的屏在该通道关闭
status = "okay";
};
&route_edp { //用来显示uboot和kernel阶段的logo,需要绑定edp在该通道的输出
status = "okay";
connect = <&vp1_out_edp>;
};