普通网友 2025-12-16 17:50 采纳率: 99.1%
浏览 1
已采纳

LineageOS在红米K30 5G上无法正常唤醒屏幕?

在部分基于LineageOS 18.1或更新版本的红米K30 5G(代号lmi)设备上,用户普遍反馈存在屏幕唤醒失败的问题:按下电源键或使用指纹解锁时,屏幕偶尔无响应或仅局部亮起,需多次尝试或强制重启才能恢复。该问题初步归因于内核层对高通SM6350 SoC的显示驱动支持不完善,尤其是与WFD(无线显示)模块和Display Power Management交互异常有关。此外,定制内核中未正确处理Doze模式下的屏幕状态切换,也可能加剧此故障。社区建议暂时关闭“双击唤醒”与“始终开启面部识别”功能以缓解问题。
  • 写回答

1条回答 默认 最新

  • Qianwei Cheng 2025-12-16 17:50
    关注

    1. 问题现象与用户反馈分析

    在基于LineageOS 18.1及以上版本的红米K30 5G(代号lmi)设备中,大量用户报告存在屏幕唤醒失败的问题。具体表现为:

    • 按下电源键后屏幕无响应;
    • 指纹解锁触发后屏幕仅局部亮起(如顶部或边缘);
    • 需多次尝试唤醒或强制重启才能恢复正常显示;
    • 问题在待机一段时间后更为频繁,尤其在Doze模式进入后。

    该问题并非系统级崩溃,而是集中在显示子系统的状态切换异常上。社区论坛(如XDA Developers)中多个线程指出,此现象在搭载高通SM6350 SoC的设备上尤为突出,且主要出现在使用第三方内核或未完全适配的AOSP基线代码中。

    2. 系统架构与硬件背景梳理

    项目说明
    设备型号Redmi K30 5G (lmi)
    SoCQualcomm SM6350 (Snapdragon 765G)
    GPUAdreno 620
    显示控制器SDM Display Subsystem (DPU-based)
    Android 版本基础Android 11 (API 30)
    ROM 基础LineageOS 18.1+ (AOSP衍生)
    关键模块WFD、Display Power Management (DPM)、Panel Driver

    SM6350采用集成式DPU(Display Processing Unit)架构,其显示管理依赖于内核中的msm_drm驱动和用户空间的HWC (Hardware Composer)协同工作。任何在低功耗状态下对显示链路的状态同步失误都可能导致唤醒失败。

    3. 故障根因的技术拆解

    1. WFD模块资源竞争:无线显示功能即使未启用,其内核模块仍可能驻留并持有部分显示通道句柄。当系统从睡眠恢复时,若WFD未正确释放资源,会导致主屏初始化阻塞。
    2. Display Power Management 状态机错乱:DPM在Doze模式下会将Panel置于DSI_CMD_MODE_PANEL_LOW_POWER状态,但某些定制内核未能正确恢复至DSI_VIDEO_MODE,导致背光与帧缓冲不同步。
    3. Fingerprint Callback 触发时机不当:指纹服务(Fingerprint HAL)在认证成功后调用PowerManager.wakeUp(),但在某些内核变体中该信号未被DPU接收。
    4. Panel驱动未实现完整resume流程:部分开源内核未包含厂商专有panel-init-sequence的恢复指令,造成LCD IC处于中间态。

    4. 调试方法与日志分析路径

    # 获取关键日志片段
    adb logcat -b main | grep -i "display\|power\|wfd"
    adb logcat -b kernel | grep -i "drm\|dsi\|panel"
    
    # 检查当前电源状态
    dumpsys power | grep "mWakefulness"
    dumpsys window policy | grep "mScreenOn"
    
    # 查看HWC合成器状态
    dumpsys SurfaceFlinger
    

    典型异常日志示例:

    W display_power_mgr: Failed to restore panel after WFD session
    E msm_drm: [drm:msm_dsi_manager_register] DSI already bound
    D PowerManagerService: WakeUp called but display state is off
    

    5. 解决方案层级推进图

    graph TD A[用户层规避] --> B[关闭双击唤醒] A --> C[禁用始终开启面部识别] B --> D[减少意外中断唤醒流程] C --> D D --> E[内核层修复] E --> F[修正WFD资源释放机制] E --> G[完善Doze模式下的resume_sequence] F --> H[提交至KernelSU或AnyKernel3刷写] G --> H H --> I[长期方案:上游合并适配补丁]

    6. 可行修复建议与代码片段参考

    针对内核中DPM恢复逻辑缺失问题,可在drivers/gpu/drm/msm/dsi/dsi_panel.c中增强resume路径:

    static int dsi_panel_resume(struct dsi_panel *panel)
    {
        int rc = 0;
    
        if (panel->panel_mode == DSI_OP_VIDEO_MODE)
            dsi_panel_sw_reset(panel); // 强制软复位
    
        rc = dsi_panel_tx_cmd_set(panel, DSI_CMD_SET_RESUME);
        if (rc) {
            DRM_ERROR("failed to send DSI_CMD_SET_RESUME\n");
            return rc;
        }
    
        /* Add explicit backlight re-enable */
        mipi_dsi_dcs_set_display_on(&panel->mipi_device);
        mdelay(20);
    
        return 0;
    }
    

    同时,在WFD模块卸载时应确保释放DMA-BUF引用:

    // 在wfd_dev_release中添加:
    if (wfd_ctx->display_handle) {
        ion_unmap_dma(wfd_ctx->display_handle);
        ion_free(wfd_ctx->display_client, wfd_ctx->display_handle);
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 12月17日
  • 创建了问题 12月16日