diff --git a/common_features.mk b/common_features.mk
index bd88e04d62..97febe2e77 100644
--- a/common_features.mk
+++ b/common_features.mk
@@ -263,6 +263,11 @@ ifneq ($(strip $(CUSTOM_MATRIX)), yes)
endif
ifeq ($(strip $(SPLIT_KEYBOARD)), yes)
+ SERIAL_BACKWARD_COMPAT := $(wildcard $(QUANTUM_DIR)/split_common/serial_backward_compatibility.h)
+ ifneq ($(SERIAL_BACKWARD_COMPAT),)
+ CONFIG_H += $(SERIAL_BACKWARD_COMPAT)
+ # $(info CONFIG_H=$(CONFIG_H))
+ endif
OPT_DEFS += -DSPLIT_KEYBOARD
QUANTUM_SRC += $(QUANTUM_DIR)/split_common/split_flags.c \
$(QUANTUM_DIR)/split_common/split_util.c \
diff --git a/docs/config_options.md b/docs/config_options.md
index 69fecc8b49..bea4acb010 100644
--- a/docs/config_options.md
+++ b/docs/config_options.md
@@ -198,6 +198,9 @@ Split Keyboard specific options, make sure you have 'SPLIT_KEYBOARD = yes' in yo
* `#define USE_I2C`
* For using I2C instead of Serial (defaults to serial)
+* `#define SOFT_SERIAL_PIN D0`
+ * When using serial, define this. `D0` or `D1`,`D2`,`D3`,`E6`.
+
# The `rules.mk` File
This is a [make](https://www.gnu.org/software/make/manual/make.html) file that is included by the top-level `Makefile`. It is used to set some information about the MCU that we will be compiling for as well as enabling and disabling certain features.
diff --git a/keyboards/40percentclub/25/config.h b/keyboards/40percentclub/25/config.h
index 23b768e153..7fe59fcca0 100644
--- a/keyboards/40percentclub/25/config.h
+++ b/keyboards/40percentclub/25/config.h
@@ -27,6 +27,8 @@
#define DESCRIPTION A split 50 key keyboard
#define USE_SERIAL
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D0
/* Select hand configuration */
#define MASTER_LEFT
diff --git a/keyboards/40percentclub/6lit/config.h b/keyboards/40percentclub/6lit/config.h
index 8397818a61..940518f365 100644
--- a/keyboards/40percentclub/6lit/config.h
+++ b/keyboards/40percentclub/6lit/config.h
@@ -28,6 +28,9 @@
#define USE_SERIAL
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D0
+
/* Select hand configuration */
#define MASTER_LEFT
//#define MASTER_RIGHT
diff --git a/keyboards/40percentclub/foobar/config.h b/keyboards/40percentclub/foobar/config.h
index 89219c4607..88075c4560 100644
--- a/keyboards/40percentclub/foobar/config.h
+++ b/keyboards/40percentclub/foobar/config.h
@@ -28,6 +28,9 @@
#define USE_SERIAL
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D0
+
/* Select hand configuration */
#define MASTER_LEFT
//#define MASTER_RIGHT
diff --git a/keyboards/diverge3/config.h b/keyboards/diverge3/config.h
index 262be7b757..464dc835ff 100644
--- a/keyboards/diverge3/config.h
+++ b/keyboards/diverge3/config.h
@@ -57,6 +57,9 @@ along with this program. If not, see .
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCING_DELAY 5
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D0
+
/* define if matrix has ghost (lacks anti-ghosting diodes) */
//#define MATRIX_HAS_GHOST
diff --git a/keyboards/divergetm2/config.h b/keyboards/divergetm2/config.h
index 8bc9d2c803..cbeeff9aa8 100644
--- a/keyboards/divergetm2/config.h
+++ b/keyboards/divergetm2/config.h
@@ -59,6 +59,9 @@
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D0
+
/*
* Magic Key Options
*
diff --git a/keyboards/ergotravel/rev1/config.h b/keyboards/ergotravel/rev1/config.h
index 3af1147a7a..e6d557361c 100644
--- a/keyboards/ergotravel/rev1/config.h
+++ b/keyboards/ergotravel/rev1/config.h
@@ -56,6 +56,9 @@ along with this program. If not, see .
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D0
+
#define BACKLIGHT_PIN B5
#define BACKLIGHT_LEVELS 5
diff --git a/keyboards/handwired/dactyl_manuform/config.h b/keyboards/handwired/dactyl_manuform/config.h
index 320ce3c482..0e6f3f98ed 100644
--- a/keyboards/handwired/dactyl_manuform/config.h
+++ b/keyboards/handwired/dactyl_manuform/config.h
@@ -38,6 +38,9 @@ along with this program. If not, see .
/* Set 0 if debouncing isn't needed */
#define DEBOUNCING_DELAY 5
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D0
+
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
diff --git a/keyboards/handwired/qc60/config.h b/keyboards/handwired/qc60/config.h
index 3b6f84390b..00d095ddf1 100644
--- a/keyboards/handwired/qc60/config.h
+++ b/keyboards/handwired/qc60/config.h
@@ -18,6 +18,9 @@
/* Set 0 if debouncing isn't needed */
#define DEBOUNCING_DELAY 5
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D0
+
/* key combination for command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
diff --git a/keyboards/handwired/xealous/config.h b/keyboards/handwired/xealous/config.h
index 415a0dcf5b..7bce502c15 100644
--- a/keyboards/handwired/xealous/config.h
+++ b/keyboards/handwired/xealous/config.h
@@ -21,10 +21,13 @@ along with this program. If not, see .
/* Use I2C or Serial, not both */
-// #define USE_SERIAL
#define USE_I2C
#define SCL_CLOCK 400000UL
+// #define USE_SERIAL
+/* serial.c configuration for split keyboard */
+// #define SOFT_SERIAL_PIN D0
+
/* Select hand configuration */
#define MASTER_LEFT
diff --git a/keyboards/iris/rev1/config.h b/keyboards/iris/rev1/config.h
index 7f76df54ba..3b31ca0d7e 100644
--- a/keyboards/iris/rev1/config.h
+++ b/keyboards/iris/rev1/config.h
@@ -48,6 +48,9 @@ along with this program. If not, see .
/* Set 0 if debouncing isn't needed */
#define DEBOUNCING_DELAY 5
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D0
+
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
diff --git a/keyboards/iris/rev1_led/config.h b/keyboards/iris/rev1_led/config.h
index b58b11836a..e9739c0031 100644
--- a/keyboards/iris/rev1_led/config.h
+++ b/keyboards/iris/rev1_led/config.h
@@ -48,6 +48,9 @@ along with this program. If not, see .
/* Set 0 if debouncing isn't needed */
#define DEBOUNCING_DELAY 5
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D0
+
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
diff --git a/keyboards/iris/rev2/config.h b/keyboards/iris/rev2/config.h
index 266c29b9c9..d43d4b1c64 100644
--- a/keyboards/iris/rev2/config.h
+++ b/keyboards/iris/rev2/config.h
@@ -48,6 +48,9 @@ along with this program. If not, see .
/* Set 0 if debouncing isn't needed */
#define DEBOUNCING_DELAY 5
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D0
+
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
diff --git a/keyboards/iris/rev3/config.h b/keyboards/iris/rev3/config.h
index 1032231d89..5642512f39 100644
--- a/keyboards/iris/rev3/config.h
+++ b/keyboards/iris/rev3/config.h
@@ -48,6 +48,9 @@ along with this program. If not, see .
/* Set 0 if debouncing isn't needed */
#define DEBOUNCING_DELAY 5
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D0
+
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
diff --git a/keyboards/lets_split_eh/config.h b/keyboards/lets_split_eh/config.h
index b8fe95ea2b..abfee0eace 100644
--- a/keyboards/lets_split_eh/config.h
+++ b/keyboards/lets_split_eh/config.h
@@ -36,6 +36,9 @@ along with this program. If not, see .
/* Set 0 if debouncing isn't needed */
#define DEBOUNCING_DELAY 5
+/* serial.c configuration for split keyboard */
+//#define SOFT_SERIAL_PIN D0
+
/* key combination for command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
diff --git a/keyboards/levinson/rev1/config.h b/keyboards/levinson/rev1/config.h
index 8161b4e32f..07ba1e221e 100644
--- a/keyboards/levinson/rev1/config.h
+++ b/keyboards/levinson/rev1/config.h
@@ -41,6 +41,9 @@ along with this program. If not, see .
/* Set 0 if debouncing isn't needed */
#define DEBOUNCING_DELAY 5
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D0
+
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
diff --git a/keyboards/levinson/rev2/config.h b/keyboards/levinson/rev2/config.h
index 03b98b45c1..a731c71955 100644
--- a/keyboards/levinson/rev2/config.h
+++ b/keyboards/levinson/rev2/config.h
@@ -41,6 +41,9 @@ along with this program. If not, see .
/* Set 0 if debouncing isn't needed */
#define DEBOUNCING_DELAY 5
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D0
+
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
diff --git a/keyboards/miniaxe/config.h b/keyboards/miniaxe/config.h
index 13608feab2..2b732ca16f 100644
--- a/keyboards/miniaxe/config.h
+++ b/keyboards/miniaxe/config.h
@@ -237,6 +237,9 @@ along with this program. If not, see .
/* Serial settings */
#define USE_SERIAL
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D0
+
//#define EE_HANDS
#define I2C_MASTER_LEFT
//#define I2C_MASTER_RIGHT
diff --git a/keyboards/nyquist/rev1/config.h b/keyboards/nyquist/rev1/config.h
index 35fbaffb96..892054b733 100644
--- a/keyboards/nyquist/rev1/config.h
+++ b/keyboards/nyquist/rev1/config.h
@@ -46,6 +46,9 @@ along with this program. If not, see .
/* Set 0 if debouncing isn't needed */
#define DEBOUNCING_DELAY 5
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D0
+
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
diff --git a/keyboards/nyquist/rev2/config.h b/keyboards/nyquist/rev2/config.h
index 7dc743b275..21aea0aada 100644
--- a/keyboards/nyquist/rev2/config.h
+++ b/keyboards/nyquist/rev2/config.h
@@ -43,6 +43,9 @@ along with this program. If not, see .
/* Set 0 if debouncing isn't needed */
#define DEBOUNCING_DELAY 5
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D0
+
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
diff --git a/keyboards/nyquist/rev3/config.h b/keyboards/nyquist/rev3/config.h
index 6c51bc9a80..8054ba79c2 100644
--- a/keyboards/nyquist/rev3/config.h
+++ b/keyboards/nyquist/rev3/config.h
@@ -43,6 +43,9 @@ along with this program. If not, see .
/* Set 0 if debouncing isn't needed */
#define DEBOUNCING_DELAY 5
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D0
+
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
diff --git a/keyboards/quefrency/rev1/config.h b/keyboards/quefrency/rev1/config.h
index 1074590ff5..88d7044864 100644
--- a/keyboards/quefrency/rev1/config.h
+++ b/keyboards/quefrency/rev1/config.h
@@ -41,6 +41,9 @@ along with this program. If not, see .
/* Set 0 if debouncing isn't needed */
#define DEBOUNCING_DELAY 5
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D0
+
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
diff --git a/keyboards/qwertyydox/config.h b/keyboards/qwertyydox/config.h
index b22ca534e3..a685652230 100644
--- a/keyboards/qwertyydox/config.h
+++ b/keyboards/qwertyydox/config.h
@@ -49,6 +49,9 @@ along with this program. If not, see .
/* Set 0 if debouncing isn't needed */
#define DEBOUNCING_DELAY 5
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D0
+
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
diff --git a/keyboards/qwertyydox/rev1/config.h b/keyboards/qwertyydox/rev1/config.h
index 3d4c9b0d00..a2557592d3 100644
--- a/keyboards/qwertyydox/rev1/config.h
+++ b/keyboards/qwertyydox/rev1/config.h
@@ -49,6 +49,9 @@ along with this program. If not, see .
/* Set 0 if debouncing isn't needed */
#define DEBOUNCING_DELAY 5
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D0
+
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
diff --git a/keyboards/redox/rev1/config.h b/keyboards/redox/rev1/config.h
index f4ccbd2fd5..654a84de74 100644
--- a/keyboards/redox/rev1/config.h
+++ b/keyboards/redox/rev1/config.h
@@ -49,6 +49,9 @@ along with this program. If not, see .
/* Set 0 if debouncing isn't needed */
#define DEBOUNCING_DELAY 5
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D0
+
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
diff --git a/keyboards/rorschach/rev1/config.h b/keyboards/rorschach/rev1/config.h
index 1c9ef8276c..1ea6dde98d 100644
--- a/keyboards/rorschach/rev1/config.h
+++ b/keyboards/rorschach/rev1/config.h
@@ -42,6 +42,9 @@ along with this program. If not, see .
/* Set 0 if debouncing isn't needed */
#define DEBOUNCING_DELAY 5
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D0
+
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
diff --git a/quantum/split_common/serial.c b/quantum/split_common/serial.c
index 74bcbb6bf6..f34f824d7d 100644
--- a/quantum/split_common/serial.c
+++ b/quantum/split_common/serial.c
@@ -14,6 +14,59 @@
#ifndef USE_I2C
+#ifndef SOFT_SERIAL_PIN
+ #error quantum/split_common/serial.c need SOFT_SERIAL_PIN define
+#endif
+
+#ifdef __AVR_ATmega32U4__
+ // if using ATmega32U4 I2C, can not use PD0 and PD1 in soft serial.
+ #ifdef USE_I2C
+ #if SOFT_SERIAL_PIN == D0 || SOFT_SERIAL_PIN == D1
+ #error Using ATmega32U4 I2C, so can not use PD0, PD1
+ #endif
+ #endif
+
+ #if SOFT_SERIAL_PIN >= D0 && SOFT_SERIAL_PIN <= D3
+ #define SERIAL_PIN_DDR DDRD
+ #define SERIAL_PIN_PORT PORTD
+ #define SERIAL_PIN_INPUT PIND
+ #if SOFT_SERIAL_PIN == D0
+ #define SERIAL_PIN_MASK _BV(PD0)
+ #define EIMSK_BIT _BV(INT0)
+ #define EICRx_BIT (~(_BV(ISC00) | _BV(ISC01)))
+ #define SERIAL_PIN_INTERRUPT INT0_vect
+ #elif SOFT_SERIAL_PIN == D1
+ #define SERIAL_PIN_MASK _BV(PD1)
+ #define EIMSK_BIT _BV(INT1)
+ #define EICRx_BIT (~(_BV(ISC10) | _BV(ISC11)))
+ #define SERIAL_PIN_INTERRUPT INT1_vect
+ #elif SOFT_SERIAL_PIN == D2
+ #define SERIAL_PIN_MASK _BV(PD2)
+ #define EIMSK_BIT _BV(INT2)
+ #define EICRx_BIT (~(_BV(ISC20) | _BV(ISC21)))
+ #define SERIAL_PIN_INTERRUPT INT2_vect
+ #elif SOFT_SERIAL_PIN == D3
+ #define SERIAL_PIN_MASK _BV(PD3)
+ #define EIMSK_BIT _BV(INT3)
+ #define EICRx_BIT (~(_BV(ISC30) | _BV(ISC31)))
+ #define SERIAL_PIN_INTERRUPT INT3_vect
+ #endif
+ #elif SOFT_SERIAL_PIN == E6
+ #define SERIAL_PIN_DDR DDRE
+ #define SERIAL_PIN_PORT PORTE
+ #define SERIAL_PIN_INPUT PINE
+ #define SERIAL_PIN_MASK _BV(PE6)
+ #define EIMSK_BIT _BV(INT6)
+ #define EICRx_BIT (~(_BV(ISC60) | _BV(ISC61)))
+ #define SERIAL_PIN_INTERRUPT INT6_vect
+ #else
+ #error invalid SOFT_SERIAL_PIN value
+ #endif
+
+#else
+ #error serial.c now support ATmega32U4 only
+#endif
+
// Serial pulse period in microseconds. Its probably a bad idea to lower this
// value.
#define SERIAL_DELAY 24
diff --git a/quantum/split_common/serial.h b/quantum/split_common/serial.h
index e566eb8a06..0b99f352d0 100644
--- a/quantum/split_common/serial.h
+++ b/quantum/split_common/serial.h
@@ -1,21 +1,18 @@
#ifndef MY_SERIAL_H
#define MY_SERIAL_H
-#include "config.h"
#include
-/* TODO: some defines for interrupt setup */
-#define SERIAL_PIN_DDR DDRD
-#define SERIAL_PIN_PORT PORTD
-#define SERIAL_PIN_INPUT PIND
-#define SERIAL_PIN_MASK _BV(PD0)
-#define SERIAL_PIN_INTERRUPT INT0_vect
-
-#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2
-#define SERIAL_MASTER_BUFFER_LENGTH 1
-
-// Address location defines
-#define SERIAL_BACKLIT_START 0x00
+// /////////////////////////////////////////////////////////////////
+// Need Soft Serial defines in config.h
+// /////////////////////////////////////////////////////////////////
+// ex.
+// /* Configuration of lower interface with the lower layer(hardware) of serial.c */
+// #define SOFT_SERIAL_PIN ?? // ?? = D0,D1,D2,D3,E6
+//
+// /* Configuration of upper interface with the upper layer of serial.c */
+// #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2
+// #define SERIAL_MASTER_BUFFER_LENGTH 1
// Buffers for master - slave communication
extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH];
diff --git a/quantum/split_common/serial_backward_compatibility.h b/quantum/split_common/serial_backward_compatibility.h
new file mode 100644
index 0000000000..216b6c41ff
--- /dev/null
+++ b/quantum/split_common/serial_backward_compatibility.h
@@ -0,0 +1,11 @@
+/* serial.h backward compatibility */
+
+// #ifndef SOFT_SERIAL_PIN
+// #define SOFT_SERIAL_PIN D0
+// #endif
+
+#ifndef SERIAL_SLAVE_BUFFER_LENGTH
+ #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2
+ #define SERIAL_MASTER_BUFFER_LENGTH 1
+#endif
+
diff --git a/quantum/split_common/split_util.h b/quantum/split_common/split_util.h
index d6cf3e72a9..45e8db0f2f 100644
--- a/quantum/split_common/split_util.h
+++ b/quantum/split_common/split_util.h
@@ -7,6 +7,9 @@
#include
#include "eeconfig.h"
+// backlight level store index in serial_master_buffer[] for slave to read
+#define SERIAL_BACKLIT_START 0x00
+
#define SLAVE_I2C_ADDRESS 0x32
extern volatile bool isLeftHand;
diff --git a/quantum/template/avr/config.h b/quantum/template/avr/config.h
index 463ddff2db..eed50e5c04 100644
--- a/quantum/template/avr/config.h
+++ b/quantum/template/avr/config.h
@@ -48,6 +48,11 @@ along with this program. If not, see .
/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */
#define DIODE_DIRECTION COL2ROW
+/*
+ * Split Keyboard specific options, make sure you have 'SPLIT_KEYBOARD = yes' in your rules.mk, and define SOFT_SERIAL_PIN.
+ */
+#define SOFT_SERIAL_PIN D0 // or D1, D2, D3, E6
+
// #define BACKLIGHT_PIN B7
// #define BACKLIGHT_BREATHING
// #define BACKLIGHT_LEVELS 3