The Display Data Channel is carried on three pins in HDMI, DVI and (modern) VGA cables (a VGA monitor implementing DDC or DDC2 will set the 9th (KEY) pin to +5V. To read the DDC information, use ddcprobe (requires root). To manipulate these settings, use ddccontrol from the ddccontrol package. There exist three DDC protocols (standardized by the VESA consortium):
- DDC1 - A unidirectional (display to host only) serial comm system which provides basic display ID and feature support information (including supported timings, display size, colorimetry and gamma, etc.) to the host. This uses pin 12 on the 15-pin "VGA" connector as a data line.
- DDC2B - Adds clock (pin 15) and return (pin 11) to enable at least ID information to be obtained via an I²C interface. I²C is a bidirectional interface, but display control via DDC2B is not defined at this time.
- DDC2AB - Full ID and control of the monitor via ACCESS.bus. As ACCESS.bus is basically a command and protocol definition on top of the I²C hardware interface, this uses the same lines as DDC2B.
The data to be returned over DDC is stored in EDID format.
When it doesn't work
Sometimes, despite hardware support, DDC breaks down. This usually manifests as bad settings in X, especially regarding viewing dimensions (DisplaySize) and DPI (DPI, NVIDIA-specific option). Look at xdpyinfo to see what X believes the settings to be. DisplaySize is described in millimeters (25.4 per inch).
- Extract H*V from a diagonal length using the Pythagorean Theorem and the resolution ratio
- Divide H and V by their appropriate resolutions to get the DPI