diff options
| author | Jack Humbert <jack.humb@gmail.com> | 2017-02-12 11:29:42 -0500 |
|---|---|---|
| committer | Jack Humbert <jack.humb@gmail.com> | 2017-02-12 11:29:42 -0500 |
| commit | 8d0fdf10086a0e8a1615f0521fccf1f5a2806497 (patch) | |
| tree | a64c77717d4b4cc7ffe08a6cdfc7e8091bd3c32a /quantum | |
| parent | a0c2305bd1153d9d578d73effd33896c2dbc26c8 (diff) | |
| download | qmk_firmware-8d0fdf10086a0e8a1615f0521fccf1f5a2806497.tar.gz qmk_firmware-8d0fdf10086a0e8a1615f0521fccf1f5a2806497.zip | |
adds soft pwm for non-timed ports
Diffstat (limited to 'quantum')
| -rw-r--r-- | quantum/quantum.c | 59 | ||||
| -rw-r--r-- | quantum/quantum.h | 1 |
2 files changed, 46 insertions, 14 deletions
diff --git a/quantum/quantum.c b/quantum/quantum.c index 45ea8cb73..95f06d95d 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c | |||
| @@ -7,6 +7,9 @@ | |||
| 7 | #define TAPPING_TERM 200 | 7 | #define TAPPING_TERM 200 |
| 8 | #endif | 8 | #endif |
| 9 | 9 | ||
| 10 | #include "backlight.h" | ||
| 11 | extern backlight_config_t backlight_config; | ||
| 12 | |||
| 10 | static void do_code16 (uint16_t code, void (*f) (uint8_t)) { | 13 | static void do_code16 (uint16_t code, void (*f) (uint8_t)) { |
| 11 | switch (code) { | 14 | switch (code) { |
| 12 | case QK_MODS ... QK_MODS_MAX: | 15 | case QK_MODS ... QK_MODS_MAX: |
| @@ -577,6 +580,10 @@ void matrix_scan_quantum() { | |||
| 577 | matrix_scan_combo(); | 580 | matrix_scan_combo(); |
| 578 | #endif | 581 | #endif |
| 579 | 582 | ||
| 583 | #if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_PIN) | ||
| 584 | backlight_task(); | ||
| 585 | #endif | ||
| 586 | |||
| 580 | matrix_scan_kb(); | 587 | matrix_scan_kb(); |
| 581 | } | 588 | } |
| 582 | 589 | ||
| @@ -644,13 +651,13 @@ __attribute__ ((weak)) | |||
| 644 | void backlight_set(uint8_t level) | 651 | void backlight_set(uint8_t level) |
| 645 | { | 652 | { |
| 646 | // Prevent backlight blink on lowest level | 653 | // Prevent backlight blink on lowest level |
| 647 | #if BACKLIGHT_ON_STATE == 0 | 654 | // #if BACKLIGHT_ON_STATE == 0 |
| 648 | // PORTx &= ~n | 655 | // // PORTx &= ~n |
| 649 | _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF); | 656 | // _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF); |
| 650 | #else | 657 | // #else |
| 651 | // PORTx |= n | 658 | // // PORTx |= n |
| 652 | _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF); | 659 | // _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF); |
| 653 | #endif | 660 | // #endif |
| 654 | 661 | ||
| 655 | if ( level == 0 ) { | 662 | if ( level == 0 ) { |
| 656 | #ifndef NO_BACKLIGHT_CLOCK | 663 | #ifndef NO_BACKLIGHT_CLOCK |
| @@ -658,13 +665,13 @@ void backlight_set(uint8_t level) | |||
| 658 | TCCR1A &= ~(_BV(COM1x1)); | 665 | TCCR1A &= ~(_BV(COM1x1)); |
| 659 | OCR1x = 0x0; | 666 | OCR1x = 0x0; |
| 660 | #else | 667 | #else |
| 661 | #if BACKLIGHT_ON_STATE == 0 | 668 | // #if BACKLIGHT_ON_STATE == 0 |
| 662 | // PORTx |= n | 669 | // // PORTx |= n |
| 663 | _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF); | 670 | // _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF); |
| 664 | #else | 671 | // #else |
| 665 | // PORTx &= ~n | 672 | // // PORTx &= ~n |
| 666 | _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF); | 673 | // _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF); |
| 667 | #endif | 674 | // #endif |
| 668 | #endif | 675 | #endif |
| 669 | } | 676 | } |
| 670 | #ifndef NO_BACKLIGHT_CLOCK | 677 | #ifndef NO_BACKLIGHT_CLOCK |
| @@ -687,6 +694,30 @@ void backlight_set(uint8_t level) | |||
| 687 | #endif | 694 | #endif |
| 688 | } | 695 | } |
| 689 | 696 | ||
| 697 | uint8_t backlight_tick = 0; | ||
| 698 | |||
| 699 | void backlight_task(void) { | ||
| 700 | #ifdef NO_BACKLIGHT_CLOCK | ||
| 701 | if ((0xFFFF >> ((BACKLIGHT_LEVELS - backlight_config.level) * ((BACKLIGHT_LEVELS + 1) / 2))) & (1 << backlight_tick)) { | ||
| 702 | #if BACKLIGHT_ON_STATE == 0 | ||
| 703 | // PORTx &= ~n | ||
| 704 | _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF); | ||
| 705 | #else | ||
| 706 | // PORTx |= n | ||
| 707 | _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF); | ||
| 708 | #endif | ||
| 709 | } else { | ||
| 710 | #if BACKLIGHT_ON_STATE == 0 | ||
| 711 | // PORTx |= n | ||
| 712 | _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF); | ||
| 713 | #else | ||
| 714 | // PORTx &= ~n | ||
| 715 | _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF); | ||
| 716 | #endif | ||
| 717 | } | ||
| 718 | backlight_tick = (backlight_tick + 1) % 16; | ||
| 719 | #endif | ||
| 720 | } | ||
| 690 | 721 | ||
| 691 | #ifdef BACKLIGHT_BREATHING | 722 | #ifdef BACKLIGHT_BREATHING |
| 692 | 723 | ||
diff --git a/quantum/quantum.h b/quantum/quantum.h index 18f072189..2470d8c7d 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h | |||
| @@ -95,6 +95,7 @@ void unregister_code16 (uint16_t code); | |||
| 95 | 95 | ||
| 96 | #ifdef BACKLIGHT_ENABLE | 96 | #ifdef BACKLIGHT_ENABLE |
| 97 | void backlight_init_ports(void); | 97 | void backlight_init_ports(void); |
| 98 | void backlight_task(void); | ||
| 98 | 99 | ||
| 99 | #ifdef BACKLIGHT_BREATHING | 100 | #ifdef BACKLIGHT_BREATHING |
| 100 | void breathing_enable(void); | 101 | void breathing_enable(void); |
