MTK Linux DRM分析(八)- KMS drm_crtc.c

一、簡介

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/96751.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/96751.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/96751.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue+openlayers示例:適配arcgis矢量瓦片服務以及樣式(附源碼下載)

由于單位這邊有個項目是基于openlayers地圖引擎框架實現webgis地圖可視化功能,但是要調用第三方的arcgis矢量瓦片服務以及適配樣式,在這個背景下,基于openlayersvue實現適配arcgis矢量瓦片服務以及樣式效果,適合學習openlayers與前…

mybatis xml中表名 字段報紅解決

mybatis xml中表名 字段報紅解決

谷歌瀏覽器重定向url,谷歌瀏覽器瀏覽網頁修改url到本地

谷歌應用商店搜索插件requestly(有個相似名稱的插件,選擇這個Requestly: Supercharge your Development & QA) 安裝后打開插件網址https://app.requestly.io/rules/my-rules 新建規則rules->my rules-> new rule -> redirect …

教育場景下禁用html5播放器拖動進度條的例子

禁用視頻課程進度條的拖動功能,主要是為了強制學員按照課程設計的順序觀看內容,防止跳過關鍵知識點,從而保證學習效果和課程的完整性。 1.防止應試作弊: 在一些需要觀看視頻才能解鎖下一章節或完成測試的場景中,禁用…

async實戰

一、協程 協程是程序員人為創造 協程是一種用戶態內的上下文切換技術。通過一個線程實現代碼塊相互切換執行。yield返回生成器 yield from 代表,跳到 func2協程函數 通過函數名(),是執行不了的。需要把函數加入到loop里面來,才可以被執行。 把…

個人搭建小網站教程(云服務器Ubuntu版本)

目錄 1.配置云服務器(略講) 2.vscode連接(ssh連接) 3.本地壓縮項目包 4.傳輸項目 5.配置項目依賴 6.運行項目 1.啟動 FastAPI 后端(Python 部分) 2.啟動 Next.js 前端(Node.js 部分&…

pion/webrtc v4.1.4 版本發布:關鍵特性與性能優化全面解析

引言 實時通信技術在現代互聯網應用中扮演著越來越重要的角色,從視頻會議到在線教育,從遠程醫療到物聯網設備交互,WebRTC技術已經成為實時音視頻通信的事實標準。作為Go語言中最成熟且廣泛使用的WebRTC實現,pion/webrtc項目持續推…

集成算法(聚類)

下面簡單集成算法代碼from sklearn.datasets import make_blobs from sklearn.cluster import KMeans import matplotlib.pyplot as plt# 創建數據集,生成 3 個中心的聚類數據,共 300 個樣本,每個樣本 2 個特征 X, _ make_blobs(n_samples30…

01 網絡信息內容安全--緒論

1 課程內容 網絡信息內容獲取技術網絡信息內容預處理技術網絡信息內容過濾技術社會網絡分析技術入侵檢測技術異常流量檢測技術對抗攻擊技術 2 理論研討 分為16個組 2.1 網絡信息內容獲取技術:第1組 【用DeepSeek網站爬蟲,數據獲取零成本&#xff01…

GPT-5:天變了嗎?還是風停了?

2025年8月8日,OpenAI 發布了 GPT-5。這次更新被許多人寄予厚望,也引發了不少爭議。對普通用戶來說,這是一場“又快又會做事”的智能盛宴;而對資深開發者和 AI 研究者而言,GPT-5 可能更像是一次不夠激進、略顯保守的版本…

生信分析自學攻略 | R語言數據篩選和修改

在《生信小白自學攻略》系列的前幾篇文章中,我們已經了解了 R 和 RStudio 的安裝、RStudio 的深度探索,以及 R 語言的基本數據類型和數據結構。現在,是時候深入探討如何運用 R 語言對數據進行精細化處理了。本篇推文將詳細介紹如何在 R 中對數…

從零開始學習概念物理(第13版)(1)

前言:對我來說,最有用的就是物理了,尤其是電磁學。但是要學好它,我得夯實我的基礎,前面更加基礎的數學和物理都不能拉下。現在我問了Deepseek推薦的國外物理書,這本《概念物理》是最適合我,等入…

CSS變量

元素背景需要統一,一個個設置修改起來很麻煩,也沒有全局變量? CSS中的變量_css變量-CSDN博客 -- 前綴定義變量,var(--) 使用變量,:root 表示根元素。 :root { --bg:#222; --fg:#bbb; } body { background:var(--bg)…

C++(Qt)軟件調試---vscode配置clang-tidy靜態分析(30)

C(Qt)軟件調試—vscode配置clang-tidy靜態分析(30) 文章目錄C(Qt)軟件調試---vscode配置clang-tidy靜態分析(30)[toc]1 概述2 clang-tidy基本用法3 目前已有檢查項4 vscode配置clang-tidy5 .clang-tidy配置文件6 參考地址更多精彩…

每天自動備份oracle

oracle數據庫比其他數據庫都貴,但是自帶的管理工具卻很差,真不知道咋想的。想完成每天自動備份,只能自己動手(window環境):1、創建個備份目錄,如D:\databack2、創建個腳本:backup.bat核心內容如下&#xff…

HBase Coprocessor:擴展HBase功能的利器

HBase Coprocessor:擴展HBase功能的利器 關鍵詞:HBase, Coprocessor, 協處理器, RegionServer, 分布式計算, 擴展功能, 二級索引 摘要:HBase作為Hadoop生態中的分布式列存儲數據庫,以高可靠性、高吞吐量和強一致性著稱&#xff0c…

【Java后端】Spring Boot 實現請求設備來源統計與UA解析全攻略

Spring Boot 實現請求設備來源統計與UA解析全攻略 在 Web 應用的實際場景中,我們經常需要知道 請求來自哪里 —— 是 Android 手機?還是 iOS?或者是 PC 瀏覽器? 這類信息往往可以通過 User-Agent (UA) 來統計,進而幫助…

技術框架搭建:支撐競拍全流程

純競拍的技術框架是一個多層協同的系統,從用戶交互到數據處理,每個環節都有專門的技術組件提供支持。?前端層是用戶與競拍系統交互的窗口,核心目標是提供流暢、實時、直觀的操作體驗。采用 React、Vue 等主流前端框架構建單頁應用&#xff0…

2025.8.18-2025.8.24第34周:有內耗有掙扎

🌟 本周完成的3件亮點事情(可具體寫過程): openvla debug起來了把上周的演講視頻發給了導師,人家幫我提了很多建議。羅永浩,李想4小時訪談看完了即興演講開始不內耗,直接講,這樣才能…

點播視頻預覽是怎么做到的?

看進度條上的小窗口,你有沒有想過,嗶哩嗶哩是如何在進度條上顯示視頻預覽的? 這個功能非常有用,尤其是在播放長視頻時。 如何才能實現? 實現這一點有三種方法。 預先為視頻生成 CSS sprites,并通過 API 獲取預先為視頻生成 W…