aboutsummaryrefslogtreecommitdiff
path: root/quantum/quantum.c
diff options
context:
space:
mode:
authorJack Humbert <jack.humb@gmail.com>2017-02-07 15:23:56 -0500
committerJack Humbert <jack.humb@gmail.com>2017-02-07 15:23:56 -0500
commitb4e30d392969b000eb9a87065fc1caaf33d670e1 (patch)
treef451202b2a28658a24145ef674cf838f4dce2e9a /quantum/quantum.c
parentd639bd2021b697849bb11e521fc142292ab7e023 (diff)
downloadqmk_firmware-b4e30d392969b000eb9a87065fc1caaf33d670e1.tar.gz
qmk_firmware-b4e30d392969b000eb9a87065fc1caaf33d670e1.zip
added functionality for just a port
Diffstat (limited to 'quantum/quantum.c')
-rw-r--r--quantum/quantum.c94
1 files changed, 62 insertions, 32 deletions
diff --git a/quantum/quantum.c b/quantum/quantum.c
index d3905decf..45ea8cb73 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -594,34 +594,45 @@ static const uint8_t backlight_pin = BACKLIGHT_PIN;
594# define COM1x1 COM1A1 594# define COM1x1 COM1A1
595# define OCR1x OCR1A 595# define OCR1x OCR1A
596#else 596#else
597# error "Backlight pin not supported - use B5, B6, or B7" 597# define NO_BACKLIGHT_CLOCK
598#endif
599
600#ifndef BACKLIGHT_ON_STATE
601#define BACKLIGHT_ON_STATE 0
598#endif 602#endif
599 603
600__attribute__ ((weak)) 604__attribute__ ((weak))
601void backlight_init_ports(void) 605void backlight_init_ports(void)
602{ 606{
603 607
604 // Setup backlight pin as output and output low. 608 // Setup backlight pin as output and output to on state.
605 // DDRx |= n 609 // DDRx |= n
606 _SFR_IO8((backlight_pin >> 4) + 1) |= _BV(backlight_pin & 0xF); 610 _SFR_IO8((backlight_pin >> 4) + 1) |= _BV(backlight_pin & 0xF);
607 // PORTx &= ~n 611 #if BACKLIGHT_ON_STATE == 0
608 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF); 612 // PORTx &= ~n
613 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
614 #else
615 // PORTx |= n
616 _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
617 #endif
609 618
610 // Use full 16-bit resolution. 619 #ifndef NO_BACKLIGHT_CLOCK
611 ICR1 = 0xFFFF; 620 // Use full 16-bit resolution.
621 ICR1 = 0xFFFF;
612 622
613 // I could write a wall of text here to explain... but TL;DW 623 // I could write a wall of text here to explain... but TL;DW
614 // Go read the ATmega32u4 datasheet. 624 // Go read the ATmega32u4 datasheet.
615 // And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on 625 // And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on
616 626
617 // Pin PB7 = OCR1C (Timer 1, Channel C) 627 // Pin PB7 = OCR1C (Timer 1, Channel C)
618 // Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0 628 // Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0
619 // (i.e. start high, go low when counter matches.) 629 // (i.e. start high, go low when counter matches.)
620 // WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0 630 // WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0
621 // Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1 631 // Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1
622 632
623 TCCR1A = _BV(COM1x1) | _BV(WGM11); // = 0b00001010; 633 TCCR1A = _BV(COM1x1) | _BV(WGM11); // = 0b00001010;
624 TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001; 634 TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;
635 #endif
625 636
626 backlight_init(); 637 backlight_init();
627 #ifdef BACKLIGHT_BREATHING 638 #ifdef BACKLIGHT_BREATHING
@@ -633,24 +644,43 @@ __attribute__ ((weak))
633void backlight_set(uint8_t level) 644void backlight_set(uint8_t level)
634{ 645{
635 // Prevent backlight blink on lowest level 646 // Prevent backlight blink on lowest level
636 // PORTx &= ~n 647 #if BACKLIGHT_ON_STATE == 0
637 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF); 648 // PORTx &= ~n
649 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
650 #else
651 // PORTx |= n
652 _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
653 #endif
638 654
639 if ( level == 0 ) { 655 if ( level == 0 ) {
640 // Turn off PWM control on backlight pin, revert to output low. 656 #ifndef NO_BACKLIGHT_CLOCK
641 TCCR1A &= ~(_BV(COM1x1)); 657 // Turn off PWM control on backlight pin, revert to output low.
642 OCR1x = 0x0; 658 TCCR1A &= ~(_BV(COM1x1));
643 } else if ( level == BACKLIGHT_LEVELS ) { 659 OCR1x = 0x0;
644 // Turn on PWM control of backlight pin 660 #else
645 TCCR1A |= _BV(COM1x1); 661 #if BACKLIGHT_ON_STATE == 0
646 // Set the brightness 662 // PORTx |= n
647 OCR1x = 0xFFFF; 663 _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
648 } else { 664 #else
649 // Turn on PWM control of backlight pin 665 // PORTx &= ~n
650 TCCR1A |= _BV(COM1x1); 666 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
651 // Set the brightness 667 #endif
652 OCR1x = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2)); 668 #endif
653 } 669 }
670 #ifndef NO_BACKLIGHT_CLOCK
671 else if ( level == BACKLIGHT_LEVELS ) {
672 // Turn on PWM control of backlight pin
673 TCCR1A |= _BV(COM1x1);
674 // Set the brightness
675 OCR1x = 0xFFFF;
676 }
677 else {
678 // Turn on PWM control of backlight pin
679 TCCR1A |= _BV(COM1x1);
680 // Set the brightness
681 OCR1x = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2));
682 }
683 #endif
654 684
655 #ifdef BACKLIGHT_BREATHING 685 #ifdef BACKLIGHT_BREATHING
656 breathing_intensity_default(); 686 breathing_intensity_default();