相信经常刷B站的同学肯定听过这么一句话有稚晖君的地方就有屏幕,当今数字化的时代,显示技术的重要性不言而喻,在我们生活中处处都有屏幕的存在、比如手机、平板、电脑、广告机、电视机等。我们泰山派开发板显示接口比较丰富分别支持了HDMI,eDP,MIPI三种显示接口,有了前面的基础铺垫我们这一章节就来掌握如何点亮屏幕。
视频教程
【新手必学Linux-HDMI、EDP屏幕驱动】立创·泰山派RK3566 Linux开发板训练营第四课
【新手必学Linux-MiPi屏幕驱动】立创·泰山派RK3566 Linux开发板训练营第五课
准备
专业术语
像素和分辨率
像素是图像显示的最小单元,可以看作是一个点,它具有一个特定的位置和颜色/亮度信息。屏幕上的每个像素都可以单独控制,以显示出不同的颜色和亮度。像素的密度越高,屏幕显示的图像越清晰和细腻。
分辨率指的是显示设备水平和垂直方向上的像素数量。它通常用宽度和高度的像素数来表示。例如,一个显示器的分辨率可能是1920x1080,其中表示水平像素数为1920,垂直像素数为1080。分辨率决定了设备能够显示的图像的细节程度和清晰度。更高的分辨率意味着设备具有更多的像素,可以显示更多的细节,并且图像更加清晰。
玩过51单片机的同学肯定有接触过点阵,即使你没有玩过在我们日常生活中你肯定也有碰到过,比如我们电梯里的楼层显示用的就是点阵,点阵就是一个最简单的显示屏幕的缩影,下面的一个白点就是一个像素,分辨率就是宽度和高度的像素数量那就是8x8的分辨率
逐行扫描
你以为屏幕是一次性把一副画面显示在屏幕上吗?其实并不是,屏幕是以Z字形从第一行开始逐个像素点点亮,一共会点亮分辨率宽度这么多个像素,当第一行最后一个像素点被点亮以后,跳到第二行的第一个像素点点亮,重复分辨率高度这么多行,直到点亮最后一个像素。因为每个像素被点亮的时间非常快,所有眼睛暂留效果就给你的感觉就像是屏幕一次性显示一副画面的感觉。
屏幕参数
前面铺垫了这么多主要为了屏幕参数做准备,后面我们的mipi和edp屏幕大家要求调试的也是这些屏幕参数,驱动官方已经给我们写好了,我们只需要根据不同屏幕厂商给的参数修改对应的屏参就行。
哪些参数是我们必须关注的呢?
- 屏幕有效显示区域,比如我下面举例的1366x768就是他的有效显示区域也是分辨率。
VSYNC(垂直同步信号)
:VSYNC 是用于同步显示器刷新的信号。当 VSYNC 信号跳变时,显示器会开始显示新的一帧画面。Vertical Total(垂直总宽度)
:下面所有的参数之和VSYNC宽(vsync-len,垂直触发信号宽)
:信号脉冲会有个宽度,要不然都检查不到,这个宽度是根据芯片手册来决定的。VFP(vfront-porch,垂直前肩期)
:一帧图片显示完成以后要过多久才会来VSYNC信号。VBP(vback-porch,垂直后肩期)
:VSYNC信号发生以后要过多久才会来图片数据。HSYNC(水平同步信号)
:HSYNC 用于同步每行像素的扫描。当 HSYNC 信号跳变时,显示器会开始扫描下一行像素。Horizontal Total(水平总宽度)
:下面所有的参数之和HSYNC宽(hsync-len,水平信号触发宽)
:信号脉冲会有个宽度,要不然都检查不到,这个宽度是根据芯片手册来决定的。HFP(hfront-porch,水平前肩期)
:一行像素显示完成以后要过多久才会来HSYNC信号。HBP(hback-porch,水平后肩期)
:HSYNC信号发生以后要过多久才会来下一行数据。
为什么有这些参数?
最主要的参数是VSYNC和HSYNC这两个,他们控制了屏幕什么时候换行以及什么时候扫描完成一帧图片。
VFP和VBP以及HFP和HBP都是辅助这两个信号的,为什么会有这几个辅助信号?因为屏幕反应需要时间,当你给他发VSYNC和HSYNC信号以后他不是马上就开始下一行或者下一帧。
hsync-len和vsync-len这两个是来决定HSYNC和VSYNC两个信号线触发脉冲时候的宽度,这个宽度要符合屏幕芯片要求值
hsync-active和vsync-active这两个是来决定HSYNC和VSYNC两个信号触发时候的电平状态,就和大家学stm32中断一样是高电平触发还是低电平触发
这就是我们为什么要调试屏幕参数的原因,因为每个屏幕对应的控制芯片不一样,所有给到值自然就不一样。
参数不对会怎么样?
如果参数不对,最严重的是屏幕只点亮了背光但没有数据输出,轻一点的就是图像撕裂,闪屏等。
刷新率怎么计算?
刷新率 = 时钟 / ((总宽度Horizontal Total) * (总高度Vertical Total))
刷新率 = 时钟 / ((有效宽度+HSYNC宽+HBP+HFP) * (有效高度+VSYNC宽+VBP+VFP))
刷新率 = 72300000 / ((1366+32+160+48) * (768+6+32+3))
泰山派点几种接口屏幕?最大分辨率是多少?是否支持同屏显示?
泰山派支持hdmi,mipi,edp三种屏幕接口,hdmi最大支持4k,mipi最大支持1k,edp最大支持2k(泰山派2lane群友实测试2k 45),支持双屏同显。
泰山派支持的显示相关参数可以查看数据手册:
【Rockchip_RK3566_Datasheet_V1.2-20220601.pdf】下载
📌 在 下载中心
->百度网盘
->第04章.【立创·泰山派】参考资料
->【瑞芯微】官方资料
->Linux
->RK356X
->Datasheet
->Rockchip_RK3566_Datasheet_V1.2-20220601.pdf
。
- rk3566有两个输出通道分别是
Video output 0
和Video output 1
他们分别能够输出的最大分辨率如下
- 泰山派三个接口支持两个同屏幕显示,但是他们是同源的,如果做同屏显示的时候要保证屏幕方向一致,下面接口中划线是没有引出的接口
rk3566平台只有一 VOP,但是分出不同的 PORT,2 个 PORT 分别为 VP0、VP1。所以可以把 VP 理解为是一个 VOP。因为只有 VP0 支持 4K 及 HDR 等,所以 HDMI 默认绑定 VP0。显示接口连接关系。
HDMI屏
HDMI是一种比较通用的视频接口,支持热拔插,比如我们电脑显示器等大多数都是用的HDMI接口,相信大家在生活中都有使用过,相比eDP、MIPI等接口它基本不需要调试任何屏幕参数,即插即用且显示质量也非常高。
硬件
- 接口支持的参数,查看
Rockchip_RK3566_Datasheet_V1.2-20220601.pdf
。
【Rockchip_RK3566_Datasheet_V1.2-20220601.pdf】下载
📌 在 下载中心
->百度网盘
->第04章.【立创·泰山派】参考资料
->【瑞芯微】官方资料
->Linux
->RK356X
->Datasheet
->Rockchip_RK3566_Datasheet_V1.2-20220601.pdf
。
- 1K(1920x1080p)分辨率,120Hz刷新率
- 4k(4096x2304p)分辨率,60Hz刷新率
- 接口位置
- 为了美观以及充分利用空间,泰山派使用的是Micro HDMI接口,如果你的显示屏使用的是标准HDMI线则需要用一个Micro HDMi转HDMI的座子,当然你也可以换一跟Micro HDMI的线。
软件
- 关闭HDMI显示
diff --git a/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts b/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts
index 02d183d4dc69..a94dab56a544 100755
--- a/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts
+++ b/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts
@@ -36,7 +36,7 @@
// #include "tspi-rk3566-dsi-v10.dtsi"
//【开/关】HDMI 显示屏幕配置,里面内容几乎可以不用动,如果不需要hdmi显示直接注释掉即可
-#include "tspi-rk3566-hdmi-v10.dtsi"
+// #include "tspi-rk3566-hdmi-v10.dtsi"
//【开/关】摄像头 目前视频的是ov5695
#include "tspi-rk3566-csi-v10.dtsi"
2
3
4
5
6
7
8
9
10
11
12
13
- 打开HDMI显示
diff --git a/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts b/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts
index 02d183d4dc69..a94dab56a544 100755
--- a/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts
+++ b/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts
@@ -36,7 +36,7 @@
// #include "tspi-rk3566-dsi-v10.dtsi"
//【开/关】HDMI 显示屏幕配置,里面内容几乎可以不用动,如果不需要hdmi显示直接注释掉即可
-//#include "tspi-rk3566-hdmi-v10.dtsi"
+#include "tspi-rk3566-hdmi-v10.dtsi"
//【开/关】摄像头 目前视频的是ov5659
#include "tspi-rk3566-csi-v10.dtsi"
2
3
4
5
6
7
8
9
10
11
12
13
eDP屏
eDP是嵌入式显示端口,具有高数据传输速率,高带宽,高分辨率、高刷新率、低电压、简化接口数量等特点。现大多数笔记本电脑都是用的这种接口。整个eDP是很复杂的,这里我们不讲底层原理,我们先掌握如何用泰山派来驱动各种常见的eDP屏幕,eDP在使用上来讲也会比上面的HDMI复杂很多,HDMI屏幕基本不需要适配即插即用,虽然大多数eDP屏幕参数基本差不多,但是有些eDP还是需要我配置屏参的,如果屏幕参数不正确可能无法点亮。泰山派eDP接口位于板载顶部位置。
学习目标
- 掌握屏幕的选型
- 掌握设备树EDP屏参数调试
如何选择屏幕?
资料教程:
最重要一点就是他的资料一定要丰富,尤其对于新手朋友,建议不要贪便宜去买闲鱼二手屏幕点不亮神仙也救不了。建议买有人点亮过的或者卖家资料给的多的,比如参考的设备树文件,屏幕参数,触摸驱动等等。最好是如果卖家肯提供技术支持的首选,因为很多时候你调半天数据手册都翻烂了问卖家就一个参数解决。当然edp屏幕参数相对通用,mipi就难说了。
分辨率与尺寸:
- 最大支持分辨率是主控决定的,通过数据手册可知RK3566的eDP接口最大支持2560x1600@60Hz,所以所选的eDP屏幕分辨率不大于这个分辨率就行,大于了点不亮,详细参考
Rockchip_RK3566_Datasheet_V1.2-20220601.pdf
。
【Rockchip_RK3566_Datasheet_V1.2-20220601.pdf】下载
📌 在 下载中心
->百度网盘
->第04章.【立创·泰山派】参考资料
->【瑞芯微】官方资料
->Linux
->RK356X
->Datasheet
->Rockchip_RK3566_Datasheet_V1.2-20220601.pdf
。
- 常见的尺寸有11.6寸,13.3寸,15.6寸等,屏幕对尺寸没有太大要求可以根据自己的项目和喜好来选择。
引脚接口:
接口线序要和泰山派一样,否则需要自己画转接板,泰山派的eDP接口用的是30Pin 0.5mm的FPC座,30Pin引脚大多数线序都是通用的,但大家不能盲目的看见一个30Pin的eDP屏幕就直接怼上去,还需要确定一下它的引脚顺序他用的排线是正排线还是反排线,电源电源是否匹配,还有背光供电电压是否匹配等。详情查看原理图第24页
注意:接口不匹配会有烧屏和烧开发板的风险,不确定的情况下可以把这个表发给卖家,问他你的屏幕我这个接口是否可以点啊?
引脚编号 | 名称 | 描述 | 注释 |
---|---|---|---|
1 | CABC_ENIN | CABC input | 屏幕亮度自适应控制输入,可不接 |
2 | H_GND | High Speed Ground | 高速地线 |
3 | Lane1_N | Complement Signal Link Lane 1 | 负极性信号链 1 |
4 | Lane1_P | True Signal Link Lane 1 | 正极性信号链 1 |
5 | H_GND | High Speed Ground | 高速地线 |
6 | Lane0_N | Complement Signal Link Lane 0 | 负极性信号链 0 |
7 | Lane0_P | True Signal Link Lane 0 | 正极性信号链 0 |
8 | H_GND | High Speed Ground | 高速地线 |
9 | AUX_CH_P | True Signal Auxiliary Channel | 辅助信道正极性信号 |
10 | AUX_CH_N | Complement Signal Auxiliary Channel | 辅助信道负极性信号 |
11 | H_GND | High Speed Ground | 高速地线 |
12 | LCD_VCC | LCD logic power (3.3V) | LCD 逻辑电源(3.3V) |
13 | LCD_VCC | LCD logic power (3.3V) | LCD 逻辑电源(3.3V) |
14 | BIST | enable | 自检测试使能 |
15 | LCD_GND | LCD Ground | LCD 地线 |
16 | LCD_GND | LCD Ground | LCD 地线 |
17 | HPD | HPD signal pin | HPD 信号引脚 |
18 | BL_GND | Backlight ground | 背光地线 |
19 | BL_GND | Backlight ground | 背光地线 |
20 | BL_GND | Backlight ground | 背光地线 |
21 | BL_GND | Backlight ground | 背光地线 |
22 | BL_ENABLE | BL_PWR | 背光电源使能 |
23 | PWM_DIM | System PWM signal input | 背光PWM 信号输入 |
24 | Hsync | Hsync | 水平同步信号 |
25 | NC | No Connection | 未连接 |
26 | BL_PWR | Backlight | 背光电源(典型5-21V)具体需根据屏幕手册确定 |
27 | BL_PWR | Backlight | 背光电源(典型5-21V)具体需根据屏幕手册确定 |
28 | BL_PWR | Backlight | 背光电源(典型5-21V)具体需根据屏幕手册确定 |
29 | BL_PWR | Backlight | 背光电源(典型5-21V)具体需根据屏幕手册确定 |
30 | NC | No Connection | 未连接 |
31-32 | FPC的焊盘 | - | 大家不要误解了,接口是30Pin的这里31和32是FPC座的焊盘 |
原理图:
FPC的第一脚(CABC_ENIN)是在PCB左边下图所指位置,大家接线的时候不要搞反了,有些厂家会出现封装第一脚用作30脚的情况,也就是区分封装的白点并不靠谱,需要以引脚的功能为主。
选屏案例分析
在淘宝或者1688上面搜索关键字 30pin EDP ,选一个你觉得价格合适、销量、评价比较好的。进行质询,当然你也可以看他的商品简介里面一般都会方引脚图的。
以此款屏幕为例(只是采购回来测试,不负责售后以及相关责任)点击跳转。这里我没有考虑价格因素,大家自己选的时候可以多对比几家。
查看商品描述,这个分辨率我们开发板是可以支持的,前面说了泰山派的eDP接口最大分辨率是2560x1600@60Hz
接口确定
对比接口也和我们泰山派的eDP引脚定义、线序都是一样的
屏幕连接
开发板和屏幕之间通用30pin 0.5mm的排线连接,有些屏幕厂商会送有些不会(如果不送可以淘宝搜EDP屏线0.5MM 30P几块钱一条),需要注意排线有同向和反向两种,如果用错会导致屏幕或者泰山派烧坏,针对这款屏幕我们用的是同向排线,为什么用同方我们下面细细分析。
如何区分同向和反向排线?
排线如何与屏幕链接的?
排线如何接开发板的?
连接关系,如下图,就是保证开发板的引脚要和屏幕对上就行,分不清用什么排线的时候,就单独把第1脚和第30脚拿出来对一下,如果对的结果是正的就用同向排线,如果对的结果是交叉的就用反向排线。
前面大概评估这个屏幕我们是可以点的,为了保险起见进一步找卖家要数据,参考M116BE0049A-1366X768 EDP(TN).pdf
。
【M116BE0049A-1366X768 EDP(TN).pdf】下载
📌 在 下载中心
->百度网盘(立创·泰山派开发板资料)
->第09章.【立创·泰山派】项目案例
->【智能小手机】项目资料
->5.屏幕选型与调试
->EDP屏资料
->M116BE0049A-1366X768 EDP(TN).pdf
。
屏幕调试
要调试eDP屏幕我们首先要找到泰山派user设备树linux/kernel/arch/arm64/boot/dts/tspi-rk3566-user-v10-linux.dts
,并打开tspi-rk3566-user-v10-linux.dts
设备树头文件,这里面主要是和我们edp相关的设备树配置。
diff --git a/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts b/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts
index 97da688286b2..2c54798fcd2d 100755
--- a/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts
+++ b/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts
@@ -30,13 +30,13 @@
#include "tspi-rk3566-core-v10.dtsi"
//【开/关】EDP 显示屏幕配置,用户可以基于此复制自己的屏幕,注意EDP与MIPI屏幕互斥,因为共用了VOP如果需要同显自行修改
-// #include "tspi-rk3566-edp-v10.dtsi"
+#include "tspi-rk3566-edp-v10.dtsi"
//【开/关】mipi 显示屏幕配置,用户可以基于此复制自己的屏幕,注意EDP与MIPI屏幕互斥,因为共用了VOP如果需要同显自行修改
// #include "tspi-rk3566-dsi-v10.dtsi"
//【开/关】HDMI 显示屏幕配置,里面内容几乎可以不用动,如果不需要hdmi显示直接注释掉即可
-#include "tspi-rk3566-hdmi-v10.dtsi"
+// #include "tspi-rk3566-hdmi-v10.dtsi"
//【开/关】摄像头 目前视频的是ov5659
#include "tspi-rk3566-csi-v10.dtsi"
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
tspi-rk3566-edp-v10.dtsi
设备树分析
edp相关的设备树 tspisdk/kernel/arch/arm64/boot/dts/rockchiptspi-rk3566-edp-v10.dtsi
,我们要修改的其实就13行-21行屏幕就参数正确屏幕就能点亮,但是为了满足大家的好奇心这里把设备树做一个讲解,新手可以直接跳到后面的屏幕参数去。
/ {
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屏幕
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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
edp背光电路
/ {
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状态为正常
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
GPIO0_C3_d这个引脚可不是乱选的,这个引脚在数据手册里面是可以复用PWM4的
edp使能引脚
/ {
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设置
};
};
};
.......
2
3
4
5
6
7
8
9
10
11
12
13
14
15
GPIO0_A6_d这个引脚就是普通的GPIO,通过高低电平来控制edp屏幕打开与关闭
屏幕参数调试
我们前面已经讲过了屏幕相关的参数,对应我们设备树里下面框部分,这些参数是怎么来的呢,主要有三种方式
- 买屏幕的时候找屏幕原厂要,对屏幕最熟悉的就是屏幕卖家。
- 从数据手册里面找(这里我们演示这一种)。
- 靠经验猜,edp屏幕对屏幕参数不是很严格瞎蒙有时候也能对,前提是硬件已经验证成功的情况,泰山派开发板最开始调试的时候我也是找屏幕厂商要的屏参。
打开我们前面找屏幕厂商要的数据手册,翻到第三十页有个EDID表,这个表里面包含了我们需要的信息,每个屏的数据手册都有差异,大家仔细找找很有可能有些low一点的屏厂数据手册里啥都没有就一个屏幕的尺寸图!看到这种你要找他要了屏参后在购买。
- 水平像素参数: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。 前面我们已经学了设备树的引用,那我们这里就用引用来修改edp的屏幕参数
/*************************************************
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>;
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
补丁
抽打补丁我们前面都已经学过了这里我就提供一个补丁包,如果你还不会打补丁那可以找群友要一个他们改好的
补丁包下载
📌 在 下载中心
->百度网盘(立创·泰山派开发板资料)
->第09章.【立创·泰山派】项目案例
->【智能小手机】项目资料
->5.屏幕选型与调试
->EDP屏资料
->代码补丁
->edp.patch
。
打补丁
验证
单独编译内核(不会看前面SDK编译章节点击跳转🚀)
单独烧入内核img(不会看前面SDK编译章节点击跳转🚀)
点亮
屏参错误导致的常见问题
时钟频率太低会导致闪屏
&edp_timing0 {
clock-frequency = <7230000>;//72300000原来是这样,我们现在参数少了个0
hactive = <1366>;
vactive = <768>;
hfront-porch = <80>;
hsync-len = <5>;
hback-porch = <160>;
vfront-porch = <3>;
vsync-len = <6>;
vback-porch = <22>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <0>;
pixelclk-active = <0>;
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
时钟频率太高会导致花屏
这里有个坑大家要注意,如果你的屏幕花屏久了,即使你的参数是对的也会留有花屏的残影,要过段时间才会好
&edp_timing0 {
clock-frequency = <99900000>;//72300000原来是这样,我们现在参数99900000
hactive = <1366>;
vactive = <768>;
hfront-porch = <80>;
hsync-len = <5>;
hback-porch = <160>;
vfront-porch = <3>;
vsync-len = <6>;
vback-porch = <22>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <0>;
pixelclk-active = <0>;
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
分辨率错误
&edp_timing0 {
clock-frequency = <72300000>;
hactive = <1920>;//正常1366
vactive = <1080>;//正常768
hfront-porch = <80>;
hsync-len = <5>;
hback-porch = <160>;
vfront-porch = <3>;
vsync-len = <6>;
vback-porch = <22>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <0>;
pixelclk-active = <0>;
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
HFP、HBP、VFP、VBP参数错误
其他参数错误大多数情况是有背光但黑屏
MIPI屏
MIPI屏大家可能不是很熟悉,但如果提起智能机或者平板大家就耳熟能详了,对没错你每天看的智能手机基本上都是用的mipi接口的屏幕,mipi协议分为很多种,而且整个协议非常复杂,所以这里我们不讲底层原理,因为底层芯片原厂已经帮我实现了,我们先掌握如何通过修改泰山派的设备树来驱动mipi屏幕,点mipi屏幕比上面的eDP和HMDI都要复杂,eDP屏幕只需要配置屏参,mipi在屏还需要发送初始化序列。泰山派开发板板载了mipi dsi显示接口,位于板载背部位置,通过31PIN 0.3间距下接FPC接口引出。
学习目标
- 掌握屏幕的选型
- 掌握设备树mipi屏参数调试
如何选择屏幕?
资料教程:
最重要一点就是他的资料一定要丰富,尤其对于新手朋友,建议不要贪便宜去买闲鱼二手屏幕点不亮神仙也救不了。建议买有人点亮过的或者卖家资料给的多的,比如参考的设备树文件,屏幕参数,触摸驱动等等。最好是如果卖家肯提供技术支持的首选,因为很多时候你调半天数据手册都翻烂了问卖家就一个参数解决。
分辨率与尺寸:
- 最大支持分辨率是主控决定的,通过数据手册可知RK3566的mipi接口最大支持1920x1080@60Hz,所以所选的mipi屏幕分辨率不大于这个分辨率就行,详细参考
Rockchip_RK3566_Datasheet_V1.2-20220601.pdf
【Datasheet\Rockchip_RK3566_Datasheet_V1.2-20220601.pdf】下载
📌 在 下载中心
->百度网盘(立创·泰山派开发板资料)
->第04章.【立创·泰山派】参考资料
->【瑞芯微】官方资料
->Linux
->RK356X
->Datasheet
->Rockchip_RK3566_Datasheet_V1.2-20220601.pdf
。
引脚接口(重要):
接口线序要和泰山派一样,否则需要自己画转接板,泰山派的mipi接口用的是31Pin 0.3mm的FPC座,31Pin引脚大多数线序都是通用的,但大家不能盲目的看见一个31Pin的mipi屏幕就直接怼上去,还需要确定一下它的引脚顺序,以及他用的排线是正排线还是反排线,还有背光供电电流等。详情查看立创·泰山派开发板 - 嘉立创EDA开源硬件平台 (oshwhub.com)原理图第22页(点击跳转)
注意:接口不匹配会有烧屏和烧开发板的风险
Pin No. | Pin Name | Description | 描述 |
---|---|---|---|
1 | MIPI_DSI_VCC_LED+ | Power supply for LED[Anode] | LED正极电源 |
2 | MIPI_DSI_VCC_LED+ | Power supply for LED[Anode] | LED正极电源 |
3 | MIPI_DSI_VCC_LED+ | Power supply for LED[Anode] | LED正极电源 |
4 | NC | No Connect | 不连接 |
5 | MIPI_DSI_VCC_LED- | Power supply for LED[Cathode] | LED负极电源 |
6 | MIPI_DSI_VCC_LED- | Power supply for LED[Cathode] | LED负极电源 |
7 | MIPI_DSI_VCC_LED- | Power supply for LED[Cathode] | LED负极电源 |
8 | MIPI_DSI_VCC_LED- | Power supply for LED[Cathode] | LED负极电源 |
9 | GND | Ground | 地线 |
10 | GND | Ground | 地线 |
11 | MIPI_DSI_2P | MIPI data positive signal(2P) | MIPI数据正极信号(2P) |
12 | MIPI_DSI_2N | MIPI data negative signal(2N) | MIPI数据负极信号(2N) |
13 | GND | Ground | 地线 |
14 | MIPI_DSI_1P | MIPI data positive signal(1P) | MIPI数据正极信号(1P) |
15 | MIPI_DSI_1N | MIPI data positive signal(1N) | MIPI数据负极信号(1N) |
16 | GND | Ground | 地线 |
17 | MIPI_DSI_CLKP | MIPI CLK positive signal(CLKP) | MIPI时钟正极信号(CLKP) |
18 | MIPI_DSI_CLKN | MIPI CLK positive signal(CLKN) | MIPI时钟负极信号(CLKN) |
19 | GND | Ground | 地线 |
20 | MIPI_DSI_0P | MIPI data positive signal(0P) | MIPI数据正极信号(0P) |
21 | MIPI_DSI_0N | MIPI data positive signal(0N) | MIPI数据负极信号(0N) |
22 | GND | Ground | 地线 |
23 | MIPI_DSI_3P | MIPI data positive signal(3P) | MIPI数据正极信号(3P) |
24 | MIPI_DSI_3N | MIPI data negative signal(3N) | MIPI数据负极信号(3N) |
25 | GND | Ground | 地线 |
26 | NC | No Connect | 不连接 |
27 | RESET | Reset Pin 3.3V | 复位引脚 3.3V |
28 | NC | NC | 不连接 |
29 | VDDIO | Logic power 3.3V | 逻辑电源3.3V |
30 | VDD | Logic power 3.3V | 逻辑电源3.3V |
31 | VDD | Logic power 3.3V | 逻辑电源3.3V |
原理图:
PCB:
lanes
泰山派最高支持4lanes的mipi屏幕,分别对于下面的、lane0(20,21)、lane1(14,15)、lane2(11,12)、lane3(23,24)四对引脚,mipi屏幕lanes的多少跟屏幕的分辨率有直接关系,屏幕分辨率越高lanes数量就越多,所以大家看有些小尺寸分辨率屏幕数据手册上面只有一条lanes差分对也是正常的,lanes的差分对个数在设备树中可以配置。
背光电路
屏幕大小不同对电流的要求不同,可以理解为大一点的屏幕里面窜的背光LED相对会多一点,所以我们选择屏幕以后需要去确定屏幕的数据手册,它的背光典型电流是多少,如果我们背光驱动电流超出很多会有屏幕背光发烫和烧背光的风险。 背光驱动电路电流:
- 数据手册:SY7201ABC数据手册.pdf
- 通过SY7201ABC来实现背光控制和恒流输出。
- PWM5_LCD_BL 引脚是芯片输出的PWM引脚用来调屏幕亮度的。
- MIPI_DSI_VCC_LED+和MIPI_DSI_VCC_LED-分别对应LED正极电源和LED负极电源,这里很重要,我们所要确定的电流大小就是这两个点的电流大小
- 在PWM引脚为高电平的情况下,SY7201ABC到底输出多大的电流是由芯片的FB脚来决定的它的
- IOUT计算公式,IOUT=0.2V/R(R=(R95xR96)/(R95+R96)),最终得出IOUT = 0.2V/1.8≈110mA
- 注意:上面我们得出LED的背光电流输出的电流是110mA,所以我们选屏幕的时候要确定背光电路允许电流在110mA以上如果屏幕背光电流在我们背光电路电流以下轻则屏幕发烫重则烧屏,那背光电路我们为什么选择110mA这个值呢,因为8寸的mipi屏幕普遍是在130mA左右,而且8寸屏是做广告机的最常用的,所以我们就选了这个典型值。
确定屏幕背光电流: 找到数据手册中的LED cureent:我们可以发现这款屏幕它的典型电流就是140mA,刚好我们上面的背光驱动电流没有超过所以可以正常驱动
选屏案例分析
mipi屏幕的玩法还是挺多的,各种形状尺寸接口的都可以选择,甚至你还可以驱动手机屏,当然还可以选择mipi转其他的接口,我们本次训练营用的就是一个非标准31Pin的3.1寸mipi屏幕,考虑到我们新手小伙伴比较多我们这里先给大家讲标准31pin mipi接口,因为接口不一样需要自己画转接板,标准的直接在淘宝买回来接上调试屏幕参数就能点亮,下一节我们和大家一起去画一个3.1寸屏幕的转接板并驱动它。(纯纯纯新手可以买标准屏调试,有焊焊接和调试经验的可以跟着做3.1寸屏)
其他小伙伴开源mipi转接板和调试项目案例,感兴趣的小伙伴可以看一下:
在淘宝或者1688上面搜索关键字点击跳转🚀 ,选一个你觉得价格合适、销量、评价比较好的。进行质询,当然你也可以看他的商品简介里面一般都会方引脚图的。
以此款屏幕为例(只是采购回来测试,不负责售后以及相关责任):
这里我没有考虑价格因素,大家自己选的时候可以多对比几家。把我们原理图的截图发给卖家,问卖家是否支持,并和卖家要资料
数据手册:
【Spec CC10128007-31C..pdf】下载
📌 在 下载中心
->百度网盘(立创·泰山派开发板资料)
->第09章.【立创·泰山派】项目案例
->【智能小手机】项目资料
->5.屏幕选型与调试
->MIPI屏资料
->屏幕资料
->Spec CC10128007-31C..pdf
。
屏参参考序列:
//params->dsi.LANE_NUM= LCM_THREE_LANE;//需修改代码,打开PAGE4下的//{0x00,1,{0x00}},//3L 打开此行
JDEVB_RSOX(800);
JDEVB_RSOY(1280);
JDEVB_VS(6);
JDEVB_VBP(16);
JDEVB_VFP(15);
JDEVB_HS(8);//4
JDEVB_HBP(48);//4
JDEVB_HFP(52);
JDEVB_DSILANE(4);//DSI Lane
//--------------------------------//
{0xFF,3,{0x98,0x81,0x03}},//PAGE3
{0x01,1,{0x00}},
{0x02,1,{0x00}},
{0x03,1,{0x53}},
{0x04,1,{0x53}},
{0x05,1,{0x13}},
{0x06,1,{0x04}},
{0x07,1,{0x02}},
{0x08,1,{0x02}},
{0x09,1,{0x00}},
{0x0a,1,{0x00}},
{0x0b,1,{0x00}},
{0x0c,1,{0x00}},
{0x0d,1,{0x00}},
{0x0e,1,{0x00}},
{0x0f,1,{0x00}},
{0x10,1,{0x00}},
{0x11,1,{0x00}},
{0x12,1,{0x00}},
{0x13,1,{0x00}},
{0x14,1,{0x00}},
{0x15,1,{0x00}},
{0x16,1,{0x00}},
{0x17,1,{0x00}},
{0x18,1,{0x00}},
{0x19,1,{0x00}},
{0x1a,1,{0x00}},
{0x1b,1,{0x00}},
{0x1c,1,{0x00}},
{0x1d,1,{0x00}},
{0x1e,1,{0xc0}},
{0x1f,1,{0x00}},
{0x20,1,{0x02}},
{0x21,1,{0x09}},
{0x22,1,{0x00}},
{0x23,1,{0x00}},
{0x24,1,{0x00}},
{0x25,1,{0x00}},
{0x26,1,{0x00}},
{0x27,1,{0x00}},
{0x28,1,{0x55}},
{0x29,1,{0x03}},
{0x2a,1,{0x00}},
{0x2b,1,{0x00}},
{0x2c,1,{0x00}},
{0x2d,1,{0x00}},
{0x2e,1,{0x00}},
{0x2f,1,{0x00}},
{0x30,1,{0x00}},
{0x31,1,{0x00}},
{0x32,1,{0x00}},
{0x33,1,{0x00}},
{0x34,1,{0x00}},
{0x35,1,{0x00}},
{0x36,1,{0x00}},
{0x37,1,{0x00}},
{0x38,1,{0x3C}},
{0x39,1,{0x00}},
{0x3a,1,{0x00}},
{0x3b,1,{0x00}},
{0x3c,1,{0x00}},
{0x3d,1,{0x00}},
{0x3e,1,{0x00}},
{0x3f,1,{0x00}},
{0x40,1,{0x00}},
{0x41,1,{0x00}},
{0x42,1,{0x00}},
{0x43,1,{0x00}},
{0x44,1,{0x00}},
//{0x45,1,{0x00}},
{0x50,1,{0x01}},
{0x51,1,{0x23}},
{0x52,1,{0x45}},
{0x53,1,{0x67}},
{0x54,1,{0x89}},
{0x55,1,{0xab}},
{0x56,1,{0x01}},
{0x57,1,{0x23}},
{0x58,1,{0x45}},
{0x59,1,{0x67}},
{0x5a,1,{0x89}},
{0x5b,1,{0xab}},
{0x5c,1,{0xcd}},
{0x5d,1,{0xef}},
{0x5e,1,{0x01}},
{0x5f,1,{0x0A}}, //FW_CGOUT_L[1] RESE_ODD
{0x60,1,{0x02}}, //FW_CGOUT_L[2] VSSG_ODD
{0x61,1,{0x02}}, //FW_CGOUT_L[3] VSSG_ODD
{0x62,1,{0x08}}, //FW_CGOUT_L[4] STV2_ODD
{0x63,1,{0x15}}, //FW_CGOUT_L[5] VDD2_ODD
{0x64,1,{0x14}}, //FW_CGOUT_L[6] VDD1_ODD
{0x65,1,{0x02}}, //FW_CGOUT_L[7]
{0x66,1,{0x11}}, //FW_CGOUT_L[8] CK11
{0x67,1,{0x10}}, //FW_CGOUT_L[9] CK9
{0x68,1,{0x02}}, //FW_CGOUT_L[10]
{0x69,1,{0x0F}}, //FW_CGOUT_L[11] CK7
{0x6a,1,{0x0E}}, //FW_CGOUT_L[12] CK5
{0x6b,1,{0x02}}, //FW_CGOUT_L[13]
{0x6c,1,{0x0D}}, //FW_CGOUT_L[14] CK3
{0x6d,1,{0x0C}}, //FW_CGOUT_L[15] CK1
{0x6e,1,{0x06}}, //FW_CGOUT_L[16] STV1_ODD
{0x6f,1,{0x02}}, //FW_CGOUT_L[17]
{0x70,1,{0x02}}, //FW_CGOUT_L[18]
{0x71,1,{0x02}}, //FW_CGOUT_L[19]
{0x72,1,{0x02}}, //FW_CGOUT_L[20]
{0x73,1,{0x02}}, //FW_CGOUT_L[21]
{0x74,1,{0x02}}, //FW_CGOUT_L[22]
{0x75,1,{0x0A}}, //BW_CGOUT_L[1] RESE_ODD
{0x76,1,{0x02}}, //BW_CGOUT_L[2] VSSG_ODD
{0x77,1,{0x02}}, //BW_CGOUT_L[3] VSSG_ODD
{0x78,1,{0x06}}, //BW_CGOUT_L[4] STV2_ODD
{0x79,1,{0x15}}, //BW_CGOUT_L[5] VDD2_ODD
{0x7a,1,{0x14}}, //BW_CGOUT_L[6] VDD1_ODD
{0x7b,1,{0x02}}, //BW_CGOUT_L[7]
{0x7c,1,{0x10}}, //BW_CGOUT_L[8] CK11
{0x7d,1,{0x11}}, //BW_CGOUT_L[9] CK9
{0x7e,1,{0x02}}, //BW_CGOUT_L[10]
{0x7f,1,{0x0C}}, //BW_CGOUT_L[11] CK7
{0x80,1,{0x0D}}, //BW_CGOUT_L[12] CK5
{0x81,1,{0x02}}, //BW_CGOUT_L[13]
{0x82,1,{0x0E}}, //BW_CGOUT_L[14] CK3
{0x83,1,{0x0F}}, //BW_CGOUT_L[15] CK1
{0x84,1,{0x08}}, //BW_CGOUT_L[16] STV1_ODD
{0x85,1,{0x02}}, //BW_CGOUT_L[17]
{0x86,1,{0x02}}, //BW_CGOUT_L[18]
{0x87,1,{0x02}}, //BW_CGOUT_L[19]
{0x88,1,{0x02}}, //BW_CGOUT_L[20]
{0x89,1,{0x02}}, //BW_CGOUT_L[21]
{0x8A,1,{0x02}}, //BW_CGOUT_L[22]
{0xFF,3,{0x98,0x81,0x04}},//PAGE4
//{0x00,1,{0x00}},//3L 打开此行
//{0x2F,1,{0x01}},//BIST
{0x3B,1,{0xC0}}, // ILI4003D sel
{0x6C,1,{0x15}},
{0x6E,1,{0x30}}, //VGH 16V
{0x6F,1,{0x55}}, //Pump ratio VGH=VSPX4 VGL=VSNX4
{0x3A,1,{0x24}},
{0x8D,1,{0x1F}},
{0x87,1,{0xBA}},
{0x26,1,{0x76}},
{0xB2,1,{0xD1}},
{0xB5,1,{0x07}},
{0x35,1,{0x1F}},
{0x88,1,{0x0B}},
{0x21,1,{0x30}},
{0xFF,3,{0x98,0x81,0x01}},//PAGE1
{0x22,1,{0x0A}},
{0x31,1,{0x09}},
{0x40,1,{0x33}},
{0x53,1,{0x37}},
{0x55,1,{0x38}},
{0x50,1,{0x95}},
{0x51,1,{0x95}},
{0x60,1,{0x30}},
{0xA0,1,{0x0F}}, //VP255Gamma P
{0xA1,1,{0x17}}, //VP251
{0xA2,1,{0x22}}, //VP247
{0xA3,1,{0x19}}, //VP243
{0xA4,1,{0x15}}, //VP239
{0xA5,1,{0x28}}, //VP231
{0xA6,1,{0x1C}}, //VP219
{0xA7,1,{0x1C}}, //VP203
{0xA8,1,{0x78}}, //VP175
{0xA9,1,{0x1C}}, //VP144
{0xAA,1,{0x28}}, //VP111
{0xAB,1,{0x69}}, //VP80
{0xAC,1,{0x1A}}, //VP52
{0xAD,1,{0x19}}, //VP36
{0xAE,1,{0x4B}}, //VP24
{0xAF,1,{0x22}}, //VP16
{0xB0,1,{0x2A}}, //VP12
{0xB1,1,{0x4B}}, //VP8
{0xB2,1,{0x6B}}, //VP4
{0xB3,1,{0x3F}}, //VP0
{0xC0,1,{0x01}}, //VN255 GAMMA N
{0xC1,1,{0x17}}, //VN251
{0xC2,1,{0x22}}, //VN247
{0xC3,1,{0x19}}, //VN243
{0xC4,1,{0x15}}, //VN239
{0xC5,1,{0x28}}, //VN231
{0xC6,1,{0x1C}}, //VN219
{0xC7,1,{0x1D}}, //VN203
{0xC8,1,{0x78}}, //VN175
{0xC9,1,{0x1C}}, //VN144
{0xCA,1,{0x28}}, //VN111
{0xCB,1,{0x69}}, //VN80
{0xCC,1,{0x1A}}, //VN52
{0xCD,1,{0x19}}, //VN36
{0xCE,1,{0x4B}}, //VN24
{0xCF,1,{0x22}}, //VN16
{0xD0,1,{0x2A}}, //VN12
{0xD1,1,{0x4B}}, //VN8
{0xD2,1,{0x6B}}, //VN4
{0xD3,1,{0x3F}}, //VN0
{0xFF,3,{0x98,0x81,0x00}},//PAGE0
//{0x35,1,{0x00}}, //TE OUT
{0x11,0,{0x00}}, //sleep out
{REGFLAG_DELAY, 120, {}},
{0x29,0,{0x00}}, //display on
{REGFLAG_DELAY, 5, {}},
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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
接口确定
虽然卖家说应该匹配但是我们还是要自己确定一下接口,数据手册第6-7页对比原理图线序,电压确实都和我们的一致。这里需要注意的一个点也是很多同学经常问的,泰山派MIPI接口29脚为什么是3V3我看有些屏幕手册上写的1V8,其实这个脚是决定了27脚的电压的,我们RESET脚电源域是3V3所以当输出高电平的时候也是3V3,我们就把29脚接到了3V3,如果RESET脚电压是1V8那对应的29脚就接1V8,可以在下面数据手册NOTE中看到,如果你担心29脚3V3会烧屏可以问一下卖家确定。
背光电流
前面已经分析了我们泰山派的背光恒流驱动电流是110mA ,屏幕数据手册6页标注了典型电流是140mA所以不会有烧屏幕背光的风险。
屏幕连接
屏幕和泰山派之间通过0.3mm 的 31Pin排线连接,一般排线卖家都会送,否则需要自己买,排线分为同向和反向我们这里用的是同向的,排线尽量不要太长因为mipi是高速信号,屏线长了信号损失和干扰都会增大。
为什么用同向排线?
从泰山派PCB上可以看到FPC座子第一脚MIPI_DSI_VCC_LED+位置
屏幕手册11页页面有告诉我们屏幕的FPC座子第一脚的位置,并且跟进上面我们线序分析的时候就知道他的第一脚是LED+,所以刚同面排线连接的时候第一脚对的上。
屏幕调试
要调试MIPI屏幕我们首先要找到泰山派user设备树 linux/kernel/arch/arm64/boot/dts/tspi-rk3566-user-v10-linux.dts ,并打开 tspi-rk3566-user-v10-linux.dts 设备树头文件,这里面主要是和我们edp相关的设备树配置。
diff --git a/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts b/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts
index 97da688286b2..c80eda51d362 100755
--- a/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts
+++ b/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts
@@ -33,10 +33,10 @@
// #include "tspi-rk3566-edp-v10.dtsi"
//【开/关】mipi 显示屏幕配置,用户可以基于此复制自己的屏幕,注意EDP与MIPI屏幕互斥,因为共用了VOP如果需要同显自行修改
-// #include "tspi-rk3566-dsi-v10.dtsi"
+#include "tspi-rk3566-dsi-v10.dtsi"
//【开/关】HDMI 显示屏幕配置,里面内容几乎可以不用动,如果不需要hdmi显示直接注释掉即可
-#include "tspi-rk3566-hdmi-v10.dtsi"
+// #include "tspi-rk3566-hdmi-v10.dtsi"
//【开/关】摄像头 目前视频的是ov5659
#include "tspi-rk3566-csi-v10.dtsi"
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
tspi-rk3566-dsi-v10.dtsi设备树分析
mipi相关的设备树路径tspisdk/kernel/arch/arm64/boot/dts/rockchip/tspi-rk3566-dsi-v10.dtsi
我们点一个屏幕大多数情况下要修改的其实是有49行,73行与90-98行,这里和大家了聊聊整个mipi相关的设备树,起码简单的知道设备树里面内容有什么含义,怎么来的,如果你是新手看起来吃力可以跳到后面直接填参数。
/ {
backlight: backlight {
compatible = "pwm-backlight";
pwms = <&pwm5 0 25000 0>;
brightness-levels = <...>; // 亮度级别
default-brightness-level = <255>; // 默认亮度级别
};
};
&pwm5 {
status = "okay"; // PWM控制器状态
};
&pinctrl {
dsi1 {
dsi1_rst_gpio: dsi1-rst-gpio {
rockchip,pins = <3 RK_PC1 RK_FUNC_GPIO &pcfg_pull_none>; // DSI1复位引脚配置
};
};
};
/*
* video_phy1 需要在启用 dsi1 时启用
*/
&dsi1 {
status = "okay"; // DSI1控制器状态
};
//注意我们前面有讲到rk3566有两个vop,我们这里就是来链接vop的,你可以选择1或者0这里我们选择0
&dsi1_in_vp0 {
status = "okay"; // 0状态
};
&dsi1_in_vp1 {
status = "disabled"; // DSI1输入虚拟通道1状态
};
&video_phy1 {
status = "okay"; // 视频 PHY1状态
};
&route_dsi1 {
status = "okay"; // 路由 DSI1状态
connect = <&vp0_out_dsi1>; // 连接到 DSI1输入虚拟通道0
};
// 默认 8 寸 800x1280 分辨率
&dsi1 {
status = "okay"; // DSI1控制器状态
rockchip,lane-rate = <480>; // DSI1通道速率
dsi1_panel: panel@0 {
status = "okay"; // DSI1面板状态
compatible = "simple-panel-dsi";
reset-gpios = <&gpio3 RK_PC1 GPIO_ACTIVE_LOW>; // 复位GPIO引脚配置
pinctrl-names = "default";
pinctrl-0 = <&dsi1_rst_gpio>;
reg = <0>;
backlight = <&backlight>; // 关联背光控制节点
reset-delay-ms = <10>;
enable-delay-ms = <120>;
prepare-delay-ms = <20>;
unprepare-delay-ms = <20>;
disable-delay-ms = <50>;
dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_EOT_PACKET)>; // DSI模式标志
dsi,format = <MIPI_DSI_FMT_RGB888>; // DSI格式
dsi,lanes = <4>; // DSI通道数
panel-init-sequence = [
15 00 02 E0 00
15 00 02 E1 93
//.............
05 fa 01 11
05 32 01 29
]; // 面板初始化序列
panel-exit-sequence = [
05 00 01 28
05 00 01 10
]; // 面板退出序列
disp_timings1: display-timings {
native-mode = <&dsi1_timing0>;
dsi1_timing0: timing0 {
clock-frequency = <66000000>; // 时钟频率
hactive = <800>; // 水平像素
vactive = <1280>; // 垂直像素
hfront-porch = <18>; // 水平前廊
hsync-len = <12>; // 水平同步长度
hback-porch = <18>; // 水平后廊
vfront-porch = <24>; // 垂直前廊
vsync-len = <4>; // 垂直同步长度
vback-porch = <12>; // 垂直后廊
hsync-active = <0>; // 水平同步极性激活
vsync-active = <0>; // 垂直同步极性激活
de-active = <0>; // 数据使能极性激活
pixelclk-active = <1>; // 像素时钟极性激活
};
};
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
panel_in_dsi1: endpoint {
remote-endpoint = <&dsi1_out_panel>;
};
};
};
};
ports {
#address-cells = <1>;
#size-cells = <0>;
port@1 {
reg = <1>;
dsi1_out_panel: endpoint {
remote-endpoint = <&panel_in_dsi1>;
};
};
};
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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
背光
定义背光节点,背光节点引用了PWM5,打开了PWM5控制器,在mipi节点中我们去关联了这个背光节点,所以最终的一个链路就是我们可以通过pwm5来控制mipi屏幕的背光。
/ {
backlight: backlight {
compatible = "pwm-backlight";
pwms = <&pwm5 0 25000 0>;
brightness-levels = <...>; // 亮度级别
default-brightness-level = <255>; // 默认亮度级别
};
};
&pwm5 {
status = "okay"; // PWM控制器状态
};
&dsi1 {
//...........
dsi1_panel: panel@0 {
//...........
backlight = <&backlight>; // 关联背光控制节点
//...........
};
//...........
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
GPIO0_C4_d引脚具备复用成pwm5的功能这个可以通过数据手册查到,当然也可以通过.tspi-rk3566-user-v10.dtb.dts.tmp中pwm5相关的pinctrl来验证。所以我们这里吧GPIO0_C4_d连接到了我们背光驱动电路的使能引脚。(这里说个小细节引脚命名后面的_d _u表示的没有配置时候的默认io状态_d表示下拉_u表示上拉,如果你不希望你的屏幕在没有控制的情况在被点亮,这个控制引脚默认状态最好和背光驱动芯片EN引脚的关闭状态对应,比如我们SY7201ABC是低电平关闭所以我们就选择_d结尾并带pwm功能的GPIO0_C4引脚)
PWM5_LCD_BL引脚接到我们背光使能引脚。
复位引脚
下面设备树有省略,这里我们去初始化了复位引脚GPIO控制器,以及配置了mipi屏幕的复位引脚,还是指定了复位延时。
&pinctrl {
dsi1 {
dsi1_rst_gpio: dsi1-rst-gpio {
rockchip,pins = <3 RK_PC1 RK_FUNC_GPIO &pcfg_pull_none>; // DSI1复位引脚配置
};
};
};
// 默认 8 寸 800x1280 分辨率
&dsi1 {
dsi1_panel: panel@0 {
reset-gpios = <&gpio3 RK_PC1 GPIO_ACTIVE_LOW>; // 复位GPIO引脚配置
pinctrl-names = "default";
pinctrl-0 = <&dsi1_rst_gpio>;
reset-delay-ms = <10>; //设置复位延时,这个一般可以在屏幕数据手册里面找到,一般容差都很宽
};
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
复位引脚可以选择普通IO口就行,我们这里选的GPIO3_C1_d,这个引脚他的电源域是VCC_3V3供电的。
看屏幕手册的第7页有注释REST的电压和VDDIO的电压,因为我们27脚RESET连接的GPIO3_C1_d电源域是3V3所以输出高电平的时候就是3V3,那么对应的我们就把29脚Logic power接到了VCC_3V3上。
选择mipi接口
rk3566有两个mipi接口分别是dsi0和dis1,我们泰山派只引出了dsi1所以下面我就打开所有关于dsi1相关的节点。
/*
* video_phy1 需要在启用 dsi1 时启用
*/
&dsi1 {
status = "okay"; // DSI1控制器状态
};
//注意我们前面有讲到rk3566有两个vop,我们这里就是来链接vop的,你可以选择1或者0这里我们选择0
//mipi接口也是有两个的我们这里选择dis1,链接到vp0
&dsi1_in_vp0 {
status = "okay"; // 0状态
};
&dsi1_in_vp1 {
status = "disabled"; // DSI1输入虚拟通道1状态
};
&video_phy1 {
status = "okay"; // 视频 PHY1状态
};
&route_dsi1 {
status = "okay"; // 路由 DSI1状态
connect = <&vp0_out_dsi1>; // 连接到 DSI1输入虚拟通道0
};
// 默认 8 寸 800x1280 分辨率
&dsi1 {
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
配置DSI1速率
指定速率,但是我们一般屏蔽掉,屏蔽后驱动代码会自动计算
&dsi1
//rockchip,lane-rate = <480>; // DSI1通道速率
};
2
3
配置屏幕mipi的lanes数
这个是根据屏幕来配置的,我们如果屏幕有4对差分就设置成4,如果有2对差分就设置成2
&dsi1 {
dsi1_panel: panel@0 {
dsi,lanes = <4>;
};
};
2
3
4
5
这个是我们上面提到的mipi屏幕看他数据手册里面是有4对差分线对,所以dsi,lans需要设置为4
这个是我们后面用到的3.1寸480x800的mipi屏幕看他数据手册(后面提供)里面是有2对差分线对,所以dsi,lans
需要设置为2
MIPI初始化序列
mipi初始化序列非常重要,随便一行或者一个值不对都可能导致没办法点亮屏幕。我们海鲜市场找的屏幕很难驱动很大部分原因也是因为不知道他的初始化序列。初始化序列会去设置屏幕IC显示方式、硬件支持等等。按道理来说你可以通过屏幕IC查到这些值就和你写stm32代码一样可以自己查到寄存器然后去设置,但因为需要设置的值实在是太多了你随便一个错误都可能导致你失败。所以一般情况下我们都是找屏厂要参考序列,他的屏幕不止卖给你一个人都大批量出货的别人早就有成熟参数了,有些出货量大的你甚至可以直接找到rk3566对应的序列。也有少部分屏幕厂商会默认配置好序列,不用我们再去发初始化序列了。
&dsi1 {
dsi1_panel: panel@0 {
/*初始化序列*/
panel-init-sequence = [
15 00 02 E0 00
15 00 02 E1 93
/*...........*/
05 fa 01 11
05 32 01 29
];
/*退出序列*/
panel-exit-sequence = [
05 00 01 28
05 00 01 10
];
};
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
序列格式
瑞芯微的初始化序列格式如下,这个格式很重要哟这是,因为有些屏厂会给其他格式的参考代码,但是内容都是一样的,我们要理解了这写格式以后可以可以根据其他参考来修改。
[包类型][发送延时][数据长度][MIPI屏初始化数据*n个]
例如:
39 00 06 FF 77 01 00 00 11
15 00 02 E0 00
05 00 01 28
2
3
4
5
包类型
上面例子中的39、15、05都是包类型除了这三个当然还有其他的类型,可以在Mipi-DSI-specification-v1-3.pdf手册中60页中查看更多详细的命令,我们平时最常见的就是这三个所以就只讲这三个的用法,整个mipi是非常非常复杂的我们这里还是实用为主,如果大家感兴趣可以自行深入(这篇文章不错推荐感兴趣的小伙伴可以看看https://blog.csdn.net/u013606261/article/details/112535270)
0x39
0x39 DCS Long Write/write_LUT Command Packet
表示的是一个用于传输DCS长写入命令或写入查找表命令的数据包 例如:39 00 06 FF 77 01 00 00 11
39
是 DCS Long Write 命令的操作码,表示这是一个长写命令。00
通常表示发送延时,这里设置为 0,表示没有额外的延时。06
表示后面跟随的参数个数,这里是 6 个字节。FF 77 01 00 00 11
是实际的参数数据。
[DCS指令][发送延时][描述数据长度受DCS指令影响][MIPI屏初始化数据个数由前面的数据长度决定]
39 00 06 FF 77 01 00 00 11
2
0x15
0x15 DCS Short WRITE, 1 parameter
表示的是一个DCS Short WRITE命令数据包,该数据包包含一个参数。这个命令通常用于传输短格式的显示控制命令,用于配置显示器的参数或执行特定的显示控制操作。 例如:15 00 02 E0 00
15
是 DCS Short Write 命令的操作码,表示这是一个短写命令。00
通常表示发送延时,这里设置为 0,表示没有额外的延时。02
表示双字节数据,1 parameter。E0 00
是实际的参数数据。
[DCS指令][发送延时][描述数据长度受DCS指令影响][MIPI屏初始化数据个数由前面的数据长度决定]
15 00 02 E0 00
2
0x05
0x05 DCS Short WRITE, no parameters
表示的这个命令不需要任何参数
例如:05 00 01 28
05
是 DCS Short Write 命令的操作码,表示这是一个短写命令。00
通常表示发送延时,这里设置为 0,表示没有额外的延时。01
表示单字节个数,no parameters。28
是实际的参数数据。
[DCS指令][发送延时][描述数据长度受DCS指令影响][MIPI屏初始化数据个数由前面的数据长度决定]
05 00 01 28
2
timings
这个属性和我们edp一样就不在介绍
屏幕参数调试
配置dsi1并点亮背光
第一步把背光点亮,我们可以先不管序列和timings参数是否正确,背光点亮了后在跟据数据手册和厂家给的序列调试屏幕参
&dsi1 {
status = "okay";
rockchip,lane-rate = <500>;
dsi1_panel: panel@0 {
status = "okay";
compatible = "simple-panel-dsi";
reset-gpios = <&gpio3 RK_PC1 GPIO_ACTIVE_LOW>;
pinctrl-names = "default";
pinctrl-0 = <&dsi1_rst_gpio>;
reg = <0>;
backlight = <&backlight>;
reset-delay-ms = <30>;
enable-delay-ms = <100>;
prepare-delay-ms = <20>;
unprepare-delay-ms = <20>;
disable-delay-ms = <20>;
init-delay-ms = <10>;
dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_EOT_PACKET)>;
dsi,format = <MIPI_DSI_FMT_RGB888>;
dsi,lanes = <4>;
panel-init-sequence = [
];
panel-exit-sequence = [
];
disp_timings1: display-timings {
native-mode = <&dsi1_timing0>;
dsi1_timing0: timing0 {
clock-frequency = <0>;
hactive = <0>;
vactive = <0>;
hfront-porch = <0>;
hsync-len = <0>;
hback-porch = <0>;
vfront-porch = <0>;
vsync-len = <0>;
vback-porch = <0>;
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_dsi1: endpoint {
remote-endpoint = <&dsi1_out_panel>;
};
};
};
};
ports {
#address-cells = <1>;
#size-cells = <0>;
port@1 {
reg = <1>;
dsi1_out_panel: endpoint {
remote-endpoint = <&panel_in_dsi1>;
};
};
};
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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
timings
参考屏厂给的参考屏参或者数据手册第九页填写屏参
找到数据手册里面的内容并填到timings里面,这里我把对应的值进行了注解。
disp_timings1: display-timings {
native-mode = <&dsi1_timing0>;
dsi1_timing0: timing0 {
clock-frequency = <71000000>; //PCLK Frequency
hactive = <800>; //Horizontal Address
vactive = <1280>; //Vertical Address
hfront-porch = <52>; //Horizontal Front Porch
hsync-len = <8>; //Horizontal Synchronization
hback-porch = <48>; //Horizontal Back Porch
vfront-porch = <15>; //Vertical Front Porch
vsync-len = <6>; //Vertical Synchronization
vback-porch = <16>; //Vertical Back Porch
hsync-active = <0>;
vsync-active = <0>;
de-active = <0>;
pixelclk-active = <0>;
};
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
初始化序列
参考下面是屏幕卖家给的初始化序列(文件在上面可以下载),前面已经说过卖家给的可能格式和我们泰山派rk3566的不一样,但是数据内容是一样的我们只需要稍微的转换一下。
{0xFF,3,{0x98,0x81,0x03}},//PAGE3
{0x01,1,{0x00}},
{0x02,1,{0x00}},
{0x03,1,{0x53}},
{0x04,1,{0x53}},
{0x05,1,{0x13}},
{0x06,1,{0x04}},
{0x07,1,{0x02}},
{0x08,1,{0x02}},
{0x09,1,{0x00}},
{0x0a,1,{0x00}},
{0x0b,1,{0x00}},
{0x0c,1,{0x00}},
{0x0d,1,{0x00}},
{0x0e,1,{0x00}},
{0x0f,1,{0x00}},
{0x10,1,{0x00}},
{0x11,1,{0x00}},
{0x12,1,{0x00}},
{0x13,1,{0x00}},
{0x14,1,{0x00}},
{0x15,1,{0x00}},
{0x16,1,{0x00}},
{0x17,1,{0x00}},
{0x18,1,{0x00}},
{0x19,1,{0x00}},
{0x1a,1,{0x00}},
{0x1b,1,{0x00}},
{0x1c,1,{0x00}},
{0x1d,1,{0x00}},
{0x1e,1,{0xc0}},
{0x1f,1,{0x00}},
{0x20,1,{0x02}},
{0x21,1,{0x09}},
{0x22,1,{0x00}},
{0x23,1,{0x00}},
{0x24,1,{0x00}},
{0x25,1,{0x00}},
{0x26,1,{0x00}},
{0x27,1,{0x00}},
{0x28,1,{0x55}},
{0x29,1,{0x03}},
{0x2a,1,{0x00}},
{0x2b,1,{0x00}},
{0x2c,1,{0x00}},
{0x2d,1,{0x00}},
{0x2e,1,{0x00}},
{0x2f,1,{0x00}},
{0x30,1,{0x00}},
{0x31,1,{0x00}},
{0x32,1,{0x00}},
{0x33,1,{0x00}},
{0x34,1,{0x00}},
{0x35,1,{0x00}},
{0x36,1,{0x00}},
{0x37,1,{0x00}},
{0x38,1,{0x3C}},
{0x39,1,{0x00}},
{0x3a,1,{0x00}},
{0x3b,1,{0x00}},
{0x3c,1,{0x00}},
{0x3d,1,{0x00}},
{0x3e,1,{0x00}},
{0x3f,1,{0x00}},
{0x40,1,{0x00}},
{0x41,1,{0x00}},
{0x42,1,{0x00}},
{0x43,1,{0x00}},
{0x44,1,{0x00}},
//{0x45,1,{0x00}},
{0x50,1,{0x01}},
{0x51,1,{0x23}},
{0x52,1,{0x45}},
{0x53,1,{0x67}},
{0x54,1,{0x89}},
{0x55,1,{0xab}},
{0x56,1,{0x01}},
{0x57,1,{0x23}},
{0x58,1,{0x45}},
{0x59,1,{0x67}},
{0x5a,1,{0x89}},
{0x5b,1,{0xab}},
{0x5c,1,{0xcd}},
{0x5d,1,{0xef}},
{0x5e,1,{0x01}},
{0x5f,1,{0x0A}}, //FW_CGOUT_L[1] RESE_ODD
{0x60,1,{0x02}}, //FW_CGOUT_L[2] VSSG_ODD
{0x61,1,{0x02}}, //FW_CGOUT_L[3] VSSG_ODD
{0x62,1,{0x08}}, //FW_CGOUT_L[4] STV2_ODD
{0x63,1,{0x15}}, //FW_CGOUT_L[5] VDD2_ODD
{0x64,1,{0x14}}, //FW_CGOUT_L[6] VDD1_ODD
{0x65,1,{0x02}}, //FW_CGOUT_L[7]
{0x66,1,{0x11}}, //FW_CGOUT_L[8] CK11
{0x67,1,{0x10}}, //FW_CGOUT_L[9] CK9
{0x68,1,{0x02}}, //FW_CGOUT_L[10]
{0x69,1,{0x0F}}, //FW_CGOUT_L[11] CK7
{0x6a,1,{0x0E}}, //FW_CGOUT_L[12] CK5
{0x6b,1,{0x02}}, //FW_CGOUT_L[13]
{0x6c,1,{0x0D}}, //FW_CGOUT_L[14] CK3
{0x6d,1,{0x0C}}, //FW_CGOUT_L[15] CK1
{0x6e,1,{0x06}}, //FW_CGOUT_L[16] STV1_ODD
{0x6f,1,{0x02}}, //FW_CGOUT_L[17]
{0x70,1,{0x02}}, //FW_CGOUT_L[18]
{0x71,1,{0x02}}, //FW_CGOUT_L[19]
{0x72,1,{0x02}}, //FW_CGOUT_L[20]
{0x73,1,{0x02}}, //FW_CGOUT_L[21]
{0x74,1,{0x02}}, //FW_CGOUT_L[22]
{0x75,1,{0x0A}}, //BW_CGOUT_L[1] RESE_ODD
{0x76,1,{0x02}}, //BW_CGOUT_L[2] VSSG_ODD
{0x77,1,{0x02}}, //BW_CGOUT_L[3] VSSG_ODD
{0x78,1,{0x06}}, //BW_CGOUT_L[4] STV2_ODD
{0x79,1,{0x15}}, //BW_CGOUT_L[5] VDD2_ODD
{0x7a,1,{0x14}}, //BW_CGOUT_L[6] VDD1_ODD
{0x7b,1,{0x02}}, //BW_CGOUT_L[7]
{0x7c,1,{0x10}}, //BW_CGOUT_L[8] CK11
{0x7d,1,{0x11}}, //BW_CGOUT_L[9] CK9
{0x7e,1,{0x02}}, //BW_CGOUT_L[10]
{0x7f,1,{0x0C}}, //BW_CGOUT_L[11] CK7
{0x80,1,{0x0D}}, //BW_CGOUT_L[12] CK5
{0x81,1,{0x02}}, //BW_CGOUT_L[13]
{0x82,1,{0x0E}}, //BW_CGOUT_L[14] CK3
{0x83,1,{0x0F}}, //BW_CGOUT_L[15] CK1
{0x84,1,{0x08}}, //BW_CGOUT_L[16] STV1_ODD
{0x85,1,{0x02}}, //BW_CGOUT_L[17]
{0x86,1,{0x02}}, //BW_CGOUT_L[18]
{0x87,1,{0x02}}, //BW_CGOUT_L[19]
{0x88,1,{0x02}}, //BW_CGOUT_L[20]
{0x89,1,{0x02}}, //BW_CGOUT_L[21]
{0x8A,1,{0x02}}, //BW_CGOUT_L[22]
{0xFF,3,{0x98,0x81,0x04}},//PAGE4
//{0x00,1,{0x00}},//3L 打开此行
//{0x2F,1,{0x01}},//BIST
{0x3B,1,{0xC0}}, // ILI4003D sel
{0x6C,1,{0x15}},
{0x6E,1,{0x30}}, //VGH 16V
{0x6F,1,{0x55}}, //Pump ratio VGH=VSPX4 VGL=VSNX4
{0x3A,1,{0x24}},
{0x8D,1,{0x1F}},
{0x87,1,{0xBA}},
{0x26,1,{0x76}},
{0xB2,1,{0xD1}},
{0xB5,1,{0x07}},
{0x35,1,{0x1F}},
{0x88,1,{0x0B}},
{0x21,1,{0x30}},
{0xFF,3,{0x98,0x81,0x01}},//PAGE1
{0x22,1,{0x0A}},
{0x31,1,{0x09}},
{0x40,1,{0x33}},
{0x53,1,{0x37}},
{0x55,1,{0x38}},
{0x50,1,{0x95}},
{0x51,1,{0x95}},
{0x60,1,{0x30}},
{0xA0,1,{0x0F}}, //VP255Gamma P
{0xA1,1,{0x17}}, //VP251
{0xA2,1,{0x22}}, //VP247
{0xA3,1,{0x19}}, //VP243
{0xA4,1,{0x15}}, //VP239
{0xA5,1,{0x28}}, //VP231
{0xA6,1,{0x1C}}, //VP219
{0xA7,1,{0x1C}}, //VP203
{0xA8,1,{0x78}}, //VP175
{0xA9,1,{0x1C}}, //VP144
{0xAA,1,{0x28}}, //VP111
{0xAB,1,{0x69}}, //VP80
{0xAC,1,{0x1A}}, //VP52
{0xAD,1,{0x19}}, //VP36
{0xAE,1,{0x4B}}, //VP24
{0xAF,1,{0x22}}, //VP16
{0xB0,1,{0x2A}}, //VP12
{0xB1,1,{0x4B}}, //VP8
{0xB2,1,{0x6B}}, //VP4
{0xB3,1,{0x3F}}, //VP0
{0xC0,1,{0x01}}, //VN255 GAMMA N
{0xC1,1,{0x17}}, //VN251
{0xC2,1,{0x22}}, //VN247
{0xC3,1,{0x19}}, //VN243
{0xC4,1,{0x15}}, //VN239
{0xC5,1,{0x28}}, //VN231
{0xC6,1,{0x1C}}, //VN219
{0xC7,1,{0x1D}}, //VN203
{0xC8,1,{0x78}}, //VN175
{0xC9,1,{0x1C}}, //VN144
{0xCA,1,{0x28}}, //VN111
{0xCB,1,{0x69}}, //VN80
{0xCC,1,{0x1A}}, //VN52
{0xCD,1,{0x19}}, //VN36
{0xCE,1,{0x4B}}, //VN24
{0xCF,1,{0x22}}, //VN16
{0xD0,1,{0x2A}}, //VN12
{0xD1,1,{0x4B}}, //VN8
{0xD2,1,{0x6B}}, //VN4
{0xD3,1,{0x3F}}, //VN0
{0xFF,3,{0x98,0x81,0x00}},//PAGE0
//{0x35,1,{0x00}}, //TE OUT
{0x11,0,{0x00}}, //sleep out
{REGFLAG_DELAY, 120, {}},
{0x29,0,{0x00}}, //display on
{REGFLAG_DELAY, 5, {}},
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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
看这个参考序列内容得到以下规律 格式1:[地址][长度][数据] 例如:
[地址] [长度] [数据]
{0xFF, 3, {0x98,0x81,0x03}},
{0x01, 1, {0x00}},
2
3
格式2:[延时类型][延时时间][空] 例如:
[延时类型] [延时时间] [空值]
{REGFLAG_DELAY, 120, {}},
2
我们前面说了泰山派rk3566的序列格式如下: 格式:[包类型][发送延时][数据长度][MIPI屏初始化数据*n个] 第1行转换:
转换前
{0xFF,3,{0x98,0x81,0x03}},//PAGE3
2
[包类型]:转换前为3个参数长度的数据所以我们需要用长写命令0x39
[发送延时]:下一行没有任何延时所以时间就是00ms
[数据长度]:地址+数据一起总共有4个数据所以我们长度为4
[MIPI屏初始化数据*n个]:数据内容就是地址和数据一起
转换后
39 00 04 FF 98 81 03
2
第2行转换:
转换前
{0x01,1,{0x00}},
2
[包类型]:转换前为1个参数长度的数据所以我们需要用短写命令0x15
[发送延时]:下一行没有任何延时所以时间就是00ms
[数据长度]:地址+数据一起总共有4个数据所以我们长度为2
[MIPI屏初始化数据*n个]:数据内容就是地址和数据一起
转换后
15 00 02 01 00
第207-208行转换:
转换前
{0x11,0,{0x00}}, //sleep out
{REGFLAG_DELAY, 120, {}},
2
3
[包类型]:转换前为0个参数长度的数据所以我们需要用短写命令0x05
[发送延时]:下一个行有一个120ms的延时所以时间就是0x78ms
[数据长度]:地址+数据一起总共有4个数据所以我们长度为1
[MIPI屏初始化数据*n个]:数据内容就是单地址,因为数据为空
转换后
05 78 01 11
2
按照这个规则全部转换过来后的内容如下:
panel-init-sequence = [
39 00 04 FF 98 81 03
15 00 02 01 00
15 00 02 02 00
15 00 02 03 53
15 00 02 04 53
15 00 02 05 13
15 00 02 06 04
15 00 02 07 02
15 00 02 08 02
15 00 02 09 00
15 00 02 0a 00
15 00 02 0b 00
15 00 02 0c 00
15 00 02 0d 00
15 00 02 0e 00
15 00 02 0f 00
15 00 02 10 00
15 00 02 11 00
15 00 02 12 00
15 00 02 13 00
15 00 02 14 00
15 00 02 15 00
15 00 02 16 00
15 00 02 17 00
15 00 02 18 00
15 00 02 19 00
15 00 02 1a 00
15 00 02 1b 00
15 00 02 1c 00
15 00 02 1d 00
15 00 02 1e c0
15 00 02 1f 00
15 00 02 20 02
15 00 02 21 09
15 00 02 22 00
15 00 02 23 00
15 00 02 24 00
15 00 02 25 00
15 00 02 26 00
15 00 02 27 00
15 00 02 28 55
15 00 02 29 03
15 00 02 2a 00
15 00 02 2b 00
15 00 02 2c 00
15 00 02 2d 00
15 00 02 2e 00
15 00 02 2f 00
15 00 02 30 00
15 00 02 31 00
15 00 02 32 00
15 00 02 33 00
15 00 02 34 00
15 00 02 35 00
15 00 02 36 00
15 00 02 37 00
15 00 02 38 3C
15 00 02 39 00
15 00 02 3a 00
15 00 02 3b 00
15 00 02 3c 00
15 00 02 3d 00
15 00 02 3e 00
15 00 02 3f 00
15 00 02 40 00
15 00 02 41 00
15 00 02 42 00
15 00 02 43 00
15 00 02 44 00
15 00 02 50 01
15 00 02 51 23
15 00 02 52 45
15 00 02 53 67
15 00 02 54 89
15 00 02 55 ab
15 00 02 56 01
15 00 02 57 23
15 00 02 58 45
15 00 02 59 67
15 00 02 5a 89
15 00 02 5b ab
15 00 02 5c cd
15 00 02 5d ef
15 00 02 5e 01
15 00 02 5f 0A
15 00 02 60 02
15 00 02 61 02
15 00 02 62 08
15 00 02 63 15
15 00 02 64 14
15 00 02 65 02
15 00 02 66 11
15 00 02 67 10
15 00 02 68 02
15 00 02 69 0F
15 00 02 6a 0E
15 00 02 6b 02
15 00 02 6c 0D
15 00 02 6d 0C
15 00 02 6e 06
15 00 02 6f 02
15 00 02 70 02
15 00 02 71 02
15 00 02 72 02
15 00 02 73 02
15 00 02 74 02
15 00 02 75 0A
15 00 02 76 02
15 00 02 77 02
15 00 02 78 06
15 00 02 79 15
15 00 02 7a 14
15 00 02 7b 02
15 00 02 7c 10
15 00 02 7d 11
15 00 02 7e 02
15 00 02 7f 0C
15 00 02 80 0D
15 00 02 81 02
15 00 02 82 0E
15 00 02 83 0F
15 00 02 84 08
15 00 02 85 02
15 00 02 86 02
15 00 02 87 02
15 00 02 88 02
15 00 02 89 02
15 00 02 8A 02
39 00 04 FF 98 81 04
//15 00 02 00 00 //
// 15 00 02 2F 01 //bist 用户调试,屏幕会闪演示测试
15 00 02 3B C0
15 00 02 6C 15
15 00 02 6E 30
15 00 02 6F 55
15 00 02 3A 24
15 00 02 8D 1F
15 00 02 87 BA
15 00 02 26 76
15 00 02 B2 D1
15 00 02 B5 07
15 00 02 35 1F
15 00 02 88 0B
15 00 02 21 09
39 00 04 FF 98 81 01
15 00 02 22 0A
15 00 02 31 09
15 00 02 40 33
15 00 02 53 37
15 00 02 55 38
15 00 02 50 95
15 00 02 51 95
15 00 02 60 30
15 00 02 A0 0F
15 00 02 A1 17
15 00 02 A2 22
15 00 02 A3 19
15 00 02 A4 15
15 00 02 A5 28
15 00 02 A6 1C
15 00 02 A7 1C
15 00 02 A8 78
15 00 02 A9 1C
15 00 02 AA 28
15 00 02 AB 69
15 00 02 AC 1A
15 00 02 AD 19
15 00 02 AE 4B
15 00 02 AF 22
15 00 02 B0 2A
15 00 02 B1 4B
15 00 02 B2 6B
15 00 02 B3 3F
15 00 02 C0 01
15 00 02 C1 17
15 00 02 C2 22
15 00 02 C3 19
15 00 02 C4 15
15 00 02 C5 28
15 00 02 C6 1C
15 00 02 C7 1D
15 00 02 C8 78
15 00 02 C9 1C
15 00 02 CA 28
15 00 02 CB 69
15 00 02 CC 1A
15 00 02 CD 19
15 00 02 CE 4B
15 00 02 CF 22
15 00 02 D0 2A
15 00 02 D1 4B
15 00 02 D2 6B
15 00 02 D3 3F
39 00 04 FF 98 81 00
05 78 01 11
05 05 01 29
];
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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
至此我们的屏参就填写完成了,把timings和初始化序列代替到你的Android和Linux中去编译下载后就可以点亮此案例屏幕
补丁
Linux补丁
【tspi_Linux_mipi800x1280_patch.zip】下载
📌 在 下载中心
->百度网盘(立创·泰山派开发板资料)
->第09章.【立创·泰山派】项目案例
->【智能小手机】项目资料
->5.屏幕选型与调试
->MIPI屏资料
->代码补丁
->tspi_Linux_mipi800x1280_patch.zip
。
Android的补丁这里面还包含了触摸的单mipi显示只需修改tspi-rk3566-dsi-v10.dtsi
【tspi_Android_mipi800x1280_patch.zip】下载
📌 在 下载中心
->百度网盘(立创·泰山派开发板资料)
->第09章.【立创·泰山派】项目案例
->【智能小手机】项目资料
->5.屏幕选型与调试
->MIPI屏资料
->代码补丁
->tspi_Android_mipi800x1280_patch.zip
。
验证
单独编译内核(不会看前面SDK编译章节:SDK编译),然后烧录!
序列解析
我知道有一些好奇心强的宝宝肯定会疑问这些参数是啥呀为什么要配置他们配置了有什么用呢?其实他就是和用i2c和spi屏的时候一样的都是去写屏幕驱动IC相关配置。为了一探究竟我们需要找到屏幕用的什么驱动IC并得到驱动IC的数据手册。
厂家给的数据手册第四页有描述驱动使用的是ILI9881C
我在网上找到了这个驱动IC的数据手册:
【ILI9881C-MIIPI-DataSheet.pdf】下载
📌 在 下载中心
->百度网盘(立创·泰山派开发板资料)
->第09章.【立创·泰山派】项目案例
->【智能小手机】项目资料
->5.屏幕选型与调试
->MIPI屏资料
->屏幕资料
->ILI9881C-MIIPI-DataSheet.pdf
。
命令相关操作在113页,第五章Command开始
上面内容描述了ILI9881C总共有5页Page1—Page4以及每页的进入和退出命令。那我们现在再来看初始化序列39 00 04 FF 98 81 XX
对应的就是进入某一页。 例如:
39 00 04 FF 98 81 03 //进入Page3页
/*...页面3相关寄存器操作....*/
39 00 04 FF 98 81 04 //进入Page4页
/*...页面4相关寄存器操作....*/
39 00 04 FF 98 81 01 //进入Page1页
/*...页面1相关寄存器操作....*/
39 00 04 FF 98 81 00 //进入Page0页
/*...页面0相关寄存器操作....*/
2
3
4
5
6
7
8
进入某一也以后会去写相关的寄存器,如下面序列开始先进入第三页,然后写第三页的寄存器0x01-0x8A(图片有删减)
ILI9881C数据手册115页5.2.4小节
每个寄存器都有特定的功能,比如我们下面实现一个通过写Page4的2F寄存器实现屏幕闪烁测试
ILI9881C数据手册118页5.2.5小节BIST Mode Function
ILI9881C数据手册236页5.7.6小节BIST Mode Function的详细使用,我们序列里面是往0x2F地址写了0x01,那么就是操作了FRM_EN位,把FRM_EN设置为1也就使能Enable BIST mode(BIST内部自测试Built-In Self-Test)
编译下载测试
再来一个通过修改序列把mipi屏幕镜像
ILI9881C数据手册109页5.2.1小节Memory Access
ILI9881C数据手册145页5.3.21小节Memory Access Control详细使用,我们序列里面往0x36地址写了0x02,那么就是操作了SS位,改变了Display方向。
效果