现在我们把上面所有知识点串起来,看一个真实的 高通平台LCD驱动初始化流程 (其他平台如MTK、紫光展锐流程类似):

图5: 安卓LCD驱动初始化完整流程(以高通平台为例)
对照代码看,主要步骤(以 msm_drm 驱动为例):
/* 步骤1: 内核启动时, BDF驱动入口 */static intpanel_driver_probe(struct platform_device *pdev){struct dsi_panel *panel;/* 解析设备树: dsi-panel-xxx.dtsi */ panel = dsi_panel_alloc_init(&pdev->dev);if (IS_ERR(panel))return PTR_ERR(panel);/* 步骤2: 解析panel配置参数 */dsi_panel_parse_dt(panel, pdev->dev.of_node);/* 步骤3: 注册到DRM框架 */returndsi_panel_attach(panel);}/* 步骤4-6: 真正开屏的逻辑 */static intpanel_on(struct dsi_panel *panel){/* 4a. 退出Sleep */dsi_panel_write_cmd(panel, 0x11, NULL, 0);msleep(120); /* 屏规范要求 >= 120ms *//* 4b. 发送初始化序列 (dcs_panel_init_cmds) */for (int i = 0; i < ARRAY_SIZE(init_cmd); i++) {dsi_panel_write_cmd(panel, init_cmd[i].cmd, init_cmd[i].params, init_cmd[i].len);if (init_cmd[i].wait_ms)msleep(init_cmd[i].wait_ms);}/* 4c. 开显示 */dsi_panel_write_cmd(panel, 0x29, NULL, 0);msleep(20);/* 步骤5: 可选: 读屏ID做自检 */uint8_t id[3] = {0};dsi_panel_read_cmd(panel, 0x04, id, 3);dev_info(&panel->dev, "Panel ID: %02x %02x %02x", id[0], id[1], id[2]);/* 步骤6: 上报DRM框架, 开始正常刷屏 */returndrm_panel_enable(&panel->drm_panel);}注意几个关键时间窗:

图6: 一次完整的HS Burst传输(命令+一帧像素)
最后,我们看下系统每秒钟都在干的事—— 把一帧FrameBuffer推给LCD。这中间经历了:
以1080p+60Hz+4 Lane为例,理论上每条Lane需要传输 约 1.15 Gbps。这就是为什么MIPI DSI在2.0/2.1/2.5版本一路从2.5Gbps/Lane飙到4.5Gbps/Lane,甚至引入了C-PHY(三相编码,把每Lane的有效速率又提升到接近3倍)。
性能优化小技巧:
希望这篇文章能帮屏幕前的驱动兄弟,搞清楚 "为什么我的命令要这么发"、"为什么读ID要等BTA"、"为什么黑屏了要查SoT"。如果对你有帮助,记得 点赞+在看+转发 三连支持!