/** @file Edid.h * @brief Helper routine and corresponding data struct used by USB DisplayLink Driver. * Reads and parses the EDID, checks if a requested video mode is in the supplied EDID * * Copyright (c) 2018-2019, DisplayLink (UK) Ltd. All rights reserved. * * SPDX-License-Identifier: BSD-2-Clause-Patent * **/ #ifndef EDID_H #define EDID_H #include "UsbDisplayLink.h" #define EDID_HEADER_SIZE ((UINTN)8) #define EDID_NUMBER_OF_ESTABLISHED_TIMINGS_BYTES ((UINTN)3) #define EDID_NUMBER_OF_STANDARD_TIMINGS ((UINTN)8) #define EDID_NUMBER_OF_DETAILED_TIMINGS ((UINTN)4) typedef struct { UINT16 HRes; UINT16 VRes; UINT16 Refresh; } EDID_TIMING; EFI_STATUS DlEdidGetSupportedVideoMode ( UINT32 ModeNumber, CONST VOID *EDID, UINT32 EdidSize, CONST struct VideoMode **VideoMode ); EFI_STATUS DlEdidGetSupportedVideoModeWithFallback ( UINT32 ModeNumber, CONST VOID *EDID, UINT32 EdidSize, CONST struct VideoMode **VideoMode ); UINT32 DlEdidGetNumSupportedModesInEdid ( CONST VOID *EDID, UINT32 EdidSize ); EFI_STATUS DlReadEdid ( USB_DISPLAYLINK_DEV* UsbDisplayLinkDev ); // EDID Detailed timings section - Features enum EdidDetailedTimingsFeatures { EdidDetailedTimingsFeaturesInterlaced = 0x80, EdidDetailedTimingsFeaturesStereoModeMask = 0x60, EdidDetailedTimingsFeaturesSyncSchemeMask = 0x18, EdidDetailedTimingsFeaturesHorizontalSyncPositive = 0x02, EdidDetailedTimingsFeaturesVerticalSyncPositive = 0x04, }; // NR-110497-TC-7ZM Section 4.3.3 0x22 Set Video Mode - Flags enum VideoModeFlags { VideoModeFlagsInterlaced = 0x0001, VideoModeFlagsHorizontalSyncInverted = 0x0100, VideoModeFlagsVerticalSyncInverted = 0x0200, }; struct StandardTimingIdentification { UINT8 HorizontalActivePixels; // X resolution, from 256->2288 in increments of 8 pixels UINT8 ImageAspectRatioAndrefresh; // Bits 7,6 Aspect ratio - 0=16:10 1=4:3 2=5:4 3=16:9 // Bits 5,0 Refresh rate Range 60->1213Hz }; struct DetailedTimingIdentification { UINT16 PixelClock; // wPixelClock in VideoMode struct UINT8 HActiveLo; // wHActive UINT8 HBlankingLo; // wHBlanking UINT8 HActiveHiBlankingHi; UINT8 VActiveLo; // wVActive UINT8 VBlankingLo; // wVBlanking UINT8 VActiveHiBlankingHi; UINT8 HSyncOffsetLo; // wHSyncOffset, front porch UINT8 HSyncWidthLo; // wHSyncWidth UINT8 VSyncOffsetLoSyncWidthLo; UINT8 HSyncOffsetHiHSyncWidthHiVSyncOffsetHiSyncWidthHi; UINT8 HImageSizeHi; UINT8 VImageSizeHi; UINT8 HImageSizeLoVImageSizeLo; UINT8 HBorder; UINT8 VBorder; UINT8 Features; }; struct Edid { UINT8 Header[EDID_HEADER_SIZE]; //EDID header "00 FF FF FF FF FF FF 00" UINT16 ManufactureName; //EISA 3-character ID UINT16 ProductCode; //Vendor assigned code UINT32 SerialNumber; //32-bit serial number UINT8 WeekOfManufacture; //Week number UINT8 YearOfManufacture; //Year UINT8 EdidVersion; //EDID Structure Version UINT8 EdidRevision; //EDID Structure Revision UINT8 VideoInputDefinition; UINT8 MaxHorizontalImageSize; //cm UINT8 MaxVerticalImageSize; //cm UINT8 DisplayTransferCharacteristic; UINT8 FeatureSupport; UINT8 RedGreenLowBits; //Rx1 Rx0 Ry1 Ry0 Gx1 Gx0 Gy1Gy0 UINT8 BlueWhiteLowBits; //Bx1 Bx0 By1 By0 Wx1 Wx0 Wy1 Wy0 UINT8 RedX; //Red-x Bits 9 - 2 UINT8 RedY; //Red-y Bits 9 - 2 UINT8 GreenX; //Green-x Bits 9 - 2 UINT8 GreenY; //Green-y Bits 9 - 2 UINT8 BlueX; //Blue-x Bits 9 - 2 UINT8 BlueY; //Blue-y Bits 9 - 2 UINT8 WhiteX; //White-x Bits 9 - 2 UINT8 WhiteY; //White-x Bits 9 - 2 UINT8 EstablishedTimings[EDID_NUMBER_OF_ESTABLISHED_TIMINGS_BYTES]; struct StandardTimingIdentification standardTimingIdentifications[EDID_NUMBER_OF_STANDARD_TIMINGS]; struct DetailedTimingIdentification detailedTimingDescriptions[EDID_NUMBER_OF_DETAILED_TIMINGS]; UINT8 ExtensionFlag; //Number of (optional) 128-byte EDID extension blocks to follow UINT8 Checksum; }; #endif // EDID_H