Rescale both ChibiOS and AVR backlighting.
This commit is contained in:
		
							parent
							
								
									c4ecae1d77
								
							
						
					
					
						commit
						f22a61e7e9
					
				
					 3 changed files with 33 additions and 12 deletions
				
			
		| 
						 | 
				
			
			@ -3,6 +3,11 @@
 | 
			
		|||
#include "backlight_driver_common.h"
 | 
			
		||||
#include "debug.h"
 | 
			
		||||
 | 
			
		||||
// Maximum duty cycle limit
 | 
			
		||||
#ifndef BACKLIGHT_LIMIT_VAL
 | 
			
		||||
#    define BACKLIGHT_LIMIT_VAL 255
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// This logic is a bit complex, we support 3 setups:
 | 
			
		||||
//
 | 
			
		||||
//   1. Hardware PWM when backlight is wired to a PWM pin.
 | 
			
		||||
| 
						 | 
				
			
			@ -240,6 +245,11 @@ static uint16_t cie_lightness(uint16_t v) {
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// rescale the supplied backlight value to be in terms of the value limit
 | 
			
		||||
static uint32_t rescale_limit_val(uint32_t val) {
 | 
			
		||||
    return (val * (BACKLIGHT_LIMIT_VAL + 1)) / 256;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// range for val is [0..TIMER_TOP]. PWM pin is high while the timer count is below val.
 | 
			
		||||
static inline void set_pwm(uint16_t val) { OCRxx = val; }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -269,7 +279,7 @@ void backlight_set(uint8_t level) {
 | 
			
		|||
#endif
 | 
			
		||||
    }
 | 
			
		||||
    // Set the brightness
 | 
			
		||||
    set_pwm(cie_lightness(TIMER_TOP * (uint32_t)level / BACKLIGHT_LEVELS));
 | 
			
		||||
    set_pwm(cie_lightness(rescale_limit_val(TIMER_TOP * (uint32_t)level / BACKLIGHT_LEVELS)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void backlight_task(void) {}
 | 
			
		||||
| 
						 | 
				
			
			@ -375,7 +385,7 @@ ISR(TIMERx_OVF_vect)
 | 
			
		|||
        breathing_interrupt_disable();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    set_pwm(cie_lightness(scale_backlight((uint16_t)pgm_read_byte(&breathing_table[index]) * 0x0101U)));
 | 
			
		||||
    set_pwm(cie_lightness(rescale_limit_val(scale_backlight((uint16_t)pgm_read_byte(&breathing_table[index]) * 0x0101U))));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif  // BACKLIGHT_BREATHING
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,6 +3,11 @@
 | 
			
		|||
#include <hal.h>
 | 
			
		||||
#include "debug.h"
 | 
			
		||||
 | 
			
		||||
// Maximum duty cycle limit
 | 
			
		||||
#ifndef BACKLIGHT_LIMIT_VAL
 | 
			
		||||
#    define BACKLIGHT_LIMIT_VAL 255
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// GPIOV2 && GPIOV3
 | 
			
		||||
#ifndef BACKLIGHT_PAL_MODE
 | 
			
		||||
#    define BACKLIGHT_PAL_MODE 2
 | 
			
		||||
| 
						 | 
				
			
			@ -58,6 +63,11 @@ static uint16_t cie_lightness(uint16_t v) {
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static uint32_t rescale_limit_val(uint32_t val) {
 | 
			
		||||
    // rescale the supplied backlight value to be in terms of the value limit
 | 
			
		||||
    return (val * (BACKLIGHT_LIMIT_VAL + 1)) / 256;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void backlight_init_ports(void) {
 | 
			
		||||
#ifdef USE_GPIOV1
 | 
			
		||||
    palSetPadMode(PAL_PORT(BACKLIGHT_PIN), PAL_PAD(BACKLIGHT_PIN), PAL_MODE_STM32_ALTERNATE_PUSHPULL);
 | 
			
		||||
| 
						 | 
				
			
			@ -85,7 +95,7 @@ void backlight_set(uint8_t level) {
 | 
			
		|||
        pwmDisableChannel(&BACKLIGHT_PWM_DRIVER, BACKLIGHT_PWM_CHANNEL - 1);
 | 
			
		||||
    } else {
 | 
			
		||||
        // Turn backlight on
 | 
			
		||||
        uint32_t duty = (uint32_t)(cie_lightness(0xFFFF * (uint32_t)level / BACKLIGHT_LEVELS));
 | 
			
		||||
        uint32_t duty = (uint32_t)(cie_lightness(rescale_limit_val(0xFFFF * (uint32_t)level / BACKLIGHT_LEVELS)));
 | 
			
		||||
        pwmEnableChannel(&BACKLIGHT_PWM_DRIVER, BACKLIGHT_PWM_CHANNEL - 1, PWM_FRACTION_TO_WIDTH(&BACKLIGHT_PWM_DRIVER, 0xFFFF, duty));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -129,7 +139,7 @@ void breathing_callback(PWMDriver *pwmp) {
 | 
			
		|||
    static uint16_t breathing_counter = 0;
 | 
			
		||||
    breathing_counter                 = (breathing_counter + 1) % (breathing_period * 256);
 | 
			
		||||
    uint8_t  index                    = breathing_counter / interval % BREATHING_STEPS;
 | 
			
		||||
    uint32_t duty                     = cie_lightness(scale_backlight(breathing_table[index] * 256));
 | 
			
		||||
    uint32_t duty                     = cie_lightness(rescale_limit_val(scale_backlight(breathing_table[index] * 256)));
 | 
			
		||||
 | 
			
		||||
    chSysLockFromISR();
 | 
			
		||||
    pwmEnableChannelI(pwmp, BACKLIGHT_PWM_CHANNEL - 1, PWM_FRACTION_TO_WIDTH(&BACKLIGHT_PWM_DRIVER, 0xFFFF, duty));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue