一、代碼分析
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