一、簡介
Linux DRM(Direct Rendering Manager)子系統是內核中管理圖形硬件的核心組件,而 CRTC(CRT Controller)又是其中的關鍵之一。它起源于過去控制陰極射線管(CRT)顯示器的控制器概念,如今在現代圖形顯示中依舊扮演著至關重要的角色。
可以把 CRTC 想象成圖形顯示管線的指揮中心。它主要負責從幀緩沖區(Framebuffer)中讀取圖像數據,生成符合特定時序和模式的視頻信號,并將其傳遞給相應的編碼器(Encoder)和連接器(Connector),最終輸出到顯示設備上。
-
核心功能:CRTC 的核心是控制顯示時序和模式。這包括生成像素時鐘(pixel clock)、水平同步信號(HSync)、垂直同步信號(VSync)等,確保圖像按正確的方式掃描并顯示在屏幕上。
-
顯示管線中的角色:在 DRM 的顯示管線 (Plane
-> CRTC -> Encoder -> Connector -> 顯示器
) 中,CRTC 是一個承上啟下的關鍵環節。它處理好的圖像數據會交給 Encoder 轉換成特定的接口協議(如 HDMI、DP),再通過 Connector 物理輸出。
二、代碼分析
主要包含了drm_crtc.c和drm_crtc_helper.c兩個文件
兩個代碼文件的作用說明
drm_crtc.c 的作用
drm_crtc.c 是 Linux DRM (Direct Rendering Manager) 子系統中處理 CRTC (Cathode Ray Tube Controller) 核心功能的源文件。CRTC 是 DRM 顯示管道的核心組件,負責從平面 (planes) 接收像素數據、混合它們,并根據顯示模式 (timings) 輸出到編碼器 (encoders)。這個文件實現了 CRTC 的初始化、注冊、清理、配置設置、屬性管理以及與用戶空間 ioctl 的交互(如獲取/設置 CRTC 配置)。它支持遺留模式設置和原子模式設置的過渡,提供標準屬性(如 ACTIVE、MODE_ID)和輔助功能(如 fence 創建、CRC 支持)。文件還處理錯誤檢查和資源管理,確保 CRTC 與平面、幀緩沖和連接器的兼容性。該文件是 DRM 核心的一部分,主要用于驅動程序的 CRTC 管理,尤其在非原子驅動中。
drm_crtc_helper.c 的作用
drm_crtc_helper.c 是 DRM 子系統中提供遺留 CRTC 模式設置輔助函數的源文件。它為使用舊式 CRTC 接口的驅動程序提供便利函數,實現模式設置、電源管理 (DPMS)、禁用未使用資源、恢復配置等操作。該文件主要處理遺留模式設置的復雜邏輯,如計算最佳編碼器、調整模式、處理 DPMS 狀態,并確保配置更改的原子性(盡管不是真正的原子模式)。它與原子模式設置兼容,但強烈建議新驅動使用原子輔助函數。該文件的作用是簡化驅動程序的模式設置實現,減少重復代碼,但已標記為過時(deprecated),因為現代驅動應轉向原子接口。
兩個文件的函數及其作用列表
drm_crtc.c 中的函數
- drm_crtc_from_index: 根據索引在 DRM 設備中查找并返回對應的 CRTC 對象。用于 vblank 回調等場景,將索引轉換為指針。
- drm_crtc_force_disable: 強制禁用指定 CRTC,通過設置空模式配置實現。用于遺留驅動的電源管理。
- drm_num_crtcs: 計算 DRM 設備中 CRTC 的總數。通過遍歷列表實現。
- drm_crtc_register_all: 注冊所有 CRTC 到 DRM 核心,包括 debugfs 和 late_register 回調。用于驅動初始化。
- drm_crtc_unregister_all: 注銷所有 CRTC,包括 early_unregister 回調和 debugfs 移除。用于驅動卸載。
- drm_crtc_crc_init: 初始化 CRTC 的 CRC (Cyclic Redundancy Check) 支持,包括鎖和隊列。用于幀校驗調試。
- drm_crtc_crc_fini: 結束 CRTC 的 CRC 支持,釋放資源。
- fence_to_crtc: 從 DMA fence 結構中提取對應的 CRTC 對象。用于 fence 操作的容器轉換。
- drm_crtc_fence_get_driver_name: 返回 fence 的驅動名稱。用于 DMA fence 接口。
- drm_crtc_fence_get_timeline_name: 返回 fence 的時間線名稱。用于 DMA fence 接口。
- drm_crtc_create_fence: 為 CRTC 創建一個 DMA fence 對象,用于同步操作。
- __drm_crtc_init_with_planes: 內部函數,用于初始化 CRTC 對象,包括鎖、ID、屬性和標準屬性附加。核心初始化邏輯。
- drm_crtc_init_with_planes: 初始化一個新的 CRTC 對象,關聯主平面和游標平面。用于驅動創建 CRTC。
- drmm_crtc_alloc_with_planes_cleanup: 清理函數,用于釋放 CRTC 資源。通過 drm_crtc_cleanup 調用。
- __drmm_crtc_alloc_with_planes: 分配并初始化一個托管的 CRTC 對象,支持 managed 資源管理。
- drm_crtc_cleanup: 清理 CRTC 對象,包括注銷、釋放內存和狀態銷毀。用于 CRTC 銷毀。
- drm_mode_getcrtc: 通過 ioctl 獲取 CRTC 配置(如 gamma 大小、位置、模式)。用戶空間接口。
- __drm_mode_set_config_internal: 內部設置 CRTC 配置,包括幀緩沖 refcounting 和回調調用。
- drm_mode_set_config_internal: 包裝設置 CRTC 配置的內部函數,用于遺留驅動。
- drm_crtc_check_viewport: 檢查幀緩沖是否足夠大以支持 CRTC 的視口(viewport)。用于模式驗證。
- drm_mode_setcrtc: 通過 ioctl 設置 CRTC 配置,包括模式、幀緩沖和連接器。用戶空間接口。
- drm_mode_crtc_set_obj_prop: 設置 CRTC 對象的屬性值。用于遺留屬性管理。
- drm_crt