RaspberryPi-LOGO

RaspberryPi KMS HDMI-utgångsgrafikdrivrutin

RaspberryPi-KMS-HDMI-Output-Graphics-Driver-PRODACT-IMG

Kolofon

2020-2023 Raspberry Pi Ltd (tidigare Raspberry Pi (Trading) Ltd.) Denna dokumentation är licensierad under en Creative Commons Attribution-NoDerivatives 4.0 International (CC BY-ND 4.0)-licens. byggdatum: 2023-02-10 byggversion: githash: c65fe9c-clean

Juridisk friskrivningsklausul

TEKNISK OCH PÅLITLIGHETSDATA FÖR RASPBERRY PI-PRODUKTER (INKLUSIVE DATABLAD) SOM ÄNDRADE FRÅN TID TILL TID ("RESURSER") TILLHANDAHÅLLS AV RASPBERRY PI LTD ("RPL") "I BEFINTLIGT SKICK" OCH EVENTUELLA UTTRYCKLIGA ELLER UNDERFÖRSTÅDDA, UNDERFÖRSTÅDDA, UNDERFÖRSTÅDDA TILL FRÅSES UNDERFÖRSTÅDDA GARANTIER OM SÄLJBARHET OCH LÄMPLIGHET FÖR ETT SÄRSKILT SYFTE. I DEN MAXIMALA UTSTRÄCKNING SOM TILLÅTS AV TILLÄMPLIG LAG SKALL RPL UNDER INGA OMSTÄNDIGHETER VARA ANSVARIGT FÖR NÅGON DIREKTA, INDIREKTA, OAVSIKTLIGA, SPECIELLA, EXEMPELSKADOR ELLER FÖLJDSKADOR (INKLUSIVE, MEN INTE BEGRÄNSADE TILL, UPPHANDLING AV ANVÄNDNING AV VAROR; ELLER VINST; ELLER AFFÄRSAVBROTT ELLER ORSAKADE OCH PÅ NÅGON ANSVARSTEORI, OAVSETT I KONTRAKT, STIKT ANSVAR, ELLER SKADESTÅND (INKLUSIVE FÖRSIKTIGHET ELLER ANNAT SÄTT) SOM UPPSTÅR PÅ NÅGOT SÄTT FRÅN VÅRT ANVÄNDNING, OM VÅR ANVÄNDNING. AV SÅDAN SKADA. RPL förbehåller sig rätten att göra förbättringar, förbättringar, korrigeringar eller andra modifieringar av RESURSERNA eller de produkter som beskrivs i dem när som helst och utan ytterligare meddelande. RESURSERNA är avsedda för skickliga användare med lämpliga nivåer av designkunskap. Användare är ensamt ansvariga för sitt val och användning av RESURSER och all tillämpning av de produkter som beskrivs i dem. Användaren samtycker till att hålla RPL skadeslös mot alla ansvar, kostnader, skador eller andra förluster som uppstår till följd av deras användning av RESURSER. RPL ger användarna tillåtelse att använda RESURSER enbart i samband med Raspberry Pi-produkterna. All annan användning av RESURSERNA är förbjuden. Ingen licens ges till någon annan RPL eller annan immateriell rättighet från tredje part. HÖG RISKAKTIVITETER. Raspberry Pi-produkter är inte designade, tillverkade eller avsedda för användning i farliga miljöer som kräver felsäker prestanda, till exempel vid drift av kärntekniska anläggningar, flygplansnavigering eller kommunikationssystem, flygledning, vapensystem eller säkerhetskritiska applikationer (inklusive livsuppehållande) system och annan medicinsk utrustning), där fel på produkterna direkt kan leda till dödsfall, personskada eller allvarliga fysiska eller miljömässiga skador (”Högriskaktiviteter”). RPL frånsäger sig uttryckligen alla uttryckliga eller underförstådda garantier för lämplighet för högriskaktiviteter och tar inget ansvar för användning eller inkludering av Raspberry Pi-produkter i högriskaktiviteter. Raspberry Pi-produkter tillhandahålls enligt RPL:s standardvillkor. RPL:s tillhandahållande av RESURSERNA utökar eller modifierar inte RPL:s standardvillkor inklusive men inte begränsat till friskrivningarna och garantierna uttryckta i dem.

