Driver grafico con uscita HDMI KMS RaspberryPi
Colofone
2020-2023 Raspberry Pi Ltd (precedentemente Raspberry Pi (Trading) Ltd.) Questa documentazione è concessa in licenza con licenza Creative Commons Attribution-NoDerivatives 4.0 International (CC BY-ND 4.0). data build: 2023-02-10 versione build: githash: c65fe9c-clean
Avviso legale di non responsabilità
I DATI TECNICI E DI AFFIDABILITÀ DEI PRODOTTI RASPBERRY PI (COMPRESE LE SCHEDE TECNICHE) COME MODIFICATI DI VOLTA IN VOLTA ("RISORSE") SONO FORNITI DA RASPBERRY PI LTD ("RPL") "COSÌ COME SONO" E QUALSIASI GARANZIA ESPLICITA O IMPLICITA, INCLUSE, MA NON LIMITATE A, LE GARANZIE IMPLICITE DI COMMERCIABILITÀ E IDONEITÀ PER UNO SCOPO PARTICOLARE SONO ESCLUSE. NELLA MISURA MASSIMA CONSENTITA DALLA LEGGE APPLICABILE IN NESSUN CASO RPL SARÀ RESPONSABILE PER DANNI DIRETTI, INDIRETTI, INCIDENTALI, SPECIALI, ESEMPLARI O CONSEQUENZIALI (COMPRESI, MA NON LIMITATI A, APPROVVIGIONAMENTO DI BENI O SERVIZI SOSTITUTIVI; PERDITA DI UTILIZZO, DATI , O UTILI; O INTERRUZIONE AZIENDALE) COMUNQUE CAUSATI E SU QUALSIASI TEORIA DI RESPONSABILITÀ, SIA CONTRATTUALE, OGGETTIVA, O ILLECITA (INCLUSA NEGLIGENZA O ALTRO) DERIVANTI IN QUALSIASI MODO DALL'UTILIZZO DELLE RISORSE, ANCHE SE AVVISATI DELLA POSSIBILITÀ DI TALI DANNI. RPL si riserva il diritto di apportare miglioramenti, miglioramenti, correzioni o qualsiasi altra modifica alle RISORSE oa qualsiasi prodotto in esse descritto in qualsiasi momento e senza ulteriore preavviso. Le RISORSE sono destinate a utenti esperti con adeguati livelli di conoscenza progettuale. Gli utenti sono gli unici responsabili della selezione e dell'utilizzo delle RISORSE e dell'eventuale applicazione dei prodotti in esse descritti. L'utente accetta di indennizzare e tenere indenne RPL da tutte le responsabilità, costi, danni o altre perdite derivanti dall'uso delle RISORSE.RPL concede agli utenti il permesso di utilizzare le RISORSE esclusivamente in combinazione con i prodotti Raspberry Pi. Ogni altro utilizzo delle RISORSE è proibito. Non viene concessa alcuna licenza per qualsiasi altro diritto di proprietà intellettuale di terze parti o RPL. ATTIVITÀ AD ALTO RISCHIO. I prodotti Raspberry Pi non sono progettati, fabbricati o destinati all'uso in ambienti pericolosi che richiedono prestazioni fail-safe, come nel funzionamento di impianti nucleari, sistemi di comunicazione o di navigazione aerea, controllo del traffico aereo, sistemi d'arma o applicazioni critiche per la sicurezza (compreso il supporto vitale sistemi e altri dispositivi medici), in cui il guasto dei prodotti potrebbe portare direttamente alla morte, lesioni personali o gravi danni fisici o ambientali ("Attività ad alto rischio"). RPL declina espressamente qualsiasi garanzia espressa o implicita di idoneità per attività ad alto rischio e non si assume alcuna responsabilità per l'uso o l'inclusione di prodotti Raspberry Pi in attività ad alto rischio. I prodotti Raspberry Pi sono forniti in base ai Termini standard di RPL. La fornitura delle RISORSE da parte di RPL non amplia né modifica in altro modo i Termini standard di RPL, incluse, a titolo esemplificativo ma non esaustivo, le esclusioni di responsabilità e le garanzie ivi espresse.
Cronologia delle versioni del documento
Ambito del documento
Questo documento si applica ai seguenti prodotti Raspberry Pi
Introduzione
Con l'introduzione del driver grafico KMS (Kernel Mode Setting), Raspberry Pi Ltd si sta allontanando dal controllo del firmware legacy del sistema di output video e verso un sistema grafico più open source. Tuttavia, questo è arrivato con una serie di sfide. Questo documento ha lo scopo di aiutare con eventuali problemi che potrebbero sorgere durante il passaggio al nuovo sistema. Questo white paper presuppone che Raspberry Pi esegua il sistema operativo Raspberry Pi ed è completamente aggiornato con il firmware e i kernel più recenti.
Terminologia
DRM: Direct Rendering Manager, un sottosistema del kernel Linux utilizzato per comunicare con le unità di elaborazione grafica (GPU). Utilizzato in collaborazione con FKMS e KMS.
Ingresso DVI: Un predecessore di HDMI, ma senza le capacità audio. Sono disponibili cavi e adattatori da HDMI a DVI per collegare un dispositivo Raspberry Pi a un display dotato di DVI.
EDID: Dati di identificazione del display estesi. Un formato di metadati per i dispositivi di visualizzazione per descrivere le loro capacità a una sorgente video. La struttura dei dati EDID include il nome del produttore e il numero di serie, il tipo di prodotto, le dimensioni fisiche del display e i tempi supportati dal display, insieme ad alcuni dati meno utili. Alcuni display possono avere blocchi EDID difettosi, che possono causare problemi se tali difetti non vengono gestiti dal sistema di visualizzazione.
FKMS (vc4-fkms-v3d): Impostazione della modalità Kernel falsa. Mentre il firmware controlla ancora l'hardware di basso livello (ad esample, le porte HDMI (High-Definition Multimedia Interface), la Display Serial Interface (DSI), ecc.), le librerie Linux standard sono utilizzate nel kernel stesso. FKMS viene utilizzato per impostazione predefinita in Buster, ma ora è deprecato a favore di KMS in Bullseye.
HDMI: L'interfaccia multimediale ad alta definizione è un'interfaccia audio/video proprietaria per la trasmissione di dati video non compressi e dati audio digitali compressi o non compressi.
DPS: Rilevamento hotplug. Un cavo fisico asserito da un dispositivo di visualizzazione collegato per mostrare che è presente.
KMS: Impostazione modalità kernel; Vedere https://www.kernel.org/doc/html/latest/gpu/drm-kms.html per ulteriori dettagli. Su Raspberry Pi, vc4-kms-v3d è un driver che implementa KMS e viene spesso definito "il driver KMS". Stack grafico legacy: uno stack grafico interamente implementato nel blob del firmware VideoCore esposto da un driver framebuffer Linux. Lo stack grafico legacy è stato utilizzato nella maggior parte dei dispositivi Raspberry Pi Ltd fino a poco tempo fa; ora viene gradualmente sostituito da (F)KMS/DRM.
Il sistema HDMI e i driver grafici
I dispositivi Raspberry Pi utilizzano lo standard HDMI, molto comune sui moderni monitor LCD e televisori, per l'uscita video. Raspberry Pi 3 (incluso Raspberry Pi 3B+) e i dispositivi precedenti dispongono di una singola porta HDMI, in grado di fornire un'uscita 1920 × 1200 a 60 Hz utilizzando un connettore HDMI full-size. Raspberry Pi 4 ha due porte micro HDMI ed è in grado di produrre output 4K su entrambe le porte. A seconda della configurazione, la porta HDMI 0 su Raspberry Pi 4 è in grado di supportare fino a 4kp60, ma quando si utilizzano due dispositivi di output 4K si è limitati a p30 su entrambi i dispositivi. Lo stack del software grafico, indipendentemente dalla versione, è responsabile dell'interrogazione delle proprietà dei dispositivi HDMI collegati e dell'impostazione appropriata del sistema HDMI. Gli stack legacy e FKMS utilizzano entrambi il firmware nel processore grafico VideoCore per verificare la presenza e le proprietà HDMI. Al contrario, KMS utilizza un'implementazione lato ARM interamente open source. Ciò significa che le basi di codice per i due sistemi sono completamente diverse e in alcune circostanze ciò può comportare un comportamento diverso tra i due approcci. I dispositivi HDMI e DVI si identificano rispetto al dispositivo sorgente utilizzando un pezzo di metadati chiamato blocco EDID. Questo viene letto dal dispositivo sorgente dal dispositivo di visualizzazione tramite una connessione I2C, e questo è completamente trasparente per l'utente finale poiché viene fatto dallo stack grafico. Il blocco EDID contiene una grande quantità di informazioni, ma viene utilizzato principalmente per specificare quali risoluzioni supporta il display, quindi Raspberry Pi può essere impostato per produrre una risoluzione appropriata.
Come viene gestito l'HDMI durante l'avvio
Quando viene acceso per la prima volta, Raspberry Pi passa attraverso una serie di stages, noto come boot stages:
- Il primo-stage, il bootloader basato su ROM avvia la GPU VideoCore.
- Secondo-stage bootloader (questo è bootcode.bin sulla scheda SD su dispositivi precedenti a Raspberry Pi 4 e in SPI EEPROM su Raspberry Pi 4):
- Su Raspberry Pi 4, il secondo-stagIl bootloader avvierà il sistema HDMI, interrogherà il display per le possibili modalità, quindi imposterà il display in modo appropriato. A questo punto il display viene utilizzato per fornire i dati diagnostici di base.
- Il display diagnostico del bootloader (dal 07 dicembre 2022 in poi) visualizzerà lo stato di tutti i display collegati (se Hotplug Detect (HPD) è presente e se un blocco EDID è stato ripristinato dal display).
- Il firmware VideoCore (start.elf) viene caricato ed eseguito. Questo assumerà il controllo del sistema HDMI, leggerà il blocco EDID da qualsiasi display collegato e mostrerà lo schermo arcobaleno su quei display.
- Il kernel di Linux si avvia
- Durante l'avvio del kernel, KMS assumerà il controllo del sistema HDMI dal firmware. Ancora una volta il blocco EDID viene letto da qualsiasi display collegato e queste informazioni vengono utilizzate per configurare la console e il desktop Linux.
Possibili problemi e sintomi
Il sintomo di errore più comune riscontrato durante il passaggio a KMS è un avvio inizialmente buono, con la schermata del bootloader e quindi la schermata arcobaleno che appare, seguita dopo pochi secondi dal display che diventa nero e non si riaccende. Il punto in cui il display diventa nero è in realtà il punto durante il processo di avvio del kernel in cui il driver KMS riprende l'esecuzione del display dal firmware. Il Raspberry Pi è attualmente in esecuzione sotto tutti gli aspetti tranne che per l'uscita HDMI, quindi se SSH è abilitato dovresti essere in grado di accedere al dispositivo tramite quel percorso. Il LED verde di accesso alla scheda SD di solito lampeggia occasionalmente. È anche possibile che non vedrai alcuna uscita HDMI; nessun display del bootloader e nessuno schermo arcobaleno. Questo di solito può essere attribuito a un guasto hardware.
Diagnosi del guasto
Nessuna uscita HDMI
È possibile che il dispositivo non si sia avviato affatto, ma ciò esula dall'ambito di questo white paper. Supponendo che il comportamento osservato sia un problema di visualizzazione, la mancanza di output HDMI durante qualsiasi parte del processo di avvio è solitamente dovuta a un guasto hardware. Ci sono una serie di possibili opzioni:
- Cavo HDMI difettoso
- Prova un nuovo cavo. Alcuni cavi, soprattutto quelli molto economici, potrebbero non contenere tutte le linee di comunicazione necessarie (ad esempio hotplug) affinché Raspberry Pi rilevi correttamente il display.
- Porta HDMI difettosa su Raspberry Pi
- Se stai usando un Raspberry Pi 4, prova l'altra porta HDMI.
- Porta HDMI difettosa sul monitor
- A volte la porta HDMI su un monitor o TV può usurarsi. Prova una porta diversa se il dispositivo ne ha una.
- Raramente, un dispositivo di visualizzazione può fornire dati EDID solo quando è acceso o quando è selezionata la porta corretta. Per verificare, assicurarsi che il dispositivo sia acceso e che sia selezionata la porta di ingresso corretta.
- Il dispositivo di visualizzazione non rileva la linea di rilevamento hotplug
Uscita iniziale, quindi lo schermo diventa nero
Se il display si accende ma poi si spegne durante l'avvio del kernel di Linux, ci sono diverse possibili cause, e queste sono generalmente correlate a un problema di lettura dell'EDID dal dispositivo di visualizzazione. Come si può vedere dalla sezione precedente relativa alla sequenza di avvio, l'EDID viene letto in diversi punti durante il processo di avvio e ciascuna di queste letture viene eseguita da un software diverso. La lettura finale, quando KMS prende il sopravvento, viene eseguita dal codice del kernel Linux a monte inalterato e questo non gestisce i formati EDID difettosi così come il software del firmware precedente. Questo è il motivo per cui il display può smettere di funzionare correttamente una volta che KMS prende il sopravvento. Esistono diversi modi per confermare se KMS non riesce a leggere l'EDID e due di questi sono i seguenti.
Controlla la schermata di diagnostica del bootloader (solo Raspberry Pi 4)
NOTA
La diagnostica del bootloader richiede un bootloader recente. Puoi eseguire l'upgrade all'ultima versione seguendo queste istruzioni: https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#updating-the-bootloader Rimuovi la scheda SD e riavvia il Raspberry Pi. Premere ESC nella schermata Installa sistema operativo e la schermata diagnostica dovrebbe apparire sul dispositivo di visualizzazione. Dovrebbe esserci una linea sul display che inizia con display: — per esampon:
- display: DISP0: HDMI HPD=1 EDID=ok #2 DISP1: HPD=0 EDID=nessuno #0
Questo output da un Raspberry Pi 4 mostra che il sistema ha rilevato un display HDMI sulla porta HDMI 0, il rilevamento hotplug è asserito e l'EDID è stato letto correttamente. Non è stato trovato nulla sulla porta HDMI 1.
Controlla se il sistema KMS ha rilevato un EDID
Per verificarlo dovrai accedere al dispositivo Raspberry Pi tramite SSH da un altro computer. SSH può essere abilitato durante la creazione di un'immagine della scheda SD con Raspberry Pi Imager, utilizzando le opzioni Impostazioni avanzate. Abilitare SSH su una scheda SD di cui è già stata creata l'immagine è un po' più complicato: dovrai utilizzare un altro computer per aggiungere un file denominato ssh nella partizione di avvio. Sostituisci la scheda SD nel Raspberry Pi originale e accendilo. Questo dovrebbe abilitare SSH, con un indirizzo IP assegnato da DHCP. Una volta effettuato l'accesso, digitare quanto segue al prompt del terminale per visualizzare il contenuto di qualsiasi EDID rilevato (potrebbe essere necessario modificare HDMI-A-1 in HDMI-A-2 a seconda della porta HDMI sul Raspberry Pi a cui è collegato il dispositivo di visualizzazione to): cat /sys/class/drm/card?-HDMI-A-1/edid Se non sono presenti cartelle denominate card?-HDMI-A-1 o simili, è probabile che non sia possibile leggere l'EDID dal display dispositivo.
NOTA
Nel caso in cui l'EDID venga letto con successo, c'è un utile virtual file nella stessa cartella, chiamata modes, che quando viene visualizzata mostra tutte le possibili modalità supportate dall'EDID.
Mitigazioni
Errore di rilevamento hotplug Se sia il firmware che il KMS non riescono a trovare un monitor collegato, potrebbe trattarsi di un errore di rilevamento hotplug, ovvero il Raspberry Pi non sa che un dispositivo è stato collegato, quindi non verifica la presenza di un EDID. Ciò potrebbe essere causato da un cavo difettoso o da un dispositivo di visualizzazione che non afferma correttamente l'hotplug. È possibile forzare un rilevamento hotplug modificando la riga di comando del kernel file (cmdline.txt) memorizzato nella partizione di avvio di una scheda SD del sistema operativo Raspberry Pi. Puoi modificare questo file su un altro sistema, utilizzando l'editor che preferisci. Aggiungi quanto segue alla fine di cmdline.txt file: video=HDMI-A-1:1280×720@60D Se si utilizza la seconda porta HDMI, sostituire HDMI-A-1 con HDMI-A-2. Puoi anche specificare una risoluzione e un frame rate diversi, ma assicurati di scegliere quelli supportati dal dispositivo di visualizzazione.
NOTA
La documentazione sulle impostazioni della riga di comando del kernel per i video può essere trovata qui: https://www.kernel.org/doc/Documentation/fb/modedb.txt
AVVERTIMENTO
Gli stack grafici meno recenti supportavano l'uso di una voce config.txt per impostare il rilevamento hotplug, ma al momento della stesura di questo articolo non funziona con KMS. Potrebbe essere supportato nelle versioni future del firmware. La voce config.txt è hdmi_force_hotplug ed è possibile specificare la porta HDMI specifica a cui si applica l'hotplug utilizzando hdmi_force_hotplug:0=1 o hdmi_force_hotplug:1=1. Si noti che la nomenclatura per KMS si riferisce alle porte HDMI come 1 e 2, mentre Raspberry Pi utilizza 0 e 1.
Problemi EDID
Una minoranza di dispositivi di visualizzazione non è in grado di restituire un EDID se sono spenti o quando viene selezionato l'ingresso AV errato. Questo può essere un problema quando il Raspberry Pi e i dispositivi di visualizzazione si trovano sulla stessa ciabatta e il dispositivo Raspberry Pi si avvia più velocemente del display. Con dispositivi come questo, potrebbe essere necessario fornire manualmente un EDID. Ancora più insolitamente, alcuni dispositivi di visualizzazione hanno blocchi EDID mal formattati e non possono essere analizzati dal sistema KMS EDID. In queste circostanze, potrebbe essere possibile leggere un EDID da un dispositivo con una risoluzione simile e utilizzarlo. In entrambi i casi, le seguenti istruzioni illustrano come leggere un EDID da un dispositivo di visualizzazione e configurare KMS per utilizzarlo, invece di KMS che tenta di interrogare direttamente il dispositivo.
Copia di un EDID in a file
Creazione di un file contenere metadati EDID da zero di solito non è fattibile e utilizzarne uno esistente è molto più semplice. In genere è possibile ottenere un EDID da un dispositivo di visualizzazione e memorizzarlo sulla scheda SD del Raspberry Pi in modo che possa essere utilizzato da KMS invece di ottenere un EDID dal dispositivo di visualizzazione. L'opzione più semplice qui è assicurarsi che il dispositivo di visualizzazione sia attivo e funzionante e sull'ingresso AV corretto e che il Raspberry Pi abbia avviato correttamente il sistema HDMI. Dal terminale, ora puoi copiare l'EDID in a file con il seguente comando: sudo cp /sys/class/drm/card?-HDMI-A-1/edid /lib/firmware/myedid.dat Se per qualche motivo l'EDID non è presente, è possibile avviare il dispositivo in modo non -Modalità KMS che riesce ad avviarsi sul desktop o sulla console, quindi copiare l'EDID che il firmware (si spera) leggerà correttamente su un file.
- Avvia in modalità grafica legacy.
- Modifica config.txt nella partizione di avvio, assicurandoti di eseguire l'editor utilizzando sudo e modifica la riga che dice dtoverlay=vc4-kms-v3d in #dtoverlay=vc4-kms-v3d.
- Riavviare.
- Ora dovrebbe apparire il desktop o la console di accesso.
- Utilizzando il terminale, copiare l'EDID dal dispositivo di visualizzazione collegato a a file con il seguente comando:
- tvservice -d mioedid.dat sudo mv mioedid.dat /lib/firmware/
Utilizzando un file-based EDID invece di interrogare il dispositivo di visualizzazione Modificare /boot/cmdline.txt, assicurandosi di eseguire l'editor utilizzando sudo e aggiungere quanto segue alla riga di comando del kernel: drm.edid_firmware=myedid.dat È possibile applicare l'EDID a un specifica porta HDMI come segue: drm.edid_firmware=HDMI-A-1:myedid.dat Se necessario, riavviare in modalità KMS procedendo come segue:
- Modifica config.txt nella partizione di avvio, assicurandoti di eseguire l'editor utilizzando sudo e modifica la riga che dice #dtoverlay=vc4-kms-v3d in dtoverlay=vc4-kms-v3d.
- Riavviare.
NOTA
Se utilizzi un file-based EDID, ma hai ancora problemi con hotplug, puoi forzare il rilevamento hotplug aggiungendo quanto segue alla riga di comando del kernel: video=HDMI-A-1:D.
Documenti / Risorse
![]() |
Driver grafico con uscita HDMI KMS RaspberryPi [pdf] Manuale d'uso KMS, driver grafico uscita HDMI, uscita HDMI KMS, driver grafico, driver grafico uscita HDMI KMS, driver |