diff options
| author | Jack Humbert <jack.humb@gmail.com> | 2017-02-07 15:23:56 -0500 |
|---|---|---|
| committer | Jack Humbert <jack.humb@gmail.com> | 2017-02-07 15:23:56 -0500 |
| commit | b4e30d392969b000eb9a87065fc1caaf33d670e1 (patch) | |
| tree | f451202b2a28658a24145ef674cf838f4dce2e9a /quantum/quantum.c | |
| parent | d639bd2021b697849bb11e521fc142292ab7e023 (diff) | |
| download | qmk_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.c | 94 |
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)) |
| 601 | void backlight_init_ports(void) | 605 | void 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)) | |||
| 633 | void backlight_set(uint8_t level) | 644 | void 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(); |
