aboutsummaryrefslogtreecommitdiff
path: root/quantum/backlight
diff options
context:
space:
mode:
Diffstat (limited to 'quantum/backlight')
-rw-r--r--quantum/backlight/backlight_avr.c12
-rw-r--r--quantum/backlight/backlight_chibios.c14
2 files changed, 22 insertions, 4 deletions
diff --git a/quantum/backlight/backlight_avr.c b/quantum/backlight/backlight_avr.c
index b3e882ffe..4d66da80b 100644
--- a/quantum/backlight/backlight_avr.c
+++ b/quantum/backlight/backlight_avr.c
@@ -3,6 +3,11 @@
3#include "backlight_driver_common.h" 3#include "backlight_driver_common.h"
4#include "debug.h" 4#include "debug.h"
5 5
6// Maximum duty cycle limit
7#ifndef BACKLIGHT_LIMIT_VAL
8# define BACKLIGHT_LIMIT_VAL 255
9#endif
10
6// This logic is a bit complex, we support 3 setups: 11// This logic is a bit complex, we support 3 setups:
7// 12//
8// 1. Hardware PWM when backlight is wired to a PWM pin. 13// 1. Hardware PWM when backlight is wired to a PWM pin.
@@ -240,6 +245,9 @@ static uint16_t cie_lightness(uint16_t v) {
240 } 245 }
241} 246}
242 247
248// rescale the supplied backlight value to be in terms of the value limit
249static uint32_t rescale_limit_val(uint32_t val) { return (val * (BACKLIGHT_LIMIT_VAL + 1)) / 256; }
250
243// range for val is [0..TIMER_TOP]. PWM pin is high while the timer count is below val. 251// range for val is [0..TIMER_TOP]. PWM pin is high while the timer count is below val.
244static inline void set_pwm(uint16_t val) { OCRxx = val; } 252static inline void set_pwm(uint16_t val) { OCRxx = val; }
245 253
@@ -269,7 +277,7 @@ void backlight_set(uint8_t level) {
269#endif 277#endif
270 } 278 }
271 // Set the brightness 279 // Set the brightness
272 set_pwm(cie_lightness(TIMER_TOP * (uint32_t)level / BACKLIGHT_LEVELS)); 280 set_pwm(cie_lightness(rescale_limit_val(TIMER_TOP * (uint32_t)level / BACKLIGHT_LEVELS)));
273} 281}
274 282
275void backlight_task(void) {} 283void backlight_task(void) {}
@@ -375,7 +383,7 @@ ISR(TIMERx_OVF_vect)
375 breathing_interrupt_disable(); 383 breathing_interrupt_disable();
376 } 384 }
377 385
378 set_pwm(cie_lightness(scale_backlight((uint16_t)pgm_read_byte(&breathing_table[index]) * 0x0101U))); 386 set_pwm(cie_lightness(rescale_limit_val(scale_backlight((uint16_t)pgm_read_byte(&breathing_table[index]) * 0x0101U))));
379} 387}
380 388
381#endif // BACKLIGHT_BREATHING 389#endif // BACKLIGHT_BREATHING
diff --git a/quantum/backlight/backlight_chibios.c b/quantum/backlight/backlight_chibios.c
index 0fe812bf2..4d5a69e14 100644
--- a/quantum/backlight/backlight_chibios.c
+++ b/quantum/backlight/backlight_chibios.c
@@ -3,6 +3,11 @@
3#include <hal.h> 3#include <hal.h>
4#include "debug.h" 4#include "debug.h"
5 5
6// Maximum duty cycle limit
7#ifndef BACKLIGHT_LIMIT_VAL
8# define BACKLIGHT_LIMIT_VAL 255
9#endif
10
6// GPIOV2 && GPIOV3 11// GPIOV2 && GPIOV3
7#ifndef BACKLIGHT_PAL_MODE 12#ifndef BACKLIGHT_PAL_MODE
8# define BACKLIGHT_PAL_MODE 2 13# define BACKLIGHT_PAL_MODE 2
@@ -58,6 +63,11 @@ static uint16_t cie_lightness(uint16_t v) {
58 } 63 }
59} 64}
60 65
66static uint32_t rescale_limit_val(uint32_t val) {
67 // rescale the supplied backlight value to be in terms of the value limit
68 return (val * (BACKLIGHT_LIMIT_VAL + 1)) / 256;
69}
70
61void backlight_init_ports(void) { 71void backlight_init_ports(void) {
62#ifdef USE_GPIOV1 72#ifdef USE_GPIOV1
63 palSetPadMode(PAL_PORT(BACKLIGHT_PIN), PAL_PAD(BACKLIGHT_PIN), PAL_MODE_STM32_ALTERNATE_PUSHPULL); 73 palSetPadMode(PAL_PORT(BACKLIGHT_PIN), PAL_PAD(BACKLIGHT_PIN), PAL_MODE_STM32_ALTERNATE_PUSHPULL);
@@ -85,7 +95,7 @@ void backlight_set(uint8_t level) {
85 pwmDisableChannel(&BACKLIGHT_PWM_DRIVER, BACKLIGHT_PWM_CHANNEL - 1); 95 pwmDisableChannel(&BACKLIGHT_PWM_DRIVER, BACKLIGHT_PWM_CHANNEL - 1);
86 } else { 96 } else {
87 // Turn backlight on 97 // Turn backlight on
88 uint32_t duty = (uint32_t)(cie_lightness(0xFFFF * (uint32_t)level / BACKLIGHT_LEVELS)); 98 uint32_t duty = (uint32_t)(cie_lightness(rescale_limit_val(0xFFFF * (uint32_t)level / BACKLIGHT_LEVELS)));
89 pwmEnableChannel(&BACKLIGHT_PWM_DRIVER, BACKLIGHT_PWM_CHANNEL - 1, PWM_FRACTION_TO_WIDTH(&BACKLIGHT_PWM_DRIVER, 0xFFFF, duty)); 99 pwmEnableChannel(&BACKLIGHT_PWM_DRIVER, BACKLIGHT_PWM_CHANNEL - 1, PWM_FRACTION_TO_WIDTH(&BACKLIGHT_PWM_DRIVER, 0xFFFF, duty));
90 } 100 }
91} 101}
@@ -129,7 +139,7 @@ void breathing_callback(PWMDriver *pwmp) {
129 static uint16_t breathing_counter = 0; 139 static uint16_t breathing_counter = 0;
130 breathing_counter = (breathing_counter + 1) % (breathing_period * 256); 140 breathing_counter = (breathing_counter + 1) % (breathing_period * 256);
131 uint8_t index = breathing_counter / interval % BREATHING_STEPS; 141 uint8_t index = breathing_counter / interval % BREATHING_STEPS;
132 uint32_t duty = cie_lightness(scale_backlight(breathing_table[index] * 256)); 142 uint32_t duty = cie_lightness(rescale_limit_val(scale_backlight(breathing_table[index] * 256)));
133 143
134 chSysLockFromISR(); 144 chSysLockFromISR();
135 pwmEnableChannelI(pwmp, BACKLIGHT_PWM_CHANNEL - 1, PWM_FRACTION_TO_WIDTH(&BACKLIGHT_PWM_DRIVER, 0xFFFF, duty)); 145 pwmEnableChannelI(pwmp, BACKLIGHT_PWM_CHANNEL - 1, PWM_FRACTION_TO_WIDTH(&BACKLIGHT_PWM_DRIVER, 0xFFFF, duty));