aboutsummaryrefslogtreecommitdiff
path: root/tmk_core/common/avr
diff options
context:
space:
mode:
authorJoel Challis <git@zvecr.com>2020-03-26 18:21:33 +0000
committerGitHub <noreply@github.com>2020-03-26 18:21:33 +0000
commit23e942ae4e66008632667f12c30bbb4f0fae31f7 (patch)
treea5d3fc389ee9444635abeaba2126d500e595676e /tmk_core/common/avr
parentc077300e19a9c788b3d30bc65c1198fc88de3d5b (diff)
downloadqmk_firmware-23e942ae4e66008632667f12c30bbb4f0fae31f7.tar.gz
qmk_firmware-23e942ae4e66008632667f12c30bbb4f0fae31f7.zip
Enable SLEEP_LED on ATmega32A (#8531)
* Port over some AVR backlight logic to SLEEP_LED * Port over some AVR backlight logic to SLEEP_LED - add timer 3 * Port over some AVR backlight logic to SLEEP_LED - clang format * Enable SLEEP_LED within vusb protocol
Diffstat (limited to 'tmk_core/common/avr')
-rw-r--r--tmk_core/common/avr/sleep_led.c41
1 files changed, 32 insertions, 9 deletions
diff --git a/tmk_core/common/avr/sleep_led.c b/tmk_core/common/avr/sleep_led.c
index 61fa70dc3..63dcc2afd 100644
--- a/tmk_core/common/avr/sleep_led.c
+++ b/tmk_core/common/avr/sleep_led.c
@@ -5,6 +5,30 @@
5#include "led.h" 5#include "led.h"
6#include "sleep_led.h" 6#include "sleep_led.h"
7 7
8#ifndef SLEEP_LED_TIMER
9# define SLEEP_LED_TIMER 1
10#endif
11
12#if SLEEP_LED_TIMER == 1
13# define TCCRxB TCCR1B
14# define TIMERx_COMPA_vect TIMER1_COMPA_vect
15# if defined(__AVR_ATmega32A__) // This MCU has only one TIMSK register
16# define TIMSKx TIMSK
17# else
18# define TIMSKx TIMSK1
19# endif
20# define OCIExA OCIE1A
21# define OCRxx OCR1A
22#elif SLEEP_LED_TIMER == 3
23# define TCCRxB TCCR3B
24# define TIMERx_COMPA_vect TIMER3_COMPA_vect
25# define TIMSKx TIMSK3
26# define OCIExA OCIE3A
27# define OCRxx OCR3A
28#else
29error("Invalid SLEEP_LED_TIMER config")
30#endif
31
8/* Software PWM 32/* Software PWM
9 * ______ ______ __ 33 * ______ ______ __
10 * | ON |___OFF___| ON |___OFF___| .... 34 * | ON |___OFF___| ON |___OFF___| ....
@@ -25,15 +49,14 @@
25void sleep_led_init(void) { 49void sleep_led_init(void) {
26 /* Timer1 setup */ 50 /* Timer1 setup */
27 /* CTC mode */ 51 /* CTC mode */
28 TCCR1B |= _BV(WGM12); 52 TCCRxB |= _BV(WGM12);
29 /* Clock selelct: clk/1 */ 53 /* Clock selelct: clk/1 */
30 TCCR1B |= _BV(CS10); 54 TCCRxB |= _BV(CS10);
31 /* Set TOP value */ 55 /* Set TOP value */
32 uint8_t sreg = SREG; 56 uint8_t sreg = SREG;
33 cli(); 57 cli();
34 OCR1AH = (SLEEP_LED_TIMER_TOP >> 8) & 0xff; 58 OCRxx = SLEEP_LED_TIMER_TOP;
35 OCR1AL = SLEEP_LED_TIMER_TOP & 0xff; 59 SREG = sreg;
36 SREG = sreg;
37} 60}
38 61
39/** \brief Sleep LED enable 62/** \brief Sleep LED enable
@@ -42,7 +65,7 @@ void sleep_led_init(void) {
42 */ 65 */
43void sleep_led_enable(void) { 66void sleep_led_enable(void) {
44 /* Enable Compare Match Interrupt */ 67 /* Enable Compare Match Interrupt */
45 TIMSK1 |= _BV(OCIE1A); 68 TIMSKx |= _BV(OCIExA);
46} 69}
47 70
48/** \brief Sleep LED disable 71/** \brief Sleep LED disable
@@ -51,7 +74,7 @@ void sleep_led_enable(void) {
51 */ 74 */
52void sleep_led_disable(void) { 75void sleep_led_disable(void) {
53 /* Disable Compare Match Interrupt */ 76 /* Disable Compare Match Interrupt */
54 TIMSK1 &= ~_BV(OCIE1A); 77 TIMSKx &= ~_BV(OCIExA);
55} 78}
56 79
57/** \brief Sleep LED toggle 80/** \brief Sleep LED toggle
@@ -60,7 +83,7 @@ void sleep_led_disable(void) {
60 */ 83 */
61void sleep_led_toggle(void) { 84void sleep_led_toggle(void) {
62 /* Disable Compare Match Interrupt */ 85 /* Disable Compare Match Interrupt */
63 TIMSK1 ^= _BV(OCIE1A); 86 TIMSKx ^= _BV(OCIExA);
64} 87}
65 88
66/** \brief Breathing Sleep LED brighness(PWM On period) table 89/** \brief Breathing Sleep LED brighness(PWM On period) table
@@ -72,7 +95,7 @@ void sleep_led_toggle(void) {
72 */ 95 */
73static const uint8_t breathing_table[64] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 4, 6, 10, 15, 23, 32, 44, 58, 74, 93, 113, 135, 157, 179, 199, 218, 233, 245, 252, 255, 252, 245, 233, 218, 199, 179, 157, 135, 113, 93, 74, 58, 44, 32, 23, 15, 10, 6, 4, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 96static const uint8_t breathing_table[64] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 4, 6, 10, 15, 23, 32, 44, 58, 74, 93, 113, 135, 157, 179, 199, 218, 233, 245, 252, 255, 252, 245, 233, 218, 199, 179, 157, 135, 113, 93, 74, 58, 44, 32, 23, 15, 10, 6, 4, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
74 97
75ISR(TIMER1_COMPA_vect) { 98ISR(TIMERx_COMPA_vect) {
76 /* Software PWM 99 /* Software PWM
77 * timer:1111 1111 1111 1111 100 * timer:1111 1111 1111 1111
78 * \_____/\/ \_______/____ count(0-255) 101 * \_____/\/ \_______/____ count(0-255)