summaryrefslogtreecommitdiffstats
path: root/quantum/quantum.h
diff options
context:
space:
mode:
Diffstat (limited to 'quantum/quantum.h')
-rw-r--r--quantum/quantum.h62
1 files changed, 61 insertions, 1 deletions
diff --git a/quantum/quantum.h b/quantum/quantum.h
index 0e452a062d..cb0af306ac 100644
--- a/quantum/quantum.h
+++ b/quantum/quantum.h
@@ -31,7 +31,7 @@
#ifdef BACKLIGHT_ENABLE
# ifdef LED_MATRIX_ENABLE
-# include "ledmatrix.h"
+# include "led_matrix.h"
# else
# include "backlight.h"
# endif
@@ -68,6 +68,11 @@ extern layer_state_t default_layer_state;
extern layer_state_t layer_state;
#endif
+#if defined(SEQUENCER_ENABLE)
+# include "sequencer.h"
+# include "process_sequencer.h"
+#endif
+
#if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED)
# include "process_midi.h"
#endif
@@ -220,6 +225,61 @@ typedef ioline_t pin_t;
# define togglePin(pin) palToggleLine(pin)
#endif
+// Atomic macro to help make GPIO and other controls atomic.
+#ifdef IGNORE_ATOMIC_BLOCK
+/* do nothing atomic macro */
+# define ATOMIC_BLOCK for (uint8_t __ToDo = 1; __ToDo; __ToDo = 0)
+# define ATOMIC_BLOCK_RESTORESTATE ATOMIC_BLOCK
+# define ATOMIC_BLOCK_FORCEON ATOMIC_BLOCK
+
+#elif defined(__AVR__)
+/* atomic macro for AVR */
+# include <util/atomic.h>
+
+# define ATOMIC_BLOCK_RESTORESTATE ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+# define ATOMIC_BLOCK_FORCEON ATOMIC_BLOCK(ATOMIC_FORCEON)
+
+#elif defined(PROTOCOL_CHIBIOS) || defined(PROTOCOL_ARM_ATSAM)
+/* atomic macro for ChibiOS / ARM ATSAM */
+# if defined(PROTOCOL_ARM_ATSAM)
+# include "arm_atsam_protocol.h"
+# endif
+
+static __inline__ uint8_t __interrupt_disable__(void) {
+# if defined(PROTOCOL_CHIBIOS)
+ chSysLock();
+# endif
+# if defined(PROTOCOL_ARM_ATSAM)
+ __disable_irq();
+# endif
+ return 1;
+}
+
+static __inline__ void __interrupt_enable__(const uint8_t *__s) {
+# if defined(PROTOCOL_CHIBIOS)
+ chSysUnlock();
+# endif
+# if defined(PROTOCOL_ARM_ATSAM)
+ __enable_irq();
+# endif
+ __asm__ volatile("" ::: "memory");
+ (void)__s;
+}
+
+# define ATOMIC_BLOCK(type) for (type, __ToDo = __interrupt_disable__(); __ToDo; __ToDo = 0)
+# define ATOMIC_FORCEON uint8_t sreg_save __attribute__((__cleanup__(__interrupt_enable__))) = 0
+
+# define ATOMIC_BLOCK_RESTORESTATE _Static_assert(0, "ATOMIC_BLOCK_RESTORESTATE dose not implement")
+# define ATOMIC_BLOCK_FORCEON ATOMIC_BLOCK(ATOMIC_FORCEON)
+
+/* Other platform */
+#else
+
+# define ATOMIC_BLOCK_RESTORESTATE _Static_assert(0, "ATOMIC_BLOCK_RESTORESTATE dose not implement")
+# define ATOMIC_BLOCK_FORCEON _Static_assert(0, "ATOMIC_BLOCK_FORCEON dose not implement")
+
+#endif
+
#define SEND_STRING(string) send_string_P(PSTR(string))
#define SEND_STRING_DELAY(string, interval) send_string_with_delay_P(PSTR(string), interval)