eDP是嵌入式显示端口,具有高数据传输速率,高带宽,高分辨率、高刷新率、低电压、简化接口数量等特点。现大多数笔记本电脑都是用的这种接口。整个eDP是很复杂的,这里我们不讲底层原理,我们先掌握如何用泰山派来驱动各种常见的eDP屏幕,eDP在使用上来讲也会比上面的HDMI复杂很多,HDMI屏幕基本不需要适配即插即用,虽然大多数eDP屏幕参数基本差不多,但是有些eDP还是需要我配置屏参的,如果屏幕参数不正确可能无法点亮。泰山派eDP接口位于板载顶部位置。
分辨率与尺寸:
最大支持分辨率是主控决定的,通过数据手册可知RK3566的eDP接口最大支持2560x1600@60Hz,所以所选的eDP屏幕分辨率不大于这个分辨率就行,大于了点不亮,
常见的尺寸有11.6寸,13.3寸,15.6寸等,屏幕对尺寸没有太大要求可以根据自己的项目和喜好来选择。
引脚接口:
接口线序要和板载资源一样,否则需要自己画转接板,泰山派的eDP接口用的是30Pin 0.5mm的FPC座,30Pin引脚大多数线序都是通用的,但大家不能盲目的看见一个30Pin的eDP屏幕就直接怼上去,还需要确定一下它的引脚顺序 他用的排线是正排线还是反排线,电源电源是否匹配 ,还有背光供电电压是否匹配等。
上图就是我们的板载资源的硬件图示了,接口不要搞错了,这边用的是泰山派。
上图就是我们买的一款edp屏幕的参数。
屏幕调试
要调试eDP屏幕我们首先要找到泰山派user设备树linux/kernel/arch/arm64/boot/dts/tspi-rk3566-user-v10-linux.dts
,并打开tspi-rk3566-user-v10-linux.dts
设备树头文件,这里面主要是和我们edp相关的设备树配置。
tspi-rk3566-edp-v10.dtsi
设备树分析
edp相关的设备树tspisdk/kernel/arch/arm64/boot/dts/rockchiptspi-rk3566-edp-v10.dtsi
,我们要修改的其实就13行-21行屏幕就参数正确屏幕就能点亮这些参数后续也会讲到,这里作为一个引子。
cpp
/ {
edp_panel: edp-panel {
compatible = "simple-panel"; //上节我们讲过的edp驱动通过这个来匹配设备树
backlight = <&backlight>; // 引用背光,在下面背光是一个PWM信号
enable-gpios = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>; // 激活GPIO引脚
enable-delay-ms = <120>; // 开启延迟时间(毫秒)
pinctrl-0 = <&edp_en_gpio>; // 引脚控制器
edp_disp_timings: display-timings {
native-mode = <&edp_timing0>;
/*开始:这一部分就是我们要调试的屏幕参数了*/
edp_timing0: edp_timing0 {
clock-frequency = <150000000>; // 像素时钟频率
hactive = <1920>; // 水平像素数
vactive = <1080>; // 垂直像素数
hfront-porch = <150>; // 水平前肩期
hsync-len = <5>; // 水平同步长度
hback-porch = <5>; // 水平后肩期
vfront-porch = <3>; // 垂直前肩期
vsync-len = <1>; // 垂直同步长度
vback-porch = <9>; // 垂直后肩期
hsync-active = <0>; // 水平同步有效状态
vsync-active = <0>; // 垂直同步有效状态
de-active = <0>; // DE有效状态
pixelclk-active = <0>; // 像素时钟有效状态
};
/*结束:这一部分就是我们要调试的屏幕参数了*/
};
ports {
panel_in_edp: endpoint {
remote-endpoint = <&edp_out_panel>; // 引用端点连接
};
};
};
/*这是我们的背光*/
backlight: backlight {
compatible = "pwm-backlight";
pwms = <&pwm4 0 25000 0>; // PWM参数设置
brightness-levels = < // 亮度级别
0 20 20 21 21 22 22 23
// 其他亮度级别
...
254 255
>;
default-brightness-level = <200>; // 默认亮度级别
};
};
&pwm4 { //背光引脚使用的是PWM4
status = "okay"; // PWM状态为正常
};
&pinctrl {
edp {
edp_en_gpio: edp-en-gpio { //这个是edp对应的使能引脚
rockchip,pins = <0 RK_PA6 RK_FUNC_GPIO &pcfg_pull_none>; // GPIO设置
};
};
};
&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>; // 远程端点连接
};
};
};
};
&edp_phy {
status = "okay"; // EDP PHY状态为正常
};
&route_edp {
status = "okay"; // EDP线路状态为正常
//注意我们前面有讲到rk3566有两个vop,我们这里就是来链接vop的,你可以选择1或者0这里我们选择0
connect = <&vp0_out_edp>; // 连接设置
// connect = <&vp1_out_edp>;
};
//注意我们前面有讲到rk3566有两个vop,我们这里就是来链接vop的,你可以选择1或者0这里我们选择0
&edp_in_vp0 {
status = "okay"; // EDP输入VP0状态为正常
};
//注意我们前面有讲到rk3566有两个vop,我们这里就是来链接vop的,我们前面选择了vp0所以这里vp1就关掉
&edp_in_vp1 {
status = "disabled"; // 禁用EDP输入VP1
};
&edp_panel {
status = "okay"; // 打开edp面板,这个一定要打开哟如果用edp屏幕
};
edp背光电路
cpp
/ {
edp_panel: edp-panel {
compatible = "simple-panel"; //上节我们讲过的edp驱动通过这个来匹配设备树
backlight = <&backlight>; // 引用背光,在下面背光是一个PWM信号
/*这是我们的背光*/
backlight: backlight {
compatible = "pwm-backlight";
pwms = <&pwm4 0 25000 0>; // PWM参数设置
brightness-levels = < // 亮度级别
0 20 20 21 21 22 22 23
// 其他亮度级别
...
254 255
// 如果你在安卓里面调背光发现是反的可以把这个数组倒过来
>;
default-brightness-level = <200>; // 默认亮度级别
};
};
&pwm4 { //背光引脚使用的是PWM4
status = "okay"; // PWM状态为正常
};
edp使能引脚
cpp
/ {
edp_panel: edp-panel {
compatible = "simple-panel"; //上节我们讲过的edp驱动通过这个来匹配设备树
pinctrl-0 = <&edp_en_gpio>; // 引脚控制器
.......
};
&pinctrl {
edp {
edp_en_gpio: edp-en-gpio { //这个是edp对应的使能引脚
rockchip,pins = <0 RK_PA6 RK_FUNC_GPIO &pcfg_pull_none>; // GPIO设置
};
};
};
.......
GPIO0_A6_d这个引脚就是普通的GPIO,通过高低电平来控制edp屏幕打开与关闭
屏幕参数调试
水平像素参数:Hor Active = 1366,表示水平活动像素为 1366 个。
水平空白参数:Hor Blanking = 160,表示水平空白像素为 160 个。
垂直像素参数:Ver Active = 768,表示垂直活动像素为 768 个。
垂直空白参数:Ver Blanking = 22,表示垂直空白像素为 22 个。
水平同步参数:Hor Sync Offset = 48,表示水平同步偏移量为 48;H Sync Pulse Width = 32,表示水平同步脉冲宽度为 32。
垂直同步参数:V sync Offset = 3 line,表示垂直同步偏移量为 3 行;V Sync Pulse width = 6 line,表示垂直同步脉冲宽度为 6 行。
对应到我们设备树中
clock-frequency:可以对应上面提到的主时钟频率,即 72.3 MHz。
hactive:可以对应上面提到的水平活动像素,即 Hor Active = 1366。
vactive:可以对应上面提到的垂直活动像素,即 Ver Active = 768。
hfront-porch、hsync-len 和 hback-porch:可以对应上面提到的水平同步参数,即 Hor Sync Offset、H Sync Pulse Width 和 Hor Blanking。
vfront-porch、vsync-len 和 vback-porch:可以对应上面提到的垂直同步参数,即 V sync Offset、V Sync Pulse width 和 Ver Blanking。
cpp
/*************************************************
11.6寸1366x768
**************************************************/
&edp_timing0 {
clock-frequency = <72300000>;
hactive = <1366>;
vactive = <768>;
hfront-porch = <48>;
hsync-len = <32>;
hback-porch = <160>;
vfront-porch = <3>;
vsync-len = <6>;
vback-porch = <32>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <0>;
pixelclk-active = <0>;
};