In "The Before Times" (think: 1980s), there was no way for graphics adapters and monitors to negotiate a common set of supported resolutions.  While there were some vendor-specific schemes to utilize four of the unused pins in the VGA connector to kludge together a monitor identification method, these schemes were never standardized and couldn't be relied upon.  In practice, the graphics adapter just sent out whatever resolution the user selected, for better or worse.  This led to the possibility that setting your graphics card's output to too high of a frequency could overdrive the CRT and physically damage it.

So, monitor manufacturers started implementing protection circuits that sensed this condition, rejected the signal to protect themselves, and popped up an "Out of Scan Range" message to the user, something like:


Seeing this issue and wanting to craft a better solution, the people at the Video Electronics Standards Association (VESA) created a set of standards so that graphics adapters could query monitors to discover their capabilities, and then communicate with them at their best supported resolution and frequency.  The standards are called Display Data Channel, Extended Display Identification Data, and more recently, DisplayID.  The way it works is, monitor vendors add to their products a ROM containing information describing their displays, formatted according to a specified format.  Next, graphics adapters utilize a standardized protocol to read in and parse that data.  The graphics adapter and OS can then offer a set of resolutions and other display parameters supported by both monitor and graphics adapter from which the user can choose.  No more reading manuals or guessing whether a particular resolution is supported by both the graphics adapter and monitor!

In this article, we'll discuss these specifications and play around with them to see how they work.

EDID and DisplayID Revision History

First, a little context.  Here's the history of when these specifications were released to the industry.
  • 1994, DDC standard version 1 – EDID v1.0 structure
  • 1996, EDID standard version 2 – EDID v1.1 structure
  • 1997, EDID standard version 3 – EDID structures v1.2 and v2.0
  • 2000, E-EDID Standard Release A, v1.0 – EDID structure v1.3, EDID structure v2.0 deprecated
  • 2006, E-EDID Standard Release A, v2.0 – EDID structure v1.4
  • 2007, DisplayID, intended to replace all previous EDID versions
  • 2009, DisplayID 1.1
  • 2011, DisplayID 1.2
  • 2013, DisplayID 1.3
  • 2017, DisplayID 2.0, added generalized information blocks
  • 2021, DisplayID 2.1, same structure as v2.0, but with new data blocks
As you can see, these specifications have been under active development for decades, and continue to be.  In the next sections, I'll describe these technologies in more detail.

Display Data Channel

The Display Data Channel (DDC) standard was introduced in 1994 and extended in 1999 by the Enhanced Display Data Channel (E-DDC) standard, which is still in use today.  Originally, DDC contained both the definition of various communications protocols by which graphics adapter and monitor could communicate, as well as the EDID description format.  DDC v2 split out EDID into its own specification—more on that below.

DDC is a group of similar protocols, all based on I2C.  Originally, the protocol was unidirectional:  the graphics card reading from the monitor.  Later protocols in the DDC suite added bidirectional support.  While reading the EDID/DisplayId data is the most common use of DDC, it is noteworthy that other standards (HDMI and DisplayPort) make use of DDC for communications beyond the simple reading of monitor configuration data.

E-DDC is similar to DDC, but broke DDC's 256-byte addressing limitation by introducing a segment pointer.  This segment pointer allows E-DDC to address up to 32KB worth of monitor configuration data.  Also, E-DDC removed some of the less-popular DDC protocols, and added support for new display interfaces like HDMI and DisplayPort.

Extended Display Identification Data

The Extended Display Identification Data (EDID) standard defines a data structure, or, optionally, a set of data structures, used to carry configuration information for optimal use of a particular monitor.

EDID was updated several times in the late 1990s:

EDID v1.0, EDID v1.1, EDID v1.2, EDID v1.3

These were the original versions of the stardard, and what they have in common is that they are all based on a 128-byte table used to store the configuration data.  EDID also defines support for a number of 128-byte extensions that allow additional information to be conveyed.

EDID v2.0

This version of the specification is an outlier.  It introduced the concept of using a 256-byte table to hold the configuration data, but it never caught on in the industry and today is deprecated, replaced by E-EDID (next).

E-EDID v1.4

Deciding that EDID v2.0 had taken a wrong turn, VESA released Enhanced Extended Display Identification Data (E-EDID), also called EDID v1.4.  Although it came out after EDID v2.0, it is EDID v1.4 that is considered the industry standard today.

What is in EDID?

Let's dig a little deeper.  I'm going to get the EDID information from one of my monitors.  I'll follow a process specific to the Nvidia graphics adapter I have.  (many apologies and much respect to the fine folks who make AMD graphics cards!):

  1. launch Nvidia Control Panel
  2. Select View system topology
  3. Click the EDID hyperlink for one of my connected displays
  4. Click Export EDID
This gives me the EDID information in a text file:

Next, I can go to the nifty website EDID Reader, which is a web-based EDID parser.  This website is based on an open-source project of the same name, and can be found on GitHub here:

After pasting in the text of my EDID, I click Parse EDID and here's what I find:





I won't paste the entire decoded contents of my EDID, but you get the idea, and you can try this out on your own monitors.  My monitor has two 128-byte data blocks, named Block 0 and Block 1 in the images above.  Block 0 is also referred to as the "base" block, and contains basic information required of all monitors.  Block 1 is an extension block and contains optional, more advanced information.  Pretty neat!

DisplayID

While EDID was a rousing success, eventually the industry saw a need to replace EDID with a new standard better suited to describing the capability of new classes of display devices.  That new standard is DisplayID.  DisplayID introduces several new features that better allow its use in a wide range of applications, including PC monitors, consumer television products, embedded displays (think eDP-connected displays), AR/VR headsets, HDR displays, and others.

DisplayID uses variable-length structures of up to 256 bytes each, which encompass all existing EDID extensions, but which are not backwards compatible to EDID.  However, DisplayId is intended to eventually supplant EDID in the industry, and so having both an EDID structure and DisplayId structure in a monitor is supported, and is a popular thing for monitor manufacturers to do.

Just to give you an idea, one of the required blocks is 0x20 Product Identification.  It looks like:


Note that DisplayId continues to run over the E-DDC protocol, just like E-EDID.

EDID and UEFI

Note that there is UEFI support to get EDID data, derived from the UEFI Graphics Output Protocol.  §12.9.2.4 - §12.9.2.7 in the UEFI Spec (UEFI v2.10 numbering) contain several EDID-related protocols, for example:

Please refer to the UEFI specification for more information.

Conclusion

I hope you found this DDC/EDID/DisplayId overview helpful, and I encourage you to leave a comment!  Thanks for reading!

Post a Comment

Be sure to select an account profile (e.g. Google, OpenID, etc.) before typing your comment!