aboutsummaryrefslogtreecommitdiffstats
path: root/quantum/backlight
diff options
context:
space:
mode:
Diffstat (limited to 'quantum/backlight')
-rw-r--r--quantum/backlight/backlight_avr.c58
1 files changed, 46 insertions, 12 deletions
diff --git a/quantum/backlight/backlight_avr.c b/quantum/backlight/backlight_avr.c
index 7cf1e0fb3..519c0c2cf 100644
--- a/quantum/backlight/backlight_avr.c
+++ b/quantum/backlight/backlight_avr.c
@@ -22,12 +22,15 @@
# define TOIEx TOIE1
# if BACKLIGHT_PIN == B5
+# define COMxx0 COM1A0
# define COMxx1 COM1A1
# define OCRxx OCR1A
# elif BACKLIGHT_PIN == B6
+# define COMxx0 COM1B0
# define COMxx1 COM1B1
# define OCRxx OCR1B
# elif BACKLIGHT_PIN == B7
+# define COMxx0 COM1C0
# define COMxx1 COM1C1
# define OCRxx OCR1C
# endif
@@ -44,6 +47,7 @@
# if (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__))
# error This MCU has no C4 pin!
# else
+# define COMxx0 COM3C0
# define COMxx1 COM3C1
# define OCRxx OCR3C
# endif
@@ -51,10 +55,12 @@
# if (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__))
# error This MCU has no C5 pin!
# else
+# define COMxx0 COM3B0
# define COMxx1 COM3B1
# define OCRxx OCR3B
# endif
# elif BACKLIGHT_PIN == C6
+# define COMxx0 COM3A0
# define COMxx1 COM3A1
# define OCRxx OCR3A
# endif
@@ -68,12 +74,15 @@
# define TOIEx TOIE1
# if BACKLIGHT_PIN == B7
+# define COMxx0 COM1C0
# define COMxx1 COM1C1
# define OCRxx OCR1C
# elif BACKLIGHT_PIN == C5
+# define COMxx0 COM1B0
# define COMxx1 COM1B1
# define OCRxx OCR1B
# elif BACKLIGHT_PIN == C6
+# define COMxx0 COM1A0
# define COMxx1 COM1A1
# define OCRxx OCR1A
# endif
@@ -87,9 +96,11 @@
# define TOIEx TOIE1
# if BACKLIGHT_PIN == D4
+# define COMxx0 COM1B0
# define COMxx1 COM1B1
# define OCRxx OCR1B
# elif BACKLIGHT_PIN == D5
+# define COMxx0 COM1A0
# define COMxx1 COM1A1
# define OCRxx OCR1A
# endif
@@ -103,9 +114,11 @@
# define TOIEx TOIE1
# if BACKLIGHT_PIN == B1
+# define COMxx0 COM1A0
# define COMxx1 COM1A1
# define OCRxx OCR1A
# elif BACKLIGHT_PIN == B2
+# define COMxx0 COM1B0
# define COMxx1 COM1B1
# define OCRxx OCR1B
# endif
@@ -156,22 +169,22 @@
# endif
# ifndef BACKLIGHT_ON_STATE
-# define BACKLIGHT_ON_STATE 0
+# define BACKLIGHT_ON_STATE 1
# endif
void backlight_on(pin_t backlight_pin) {
-# if BACKLIGHT_ON_STATE == 0
- writePinLow(backlight_pin);
-# else
+# if BACKLIGHT_ON_STATE == 1
writePinHigh(backlight_pin);
+# else
+ writePinLow(backlight_pin);
# endif
}
void backlight_off(pin_t backlight_pin) {
-# if BACKLIGHT_ON_STATE == 0
- writePinHigh(backlight_pin);
-# else
+# if BACKLIGHT_ON_STATE == 1
writePinLow(backlight_pin);
+# else
+ writePinHigh(backlight_pin);
# endif
}
@@ -199,6 +212,22 @@ static const pin_t backlight_pins[BACKLIGHT_LED_COUNT] = BACKLIGHT_PIN_INIT;
# else // full hardware PWM
+static inline void enable_pwm(void) {
+# if BACKLIGHT_ON_STATE == 1
+ TCCRxA |= _BV(COMxx1);
+# else
+ TCCRxA |= _BV(COMxx1) | _BV(COMxx0);
+# endif
+}
+
+static inline void disable_pwm(void) {
+# if BACKLIGHT_ON_STATE == 1
+ TCCRxA &= ~(_BV(COMxx1));
+# else
+ TCCRxA &= ~(_BV(COMxx1) | _BV(COMxx0));
+# endif
+}
+
// we support only one backlight pin
static const pin_t backlight_pin = BACKLIGHT_PIN;
# define FOR_EACH_LED(x) x
@@ -309,12 +338,12 @@ void backlight_set(uint8_t level) {
if (OCRxx) {
TIMSKx &= ~(_BV(OCIExA));
TIMSKx &= ~(_BV(TOIEx));
- FOR_EACH_LED(backlight_off(backlight_pin);)
}
# else
// Turn off PWM control on backlight pin
- TCCRxA &= ~(_BV(COMxx1));
+ disable_pwm();
# endif
+ FOR_EACH_LED(backlight_off(backlight_pin);)
} else {
# ifdef BACKLIGHT_PWM_TIMER
if (!OCRxx) {
@@ -323,7 +352,7 @@ void backlight_set(uint8_t level) {
}
# else
// Turn on PWM control of backlight pin
- TCCRxA |= _BV(COMxx1);
+ enable_pwm();
# endif
}
// Set the brightness
@@ -471,8 +500,13 @@ 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)."
*/
- TCCRxA = _BV(COMxx1) | _BV(WGM11); // = 0b00001010;
- TCCRxB = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;
+# if BACKLIGHT_ON_STATE == 1
+ TCCRxA = _BV(COMxx1) | _BV(WGM11);
+# else
+ TCCRxA = _BV(COMxx1) | _BV(COMxx0) | _BV(WGM11);
+# endif
+
+ TCCRxB = _BV(WGM13) | _BV(WGM12) | _BV(CS10);
# endif
// Use full 16-bit resolution. Counter counts to ICR1 before reset to 0.
ICRx = TIMER_TOP;