The MCU can only supply so much current to its GPIO pins. Instead of powering the backlight directly from the MCU, the backlight pin is connected to a transistor or MOSFET that switches the power to the LEDs.
-## Caveats
+## Usage
-This feature is distinct from both the [RGB underglow](feature_rgblight.md) and [RGB matrix](feature_rgb_matrix.md) features as it usually allows for only a single colour per switch, though you can obviously use multiple different coloured LEDs on a keyboard.
+Most keyboards have backlighting enabled by default if they support it, but if it is not working for you, check that your `rules.mk` includes the following:
-Hardware PWM is only supported on certain pins of the MCU, so if the backlighting is not connected to one of them, a software implementation will be used, and backlight breathing will not be available. Currently the supported pins are `B5`, `B6`, `B7`, and `C6`.
+```make
+BACKLIGHT_ENABLE = yes
+```
+
+You should then be able to use the keycodes below to change the backlight level.
## Keycodes
|`BL_DEC` |Decrease the backlight level |
|`BL_BRTG`|Toggle backlight breathing |
+## Caveats
+
+This feature is distinct from both the [RGB underglow](feature_rgblight.md) and [RGB matrix](feature_rgb_matrix.md) features as it usually allows for only a single colour per switch, though you can obviously use multiple different coloured LEDs on a keyboard.
+
+Hardware PWM is only supported on certain pins of the MCU, so if the backlighting is not connected to one of them, a software implementation will be used, and backlight breathing will not be available. Currently the supported pins are `B5`, `B6`, `B7`, and `C6`.
+
## Configuration
To change the behaviour of the backlighting, `#define` these in your `config.h`:
The breathing effect is achieved by registering an interrupt handler for `TIMER1_OVF_vect` that is called whenever the counter resets, roughly 244 times per second.
In this handler, the value of an incrementing counter is mapped onto a precomputed brightness curve. To turn off breathing, the interrupt handler is simply disabled, and the brightness reset to the level stored in EEPROM.
+
+## Backlight Functions
+
+|Function |Description |
+|----------|-----------------------------------------------------------|
+|`backlight_toggle()` |Turn the backlight on or off |
+|`backlight_enable()` |Turn the backlight on |
+|`backlight_disable()` |Turn the backlight off |
+|`backlight_step()` |Cycle through backlight levels |
+|`backlight_increase()` |Increase the backlight level |
+|`backlight_decrease()` |Decrease the backlight level |
+|`backlight_level(x)` |Sets the backlight level to specified level |
+|`get_backlight_level()` |Return the current backlight level |
+|`is_backlight_enabled()`|Return whether the backlight is currently on |
+
+### Backlight Breathing Functions
+
+|Function |Description |
+|----------|----------------------------------------------------------|
+|`breathing_toggle()` |Turn the backlight breathing on or off |
+|`breathing_enable()` |Turns on backlight breathing |
+|`breathing_disable()` |Turns off backlight breathing |