4.3.17. LCD屏幕调试指南
4.3.17.1. LCD 概述
LCD(Liquid Crystal Display)是
X5 系列
4.3.17.2. 接口说明
EVB 板卡24-pin LCD 接口,主要
1 路 MIPI DSI 时钟
线 4 路 MIPI DSI 数据信号
1 路 I²C 接口
GND、3.3V 电源
RST 复位
引脚 VLEDA、VLEDK 背光
供电/控制 引脚
X5 MD 板卡22-pin LCD 接口,整体EVB 板卡
4.3.17.3. MIPI-DSI规格参数
X5的MIPI-DSI接口
最大
支持四路 数据通路 每
一路 最高 速率 为 2.5Gbps支持
Non-Burst-Sync-Pulse同步脉冲 模式和 Non-Burst-Sync-Even同步事件 模式以及 Burst突发模式支持
MIPI_DSI_CLOCK_NON_CONTINUOUS非连续 模式时钟 和 MIPI_DSI_CLOCK_CONTINUOUS连续时钟 模式
4.3.17.4. 功能原理
MIPI DSI
MIPI DSI(Display Serial Interface)是初始化阶段(Command Mode) 和 视频数据传输阶段(Video Mode)。
初始化阶段(Command Mode)
LCD 上电后,首先
进入 DSI LP 模式
通过
硬件 管脚 复位,或者 发送DSI软件 复位 命令 DCS Soft Reset (0x01)发送
寄存器 配置 序列 此
步骤 是 LCD 初始化 的 核心,每款 LCD 都 有 对应 的 寄存器 脚本,内容 包括: 色彩
格式 设置(如 RGB888、RGB565) Lane 数
配置(1/2/4 Lane) 垂直/水平
时序 参数(VBP/VFP/HBP/HFP) 刷新率、极性
设置 Gamma 曲线、电源
电压 参数 驱动
芯片 内部 寄存器 初始化
视频数据传输阶段(Video Mode)
初始化
工作
使用
高速 差分 信号 数据
速率 可 达 数百 MHz ~ 数 GHz 连续
输出 全帧 RGB 像素 数据 帧
率 通常 为 60Hz / 90Hz / 120Hz
数据
像素
Video Line Packet
每
Packet Header(字节
类型、长度、数据 ID) 如:0x39(Long Write)
Payload:一
整行 的 像素 数据(RGB888/RGB565 等) ECC/CRC 校验:确保
数据完整性
整个
触控
在
目前
Goodix:GT911、GT5688、GT7388 等
FocalTech:FT5436、FT5x06、FT6336 等
Ilitek:ILI210x 系列
Himax:HX8526、HX83102 等
Mstar(已
并入 联咏):MSG22xx 系列
这些 IC 都
背光控制
X5 EVB 使用LPWM 1_1输出SY7200AABC 接收
PWM 控制
信号 输入(DIM/PWM 引脚) PWM 的
占空比 对应 所 需 背 光亮度,例如: 占空比
高 → 调光 指令 大 → LED 电流 大 → 背光 更亮 占空比
低 → 亮度 降低 0% 占空比
可 实现 背光 关闭 SY7200AABC 通过
对 PWM 信号 进行 采样 和 内部 调光 控制,将 其 转换 为 LED 电流 调节 量
4.3.17.5. 调试流程
获取屏幕信息
在
屏幕
的 时序,即 hbp、hfp、hsa、vbp、vfp、vsa屏幕
的 初始化 序列 屏幕
支持 的 传输 模式,是 burst还是non-burst屏幕
支持 的 时钟 模式,是 continuous还是non-continuous屏幕lane数,是
1还是2还是4触摸屏
驱动 背光
控制 方式
以JC050HD134这
时序
#define Width 720
#define Height 1280
#define VFP 20
#define VBP 20
#define VSA 4
#define HFP 32
#define HBP 20
#define HSA 20
初始化
序列
DSI_CMD(0x04);DSI_PA(0xB9);
DSI_PA(0xF1);
DSI_PA(0x12);
DSI_PA(0x83);
DSI_CMD(0x1C);DSI_PA(0xBA);
DSI_PA(0x33); // 1
DSI_PA(0x81); // 2
DSI_PA(0x05); // 3
DSI_PA(0xF9); // 4
DSI_PA(0x0E); // 5
DSI_PA(0x0E); // 6
DSI_PA(0x20); // 7
DSI_PA(0x00); // 8
DSI_PA(0x00); // 9
DSI_PA(0x00); //10
DSI_PA(0x00); //11
DSI_PA(0x00); //12
DSI_PA(0x00); //13
DSI_PA(0x00); //14
DSI_PA(0x44); //15
DSI_PA(0x25); //16
DSI_PA(0x00); //17
DSI_PA(0x91); //18
DSI_PA(0x0A); //19
DSI_PA(0x00); //20
DSI_PA(0x00); //21
DSI_PA(0x02); //22
DSI_PA(0x4F); //23
DSI_PA(0xD1); //24
DSI_PA(0x00); //25
DSI_PA(0x00); //26
DSI_PA(0x37); //27
屏幕
支持 的 传输 模式 non-burst屏幕
支持 的 时钟 模式 continuous屏幕lane数
4触摸屏
驱动 无背光
控制 方式 适配24pin的VLEDA、VLEDK
开发Kernel 驱动
Kernel里面panel-atk-md0550.c,后续
将kernel/drivers/gpu/drm/panel/panel-atk-md0550.c拷贝panel-jc-050hd134.c。
以下panel-jc-050hd134.c。
修改panel_simple_dsi_driver的name属性panel-jc-050hd134:
static struct mipi_dsi_driver panel_simple_dsi_driver = {
.driver =
{
.name = "panel-jc-050hd134",
.of_match_table = dsi_of_match,
},
.probe = panel_simple_dsi_probe,
.remove = panel_simple_dsi_remove,
.shutdown = panel_simple_dsi_shutdown,
};
修改drm_display_mode结构
static const struct drm_display_mode jc_050hd134_mode = { // 修改结构体名字为 jc_050hd134_mode
.clock = 65000, //像素时钟 单位为khz,计算公式为:fps * (htotal + vtotal)
.hdisplay = 720, //可视区域宽
.hsync_start = 720 + 32, //hdisplay + hfp
.hsync_end = 720 + 32 + 20, //hsync_start + hsa
.htotal = 720 + 32 + 20 + 20, //hsync_end + hbp
.vdisplay = 1280, // 可视区域高
.vsync_start = 1280 + 20, //vdisplay + vfp
.vsync_end = 1280 + 20 + 4, // vsync_start + vsa
.vtotal = 1280 + 20 + 4 + 20, // vsync_end + vbp
.flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, //极性
};
修改panel_desc_dsi结构
static const struct panel_desc_dsi jc_050hd134 = { //结构体重命名为 jc_050hd134
.desc =
{
.modes = &jc_050hd134_mode, // 指向时序结构体
.num_modes = 1, // 这个面板有多少组时序,一般来讲只有一组
.bpc = 8, // 每种色彩占多少bit?RGB888 即每个颜色占8bit,RGB666 即每个颜色占6bit
.size = // 可视区域的物理大小,以mm(毫米)为单位
{
.width = 62,
.height = 110,
},
.connector_type = DRM_MODE_CONNECTOR_DSI,
},
.flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE, // DSI模式标志位,这里表明该面板工作在video模式下,并且是non-burst模式
//更多标志位,请参见kernel/include/drm/drm_mipi_dsi.h
.format = MIPI_DSI_FMT_RGB888,// 面板色彩类型
.lanes = 4, //数据lane数
};
mode_flags用于
| mode_flags | 描述 |
|---|---|
| MIPI_DSI_MODE_VIDEO | 启用 |
| MIPI_DSI_MODE_VIDEO_BURST | 启用 Burst 视频模式,像素 |
| MIPI_DSI_MODE_VIDEO_SYNC_PULSE | 启用 同步 |
| MIPI_DSI_MODE_VIDEO_AUTO_VERT | 启用 自动 |
| MIPI_DSI_MODE_VIDEO_HSE | 在 VSYNC 脉冲 |
| MIPI_DSI_MODE_VIDEO_NO_HFP | 禁用 水平 |
| MIPI_DSI_MODE_VIDEO_NO_HBP | 禁用 水平 |
| MIPI_DSI_MODE_VIDEO_NO_HSA | 禁用 水平 |
| MIPI_DSI_MODE_VSYNC_FLUSH | 在 VSYNC 脉冲 |
| MIPI_DSI_MODE_NO_EOT_PACKET | 在 HS 模式 下 |
| MIPI_DSI_CLOCK_NON_CONTINUOUS | 启用 非 |
| MIPI_DSI_MODE_LPM | 启用 低功耗 |
| MIPI_DSI_HS_PKT_END_ALIGNED | 高速 |
其中,MIPI_DSI_MODE_VIDEO、MIPI_DSI_MODE_VIDEO_SYNC_PULSE 以及 MIPI_DSI_MODE_LPM 这
修改dsi_of_match,为了
static const struct of_device_id dsi_of_match[] = {
{.compatible = "jc-050hd134", .data = &jc_050hd134},
{
/* sentinel */
}};
MODULE_DEVICE_TABLE(of, dsi_of_match);
修改panel_simple_dsi_init函数,这个dsi_dcs_write_seq这个mipi初始化
初始化
dsi_dcs_write_seq(dsi, 0xb9, 0xF1, 0x12, 0x83);
dsi_dcs_write_seq(dsi, 0xBA, 0x33, 0x81, 0x05, 0xF9, 0x0E, 0x0E, 0x20, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0x00, 0x91, 0x0A, 0x00, 0x00, 0x02,
0x4F, 0xD1, 0x00, 0x00, 0x37);
......
可以
如果
panel-init-sequence-zero = [
39 00 04 B9 FF 83 94
15 00 02 36 01
39 00 07 BA 63 03 68 6B B2 C0
39 00 0B B1 48 12 72 09 32 54 71 71 57 47
......
]
转换
dsi_dcs_write_seq(dsi, 0xb9, 0xff, 0x83, 0x94);
dsi_dcs_write_seq(dsi, 0x36, 0x01);
dsi_dcs_write_seq(dsi, 0xba, 0x63, 0x03, 0x68, 0x6b, 0xb2, 0xc0);
dsi_dcs_write_seq(dsi, 0xb1, 0x48, 0x12, 0x72, 0x09, 0x32, 0x54, 0x71, 0x71, 0x57, 0x47);
在39 00 04 B9 FF 83 94为例,进行
39 表示
本组 初始化 序列 是 按照 MIPI_DSI_DCS_LONG_WRITE(0x39)数据类型写入,转换 为 驱动 代码 时 不 需要 填写,会 根据 本组 参数 长度 自动 生成
00 表示本次 写入 之后,睡眠0ms,可以 调用 msleep(ms)函数实现
04 标识本次 写入 序列 的 长度,会 自动 生成 不用 填写
后续的 就是 初始化 序列 了
对于panel_simple_prepare和panel_simple_unprepare这gpio行为,这
修改kernel/drivers/gpu/drm/panel/Kconfig和kernel/drivers/gpu/drm/panel/Makefile
Kconfig:
config DRM_PANEL_JC_050HD134
tristate "JC 050HD134 panel"
depends on OF
depends on DRM_MIPI_DSI
depends on BACKLIGHT_CLASS_DEVICE
select VIDEOMODE_HELPERS
help
Say Y here if you want to enable support for the JC050HD134
panel with 720x1280 resolution. This panel support
MIPI DSI interface.
Makefile:
obj-$(CONFIG_DRM_PANEL_JC_050HD134) += panel-jc-050hd134.o
配置Kernel 设备树
在kernel/arch/arm64/boot/dts/hobot/x5-evb.dtsi为例
在mipi_dsi0节点
&mipi_dsi0 {
status = "okay";
ports {
port@1 {
reg = <1>;
mipi_dsi_out: endpoint {
remote-endpoint = <&panel_in>;
};
};
};
dsi_panel0@0 {
compatible = "jc-050hd134"; //此处与 dsi_of_match 一致
reg = <0>;
pinctrl-names = "default";
pinctrl-0 = <&lsio_gpio0_14>; // 与复位管脚相关
reset-gpios = <&ls_gpio0_porta 14 GPIO_ACTIVE_HIGH>; // 与复位管脚相关 什么电平有效需要根据您的屏幕来决定
backlight = <&dsi_backlight>; // 背光相关
port {
panel_in: endpoint {
remote-endpoint =
<&mipi_dsi_out>;
};
};
};
};
添加dsi_backlight节点:
&dsi_backlight {
status = "okay";
pwms = <&lpwm1 1 1000000>; //与硬件PCB有关,检查您的背光方波信号来源于哪里 这里表示背光信号来源于LPWM1_1
// 其余属性和信息,请参考 kernel/Documentation/devicetree/bindings/leds/backlight/pwm-backlight.yaml
};
编译
请
执行./bd.sh boot menuconfig进入Panels编译
Device Drivers --->
Graphics support --->
Display Panels --->
找到JC 050HD134 panel,按下
执行./bd.sh all 编译
测试
成功
modprobe panel-jc-050hd134
modprobe vio_n2d
modprobe vs-x5-syscon-bridge
modprobe vs_drm
然后,执行 dmesg 命令
[ 3343.383052] vs-disp-sif 3e080000.vs-sif: Adding to iommu group 3
[ 3343.384118] vs-dc 3e000000.dc8000Nano: Adding to iommu group 4
[ 3343.385252] vs-bt1120 3e010000.bt1120: Adding to iommu group 5
[ 3343.387555] horizon-lsio-pinctrl 34180000.lsio_iomuxc: set pin = 14 direction to input
[ 3343.387567] horizon-lsio-pinctrl 34180000.lsio_iomuxc: map pin14 to gpio[0] - 14
[ 3343.387635] panel-jc-050hd134 3e060000.mipi_dsi0.0: supply power not found, using dummy regulator
[ 3343.391241] vs-drm 3e000000.disp_apb:display-subsystem: bound 3e080000.vs-sif (ops sif_component_ops [vs_drm])
[ 3343.391529] vs-drm 3e000000.disp_apb:display-subsystem: bound 3e000000.dc8000Nano (ops dc_component_ops [vs_drm])
[ 3343.391692] vs-drm 3e000000.disp_apb:display-subsystem: bound 3e010000.bt1120 (ops bt1120_component_ops [vs_drm])
[ 3343.391730] vs-drm 3e000000.disp_apb:display-subsystem: bound 3e000000.disp_apb:bt1120_bridge (ops bt1120_bridge_component_ops [vs_drm])
[ 3343.391764] vs-drm 3e000000.disp_apb:display-subsystem: bound 3e000000.disp_apb:bt1120_bridge_wb (ops bt1120_bridge_component_ops [vs_drm])
[ 3343.391816] vs-drm 3e000000.disp_apb:display-subsystem: bound 3e060000.mipi_dsi0 (ops dsi_component_ops [vs_drm])
[ 3343.391917] vs-drm 3e000000.disp_apb:display-subsystem: bound 3e000000.disp_apb:dsi-encoder (ops encoder_component_ops [vs_drm])
[ 3343.391976] vs-drm 3e000000.disp_apb:display-subsystem: bound 3e000000.disp_apb:hdmi-encoder (ops encoder_component_ops [vs_drm])
[ 3343.392815] [drm] Initialized vs-drm 1.0.0 20191101 for 3e000000.disp_apb:display-subsystem on minor 0
当[drm] Initialized vs-drm 1.0.0 20191101 for 3e000000.disp_apb:display-subsystem on minor 0 表示
执行modetest -M vs-drm -c查看connectors的
Connectors:
id encoder status name size (mm) modes encoders
73 0 connected DSI-1 62x110 1 72
modes:
index name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot
#0 720x1280 61.99 720 752 772 792 1280 1300 1304 1324 65000 flags: nhsync, nvsync; type: preferred, driver
props:
1 EDID:
flags: immutable blob
blobs:
value:
2 DPMS:
flags: enum
enums: On=0 Standby=1 Suspend=2 Off=3
value: 0
5 link-status:
flags: enum
enums: Good=0 Bad=1
value: 0
6 non-desktop:
flags: immutable range
values: 0 1
value: 0
4 TILE:
flags: immutable blob
blobs:
value:
使用modetest -M vs-drm -a -s 73@31:720x1280 -P 33@31:720x1280@NV12命令
如果pattern(图片
