Bläddra i källkod

ARM - Refactor SLEEP_LED to support more platforms (#8403)

* Initial refactor of ARM SLEEP_LED to enable more platforms

* fix build issues

* Disable SLEEP_LED for boards with no caps lock code

* Enable GPT14 for boards with caps lock code and SLEEP_LED enabled

* Enable GPT for boards with caps lock code and SLEEP_LED enabled
Joel Challis 4 år sedan
förälder
incheckning
415a8bc249

+ 2 - 0
keyboards/aeboards/ext65/rev2/config.h

@@ -74,3 +74,5 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define BACKLIGHT_LEVELS 6
 #define BACKLIGHT_BREATHING
 #define BREATHING_PERIOD 6
+
+#define SLEEP_LED_GPT_DRIVER GPTD1

+ 2 - 0
keyboards/aeboards/ext65/rev2/halconf.h

@@ -27,5 +27,7 @@
 
 #define HAL_USE_SPI TRUE
 
+#define HAL_USE_GPT TRUE
+
 #include_next <halconf.h>
 

+ 2 - 0
keyboards/aeboards/ext65/rev2/mcuconf.h

@@ -32,3 +32,5 @@
 #undef STM32_SPI_USE_SPI2
 #define STM32_SPI_USE_SPI2 TRUE
 
+#undef STM32_GPT_USE_TIM1
+#define STM32_GPT_USE_TIM1 TRUE

+ 1 - 1
keyboards/cannonkeys/an_c/rules.mk

@@ -11,7 +11,7 @@ MOUSEKEY_ENABLE = yes	# Mouse keys
 EXTRAKEY_ENABLE = yes	# Audio control and System control
 CONSOLE_ENABLE = yes	# Console for debug
 COMMAND_ENABLE = yes    # Commands for debug and configuration
-SLEEP_LED_ENABLE = yes  # Breathing sleep LED during USB suspend
+SLEEP_LED_ENABLE = no   # Breathing sleep LED during USB suspend
 NKRO_ENABLE = yes	    # USB Nkey Rollover
 CUSTOM_MATRIX = no # Custom matrix file
 BACKLIGHT_ENABLE = yes

+ 1 - 1
keyboards/cannonkeys/chimera65/rules.mk

@@ -11,7 +11,7 @@ MOUSEKEY_ENABLE = yes	# Mouse keys
 EXTRAKEY_ENABLE = yes	# Audio control and System control
 CONSOLE_ENABLE = yes	# Console for debug
 COMMAND_ENABLE = yes    # Commands for debug and configuration
-SLEEP_LED_ENABLE = yes  # Breathing sleep LED during USB suspend
+SLEEP_LED_ENABLE = no   # Breathing sleep LED during USB suspend
 NKRO_ENABLE = yes	    # USB Nkey Rollover
 CUSTOM_MATRIX = no # Custom matrix file
 BACKLIGHT_ENABLE = yes

+ 1 - 1
keyboards/cannonkeys/instant60/rules.mk

@@ -10,7 +10,7 @@ MOUSEKEY_ENABLE = yes	# Mouse keys
 EXTRAKEY_ENABLE = yes	# Audio control and System control
 CONSOLE_ENABLE = yes	# Console for debug
 COMMAND_ENABLE = yes    # Commands for debug and configuration
-SLEEP_LED_ENABLE = yes  # Breathing sleep LED during USB suspend
+SLEEP_LED_ENABLE = no   # Breathing sleep LED during USB suspend
 NKRO_ENABLE = yes	    # USB Nkey Rollover
 CUSTOM_MATRIX = no # Custom matrix file
 BACKLIGHT_ENABLE = yes

+ 1 - 1
keyboards/cannonkeys/iron165/rules.mk

@@ -9,7 +9,7 @@ MOUSEKEY_ENABLE = yes	# Mouse keys
 EXTRAKEY_ENABLE = yes	# Audio control and System control
 CONSOLE_ENABLE = yes	# Console for debug
 COMMAND_ENABLE = yes    # Commands for debug and configuration
-SLEEP_LED_ENABLE = yes  # Breathing sleep LED during USB suspend
+SLEEP_LED_ENABLE = no   # Breathing sleep LED during USB suspend
 NKRO_ENABLE = yes	    # USB Nkey Rollover
 CUSTOM_MATRIX = no # Custom matrix file
 BACKLIGHT_ENABLE = yes

+ 1 - 1
keyboards/cannonkeys/satisfaction75/rules.mk

@@ -15,7 +15,7 @@ MOUSEKEY_ENABLE = yes	# Mouse keys
 EXTRAKEY_ENABLE = yes	# Audio control and System control
 CONSOLE_ENABLE = yes	# Console for debug
 COMMAND_ENABLE = yes    # Commands for debug and configuration
-SLEEP_LED_ENABLE = no  # Breathing sleep LED during USB suspend
+SLEEP_LED_ENABLE = no   # Breathing sleep LED during USB suspend
 NKRO_ENABLE = yes	    # USB Nkey Rollover
 CUSTOM_MATRIX = no # Custom matrix file
 ENCODER_ENABLE = yes

+ 1 - 1
keyboards/cannonkeys/savage65/rules.mk

@@ -11,7 +11,7 @@ MOUSEKEY_ENABLE = yes	# Mouse keys
 EXTRAKEY_ENABLE = yes	# Audio control and System control
 CONSOLE_ENABLE = yes	# Console for debug
 COMMAND_ENABLE = yes    # Commands for debug and configuration
-SLEEP_LED_ENABLE = yes  # Breathing sleep LED during USB suspend
+SLEEP_LED_ENABLE = no   # Breathing sleep LED during USB suspend
 NKRO_ENABLE = yes	    # USB Nkey Rollover
 CUSTOM_MATRIX = no # Custom matrix file
 BACKLIGHT_ENABLE = yes

+ 1 - 1
keyboards/cannonkeys/tmov2/rules.mk

@@ -11,7 +11,7 @@ MOUSEKEY_ENABLE = yes	# Mouse keys
 EXTRAKEY_ENABLE = yes	# Audio control and System control
 CONSOLE_ENABLE = yes	# Console for debug
 COMMAND_ENABLE = yes    # Commands for debug and configuration
-SLEEP_LED_ENABLE = yes  # Breathing sleep LED during USB suspend
+SLEEP_LED_ENABLE = no   # Breathing sleep LED during USB suspend
 NKRO_ENABLE = yes	    # USB Nkey Rollover
 CUSTOM_MATRIX = no # Custom matrix file
 BACKLIGHT_ENABLE = yes

+ 1 - 1
keyboards/cannonkeys/tsukuyomi/rules.mk

@@ -10,7 +10,7 @@ EXTRAKEY_ENABLE = yes       # Audio control and System control
 CONSOLE_ENABLE = yes        # Console for debug
 COMMAND_ENABLE = yes        # Commands for debug and configuration
 # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE = yes      # Breathing sleep LED during USB suspend
+SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
 # if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
 NKRO_ENABLE = yes           # USB Nkey Rollover
 BACKLIGHT_ENABLE = yes      # Enable keyboard backlight functionality

+ 1 - 1
keyboards/daji/seis_cinco/rules.mk

@@ -11,7 +11,7 @@ EXTRAKEY_ENABLE = yes       # Audio control and System control
 CONSOLE_ENABLE = no         # Console for debug
 COMMAND_ENABLE = no         # Commands for debug and configuration
 # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE = yes      # Breathing sleep LED during USB suspend
+SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
 # if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
 NKRO_ENABLE = yes           # USB Nkey Rollover
 BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality

+ 1 - 1
keyboards/handwired/ck4x4/rules.mk

@@ -10,7 +10,7 @@ MOUSEKEY_ENABLE = yes	# Mouse keys
 EXTRAKEY_ENABLE = yes	# Audio control and System control
 CONSOLE_ENABLE = yes	# Console for debug
 COMMAND_ENABLE = yes    # Commands for debug and configuration
-SLEEP_LED_ENABLE = yes  # Breathing sleep LED during USB suspend
+SLEEP_LED_ENABLE = no   # Breathing sleep LED during USB suspend
 NKRO_ENABLE = yes	    # USB Nkey Rollover
 CUSTOM_MATRIX = no # Custom matrix file
 

+ 2 - 2
keyboards/handwired/onekey/rules.mk

@@ -7,9 +7,9 @@ EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 CONSOLE_ENABLE = yes        # Console for debug(+400)
 COMMAND_ENABLE = no         # Commands for debug and configuration
 # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE = yes       # Breathing sleep LED during USB suspend
+SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
 # if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-NKRO_ENABLE = yes            # USB Nkey Rollover
+NKRO_ENABLE = yes           # USB Nkey Rollover
 BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality on B7 by default
 RGBLIGHT_ENABLE = no        # Enable keyboard RGB underglow
 MIDI_ENABLE = no            # MIDI support (+2400 to 4200, depending on config)

+ 3 - 0
keyboards/projectkb/alice/config.h

@@ -0,0 +1,3 @@
+#pragma once
+
+#define SLEEP_LED_GPT_DRIVER GPTD1

+ 2 - 0
keyboards/projectkb/alice/halconf.h

@@ -27,5 +27,7 @@
 
 #define HAL_USE_SPI TRUE
 
+#define HAL_USE_GPT TRUE
+
 #include_next <halconf.h>
 

+ 2 - 0
keyboards/projectkb/alice/mcuconf.h

@@ -32,3 +32,5 @@
 #undef STM32_SPI_USE_SPI2
 #define STM32_SPI_USE_SPI2 TRUE
 
+#undef STM32_GPT_USE_TIM1
+#define STM32_GPT_USE_TIM1 TRUE

+ 1 - 1
keyboards/projectkb/signature87/rules.mk

@@ -9,7 +9,7 @@ MOUSEKEY_ENABLE = yes	# Mouse keys
 EXTRAKEY_ENABLE = yes	# Audio control and System control
 CONSOLE_ENABLE = yes	# Console for debug
 COMMAND_ENABLE = yes    # Commands for debug and configuration
-SLEEP_LED_ENABLE = yes  # Breathing sleep LED during USB suspend
+SLEEP_LED_ENABLE = no   # Breathing sleep LED during USB suspend
 NKRO_ENABLE = yes	    # USB Nkey Rollover
 BACKLIGHT_ENABLE = no
 

+ 2 - 0
keyboards/ramonimbao/wete/config.h

@@ -46,6 +46,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define RGBLED_NUM 24
 #define RGBLIGHT_ANIMATIONS
 
+#define SLEEP_LED_GPT_DRIVER GPTD1
+
 /* define if matrix has ghost */
 //#define MATRIX_HAS_GHOST
 

+ 2 - 0
keyboards/ramonimbao/wete/halconf.h

@@ -23,5 +23,7 @@
 
 #define HAL_USE_PWM TRUE
 
+#define HAL_USE_GPT TRUE
+
 #include_next <halconf.h>
 

+ 2 - 0
keyboards/ramonimbao/wete/mcuconf.h

@@ -35,3 +35,5 @@
 #undef STM32_SPI_USE_SPI2
 #define STM32_SPI_USE_SPI2 TRUE
 
+#undef STM32_GPT_USE_TIM1
+#define STM32_GPT_USE_TIM1 TRUE

+ 2 - 0
keyboards/westfoxtrot/prophet/config.h

@@ -30,3 +30,5 @@
 #define LOCKING_SUPPORT_ENABLE
 /* Locking resynchronize hack */
 #define LOCKING_RESYNC_ENABLE
+
+#define SLEEP_LED_GPT_DRIVER GPTD1

+ 27 - 0
keyboards/westfoxtrot/prophet/halconf.h

@@ -0,0 +1,27 @@
+/* Copyright 2020 QMK
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * This file was auto-generated by:
+ *    `qmk chibios-confmigrate -i keyboards/projectkb/alice/halconf.h -r platforms/chibios/common/configs/halconf.h`
+ */
+
+#pragma once
+
+#define HAL_USE_GPT TRUE
+
+#include_next <halconf.h>
+

+ 2 - 3
keyboards/westfoxtrot/prophet/mcuconf.h

@@ -23,6 +23,5 @@
 
 #include_next <mcuconf.h>
 
-#undef STM32_PWM_USE_TIM3
-#define STM32_PWM_USE_TIM3 TRUE
-
+#undef STM32_GPT_USE_TIM1
+#define STM32_GPT_USE_TIM1 TRUE

+ 33 - 55
tmk_core/common/chibios/sleep_led.c

@@ -9,21 +9,13 @@
  * Use LP timer on Kinetises, TIM14 on STM32F0.
  */
 
-#if defined(KL2x) || defined(K20x)
-
-/* Use Low Power Timer (LPTMR) */
-#    define TIMER_INTERRUPT_VECTOR KINETIS_LPTMR0_IRQ_VECTOR
-#    define RESET_COUNTER LPTMR0->CSR |= LPTMRx_CSR_TCF
-
-#elif defined(STM32F0XX)
-
-/* Use TIM14 manually */
-#    define TIMER_INTERRUPT_VECTOR STM32_TIM14_HANDLER
-#    define RESET_COUNTER STM32_TIM14->SR &= ~STM32_TIM_SR_UIF
-
+#ifndef SLEEP_LED_GPT_DRIVER
+#    if defined(STM32F0XX)
+#        define SLEEP_LED_GPT_DRIVER GPTD14
+#    endif
 #endif
 
-#if defined(KL2x) || defined(K20x) || defined(STM32F0XX) /* common parts for timers/interrupts */
+#if defined(KL2x) || defined(K20x) || defined(SLEEP_LED_GPT_DRIVER) /* common parts for timers/interrupts */
 
 /* Breathing Sleep LED brighness(PWM On period) table
  * (64[steps] * 4[duration]) / 64[PWM periods/s] = 4 second breath cycle
@@ -33,10 +25,7 @@
  */
 static const uint8_t breathing_table[64] = {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};
 
-/* interrupt handler */
-OSAL_IRQ_HANDLER(TIMER_INTERRUPT_VECTOR) {
-    OSAL_IRQ_PROLOGUE();
-
+void sleep_led_timer_callback(void) {
     /* Software PWM
      * timer:1111 1111 1111 1111
      *       \_____/\/ \_______/____  count(0-255)
@@ -64,17 +53,16 @@ OSAL_IRQ_HANDLER(TIMER_INTERRUPT_VECTOR) {
     if (timer.pwm.count == breathing_table[timer.pwm.index]) {
         led_set(0);
     }
-
-    /* Reset the counter */
-    RESET_COUNTER;
-
-    OSAL_IRQ_EPILOGUE();
 }
 
 #endif /* common parts for known platforms */
 
 #if defined(KL2x) || defined(K20x) /* platform selection: familiar Kinetis chips */
 
+/* Use Low Power Timer (LPTMR) */
+#    define TIMER_INTERRUPT_VECTOR KINETIS_LPTMR0_IRQ_VECTOR
+#    define RESET_COUNTER LPTMR0->CSR |= LPTMRx_CSR_TCF
+
 /* LPTMR clock options */
 #    define LPTMR_CLOCK_MCGIRCLK 0 /* 4MHz clock */
 #    define LPTMR_CLOCK_LPO 1      /* 1kHz clock */
@@ -86,6 +74,18 @@ OSAL_IRQ_HANDLER(TIMER_INTERRUPT_VECTOR) {
 #        define SIM_SCGC5_LPTMR SIM_SCGC5_LPTIMER
 #    endif
 
+/* interrupt handler */
+OSAL_IRQ_HANDLER(TIMER_INTERRUPT_VECTOR) {
+    OSAL_IRQ_PROLOGUE();
+
+    sleep_led_timer_callback();
+
+    /* Reset the counter */
+    RESET_COUNTER;
+
+    OSAL_IRQ_EPILOGUE();
+}
+
 /* Initialise the timer */
 void sleep_led_init(void) {
     /* Make sure the clock to the LPTMR is enabled */
@@ -159,45 +159,23 @@ void sleep_led_toggle(void) {
     LPTMR0->CSR ^= LPTMRx_CSR_TEN;
 }
 
-#elif defined(STM32F0XX) /* platform selection: STM32F0XX */
-
-/* Initialise the timer */
-void sleep_led_init(void) {
-    /* enable clock */
-    rccEnableTIM14(FALSE); /* low power enable = FALSE */
-    rccResetTIM14();
-
-    /* prescale */
-    /* Assuming 48MHz internal clock */
-    /* getting cca 65484 irqs/sec */
-    STM32_TIM14->PSC = 733;
+#elif defined(SLEEP_LED_GPT_DRIVER)
 
-    /* auto-reload */
-    /* 0 => interrupt every time */
-    STM32_TIM14->ARR = 3;
+static void gptTimerCallback(GPTDriver *gptp) {
+    (void)gptp;
+    sleep_led_timer_callback();
+}
 
-    /* enable counter update event interrupt */
-    STM32_TIM14->DIER |= STM32_TIM_DIER_UIE;
+static const GPTConfig gptcfg = {1000000, gptTimerCallback, 0, 0};
 
-    /* register interrupt vector */
-    nvicEnableVector(STM32_TIM14_NUMBER, 2); /* vector, priority */
-}
+/* Initialise the timer */
+void sleep_led_init(void) { gptStart(&SLEEP_LED_GPT_DRIVER, &gptcfg); }
 
-void sleep_led_enable(void) {
-    /* Enable the timer */
-    STM32_TIM14->CR1 = STM32_TIM_CR1_CEN | STM32_TIM_CR1_URS;
-    /* URS => update event only on overflow; setting UG bit disabled */
-}
+void sleep_led_enable(void) { gptStartContinuous(&SLEEP_LED_GPT_DRIVER, gptcfg.frequency / 0xFFFF); }
 
-void sleep_led_disable(void) {
-    /* Disable the timer */
-    STM32_TIM14->CR1 = 0;
-}
+void sleep_led_disable(void) { gptStopTimer(&SLEEP_LED_GPT_DRIVER); }
 
-void sleep_led_toggle(void) {
-    /* Toggle the timer */
-    STM32_TIM14->CR1 ^= STM32_TIM_CR1_CEN;
-}
+void sleep_led_toggle(void) { (SLEEP_LED_GPT_DRIVER.state == GPT_READY) ? sleep_led_enable() : sleep_led_disable(); }
 
 #else /* platform selection: not on familiar chips */