From 44f312e477a0c8a35056da6da928f86e89388a2e Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 22 Jan 2017 15:03:11 +0000 Subject: [PATCH] [FREELDR] Add VESA DDC detection and EDID read code. Work in progress. svn path=/trunk/; revision=73587 --- .../boot/freeldr/freeldr/arch/i386/hardware.c | 12 ++++ .../boot/freeldr/freeldr/arch/i386/i386vid.c | 63 ++++++++++++++++++- reactos/boot/freeldr/freeldr/include/video.h | 6 +- 3 files changed, 78 insertions(+), 3 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/arch/i386/hardware.c b/reactos/boot/freeldr/freeldr/arch/i386/hardware.c index b9f222dfa45..a5ff69c3273 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/hardware.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/hardware.c @@ -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"); + + } + } + } } diff --git a/reactos/boot/freeldr/freeldr/arch/i386/i386vid.c b/reactos/boot/freeldr/freeldr/arch/i386/i386vid.c index c6544570913..a0f86c955b5 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/i386vid.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/i386vid.c @@ -22,7 +22,7 @@ #define NDEBUG #include -DBG_DEFAULT_CHANNEL(UI); +DBG_DEFAULT_CHANNEL(HWDETECT); #include 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 */ diff --git a/reactos/boot/freeldr/freeldr/include/video.h b/reactos/boot/freeldr/freeldr/include/video.h index c9b342be502..6162a47ecf9 100644 --- a/reactos/boot/freeldr/freeldr/include/video.h +++ b/reactos/boot/freeldr/freeldr/include/video.h @@ -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);