Notes for the Next ddcutil Release (Draft)

Release 2.0.0 is a major update to ddcutil, containing significant performance improvements. The version of the shared library is not backwards compatible.

For notes on changes to the shared library, see Shared Library Changes for the Next Release (Draft)


ddcutil installation creates file /usr/lib/modules-load.d/ddcutil.conf to ensure that kernel module i2c-dev is loaded at boot time (should it not be built into the kernel).

As of Release 1.4.1, ddcutil installation created file /usr/lib/udev/rules.d/60-ddcutil.rules, granting the logged on user read/write access to I2C devices associated with video monitors. This file has been renamed to 60-ddcutil-i2c.rules. New file 60-ddcutil-usb.rules performs a similar task for USB Human Interface Devices that may provide an interface to the monitor's Virtual Control Panel. For unusual situations, sample files /usr/share/data/ddcutil/60-ddcutil-i2c.rules and 60-ddcutil-usb.rules provide alternative ways to grant permissions.

Taken together, these changes mean that ddcutil should just work "out of the box" with no special system configuration. The most signficiant exception is the special settings that may still be needed for the proprietary Nvidia driver.

Performance Improvement

Dynamic Sleep Adjustment

The dynamic sleep algorithm has been completely rewritten to both dynamically increase the sleep-multiplier factor (as needed) and decrease the sleep multiplier factor (insofar as possible). Data is maintained across program executions in file $HOME/.cache/ddcutil/stats. Option -dsa, or one of its variants such as --enable-dsa turn it on.

If both --sleep-multiplier and --dsa are specified, existing statistics are discarded and the sleep algorithm restarts calculation with the specified sleep-multiplier value. Therefore --sleep-multiplier should generally not be used along with --dsa.

Performance Cache Management

There are two ways to explicitly delete the capabilities and/or dynamic sleep caches. - Command discard capabilities | dsa | all cache[s] - Option --dicard-cache[s] capabilities|dsa|all erases caches at the start of a command.

System Logs

Writing to the system log has been generalized and in the process simplified.

Option --syslog <level> controls what is written to the system log. Recognized levels, in order of increasing verbosity, are NEVER, ERROR, WARN, NOTICE, INFO, VERBOSE, and DEBUG. This option replaces --enable-syslog, --disable-syslog, and --trace-to-syslog. The default for ddcutil is WARN, and for libddcutil is NOTICE.

environment --verbose Changes

  • Option --quickenv skips some slow tests such as use of program i2cdetect.
  • Extended sysfs scan for ARM SOC devices to explore how those devices use /sys
  • Report contents of cached files

Switching input source on recent LG monitors

Recent LG monitors allow for splitting the display screen between multiple input sources. They use an undocumented protocol instead of the (relatively) simple VCP feature X60 (Input Source) to control how the screen is split and which input source is shown where. Thanks to a community effort, particularly by user Max Thomas (Github handle shinyquagmire23), some of this protocol has been reverse engineered. It entails using an alternative I2C source address, x50 instead of x51. Option --i2c-source-addr provides a way to use this alternative address in DDC communication. For further details, the extended discussion summarized on the wiki page occurred on ddcutil issue 100: LG 29UM69G fails switching input

ddcutil detect Changes

  • Option --verbose reports the current dynamic sleep muliplier.
  • Improve determination of non-standard ways that unsupported VCP features are reported.
  • Improved phantom display deterimnation in DisplayPort Multi-Stream Transport situation.

Miscellanous Changes

  • Option --sleep-multiplier 0 is now allowed. Some DisplayPort monitors have been observed to work with this value.
  • The tests durng display detection to check for misuse of the DDC Null Message or an all zero getvcp response to indicate unsupported features have been made more robust.
  • Option --noconfig: Do not process the configuration file.
  • Option --trcfrom <function name>: Trace the specified function and its called functions. (This option reports only functions for which tracing has been enabled.)
  • Option --hh. The number of command line options has become huge. Many are development related. Options not of interest to general users are now hidden. Option --hh exposes them, and implies option --help.
  • Option --verbose. If specified on the command line, the options obtained from the configuration file are reported.
  • Detailed statistics are now maintained on a per-display instead of per-thread basis. Option --vstats reports detailed statistics, in particular per-display statistics. --vstats takes the same arguments as --stats.
  • Option --help. Document ELAPSED as a recognized statistics class
  • Option --help reports option --force as deprecated.
  • Reading the EDID when using USB to communicate with a monitor's virtual control panel can fail. Try using a fallback mechanisms to read the EDID for any Eizo displays, not just those with a specific product id.
  • Existing cached capabilities are not erased when ddcutil is called with capabilities caching disabled.
  • Options --ignore-hiddev and --ignore-usb-pid-vid cause ddcutil initialization to ignore USB Human Interface devices that could possibly provide standards-conformant USB access to the monitor's Video Control Panel. ddcutil already ignores HID devices that are declared as keyboards or mice, as probing such devices can cause system lockups. The options are provided because it is conceivable that other such devices exist.
  • Improve reporting of /dev/hiddev open failures, to avoid confusion resulting from this typically benign error.
  • Fix segfaults in cacheing due to $HOME not set.
  • Fix segfault in shared library termination.
  • ddcui now uses a separate configuration file, $HOME/.config/ddcutil/ddcuirc.


  • configure options -enable-syslog/--disable-syslog have been removed. Instead, use command line option --syslog never at runtime to disable all writes to the system log.
  • Shared library libkmod is no longer required.
  • Shared library libjansson is now required. Its development package (libjansson-dev on Debian based systems) must be installed.
  • If congfigure option --enable-install-lib-only is specified, command make install installs the shared library

Development Facilities

  • Added termporary use options --f7, --f8, --i2, --s1, --s2, --s3, --s4, --fl1, --fl2. The current meaning of these options is reported by option --settings.
  • Added utility command C1 for temporary use during development.
  • Added option --enable-mock-data