Skip to content

Adjusting Display Settings

A. Skomra edited this page Feb 14, 2023 · 7 revisions

This document is a guide for adjusting the display settings (e.g. brightness, color temperature, and colorspace) on newer Cintiq devices which do not have on-screen controls. Adjusting display settings may be required to match the monitor to your environment or as a preliminary step of the color calibration process.

Software

ddcutil

We suggest the use of "ddcutil" to change display settings on the command-line. This tool is well maintained and supports several different display communication protocols. Please see its installation instructions if the tool is not available from your distribution's repositories. We further recommend reviewing the ddcutil documentation for information not covered in the Walkthrough below.

Other software may also available (e.g. "ddccontrol"), but we have not evaluated their use or found them to be lacking compared to ddcutil.

Configuration Tweaks

Before using the ddcutil command for the first time, a pair of configuration tweaks are recommended. Without these tweaks, you may need to manually load the i2c-dev driver and/or run the ddcutil with "sudo". After applying these tweaks, ensure that you are a member of the 'video' group (can check with the groups command or add yourself by running sudo usermod -a -G video) and then reboot.

# Automatically load the i2c-dev driver on boot
echo 'i2c-dev' | sudo tee /etc/modules-load.d/i2c-dev.conf

# Allow members of the 'video' group to communicate with the monitor
echo 'SUBSYSTEM=="i2c-dev", SUBSYSTEMS=="drm", GROUP="video", MODE="0660"' | sudo tee /etc/udev/rules.d/10-ddc.rules

Walkthrough

On your first use of ddcutil, you will likely want to use its detect command to find the available displays. This will provide you with the necessary information to select a display in later commands, if you have a multi-monitor setup.

In the example below, you can see two monitors are detected: my laptop's internal display and my Cintiq Pro 32. When I run ddcutil later to get or set values, I can refer to the display in any of several ways. I can use the display (--display=<number>) or bus (--bus=<busnum>) arguments, but these may change if displays are added or removed. A more reliable option is to refer to a particular display by its manufacturer, model, and/or serial. You'll notice that in later commands I use all three (--mfg=WAC --model=CintiqPro32PT --sn=7KQS0H1000016), but this is not strictly necessary -- any one or two of those would also work.

$ ddcutil detect

Invalid display
   I2C bus:             /dev/i2c-4
   EDID synopsis:
      Mfg id:           LEN
      Model:            Unspecified
      Serial number:    Unspecified
      Manufacture year: 2018
      EDID version:     1.4
   DDC communication failed

Display 1
   I2C bus:             /dev/i2c-5
   EDID synopsis:
      Mfg id:           WAC
      Model:            CintiqPro32PT
      Serial number:    7KQS0H1000016
      Manufacture year: 2017
      EDID version:     1.4
   VCP version:         2.2

Once you have identified the display that you want to communicate with, you can use the capabilities command to see the available settings. The software will recognize many standard settings and may also print out several unidentified manufacturer-defined settings. Here we can see that we are able to adjust the luminosity (brightness), contrast, color profile, and many other settings.

$ ddcutil --mfg=WAC --model=CintiqPro32PT --sn=7KQS0H1000016 capabilities

MCCS version: 2.2
Commands:
   Command: 01 (VCP Request)
   Command: 02 (VCP Response)
   Command: 03 (VCP Set)
   Command: 07 (Timing Request)
   Command: 0c (Save Settings)
   Command: e3 (Capabilities Reply)
   Command: f3 (Capabilities Request)
