一、代码分析
mtk_drm_crtc.c以mtk_crtc_comp_is_busy函数为界限进行拆分分析
static const struct drm_crtc_funcs mtk_crtc_funcs = {
.set_config = drm_atomic_helper_set_config,
.page_flip = drm_atomic_helper_page_flip,
.destroy = mtk_drm_crtc_destroy,
.reset = mtk_drm_crtc_reset,
.atomic_duplicate_state = mtk_drm_crtc_duplicate_state,
.atomic_destroy_state = mtk_drm_crtc_destroy_state,
.atomic_set_property = mtk_drm_crtc_set_property,
.atomic_get_property = mtk_drm_crtc_get_property,
.enable_vblank = mtk_drm_crtc_enable_vblank,
.disable_vblank = mtk_drm_crtc_disable_vblank,
.get_vblank_timestamp = mtk_crtc_get_vblank_timestamp,
};
static const struct drm_crtc_helper_funcs mtk_crtc_helper_funcs = {
.mode_fixup = mtk_drm_crtc_mode_fixup,
.mode_set_nofb = mtk_drm_crtc_mode_set_nofb,
.atomic_enable = mtk_drm_crtc_atomic_resume,
.disable = mtk_drm_crtc_suspend,
.atomic_begin = mtk_drm_crtc_atomic_begin,
.atomic_flush = mtk_drm_crtc_atomic_flush,
};
mtk_drm_crtc.c (Part1)中主要函数的基本作用分析,基于提供的代码片段。这些函数主要与 MediaTek DRM (Direct Rendering Manager) 驱动相关,用于管理显示控制器(CRTC)的行为、硬件配置、事件处理等。以下是每个函数的简要说明,按功能分组并避免过多技术细节,保持清晰简洁:
1. 上下文管理
- _get_context
- 作用: 创建并返回一个静态的 drm_crtc 上下文对象,确保全局只有一个上下文实例(单例模式)。用于初始化和管理 CRTC 相关的全局状态。
- 关键点: 通过静态变量 is_context_inited 确保只初始化一次,并使用 memset 清空上下文结构。
2. CRTC 生命周期管理
- mtk_drm_crtc_destroy
- 作用: 销毁 CRTC 对象,释放相关资源。
- 关键点: 释放显示互斥锁(mtk_disp_mutex_put)并调用 drm_crtc_cleanup 清理 DRM 框架中的 CRTC 资源。
- mtk_drm_crtc_reset
- 作用: 重置 CRTC 状态,恢复到初始状态。
- 关键点: 如果已有状态,销毁旧状态并分配新的 mtk_crtc_state 结构,初始化 CRTC 状态并绑定到 DRM 框架。
3. VBlank 和页面翻转
- mtk_drm_crtc_finish_page_flip
- 作用: 处理页面翻转完成后的逻辑,发送 VBlank 事件并清理相关状态。
- 关键点: 在事件锁保护下,调用 drm_crtc_send_vblank_event 发送 VBlank 事件,释放 VBlank 引用,并清除 mtk_crtc->event。
- mtk_drm_finish_page_flip
- 作用: 完成页面翻转的处理,触发 VBlank 处理并在需要时调用 mtk_drm_crtc_finish_page_flip。
- 关键点: 检查 pending_needs_vblank 标志以决定是否需要完成页面翻转。
4. 等待和同步
- mtk_drm_wait_blank
- 作用: 等待 CRTC 的空白(blank)状态变为指定值,带有超时机制。
- 关键点: 使用 wait_event_timeout 等待 crtc_blank 状态变化,通常用于确保显示状态稳定(如 TUI 相关场景)。
- mtk_drm_crtc_wait_blank
- 作用: 确保 CRTC 完成空白状态的切换(如退出 TUI 模式)。
- 关键点: 循环等待 crtc_blank