Dokumentversionshistorik

RaspberryPi-KMS-HDMI-Output-Graphics-Driver-FIG-1

Dokumentets omfattning

Detta dokument gäller för följande Raspberry Pi-produkter

RaspberryPi-KMS-HDMI-Output-Graphics-Driver-FIG-2

Introduktion

Med introduktionen av grafikdrivrutinen KMS (Kernel Mode Setting) går Raspberry Pi Ltd bort från äldre firmwarekontroll av videoutgångssystemet och mot ett grafiksystem med mer öppen källkod. Detta har dock kommit med sina egna utmaningar. Det här dokumentet är avsett att hjälpa till med alla problem som kan uppstå vid övergång till det nya systemet. Detta whitepaper förutsätter att Raspberry Pi kör Raspberry Pi OS och är helt uppdaterad med den senaste firmware och kärnor.

Terminologi

DRM:er: Direct Rendering Manager, ett undersystem av Linux-kärnan som används för att kommunicera med grafikprocessorer (GPU). Används i samarbete med FKMS och KMS.
DVI: En föregångare till HDMI, men utan ljudmöjligheter. HDMI till DVI-kablar och adaptrar finns för att ansluta en Raspberry Pi-enhet till en DVI-utrustad skärm.
EDID: Utökad visningsidentifikationsdata. Ett metadataformat för visningsenheter för att beskriva deras kapacitet till en videokälla. EDID-datastrukturen inkluderar tillverkarens namn och serienummer, produkttyp, fysisk displaystorlek och de tider som stöds av displayen, tillsammans med lite mindre användbar data. Vissa skärmar kan ha defekta EDID-block, vilket kan orsaka problem om dessa defekter inte hanteras av skärmsystemet.
FKMS (vc4-fkms-v3d): Fake Kernel Mode-inställning. Medan den fasta programvaran fortfarande styr hårdvaran på låg nivå (t.example, HDMI-portarna (High-Definition Multimedia Interface), Display Serial Interface (DSI), etc), standard Linux-bibliotek används i själva kärnan. FKMS används som standard i Buster, men är nu utfasad till förmån för KMS i Bullseye.
HDMI: High-Definition Multimedia Interface är ett egenutvecklat ljud/video-gränssnitt för överföring av okomprimerad videodata och komprimerad eller okomprimerad digital ljuddata.
HPD: Hotplug upptäcka. En fysisk tråd som hävdas av en ansluten displayenhet för att visa att den finns.
KMS: Inställning av kärnläge; ser https://www.kernel.org/doc/html/latest/gpu/drm-kms.html för mer detaljer. På Raspberry Pi är vc4-kms-v3d en drivrutin som implementerar KMS, och kallas ofta för "KMS-drivrutinen". Äldre grafikstack: En grafikstack helt implementerad i VideoCore firmware-blobb exponerad av en Linux-framebufferdrivrutin. Den äldre grafikstacken har använts i de flesta Raspberry Pi Ltd-enheter tills nyligen; den ersätts nu gradvis av (F)KMS/DRM.

HDMI-systemet och grafikdrivrutinerna

Raspberry Pi-enheter använder HDMI-standarden, som är mycket vanlig på moderna LCD-skärmar och tv-apparater, för videoutgång. Raspberry Pi 3 (inklusive Raspberry Pi 3B+) och tidigare enheter har en enda HDMI-port, som är kapabel till 1920 × 1200 @60Hz med en HDMI-kontakt i full storlek. Raspberry Pi 4 har två mikro-HDMI-portar och klarar av 4K-utgång på båda portarna. Beroende på inställning kan HDMI 0-porten på Raspberry Pi 4 ha upp till 4kp60, men när du använder två 4K-utgångsenheter är du begränsad till p30 på båda enheterna. Grafikprogramvaran, oavsett version, ansvarar för att kontrollera anslutna HDMI-enheter för deras egenskaper och ställa in HDMI-systemet på rätt sätt. Legacy- och FKMS-stackarna använder båda firmware i VideoCore-grafikprocessorn för att kontrollera HDMI-närvaro och -egenskaper. Däremot använder KMS en helt öppen källkod, implementering på ARM-sidan. Detta innebär att kodbaserna för de två systemen är helt olika, och i vissa fall kan detta resultera i olika beteende mellan de två metoderna. HDMI- och DVI-enheter identifierar sig själva för källenheten med hjälp av en bit metadata som kallas ett EDID-block. Detta läses av källenheten från displayenheten via en I2C-anslutning, och detta är helt transparent för slutanvändaren eftersom det görs av grafikstacken. EDID-blocket innehåller en hel del information, men det används främst för att specificera vilka upplösningar skärmen stöder, så Raspberry Pi kan ställas in för att mata ut en lämplig upplösning.

