[FREELDR]
authorEric Kohl <eric.kohl@reactos.org>
Sun, 22 Jan 2017 15:03:11 +0000 (15:03 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Sun, 22 Jan 2017 15:03:11 +0000 (15:03 +0000)
Add VESA DDC detection and EDID read code. Work in progress.

svn path=/trunk/; revision=73587

reactos/boot/freeldr/freeldr/arch/i386/hardware.c
reactos/boot/freeldr/freeldr/arch/i386/i386vid.c
reactos/boot/freeldr/freeldr/include/video.h

index b9f222d..a5ff69c 100644 (file)
@@ -1678,6 +1678,18 @@ DetectDisplayController(PCONFIGURATION_COMPONENT_DATA BusKey)
     TRACE("Created key: DisplayController\\0\n");
 
     /* FIXME: Add display peripheral (monitor) data */
+    if (VesaVersion != 0)
+    {
+        if (BiosIsVesaDdcSupported())
+        {
+            TRACE("VESA/DDC supported!\n");
+            if (BiosVesaReadEdid())
+            {
+                TRACE("EDID data read successfully!\n");
+
+            }
+        }
+    }
 }
 
 
index c654457..a0f86c9 100644 (file)
@@ -22,7 +22,7 @@
 #define NDEBUG
 #include <debug.h>
 
-DBG_DEFAULT_CHANNEL(UI);
+DBG_DEFAULT_CHANNEL(HWDETECT);
 
 #include <pshpack2.h>
 typedef struct
@@ -237,3 +237,64 @@ USHORT BiosIsVesaSupported(VOID)
 
     return SvgaInfo->VesaVersion;
 }
+
+
+BOOLEAN
+BiosIsVesaDdcSupported(VOID)
+{
+    REGS Regs;
+
+    TRACE("BiosIsVesaDdcSupported()\n");
+
+    Regs.w.ax = 0x4F15;
+    Regs.b.bl = 0;
+    Regs.w.cx = 0;
+    Regs.w.es = 0;
+    Regs.w.di = 0;
+    Int386(0x10, &Regs, &Regs);
+
+    TRACE("AL = 0x%x\n", Regs.b.al);
+    TRACE("AH = 0x%x\n", Regs.b.ah);
+
+    TRACE("BL = 0x%x\n", Regs.b.bl);
+
+    if (Regs.w.ax != 0x004F)
+    {
+        ERR("VESA/DDC installation check failed\n");
+        return FALSE;
+    }
+
+    return (Regs.b.ah == 0);
+}
+
+
+BOOLEAN
+BiosVesaReadEdid(VOID)
+{
+    REGS Regs;
+
+    TRACE("BiosVesaReadEdid()\n");
+
+    RtlZeroMemory((PVOID)BIOSCALLBUFFER, 128);
+
+    Regs.w.ax = 0x4F15;
+    Regs.b.bl = 1;
+    Regs.w.cx = 0;
+    Regs.w.dx = 0;
+    Regs.w.es = BIOSCALLBUFSEGMENT;
+    Regs.w.di = BIOSCALLBUFOFFSET;
+    Int386(0x10, &Regs, &Regs);
+
+    TRACE("AL = 0x%x\n", Regs.b.al);
+    TRACE("AH = 0x%x\n", Regs.b.ah);
+
+    if (Regs.w.ax != 0x004F)
+    {
+        ERR("Read EDID function not supported!\n");
+        return FALSE;
+    }
+
+    return (Regs.b.ah == 0);
+}
+
+/* EOF */
index c9b342b..6162a47 100644 (file)
@@ -30,9 +30,11 @@ typedef struct
 
 extern    PVOID    VideoOffScreenBuffer;
 
-USHORT        BiosIsVesaSupported(VOID);                        // Implemented in i386vid.c, returns the VESA version
+USHORT  BiosIsVesaSupported(VOID);                                             // Implemented in i386vid.c, returns the VESA version
+BOOLEAN BiosIsVesaDdcSupported(VOID);
+BOOLEAN BiosVesaReadEdid(VOID);
 
-PVOID    VideoAllocateOffScreenBuffer(VOID);                // Returns a pointer to an off-screen buffer sufficient for the current video mode
+PVOID   VideoAllocateOffScreenBuffer(VOID);                // Returns a pointer to an off-screen buffer sufficient for the current video mode
 
 VOID    VideoCopyOffScreenBufferToVRAM(VOID);