樹莓派-LOGO

RaspberryPi KMS HDMI 輸出圖形驅動程序

RaspberryPi-KMS-HDMI-輸出-圖形-驅動-PRODACT-IMG

版畫

2020-2023 Raspberry Pi Ltd(前身為 Raspberry Pi (Trading) Ltd.) 本文檔根據知識共享署名-NoDerivatives 4.0 International (CC BY-ND 4.0) 許可獲得許可。 構建日期:2023-02-10 構建版本:githash:c65fe9c-clean

法律免責聲明

不時修改的 RASPBERRY PI 產品(包括數據表)的技術和可靠性數據(“資源”)由 RASPBERRY PI LTD(“RPL”)“按原樣”提供,以及任何明示或暗示的保證,包括但不限於TO,不提供針對特定用途的適銷性和適用性的默示保證。 在適用法律允許的最大範圍內,在任何情況下,RPL 均不對任何直接、間接、偶然、特殊、懲戒性或後果性損害(包括但不限於替代商品或服務的採購;使用損失、數據, 或利潤; 或業務中斷),無論是基於合同、嚴格責任或侵權行為(包括疏忽或其他)以任何方式因使用資源而引起的任何責任理論,即使已被告知這種可能性此類損壞。 RPL 保留隨時對資源或其中描述的任何產品進行任何增強、改進、更正或任何其他修改的權利,恕不另行通知。 這些資源適用於具有適當設計知識水平的熟練用戶。 用戶對其選擇和使用資源以及其中描述的產品的任何應用承擔全部責任。 用戶同意賠償 RPL 並使其免受因使用資源而產生的所有責任、成本、損害或其他損失。RPL 授予用戶僅將資源與 Raspberry Pi 產品結合使用的權限。 禁止對資源的所有其他使用。 未向任何其他 RPL 或其他第三方知識產權授予許可。 高風險活動。 Raspberry Pi 產品並非設計、製造或旨在用於需要故障安全性能的危險環境,例如核設施、飛機導航或通信系統、空中交通管制、武器系統或安全關鍵應用(包括生命支持)的運行系統和其他醫療設備),其中產品故障可能直接導致死亡、人身傷害或嚴重的物理或環境破壞(“高風險活動”)。 RPL 明確否認對高風險活動適用性的任何明示或暗示保證,並且不對在高風險活動中使用或包含 Raspberry Pi 產品承擔任何責任。 Raspberry Pi 產品根據 RPL 的標準條款提供。 RPL 提供的資源不會擴展或以其他方式修改 RPL 的標準條款,包括但不限於其中表達的免責聲明和保證。

文檔版本歷史

RaspberryPi-KMS-HDMI-輸出-圖形-驅動程序-FIG-1

文件範圍

本文檔適用於以下樹莓派產品

RaspberryPi-KMS-HDMI-輸出-圖形-驅動程序-FIG-2

介紹

隨著 KMS(內核模式設置)圖形驅動程序的推出,Raspberry Pi Ltd 正在擺脫對視頻輸出系統的傳統固件控制,轉向更加開源的圖形系統。 然而,這也帶來了一系列挑戰。 本文檔旨在幫助解決在遷移到新系統時可能出現的任何問題。 本白皮書假定 Raspberry Pi 正在運行 Raspberry Pi OS,並且已完全更新最新的固件和內核。

術語

DRM: Direct Rendering Manager,Linux 內核的一個子系統,用於與圖形處理單元 (GPU) 通信。 與 FKMS 和 KMS 配合使用。
DVI: HDMI 的前身,但沒有音頻功能。 HDMI 到 DVI 電纜和適配器可用於將 Raspberry Pi 設備連接到配備 DVI 的顯示器。
編輯: 擴展顯示標識數據。 顯示設備的一種元數據格式,用於描述其對視頻源的功能。 EDID 數據結構包括製造商名稱和序列號、產品類型、物理顯示器尺寸和顯示器支持的時序,以及一些不太有用的數據。 一些顯示器可能有有缺陷的 EDID 塊,如果顯示系統不處理這些缺陷,就會導致問題。
FKMS(vc4-fkms-v3d): 假內核模式設置。 雖然固件仍然控制著低級硬件(例如amp例如,高清晰度多媒體接口 (HDMI) 端口、顯示串行接口 (DSI) 等),標準 Linux 庫在內核本身中使用。 Buster 中默認使用 FKMS,但現在已棄用,取而代之的是 Bullseye 中的 KMS。
HDMI接口: 高清晰度多媒體接口是專有的音頻/視頻接口,用於傳輸未壓縮的視頻數據以及壓縮或未壓縮的數字音頻數據。
HPD: 熱插拔檢測。 由連接的顯示設備斷言以表明其存在的物理線路。
公里數: 內核模式設置; 看 https://www.kernel.org/doc/html/latest/gpu/drm-kms.html 更多細節。 在樹莓派上,vc4-kms-v3d是實現KMS的驅動,常被稱為“KMS驅動”。 遺留圖形堆棧:完全在由 Linux 幀緩衝區驅動程序公開的 VideoCore 固件 blob 中實現的圖形堆棧。 直到最近,大多數 Raspberry Pi Ltd 設備都在使用傳統圖形堆棧; 現在逐漸被 (F)KMS/DRM 取代。