VCP Features:
   Feature: 02 (New control value)
   Feature: 04 (Restore factory defaults)
   Feature: 05 (Restore factory brightness/contrast defaults)
   Feature: 08 (Restore color defaults)
   Feature: 10 (Luminosity)
   Feature: 12 (Contrast)
   Feature: 14 (Select color preset)
      Values:
         04: 5000 K
         05: 6500 K
         08: 9300 K
         09: 10000 K
         0b: User 1
         0c: User 2
   Feature: 16 (Video gain: Red)
   Feature: 18 (Video gain: Green)
   Feature: 1A (Video gain: Blue)
   Feature: 59 (6 axis saturation: Red)
   Feature: 5A (6 axis saturation: Yellow)
   Feature: 5B (6 axis saturation: Green)
   Feature: 5C (6 axis saturation: Cyan)
   Feature: 5D (6 axis saturation: Blue)
   Feature: 5E (6 axis saturation: Magenta)
   Feature: 72 (Gamma)
      Values:
         Invalid gamma descriptor: fd 05 28
   Feature: 87 (Sharpness)
   Feature: 8A (Color Saturation)
   Feature: 90 (Hue)
   Feature: 9B (6 axis hue control: Red)
   Feature: 9C (6 axis hue control: Yellow)
   Feature: 9D (6 axis hue control: Green)
   Feature: 9E (6 axis hue control: Cyan)
   Feature: 9F (6 axis hue control: Blue)
   Feature: A0 (6 axis hue control: Magenta)
   Feature: AC (Horizontal frequency)
   Feature: AE (Vertical frequency)
   Feature: B6 (Display technology type)
   Feature: C0 (Display usage time)
   Feature: C6 (Application enable key)
   Feature: C8 (Display controller type)
   Feature: C9 (Display firmware level)
   Feature: CC (OSD Language)
      Values:
         01: Chinese (traditional, Hantai)
         02: English
         03: French
         04: German
         05: Italian
         06: Japanese
         07: Korean
         08: Portuguese (Portugal)
         09: Russian
         0a: Spanish
         0d: Chinese (simplified / Kantai)
         14: Dutch
         1e: Polish
         26: Unrecognized value
   Feature: D6 (Power mode)
      Values:
         01: DPM: On,  DPMS: Off
         04: DPM: Off, DPMS: Off
         05: Write only value to turn off display
   Feature: DF (VCP Version)
   Feature: E0 (manufacturer specific feature)
      Values: 00 01 02 03 (interpretation unavailable)
   Feature: E1 (manufacturer specific feature)
      Values: 00 01 (interpretation unavailable)
   Feature: E2 (manufacturer specific feature)
      Values: 01 02 03 (interpretation unavailable)
   Feature: E4 (manufacturer specific feature)
   Feature: E5 (manufacturer specific feature)
   Feature: E6 (manufacturer specific feature)
   Feature: E7 (manufacturer specific feature)
      Values: 00 01 (interpretation unavailable)
   Feature: E8 (manufacturer specific feature)
      Values: 00 01 (interpretation unavailable)
   Feature: E9 (manufacturer specific feature)
      Values: 00 01 (interpretation unavailable)
   Feature: EA (manufacturer specific feature)
      Values: 00 01 (interpretation unavailable)
   Feature: EB (manufacturer specific feature)
   Feature: EC (manufacturer specific feature)
      Values: 60 (interpretation unavailable)
   Feature: ED (manufacturer specific feature)
      Values: 00 01 02 (interpretation unavailable)
   Feature: F0 (manufacturer specific feature)
      Values: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d (interpretation unavailable)
   Feature: F2 (manufacturer specific feature)
   Feature: F3 (manufacturer specific feature)
      Values: 00 01 (interpretation unavailable)

You can use the getvcp command to read one or more settings. We can get a list of all settings in one go with the ALL argument, or the value of a single setting with its hex code from the capabilities list (e.g. 0x10 for luminosity / brightness). In the example below we ask for the current value of all color-related commands. We can see that the display is currently at 75% brightness and has a color temperature of 6500K.

$ ddcutil --mfg=WAC --model=CintiqPro32PT --sn=7KQS0H1000016 getvcp COLOR

VCP code 0x0b (Color temperature increment   ): 100 degree(s) Kelvin
VCP code 0x0c (Color temperature request     ): 3000 + 35 * (feature 0B color temp increment) degree(s) Kelvin
VCP code 0x10 (Brightness                    ): current value =    75, max value =   100
VCP code 0x12 (Contrast                      ): current value =    50, max value =   100
VCP code 0x14 (Select color preset           ): Setting: 6500 K (0x05)
VCP code 0x16 (Video gain: Red               ): current value =   128, max value =   255
VCP code 0x18 (Video gain: Green             ): current value =   126, max value =   255
VCP code 0x1a (Video gain: Blue              ): current value =   126, max value =   255
VCP code 0x59 (6 axis saturation: Red        ): current value =    50, max value =   100
VCP code 0x5a (6 axis saturation: Yellow     ): current value =    50, max value =   100
VCP code 0x5b (6 axis saturation: Green      ): current value =    50, max value =   100
VCP code 0x5c (6 axis saturation: Cyan       ): current value =    50, max value =   100
VCP code 0x5d (6 axis saturation: Blue       ): current value =    50, max value =   100
VCP code 0x5e (6 axis saturation: Magenta    ): current value =    50, max value =   100
VCP code 0x6c (Video black level: Red        ): current value =    80, max value =   100
VCP code 0x6e (Video black level: Green      ): current value =    80, max value =   100
VCP code 0x70 (Video black level: Blue       ): current value =    80, max value =   100
VCP code 0x72 (Gamma                         ): 0x0016 - Invalid sl value. sl=0x16, sh=0x00
VCP code 0x8a (Color Saturation              ): current value =    50, max value =   100
VCP code 0x90 (Hue                           ): current value =    50, max value =   100
VCP code 0x9b (6 axis hue control: Red       ): current value =    50, max value =   100
VCP code 0x9c (6 axis hue control: Yellow    ): current value =    50, max value =   100
VCP code 0x9d (6 axis hue control: Green     ): current value =    50, max value =   100
VCP code 0x9e (6 axis hue control: Cyan      ): current value =    50, max value =   100
VCP code 0x9f (6 axis hue control: Blue      ): current value =    50, max value =   100
VCP code 0xa0 (6 axis hue control: Magenta   ): current value =    50, max value =   100

To change a setting, we can use the setvcp command along with the hexadecmial VCP code of the item. For instance, to change the brightness, we would use code 0x10. The desired value (e.g. 50) is given as the final argument.

$ ddcutil --mfg=WAC --model=CintiqPro32PT --sn=7KQS0H1000016 setvcp 0x10 50

Some settings only accept a limited list of values. The color temperature preset, for example, is one of these settings. If we look above at the output from the capabilities command, we see that only 6 values are accepted: "4" (5000K), "5" (6500K), "8" (9300K), "9" (10000K), "0x0b" (User 1), and "0x0c" (User 2). Sending value of 4 (5000K) works fine while sending a value of 7 results in an error:

$ ddcutil --mfg=WAC --model=CintiqPro32PT --sn=7KQS0H1000016 setvcp 0x14 4

$ ddcutil --mfg=WAC --model=CintiqPro32PT --sn=7KQS0H1000016 setvcp 0x14 7

Verification failed for feature 14

$ ddcutil --mfg=WAC --model=CintiqPro32PT --sn=7KQS0H1000016 getvcp 0x14

VCP code 0x14 (Select color preset           ): Setting: 5000 K (0x04)

For monitors that support it, fine-tuned control of the color temperature may be possible by changing to one of the three user presets and then modifying VCP code 0x0C. The resulting temperature will be equal to this value set times the value in code 0x0B plus 3000K. If, for instance, the value in code 0x0B is 100 degrees Kelvin, then requesting 5500K could be done by setting code 0x0C to 25 since (25 * 100 + 3000 = 5500).

Some monitors may not return any capabilities, or may support more capabilities than indicated. You can try the probe command to discover hidden capabilities, but be aware that there is obviously no guarantee that any discovered settings will work properly.

ddc-ftdi.py

Some Cintiq displays include an FTDI usb-to-serial converter that allows access to the same DDC data as the I2C interface. Communicating through this interface does not require the "i2c-dev" kernel driver to be loaded, but does still require special permissions (or the use of "sudo") on the /dev/ttyUSB<n> device. A prototype Python script is available at https://gist.github.com/jigpu/e05b17e24a60825c6f3bf59fe9638736.

Clone this wiki locally