Hur HDMI hanteras under uppstart

När Raspberry Pi först sätts på går den igenom ett antal stages, känd som boot stages:

  1. De första-stage, ROM-baserad bootloader startar upp VideoCore GPU.
  2. Andra-stage bootloader (detta är bootcode.bin på SD-kortet på enheter före Raspberry Pi 4 och i SPI EEPROM på Raspberry Pi 4):
    1. På Raspberry Pi 4, andra-stagStarthanteraren startar HDMI-systemet, undersöker skärmen för möjliga lägen och ställer sedan in skärmen på rätt sätt. Vid denna tidpunkt används displayen för att tillhandahålla grundläggande diagnostiska data.
    2. Startladdarens diagnostiska display (07 december 2022 och framåt) kommer att visa status för alla anslutna bildskärmar (om Hotplug Detect (HPD) finns och om ett EDID-block har återställts från displayen).
  3. VideoCores firmware (start.elf) laddas och körs. Detta kommer att ta över kontrollen över HDMI-systemet, läsa EDID-blocket från alla anslutna skärmar och visa regnbågsskärmen på dessa skärmar.
  4. Linux-kärnan startar
    1. Under kärnstart kommer KMS att ta över kontrollen över HDMI-systemet från den fasta programvaran. Än en gång läses EDID-blocket från alla bifogade skärmar, och denna information används för att ställa in Linux-konsolen och skrivbordet.

Möjliga problem och symtom

Det vanligaste felsymptomet som upplevs när man flyttar till KMS är en initialt bra start, med startladdarens skärm och sedan regnbågsskärmen som visas, följt efter några sekunder av att skärmen blir svart och inte tänds igen. Den punkt där skärmen blir svart är i själva verket den punkt under kärnans uppstartning när KMS-drivrutinen tar över att köra skärmen från den fasta programvaran. Raspberry Pi körs för närvarande i alla avseenden förutom HDMI-utgången, så om SSH är aktiverat bör du kunna logga in på enheten via den vägen. Den gröna LED-lampan för SD-kort kommer vanligtvis att flimra då och då. Det är också möjligt att du inte ser någon HDMI-utgång alls; ingen bootloader-skärm och ingen regnbågsskärm. Detta kan vanligtvis hänföras till ett hårdvarufel.

Diagnostisera felet

Ingen HDMI-utgång alls
Det är möjligt att enheten inte har startat alls, men detta ligger utanför detta vitbok. Om man antar att det observerade beteendet är ett skärmproblem, beror bristen på HDMI-utgång under någon del av uppstartsprocessen vanligtvis på ett hårdvarufel. Det finns ett antal möjliga alternativ:

  • Defekt HDMI-kabel
  • Prova en ny kabel. Vissa kablar, särskilt mycket billiga sådana, kanske inte innehåller alla nödvändiga kommunikationslinjer (t.ex. hotplug) för att Raspberry Pi ska kunna upptäcka skärmen.
  • Defekt HDMI-port på Raspberry Pi
  • Om du använder en Raspberry Pi 4, prova den andra HDMI-porten.
  • Defekt HDMI-port på monitorn
  • Ibland kan HDMI-porten på en bildskärm eller TV slitas ut. Prova en annan port om enheten har en.
  • I sällsynta fall kan en displayenhet bara tillhandahålla EDID-data när den är påslagen eller när rätt port är vald. För att kontrollera, se till att enheten är på och att rätt ingångsport är vald.
  • Displayenhet som inte hävdar hotplug-detekteringslinjen

Initial output, sedan blir skärmen svart
Om displayen kommer upp men sedan slocknar under Linux-kärnstart finns det ett antal möjliga orsaker, och dessa är vanligtvis relaterade till ett problem med att läsa EDID från displayenheten. Som framgår av avsnittet ovan som handlar om startsekvensen läses EDID vid ett antal olika punkter under uppstartsprocessen, och var och en av dessa läsningar görs av en annan mjukvara. Den sista läsningen, när KMS tar över, utförs av oförändrad uppströms Linux-kärnkod, och denna hanterar inte defekta EDID-format lika väl som den tidigare firmware-mjukvaran. Det är därför displayen kan sluta fungera korrekt när KMS tar över. Det finns flera sätt att bekräfta om KMS misslyckas med att läsa EDID, och två av dessa är som följer.
Kontrollera starthanterarens diagnostiska skärm (endast Raspberry Pi 4)

NOTERA
Bootloader-diagnostik kräver en ny starthanterare. Du kan uppgradera till den senaste versionen med dessa instruktioner: https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#updating-the-bootloader Ta bort SD-kortet och starta om Raspberry Pi. Tryck på ESC på skärmen Install OS, och diagnostikskärmen bör visas på displayenheten. Det ska finnas en rad på displayen som börjar med display: — till exempelampde:

  • visa: DISP0: HDMI HPD=1 EDID=ok #2 DISP1: HPD=0 EDID=ingen #0

Denna utdata från en Raspberry Pi 4 visar att systemet upptäckte en HDMI-skärm på HDMI-port 0, hotplug-detekteringen hävdas och EDID lästes OK. Inget hittades på HDMI-port 1.

Kontrollera om KMS-systemet har upptäckt en EDID
För att kontrollera detta måste du logga in på Raspberry Pi-enheten via SSH från en annan dator. SSH kan aktiveras när du skapar en SD-kortbild med Raspberry Pi Imager, med hjälp av alternativen för avancerade inställningar. Att aktivera SSH på ett SD-kort som redan har avbildats är lite mer komplicerat: du måste använda en annan dator för att lägga till en file heter ssh till startpartitionen. Byt ut SD-kortet i den ursprungliga Raspberry Pi och slå på det. Detta bör aktivera SSH, med en IP-adress tilldelad av DHCP. När du har loggat in skriver du följande vid terminalprompten för att visa innehållet i eventuellt upptäckt EDID (du kan behöva ändra HDMI-A-1 till HDMI-A-2 beroende på vilken HDMI-port på Raspberry Pi som bildskärmsenheten är ansluten till): cat /sys/class/drm/card?-HDMI-A-1/edid Om det inte finns några mappar med namnet card?-HDMI-A-1 eller liknande, är det troligt att ingen EDID kunde läsas från skärmen enhet.

NOTERA
I det fall där EDID läses framgångsrikt finns det en användbar virtuell file i samma mapp, kallade lägen, som när de visas visar alla möjliga lägen som EDID hävdar att enheten stöder.

Begränsningar

Hotplug-detekteringsfel Om både den fasta programvaran och KMS misslyckas med att hitta en ansluten bildskärm, kan det vara ett hotplug-detekteringsfel — dvs. Raspberry Pi vet inte att en enhet har anslutits, så den söker inte efter en EDID. Detta kan orsakas av en dålig kabel eller en bildskärmsenhet som inte bekräftar hotpluggen korrekt. Du kan tvinga en hotplug-detektering genom att ändra kärnans kommandorad file (cmdline.txt) som lagras i startpartitionen på ett Raspberry Pi OS SD-kort. Du kan redigera detta file på ett annat system, med vilken editor du föredrar. Lägg till följande i slutet av cmdline.txt file: video=HDMI-A-1:1280×720@60D Om du använder den andra HDMI-porten, byt ut HDMI-A-1 mot HDMI-A-2. Du kan också ange en annan upplösning och bildhastighet, men se till att du väljer de som skärmenheten stöder.

NOTERA
Dokumentation om kärnans kommandoradsinställningar för video finns här: https://www.kernel.org/doc/Documentation/fb/modedb.txt

