Reference Documents

Searching for DDC documentation can be confusing. The DDC protocol evolved, being part of Access Bus at one point, and shed various pieces, e.g. EDID, into separate specifications along the way. See the Wikipedia DDC page for an overview of how it morphed.

Many standards can be found here

I2C

As background, I2C is a low level, slow speed specification of a 2 wire protocol for sending and receiving bytes. DDC/CI is layered on top of that protocol, describing particular sequences of bytes that are communicated between a master device (the host computer) and a slave device (a monitor) at address x37 on an I2C bus. By analogy, DDC is as a subclass of superclass I2C, that is DDC obeys the rules of I2C, but is more specific. For example, only certain byte sequences are legal. SMBUS is another protocol based on I2C.

ddcutil reads from and writes to the userspace /dev-i2c* devices which present a file system like abstraction of an I2C bus. It leaves the bit-banging to the video device drivers, e.g. amdgpu, nouveau.

One source of confusion in DDC documentation is the specification of slave adddresses on the I2C bus. Sometimes you'll see the DDC address documented as x37, other times as the pair x6e/x6f. Leaving aside the implementation of 10 bit I2C bus addresses (uncommon), I2C slave addresses are encoded in a single byte. The high order 7 bits are used for the address per se. The low order bit is 0 for a write operation, 1 for a read operation. Much of the VESA documenation regards the entire 8 bit value as an address, which means address x37 becomes the pair x6e/x6f. Similarly, the 7 bit address for the EDID is x50; regarded as an 8 bit address, the EDID address becomes xA0/xA1. ddcutil specifies I2C slave addresses in 7 bit form, as do utilities such as i2cdetect, i2cget, and i2cset.

The following specifications and articles provide backgroud information about the I2C bus.

SMBus is a related standard. The following report can help in understanding I2C.

Wikipedia has several high quality pages on related specifications: They The may be helpful when trying to figure out why DDC communication is not working: