Controlling monitor brightness from Linux

19.01.2017

It seems it is little known feature that DDC/CI data channel can not be only used for reading E-EDID information (name, model, supported resolutions, etc.) but also for controlling monitor via MCCS.

Most interesting feature of MCCS is controlling screen brightness, but surprisingly no system uses it out-of-the-box to provide brightness widget, like in laptops. There is command line ddccontrol utility and probably a bunch of buggy widgets, but no native integration.

In Linux, standard API for backlight is provided by kernel modules, exposed by sysfs in /sys/class/backlight/. I wrote simple backlight driver for DDC/CI: ddcci_bl.c. To use it you need to manually bind it to 0x37 device address on graphics card I²C bus. If your monitor is stupid like mine and it reports invalid maximum value you need to override it in ddcci_maxbr module parameter.

Example:

insmod ddcci_bl.ko ddcci_maxbr=255
modprobe i2c-dev
echo ddcci_bl 0x37 > /sys/bus/i2c/devices/i2c-2/new_device

Backlight device should be then automatically recognized by graphical enviroments.