Backlight - Carve out a better location for private driver functionality (#8329)
[jackhill/qmk/firmware.git] / quantum / backlight / backlight_software.c
CommitLineData
4531cc87
JC
1#include "quantum.h"
2#include "backlight.h"
3a303bd2 3#include "backlight_driver_common.h"
4531cc87
JC
4
5#ifdef BACKLIGHT_BREATHING
6# error "Backlight breathing is not available for software PWM. Please disable."
7#endif
8
918a85d3 9static uint16_t s_duty_pattern = 0;
4531cc87 10
25d1901d 11// clang-format off
12
13/** \brief PWM duty patterns
14 *
15 * We scale the current backlight level to an index within this array. This allows
16 * backlight_task to focus on just switching LEDs on/off, and we can predict the duty pattern
17 */
918a85d3 18static const uint16_t backlight_duty_table[] = {
25d1901d 19 0b0000000000000000,
20 0b1000000000000000,
21 0b1000000010000000,
22 0b1000001000010000,
23 0b1000100010001000,
24 0b1001001001001000,
25 0b1010101010101010,
26 0b1110111011101110,
27 0b1111111111111111,
28};
29#define backlight_duty_table_size (sizeof(backlight_duty_table) / sizeof(backlight_duty_table[0]))
30
31// clang-format on
32
33static uint8_t scale_backlight(uint8_t v) { return v * (backlight_duty_table_size - 1) / BACKLIGHT_LEVELS; }
34
918a85d3
JC
35void backlight_init_ports(void) { backlight_pins_init(); }
36
37void backlight_set(uint8_t level) { s_duty_pattern = backlight_duty_table[scale_backlight(level)]; }
38
4531cc87
JC
39void backlight_task(void) {
40 static uint8_t backlight_tick = 0;
41
25d1901d 42 if (s_duty_pattern & ((uint16_t)1 << backlight_tick)) {
918a85d3 43 backlight_pins_on();
4531cc87 44 } else {
918a85d3 45 backlight_pins_off();
4531cc87
JC
46 }
47 backlight_tick = (backlight_tick + 1) % 16;
48}