一、基本信息
- 开发板:RV1126
- linux版本:4.19.111
- 显示屏:HX070JGI50(7寸)
- 显示器分别率:1024 * 600
二、MIPI协议
-
连接示意图(图片来源,正点资料)

-
MIPI DSI 分层

注意: 屏幕,应用层有 DCS,协议层主要有 DSI,物理层有 A-PHY、C-PHY、D-PHY
-
数据发送和接收示意图


注意: 多 lan 通信数据非整数倍传输时,没数据的 lan 通道先进入 EoT 模式。
-
通道 lan 模块

注意: 实际的 Lane 模块是图中简化而来的,其中高速收发器有 HS-TX、HS-RX,低速收发器有 LP-RX 和 LP-TX,以及一个低速竞争检测器 LP-CD,对于高速单向数据通道,可能只有 HS-TX 或者 HS-RX
-
D-PHY 信号电平

注意: 图中蓝色实线是 LP 模式下的信号波形示例,电压为 0~1.2V。绿色虚线是 LP 模式下信号的高低电平门限。红色实线是 HS 模式下的信号波形示例,中心电平 200mV
-
通道状态

-
数据 Lane 三种工作模式
D-PHY 协议规定了,通过 Lane 的不同状态转换有三种工作模式:控制模式、高速模式和 Escape 模式。控制模式和 Escape 模式都属于 LP,高速模式属于 HS。正常情况下,数据 Lane 工作在控制模式或者高速模式下
-
控制模式
这个我也不清楚,据说 LAN 复位后,数据通道处于 control 模式(LP-11)。其他模式都是开始或者结束于control模式。常见的如 HS-Rqst,LP-Rqst,STOP
-
高速模式

-
Escape 模式
对于数据 Lanes,进入 Escape 模式以后,应该紧接着发送一个 8bit 的命令来表示接下来要做的操作,命令如图所示


注意: 低 bit 先发送,所以对应的十六进制就是 0X87(0X10000111)
Escape 模式下发送这三个命令的时序图如图 24.3.4.4 所示:

三、LCD 屏幕概念
-
名词含义
缩写 |
英文全称 |
含义 |
HSYNC |
Horizontal Sync |
水平同步 |
HLW/HPW |
Horizontal Low Pulse Width |
水平同步信号宽度 |
HSA |
Horizontal Sync Active |
水平同步有效 |
HSS |
Horizontal Sync Start |
水平同步开始 |
HSE |
Horizontal Sync End |
水平同步结束 |
HBP |
Horizontal Back Porch |
水平后肩 |
HFP |
Horizontal Front Porch |
水平前肩 |
HACT |
Horizontal Active |
水平有效区域,也就是屏幕有效宽度 |
VSYNC |
Vertical Sync |
垂直同步 |
VLW/VPW |
Vertical Low Pulse Width |
垂直同步信号宽度 |
VSA |
Vertical Sync Active |
垂直同步信号宽度 |
VSS |
Vertical Sync Start |
垂直同步开始 |
VSE |
Vertical Sync End |
垂直同步结束 |
HBP |
Vertical Back Porch |
垂直后肩 |
VACT |
Vertical Active |
垂直有效区域,也就是屏幕有效高度 |
VFP |
Vertical Front Porch 垂直前肩 |
|
RGB |
— |
在这里指 RGB 原始像素数据流 |
LPM |
Low Power Mode |
低功耗模式 |
BLLP |
Blanking or Low-Power periods |
没有包含有效数据的数据包或者进入 LP 模式下的状态,称为 BLLP |
-
video 和 command 模式
简单来说,就是显示器有中有无缓冲区,有缓冲区时是 command 模式,刷新时直接从缓冲区获取刷新,通过命令更改缓冲区内容;无缓冲区时是 video 模式,所有数据都是从通道中获取刷新
-
command 模式

-
video 模式

-
LCD 显示结构

-
长短数据包
-
长数据包

图中绿色的部分就是长包结构,长包有 3 部分:32-bit 的 PH(包头)、用于自定义的负载数据、16-bit 的包尾(PF)。PH 有 3 部分:8-bit 的 DI,16-bit 的 WC 以及 8-bit 的 ECC。PF 只有 1 部分:16-bit 的校验和,因此长包数据长度范围是 6~65541 个字节。
-
短数据包

图就是短数据包结构,只有一个 PH(包头),PH 分为 3 部分:和长数据包一样,第 1 个就是 8-bit 的 DI 域;接下来是 2 个字节的数据负载域,也就是用户要实际发送的内容;最后是一个 8-bit 的 ECC 域,可以实现 1bit 纠错,2 比特错误检测
-
常用指令

-
MIPI DSI 时钟计算

注意:一般说的 MIPI DSI 时钟要在这个时间测量到的频率上乘以 2,因为双边沿采集,
实际的屏幕帧率肯定到不了 60fps,网上有些资料说对于瑞芯微的平台,实际设置的 MIPI DSI 速度是理论的 1.2 倍即可,所以对于 rv1126 来说还需要在时钟上 * 1.2。
四、DSI 调试
弄明白上面的知识点后,调试 DSI 相对就比较简单了,有不明白的地方可以参考正点的教程和瑞芯微的手册已经MIPI协议文档,这里我只是做一个总结,便于自己在调试的时候好查找资料
-
设备树
&dsi {
status = "okay";
// rockchip,lane-rate = <480>;
panel@0 {
compatible = "ilitek,ili9881d", "simple-panel-dsi";
reg = <0>;
backlight = <&backlight>;
power-supply = <&vcc18_lcd_n>;
prepare-delay-ms = <5>;
reset-delay-ms = <1>;
init-delay-ms = <80>;
disable-delay-ms = <10>;
unprepare-delay-ms = <5>;
width-mm = <68>;
height-mm = <121>;
// reset-gpios = <&gpio0 RK_PA2 GPIO_ACTIVE_LOW>;
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 = [
15 00 02 80 8B
15 00 02 81 78
15 00 02 82 84
15 00 02 83 88
15 00 02 84 A8
15 00 02 85 E3
15 00 02 86 88
];
display-timings {
native-mode = <&timing0>;
timing0: timing0 {
clock-frequency = <53000000>;
hactive = <1024>;
vactive = <600>;
hback-porch = <160>;
hfront-porch = <160>;
hsync-len = <10>;
vback-porch = <23>;
vfront-porch = <12>;
vsync-len = <1>;
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_dsi: endpoint {
remote-endpoint = <&dsi_out_panel>;
};
};
};
};
ports {
#address-cells = <1>;
#size-cells = <0>;
port@1 {
reg = <1>;
dsi_out_panel: endpoint {
remote-endpoint = <&panel_in_dsi>;
};
};
};
};
注意: lane-rate 不配置时,时钟在驱动中会自动计算,所以多事情况下都会屏蔽即可
-
设备树修改说明
看着设备说的信息很多,不要怕,其实很简单,对应的注释这里我就不详细说明了,网上也有很多博客介绍,此笔记主要是记录流程以及遇到的一些问题
-
clock-frequency 计算
clock-frequency = 水平总周期 * 垂直总周期 * 帧率(取一个相近值即可)
clock-frequency = (hactive + hback-porch + hfront-porch + hsync-len) * (vactive + vback-porch + vfront-porch + vsync-len) * fps
-
文档位置
-
Kernel (develop-4.4)
drivers/gpu/drm/rockchip/dw-mipi-dsi.c
drivers/phy/rockchip/phy-rockchip-inno-video-combo-phy.c
Documentation/devicetree/bindings/display/rockchip/dw_mipi_dsi_rockchip.txt
Documentation/devicetree/bindings/phy/phy-rockchip-inno-video-combo-phy.txt
-
U-Boot (next-dev)
drivers/video/drm/dw_mipi_dsi.c
drivers/video/drm/inno_video_combo_phy.c
-
U-boot (rkdevelop)
drivers/video/rockchip-dw-mipi-dsi.c
drivers/video/rockchip-inno-mipi-dphy.c
注意: 一般调试 DSI 不用修改驱动文件,只需要修改设备树即可
-
确认驱动加载

注意: Drm 驱动的加载存在依赖关系,所以可能会多次因为驱动资源暂时获取不到而返回 -EPROBE_DEFER(-517),但是只要配置正确,待相关组件驱动能够完整获取到资源后,最终就会 bound 成功。
-
当前显示信息

-
查看 LCD 信息

五、调试问题
-
不论修改设备树中的说明内容,显示屏都无明显变化
解决办法:可能是设备树不是当前使用的
-
左半边花屏
解决办法:检查设备树配置的尺寸,降低时钟
-
横竖屏转换
解决办法:这个需要注意 LCD 的扫描方式,有的 LCD 可能是通过命令配置,有的可能是通过硬件配置。
参考资料
- 【正点原子】ATK-DLRV1126嵌入式Linux驱动开发指南V1.2.pdf
- Rockchip_DRM_Panel_Porting_Guide_V1.6_20190228.pdf
- MIPI DSI Specification_v1-3.pdf
- Linux MIPI DSI驱动调试笔记-LCD时序参数配置(三):https://developer.aliyun.com/article/1326393
- LCD之mipi DSI接口驱动调试流程:https://blog.csdn.net/qq_33003441/article/details/82492763
原文链接:https://www.cnblogs.com/jzcn/p/17954326