VARNING
Äldre grafikstackar stödde användningen av en config.txt-post för att ställa in hotplug-detektion, men i skrivande stund fungerar detta inte med KMS. Det kan komma att stödjas i framtida versioner av firmware. Config.txt-posten är hdmi_force_hotplug, och du kan ange den specifika HDMI-port som hotpluggen gäller med antingen hdmi_force_hotplug:0=1 eller hdmi_force_hotplug:1=1. Observera att nomenklaturen för KMS refererar till HDMI-portarna som 1 och 2, medan Raspberry Pi använder 0 och 1.

EDID problem
En minoritet av displayenheterna kan inte returnera en EDID om de stängs av eller när fel AV-ingång väljs. Detta kan vara ett problem när Raspberry Pi och bildskärmsenheterna är på samma grenuttag och Raspberry Pi-enheten startar snabbare än skärmen. Med sådana här enheter kan du behöva ange ett EDID manuellt. Ännu mer ovanligt har vissa skärmenheter EDID-block som är dåligt formaterade och inte kan analyseras av KMS EDID-systemet. Under dessa omständigheter kan det vara möjligt att läsa en EDID från en enhet med liknande upplösning och använda den. I båda fallen beskriver följande instruktioner hur man läser ett EDID från en visningsenhet och konfigurerar KMS för att använda det, istället för att KMS försöker fråga enheten direkt.

Kopiera en EDID till en file
Skapa en file att innehålla EDID-metadata från grunden är vanligtvis inte genomförbart, och att använda en befintlig är mycket lättare. Det är i allmänhet möjligt att få ett EDID från en visningsenhet och lagra det på Raspberry Pi:s SD-kort så att det kan användas av KMS istället för att få ett EDID från visningsenheten. Det enklaste alternativet här är att se till att displayenheten är igång och på rätt AV-ingång, och att Raspberry Pi har startat upp HDMI-systemet korrekt. Från terminalen kan du nu kopiera EDID till en file med följande kommando: sudo cp /sys/class/drm/card?-HDMI-A-1/edid /lib/firmware/myedid.dat Om EDID av någon anledning inte finns kan du starta upp enheten i ett icke -KMS-läge som lyckas starta upp till skrivbordet eller konsolen, kopiera sedan EDID:et som den fasta programvaran (förhoppningsvis) kommer att läsa till en file.

  1. Starta till äldre grafikläge.
    1. Redigera config.txt i startpartitionen, se till att köra din editor med sudo, och ändra raden som säger dtoverlay=vc4-kms-v3d till #dtoverlay=vc4-kms-v3d.
    2. Starta om.
  2. Skrivbordet eller inloggningskonsolen bör nu visas.
    1. Använd terminalen och kopiera EDID från den anslutna displayenheten till en file med följande kommando:
  • tvservice -d myedid.dat sudo mv myeid.dat /lib/firmware/

Att använda en file-baserat EDID istället för att fråga visningsenheten. Redigera /boot/cmdline.txt, se till att köra din editor med sudo och lägg till följande till kärnans kommandorad: drm.edid_firmware=myedid.dat Du kan använda EDID på en specifik HDMI-port enligt följande: drm.edid_firmware=HDMI-A-1:myedid.dat Om det behövs, starta om till KMS-läge genom att göra följande:

  1. Redigera config.txt i startpartitionen, se till att köra din editor med sudo, och ändra raden som säger #dtoverlay=vc4-kms-v3d till dtoverlay=vc4-kms-v3d.
  2. Starta om.

NOTERA
Om du använder en file-baserad EDID, men fortfarande har problem med hotplug, kan du tvinga hotplug-detektering genom att lägga till följande till kärnans kommandorad: video=HDMI-A-1:D.

Dokument/resurser

RaspberryPi KMS HDMI-utgångsgrafikdrivrutin [pdf] Användarmanual
KMS, HDMI Output Graphics Driver, KMS HDMI Output, Graphics Driver, KMS HDMI Output Graphics Driver, Driver

Referenser

Lämna en kommentar

Din e-postadress kommer inte att publiceras. Obligatoriska fält är markerade *