5

I'm looking for a simple way of adjusting an external monitor's backlight using DDC. Something like good-ddc-tool --monitor 0 --backlight 100 that just works without complicating things when a single monitor is connected (the common case).

I've tried the answers to this question without success:

First answer (ddccontrol)

$ sudo ddccontrol -p

[...]

Probing for available monitors........
Detected monitors :
No monitor supporting DDC/CI available.
If your graphics card need it, please check all the required kernel modules are loaded (i2c-dev, and your framebuffer driver).

$ sudo modprobe i2c-dev
$ sudo lsmod | grep i2c
i2c_nforce2            20480  0

...fail?

Second answer (ddcutil)

Quick test:

$ sudo ddcutil capabilities
Display not found

...fail.

Guess:

$ sudo ddcutil detect
Invalid display
   I2C bus:             /dev/i2c-4
   EDID synopsis:
      Mfg id:           DEL
      Model:            DELL 2209WA
      Serial number:    [redacted]
      Manufacture year: 2009
      EDID version:     1.3
   DDC communication failed

Invalid display? Well it's the right manufacturer, model and manufacture year -- not sure how it managed to display this information if "DDC communication failed".

I know the display and cable are fully capable of adjusting backlight on other OSes on other systems, and it feels far-fetched to think a Geforce GTX 550 lacks basic DDC support. Obviously it doesn't since it successfully read the display model.

Third answer (xrandr)

Quick (guess) tests:

$ xrandr --output HDMI2 --brightness 0.6
warning: output HDMI2 not found; ignoring
xrandr: Need crtc to set gamma on.

$ xrandr --output HDMI1 --brightness 0.6
warning: output HDMI1 not found; ignoring
xrandr: Need crtc to set gamma on.

...fail. Same for HDMI0 and just HDMI.

Guess:

$ xrandr --listproviders
Providers: number : 1
Provider 0: id: 0x279 cap: 0x1, Source Output crtcs: 2 outputs: 4 associated providers: 0 name:NVIDIA-0

I don't really know what this tells me, and I couldn't find a way to list "outputs" which just leaves me guessing.


Update

I found special instructions for ddcutil for nvidia cards, but I couldn't find the file that was mentioned in the first of the two suggestions:

A file for making this change is 90-nvidia_i2c.conf located in distribution directory data/etc/X11/xorg.conf.d

I'm using Xubuntu. Where is it suggesting I look?

The results of the second suggestion in the link can be found in an answer below.


Update 2

I tried ddcutil on a MacBook/Intel HD Graphics/Ubuntu with the same monitor and it works without a problem.

This suggests to me that the GeForce GTX 550 or its driver is most likely the problem.

1
  • Does anything appear in dmesg when you try to load i2c-dev? Oct 10, 2019 at 5:22

2 Answers 2

4

I am the developer of ddcutil.

It looks like you have a monitor with a marginal I2C implementation. The Nvidia options are forcing the driver to use the lowest bus speed defined in the I2C spec, 100 kbps. Unfortunately, there's no way to tell the driver to use an even lower bus speed.

Use the --ddc option to see DDC data errors, and the --stats option for cumulative error counts and the number of times ddcutil had to retry operations.

There are a couple ddcutil options that may help. If you see lots of failures in the --stats output showing maximum retries exceeded, you can try increasing the number of retries using the --maxtries option. Second, the DDC/CI protocol mandates that the application wait a certain amount of time (commonly 50 ms) between the time it sends a request to the monitor and the time it reads the reply. This is to allow the monitor time to perform the operation and/or assemble a reply. The --sleep-multiplier option increases the time that ddcutil waits. For example, --sleep-multiplier 2 makes ddcutil wait 100 ms when the spec mandates a 50 ms wait. (Conversely, I've seen some well behaved video card/monitor implementations that work with a sleep-multiplier value as low as .1, i.e., waiting only 5 ms when the spec requires 50.)

Finally, I apologize for the difficulty of finding file 90-nvidia_i2c.conf. The documentation for the file on the web site had not been updated for the current location.

3
  • Did you mean 100 kbaud, you wrote that the lowest bus speed for I2C is 100 "mhz"?
    – Oskar Skog
    Oct 28, 2020 at 17:23
  • Hello, nice to hear from you. Thanks for the suggestions, I'll take a look next time I use that hardware. For what it's worth the monitor has no apparent problems receiving writes to backlight levels using github.com/kfix/ddcctl on a Macbook using macOS. I'm not sure if there are any clues in that code — maybe it just does a lot of retries which conceals the problem.
    – Andreas
    Oct 28, 2020 at 21:06
  • @sanford rockowitz:  I would say “Welcome to Stack Exchange”, but I see you’re a 7½-year veteran.  However, it would appear that you have accidentally created two accounts.  This will interfere with commenting and editing your own posts.  You should use the contact form and select “I need to merge user profiles” to have your accounts merged.  In order to merge them, you will need to provide links to the two accounts.  For your information, these are unix.stackexchange.com/users/439430/sanford-rockowitz and unix.stackexchange.com/users/434772/sanford-rockowitz. Oct 30, 2020 at 1:12
0

To get it working somewhat with ddcutil I had to first find this page and then decipher those recommendations. Since I couldn't really understand the first advice (couldn't find the file it was referring to) I tried the second:

I put options nvidia NVreg_RegistryDwords=RMUseSwI2c=0x01;RMI2cSpeed=100 in its own .conf in /etc/modprobe.d and rebooted.

The result is a ddcutil that works 50 % of the time:

$ sudo ddcutil capabilities | grep Brightness
   Feature: 10 (Brightness)
:~$ sudo ddcutil getvcp 10
VCP code 0x10 (Brightness                    ): current value =     0, max value =   100
:~$ sudo ddcutil getvcp 10
VCP code 0x10 (Brightness                    ): current value =     9, max value =   100
:~$ sudo ddcutil setvcp 10 100
Setting value failed for feature 10. rc=EIO(-5): Input/output error
:~$ sudo ddcutil setvcp 10 10
:~$ sudo ddcutil setvcp 10 99
Verification failed for feature 10
:~$ sudo ddcutil setvcp 10 50
:~$ sudo ddcutil setvcp 10 75
:~$ sudo ddcutil setvcp 10 80
Setting value failed for feature 10. rc=EIO(-5): Input/output error
:~$ sudo ddcutil setvcp 10 90
Setting value failed for feature 10. rc=EIO(-5): Input/output error
:~$ sudo ddcutil setvcp 10 95
Setting value failed for feature 10. rc=EIO(-5): Input/output error
:~$ sudo ddcutil setvcp 10 99
Display not found
:~$ sudo ddcutil setvcp 10 10
Verification failed for feature 10
:~$ sudo ddcutil setvcp 10 100
Display not found
:~$ sudo ddcutil setvcp 10 100
:~$ sudo ddcutil setvcp 10 0
Display not found
:~$ sudo ddcutil setvcp 10 0

The actual brightness changed in about half of the attempts. The failures did not always coincide with error output in the terminal.

I put this in an answer since it might be a good solution for others, but I'm still looking for something more reliable.


Update: Actually this answer resulted in being stuck in 640x480 after reboot, so I had to reverse it.

Cause of problem unknown. It could be a coincidence. The low resolution problem pops up even after commenting out the single line of text inside the file introduced in this answer.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .