Autor Thema: VESA EDID  (Gelesen 7500 mal)

SqrT

  • Beiträge: 9
    • Profil anzeigen
Gespeichert
« am: 03. November 2013, 12:07 »
Guten Morgen,
mir kam vor einigen Tagen mal wieder die Idee in den Sinn, meinen VBE-Treiber zu verbessern. Um meinen Grafikteiber weiter zu verbessern wollte ich mit EDID die Liste der verfügbaren Grafikmodis einschränken. Dies funktioniert auch meisten auf echter Hardware mit dem BIOS interrupt 0x10, ax = 0x4F15, bx = 0x0001. In diesem Thema soll es jedoch um die Fälle gehen bei denen es nicht funktioniert, d. h. EDID wird unterstützt, dies habe ich verifiziert mit dem BIOS interrupt 0x10 ax = 0x4F15, bx = 0x0000, es : di = 0x0000, jedoch kann ich die EDID informationen nicht auslesen mit der vorher beschriebenen Prozedur. Nun habe ich mich informiert wie man die EDID funktionen noch bekommen könnte. Man kann die EDID informationen scheinbar ebenfalls bekommen, durch ACPI Tabellen? oder durch eine BIOS Tabelle, sowie durch eine Enumeration der PCI-Busse um den passenden Grafikcontroller zu finden, und bei diesem die EDID informationen abzufragen. Aus dem linux Kernel habe ich entnommen, dass die EDID informationen ebenfalls in einer der ACPI Tabellen vorhanden sind, oder die ACPI Tabellen auf eine Kontrollstruktur zeigen, welche diese beeinhaltet. Meine Frage ist nun ob sich vielleicht schon mal jemand umfassend mit dem Thema beschäftigt hat und möglicherweise zu einer Lösung gekommen ist, da die Informationen, welche im Internet zu finden sind ja eher spärlich ausfallen.
Mir wäre es wichtig dem User so oft wie möglich nur eine Liste an Grafikmodis anzuzeigen, welche der Bildschirm auch unterstützt.

MfG SqrT

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 03. November 2013, 18:47 »
Hallo,

wie äußert sich denn das "kann ich nicht auslesen"? Liest du nur 0xFF?
Analoge Bildschirme liefern nur maximale Horizontal- und Vertikalfrequenzen mit DDC, richtige EDID-Informationen bekommst du nur mit einem digitalen Flachbildschirm. Ansonsten sind EDID-Daten auf nicht-gewöhnlichen Geräten (z.B. Beamer, Fernseher) sowieso viel zu oft kaputt.

Aus der Grafikkarte lesen dürfte nur mit einem echten Grafiktreiber funktionieren und mit den ACPI-Tabellen habe ich mich nicht befasst.

Gruß,
Svenska

SqrT

  • Beiträge: 9
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 05. November 2013, 17:45 »
Guten Abend,
entschuldigen sie bitte die Vespätung meiner Antwort, jedoch hatte ich in den letzten Tagen viel zu tun. Das "nicht auslesen" äußert sich in dem Fehlschlag der BIOS Funktion int 0x10 ax = 0x415 bx = 1, cx = 0, dx = 0. Ich habe vorher abgefragt, ob die EDID Funktionen vorhanden sind mit der BIOS funktion int 0x10 ax = 0x415 bx = 0, es : di = 0. Nach dem BIOS sind die EDID Informationen vorhanden, jedoch kann ich sie nicht auslesen mit der dafür typischen BIOS Funktion( int 0x10 ax = 0x415 bx = 1, cx = 0, dx = 0 ). Da der Funktionsaufruf scheitert ( ax != 0x4F ) darf ich nach der Specifikation die Daten, welche in dem Buffer stehen nicht als gültig betrachten. Nun stellte sich mir die Frage, wenn mir das BIOS sagt, dass die EDID Informationen existieren, ich sie aber nicht mit der genannten BIOS Funktion auslesen kann, wo sie sich dann befinden. Ein Fehler im Code ist nahezu ausgeschlossen, da ich diesen Code auf drei verschiedenen Bildschirmen und verschiedenen PCs getestet habe und der Fehler nur beim auslesen der EDID Informationen eines Fernsehers scheitert. Ich hoffe, dass ich die EDID Informationen eines Fernsehers auch auslesen kann, insbesondere wenn selbst das BIOS sagt, dass diese existieren. Vielleicht funktioniert die BIOS Funktion int 0x10 ax = 0x415 bx = 2, welche die VDIF auslesen würde. Jedoch steht über das Format dieser VDIF nichts im Internet, oder ich konnte bisher nichts finden.

MfG SqrT


Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 05. November 2013, 19:13 »
Wahrscheinlich sendet der Fernseher einfach keine gültige EDID. Fernseher sind dafür berüchtigt. Versuche es mal mit eingeschaltetem (auf Eingang gestelltem) eingeschaltetem (auf TV gestelltem), ausgeschaltetem (Standby) und ausgeschaltetem (stromlos) Fernseher - die verhalten sich gelegentlich unterschiedlich.

Was ist es für ein Gerät und was sagt ein z.B. Linux-Treiber im Log? Ist es eine HDMI-Verbindung? Hast du evtl. auch mal die anderen Eingänge probiert?

Wenn du die EDID nicht auslesen kannst, solltest du einen Default anbieten (640x480@60 geht immer) und einen manuellen Override anbieten.

SqrT

  • Beiträge: 9
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 05. November 2013, 21:15 »
Guten Abend,
es handelt sich um eine VGA-Verbindung vom Fernseher zum PC. Die EDID Informationen sind identisch bei den drei aufgezählten Einstellungsmethoden des Fernsehers. Um den Linux-Treiber Log muss ich mich noch kümmern, besitze im Moment nicht die Möglichkeit dies zu testen. Die von dir genannten default Einstellungen biete ich schon an, ich versuche im Moment nur die Erfolgsquote des EDID auslesens zu maximieren, um ein schöneres Bild zu erzeugen und den User nicht unnötig einzubinden. Habe mich weiter mit dem Linux Source Code beschäftigt, die Bildschirme sind als Objekte in den ACPI Tabellen vorhanden, jedoch weiß ich noch nicht inwiefern man die EDID Informationen mithilfe dieser ACPI-Objekte bekommen soll. Ebenfalls soll es einen auslesbaren EEPROM Bereich vom Bildschirm geben, welchen man über den I^2C-Bus auslesen kann. Vielen Dank für die schnelle Antwort Svenska, ich versuche das mit dem Linux-Treiber log so schnell wie möglich zu realisieren.
MfG SqrT



Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 06. November 2013, 00:13 »
Hallo,

Sie dürfen mich gern duzen. :-)

Auf den DDC-Pins des VGA-Steckers wird zwischen Grafikkarte und Bildschirm ein I²C-EEPROM im Bildschirm ausgelesen, welches eben die EDID erhält. Auf den I²C-Bus selbst hat man keinerlei Zugriff, wenn man nicht einen eigenen Grafiktreiber schreibt. Der Interrupt 10h steuert nur das Video-BIOS (und damit den in der Grafikkarte integrierten Treiber) an. Diese Schnittstelle benutzt das System-BIOS auch, um die ACPI-Tabellen zu erzeugen. (Vermutlich hängt es außerdem von der Grafikkarte ab, ob die ACPI-Tabelle eine EDID enthält. Ich halte den Nutzen für fraglich, wenn man aktuelle dynamische Hotplug-Multimonitorkonfigurationen und eher statische ACPI-Tabellen vergleicht.)

Wenn es mit Linux funktioniert, dann wird vermutlich ein Fixup greifen, d.h. statt der empfangenen EDID wird eine im Treiber integrierte benutzt, weil die vom Fernseher kaputt ist. In der Xorg.0.log steht die EDID auch als Hexdump drin. Sollte deine fehlschlagende Funktion den Buffer überschreiben (und im Rückgabewert nur anmelden, dass die EDID ungültig ist), dann kannst du vermutlich trotzdem das Gerät ermitteln und mit deiner eigenen Blacklist abgleichen. Einen Versuch wäre es wert.

Wie gesagt, vermutlich ist der Fernseher "kaputt". Dann kann deine Software durch drei brennende Reifen im Kreis springen - bringen wird es nichts.

Gruß,
Svenska

SqrT

  • Beiträge: 9
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 06. November 2013, 19:35 »
Guten Abend,
vielen Dank mal wieder für die schnelle Antwort. Ich fang dann jetzt mal an mit dem duzen :D ich selbst werde auch lieber geduzt, fange jedoch lieber immer mit dem Siezen an, damit sich niemand angegriffen fühlt. Das mit dem Linux-log dauert noch ein wenig, da ich Windows besitze und gerade zu wenig Zeit habe um eine Linux Partition einzurichten ( und sie sinnvoll zu verwenden ). Habe es jetzt wie du geraten hast erstmal zurückgestellt um jeden Preis an die EDID Informationen zu kommen, der User bekommt eine Liste die sein Monitor/Bildschirm von der Grafikkarte aus unterstützen könnte, mit einer Warnung, dass der User nur eine Auflösung auswählen soll, von der er sicher ist das sie unterstützt wird ( es werden auch die VGA-Auflösungen angeboten 640*480 etc. ). Nun stelle ich noch eine weitere Frage mit der ich mich im Moment beschäftige, nämlich die Erstellung dieser "Blacklist". Ist es möglich auch ohne EDID eine zweifelsfreie Identifikation des Bildschirms vorzunehmen? Mir schwebt folgendes vor: Der User hat einen Bildschirm bei welchem die EDID Informationen kaputt sind. Zum Glück kennt er die Auflösung seines Monitors/Fernsehers und selektiert sie innerhalb der Liste der aufgelisteten Grafikmodis. Nun würde ich gerne diese Auflösung speichern für genau diesen Monitortyp sodass der User beim nächsten Start nicht mehr gefragt wird und die Auflösung einfach genommen wird. Die Identifikation ist wichtig, da bei einem Monitor wechsel, also er/sie hat einen neuen Monitor gekauft und angeschlossen, nicht diesselbe Auflösung wie für den alten Bildschirm genommen werden darf. Ich habe bereits geschaut ob die Informationen welche von der BIOS Funktion int 0x10 ax = 0x4F00 es:di = Buffer zurückgegeben werden sich bei unterschiedlichen Bildschirmen auch unterscheiden, dies ist jedoch nicht der Fall. Ist es trotzdem möglich den Bildschirm zu identifizieren ohne EDID Unterstützung?
MfG SqrT 

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 06. November 2013, 20:42 »
Nein. Ohne zu wissen, welcher Bildschirm es ist, kannst du ihn nicht identifzieren.
Wenn der User einen Modus auswählt, kannst du den aber als Default speichern und so lange verwenden, wie sich die EDID nicht ändert (bzw. solange die EDID ungültig ist). Die Wahrscheinlichkeit, dass ein Monitorwechsel von "kaputt" zu "heil" (oder "heil" zu irgendwas) geschieht, ist wesentlich höher als der von "kaputt" nach "kaputt".

 

Einloggen