diff options
-rw-r--r-- | quantum/quantum.c | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/quantum/quantum.c b/quantum/quantum.c index 5abd222d1..b9934aee8 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -898,14 +898,29 @@ static const uint8_t backlight_pin = BACKLIGHT_PIN; // depending on the pin, we use a different output compare unit #if BACKLIGHT_PIN == B7 -# define COM1x1 COM1C1 -# define OCR1x OCR1C +# define TCCRxA TCCR1A +# define TCCRxB TCCR1B +# define COMxx1 COM1C1 +# define OCRxx OCR1C +# define ICRx ICR1 #elif BACKLIGHT_PIN == B6 -# define COM1x1 COM1B1 -# define OCR1x OCR1B +# define TCCRxA TCCR1A +# define TCCRxB TCCR1B +# define COMxx1 COM1B1 +# define OCRxx OCR1B +# define ICRx ICR1 #elif BACKLIGHT_PIN == B5 -# define COM1x1 COM1A1 -# define OCR1x OCR1A +# define TCCRxA TCCR1A +# define TCCRxB TCCR1B +# define COMxx1 COM1A1 +# define OCRxx OCR1A +# define ICRx ICR1 +#elif BACKLIGHT_PIN == C6 +# define TCCRxA TCCR3A +# define TCCRxB TCCR3B +# define COMxx1 COM1A1 +# define OCRxx OCR3A +# define ICRx ICR3 #else # define NO_HARDWARE_PWM #endif @@ -987,7 +1002,7 @@ static uint16_t cie_lightness(uint16_t v) { // 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) { - OCR1x = val; + OCRxx = val; } #ifndef BACKLIGHT_CUSTOM_DRIVER @@ -998,10 +1013,10 @@ void backlight_set(uint8_t level) { if (level == 0) { // Turn off PWM control on backlight pin - TCCR1A &= ~(_BV(COM1x1)); + TCCRxA &= ~(_BV(COMxx1)); } else { // Turn on PWM control of backlight pin - TCCR1A |= _BV(COM1x1); + TCCRxA |= _BV(COMxx1); } // Set the brightness set_pwm(cie_lightness(TIMER_TOP * (uint32_t)level / BACKLIGHT_LEVELS)); @@ -1149,11 +1164,10 @@ void backlight_init_ports(void) "In fast PWM mode, the compare units allow generation of PWM waveforms on the OCnx pins. Setting the COMnx1:0 bits to two will produce a non-inverted PWM [..]." "In fast PWM mode the counter is incremented until the counter value matches either one of the fixed values 0x00FF, 0x01FF, or 0x03FF (WGMn3:0 = 5, 6, or 7), the value in ICRn (WGMn3:0 = 14), or the value in OCRnA (WGMn3:0 = 15)." */ - - TCCR1A = _BV(COM1x1) | _BV(WGM11); // = 0b00001010; - TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001; + TCCRxA = _BV(COMxx1) | _BV(WGM11); // = 0b00001010; + TCCRxB = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001; // Use full 16-bit resolution. Counter counts to ICR1 before reset to 0. - ICR1 = TIMER_TOP; + ICRx = TIMER_TOP; backlight_init(); #ifdef BACKLIGHT_BREATHING |