HDMI 系統和圖形驅動程序

Raspberry Pi 設備使用 HDMI 標准進行視頻輸出,這在現代 LCD 顯示器和電視上很常見。 Raspberry Pi 3(包括 Raspberry Pi 3B+)和更早的設備有一個 HDMI 端口,能夠使用全尺寸 HDMI 連接器輸出 1920 × 1200 @60Hz。 Raspberry Pi 4 有兩個 micro HDMI 端口,並且可以在兩個端口上進行 4K 輸出。 根據設置,Raspberry Pi 0 上的 HDMI 4 端口最高可達 4kp60,但是當使用兩個 4K 輸出設備時,您在兩個設備上都被限制為 p30。 圖形軟件堆棧,無論版本如何,都負責詢問連接的 HDMI 設備的屬性,並適當地設置 HDMI 系統。 Legacy 和 FKMS 堆棧都使用 VideoCore 圖形處理器中的固件來檢查 HDMI 存在和屬性。 相比之下,KMS 使用完全開源的 ARM 端實現。 這意味著兩個系統的代碼庫完全不同,在某些情況下,這可能導致兩種方法之間的行為不同。 HDMI 和 DVI 設備使用稱為 EDID 塊的元數據向源設備標識自己。 這是由源設備通過 I2C 連接從顯示設備讀取的,這對最終用戶來說是完全透明的,因為它是由圖形堆棧完成的。 EDID 塊包含大量信息,但主要用於指定顯示器支持哪些分辨率,因此可以設置 Raspberry Pi 以輸出合適的分辨率。

開機時如何處理HDMI

第一次上電時,樹莓派會經歷一系列 stages,稱為 boot stages:

  1. 第一個-stage,基於 ROM 的引導加載程序啟動 VideoCore GPU。
  2. 秒秒tage bootloader(在 Raspberry Pi 4 之前的設備上是 SD 卡上的 bootcode.bin,在 Raspberry Pi 4 上是 SPI EEPROM 中):
    1. 在 Raspberry Pi 4 上,second-stag引導加載程序將啟動 HDMI 系統,詢問顯示器的可能模式,然後適當地設置顯示器。 此時顯示器用於提供基本的診斷數據。
    2. 引導加載程序診斷顯示(07 年 2022 月 XNUMX 日起)將顯示任何連接的顯示器的狀態(是否存在熱插拔檢測 (HPD),以及是否從顯示器恢復了 EDID 塊)。
  3. VideoCore 固件 (start.elf) 已加載並運行。 這將接管 HDMI 系統的控制,從任何連接的顯示器讀取 EDID 塊,並在這些顯示器上顯示彩虹屏幕。
  4. Linux 內核啟動
    1. 在內核啟動期間,KMS 將從固件接管 HDMI 系統的控制權。 EDID 塊再次從任何連接的顯示器讀取,此信息用於設置 Linux 控制台和桌面。

可能出現的問題和症狀

遷移到 KMS 時遇到的最常見的故障症狀是最初啟動良好,先是引導加載程序屏幕,然後出現彩虹屏幕,幾秒鐘後顯示屏變黑並且不再亮起。 顯示器變黑的時間點實際上是內核啟動過程中 KMS 驅動程序從固件接管運行顯示器的時間點。 Raspberry Pi 當前在除 HDMI 輸出之外的所有方面都在運行,因此如果啟用了 SSH,那麼您應該能夠通過該路由登錄到設備。 綠色的 SD 卡訪問 LED 通常會偶爾閃爍。 也有可能您根本看不到 HDMI 輸出; 沒有引導加載程序顯示,也沒有彩虹屏幕。 這通常可以歸因於硬件故障。

診斷故障

根本沒有HDMI輸出
設備可能根本沒有啟動,但這不在本白皮書的討論範圍之內。 假設觀察到的行為是顯示問題,則在啟動過程的任何部分缺少 HDMI 輸出通常是由於硬件故障。 有許多可能的選擇:

  • HDMI 電纜不良
  • 嘗試使用新電纜。 有些電纜,尤其是非常便宜的電纜,可能不包含 Raspberry Pi 成功檢測顯示器所需的所有通信線路(例如熱插拔)。
  • Raspberry Pi 上的 HDMI 端口有缺陷
  • 如果您使用的是 Raspberry Pi 4,請嘗試使用其他 HDMI 端口。
  • 顯示器上的 HDMI 端口有缺陷
  • 有時顯示器或電視上的 HDMI 端口可能會磨損。 如果設備有一個端口,請嘗試不同的端口。
  • 在極少數情況下,顯示設備可能僅在打開時或選擇了正確的端口時才提供 EDID 數據。 要進行檢查,請確保設備已打開並且選擇了正確的輸入端口。
  • 顯示設備未斷言熱插拔檢測線

初始輸出,然後屏幕變黑
如果在 Linux 內核啟動期間顯示屏出現但隨後熄滅,則有多種可能的原因,這些通常與從顯示設備讀取 EDID 的問題有關。 從上面處理啟動順序的部分可以看出,EDID 在啟動過程中的多個不同點被讀取,並且這些讀取中的每一個都由不同的軟件完成。 當 KMS 接管時,最終讀取由未更改的上游 Linux 內核代碼執行,這不會處理有缺陷的 EDID 格式以及早期的固件軟件。 這就是 KMS 接管後顯示器無法正常工作的原因。 有多種方法可以確認 KMS 是否未能讀取 EDID,其中兩種方法如下。
檢查引導加載程序診斷屏幕(僅限 Raspberry Pi 4)

筆記
引導加載程序診斷需要最新的引導加載程序。 您可以使用以下說明昇級到最新版本: https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#updating-the-bootloader 取出 SD 卡並重啟樹莓派。 在 Install OS 屏幕上按 ESC,診斷屏幕應出現在顯示設備上。 顯示屏上應該有一行以 display: — for ex 開頭amp樂:

  • 展示: DISP0:HDMI HPD=1 EDID=ok #2 DISP1:HPD=0 EDID=none #0

Raspberry Pi 4 的輸出顯示系統在 HDMI 端口 0 上檢測到 HDMI 顯示器,熱插拔檢測有效,EDID 讀取正常。 在 HDMI 端口 1 上找不到任何內容。

檢查KMS系統是否檢測到EDID
要檢查這一點,您需要從另一台計算機通過 SSH 登錄到 Raspberry Pi 設備。 使用 Raspberry Pi Imager 創建 SD 卡映像時,可以使用高級設置選項啟用 SSH。 在已經鏡像的 SD 卡上啟用 SSH 有點複雜:您需要使用另一台計算機添加一個 file 將 ssh 命名為啟動分區。 更換原裝樹莓派中的SD卡並上電。 這應該啟用 SSH,並使用 DHCP 分配的 IP 地址。 登錄後,在終端提示符下鍵入以下內容以顯示檢測到的任何 EDID 的內容(您可能需要將 HDMI-A-1 更改為 HDMI-A-2,具體取決於顯示設備所連接的 Raspberry Pi 上的 HDMI 端口to): cat /sys/class/drm/card?-HDMI-A-1/edid 如果沒有名為 card?-HDMI-A-1 或類似的文件夾,則可能無法從顯示器讀取 EDID設備。

筆記
在成功讀取EDID的情況下,有一個有用的虛 file 在同一文件夾中,稱為模式,顯示時顯示 EDID 聲稱設備支持的所有可能模式。

緩解措施

熱插拔檢測失敗 如果固件和 KMS 均未能找到連接的顯示器,則可能是熱插拔檢測失敗——即 Raspberry Pi 不知道已插入設備,因此它不會檢查 EDID。 這可能是由於電纜損壞或顯示設備未正確斷言熱插拔引起的。 您可以通過更改內核命令行來強制熱插拔檢測 file (cmdline.txt) 存儲在 Raspberry Pi OS SD 卡的引導分區中。 你可以編輯這個 file 在另一個系統上,使用您喜歡的任何編輯器。 將以下內容添加到 cmdline.txt 的末尾 file: video=HDMI-A-1:1280×720@60D 如果您使用的是第二個 HDMI 端口,請將 HDMI-A-1 替換為 HDMI-A-2。 您還可以指定不同的分辨率和幀速率,但請確保選擇顯示設備支持的分辨率和幀速率。

筆記
可以在此處找到有關視頻的內核命令行設置的文檔: https://www.kernel.org/doc/Documentation/fb/modedb.txt

警告
較舊的圖形堆棧支持使用 config.txt 條目來設置熱插拔檢測,但在撰寫本文時,這不適用於 KMS。 未來的固件版本可能會支持它。 config.txt 條目是 hdmi_force_hotplug,您可以使用 hdmi_force_hotplug:0=1 或 hdmi_force_hotplug:1=1 指定熱插拔適用的特定 HDMI 端口。 請注意,KMS 的命名法將 HDMI 端口稱為 1 和 2,而 Raspberry Pi 使用 0 和 1。

EDID問題
少數顯示設備在關閉或選擇了錯誤的 AV 輸入時無法返回 EDID。 當 Raspberry Pi 和顯示設備位於同一電源板上時,這可能會成為一個問題,並且 Raspberry Pi 設備的啟動速度比顯示器快。 對於此類設備,您可能需要手動提供 EDID。 更不尋常的是,某些顯示設備的 EDID 塊格式錯誤,KMS EDID 系統無法解析。 在這些情況下,可以從具有相似分辨率的設備讀取 EDID 並使用它。 在任何一種情況下,以下說明都說明瞭如何從顯示設備讀取 EDID 並配置 KMS 以使用它,而不是 KMS 嘗試直接詢問設備。

將 EDID 複製到 file
創建一個 file 從頭開始包含 EDID 元數據通常是不可行的,使用現有的元數據要容易得多。 一般可以從顯示設備獲取EDID,存儲在樹莓派的SD卡上,這樣就可以被KMS使用,而不是從顯示設備獲取EDID。 此處最簡單的選擇是確保顯示設備已啟動並運行並使用正確的 AV 輸入,並且 Raspberry Pi 已正確啟動 HDMI 系統。 從終端,您現在可以將 EDID 複製到 file 使用以下命令:sudo cp /sys/class/drm/card?-HDMI-A-1/edid /lib/firmware/myedid.dat 如果由於某種原因 EDID 不存在,您可以在非- 成功啟動到桌面或控制台的 KMS 模式,然後將固件將(希望)成功讀取的 EDID 複製到 file.

  1. 啟動到傳統圖形模式。
    1. 編輯啟動分區中的 config.txt,確保使用 sudo 運行編輯器,並將 dtoverlay=vc4-kms-v3d 行更改為#dtoverlay=vc4-kms-v3d。
    2. 重新啟動。
  2. 現在應該出現桌面或登錄控制台。
    1. 使用終端,將 EDID 從連接的顯示設備複製到 file 使用以下命令:
  • tvservice -d myedid.dat 須藤 mv myedid.dat /lib/firmware/

使用 file基於 EDID 而不是詢問顯示設備 編輯 /boot/cmdline.txt,確保使用 sudo 運行你的編輯器,並將以下內容添加到內核命令行:具體的 HDMI 端口如下: drm.edid_firmware=HDMI-A-1:myedid.dat 如有必要,通過執行以下操作重新啟動到 KMS 模式:

  1. 在引導分區中編輯 config.txt,確保使用 sudo 運行編輯器,並將 #dtoverlay=vc4-kms-v3d 行更改為 dtoverlay=vc4-kms-v3d。
  2. 重新啟動。

筆記
如果您使用 file基於 EDID,但熱插拔仍然存在問題,您可以通過在內核命令行中添加以下內容來強制熱插拔檢測:video=HDMI-A-1:D。

文件/資源

RaspberryPi KMS HDMI 輸出圖形驅動程序 [pdf] 使用者手冊
KMS, HDMI 輸出顯卡驅動, KMS HDMI 輸出, 顯卡驅動, KMS HDMI 輸出顯卡驅動, 驅動

參考

發表評論

您的電子郵件地址不會被公開。 必填欄位已標記 *