Browse Source

Merge remote-tracking branch 'origin/develop' into xap

zvecr 2 years ago
parent
commit
60cf8ba553
100 changed files with 4079 additions and 74 deletions
  1. 11 0
      data/mappings/info_config.hjson
  2. 1 0
      data/mappings/info_rules.hjson
  3. 58 8
      data/schemas/keyboard.jsonschema
  4. 24 0
      docs/reference_info_json.md
  5. 10 1
      drivers/led/aw20216s.c
  6. 6 1
      drivers/led/aw20216s.h
  7. 10 2
      drivers/led/issi/is31fl3218-simple.c
  8. 5 1
      drivers/led/issi/is31fl3218-simple.h
  9. 10 2
      drivers/led/issi/is31fl3218.c
  10. 5 1
      drivers/led/issi/is31fl3218.h
  11. 32 2
      drivers/led/issi/is31fl3731-simple.c
  12. 6 1
      drivers/led/issi/is31fl3731-simple.h
  13. 32 2
      drivers/led/issi/is31fl3731.c
  14. 6 1
      drivers/led/issi/is31fl3731.h
  15. 45 2
      drivers/led/issi/is31fl3733-simple.c
  16. 10 1
      drivers/led/issi/is31fl3733-simple.h
  17. 45 2
      drivers/led/issi/is31fl3733.c
  18. 10 1
      drivers/led/issi/is31fl3733.h
  19. 32 2
      drivers/led/issi/is31fl3736-simple.c
  20. 6 1
      drivers/led/issi/is31fl3736-simple.h
  21. 32 2
      drivers/led/issi/is31fl3736.c
  22. 6 1
      drivers/led/issi/is31fl3736.h
  23. 32 2
      drivers/led/issi/is31fl3737-simple.c
  24. 6 1
      drivers/led/issi/is31fl3737-simple.h
  25. 32 2
      drivers/led/issi/is31fl3737.c
  26. 6 1
      drivers/led/issi/is31fl3737.h
  27. 32 2
      drivers/led/issi/is31fl3741-simple.c
  28. 6 1
      drivers/led/issi/is31fl3741-simple.h
  29. 32 2
      drivers/led/issi/is31fl3741.c
  30. 6 1
      drivers/led/issi/is31fl3741.h
  31. 70 0
      drivers/led/issi/is31flcommon.c
  32. 2 0
      drivers/led/issi/is31flcommon.h
  33. 30 2
      drivers/led/snled27351-simple.c
  34. 6 1
      drivers/led/snled27351-simple.h
  35. 30 2
      drivers/led/snled27351.c
  36. 6 1
      drivers/led/snled27351.h
  37. 1 1
      keyboards/4pplet/waffling60/readme.md
  38. 1 1
      keyboards/4pplet/waffling60/rev_d/readme.md
  39. 20 0
      keyboards/4pplet/waffling60/rev_e/config.h
  40. 917 0
      keyboards/4pplet/waffling60/rev_e/info.json
  41. 40 0
      keyboards/4pplet/waffling60/rev_e/keymaps/6u_ansi/keymap.c
  42. 1 0
      keyboards/4pplet/waffling60/rev_e/keymaps/6u_ansi/rules.mk
  43. 40 0
      keyboards/4pplet/waffling60/rev_e/keymaps/6u_ansi_split_bs_rshift/keymap.c
  44. 1 0
      keyboards/4pplet/waffling60/rev_e/keymaps/6u_ansi_split_bs_rshift/rules.mk
  45. 40 0
      keyboards/4pplet/waffling60/rev_e/keymaps/6u_iso/keymap.c
  46. 1 0
      keyboards/4pplet/waffling60/rev_e/keymaps/6u_iso/rules.mk
  47. 40 0
      keyboards/4pplet/waffling60/rev_e/keymaps/6u_iso_split_bs_rshift/keymap.c
  48. 1 0
      keyboards/4pplet/waffling60/rev_e/keymaps/6u_iso_split_bs_rshift/rules.mk
  49. 40 0
      keyboards/4pplet/waffling60/rev_e/keymaps/default/keymap.c
  50. 1 0
      keyboards/4pplet/waffling60/rev_e/keymaps/default/rules.mk
  51. 40 0
      keyboards/4pplet/waffling60/rev_e/keymaps/via/keymap.c
  52. 2 0
      keyboards/4pplet/waffling60/rev_e/keymaps/via/rules.mk
  53. 37 0
      keyboards/4pplet/waffling60/rev_e/matrix_diagram.md
  54. 20 0
      keyboards/4pplet/waffling60/rev_e/readme.md
  55. 35 0
      keyboards/4pplet/waffling60/rev_e/rev_e.c
  56. 22 0
      keyboards/4pplet/waffling60/rev_e/rev_e.h
  57. 2 0
      keyboards/4pplet/waffling60/rev_e/rules.mk
  58. 20 0
      keyboards/4pplet/waffling60/rev_e_ansi/config.h
  59. 255 0
      keyboards/4pplet/waffling60/rev_e_ansi/info.json
  60. 40 0
      keyboards/4pplet/waffling60/rev_e_ansi/keymaps/default/keymap.c
  61. 1 0
      keyboards/4pplet/waffling60/rev_e_ansi/keymaps/default/rules.mk
  62. 40 0
      keyboards/4pplet/waffling60/rev_e_ansi/keymaps/via/keymap.c
  63. 2 0
      keyboards/4pplet/waffling60/rev_e_ansi/keymaps/via/rules.mk
  64. 24 0
      keyboards/4pplet/waffling60/rev_e_ansi/matrix_diagram.md
  65. 26 0
      keyboards/4pplet/waffling60/rev_e_ansi/readme.md
  66. 2 0
      keyboards/4pplet/waffling60/rev_e_ansi/rules.mk
  67. 0 1
      keyboards/acheron/apollo/87h/gamma/config.h
  68. 2 2
      keyboards/aeboards/satellite/rev1/config.h
  69. 2 2
      keyboards/aeboards/satellite/rev1/rev1.c
  70. 3 3
      keyboards/cannonkeys/is0gr/info.json
  71. 0 1
      keyboards/controllerworks/mini42/info.json
  72. 44 0
      keyboards/darkproject/kd87a_bfg_edition/config.h
  73. 23 0
      keyboards/darkproject/kd87a_bfg_edition/halconf.h
  74. 274 0
      keyboards/darkproject/kd87a_bfg_edition/info.json
  75. 174 0
      keyboards/darkproject/kd87a_bfg_edition/kd87a_bfg_edition.c
  76. 22 0
      keyboards/darkproject/kd87a_bfg_edition/kd87a_bfg_edition.h
  77. 69 0
      keyboards/darkproject/kd87a_bfg_edition/keymaps/default/keymap.c
  78. 69 0
      keyboards/darkproject/kd87a_bfg_edition/keymaps/via/keymap.c
  79. 1 0
      keyboards/darkproject/kd87a_bfg_edition/keymaps/via/rules.mk
  80. 25 0
      keyboards/darkproject/kd87a_bfg_edition/mcuconf.h
  81. 24 0
      keyboards/darkproject/kd87a_bfg_edition/readme.md
  82. 1 0
      keyboards/darkproject/kd87a_bfg_edition/rules.mk
  83. 2 1
      keyboards/eason/aeroboard/info.json
  84. 106 0
      keyboards/enter67/info.json
  85. 35 0
      keyboards/enter67/keymaps/default/keymap.c
  86. 35 0
      keyboards/enter67/keymaps/via/keymap.c
  87. 1 0
      keyboards/enter67/keymaps/via/rules.mk
  88. 26 0
      keyboards/enter67/readme.md
  89. 1 0
      keyboards/enter67/rules.mk
  90. 25 0
      keyboards/era/sirind/klein_sd/config.h
  91. 21 0
      keyboards/era/sirind/klein_sd/halconf.h
  92. 588 0
      keyboards/era/sirind/klein_sd/info.json
  93. 23 0
      keyboards/era/sirind/klein_sd/keymaps/default/keymap.c
  94. 23 0
      keyboards/era/sirind/klein_sd/keymaps/via/keymap.c
  95. 1 0
      keyboards/era/sirind/klein_sd/keymaps/via/rules.mk
  96. 22 0
      keyboards/era/sirind/klein_sd/mcuconf.h
  97. 23 0
      keyboards/era/sirind/klein_sd/readme.md
  98. 1 0
      keyboards/era/sirind/klein_sd/rules.mk
  99. 1 1
      keyboards/fallacy/config.h
  100. 2 9
      keyboards/fallacy/indicators.c

+ 11 - 0
data/mappings/info_config.hjson

@@ -45,6 +45,10 @@
     // Combos
     "COMBO_TERM": {"info_key": "combo.term", "value_type": "int"},
 
+    "DIP_SWITCH_MATRIX_GRID": {"info_key": "dip_switch.matrix_grid", "value_type": "array.array.int", "to_json": false},
+    "DIP_SWITCH_PINS": {"info_key": "dip_switch.pins", "value_type": "array"},
+    "DIP_SWITCH_PINS_RIGHT": {"info_key": "split.dip_switch.right.pins", "value_type": "array"},
+
     // Dynamic Keymap
     "DYNAMIC_KEYMAP_EEPROM_MAX_ADDR": {"info_key": "dynamic_keymap.eeprom_max_addr", "value_type": "int"},
     "DYNAMIC_KEYMAP_LAYER_COUNT": {"info_key": "dynamic_keymap.layer_count", "value_type": "int"},
@@ -150,6 +154,8 @@
     // Split Keyboard
     "SOFT_SERIAL_PIN": {"info_key": "split.soft_serial_pin"},
     "SOFT_SERIAL_SPEED": {"info_key": "split.soft_serial_speed"},
+    "SPLIT_HAND_MATRIX_GRID": {"info_key": "split.handedness.matrix_grid", "value_type": "array", "to_c": false},
+    "SPLIT_HAND_PIN": {"info_key": "split.handedness.pin"},
     "SPLIT_USB_DETECT": {"info_key": "split.usb_detect.enabled", "value_type": "bool"},
     "SPLIT_USB_TIMEOUT": {"info_key": "split.usb_detect.timeout", "value_type": "int"},
     "SPLIT_USB_TIMEOUT_POLL": {"info_key": "split.usb_detect.polling_interval", "value_type": "int"},
@@ -214,4 +220,9 @@
     "PRODUCT": {"info_key": "keyboard_name", "warn_duplicate": false, "value_type": "str", "deprecated": true, "replace_with": "`keyboard_name` in info.json"},
     "PRODUCT_ID": {"info_key": "usb.pid", "value_type": "hex", "deprecated": true, "replace_with": "`usb.pid` in info.json"},
     "VENDOR_ID": {"info_key": "usb.vid", "value_type": "hex", "deprecated": true, "replace_with": "`usb.vid` in info.json"},
+
+    // Items we want flagged in lint
+    "VIAL_KEYBOARD_UID": {"info_key": "_invalid.vial_uid", "invalid": true},
+    "VIAL_UNLOCK_COMBO_COLS": {"info_key": "_invalid.vial_unlock_cols", "invalid": true},
+    "VIAL_UNLOCK_COMBO_ROWS": {"info_key": "_invalid.vial_unlock_rows", "invalid": true}
 }

+ 1 - 0
data/mappings/info_rules.hjson

@@ -17,6 +17,7 @@
     "BOOTLOADER": {"info_key": "bootloader", "warn_duplicate": false},
     "BOOTMAGIC_ENABLE": {"info_key": "bootmagic.enabled", "value_type": "bool"},
     "CAPS_WORD_ENABLE": {"info_key": "caps_word.enabled", "value_type": "bool"},
+    "DIP_SWITCH_ENABLE": {"info_key": "dip_switch.enabled", "value_type": "bool"},
     "DEBOUNCE_TYPE": {"info_key": "build.debounce_type"},
     "EEPROM_DRIVER": {"info_key": "eeprom.driver"},
     "ENCODER_ENABLE": {"info_key": "encoder.enabled", "value_type": "bool"},

+ 58 - 8
data/schemas/keyboard.jsonschema

@@ -20,7 +20,15 @@
                     }
                 }
             }
-        }
+        },
+        "dip_switch_config": {
+            "type": "object",
+            "properties": {
+                "pins": {
+                    "$ref": "qmk.definitions.v1#/mcu_pin_array"
+                }
+            }
+        },
     },
     "type": "object",
     "not": { "required": [ "vendorId", "productId" ] }, // reject via keys...
@@ -245,6 +253,25 @@
             "type": "array",
             "items": {"$ref": "qmk.definitions.v1#/filename"}
         },
+        "dip_switch": {
+            "$ref": "#/definitions/dip_switch_config",
+            "properties": {
+                "enabled": {"type": "boolean"},
+                "matrix_grid": {
+                    "type": "array",
+                    "minItems": 1,
+                    "items": {
+                        "type": "array",
+                        "minItems": 2,
+                        "maxItems": 2,
+                        "items": {
+                            "type": "integer",
+                            "minimum": 0
+                        }
+                    }
+                }
+            }
+        },
         "eeprom": {
             "properties": {
                 "driver": {"type": "string"},
@@ -613,10 +640,6 @@
                         }
                     }
                 },
-                "matrix_grid": {
-                    "type": "array",
-                    "items": {"$ref": "qmk.definitions.v1#/mcu_pin"}
-                },
                 "matrix_pins": {
                     "type": "object",
                     "additionalProperties": false,
@@ -636,6 +659,15 @@
                         }
                     }
                 },
+                "dip_switch": {
+                    "type": "object",
+                    "additionalProperties": false,
+                    "properties": {
+                        "right": {
+                            "$ref": "#/definitions/dip_switch_config"
+                        }
+                    }
+                },
                 "encoder": {
                     "type": "object",
                     "additionalProperties": false,
@@ -645,9 +677,17 @@
                         }
                     }
                 },
-                "main": {
-                    "type": "string",
-                    "enum": ["eeprom", "left", "matrix_grid", "pin", "right"]
+                "handedness": {
+                    "type": "object",
+                    "additionalProperties": false,
+                    "properties": {
+                        "pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
+                        "matrix_grid": {
+                            "$ref": "qmk.definitions.v1#/mcu_pin_array",
+                            "minItems": 2,
+                            "maxItems": 2
+                        }
+                    }
                 },
                 "soft_serial_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
                 "soft_serial_speed": {
@@ -699,6 +739,16 @@
                         "polling_interval": {"$ref": "qmk.definitions.v1#/unsigned_int"},
                         "timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
                     }
+                },
+                "main": {
+                    "type": "string",
+                    "enum": ["eeprom", "left", "matrix_grid", "pin", "right"],
+                    "$comment": "Deprecated: use config.h options for now"
+                },
+                "matrix_grid": {
+                    "type": "array",
+                    "items": {"$ref": "qmk.definitions.v1#/mcu_pin"},
+                    "$comment": "Deprecated: use split.handedness.matrix_grid instead"
                 }
             }
         },

+ 24 - 0
docs/reference_info_json.md

@@ -201,6 +201,20 @@ Configures the [Combo](feature_combo.md) feature.
         * The amount of time to recognize a combo in milliseconds.
         * Default: `50` (50 ms)
 
+## DIP Switches :id=dip-switch
+
+Configures the [DIP Switches](feature_dip_switch.md) feature.
+
+* `dip_switch`
+    * `enabled`
+        * Enable the DIP Switches feature.
+        * Default: `false`
+    * `pins`
+        * A list of GPIO pins connected to the MCU.
+    * `matrix_grid`
+        * A list of matrix locations in the key matrix.
+        * Example: `[ [0,6], [1,6], [2,6] ]`
+
 ## EEPROM :id=eeprom
 
 Configures the [EEPROM](eeprom_driver.md) driver.
@@ -622,6 +636,10 @@ Configures the [Split Keyboard](feature_split_keyboard.md) feature.
     * `bootmagic`
         * `matrix`
             * See [Bootmagic](#bootmagic) config.
+    * `dip_switch`
+        * `right`
+            * `pins`
+                * See [DIP Switches](#dip-switch) config.
     * `enabled`
         * Enable the Split Keyboard feature.
         * Default: `false`
@@ -629,6 +647,12 @@ Configures the [Split Keyboard](feature_split_keyboard.md) feature.
         * `right`
             * `rotary`
                 * See [Encoder](#encoder) config.
+    * `handedness`
+        * `pin`
+            * The GPIO pin connected to determine handedness.
+        * `matrix_grid`
+            * The GPIO pins of the matrix position which determines the handedness.
+            * Example: `["A1", "B5"]`
     * `matrix_pins`
         * `right`
             * See [Matrix](#matrix) config.

+ 10 - 1
drivers/led/aw20216s.c

@@ -126,6 +126,15 @@ static inline void aw20216s_auto_lowpower(pin_t cs_pin) {
     aw20216s_write_register(cs_pin, AW20216S_PAGE_FUNCTION, AW20216S_REG_MIXFUNCTION, AW20216S_MIXCR_DEFAULT | AW20216S_LPEN);
 }
 
+void aw20216s_init_drivers(void) {
+    spi_init();
+
+    aw20216s_init(AW20216S_CS_PIN_1, AW20216S_EN_PIN_1);
+#if defined(AW20216S_CS_PIN_2)
+    aw20216s_init(AW20216S_CS_PIN_2, AW20216S_EN_PIN_2);
+#endif
+}
+
 void aw20216s_init(pin_t cs_pin, pin_t en_pin) {
     setPinOutput(en_pin);
     writePinHigh(en_pin);
@@ -155,7 +164,7 @@ void aw20216s_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
 }
 
 void aw20216s_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
-    for (uint8_t i = 0; i < RGB_MATRIX_LED_COUNT; i++) {
+    for (uint8_t i = 0; i < AW20216S_LED_COUNT; i++) {
         aw20216s_set_color(i, red, green, blue);
     }
 }

+ 6 - 1
drivers/led/aw20216s.h

@@ -54,6 +54,10 @@
 #define g_aw_leds g_aw20216s_leds
 // ========
 
+#if defined(RGB_MATRIX_AW20216S)
+#    define AW20216S_LED_COUNT RGB_MATRIX_LED_COUNT
+#endif
+
 typedef struct aw20216s_led_t {
     uint8_t driver : 2;
     uint8_t r;
@@ -61,8 +65,9 @@ typedef struct aw20216s_led_t {
     uint8_t b;
 } aw20216s_led_t;
 
-extern const aw20216s_led_t PROGMEM g_aw20216s_leds[RGB_MATRIX_LED_COUNT];
+extern const aw20216s_led_t PROGMEM g_aw20216s_leds[AW20216S_LED_COUNT];
 
+void aw20216s_init_drivers(void);
 void aw20216s_init(pin_t cs_pin, pin_t en_pin);
 void aw20216s_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
 void aw20216s_set_color_all(uint8_t red, uint8_t green, uint8_t blue);

+ 10 - 2
drivers/led/issi/is31fl3218-simple.c

@@ -68,6 +68,8 @@ void is31fl3218_write_pwm_buffer(uint8_t *pwm_buffer) {
 }
 
 void is31fl3218_init(void) {
+    i2c_init();
+
     // In case we ever want to reinitialize (?)
     is31fl3218_write_register(IS31FL3218_REG_RESET, 0x00);
 
@@ -86,11 +88,17 @@ void is31fl3218_init(void) {
 
     // Load PWM registers and LED Control register data
     is31fl3218_write_register(IS31FL3218_REG_UPDATE, 0x01);
+
+    for (int i = 0; i < IS31FL3218_LED_COUNT; i++) {
+        is31fl3218_set_led_control_register(i, true);
+    }
+
+    is31fl3218_update_led_control_registers();
 }
 
 void is31fl3218_set_value(int index, uint8_t value) {
     is31fl3218_led_t led;
-    if (index >= 0 && index < LED_MATRIX_LED_COUNT) {
+    if (index >= 0 && index < IS31FL3218_LED_COUNT) {
         memcpy_P(&led, (&g_is31fl3218_leds[index]), sizeof(led));
     }
     if (g_pwm_buffer[led.v - IS31FL3218_REG_PWM] == value) {
@@ -101,7 +109,7 @@ void is31fl3218_set_value(int index, uint8_t value) {
 }
 
 void is31fl3218_set_value_all(uint8_t value) {
-    for (int i = 0; i < LED_MATRIX_LED_COUNT; i++) {
+    for (int i = 0; i < IS31FL3218_LED_COUNT; i++) {
         is31fl3218_set_value(i, value);
     }
 }

+ 5 - 1
drivers/led/issi/is31fl3218-simple.h

@@ -22,11 +22,15 @@
 
 #define IS31FL3218_I2C_ADDRESS 0x54
 
+#if defined(LED_MATRIX_IS31FL3218)
+#    define IS31FL3218_LED_COUNT LED_MATRIX_LED_COUNT
+#endif
+
 typedef struct is31fl3218_led_t {
     uint8_t v;
 } __attribute__((packed)) is31fl3218_led_t;
 
-extern const is31fl3218_led_t PROGMEM g_is31fl3218_leds[LED_MATRIX_LED_COUNT];
+extern const is31fl3218_led_t PROGMEM g_is31fl3218_leds[IS31FL3218_LED_COUNT];
 
 void is31fl3218_init(void);
 

+ 10 - 2
drivers/led/issi/is31fl3218.c

@@ -68,6 +68,8 @@ void is31fl3218_write_pwm_buffer(uint8_t *pwm_buffer) {
 }
 
 void is31fl3218_init(void) {
+    i2c_init();
+
     // In case we ever want to reinitialize (?)
     is31fl3218_write_register(IS31FL3218_REG_RESET, 0x00);
 
@@ -86,11 +88,17 @@ void is31fl3218_init(void) {
 
     // Load PWM registers and LED Control register data
     is31fl3218_write_register(IS31FL3218_REG_UPDATE, 0x01);
+
+    for (int i = 0; i < IS31FL3218_LED_COUNT; i++) {
+        is31fl3218_set_led_control_register(i, true, true, true);
+    }
+
+    is31fl3218_update_led_control_registers();
 }
 
 void is31fl3218_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
     is31fl3218_led_t led;
-    if (index >= 0 && index < RGB_MATRIX_LED_COUNT) {
+    if (index >= 0 && index < IS31FL3218_LED_COUNT) {
         memcpy_P(&led, (&g_is31fl3218_leds[index]), sizeof(led));
     }
     if (g_pwm_buffer[led.r - IS31FL3218_REG_PWM] == red && g_pwm_buffer[led.g - IS31FL3218_REG_PWM] == green && g_pwm_buffer[led.b - IS31FL3218_REG_PWM] == blue) {
@@ -103,7 +111,7 @@ void is31fl3218_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
 }
 
 void is31fl3218_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
-    for (int i = 0; i < RGB_MATRIX_LED_COUNT; i++) {
+    for (int i = 0; i < IS31FL3218_LED_COUNT; i++) {
         is31fl3218_set_color(i, red, green, blue);
     }
 }

+ 5 - 1
drivers/led/issi/is31fl3218.h

@@ -22,13 +22,17 @@
 
 #define IS31FL3218_I2C_ADDRESS 0x54
 
+#if defined(RGB_MATRIX_IS31FL3218)
+#    define IS31FL3218_LED_COUNT RGB_MATRIX_LED_COUNT
+#endif
+
 typedef struct is31fl3218_led_t {
     uint8_t r;
     uint8_t g;
     uint8_t b;
 } __attribute__((packed)) is31fl3218_led_t;
 
-extern const is31fl3218_led_t PROGMEM g_is31fl3218_leds[RGB_MATRIX_LED_COUNT];
+extern const is31fl3218_led_t PROGMEM g_is31fl3218_leds[IS31FL3218_LED_COUNT];
 
 void is31fl3218_init(void);
 

+ 32 - 2
drivers/led/issi/is31fl3731-simple.c

@@ -104,6 +104,36 @@ void is31fl3731_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
     }
 }
 
+void is31fl3731_init_drivers(void) {
+    i2c_init();
+
+    is31fl3731_init(IS31FL3731_I2C_ADDRESS_1);
+#if defined(IS31FL3731_I2C_ADDRESS_2)
+    is31fl3731_init(IS31FL3731_I2C_ADDRESS_2);
+#    if defined(IS31FL3731_I2C_ADDRESS_3)
+    is31fl3731_init(IS31FL3731_I2C_ADDRESS_3);
+#        if defined(IS31FL3731_I2C_ADDRESS_4)
+    is31fl3731_init(IS31FL3731_I2C_ADDRESS_4);
+#        endif
+#    endif
+#endif
+
+    for (int i = 0; i < IS31FL3731_LED_COUNT; i++) {
+        is31fl3731_set_led_control_register(i, true);
+    }
+
+    is31fl3731_update_led_control_registers(IS31FL3731_I2C_ADDRESS_1, 0);
+#if defined(IS31FL3731_I2C_ADDRESS_2)
+    is31fl3731_update_led_control_registers(IS31FL3731_I2C_ADDRESS_2, 1);
+#    if defined(IS31FL3731_I2C_ADDRESS_3)
+    is31fl3731_update_led_control_registers(IS31FL3731_I2C_ADDRESS_3, 2);
+#        if defined(IS31FL3731_I2C_ADDRESS_4)
+    is31fl3731_update_led_control_registers(IS31FL3731_I2C_ADDRESS_4, 3);
+#        endif
+#    endif
+#endif
+}
+
 void is31fl3731_init(uint8_t addr) {
     // In order to avoid the LEDs being driven with garbage data
     // in the LED driver's PWM registers, first enable software shutdown,
@@ -161,7 +191,7 @@ void is31fl3731_init(uint8_t addr) {
 
 void is31fl3731_set_value(int index, uint8_t value) {
     is31fl3731_led_t led;
-    if (index >= 0 && index < LED_MATRIX_LED_COUNT) {
+    if (index >= 0 && index < IS31FL3731_LED_COUNT) {
         memcpy_P(&led, (&g_is31fl3731_leds[index]), sizeof(led));
 
         // Subtract 0x24 to get the second index of g_pwm_buffer
@@ -175,7 +205,7 @@ void is31fl3731_set_value(int index, uint8_t value) {
 }
 
 void is31fl3731_set_value_all(uint8_t value) {
-    for (int i = 0; i < LED_MATRIX_LED_COUNT; i++) {
+    for (int i = 0; i < IS31FL3731_LED_COUNT; i++) {
         is31fl3731_set_value(i, value);
     }
 }

+ 6 - 1
drivers/led/issi/is31fl3731-simple.h

@@ -57,13 +57,18 @@
 #define IS31FL3731_I2C_ADDRESS_SDA 0x76
 #define IS31FL3731_I2C_ADDRESS_VCC 0x77
 
+#if defined(LED_MATRIX_IS31FL3731)
+#    define IS31FL3731_LED_COUNT LED_MATRIX_LED_COUNT
+#endif
+
 typedef struct is31fl3731_led_t {
     uint8_t driver : 2;
     uint8_t v;
 } __attribute__((packed)) is31fl3731_led_t;
 
-extern const is31fl3731_led_t PROGMEM g_is31fl3731_leds[LED_MATRIX_LED_COUNT];
+extern const is31fl3731_led_t PROGMEM g_is31fl3731_leds[IS31FL3731_LED_COUNT];
 
+void is31fl3731_init_drivers(void);
 void is31fl3731_init(uint8_t addr);
 void is31fl3731_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 void is31fl3731_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);

+ 32 - 2
drivers/led/issi/is31fl3731.c

@@ -101,6 +101,36 @@ void is31fl3731_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
     }
 }
 
+void is31fl3731_init_drivers(void) {
+    i2c_init();
+
+    is31fl3731_init(IS31FL3731_I2C_ADDRESS_1);
+#if defined(IS31FL3731_I2C_ADDRESS_2)
+    is31fl3731_init(IS31FL3731_I2C_ADDRESS_2);
+#    if defined(IS31FL3731_I2C_ADDRESS_3)
+    is31fl3731_init(IS31FL3731_I2C_ADDRESS_3);
+#        if defined(IS31FL3731_I2C_ADDRESS_4)
+    is31fl3731_init(IS31FL3731_I2C_ADDRESS_4);
+#        endif
+#    endif
+#endif
+
+    for (int i = 0; i < IS31FL3731_LED_COUNT; i++) {
+        is31fl3731_set_led_control_register(i, true, true, true);
+    }
+
+    is31fl3731_update_led_control_registers(IS31FL3731_I2C_ADDRESS_1, 0);
+#if defined(IS31FL3731_I2C_ADDRESS_2)
+    is31fl3731_update_led_control_registers(IS31FL3731_I2C_ADDRESS_2, 1);
+#    if defined(IS31FL3731_I2C_ADDRESS_3)
+    is31fl3731_update_led_control_registers(IS31FL3731_I2C_ADDRESS_3, 2);
+#        if defined(IS31FL3731_I2C_ADDRESS_4)
+    is31fl3731_update_led_control_registers(IS31FL3731_I2C_ADDRESS_4, 3);
+#        endif
+#    endif
+#endif
+}
+
 void is31fl3731_init(uint8_t addr) {
     // In order to avoid the LEDs being driven with garbage data
     // in the LED driver's PWM registers, first enable software shutdown,
@@ -158,7 +188,7 @@ void is31fl3731_init(uint8_t addr) {
 
 void is31fl3731_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
     is31fl3731_led_t led;
-    if (index >= 0 && index < RGB_MATRIX_LED_COUNT) {
+    if (index >= 0 && index < IS31FL3731_LED_COUNT) {
         memcpy_P(&led, (&g_is31fl3731_leds[index]), sizeof(led));
 
         // Subtract 0x24 to get the second index of g_pwm_buffer
@@ -173,7 +203,7 @@ void is31fl3731_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
 }
 
 void is31fl3731_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
-    for (int i = 0; i < RGB_MATRIX_LED_COUNT; i++) {
+    for (int i = 0; i < IS31FL3731_LED_COUNT; i++) {
         is31fl3731_set_color(i, red, green, blue);
     }
 }

+ 6 - 1
drivers/led/issi/is31fl3731.h

@@ -56,6 +56,10 @@
 #define IS31FL3731_I2C_ADDRESS_SDA 0x76
 #define IS31FL3731_I2C_ADDRESS_VCC 0x77
 
+#if defined(RGB_MATRIX_IS31FL3731)
+#    define IS31FL3731_LED_COUNT RGB_MATRIX_LED_COUNT
+#endif
+
 typedef struct is31fl3731_led_t {
     uint8_t driver : 2;
     uint8_t r;
@@ -63,8 +67,9 @@ typedef struct is31fl3731_led_t {
     uint8_t b;
 } __attribute__((packed)) is31fl3731_led_t;
 
-extern const is31fl3731_led_t PROGMEM g_is31fl3731_leds[RGB_MATRIX_LED_COUNT];
+extern const is31fl3731_led_t PROGMEM g_is31fl3731_leds[IS31FL3731_LED_COUNT];
 
+void is31fl3731_init_drivers(void);
 void is31fl3731_init(uint8_t addr);
 void is31fl3731_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 void is31fl3731_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);

+ 45 - 2
drivers/led/issi/is31fl3733-simple.c

@@ -63,6 +63,19 @@
 #    define IS31FL3733_GLOBALCURRENT 0xFF
 #endif
 
+#ifndef IS31FL3733_SYNC_1
+#    define IS31FL3733_SYNC_1 IS31FL3733_SYNC_NONE
+#endif
+#ifndef IS31FL3733_SYNC_2
+#    define IS31FL3733_SYNC_2 IS31FL3733_SYNC_NONE
+#endif
+#ifndef IS31FL3733_SYNC_3
+#    define IS31FL3733_SYNC_3 IS31FL3733_SYNC_NONE
+#endif
+#ifndef IS31FL3733_SYNC_4
+#    define IS31FL3733_SYNC_4 IS31FL3733_SYNC_NONE
+#endif
+
 // Transfer buffer for TWITransmitData()
 uint8_t g_twi_transfer_buffer[20];
 
@@ -126,6 +139,36 @@ bool is31fl3733_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
     return true;
 }
 
+void is31fl3733_init_drivers(void) {
+    i2c_init();
+
+    is31fl3733_init(IS31FL3733_I2C_ADDRESS_1, IS31FL3733_SYNC_1);
+#if defined(IS31FL3733_I2C_ADDRESS_2)
+    is31fl3733_init(IS31FL3733_I2C_ADDRESS_2, IS31FL3733_SYNC_2);
+#    if defined(IS31FL3733_I2C_ADDRESS_3)
+    is31fl3733_init(IS31FL3733_I2C_ADDRESS_3, IS31FL3733_SYNC_3);
+#        if defined(IS31FL3733_I2C_ADDRESS_4)
+    is31fl3733_init(IS31FL3733_I2C_ADDRESS_4, IS31FL3733_SYNC_4);
+#        endif
+#    endif
+#endif
+
+    for (int i = 0; i < IS31FL3733_LED_COUNT; i++) {
+        is31fl3733_set_led_control_register(i, true);
+    }
+
+    is31fl3733_update_led_control_registers(IS31FL3733_I2C_ADDRESS_1, 0);
+#if defined(IS31FL3733_I2C_ADDRESS_2)
+    is31fl3733_update_led_control_registers(IS31FL3733_I2C_ADDRESS_2, 1);
+#    if defined(IS31FL3733_I2C_ADDRESS_3)
+    is31fl3733_update_led_control_registers(IS31FL3733_I2C_ADDRESS_3, 2);
+#        if defined(IS31FL3733_I2C_ADDRESS_4)
+    is31fl3733_update_led_control_registers(IS31FL3733_I2C_ADDRESS_4, 3);
+#        endif
+#    endif
+#endif
+}
+
 void is31fl3733_init(uint8_t addr, uint8_t sync) {
     // In order to avoid the LEDs being driven with garbage data
     // in the LED driver's PWM registers, shutdown is enabled last.
@@ -174,7 +217,7 @@ void is31fl3733_init(uint8_t addr, uint8_t sync) {
 
 void is31fl3733_set_value(int index, uint8_t value) {
     is31fl3733_led_t led;
-    if (index >= 0 && index < LED_MATRIX_LED_COUNT) {
+    if (index >= 0 && index < IS31FL3733_LED_COUNT) {
         memcpy_P(&led, (&g_is31fl3733_leds[index]), sizeof(led));
 
         if (g_pwm_buffer[led.driver][led.v] == value) {
@@ -186,7 +229,7 @@ void is31fl3733_set_value(int index, uint8_t value) {
 }
 
 void is31fl3733_set_value_all(uint8_t value) {
-    for (int i = 0; i < LED_MATRIX_LED_COUNT; i++) {
+    for (int i = 0; i < IS31FL3733_LED_COUNT; i++) {
         is31fl3733_set_value(i, value);
     }
 }

+ 10 - 1
drivers/led/issi/is31fl3733-simple.h

@@ -76,13 +76,18 @@
 #define IS31FL3733_I2C_ADDRESS_VCC_SDA 0x5E
 #define IS31FL3733_I2C_ADDRESS_VCC_VCC 0x5F
 
+#if defined(LED_MATRIX_IS31FL3733)
+#    define IS31FL3733_LED_COUNT LED_MATRIX_LED_COUNT
+#endif
+
 typedef struct is31fl3733_led_t {
     uint8_t driver : 2;
     uint8_t v;
 } __attribute__((packed)) is31fl3733_led_t;
 
-extern const is31fl3733_led_t PROGMEM g_is31fl3733_leds[LED_MATRIX_LED_COUNT];
+extern const is31fl3733_led_t PROGMEM g_is31fl3733_leds[IS31FL3733_LED_COUNT];
 
+void is31fl3733_init_drivers(void);
 void is31fl3733_init(uint8_t addr, uint8_t sync);
 bool is31fl3733_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 bool is31fl3733_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
@@ -115,6 +120,10 @@ void is31fl3733_flush(void);
 #define IS31FL3733_PWM_FREQUENCY_2K1_HZ 0b011
 #define IS31FL3733_PWM_FREQUENCY_1K05_HZ 0b100
 
+#define IS31FL3733_SYNC_NONE 0b00
+#define IS31FL3733_SYNC_MASTER 0b01
+#define IS31FL3733_SYNC_SLAVE 0b10
+
 #define A_1 0x00
 #define A_2 0x01
 #define A_3 0x02

+ 45 - 2
drivers/led/issi/is31fl3733.c

@@ -62,6 +62,19 @@
 #    define IS31FL3733_GLOBALCURRENT 0xFF
 #endif
 
+#ifndef IS31FL3733_SYNC_1
+#    define IS31FL3733_SYNC_1 IS31FL3733_SYNC_NONE
+#endif
+#ifndef IS31FL3733_SYNC_2
+#    define IS31FL3733_SYNC_2 IS31FL3733_SYNC_NONE
+#endif
+#ifndef IS31FL3733_SYNC_3
+#    define IS31FL3733_SYNC_3 IS31FL3733_SYNC_NONE
+#endif
+#ifndef IS31FL3733_SYNC_4
+#    define IS31FL3733_SYNC_4 IS31FL3733_SYNC_NONE
+#endif
+
 // Transfer buffer for TWITransmitData()
 uint8_t g_twi_transfer_buffer[20];
 
@@ -125,6 +138,36 @@ bool is31fl3733_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
     return true;
 }
 
+void is31fl3733_init_drivers(void) {
+    i2c_init();
+
+    is31fl3733_init(IS31FL3733_I2C_ADDRESS_1, IS31FL3733_SYNC_1);
+#if defined(IS31FL3733_I2C_ADDRESS_2)
+    is31fl3733_init(IS31FL3733_I2C_ADDRESS_2, IS31FL3733_SYNC_2);
+#    if defined(IS31FL3733_I2C_ADDRESS_3)
+    is31fl3733_init(IS31FL3733_I2C_ADDRESS_3, IS31FL3733_SYNC_3);
+#        if defined(IS31FL3733_I2C_ADDRESS_4)
+    is31fl3733_init(IS31FL3733_I2C_ADDRESS_4, IS31FL3733_SYNC_4);
+#        endif
+#    endif
+#endif
+
+    for (int i = 0; i < IS31FL3733_LED_COUNT; i++) {
+        is31fl3733_set_led_control_register(i, true, true, true);
+    }
+
+    is31fl3733_update_led_control_registers(IS31FL3733_I2C_ADDRESS_1, 0);
+#if defined(IS31FL3733_I2C_ADDRESS_2)
+    is31fl3733_update_led_control_registers(IS31FL3733_I2C_ADDRESS_2, 1);
+#    if defined(IS31FL3733_I2C_ADDRESS_3)
+    is31fl3733_update_led_control_registers(IS31FL3733_I2C_ADDRESS_3, 2);
+#        if defined(IS31FL3733_I2C_ADDRESS_4)
+    is31fl3733_update_led_control_registers(IS31FL3733_I2C_ADDRESS_4, 3);
+#        endif
+#    endif
+#endif
+}
+
 void is31fl3733_init(uint8_t addr, uint8_t sync) {
     // In order to avoid the LEDs being driven with garbage data
     // in the LED driver's PWM registers, shutdown is enabled last.
@@ -173,7 +216,7 @@ void is31fl3733_init(uint8_t addr, uint8_t sync) {
 
 void is31fl3733_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
     is31fl3733_led_t led;
-    if (index >= 0 && index < RGB_MATRIX_LED_COUNT) {
+    if (index >= 0 && index < IS31FL3733_LED_COUNT) {
         memcpy_P(&led, (&g_is31fl3733_leds[index]), sizeof(led));
 
         if (g_pwm_buffer[led.driver][led.r] == red && g_pwm_buffer[led.driver][led.g] == green && g_pwm_buffer[led.driver][led.b] == blue) {
@@ -187,7 +230,7 @@ void is31fl3733_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
 }
 
 void is31fl3733_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
-    for (int i = 0; i < RGB_MATRIX_LED_COUNT; i++) {
+    for (int i = 0; i < IS31FL3733_LED_COUNT; i++) {
         is31fl3733_set_color(i, red, green, blue);
     }
 }

+ 10 - 1
drivers/led/issi/is31fl3733.h

@@ -99,6 +99,10 @@
 #define IS31FL3733_I2C_ADDRESS_VCC_SDA 0x5E
 #define IS31FL3733_I2C_ADDRESS_VCC_VCC 0x5F
 
+#if defined(RGB_MATRIX_IS31FL3733)
+#    define IS31FL3733_LED_COUNT RGB_MATRIX_LED_COUNT
+#endif
+
 typedef struct is31fl3733_led_t {
     uint8_t driver : 2;
     uint8_t r;
@@ -106,8 +110,9 @@ typedef struct is31fl3733_led_t {
     uint8_t b;
 } __attribute__((packed)) is31fl3733_led_t;
 
-extern const is31fl3733_led_t PROGMEM g_is31fl3733_leds[RGB_MATRIX_LED_COUNT];
+extern const is31fl3733_led_t PROGMEM g_is31fl3733_leds[IS31FL3733_LED_COUNT];
 
+void is31fl3733_init_drivers(void);
 void is31fl3733_init(uint8_t addr, uint8_t sync);
 bool is31fl3733_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 bool is31fl3733_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
@@ -140,6 +145,10 @@ void is31fl3733_flush(void);
 #define IS31FL3733_PWM_FREQUENCY_2K1_HZ 0b011
 #define IS31FL3733_PWM_FREQUENCY_1K05_HZ 0b100
 
+#define IS31FL3733_SYNC_NONE 0b00
+#define IS31FL3733_SYNC_MASTER 0b01
+#define IS31FL3733_SYNC_SLAVE 0b10
+
 #define A_1 0x00
 #define A_2 0x01
 #define A_3 0x02

+ 32 - 2
drivers/led/issi/is31fl3736-simple.c

@@ -112,6 +112,36 @@ void is31fl3736_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
     }
 }
 
+void is31fl3736_init_drivers(void) {
+    i2c_init();
+
+    is31fl3736_init(IS31FL3736_I2C_ADDRESS_1);
+#if defined(IS31FL3736_I2C_ADDRESS_2)
+    is31fl3736_init(IS31FL3736_I2C_ADDRESS_2);
+#    if defined(IS31FL3736_I2C_ADDRESS_3)
+    is31fl3736_init(IS31FL3736_I2C_ADDRESS_3);
+#        if defined(IS31FL3736_I2C_ADDRESS_4)
+    is31fl3736_init(IS31FL3736_I2C_ADDRESS_4);
+#        endif
+#    endif
+#endif
+
+    for (int i = 0; i < IS31FL3736_LED_COUNT; i++) {
+        is31fl3736_set_led_control_register(i, true);
+    }
+
+    is31fl3736_update_led_control_registers(IS31FL3736_I2C_ADDRESS_1, 0);
+#if defined(IS31FL3736_I2C_ADDRESS_2)
+    is31fl3736_update_led_control_registers(IS31FL3736_I2C_ADDRESS_2, 1);
+#    if defined(IS31FL3736_I2C_ADDRESS_3)
+    is31fl3736_update_led_control_registers(IS31FL3736_I2C_ADDRESS_3, 2);
+#        if defined(IS31FL3736_I2C_ADDRESS_4)
+    is31fl3736_update_led_control_registers(IS31FL3736_I2C_ADDRESS_4, 3);
+#        endif
+#    endif
+#endif
+}
+
 void is31fl3736_init(uint8_t addr) {
     // In order to avoid the LEDs being driven with garbage data
     // in the LED driver's PWM registers, shutdown is enabled last.
@@ -159,7 +189,7 @@ void is31fl3736_init(uint8_t addr) {
 
 void is31fl3736_set_value(int index, uint8_t value) {
     is31fl3736_led_t led;
-    if (index >= 0 && index < LED_MATRIX_LED_COUNT) {
+    if (index >= 0 && index < IS31FL3736_LED_COUNT) {
         memcpy_P(&led, (&g_is31fl3736_leds[index]), sizeof(led));
 
         if (g_pwm_buffer[led.driver][led.v] == value) {
@@ -171,7 +201,7 @@ void is31fl3736_set_value(int index, uint8_t value) {
 }
 
 void is31fl3736_set_value_all(uint8_t value) {
-    for (int i = 0; i < LED_MATRIX_LED_COUNT; i++) {
+    for (int i = 0; i < IS31FL3736_LED_COUNT; i++) {
         is31fl3736_set_value(i, value);
     }
 }

+ 6 - 1
drivers/led/issi/is31fl3736-simple.h

@@ -71,13 +71,18 @@
 #define IS31FL3736_I2C_ADDRESS_VCC_SDA 0x5E
 #define IS31FL3736_I2C_ADDRESS_VCC_VCC 0x5F
 
+#if defined(LED_MATRIX_IS31FL3736)
+#    define IS31FL3736_LED_COUNT LED_MATRIX_LED_COUNT
+#endif
+
 typedef struct is31fl3736_led_t {
     uint8_t driver : 2;
     uint8_t v;
 } __attribute__((packed)) is31fl3736_led_t;
 
-extern const is31fl3736_led_t PROGMEM g_is31fl3736_leds[LED_MATRIX_LED_COUNT];
+extern const is31fl3736_led_t PROGMEM g_is31fl3736_leds[IS31FL3736_LED_COUNT];
 
+void is31fl3736_init_drivers(void);
 void is31fl3736_init(uint8_t addr);
 void is31fl3736_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 void is31fl3736_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);

+ 32 - 2
drivers/led/issi/is31fl3736.c

@@ -112,6 +112,36 @@ void is31fl3736_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
     }
 }
 
+void is31fl3736_init_drivers(void) {
+    i2c_init();
+
+    is31fl3736_init(IS31FL3736_I2C_ADDRESS_1);
+#if defined(IS31FL3736_I2C_ADDRESS_2)
+    is31fl3736_init(IS31FL3736_I2C_ADDRESS_2);
+#    if defined(IS31FL3736_I2C_ADDRESS_3)
+    is31fl3736_init(IS31FL3736_I2C_ADDRESS_3);
+#        if defined(IS31FL3736_I2C_ADDRESS_4)
+    is31fl3736_init(IS31FL3736_I2C_ADDRESS_4);
+#        endif
+#    endif
+#endif
+
+    for (int i = 0; i < IS31FL3736_LED_COUNT; i++) {
+        is31fl3736_set_led_control_register(i, true, true, true);
+    }
+
+    is31fl3736_update_led_control_registers(IS31FL3736_I2C_ADDRESS_1, 0);
+#if defined(IS31FL3736_I2C_ADDRESS_2)
+    is31fl3736_update_led_control_registers(IS31FL3736_I2C_ADDRESS_2, 1);
+#    if defined(IS31FL3736_I2C_ADDRESS_3)
+    is31fl3736_update_led_control_registers(IS31FL3736_I2C_ADDRESS_3, 2);
+#        if defined(IS31FL3736_I2C_ADDRESS_4)
+    is31fl3736_update_led_control_registers(IS31FL3736_I2C_ADDRESS_4, 3);
+#        endif
+#    endif
+#endif
+}
+
 void is31fl3736_init(uint8_t addr) {
     // In order to avoid the LEDs being driven with garbage data
     // in the LED driver's PWM registers, shutdown is enabled last.
@@ -159,7 +189,7 @@ void is31fl3736_init(uint8_t addr) {
 
 void is31fl3736_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
     is31fl3736_led_t led;
-    if (index >= 0 && index < RGB_MATRIX_LED_COUNT) {
+    if (index >= 0 && index < IS31FL3736_LED_COUNT) {
         memcpy_P(&led, (&g_is31fl3736_leds[index]), sizeof(led));
 
         if (g_pwm_buffer[led.driver][led.r] == red && g_pwm_buffer[led.driver][led.g] == green && g_pwm_buffer[led.driver][led.b] == blue) {
@@ -173,7 +203,7 @@ void is31fl3736_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
 }
 
 void is31fl3736_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
-    for (int i = 0; i < RGB_MATRIX_LED_COUNT; i++) {
+    for (int i = 0; i < IS31FL3736_LED_COUNT; i++) {
         is31fl3736_set_color(i, red, green, blue);
     }
 }

+ 6 - 1
drivers/led/issi/is31fl3736.h

@@ -83,6 +83,10 @@
 #define IS31FL3736_I2C_ADDRESS_VCC_SDA 0x5E
 #define IS31FL3736_I2C_ADDRESS_VCC_VCC 0x5F
 
+#if defined(RGB_MATRIX_IS31FL3736)
+#    define IS31FL3736_LED_COUNT RGB_MATRIX_LED_COUNT
+#endif
+
 typedef struct is31fl3736_led_t {
     uint8_t driver : 2;
     uint8_t r;
@@ -90,8 +94,9 @@ typedef struct is31fl3736_led_t {
     uint8_t b;
 } __attribute__((packed)) is31fl3736_led_t;
 
-extern const is31fl3736_led_t PROGMEM g_is31fl3736_leds[RGB_MATRIX_LED_COUNT];
+extern const is31fl3736_led_t PROGMEM g_is31fl3736_leds[IS31FL3736_LED_COUNT];
 
+void is31fl3736_init_drivers(void);
 void is31fl3736_init(uint8_t addr);
 void is31fl3736_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 void is31fl3736_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);

+ 32 - 2
drivers/led/issi/is31fl3737-simple.c

@@ -115,6 +115,36 @@ void is31fl3737_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
     }
 }
 
+void is31fl3737_init_drivers(void) {
+    i2c_init();
+
+    is31fl3737_init(IS31FL3737_I2C_ADDRESS_1);
+#if defined(IS31FL3737_I2C_ADDRESS_2)
+    is31fl3737_init(IS31FL3737_I2C_ADDRESS_2);
+#    if defined(IS31FL3737_I2C_ADDRESS_3)
+    is31fl3737_init(IS31FL3737_I2C_ADDRESS_3);
+#        if defined(IS31FL3737_I2C_ADDRESS_4)
+    is31fl3737_init(IS31FL3737_I2C_ADDRESS_4);
+#        endif
+#    endif
+#endif
+
+    for (int i = 0; i < IS31FL3737_LED_COUNT; i++) {
+        is31fl3737_set_led_control_register(i, true);
+    }
+
+    is31fl3737_update_led_control_registers(IS31FL3737_I2C_ADDRESS_1, 0);
+#if defined(IS31FL3737_I2C_ADDRESS_2)
+    is31fl3737_update_led_control_registers(IS31FL3737_I2C_ADDRESS_2, 1);
+#    if defined(IS31FL3737_I2C_ADDRESS_3)
+    is31fl3737_update_led_control_registers(IS31FL3737_I2C_ADDRESS_3, 2);
+#        if defined(IS31FL3737_I2C_ADDRESS_4)
+    is31fl3737_update_led_control_registers(IS31FL3737_I2C_ADDRESS_4, 3);
+#        endif
+#    endif
+#endif
+}
+
 void is31fl3737_init(uint8_t addr) {
     // In order to avoid the LEDs being driven with garbage data
     // in the LED driver's PWM registers, shutdown is enabled last.
@@ -162,7 +192,7 @@ void is31fl3737_init(uint8_t addr) {
 
 void is31fl3737_set_value(int index, uint8_t value) {
     is31fl3737_led_t led;
-    if (index >= 0 && index < LED_MATRIX_LED_COUNT) {
+    if (index >= 0 && index < IS31FL3737_LED_COUNT) {
         memcpy_P(&led, (&g_is31fl3737_leds[index]), sizeof(led));
 
         if (g_pwm_buffer[led.driver][led.v] == value) {
@@ -174,7 +204,7 @@ void is31fl3737_set_value(int index, uint8_t value) {
 }
 
 void is31fl3737_set_value_all(uint8_t value) {
-    for (int i = 0; i < LED_MATRIX_LED_COUNT; i++) {
+    for (int i = 0; i < IS31FL3737_LED_COUNT; i++) {
         is31fl3737_set_value(i, value);
     }
 }

+ 6 - 1
drivers/led/issi/is31fl3737-simple.h

@@ -61,13 +61,18 @@
 #define IS31FL3737_I2C_ADDRESS_SDA 0x5A
 #define IS31FL3737_I2C_ADDRESS_VCC 0x5F
 
+#if defined(LED_MATRIX_IS31FL3737)
+#    define IS31FL3737_LED_COUNT LED_MATRIX_LED_COUNT
+#endif
+
 typedef struct is31fl3737_led_t {
     uint8_t driver : 2;
     uint8_t v;
 } __attribute__((packed)) is31fl3737_led_t;
 
-extern const is31fl3737_led_t PROGMEM g_is31fl3737_leds[LED_MATRIX_LED_COUNT];
+extern const is31fl3737_led_t PROGMEM g_is31fl3737_leds[IS31FL3737_LED_COUNT];
 
+void is31fl3737_init_drivers(void);
 void is31fl3737_init(uint8_t addr);
 void is31fl3737_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 void is31fl3737_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);

+ 32 - 2
drivers/led/issi/is31fl3737.c

@@ -115,6 +115,36 @@ void is31fl3737_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
     }
 }
 
+void is31fl3737_init_drivers(void) {
+    i2c_init();
+
+    is31fl3737_init(IS31FL3737_I2C_ADDRESS_1);
+#if defined(IS31FL3737_I2C_ADDRESS_2)
+    is31fl3737_init(IS31FL3737_I2C_ADDRESS_2);
+#    if defined(IS31FL3737_I2C_ADDRESS_3)
+    is31fl3737_init(IS31FL3737_I2C_ADDRESS_3);
+#        if defined(IS31FL3737_I2C_ADDRESS_4)
+    is31fl3737_init(IS31FL3737_I2C_ADDRESS_4);
+#        endif
+#    endif
+#endif
+
+    for (int i = 0; i < IS31FL3737_LED_COUNT; i++) {
+        is31fl3737_set_led_control_register(i, true, true, true);
+    }
+
+    is31fl3737_update_led_control_registers(IS31FL3737_I2C_ADDRESS_1, 0);
+#if defined(IS31FL3737_I2C_ADDRESS_2)
+    is31fl3737_update_led_control_registers(IS31FL3737_I2C_ADDRESS_2, 1);
+#    if defined(IS31FL3737_I2C_ADDRESS_3)
+    is31fl3737_update_led_control_registers(IS31FL3737_I2C_ADDRESS_3, 2);
+#        if defined(IS31FL3737_I2C_ADDRESS_4)
+    is31fl3737_update_led_control_registers(IS31FL3737_I2C_ADDRESS_4, 3);
+#        endif
+#    endif
+#endif
+}
+
 void is31fl3737_init(uint8_t addr) {
     // In order to avoid the LEDs being driven with garbage data
     // in the LED driver's PWM registers, shutdown is enabled last.
@@ -162,7 +192,7 @@ void is31fl3737_init(uint8_t addr) {
 
 void is31fl3737_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
     is31fl3737_led_t led;
-    if (index >= 0 && index < RGB_MATRIX_LED_COUNT) {
+    if (index >= 0 && index < IS31FL3737_LED_COUNT) {
         memcpy_P(&led, (&g_is31fl3737_leds[index]), sizeof(led));
 
         if (g_pwm_buffer[led.driver][led.r] == red && g_pwm_buffer[led.driver][led.g] == green && g_pwm_buffer[led.driver][led.b] == blue) {
@@ -176,7 +206,7 @@ void is31fl3737_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
 }
 
 void is31fl3737_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
-    for (int i = 0; i < RGB_MATRIX_LED_COUNT; i++) {
+    for (int i = 0; i < IS31FL3737_LED_COUNT; i++) {
         is31fl3737_set_color(i, red, green, blue);
     }
 }

+ 6 - 1
drivers/led/issi/is31fl3737.h

@@ -76,6 +76,10 @@
 #define IS31FL3737_I2C_ADDRESS_SDA 0x5A
 #define IS31FL3737_I2C_ADDRESS_VCC 0x5F
 
+#if defined(RGB_MATRIX_IS31FL3737)
+#    define IS31FL3737_LED_COUNT RGB_MATRIX_LED_COUNT
+#endif
+
 typedef struct is31fl3737_led_t {
     uint8_t driver : 2;
     uint8_t r;
@@ -83,8 +87,9 @@ typedef struct is31fl3737_led_t {
     uint8_t b;
 } __attribute__((packed)) is31fl3737_led_t;
 
-extern const is31fl3737_led_t PROGMEM g_is31fl3737_leds[RGB_MATRIX_LED_COUNT];
+extern const is31fl3737_led_t PROGMEM g_is31fl3737_leds[IS31FL3737_LED_COUNT];
 
+void is31fl3737_init_drivers(void);
 void is31fl3737_init(uint8_t addr);
 void is31fl3737_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 void is31fl3737_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);

+ 32 - 2
drivers/led/issi/is31fl3741-simple.c

@@ -143,6 +143,36 @@ bool is31fl3741_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
     return true;
 }
 
+void is31fl3741_init_drivers(void) {
+    i2c_init();
+
+    is31fl3741_init(IS31FL3741_I2C_ADDRESS_1);
+#if defined(IS31FL3741_I2C_ADDRESS_2)
+    is31fl3741_init(IS31FL3741_I2C_ADDRESS_2);
+#    if defined(IS31FL3741_I2C_ADDRESS_3)
+    is31fl3741_init(IS31FL3741_I2C_ADDRESS_3);
+#        if defined(IS31FL3741_I2C_ADDRESS_4)
+    is31fl3741_init(IS31FL3741_I2C_ADDRESS_4);
+#        endif
+#    endif
+#endif
+
+    for (int i = 0; i < IS31FL3741_LED_COUNT; i++) {
+        is31fl3741_set_led_control_register(i, true);
+    }
+
+    is31fl3741_update_led_control_registers(IS31FL3741_I2C_ADDRESS_1, 0);
+#if defined(IS31FL3741_I2C_ADDRESS_2)
+    is31fl3741_update_led_control_registers(IS31FL3741_I2C_ADDRESS_2, 1);
+#    if defined(IS31FL3741_I2C_ADDRESS_3)
+    is31fl3741_update_led_control_registers(IS31FL3741_I2C_ADDRESS_3, 2);
+#        if defined(IS31FL3741_I2C_ADDRESS_4)
+    is31fl3741_update_led_control_registers(IS31FL3741_I2C_ADDRESS_4, 3);
+#        endif
+#    endif
+#endif
+}
+
 void is31fl3741_init(uint8_t addr) {
     // In order to avoid the LEDs being driven with garbage data
     // in the LED driver's PWM registers, shutdown is enabled last.
@@ -174,7 +204,7 @@ void is31fl3741_init(uint8_t addr) {
 
 void is31fl3741_set_value(int index, uint8_t value) {
     is31fl3741_led_t led;
-    if (index >= 0 && index < LED_MATRIX_LED_COUNT) {
+    if (index >= 0 && index < IS31FL3741_LED_COUNT) {
         memcpy_P(&led, (&g_is31fl3741_leds[index]), sizeof(led));
 
         if (g_pwm_buffer[led.driver][led.v] == value) {
@@ -186,7 +216,7 @@ void is31fl3741_set_value(int index, uint8_t value) {
 }
 
 void is31fl3741_set_value_all(uint8_t value) {
-    for (int i = 0; i < LED_MATRIX_LED_COUNT; i++) {
+    for (int i = 0; i < IS31FL3741_LED_COUNT; i++) {
         is31fl3741_set_value(i, value);
     }
 }

+ 6 - 1
drivers/led/issi/is31fl3741-simple.h

@@ -61,13 +61,18 @@
 #define IS31FL3741_I2C_ADDRESS_SDA 0x32
 #define IS31FL3741_I2C_ADDRESS_VCC 0x33
 
+#if defined(LED_MATRIX_IS31FL3741)
+#    define IS31FL3741_LED_COUNT LED_MATRIX_LED_COUNT
+#endif
+
 typedef struct is31fl3741_led_t {
     uint32_t driver : 2;
     uint32_t v : 10;
 } __attribute__((packed)) is31fl3741_led_t;
 
-extern const is31fl3741_led_t PROGMEM g_is31fl3741_leds[RGB_MATRIX_LED_COUNT];
+extern const is31fl3741_led_t PROGMEM g_is31fl3741_leds[IS31FL3741_LED_COUNT];
 
+void is31fl3741_init_drivers(void);
 void is31fl3741_init(uint8_t addr);
 void is31fl3741_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 bool is31fl3741_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);

+ 32 - 2
drivers/led/issi/is31fl3741.c

@@ -143,6 +143,36 @@ bool is31fl3741_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
     return true;
 }
 
+void is31fl3741_init_drivers(void) {
+    i2c_init();
+
+    is31fl3741_init(IS31FL3741_I2C_ADDRESS_1);
+#if defined(IS31FL3741_I2C_ADDRESS_2)
+    is31fl3741_init(IS31FL3741_I2C_ADDRESS_2);
+#    if defined(IS31FL3741_I2C_ADDRESS_3)
+    is31fl3741_init(IS31FL3741_I2C_ADDRESS_3);
+#        if defined(IS31FL3741_I2C_ADDRESS_4)
+    is31fl3741_init(IS31FL3741_I2C_ADDRESS_4);
+#        endif
+#    endif
+#endif
+
+    for (int i = 0; i < IS31FL3741_LED_COUNT; i++) {
+        is31fl3741_set_led_control_register(i, true, true, true);
+    }
+
+    is31fl3741_update_led_control_registers(IS31FL3741_I2C_ADDRESS_1, 0);
+#if defined(IS31FL3741_I2C_ADDRESS_2)
+    is31fl3741_update_led_control_registers(IS31FL3741_I2C_ADDRESS_2, 1);
+#    if defined(IS31FL3741_I2C_ADDRESS_3)
+    is31fl3741_update_led_control_registers(IS31FL3741_I2C_ADDRESS_3, 2);
+#        if defined(IS31FL3741_I2C_ADDRESS_4)
+    is31fl3741_update_led_control_registers(IS31FL3741_I2C_ADDRESS_4, 3);
+#        endif
+#    endif
+#endif
+}
+
 void is31fl3741_init(uint8_t addr) {
     // In order to avoid the LEDs being driven with garbage data
     // in the LED driver's PWM registers, shutdown is enabled last.
@@ -174,7 +204,7 @@ void is31fl3741_init(uint8_t addr) {
 
 void is31fl3741_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
     is31fl3741_led_t led;
-    if (index >= 0 && index < RGB_MATRIX_LED_COUNT) {
+    if (index >= 0 && index < IS31FL3741_LED_COUNT) {
         memcpy_P(&led, (&g_is31fl3741_leds[index]), sizeof(led));
 
         if (g_pwm_buffer[led.driver][led.r] == red && g_pwm_buffer[led.driver][led.g] == green && g_pwm_buffer[led.driver][led.b] == blue) {
@@ -188,7 +218,7 @@ void is31fl3741_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
 }
 
 void is31fl3741_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
-    for (int i = 0; i < RGB_MATRIX_LED_COUNT; i++) {
+    for (int i = 0; i < IS31FL3741_LED_COUNT; i++) {
         is31fl3741_set_color(i, red, green, blue);
     }
 }

+ 6 - 1
drivers/led/issi/is31fl3741.h

@@ -76,6 +76,10 @@
 #define IS31FL3741_I2C_ADDRESS_SDA 0x32
 #define IS31FL3741_I2C_ADDRESS_VCC 0x33
 
+#if defined(RGB_MATRIX_IS31FL3741)
+#    define IS31FL3741_LED_COUNT RGB_MATRIX_LED_COUNT
+#endif
+
 typedef struct is31fl3741_led_t {
     uint32_t driver : 2;
     uint32_t r : 10;
@@ -83,8 +87,9 @@ typedef struct is31fl3741_led_t {
     uint32_t b : 10;
 } __attribute__((packed)) is31fl3741_led_t;
 
-extern const is31fl3741_led_t PROGMEM g_is31fl3741_leds[RGB_MATRIX_LED_COUNT];
+extern const is31fl3741_led_t PROGMEM g_is31fl3741_leds[IS31FL3741_LED_COUNT];
 
+void is31fl3741_init_drivers(void);
 void is31fl3741_init(uint8_t addr);
 void is31fl3741_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 bool is31fl3741_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);

+ 70 - 0
drivers/led/issi/is31flcommon.c

@@ -188,6 +188,41 @@ void IS31FL_common_flush(void) {
 }
 
 #ifdef RGB_MATRIX_ENABLE
+void IS31FL_RGB_init_drivers(void) {
+    i2c_init();
+
+    IS31FL_common_init(DRIVER_ADDR_1, ISSI_SSR_1);
+#    if defined(DRIVER_ADDR_2)
+    IS31FL_common_init(DRIVER_ADDR_2, ISSI_SSR_2);
+#        if defined(DRIVER_ADDR_3)
+    IS31FL_common_init(DRIVER_ADDR_3, ISSI_SSR_3);
+#            if defined(DRIVER_ADDR_4)
+    IS31FL_common_init(DRIVER_ADDR_4, ISSI_SSR_4);
+#            endif
+#        endif
+#    endif
+
+    for (int i = 0; i < RGB_MATRIX_LED_COUNT; i++) {
+        IS31FL_RGB_set_scaling_buffer(i, true, true, true);
+    }
+
+    // This actually updates the LED drivers
+#    ifdef ISSI_MANUAL_SCALING
+    IS31FL_set_manual_scaling_buffer();
+#    endif
+
+    IS31FL_common_update_scaling_register(DRIVER_ADDR_1, 0);
+#    if defined(DRIVER_ADDR_2)
+    IS31FL_common_update_scaling_register(DRIVER_ADDR_2, 1);
+#        if defined(DRIVER_ADDR_3)
+    IS31FL_common_update_scaling_register(DRIVER_ADDR_3, 2);
+#            if defined(DRIVER_ADDR_4)
+    IS31FL_common_update_scaling_register(DRIVER_ADDR_4, 3);
+#            endif
+#        endif
+#    endif
+}
+
 // Colour is set by adjusting PWM register
 void IS31FL_RGB_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
     if (index >= 0 && index < RGB_MATRIX_LED_COUNT) {
@@ -231,6 +266,41 @@ void IS31FL_RGB_set_scaling_buffer(uint8_t index, bool red, bool green, bool blu
 
 #elif defined(LED_MATRIX_ENABLE)
 // LED Matrix Specific scripts
+void IS31FL_simple_init_drivers(void) {
+    i2c_init();
+
+    IS31FL_common_init(DRIVER_ADDR_1, ISSI_SSR_1);
+#    if defined(DRIVER_ADDR_2)
+    IS31FL_common_init(DRIVER_ADDR_2, ISSI_SSR_2);
+#        if defined(DRIVER_ADDR_3)
+    IS31FL_common_init(DRIVER_ADDR_3, ISSI_SSR_3);
+#            if defined(DRIVER_ADDR_4)
+    IS31FL_common_init(DRIVER_ADDR_4, ISSI_SSR_4);
+#            endif
+#        endif
+#    endif
+
+    for (int i = 0; i < LED_MATRIX_LED_COUNT; i++) {
+        IS31FL_simple_set_scaling_buffer(i, true);
+    }
+
+// This actually updates the LED drivers
+#    ifdef ISSI_MANUAL_SCALING
+    IS31FL_set_manual_scaling_buffer();
+#    endif
+
+    IS31FL_common_update_scaling_register(DRIVER_ADDR_1, 0);
+#    if defined(DRIVER_ADDR_2)
+    IS31FL_common_update_scaling_register(DRIVER_ADDR_2, 1);
+#        if defined(DRIVER_ADDR_3)
+    IS31FL_common_update_scaling_register(DRIVER_ADDR_3, 2);
+#            if defined(DRIVER_ADDR_4)
+    IS31FL_common_update_scaling_register(DRIVER_ADDR_4, 3);
+#            endif
+#        endif
+#    endif
+}
+
 void IS31FL_simple_set_scaling_buffer(uint8_t index, bool value) {
     is31_led led;
     memcpy_P(&led, (&g_is31_leds[index]), sizeof(led));

+ 2 - 0
drivers/led/issi/is31flcommon.h

@@ -71,11 +71,13 @@ void IS31FL_common_flush(void);
 
 #ifdef RGB_MATRIX_ENABLE
 // RGB Matrix Specific scripts
+void IS31FL_RGB_init_drivers(void);
 void IS31FL_RGB_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
 void IS31FL_RGB_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
 void IS31FL_RGB_set_scaling_buffer(uint8_t index, bool red, bool green, bool blue);
 #elif defined(LED_MATRIX_ENABLE)
 // LED Matrix Specific scripts
+void IS31FL_simple_init_drivers(void);
 void IS31FL_simple_set_scaling_buffer(uint8_t index, bool value);
 void IS31FL_simple_set_brightness(int index, uint8_t value);
 void IS31FL_simple_set_brigntness_all(uint8_t value);

+ 30 - 2
drivers/led/snled27351-simple.c

@@ -99,6 +99,34 @@ bool snled27351_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
     return true;
 }
 
+void snled27351_init_drivers(void) {
+    snled27351_init(SNLED27351_I2C_ADDRESS_1);
+#if defined(SNLED27351_I2C_ADDRESS_2)
+    snled27351_init(SNLED27351_I2C_ADDRESS_2);
+#    if defined(SNLED27351_I2C_ADDRESS_3)
+    snled27351_init(SNLED27351_I2C_ADDRESS_3);
+#        if defined(SNLED27351_I2C_ADDRESS_4)
+    snled27351_init(SNLED27351_I2C_ADDRESS_4);
+#        endif
+#    endif
+#endif
+
+    for (int i = 0; i < SNLED27351_LED_COUNT; i++) {
+        snled27351_set_led_control_register(i, true);
+    }
+
+    snled27351_update_led_control_registers(SNLED27351_I2C_ADDRESS_1, 0);
+#if defined(SNLED27351_I2C_ADDRESS_2)
+    snled27351_update_led_control_registers(SNLED27351_I2C_ADDRESS_2, 1);
+#    if defined(SNLED27351_I2C_ADDRESS_3)
+    snled27351_update_led_control_registers(SNLED27351_I2C_ADDRESS_3, 2);
+#        if defined(SNLED27351_I2C_ADDRESS_4)
+    snled27351_update_led_control_registers(SNLED27351_I2C_ADDRESS_4, 3);
+#        endif
+#    endif
+#endif
+}
+
 void snled27351_init(uint8_t addr) {
     // Select to function page
     snled27351_write_register(addr, SNLED27351_REG_CONFIGURE_CMD_PAGE, SNLED27351_FUNCTION_PAGE);
@@ -147,7 +175,7 @@ void snled27351_init(uint8_t addr) {
 
 void snled27351_set_value(int index, uint8_t value) {
     snled27351_led_t led;
-    if (index >= 0 && index < LED_MATRIX_LED_COUNT) {
+    if (index >= 0 && index < SNLED27351_LED_COUNT) {
         memcpy_P(&led, (&g_snled27351_leds[index]), sizeof(led));
 
         if (g_pwm_buffer[led.driver][led.v] == value) {
@@ -159,7 +187,7 @@ void snled27351_set_value(int index, uint8_t value) {
 }
 
 void snled27351_set_value_all(uint8_t value) {
-    for (int i = 0; i < LED_MATRIX_LED_COUNT; i++) {
+    for (int i = 0; i < SNLED27351_LED_COUNT; i++) {
         snled27351_set_value(i, value);
     }
 }

+ 6 - 1
drivers/led/snled27351-simple.h

@@ -59,13 +59,18 @@
 #define SNLED27351_I2C_ADDRESS_SDA 0x76
 #define SNLED27351_I2C_ADDRESS_VDDIO 0x77
 
+#if defined(LED_MATRIX_SNLED27351)
+#    define SNLED27351_LED_COUNT LED_MATRIX_LED_COUNT
+#endif
+
 typedef struct snled27351_led_t {
     uint8_t driver : 2;
     uint8_t v;
 } __attribute__((packed)) snled27351_led_t;
 
-extern const snled27351_led_t PROGMEM g_snled27351_leds[LED_MATRIX_LED_COUNT];
+extern const snled27351_led_t PROGMEM g_snled27351_leds[SNLED27351_LED_COUNT];
 
+void snled27351_init_drivers(void);
 void snled27351_init(uint8_t addr);
 bool snled27351_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 bool snled27351_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);

+ 30 - 2
drivers/led/snled27351.c

@@ -98,6 +98,34 @@ bool snled27351_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
     return true;
 }
 
+void snled27351_init_drivers(void) {
+    snled27351_init(SNLED27351_I2C_ADDRESS_1);
+#if defined(SNLED27351_I2C_ADDRESS_2)
+    snled27351_init(SNLED27351_I2C_ADDRESS_2);
+#    if defined(SNLED27351_I2C_ADDRESS_3)
+    snled27351_init(SNLED27351_I2C_ADDRESS_3);
+#        if defined(SNLED27351_I2C_ADDRESS_4)
+    snled27351_init(SNLED27351_I2C_ADDRESS_4);
+#        endif
+#    endif
+#endif
+
+    for (int i = 0; i < SNLED27351_LED_COUNT; i++) {
+        snled27351_set_led_control_register(i, true, true, true);
+    }
+
+    snled27351_update_led_control_registers(SNLED27351_I2C_ADDRESS_1, 0);
+#if defined(SNLED27351_I2C_ADDRESS_2)
+    snled27351_update_led_control_registers(SNLED27351_I2C_ADDRESS_2, 1);
+#    if defined(SNLED27351_I2C_ADDRESS_3)
+    snled27351_update_led_control_registers(SNLED27351_I2C_ADDRESS_3, 2);
+#        if defined(SNLED27351_I2C_ADDRESS_4)
+    snled27351_update_led_control_registers(SNLED27351_I2C_ADDRESS_4, 3);
+#        endif
+#    endif
+#endif
+}
+
 void snled27351_init(uint8_t addr) {
     // Select to function page
     snled27351_write_register(addr, SNLED27351_REG_CONFIGURE_CMD_PAGE, SNLED27351_FUNCTION_PAGE);
@@ -146,7 +174,7 @@ void snled27351_init(uint8_t addr) {
 
 void snled27351_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
     snled27351_led_t led;
-    if (index >= 0 && index < RGB_MATRIX_LED_COUNT) {
+    if (index >= 0 && index < SNLED27351_LED_COUNT) {
         memcpy_P(&led, (&g_snled27351_leds[index]), sizeof(led));
 
         if (g_pwm_buffer[led.driver][led.r] == red && g_pwm_buffer[led.driver][led.g] == green && g_pwm_buffer[led.driver][led.b] == blue) {
@@ -160,7 +188,7 @@ void snled27351_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
 }
 
 void snled27351_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
-    for (int i = 0; i < RGB_MATRIX_LED_COUNT; i++) {
+    for (int i = 0; i < SNLED27351_LED_COUNT; i++) {
         snled27351_set_color(i, red, green, blue);
     }
 }

+ 6 - 1
drivers/led/snled27351.h

@@ -71,6 +71,10 @@
 #define SNLED27351_I2C_ADDRESS_SDA 0x76
 #define SNLED27351_I2C_ADDRESS_VDDIO 0x77
 
+#if defined(RGB_MATRIX_SNLED27351)
+#    define SNLED27351_LED_COUNT RGB_MATRIX_LED_COUNT
+#endif
+
 typedef struct snled27351_led_t {
     uint8_t driver : 2;
     uint8_t r;
@@ -78,8 +82,9 @@ typedef struct snled27351_led_t {
     uint8_t b;
 } __attribute__((packed)) snled27351_led_t;
 
-extern const snled27351_led_t PROGMEM g_snled27351_leds[RGB_MATRIX_LED_COUNT];
+extern const snled27351_led_t PROGMEM g_snled27351_leds[SNLED27351_LED_COUNT];
 
+void snled27351_init_drivers(void);
 void snled27351_init(uint8_t addr);
 bool snled27351_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 bool snled27351_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);

+ 1 - 1
keyboards/4pplet/waffling60/readme.md

@@ -12,8 +12,8 @@ Make example for this keyboard (after setting up your build environment):
     make 4pplet/waffling60/rev_a:default
     make 4pplet/waffling60/rev_b:default
     make 4pplet/waffling60/rev_c:default
-    
     make 4pplet/waffling60/rev_d:default
+    make 4pplet/waffling60/rev_e:default
     make 4pplet/waffling60/rev_d_ansi:default
     make 4pplet/waffling60/rev_d_iso:default
 

+ 1 - 1
keyboards/4pplet/waffling60/rev_d/readme.md

@@ -9,7 +9,7 @@ More info: https://geekhack.org/index.php?topic=103531.0
 
 Make example for this keyboard (after setting up your build environment):
 
-    make 4pplet/waffling60/rev_c:default
+    make 4pplet/waffling60/rev_d:default
 
 See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
 

+ 20 - 0
keyboards/4pplet/waffling60/rev_e/config.h

@@ -0,0 +1,20 @@
+/*
+Copyright 2023 Stefan Sundin "4pplet" <mail@4pplet.com>
+
+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/>.
+*/
+#pragma once
+
+#define WS2812_EXTERNAL_PULLUP
+

+ 917 - 0
keyboards/4pplet/waffling60/rev_e/info.json

@@ -0,0 +1,917 @@
+{
+    "manufacturer": "4pplet",
+    "keyboard_name": "waffling60 Rev E",
+    "maintainer": "4pplet",
+    "bootloader": "stm32-dfu",
+    "diode_direction": "COL2ROW",
+    "encoder": {
+        "rotary": [
+            {"pin_a": "A2", "pin_b": "A1", "resolution": 2}
+        ]
+    },
+    "features": {
+        "bootmagic": true,
+        "command": false,
+        "console": false,
+        "extrakey": true,
+        "key_lock": true,
+        "mousekey": false,
+        "nkro": true,
+        "rgblight": true
+    },
+    "matrix_pins": {
+        "cols": ["B2", "A5", "A4", "A3", "F1", "F0", "C15", "C14", "C13", "B9", "B8", "B7", "A15", "B3"],
+        "rows": ["B14", "A9", "B6", "B5", "B4"]
+    },
+    "processor": "STM32F072",
+    "rgblight": {
+        "animations": {
+            "alternating": true,
+            "breathing": true,
+            "christmas": true,
+            "knight": true,
+            "rainbow_mood": true,
+            "rainbow_swirl": true,
+            "rgb_test": true,
+            "snake": true,
+            "static_gradient": true,
+            "twinkle": true
+        },
+        "led_count": 17
+    },
+    "url": "https://github.com/4pplet/waffling60",
+    "usb": {
+        "device_version": "0.0.5",
+        "pid": "0x0014",
+        "vid": "0x4444"
+    },
+    "ws2812": {
+        "pin": "A8"
+    },
+    "community_layouts": ["60_ansi", "60_ansi_split_bs_rshift", "60_ansi_tsangan", "60_hhkb", "60_iso", "60_iso_split_bs_rshift", "60_iso_tsangan", "60_tsangan_hhkb"],
+    "layouts": {
+        "LAYOUT_60_ansi": {
+            "layout": [
+                {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0},
+                {"label": "!", "matrix": [0, 1], "x": 1, "y": 0},
+                {"label": "@", "matrix": [0, 2], "x": 2, "y": 0},
+                {"label": "#", "matrix": [0, 3], "x": 3, "y": 0},
+                {"label": "$", "matrix": [0, 4], "x": 4, "y": 0},
+                {"label": "%", "matrix": [0, 5], "x": 5, "y": 0},
+                {"label": "^", "matrix": [0, 6], "x": 6, "y": 0},
+                {"label": "&", "matrix": [0, 7], "x": 7, "y": 0},
+                {"label": "*", "matrix": [0, 8], "x": 8, "y": 0},
+                {"label": "(", "matrix": [0, 9], "x": 9, "y": 0},
+                {"label": ")", "matrix": [0, 10], "x": 10, "y": 0},
+                {"label": "_", "matrix": [0, 11], "x": 11, "y": 0},
+                {"label": "+", "matrix": [0, 12], "x": 12, "y": 0},
+                {"label": "Backspace", "matrix": [2, 13], "x": 13, "y": 0, "w": 2},
+                {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+                {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1},
+                {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1},
+                {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1},
+                {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1},
+                {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1},
+                {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1},
+                {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1},
+                {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1},
+                {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1},
+                {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1},
+                {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1},
+                {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1},
+                {"label": "|", "matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
+                {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+                {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2},
+                {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2},
+                {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2},
+                {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2},
+                {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2},
+                {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2},
+                {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2},
+                {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2},
+                {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2},
+                {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2},
+                {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2},
+                {"label": "Enter", "matrix": [3, 13], "x": 12.75, "y": 2, "w": 2.25},
+                {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+                {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3},
+                {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3},
+                {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3},
+                {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3},
+                {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3},
+                {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3},
+                {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3},
+                {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3},
+                {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3},
+                {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3},
+                {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75},
+                {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
+                {"label": "Win", "matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25},
+                {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25},
+                {"label": "Space", "matrix": [4, 6], "x": 3.75, "y": 4, "w": 6.25},
+                {"label": "Alt", "matrix": [4, 9], "x": 10, "y": 4, "w": 1.25},
+                {"label": "Win", "matrix": [4, 10], "x": 11.25, "y": 4, "w": 1.25},
+                {"label": "Menu", "matrix": [4, 11], "x": 12.5, "y": 4, "w": 1.25},
+                {"label": "Fn", "matrix": [4, 12], "x": 13.75, "y": 4, "w": 1.25}
+            ]
+        },
+        "LAYOUT_60_ansi_split_bs_rshift": {
+            "layout": [
+                {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0},
+                {"label": "!", "matrix": [0, 1], "x": 1, "y": 0},
+                {"label": "@", "matrix": [0, 2], "x": 2, "y": 0},
+                {"label": "#", "matrix": [0, 3], "x": 3, "y": 0},
+                {"label": "$", "matrix": [0, 4], "x": 4, "y": 0},
+                {"label": "%", "matrix": [0, 5], "x": 5, "y": 0},
+                {"label": "^", "matrix": [0, 6], "x": 6, "y": 0},
+                {"label": "&", "matrix": [0, 7], "x": 7, "y": 0},
+                {"label": "*", "matrix": [0, 8], "x": 8, "y": 0},
+                {"label": "(", "matrix": [0, 9], "x": 9, "y": 0},
+                {"label": ")", "matrix": [0, 10], "x": 10, "y": 0},
+                {"label": "_", "matrix": [0, 11], "x": 11, "y": 0},
+                {"label": "+", "matrix": [0, 12], "x": 12, "y": 0},
+                {"label": "|", "matrix": [0, 13], "x": 13, "y": 0},
+                {"label": "~", "matrix": [2, 13], "x": 14, "y": 0},
+                {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+                {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1},
+                {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1},
+                {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1},
+                {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1},
+                {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1},
+                {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1},
+                {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1},
+                {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1},
+                {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1},
+                {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1},
+                {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1},
+                {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1},
+                {"label": "|", "matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
+                {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+                {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2},
+                {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2},
+                {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2},
+                {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2},
+                {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2},
+                {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2},
+                {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2},
+                {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2},
+                {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2},
+                {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2},
+                {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2},
+                {"label": "Enter", "matrix": [3, 13], "x": 12.75, "y": 2, "w": 2.25},
+                {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+                {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3},
+                {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3},
+                {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3},
+                {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3},
+                {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3},
+                {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3},
+                {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3},
+                {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3},
+                {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3},
+                {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3},
+                {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+                {"label": "Fn", "matrix": [4, 13], "x": 14, "y": 3},
+                {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
+                {"label": "Win", "matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25},
+                {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25},
+                {"label": "Space", "matrix": [4, 6], "x": 3.75, "y": 4, "w": 6.25},
+                {"label": "Alt", "matrix": [4, 9], "x": 10, "y": 4, "w": 1.25},
+                {"label": "Win", "matrix": [4, 10], "x": 11.25, "y": 4, "w": 1.25},
+                {"label": "Menu", "matrix": [4, 11], "x": 12.5, "y": 4, "w": 1.25},
+                {"label": "Fn", "matrix": [4, 12], "x": 13.75, "y": 4, "w": 1.25}
+            ]
+        },
+        "LAYOUT_60_ansi_tsangan": {
+            "layout": [
+                {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0},
+                {"label": "!", "matrix": [0, 1], "x": 1, "y": 0},
+                {"label": "@", "matrix": [0, 2], "x": 2, "y": 0},
+                {"label": "#", "matrix": [0, 3], "x": 3, "y": 0},
+                {"label": "$", "matrix": [0, 4], "x": 4, "y": 0},
+                {"label": "%", "matrix": [0, 5], "x": 5, "y": 0},
+                {"label": "^", "matrix": [0, 6], "x": 6, "y": 0},
+                {"label": "&", "matrix": [0, 7], "x": 7, "y": 0},
+                {"label": "*", "matrix": [0, 8], "x": 8, "y": 0},
+                {"label": "(", "matrix": [0, 9], "x": 9, "y": 0},
+                {"label": ")", "matrix": [0, 10], "x": 10, "y": 0},
+                {"label": "_", "matrix": [0, 11], "x": 11, "y": 0},
+                {"label": "+", "matrix": [0, 12], "x": 12, "y": 0},
+                {"label": "Backspace", "matrix": [2, 13], "x": 13, "y": 0, "w": 2},
+                {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+                {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1},
+                {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1},
+                {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1},
+                {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1},
+                {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1},
+                {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1},
+                {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1},
+                {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1},
+                {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1},
+                {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1},
+                {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1},
+                {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1},
+                {"label": "|", "matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
+                {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+                {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2},
+                {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2},
+                {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2},
+                {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2},
+                {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2},
+                {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2},
+                {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2},
+                {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2},
+                {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2},
+                {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2},
+                {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2},
+                {"label": "Enter", "matrix": [3, 13], "x": 12.75, "y": 2, "w": 2.25},
+                {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+                {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3},
+                {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3},
+                {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3},
+                {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3},
+                {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3},
+                {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3},
+                {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3},
+                {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3},
+                {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3},
+                {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3},
+                {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75},
+                {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+                {"label": "Win", "matrix": [4, 1], "x": 1.5, "y": 4},
+                {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+                {"label": "Space", "matrix": [4, 6], "x": 4, "y": 4, "w": 7},
+                {"label": "Alt", "matrix": [4, 10], "x": 11, "y": 4, "w": 1.5},
+                {"label": "Win", "matrix": [4, 11], "x": 12.5, "y": 4},
+                {"label": "Ctrl", "matrix": [4, 12], "x": 13.5, "y": 4, "w": 1.5}
+            ]
+        },
+        "LAYOUT_60_hhkb": {
+            "layout": [
+                {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0},
+                {"label": "!", "matrix": [0, 1], "x": 1, "y": 0},
+                {"label": "@", "matrix": [0, 2], "x": 2, "y": 0},
+                {"label": "#", "matrix": [0, 3], "x": 3, "y": 0},
+                {"label": "$", "matrix": [0, 4], "x": 4, "y": 0},
+                {"label": "%", "matrix": [0, 5], "x": 5, "y": 0},
+                {"label": "^", "matrix": [0, 6], "x": 6, "y": 0},
+                {"label": "&", "matrix": [0, 7], "x": 7, "y": 0},
+                {"label": "*", "matrix": [0, 8], "x": 8, "y": 0},
+                {"label": "(", "matrix": [0, 9], "x": 9, "y": 0},
+                {"label": ")", "matrix": [0, 10], "x": 10, "y": 0},
+                {"label": "_", "matrix": [0, 11], "x": 11, "y": 0},
+                {"label": "+", "matrix": [0, 12], "x": 12, "y": 0},
+                {"label": "|", "matrix": [0, 13], "x": 13, "y": 0},
+                {"label": "~", "matrix": [2, 13], "x": 14, "y": 0},
+                {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+                {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1},
+                {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1},
+                {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1},
+                {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1},
+                {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1},
+                {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1},
+                {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1},
+                {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1},
+                {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1},
+                {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1},
+                {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1},
+                {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1},
+                {"label": "|", "matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
+                {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+                {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2},
+                {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2},
+                {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2},
+                {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2},
+                {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2},
+                {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2},
+                {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2},
+                {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2},
+                {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2},
+                {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2},
+                {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2},
+                {"label": "Enter", "matrix": [3, 13], "x": 12.75, "y": 2, "w": 2.25},
+                {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+                {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3},
+                {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3},
+                {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3},
+                {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3},
+                {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3},
+                {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3},
+                {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3},
+                {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3},
+                {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3},
+                {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3},
+                {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+                {"label": "Fn", "matrix": [4, 13], "x": 14, "y": 3},
+                {"label": "Win", "matrix": [4, 1], "x": 1.5, "y": 4},
+                {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+                {"label": "Space", "matrix": [4, 6], "x": 4, "y": 4, "w": 7},
+                {"label": "Alt", "matrix": [4, 10], "x": 11, "y": 4, "w": 1.5},
+                {"label": "Win", "matrix": [4, 11], "x": 12.5, "y": 4}
+            ]
+        },
+        "LAYOUT_60_iso": {
+            "layout": [
+                {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0},
+                {"label": "!", "matrix": [0, 1], "x": 1, "y": 0},
+                {"label": "@", "matrix": [0, 2], "x": 2, "y": 0},
+                {"label": "#", "matrix": [0, 3], "x": 3, "y": 0},
+                {"label": "$", "matrix": [0, 4], "x": 4, "y": 0},
+                {"label": "%", "matrix": [0, 5], "x": 5, "y": 0},
+                {"label": "^", "matrix": [0, 6], "x": 6, "y": 0},
+                {"label": "&", "matrix": [0, 7], "x": 7, "y": 0},
+                {"label": "*", "matrix": [0, 8], "x": 8, "y": 0},
+                {"label": "(", "matrix": [0, 9], "x": 9, "y": 0},
+                {"label": ")", "matrix": [0, 10], "x": 10, "y": 0},
+                {"label": "_", "matrix": [0, 11], "x": 11, "y": 0},
+                {"label": "+", "matrix": [0, 12], "x": 12, "y": 0},
+                {"label": "Backspace", "matrix": [2, 13], "x": 13, "y": 0, "w": 2},
+                {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+                {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1},
+                {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1},
+                {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1},
+                {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1},
+                {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1},
+                {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1},
+                {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1},
+                {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1},
+                {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1},
+                {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1},
+                {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1},
+                {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1},
+                {"label": "Enter", "matrix": [3, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
+                {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+                {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2},
+                {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2},
+                {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2},
+                {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2},
+                {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2},
+                {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2},
+                {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2},
+                {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2},
+                {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2},
+                {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2},
+                {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2},
+                {"label": "NUHS", "matrix": [2, 12], "x": 12.75, "y": 2},
+                {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
+                {"label": "NUBS", "matrix": [3, 1], "x": 1.25, "y": 3},
+                {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3},
+                {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3},
+                {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3},
+                {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3},
+                {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3},
+                {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3},
+                {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3},
+                {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3},
+                {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3},
+                {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3},
+                {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75},
+                {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
+                {"label": "Win", "matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25},
+                {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25},
+                {"label": "Space", "matrix": [4, 6], "x": 3.75, "y": 4, "w": 6.25},
+                {"label": "Alt", "matrix": [4, 9], "x": 10, "y": 4, "w": 1.25},
+                {"label": "Win", "matrix": [4, 10], "x": 11.25, "y": 4, "w": 1.25},
+                {"label": "Menu", "matrix": [4, 11], "x": 12.5, "y": 4, "w": 1.25},
+                {"label": "Fn", "matrix": [4, 12], "x": 13.75, "y": 4, "w": 1.25}
+            ]
+        },
+        "LAYOUT_60_iso_split_bs_rshift": {
+            "layout": [
+                {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0},
+                {"label": "!", "matrix": [0, 1], "x": 1, "y": 0},
+                {"label": "@", "matrix": [0, 2], "x": 2, "y": 0},
+                {"label": "#", "matrix": [0, 3], "x": 3, "y": 0},
+                {"label": "$", "matrix": [0, 4], "x": 4, "y": 0},
+                {"label": "%", "matrix": [0, 5], "x": 5, "y": 0},
+                {"label": "^", "matrix": [0, 6], "x": 6, "y": 0},
+                {"label": "&", "matrix": [0, 7], "x": 7, "y": 0},
+                {"label": "*", "matrix": [0, 8], "x": 8, "y": 0},
+                {"label": "(", "matrix": [0, 9], "x": 9, "y": 0},
+                {"label": ")", "matrix": [0, 10], "x": 10, "y": 0},
+                {"label": "_", "matrix": [0, 11], "x": 11, "y": 0},
+                {"label": "+", "matrix": [0, 12], "x": 12, "y": 0},
+                {"label": "|", "matrix": [0, 13], "x": 13, "y": 0},
+                {"label": "~", "matrix": [2, 13], "x": 14, "y": 0},
+                {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+                {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1},
+                {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1},
+                {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1},
+                {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1},
+                {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1},
+                {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1},
+                {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1},
+                {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1},
+                {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1},
+                {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1},
+                {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1},
+                {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1},
+                {"label": "Enter", "matrix": [3, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
+                {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+                {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2},
+                {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2},
+                {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2},
+                {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2},
+                {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2},
+                {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2},
+                {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2},
+                {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2},
+                {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2},
+                {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2},
+                {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2},
+                {"label": "NUHS", "matrix": [2, 12], "x": 12.75, "y": 2},
+                {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
+                {"label": "NUBS", "matrix": [3, 1], "x": 1.25, "y": 3},
+                {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3},
+                {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3},
+                {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3},
+                {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3},
+                {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3},
+                {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3},
+                {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3},
+                {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3},
+                {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3},
+                {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3},
+                {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+                {"label": "Fn", "matrix": [4, 13], "x": 14, "y": 3},
+                {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
+                {"label": "Win", "matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25},
+                {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25},
+                {"label": "Space", "matrix": [4, 6], "x": 3.75, "y": 4, "w": 6.25},
+                {"label": "Alt", "matrix": [4, 9], "x": 10, "y": 4, "w": 1.25},
+                {"label": "Win", "matrix": [4, 10], "x": 11.25, "y": 4, "w": 1.25},
+                {"label": "Menu", "matrix": [4, 11], "x": 12.5, "y": 4, "w": 1.25},
+                {"label": "Fn", "matrix": [4, 12], "x": 13.75, "y": 4, "w": 1.25}
+            ]
+        },
+        "LAYOUT_60_iso_tsangan": {
+            "layout": [
+                {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0},
+                {"label": "!", "matrix": [0, 1], "x": 1, "y": 0},
+                {"label": "@", "matrix": [0, 2], "x": 2, "y": 0},
+                {"label": "#", "matrix": [0, 3], "x": 3, "y": 0},
+                {"label": "$", "matrix": [0, 4], "x": 4, "y": 0},
+                {"label": "%", "matrix": [0, 5], "x": 5, "y": 0},
+                {"label": "^", "matrix": [0, 6], "x": 6, "y": 0},
+                {"label": "&", "matrix": [0, 7], "x": 7, "y": 0},
+                {"label": "*", "matrix": [0, 8], "x": 8, "y": 0},
+                {"label": "(", "matrix": [0, 9], "x": 9, "y": 0},
+                {"label": ")", "matrix": [0, 10], "x": 10, "y": 0},
+                {"label": "_", "matrix": [0, 11], "x": 11, "y": 0},
+                {"label": "+", "matrix": [0, 12], "x": 12, "y": 0},
+                {"label": "Backspace", "matrix": [2, 13], "x": 13, "y": 0, "w": 2},
+                {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+                {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1},
+                {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1},
+                {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1},
+                {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1},
+                {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1},
+                {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1},
+                {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1},
+                {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1},
+                {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1},
+                {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1},
+                {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1},
+                {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1},
+                {"label": "Enter", "matrix": [3, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
+                {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+                {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2},
+                {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2},
+                {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2},
+                {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2},
+                {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2},
+                {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2},
+                {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2},
+                {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2},
+                {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2},
+                {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2},
+                {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2},
+                {"label": "NUHS", "matrix": [2, 12], "x": 12.75, "y": 2},
+                {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
+                {"label": "NUBS", "matrix": [3, 1], "x": 1.25, "y": 3},
+                {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3},
+                {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3},
+                {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3},
+                {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3},
+                {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3},
+                {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3},
+                {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3},
+                {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3},
+                {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3},
+                {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3},
+                {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75},
+                {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+                {"label": "Win", "matrix": [4, 1], "x": 1.5, "y": 4},
+                {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+                {"label": "Space", "matrix": [4, 6], "x": 4, "y": 4, "w": 7},
+                {"label": "Alt", "matrix": [4, 10], "x": 11, "y": 4, "w": 1.5},
+                {"label": "Win", "matrix": [4, 11], "x": 12.5, "y": 4},
+                {"label": "Ctrl", "matrix": [4, 12], "x": 13.5, "y": 4, "w": 1.5}
+            ]
+        },
+        "LAYOUT_60_tsangan_hhkb": {
+            "layout": [
+                {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0},
+                {"label": "!", "matrix": [0, 1], "x": 1, "y": 0},
+                {"label": "@", "matrix": [0, 2], "x": 2, "y": 0},
+                {"label": "#", "matrix": [0, 3], "x": 3, "y": 0},
+                {"label": "$", "matrix": [0, 4], "x": 4, "y": 0},
+                {"label": "%", "matrix": [0, 5], "x": 5, "y": 0},
+                {"label": "^", "matrix": [0, 6], "x": 6, "y": 0},
+                {"label": "&", "matrix": [0, 7], "x": 7, "y": 0},
+                {"label": "*", "matrix": [0, 8], "x": 8, "y": 0},
+                {"label": "(", "matrix": [0, 9], "x": 9, "y": 0},
+                {"label": ")", "matrix": [0, 10], "x": 10, "y": 0},
+                {"label": "_", "matrix": [0, 11], "x": 11, "y": 0},
+                {"label": "+", "matrix": [0, 12], "x": 12, "y": 0},
+                {"label": "|", "matrix": [0, 13], "x": 13, "y": 0},
+                {"label": "~", "matrix": [2, 13], "x": 14, "y": 0},
+                {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+                {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1},
+                {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1},
+                {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1},
+                {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1},
+                {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1},
+                {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1},
+                {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1},
+                {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1},
+                {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1},
+                {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1},
+                {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1},
+                {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1},
+                {"label": "|", "matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
+                {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+                {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2},
+                {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2},
+                {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2},
+                {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2},
+                {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2},
+                {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2},
+                {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2},
+                {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2},
+                {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2},
+                {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2},
+                {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2},
+                {"label": "Enter", "matrix": [3, 13], "x": 12.75, "y": 2, "w": 2.25},
+                {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+                {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3},
+                {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3},
+                {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3},
+                {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3},
+                {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3},
+                {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3},
+                {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3},
+                {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3},
+                {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3},
+                {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3},
+                {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+                {"label": "Fn", "matrix": [4, 13], "x": 14, "y": 3},
+                {"label": "Ctrl", "matrix": [4, 1], "x": 0, "y": 4, "w": 1.5},
+                {"label": "Win", "matrix": [4, 2], "x": 1.5, "y": 4},
+                {"label": "Alt", "matrix": [4, 3], "x": 2.5, "y": 4, "w": 1.5},
+                {"label": "Space", "matrix": [4, 6], "x": 4, "y": 4, "w": 7},
+                {"label": "Alt", "matrix": [4, 10], "x": 11, "y": 4, "w": 1.5},
+                {"label": "Win", "matrix": [4, 11], "x": 12.5, "y": 4},
+                {"label": "Ctrl", "matrix": [4, 12], "x": 13.5, "y": 4, "w": 1.5}
+            ]
+        },
+
+        "LAYOUT_6u_ansi": {
+            "layout": [
+                {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0},
+                {"label": "!", "matrix": [0, 1], "x": 1, "y": 0},
+                {"label": "@", "matrix": [0, 2], "x": 2, "y": 0},
+                {"label": "#", "matrix": [0, 3], "x": 3, "y": 0},
+                {"label": "$", "matrix": [0, 4], "x": 4, "y": 0},
+                {"label": "%", "matrix": [0, 5], "x": 5, "y": 0},
+                {"label": "^", "matrix": [0, 6], "x": 6, "y": 0},
+                {"label": "&", "matrix": [0, 7], "x": 7, "y": 0},
+                {"label": "*", "matrix": [0, 8], "x": 8, "y": 0},
+                {"label": "(", "matrix": [0, 9], "x": 9, "y": 0},
+                {"label": ")", "matrix": [0, 10], "x": 10, "y": 0},
+                {"label": "_", "matrix": [0, 11], "x": 11, "y": 0},
+                {"label": "+", "matrix": [0, 12], "x": 12, "y": 0},
+                {"label": "Backspace", "matrix": [2, 13], "x": 13, "y": 0, "w": 2},
+                {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+                {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1},
+                {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1},
+                {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1},
+                {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1},
+                {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1},
+                {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1},
+                {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1},
+                {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1},
+                {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1},
+                {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1},
+                {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1},
+                {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1},
+                {"label": "|", "matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
+                {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+                {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2},
+                {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2},
+                {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2},
+                {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2},
+                {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2},
+                {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2},
+                {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2},
+                {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2},
+                {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2},
+                {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2},
+                {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2},
+                {"label": "Enter", "matrix": [3, 13], "x": 12.75, "y": 2, "w": 2.25},
+                {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+                {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3},
+                {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3},
+                {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3},
+                {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3},
+                {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3},
+                {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3},
+                {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3},
+                {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3},
+                {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3},
+                {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3},
+                {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75},
+                {"label": "Ctrl", "matrix": [4, 0], "x":0, "y":4, "w":1.5},
+                {"label": "Win", "matrix": [4, 1], "x":1.5, "y":4},
+                {"label": "Alt", "matrix": [4, 2], "x":2.5, "y":4, "w":1.5},
+                {"label": "Space", "matrix": [4, 6], "x":4, "y":4, "w":6},
+                {"label": "Alt", "matrix": [4, 9], "x":10, "y":4, "w":1.5},
+                {"label": "Win", "matrix": [4, 10], "x":11.5, "y":4},
+                {"label": "Menu", "matrix": [4, 11], "x":12.5, "y":4},
+                {"label": "Fn", "matrix": [4, 12], "x":13.5, "y":4, "w":1.5}
+            ]
+        },
+        "LAYOUT_6u_ansi_split_bs_rshift": {
+            "layout": [
+                {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0},
+                {"label": "!", "matrix": [0, 1], "x": 1, "y": 0},
+                {"label": "@", "matrix": [0, 2], "x": 2, "y": 0},
+                {"label": "#", "matrix": [0, 3], "x": 3, "y": 0},
+                {"label": "$", "matrix": [0, 4], "x": 4, "y": 0},
+                {"label": "%", "matrix": [0, 5], "x": 5, "y": 0},
+                {"label": "^", "matrix": [0, 6], "x": 6, "y": 0},
+                {"label": "&", "matrix": [0, 7], "x": 7, "y": 0},
+                {"label": "*", "matrix": [0, 8], "x": 8, "y": 0},
+                {"label": "(", "matrix": [0, 9], "x": 9, "y": 0},
+                {"label": ")", "matrix": [0, 10], "x": 10, "y": 0},
+                {"label": "_", "matrix": [0, 11], "x": 11, "y": 0},
+                {"label": "+", "matrix": [0, 12], "x": 12, "y": 0},
+                {"label": "|", "matrix": [0, 13], "x": 13, "y": 0},
+                {"label": "~", "matrix": [2, 13], "x": 14, "y": 0},
+                {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+                {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1},
+                {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1},
+                {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1},
+                {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1},
+                {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1},
+                {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1},
+                {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1},
+                {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1},
+                {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1},
+                {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1},
+                {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1},
+                {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1},
+                {"label": "|", "matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
+                {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+                {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2},
+                {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2},
+                {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2},
+                {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2},
+                {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2},
+                {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2},
+                {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2},
+                {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2},
+                {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2},
+                {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2},
+                {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2},
+                {"label": "Enter", "matrix": [3, 13], "x": 12.75, "y": 2, "w": 2.25},
+                {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+                {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3},
+                {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3},
+                {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3},
+                {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3},
+                {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3},
+                {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3},
+                {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3},
+                {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3},
+                {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3},
+                {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3},
+                {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+                {"label": "Fn", "matrix": [4, 13], "x": 14, "y": 3},
+                {"label": "Ctrl", "matrix": [4, 0], "x":0, "y":4, "w":1.5},
+                {"label": "Win", "matrix": [4, 1], "x":1.5, "y":4},
+                {"label": "Alt", "matrix": [4, 2], "x":2.5, "y":4, "w":1.5},
+                {"label": "Space", "matrix": [4, 6], "x":4, "y":4, "w":6},
+                {"label": "Alt", "matrix": [4, 9], "x":10, "y":4, "w":1.5},
+                {"label": "Win", "matrix": [4, 10], "x":11.5, "y":4},
+                {"label": "Menu", "matrix": [4, 11], "x":12.5, "y":4},
+                {"label": "Fn", "matrix": [4, 12], "x":13.5, "y":4, "w":1.5}
+            ]
+        },
+        "LAYOUT_6u_iso": {
+            "layout": [
+                {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0},
+                {"label": "!", "matrix": [0, 1], "x": 1, "y": 0},
+                {"label": "@", "matrix": [0, 2], "x": 2, "y": 0},
+                {"label": "#", "matrix": [0, 3], "x": 3, "y": 0},
+                {"label": "$", "matrix": [0, 4], "x": 4, "y": 0},
+                {"label": "%", "matrix": [0, 5], "x": 5, "y": 0},
+                {"label": "^", "matrix": [0, 6], "x": 6, "y": 0},
+                {"label": "&", "matrix": [0, 7], "x": 7, "y": 0},
+                {"label": "*", "matrix": [0, 8], "x": 8, "y": 0},
+                {"label": "(", "matrix": [0, 9], "x": 9, "y": 0},
+                {"label": ")", "matrix": [0, 10], "x": 10, "y": 0},
+                {"label": "_", "matrix": [0, 11], "x": 11, "y": 0},
+                {"label": "+", "matrix": [0, 12], "x": 12, "y": 0},
+                {"label": "Backspace", "matrix": [2, 13], "x": 13, "y": 0, "w": 2},
+                {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+                {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1},
+                {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1},
+                {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1},
+                {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1},
+                {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1},
+                {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1},
+                {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1},
+                {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1},
+                {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1},
+                {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1},
+                {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1},
+                {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1},
+                {"label": "Enter", "matrix": [3, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
+                {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+                {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2},
+                {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2},
+                {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2},
+                {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2},
+                {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2},
+                {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2},
+                {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2},
+                {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2},
+                {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2},
+                {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2},
+                {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2},
+                {"label": "NUHS", "matrix": [2, 12], "x": 12.75, "y": 2},
+                {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
+                {"label": "NUBS", "matrix": [3, 1], "x": 1.25, "y": 3},
+                {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3},
+                {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3},
+                {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3},
+                {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3},
+                {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3},
+                {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3},
+                {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3},
+                {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3},
+                {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3},
+                {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3},
+                {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75},
+                {"label": "Ctrl", "matrix": [4, 0], "x":0, "y":4, "w":1.5},
+                {"label": "Win", "matrix": [4, 1], "x":1.5, "y":4},
+                {"label": "Alt", "matrix": [4, 2], "x":2.5, "y":4, "w":1.5},
+                {"label": "Space", "matrix": [4, 6], "x":4, "y":4, "w":6},
+                {"label": "Alt", "matrix": [4, 9], "x":10, "y":4, "w":1.5},
+                {"label": "Win", "matrix": [4, 10], "x":11.5, "y":4},
+                {"label": "Menu", "matrix": [4, 11], "x":12.5, "y":4},
+                {"label": "Fn", "matrix": [4, 12], "x":13.5, "y":4, "w":1.5}
+            ]
+        },
+        "LAYOUT_6u_iso_split_bs_rshift": {
+            "layout": [
+                {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0},
+                {"label": "!", "matrix": [0, 1], "x": 1, "y": 0},
+                {"label": "@", "matrix": [0, 2], "x": 2, "y": 0},
+                {"label": "#", "matrix": [0, 3], "x": 3, "y": 0},
+                {"label": "$", "matrix": [0, 4], "x": 4, "y": 0},
+                {"label": "%", "matrix": [0, 5], "x": 5, "y": 0},
+                {"label": "^", "matrix": [0, 6], "x": 6, "y": 0},
+                {"label": "&", "matrix": [0, 7], "x": 7, "y": 0},
+                {"label": "*", "matrix": [0, 8], "x": 8, "y": 0},
+                {"label": "(", "matrix": [0, 9], "x": 9, "y": 0},
+                {"label": ")", "matrix": [0, 10], "x": 10, "y": 0},
+                {"label": "_", "matrix": [0, 11], "x": 11, "y": 0},
+                {"label": "+", "matrix": [0, 12], "x": 12, "y": 0},
+                {"label": "|", "matrix": [0, 13], "x": 13, "y": 0},
+                {"label": "~", "matrix": [2, 13], "x": 14, "y": 0},
+                {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+                {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1},
+                {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1},
+                {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1},
+                {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1},
+                {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1},
+                {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1},
+                {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1},
+                {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1},
+                {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1},
+                {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1},
+                {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1},
+                {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1},
+                {"label": "Enter", "matrix": [3, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
+                {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+                {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2},
+                {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2},
+                {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2},
+                {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2},
+                {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2},
+                {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2},
+                {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2},
+                {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2},
+                {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2},
+                {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2},
+                {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2},
+                {"label": "NUHS", "matrix": [2, 12], "x": 12.75, "y": 2},
+                {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
+                {"label": "NUBS", "matrix": [3, 1], "x": 1.25, "y": 3},
+                {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3},
+                {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3},
+                {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3},
+                {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3},
+                {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3},
+                {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3},
+                {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3},
+                {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3},
+                {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3},
+                {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3},
+                {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+                {"label": "Fn", "matrix": [4, 13], "x": 14, "y": 3},
+                {"label": "Ctrl", "matrix": [4, 0], "x":0, "y":4, "w":1.5},
+                {"label": "Win", "matrix": [4, 1], "x":1.5, "y":4},
+                {"label": "Alt", "matrix": [4, 2], "x":2.5, "y":4, "w":1.5},
+                {"label": "Space", "matrix": [4, 6], "x":4, "y":4, "w":6},
+                {"label": "Alt", "matrix": [4, 9], "x":10, "y":4, "w":1.5},
+                {"label": "Win", "matrix": [4, 10], "x":11.5, "y":4},
+                {"label": "Menu", "matrix": [4, 11], "x":12.5, "y":4},
+                {"label": "Fn", "matrix": [4, 12], "x":13.5, "y":4, "w":1.5}
+            ]
+        },
+        "LAYOUT_all": {
+            "layout": [
+                {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0},
+                {"label": "!", "matrix": [0, 1], "x": 1, "y": 0},
+                {"label": "@", "matrix": [0, 2], "x": 2, "y": 0},
+                {"label": "#", "matrix": [0, 3], "x": 3, "y": 0},
+                {"label": "$", "matrix": [0, 4], "x": 4, "y": 0},
+                {"label": "%", "matrix": [0, 5], "x": 5, "y": 0},
+                {"label": "^", "matrix": [0, 6], "x": 6, "y": 0},
+                {"label": "&", "matrix": [0, 7], "x": 7, "y": 0},
+                {"label": "*", "matrix": [0, 8], "x": 8, "y": 0},
+                {"label": "(", "matrix": [0, 9], "x": 9, "y": 0},
+                {"label": ")", "matrix": [0, 10], "x": 10, "y": 0},
+                {"label": "_", "matrix": [0, 11], "x": 11, "y": 0},
+                {"label": "+", "matrix": [0, 12], "x": 12, "y": 0},
+                {"label": "|", "matrix": [0, 13], "x": 13, "y": 0},
+                {"label": "Backspace", "matrix": [2, 13], "x": 14, "y": 0},
+                {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+                {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1},
+                {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1},
+                {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1},
+                {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1},
+                {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1},
+                {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1},
+                {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1},
+                {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1},
+                {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1},
+                {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1},
+                {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1},
+                {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1},
+                {"label": "|", "matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
+                {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+                {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2},
+                {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2},
+                {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2},
+                {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2},
+                {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2},
+                {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2},
+                {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2},
+                {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2},
+                {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2},
+                {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2},
+                {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2},
+                {"label": "NUHS", "matrix": [2, 12], "x": 12.75, "y": 2},
+                {"label": "Enter", "matrix": [3, 13], "x": 13.75, "y": 2, "w": 1.25},
+                {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
+                {"label": "NUBS", "matrix": [3, 1], "x": 1.25, "y": 3},
+                {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3},
+                {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3},
+                {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3},
+                {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3},
+                {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3},
+                {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3},
+                {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3},
+                {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3},
+                {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3},
+                {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3},
+                {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+                {"label": "Fn", "matrix": [4, 13], "x": 14, "y": 3},
+                {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
+                {"label": "Win", "matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25},
+                {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25},
+                {"label": "Space", "matrix": [4, 4], "x": 3.75, "y": 4, "w": 2.25},
+                {"label": "Space", "matrix": [4, 6], "x": 6, "y": 4, "w": 1.25},
+                {"label": "Space", "matrix": [4, 8], "x": 7.25, "y": 4, "w": 2.75},
+                {"label": "Alt", "matrix": [4, 9], "x": 10, "y": 4, "w": 1.25},
+                {"label": "Win", "matrix": [4, 10], "x": 11.25, "y": 4, "w": 1.25},
+                {"label": "Menu", "matrix": [4, 11], "x": 12.5, "y": 4, "w": 1.25},
+                {"label": "Ctrl", "matrix": [4, 12], "x": 13.75, "y": 4, "w": 1.25}
+            ]
+        }
+    }
+}

+ 40 - 0
keyboards/4pplet/waffling60/rev_e/keymaps/6u_ansi/keymap.c

@@ -0,0 +1,40 @@
+/*
+Copyright 2020 Stefan Sundin "4pplet" <4pplet@protonmail.com>
+
+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/>.
+*/
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+// main layer
+[0] = LAYOUT_6u_ansi(
+  KC_ESC,   KC_1,     KC_2,     KC_3,     KC_4,     KC_5,       KC_6,      KC_7,      KC_8,      KC_9,       KC_0,    KC_MINS, KC_EQL,  KC_BSPC,
+  KC_TAB,   KC_Q,     KC_W,     KC_E,     KC_R,     KC_T,       KC_Y,      KC_U,      KC_I,      KC_O,       KC_P,    KC_LBRC, KC_RBRC, KC_BSLS,
+  KC_CAPS,  KC_A,     KC_S,     KC_D,     KC_F,     KC_G,       KC_H,      KC_J,      KC_K,      KC_L,       KC_SCLN, KC_QUOT, KC_ENT,
+  KC_LSFT,  KC_Z,     KC_X,     KC_C,     KC_V,     KC_B,       KC_N,      KC_M,      KC_COMM,   KC_DOT,     KC_SLSH, KC_RSFT,
+  KC_LCTL,  KC_LGUI,  KC_LALT,                                  KC_SPC,               KC_RALT,   KC_RGUI,    KC_APP,  KC_RCTL),
+// basic function layer
+[1] = LAYOUT_6u_ansi(
+  QK_BOOT,  KC_F1,    KC_F2,    KC_F3,    KC_F4,     KC_F5,     KC_F6,     KC_F7,     KC_F8,     KC_F9,      KC_F10,  KC_F11,   KC_F12,  KC_TRNS,
+  KC_TRNS,  KC_TRNS,  KC_UP,    KC_TRNS,  KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,    KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,
+  KC_TRNS,  KC_LEFT,  KC_DOWN,  KC_RIGHT, KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,    KC_TRNS, KC_TRNS,  KC_TRNS,
+  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,    KC_TRNS, KC_TRNS,
+  KC_TRNS,  KC_TRNS,  KC_TRNS,                                  KC_TRNS,              KC_TRNS,   KC_TRNS,    KC_TRNS, KC_TRNS)
+};
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
+    [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+    [1] = { ENCODER_CCW_CW(KC_BRID, KC_BRIU) }
+};
+#endif

+ 1 - 0
keyboards/4pplet/waffling60/rev_e/keymaps/6u_ansi/rules.mk

@@ -0,0 +1 @@
+ENCODER_MAP_ENABLE = yes

+ 40 - 0
keyboards/4pplet/waffling60/rev_e/keymaps/6u_ansi_split_bs_rshift/keymap.c

@@ -0,0 +1,40 @@
+/*
+Copyright 2020 Stefan Sundin "4pplet" <4pplet@protonmail.com>
+
+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/>.
+*/
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+// main layer
+[0] = LAYOUT_6u_ansi_split_bs_rshift(
+  KC_ESC,   KC_1,     KC_2,     KC_3,     KC_4,     KC_5,       KC_6,      KC_7,      KC_8,      KC_9,       KC_0,    KC_MINS, KC_EQL,  KC_BSLS, KC_BSPC,
+  KC_TAB,   KC_Q,     KC_W,     KC_E,     KC_R,     KC_T,       KC_Y,      KC_U,      KC_I,      KC_O,       KC_P,    KC_LBRC, KC_RBRC, KC_BSLS,
+  KC_CAPS,  KC_A,     KC_S,     KC_D,     KC_F,     KC_G,       KC_H,      KC_J,      KC_K,      KC_L,       KC_SCLN, KC_QUOT, KC_ENT,
+  KC_LSFT,  KC_Z,     KC_X,     KC_C,     KC_V,       KC_B,      KC_N,      KC_M,      KC_COMM,    KC_DOT,  KC_SLSH, KC_RSFT, MO(1),
+  KC_LCTL,  KC_LGUI,  KC_LALT,                          KC_SPC,                KC_RALT, KC_RGUI, KC_APP,  KC_RCTL),
+// basic function layer
+[1] = LAYOUT_6u_ansi_split_bs_rshift(
+  QK_BOOT,  KC_F1,    KC_F2,    KC_F3,    KC_F4,     KC_F5,     KC_F6,     KC_F7,     KC_F8,     KC_F9,      KC_F10,  KC_F11,   KC_F12,  KC_TRNS, KC_TRNS,
+  KC_TRNS,  KC_TRNS,  KC_UP,    KC_TRNS,  KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,    KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,
+  KC_TRNS,  KC_LEFT,  KC_DOWN,  KC_RIGHT, KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,    KC_TRNS, KC_TRNS,  KC_TRNS,
+  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,    KC_TRNS, KC_TRNS,  KC_TRNS,
+  KC_TRNS,  KC_TRNS,  KC_TRNS,                                  KC_TRNS,              KC_TRNS,   KC_TRNS,    KC_TRNS, KC_TRNS)
+};
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
+    [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+    [1] = { ENCODER_CCW_CW(KC_BRID, KC_BRIU) }
+};
+#endif

+ 1 - 0
keyboards/4pplet/waffling60/rev_e/keymaps/6u_ansi_split_bs_rshift/rules.mk

@@ -0,0 +1 @@
+ENCODER_MAP_ENABLE = yes

+ 40 - 0
keyboards/4pplet/waffling60/rev_e/keymaps/6u_iso/keymap.c

@@ -0,0 +1,40 @@
+/*
+Copyright 2020 Stefan Sundin "4pplet" <4pplet@protonmail.com>
+
+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/>.
+*/
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+// main layer
+[0] = LAYOUT_6u_iso(
+  KC_ESC,   KC_1,     KC_2,     KC_3,     KC_4,     KC_5,       KC_6,      KC_7,      KC_8,      KC_9,       KC_0,    KC_MINS, KC_EQL,  KC_BSPC,
+  KC_TAB,   KC_Q,     KC_W,     KC_E,     KC_R,     KC_T,       KC_Y,      KC_U,      KC_I,      KC_O,       KC_P,    KC_LBRC, KC_RBRC, KC_ENT,
+  KC_CAPS,  KC_A,     KC_S,     KC_D,     KC_F,     KC_G,       KC_H,      KC_J,      KC_K,      KC_L,       KC_SCLN, KC_QUOT, KC_NUHS ,
+  KC_LSFT,  KC_NUBS,  KC_Z,     KC_X,     KC_C,     KC_V,       KC_B,      KC_N,      KC_M,      KC_COMM,    KC_DOT,  KC_SLSH, KC_RSFT,
+  KC_LCTL,  KC_LGUI,  KC_LALT,                                  KC_SPC,               KC_RALT,   KC_RGUI,    KC_APP,  KC_RCTL),
+// basic function layer
+[1] = LAYOUT_6u_iso(
+  QK_BOOT,  KC_F1,    KC_F2,    KC_F3,    KC_F4,     KC_F5,     KC_F6,     KC_F7,     KC_F8,     KC_F9,      KC_F10,  KC_F11,   KC_F12,   KC_TRNS,
+  KC_TRNS,  KC_TRNS,  KC_UP,    KC_TRNS,  KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,    KC_TRNS, KC_TRNS,  KC_TRNS,  KC_TRNS,
+  KC_TRNS,  KC_LEFT,  KC_DOWN,  KC_RIGHT, KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,    KC_TRNS, KC_TRNS,  KC_TRNS,
+  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,    KC_TRNS, KC_TRNS,  KC_TRNS,
+  KC_TRNS,  KC_TRNS,  KC_TRNS,                                  KC_TRNS,                         KC_TRNS,    KC_TRNS, KC_TRNS,  KC_TRNS)
+};
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
+    [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+    [1] = { ENCODER_CCW_CW(KC_BRID, KC_BRIU) }
+};
+#endif

+ 1 - 0
keyboards/4pplet/waffling60/rev_e/keymaps/6u_iso/rules.mk

@@ -0,0 +1 @@
+ENCODER_MAP_ENABLE = yes

+ 40 - 0
keyboards/4pplet/waffling60/rev_e/keymaps/6u_iso_split_bs_rshift/keymap.c

@@ -0,0 +1,40 @@
+/*
+Copyright 2020 Stefan Sundin "4pplet" <4pplet@protonmail.com>
+
+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/>.
+*/
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+// main layer
+[0] = LAYOUT_6u_iso_split_bs_rshift(
+  KC_ESC,   KC_1,     KC_2,     KC_3,     KC_4,     KC_5,       KC_6,      KC_7,      KC_8,      KC_9,       KC_0,    KC_MINS, KC_EQL,  KC_BSLS, KC_BSPC,
+  KC_TAB,   KC_Q,     KC_W,     KC_E,     KC_R,     KC_T,       KC_Y,      KC_U,      KC_I,      KC_O,       KC_P,    KC_LBRC, KC_RBRC, KC_ENT,
+  KC_CAPS,  KC_A,     KC_S,     KC_D,     KC_F,     KC_G,       KC_H,      KC_J,      KC_K,      KC_L,       KC_SCLN, KC_QUOT, KC_NUHS,
+  KC_LSFT,  KC_NUBS,  KC_Z,     KC_X,     KC_C,     KC_V,       KC_B,      KC_N,      KC_M,      KC_COMM,    KC_DOT,  KC_SLSH, KC_RSFT, MO(1),
+  KC_LCTL,  KC_LGUI,  KC_LALT,                                  KC_SPC,               KC_RALT,   KC_RGUI,    KC_APP,  KC_RCTL),
+// basic function layer
+[1] = LAYOUT_6u_iso_split_bs_rshift(
+  QK_BOOT,  KC_F1,    KC_F2,    KC_F3,    KC_F4,     KC_F5,     KC_F6,     KC_F7,     KC_F8,     KC_F9,      KC_F10,  KC_F11,   KC_F12,  KC_TRNS, KC_TRNS,
+  KC_TRNS,  KC_TRNS,  KC_UP,    KC_TRNS,  KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,    KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,
+  KC_TRNS,  KC_LEFT,  KC_DOWN,  KC_RIGHT, KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,    KC_TRNS, KC_TRNS,  KC_TRNS,
+  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,    KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,
+  KC_TRNS,  KC_TRNS,  KC_TRNS,                                  KC_TRNS,              KC_TRNS,   KC_TRNS,    KC_TRNS, KC_TRNS)
+};
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
+    [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+    [1] = { ENCODER_CCW_CW(KC_BRID, KC_BRIU) }
+};
+#endif

+ 1 - 0
keyboards/4pplet/waffling60/rev_e/keymaps/6u_iso_split_bs_rshift/rules.mk

@@ -0,0 +1 @@
+ENCODER_MAP_ENABLE = yes

+ 40 - 0
keyboards/4pplet/waffling60/rev_e/keymaps/default/keymap.c

@@ -0,0 +1,40 @@
+/*
+Copyright 2020 Stefan Sundin "4pplet" <4pplet@protonmail.com>
+
+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/>.
+*/
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+// main layer
+[0] = LAYOUT_all(
+  KC_ESC,   KC_1,     KC_2,     KC_3,     KC_4,     KC_5,       KC_6,      KC_7,      KC_8,      KC_9,       KC_0,    KC_MINS, KC_EQL,  KC_BSLS, KC_BSPC,
+  KC_TAB,   KC_Q,     KC_W,     KC_E,     KC_R,     KC_T,       KC_Y,      KC_U,      KC_I,      KC_O,       KC_P,    KC_LBRC, KC_RBRC, KC_BSLS,
+  KC_CAPS,  KC_A,     KC_S,     KC_D,     KC_F,     KC_G,       KC_H,      KC_J,      KC_K,      KC_L,       KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT,
+  KC_LSFT,  KC_NUBS,  KC_Z,     KC_X,     KC_C,     KC_V,       KC_B,      KC_N,      KC_M,      KC_COMM,    KC_DOT,  KC_SLSH, KC_RSFT, MO(1),
+  KC_LCTL,  KC_LGUI,  KC_LALT,            KC_SPC,               KC_SPC,               KC_SPC,                KC_RALT, KC_RGUI, KC_APP,  KC_RCTL),
+// basic function layer
+[1] = LAYOUT_all(
+  QK_BOOT,  KC_F1,    KC_F2,    KC_F3,    KC_F4,     KC_F5,     KC_F6,     KC_F7,     KC_F8,     KC_F9,      KC_F10,  KC_F11,   KC_F12,  KC_TRNS, KC_TRNS,
+  KC_TRNS,  KC_TRNS,  KC_UP,    KC_TRNS,  KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,    KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,
+  KC_TRNS,  KC_LEFT,  KC_DOWN,  KC_RIGHT, KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,    KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,
+  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,    KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,
+  KC_TRNS,  KC_TRNS,  KC_TRNS,            KC_TRNS,              KC_TRNS,              KC_TRNS,               KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS)
+};
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
+    [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+    [1] = { ENCODER_CCW_CW(KC_BRID, KC_BRIU) }
+};
+#endif

+ 1 - 0
keyboards/4pplet/waffling60/rev_e/keymaps/default/rules.mk

@@ -0,0 +1 @@
+ENCODER_MAP_ENABLE = yes

+ 40 - 0
keyboards/4pplet/waffling60/rev_e/keymaps/via/keymap.c

@@ -0,0 +1,40 @@
+/*
+Copyright 2020 Stefan Sundin "4pplet" <4pplet@protonmail.com>
+
+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/>.
+*/
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+// main layer
+[0] = LAYOUT_all(
+  KC_ESC,   KC_1,     KC_2,     KC_3,     KC_4,     KC_5,       KC_6,      KC_7,      KC_8,      KC_9,       KC_0,    KC_MINS, KC_EQL,  KC_BSLS, KC_BSPC,
+  KC_TAB,   KC_Q,     KC_W,     KC_E,     KC_R,     KC_T,       KC_Y,      KC_U,      KC_I,      KC_O,       KC_P,    KC_LBRC, KC_RBRC, KC_BSLS,
+  KC_CAPS,  KC_A,     KC_S,     KC_D,     KC_F,     KC_G,       KC_H,      KC_J,      KC_K,      KC_L,       KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT,
+  KC_LSFT,  KC_NUBS,  KC_Z,     KC_X,     KC_C,     KC_V,       KC_B,      KC_N,      KC_M,      KC_COMM,    KC_DOT,  KC_SLSH, KC_RSFT, MO(1),
+  KC_LCTL,  KC_LGUI,  KC_LALT,            KC_SPC,               KC_SPC,               KC_SPC,                KC_RALT, KC_RGUI, KC_APP,  KC_RCTL),
+// basic function layer
+[1] = LAYOUT_all(
+  QK_BOOT,  KC_F1,    KC_F2,    KC_F3,    KC_F4,     KC_F5,     KC_F6,     KC_F7,     KC_F8,     KC_F9,      KC_F10,  KC_F11,   KC_F12,  KC_TRNS, KC_TRNS,
+  KC_TRNS,  KC_TRNS,  KC_UP,    KC_TRNS,  KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,    KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,
+  KC_TRNS,  KC_LEFT,  KC_DOWN,  KC_RIGHT, KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,    KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,
+  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,    KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,
+  KC_TRNS,  KC_TRNS,  KC_TRNS,            KC_TRNS,              KC_TRNS,              KC_TRNS,               KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS)
+};
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
+    [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+    [1] = { ENCODER_CCW_CW(KC_BRID, KC_BRIU) }
+};
+#endif

+ 2 - 0
keyboards/4pplet/waffling60/rev_e/keymaps/via/rules.mk

@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+ENCODER_MAP_ENABLE = yes

+ 37 - 0
keyboards/4pplet/waffling60/rev_e/matrix_diagram.md

@@ -0,0 +1,37 @@
+# Matrix Diagram for 4pplet Waffling60 Rev E Solder
+
+```
+                                                    ┌───────┐
+                                       2u Backspace │2D     │
+                                                    └───────┘
+┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
+│00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0A │0B │0C │0D │2D │
+├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤      ┌─────┐
+│10   │11 │12 │13 │14 │15 │16 │17 │18 │19 │1A │1B │1C │1D   │      │     │
+├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤   ┌──┴┐3D  │
+│20    │21 │22 │23 │24 │25 │26 │27 │28 │29 │2A │2B │3D      │   │2C │    │
+├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤   └───┴────┘
+│30  │31 │32 │33 │34 │35 │36 │37 │38 │39 │3A │3B │3C    │4D │    ISO Enter
+├────┼───┴┬──┴─┬─┴───┴──┬┴───┼───┴───┴──┬┴───┼───┴┬────┬┴───┤
+│40  │41  │42  │44      │46  │48        │49  │4A  │4B  │4C  │
+└────┴────┴────┴────────┴────┴──────────┴────┴────┴────┴────┘
+┌────────┐                                       ┌──────────┐
+│30      │ 2.25u LShift             2.75u RShift │3C        │
+└────────┘                                       └──────────┘
+┌────┬────┬────┬────────────────────────┬────┬────┬────┬────┐
+│40  │41  │42  │46                      │49  │4A  │4B  │4C  │ Standard
+└────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+┌─────┬───┬─────┬───────────────────────────┬─────┬───┬─────┐
+│40   │41 │42   │46                         │4A   │4B │4C   │ Tsangan/WKL
+└─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘
+┌────┬────┬────┬────────────────────────┬────┬────┬────┬────┐
+│40  │41  │42  │46                      │49  │4A  │4B  │4C  │ 6U bottom row
+└────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+┌─────┬───┬─────┬──────────┬──────┬─────────┬─────┬───┬─────┐
+│40   │41 │42   │44        │46    │48       │4A   │4B │4C   │ 3U split space
+└─────┴───┴─────┴──────────┴──────┴─────────┴─────┴───┴─────┘
+┌─────┬───┬───────────────────────────────────────┬───┬─────┐
+│40   │41 │46                                     │4B │4C   │ 10U space
+└─────┴───┴───────────────────────────────────────┴───┴─────┘
+
+```

+ 20 - 0
keyboards/4pplet/waffling60/rev_e/readme.md

@@ -0,0 +1,20 @@
+# waffling60
+
+A 60% PCB for MX switches, one hot swap and one solder-pcb version with decent layout support. Revision E adds underglow and 6u space support.
+
+More info: https://github.com/4pplet/waffling60
+
+* Keyboard Maintainer: [4pplet](https://github.com/4pplet)
+* Hardware Supported: [waffling60](https://github.com/4pplet/waffling60)
+
+Make example for this keyboard (after setting up your build environment):
+
+    make 4pplet/waffling60/rev_e:default
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+How to enter bootloader (DFU):
+* Short the reset-header (labled BL/RESET) on the back of the PCB for about 2 seconds for the keyboard to enter DFU. When in DFU, it's ready to flash the firmware. If using a APM MCU it will not automatically reset after flash. Simply short the reset-header for a very short time to just reset the PCB, alternatively unplug and repluck the USB-cable to the keyboard.
+
+Alternative option if the firmware is already pre-flashed:
+* Unplug your keyboard, hold down the Spacebar and B at the same time, plug in your keyboard and wait a second before releasing the keys. The keyboard will enter DFU and is ready to flash the firmware.

+ 35 - 0
keyboards/4pplet/waffling60/rev_e/rev_e.c

@@ -0,0 +1,35 @@
+/*
+Copyright 2022 Stefan Sundin "4pplet" <mail@4pplet.com>
+
+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/>.
+*/
+#include "rev_e.h"
+
+void keyboard_pre_init_kb(void) {
+    rgblight_set_effect_range(0, 16);
+    keyboard_pre_init_user();
+}
+
+bool led_update_kb(led_t led_state) {
+    bool res = led_update_user(led_state);
+    if (CAPS_LOCK_ENABLE && res) {
+        if(led_state.caps_lock) {
+            rgblight_sethsv_at(CAPS_LOCK_COLOR, 16);
+        }
+        else{
+            rgblight_sethsv_at(HSV_OFF, 16);
+        }
+    }
+    return res;
+}

+ 22 - 0
keyboards/4pplet/waffling60/rev_e/rev_e.h

@@ -0,0 +1,22 @@
+/*
+Copyright 2022 Stefan Sundin "4pplet" <mail@4pplet.com>
+
+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/>.
+*/
+#pragma once
+
+#include "quantum.h"
+
+#define CAPS_LOCK_ENABLE true
+#define CAPS_LOCK_COLOR HSV_GREEN

+ 2 - 0
keyboards/4pplet/waffling60/rev_e/rules.mk

@@ -0,0 +1,2 @@
+# Wildcard to allow APM32 MCU
+DFU_SUFFIX_ARGS = -p FFFF -v FFFF

+ 20 - 0
keyboards/4pplet/waffling60/rev_e_ansi/config.h

@@ -0,0 +1,20 @@
+/*
+Copyright 2023 Stefan Sundin "4pplet" <mail@4pplet.com>
+
+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/>.
+*/
+#pragma once
+
+#define WS2812_EXTERNAL_PULLUP
+

+ 255 - 0
keyboards/4pplet/waffling60/rev_e_ansi/info.json

@@ -0,0 +1,255 @@
+{
+    "manufacturer": "4pplet",
+    "keyboard_name": "waffling60 Rev E ANSI HS",
+    "maintainer": "4pplet",
+    "bootloader": "stm32-dfu",
+    "diode_direction": "COL2ROW",
+    "encoder": {
+        "rotary": [
+            {"pin_a": "A2", "pin_b": "A1", "resolution": 2}
+        ]
+    },
+    "features": {
+        "bootmagic": true,
+        "command": false,
+        "console": false,
+        "extrakey": true,
+        "key_lock": true,
+        "mousekey": false,
+        "nkro": true,
+        "rgblight": true
+    },
+    "matrix_pins": {
+        "cols": ["B2", "A4", "A3", "A0", "F1", "F0", "C15", "C14", "C13", "B9", "B8", "B7", "A15", "B3"],
+        "rows": ["B14", "A9", "B6", "B5", "B4"]
+    },
+    "processor": "STM32F072",
+    "rgblight": {
+        "animations": {
+            "alternating": true,
+            "breathing": true,
+            "christmas": true,
+            "knight": true,
+            "rainbow_mood": true,
+            "rainbow_swirl": true,
+            "rgb_test": true,
+            "snake": true,
+            "static_gradient": true,
+            "twinkle": true
+        },
+        "led_count": 17
+    },
+    "url": "https://github.com/4pplet/waffling60",
+    "usb": {
+        "device_version": "0.0.5",
+        "pid": "0x0015",
+        "vid": "0x4444"
+    },
+    "ws2812": {
+        "pin": "A8"
+    },
+    "community_layouts": [
+        "60_tsangan_hhkb",
+        "60_hhkb"
+    ],
+    "layouts": {
+        "LAYOUT_all": {
+            "layout": [
+                {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0},
+                {"label": "!", "matrix": [0, 1], "x": 1, "y": 0},
+                {"label": "@", "matrix": [0, 2], "x": 2, "y": 0},
+                {"label": "#", "matrix": [0, 3], "x": 3, "y": 0},
+                {"label": "$", "matrix": [0, 4], "x": 4, "y": 0},
+                {"label": "%", "matrix": [0, 5], "x": 5, "y": 0},
+                {"label": "^", "matrix": [0, 6], "x": 6, "y": 0},
+                {"label": "&", "matrix": [0, 7], "x": 7, "y": 0},
+                {"label": "*", "matrix": [0, 8], "x": 8, "y": 0},
+                {"label": "(", "matrix": [0, 9], "x": 9, "y": 0},
+                {"label": ")", "matrix": [0, 10], "x": 10, "y": 0},
+                {"label": "_", "matrix": [0, 11], "x": 11, "y": 0},
+                {"label": "+", "matrix": [0, 12], "x": 12, "y": 0},
+                {"label": "|", "matrix": [0, 13], "x": 13, "y": 0},
+                {"label": "~", "matrix": [1, 13], "x": 14, "y": 0},
+                {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+                {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1},
+                {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1},
+                {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1},
+                {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1},
+                {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1},
+                {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1},
+                {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1},
+                {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1},
+                {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1},
+                {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1},
+                {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1},
+                {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1},
+                {"label": "|", "matrix": [2, 12], "x": 13.5, "y": 1, "w": 1.5},
+                {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+                {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2},
+                {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2},
+                {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2},
+                {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2},
+                {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2},
+                {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2},
+                {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2},
+                {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2},
+                {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2},
+                {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2},
+                {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2},
+                {"label": "Enter", "matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
+                {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+                {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3},
+                {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3},
+                {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3},
+                {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3},
+                {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3},
+                {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3},
+                {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3},
+                {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3},
+                {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3},
+                {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3},
+                {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+                {"label": "Fn", "matrix": [3, 13], "x": 14, "y": 3},
+                {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+                {"label": "Win", "matrix": [4, 1], "x": 1.5, "y": 4},
+                {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+                {"label": "Space", "matrix": [4, 4], "x":4, "y":4, "w":3},
+                {"label": "Space", "matrix": [4, 6], "x":7, "y":4},
+                {"label": "Space", "matrix": [4, 8], "x":8, "y":4, "w":3},
+                {"label": "Alt", "matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
+                {"label": "Win", "matrix": [4, 12], "x": 12.5, "y": 4},
+                {"label": "Ctrl", "matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
+            ]
+        },
+        "LAYOUT_60_tsangan_hhkb": {
+            "layout": [
+                {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0},
+                {"label": "!", "matrix": [0, 1], "x": 1, "y": 0},
+                {"label": "@", "matrix": [0, 2], "x": 2, "y": 0},
+                {"label": "#", "matrix": [0, 3], "x": 3, "y": 0},
+                {"label": "$", "matrix": [0, 4], "x": 4, "y": 0},
+                {"label": "%", "matrix": [0, 5], "x": 5, "y": 0},
+                {"label": "^", "matrix": [0, 6], "x": 6, "y": 0},
+                {"label": "&", "matrix": [0, 7], "x": 7, "y": 0},
+                {"label": "*", "matrix": [0, 8], "x": 8, "y": 0},
+                {"label": "(", "matrix": [0, 9], "x": 9, "y": 0},
+                {"label": ")", "matrix": [0, 10], "x": 10, "y": 0},
+                {"label": "_", "matrix": [0, 11], "x": 11, "y": 0},
+                {"label": "+", "matrix": [0, 12], "x": 12, "y": 0},
+                {"label": "|", "matrix": [0, 13], "x": 13, "y": 0},
+                {"label": "~", "matrix": [1, 13], "x": 14, "y": 0},
+                {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+                {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1},
+                {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1},
+                {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1},
+                {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1},
+                {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1},
+                {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1},
+                {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1},
+                {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1},
+                {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1},
+                {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1},
+                {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1},
+                {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1},
+                {"label": "|", "matrix": [2, 12], "x": 13.5, "y": 1, "w": 1.5},
+                {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+                {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2},
+                {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2},
+                {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2},
+                {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2},
+                {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2},
+                {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2},
+                {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2},
+                {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2},
+                {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2},
+                {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2},
+                {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2},
+                {"label": "Enter", "matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
+                {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+                {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3},
+                {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3},
+                {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3},
+                {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3},
+                {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3},
+                {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3},
+                {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3},
+                {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3},
+                {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3},
+                {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3},
+                {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+                {"label": "Fn", "matrix": [3, 13], "x": 14, "y": 3},
+                {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+                {"label": "Win", "matrix": [4, 1], "x": 1.5, "y": 4},
+                {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+                {"label": "Space", "matrix": [4, 6], "x":4, "y":4, "w": 7},
+                {"label": "Alt", "matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
+                {"label": "Win", "matrix": [4, 12], "x": 12.5, "y": 4},
+                {"label": "Ctrl", "matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
+            ]
+        },
+        "LAYOUT_60_hhkb": {
+            "layout": [
+                {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0},
+                {"label": "!", "matrix": [0, 1], "x": 1, "y": 0},
+                {"label": "@", "matrix": [0, 2], "x": 2, "y": 0},
+                {"label": "#", "matrix": [0, 3], "x": 3, "y": 0},
+                {"label": "$", "matrix": [0, 4], "x": 4, "y": 0},
+                {"label": "%", "matrix": [0, 5], "x": 5, "y": 0},
+                {"label": "^", "matrix": [0, 6], "x": 6, "y": 0},
+                {"label": "&", "matrix": [0, 7], "x": 7, "y": 0},
+                {"label": "*", "matrix": [0, 8], "x": 8, "y": 0},
+                {"label": "(", "matrix": [0, 9], "x": 9, "y": 0},
+                {"label": ")", "matrix": [0, 10], "x": 10, "y": 0},
+                {"label": "_", "matrix": [0, 11], "x": 11, "y": 0},
+                {"label": "+", "matrix": [0, 12], "x": 12, "y": 0},
+                {"label": "|", "matrix": [0, 13], "x": 13, "y": 0},
+                {"label": "~", "matrix": [1, 13], "x": 14, "y": 0},
+                {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+                {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1},
+                {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1},
+                {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1},
+                {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1},
+                {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1},
+                {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1},
+                {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1},
+                {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1},
+                {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1},
+                {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1},
+                {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1},
+                {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1},
+                {"label": "Bsp", "matrix": [2, 12], "x": 13.5, "y": 1, "w": 1.5},
+                {"label": "Ctrl", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+                {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2},
+                {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2},
+                {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2},
+                {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2},
+                {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2},
+                {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2},
+                {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2},
+                {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2},
+                {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2},
+                {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2},
+                {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2},
+                {"label": "Enter", "matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
+                {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+                {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3},
+                {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3},
+                {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3},
+                {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3},
+                {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3},
+                {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3},
+                {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3},
+                {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3},
+                {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3},
+                {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3},
+                {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+                {"label": "Fn", "matrix": [3, 13], "x": 14, "y": 3},
+                {"label": "Alt", "matrix": [4, 1], "x": 1.5, "y": 4},
+                {"label": "Win", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+                {"label": "Space", "matrix": [4, 6], "x":4, "y":4, "w": 7},
+                {"label": "Win", "matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
+                {"label": "Alt", "matrix": [4, 12], "x": 12.5, "y": 4},
+            ]
+        }
+    }
+}

+ 40 - 0
keyboards/4pplet/waffling60/rev_e_ansi/keymaps/default/keymap.c

@@ -0,0 +1,40 @@
+/*
+Copyright 2023 Stefan Sundin "4pplet" <mail@4pplet.com>
+
+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/>.
+*/
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+// main layer
+[0] = LAYOUT_all(
+  KC_ESC,   KC_1,     KC_2,     KC_3,     KC_4,     KC_5,       KC_6,      KC_7,      KC_8,      KC_9,       KC_0,    KC_MINS, KC_EQL,  KC_BSLS, KC_BSPC,
+  KC_TAB,   KC_Q,     KC_W,     KC_E,     KC_R,     KC_T,       KC_Y,      KC_U,      KC_I,      KC_O,       KC_P,    KC_LBRC, KC_RBRC, KC_BSLS,
+  KC_CAPS,  KC_A,     KC_S,     KC_D,     KC_F,     KC_G,       KC_H,      KC_J,      KC_K,      KC_L,       KC_SCLN, KC_QUOT, KC_ENT,
+  KC_LSFT,            KC_Z,     KC_X,     KC_C,     KC_V,       KC_B,      KC_N,      KC_M,      KC_COMM,    KC_DOT,  KC_SLSH, KC_RSFT, MO(1),
+  KC_LCTL,  KC_LGUI,  KC_LALT,            KC_SPC,               KC_SPC,               KC_SPC,                KC_RALT, KC_RGUI, KC_RCTL),
+// basic function layer
+[1] = LAYOUT_all(
+  QK_BOOT,  KC_F1,    KC_F2,    KC_F3,    KC_F4,     KC_F5,     KC_F6,     KC_F7,     KC_F8,     KC_F9,      KC_F10,  KC_F11,   KC_F12,  KC_TRNS, KC_TRNS,
+  KC_TRNS,  KC_TRNS,  KC_UP,    KC_TRNS,  KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,    KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,
+  KC_TRNS,  KC_LEFT,  KC_DOWN,  KC_RIGHT, KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,    KC_TRNS, KC_TRNS,  KC_TRNS,
+  KC_TRNS,            KC_TRNS,  KC_TRNS,  KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,    KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,
+  KC_TRNS,  KC_TRNS,  KC_TRNS,            KC_TRNS,              KC_TRNS,              KC_TRNS,                        KC_TRNS,  KC_TRNS, KC_TRNS)
+};
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
+    [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+    [1] = { ENCODER_CCW_CW(KC_BRID, KC_BRIU) }
+};
+#endif

+ 1 - 0
keyboards/4pplet/waffling60/rev_e_ansi/keymaps/default/rules.mk

@@ -0,0 +1 @@
+ENCODER_MAP_ENABLE = yes

+ 40 - 0
keyboards/4pplet/waffling60/rev_e_ansi/keymaps/via/keymap.c

@@ -0,0 +1,40 @@
+/*
+Copyright 2023 Stefan Sundin "4pplet" <mail@4pplet.com>
+
+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/>.
+*/
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+// main layer
+[0] = LAYOUT_all(
+  KC_ESC,   KC_1,     KC_2,     KC_3,     KC_4,     KC_5,       KC_6,      KC_7,      KC_8,      KC_9,       KC_0,    KC_MINS, KC_EQL,  KC_BSLS, KC_BSPC,
+  KC_TAB,   KC_Q,     KC_W,     KC_E,     KC_R,     KC_T,       KC_Y,      KC_U,      KC_I,      KC_O,       KC_P,    KC_LBRC, KC_RBRC, KC_BSLS,
+  KC_CAPS,  KC_A,     KC_S,     KC_D,     KC_F,     KC_G,       KC_H,      KC_J,      KC_K,      KC_L,       KC_SCLN, KC_QUOT, KC_ENT,
+  KC_LSFT,            KC_Z,     KC_X,     KC_C,     KC_V,       KC_B,      KC_N,      KC_M,      KC_COMM,    KC_DOT,  KC_SLSH, KC_RSFT, MO(1),
+  KC_LCTL,  KC_LGUI,  KC_LALT,            KC_SPC,               KC_SPC,               KC_SPC,                KC_RALT, KC_RGUI, KC_RCTL),
+// basic function layer
+[1] = LAYOUT_all(
+  QK_BOOT,  KC_F1,    KC_F2,    KC_F3,    KC_F4,     KC_F5,     KC_F6,     KC_F7,     KC_F8,     KC_F9,      KC_F10,  KC_F11,   KC_F12,  KC_TRNS, KC_TRNS,
+  KC_TRNS,  KC_TRNS,  KC_UP,    KC_TRNS,  KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,    KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,
+  KC_TRNS,  KC_LEFT,  KC_DOWN,  KC_RIGHT, KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,    KC_TRNS, KC_TRNS,  KC_TRNS,
+  KC_TRNS,            KC_TRNS,  KC_TRNS,  KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,    KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,
+  KC_TRNS,  KC_TRNS,  KC_TRNS,            KC_TRNS,              KC_TRNS,              KC_TRNS,                        KC_TRNS,  KC_TRNS, KC_TRNS)
+};
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
+    [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+    [1] = { ENCODER_CCW_CW(KC_BRID, KC_BRIU) }
+};
+#endif

+ 2 - 0
keyboards/4pplet/waffling60/rev_e_ansi/keymaps/via/rules.mk

@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+ENCODER_MAP_ENABLE = yes

+ 24 - 0
keyboards/4pplet/waffling60/rev_e_ansi/matrix_diagram.md

@@ -0,0 +1,24 @@
+# Matrix Diagram for 4pplet Waffling60 Rev E ANSI Hotswap
+
+```
+                                                    ┌───────┐
+                                       2u Backspace │1D     │
+                                                    └───────┘
+┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
+│00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0A │0B │0C │0D │1D │
+├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤      
+│10   │11 │12 │13 │14 │15 │16 │17 │18 │19 │1A │1B │1C │2C   │      
+├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤  
+│20    │21 │22 │23 │24 │25 │26 │27 │28 │29 │2A │2B │2D      │   
+├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ 
+│30      │32 │33 │34 │35 │36 │37 │38 │39 │3A │3B │3C    │3D │   
+├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴───┴───┼───┴┬────┬┴───┤
+│40  │41  │42  │46                           │4B  │4C  │4D  │ Tsangan/WKL/HHKB
+└────┴────┴────┴─────────────────────────────┴────┴────┴────┘
+┌─────┬───┬─────┬───────────┬───┬───────────┬─────┬───┬─────┐
+│40   │41 │42   │44         │46 │48         │4B   │4C │4D   │ 7u split spacebar
+└─────┴───┴─────┴───────────┴───┴───────────┴─────┴───┴─────┘
+┌─────┬───┬───────────────────────────────────────┬───┬─────┐
+│40   │41 │46                                     │4C │4D   │ 10u Spacebar
+└─────┴───┴───────────────────────────────────────┴───┴─────┘
+```

+ 26 - 0
keyboards/4pplet/waffling60/rev_e_ansi/readme.md

@@ -0,0 +1,26 @@
+# waffling60 Rev. E ANSI
+
+A 60% PCB for MX switches, one hot swap and one solder-pcb version with decent layout support. Revision E adds underglow and rotary encoder support.
+
+More info: https://github.com/4pplet/waffling60
+
+* Keyboard Maintainer: [4pplet](https://github.com/4pplet)
+* Hardware Supported: [waffling60](https://github.com/4pplet/waffling60)
+
+Make example for this keyboard (after setting up your build environment):
+
+    make 4pplet/waffling60/rev_e_ansi:default
+
+Flashing example for this keyboard:
+
+    make 4pplet/waffling60/rev_e_ansi:default:flash
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+## Bootloader
+
+How to enter bootloader (DFU):
+* Short the reset-header (labled BL/RESET) on the back of the PCB for about 2 seconds for the keyboard to enter DFU. When in DFU, it's ready to flash the firmware. If using a APM MCU it will not automatically reset after flash. Simply short the reset-header for a very short time to just reset the PCB, alternatively unplug and repluck the USB-cable to the keyboard.
+
+Alternative option if the firmware is already pre-flashed:
+* Unplug your keyboard, hold down the Spacebar and B at the same time, plug in your keyboard and wait a second before releasing the keys. The keyboard will enter DFU and is ready to flash the firmware.

+ 2 - 0
keyboards/4pplet/waffling60/rev_e_ansi/rules.mk

@@ -0,0 +1,2 @@
+# Wildcard to allow APM32 MCU
+DFU_SUFFIX_ARGS = -p FFFF -v FFFF

+ 0 - 1
keyboards/acheron/apollo/87h/gamma/config.h

@@ -30,7 +30,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define IS31FL3741_DRIVER_COUNT 1
 #define DRIVER_1_LED_TOTAL 87
 #define RGB_MATRIX_LED_COUNT DRIVER_1_LED_TOTAL
-#define ISSI_DRIVER_TOTAL RGB_MATRIX_LED_COUNT
 
 #define RGB_MATRIX_DEFAULT_VAL 80
 #define RGB_MATRIX_FRAMEBUFFER_EFFECTS

+ 2 - 2
keyboards/aeboards/satellite/rev1/config.h

@@ -23,8 +23,8 @@
 #define IS31FL3731_DRIVER_COUNT 2
 #define DRIVER_1_LED_TOTAL 36
 #define DRIVER_2_LED_TOTAL 36
-#define ISSI_DRIVER_TOTAL (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
-#define RGB_MATRIX_LED_COUNT ISSI_DRIVER_TOTAL
+#define IS31FL3731_LED_COUNT (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
+#define RGB_MATRIX_LED_COUNT IS31FL3731_LED_COUNT
 
 #define RGB_MATRIX_DEFAULT_VAL 80
 #define RGB_MATRIX_FRAMEBUFFER_EFFECTS

+ 2 - 2
keyboards/aeboards/satellite/rev1/rev1.c

@@ -18,7 +18,7 @@
 #include "drivers/led/issi/is31fl3731.h"
 
 #ifdef RGB_MATRIX_ENABLE
-const is31fl3731_led_t PROGMEM g_is31fl3731_leds[RGB_MATRIX_LED_COUNT] = {
+const is31fl3731_led_t PROGMEM g_is31fl3731_leds[IS31FL3731_LED_COUNT] = {
 /* Refer to IS31 manual for these locations
  *   driver
  *   |  R location
@@ -149,7 +149,7 @@ static void init(void) {
     is31fl3731_init(IS31FL3731_I2C_ADDRESS_1);
     is31fl3731_init(IS31FL3731_I2C_ADDRESS_2);
 
-    for (int index = 0; index < ISSI_DRIVER_TOTAL; index++) {
+    for (int index = 0; index < IS31FL3731_LED_COUNT; index++) {
         bool enabled = !(   ( index == 18+5) || //B5
                             ( index == 36+17) || //C17
                             ( index == 54+13) //D13

+ 3 - 3
keyboards/cannonkeys/is0gr/info.json

@@ -18,8 +18,8 @@
     "url": "https://cannonkeys.com",
     "usb": {
         "device_version": "0.0.1",
-        "pid": "0xCA04",
-        "vid": "0x0028"
+        "pid": "0x0028",
+        "vid": "0xCA04"
     },
     "community_layouts": ["ortho_1x1"],
     "layouts": {
@@ -29,4 +29,4 @@
             ]
         }
     }
-}
+}

+ 0 - 1
keyboards/controllerworks/mini42/info.json

@@ -29,7 +29,6 @@
     },
     "split": {
         "enabled": true,
-        "main": "left",
         "matrix_pins": {
             "right": {
                 "direct": [

+ 44 - 0
keyboards/darkproject/kd87a_bfg_edition/config.h

@@ -0,0 +1,44 @@
+/* Copyright 2022 GSKY <gskyGit@gsky.com.tw>
+ *
+ * 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/>.
+ */
+
+#pragma once
+
+/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
+#define LOCKING_SUPPORT_ENABLE
+/* Locking resynchronize hack */
+#define LOCKING_RESYNC_ENABLE
+
+#define RGB_DISABLE_WHEN_USB_SUSPENDED
+
+/* External spi flash */
+#define EXTERNAL_FLASH_SPI_SLAVE_SELECT_PIN B14
+#define WEAR_LEVELING_BACKING_SIZE (8 * 1024)
+
+/* SPI Config for LED Driver */
+#define SPI_DRIVER SPIDQ
+#define SPI_SCK_PIN A5
+#define SPI_MOSI_PIN A7
+#define SPI_MISO_PIN A6
+
+#define DRIVER_1_CS A15
+#define DRIVER_2_CS B15
+#define DRIVER_1_EN C13
+#define DRIVER_2_EN C13
+
+#define DRIVER_COUNT 2
+#define DRIVER_1_LED_TOTAL 68
+#define DRIVER_2_LED_TOTAL 54
+#define RGB_MATRIX_LED_COUNT (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)

+ 23 - 0
keyboards/darkproject/kd87a_bfg_edition/halconf.h

@@ -0,0 +1,23 @@
+/* Copyright (C) 2022 Westberry Technology (ChangZhou) Corp., Ltd
+ *
+ * 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/>.
+ */
+
+#pragma once
+
+#define HAL_USE_SPI TRUE
+#define SPI_USE_WAIT TRUE
+#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD
+
+#include_next <halconf.h>

+ 274 - 0
keyboards/darkproject/kd87a_bfg_edition/info.json

@@ -0,0 +1,274 @@
+{
+    "manufacturer": "Kd87a_bfg_edition",
+    "keyboard_name": "Kd87a_bfg_edition",
+    "maintainer": "Gsky",
+    "bootloader": "wb32-dfu",
+    "bootmagic": {
+        "matrix": [1, 3]
+    },
+    "diode_direction": "COL2ROW",
+    "features": {
+        "bootmagic": true,
+        "extrakey": true,
+        "mousekey": true,
+        "nkro": true,
+        "rgb_matrix": true
+    },
+    "indicators": {
+        "caps_lock": "C14"
+    },
+    "matrix_pins": {
+        "cols": ["A0", "A1", "A2", "A3", "A4", "A8", "A9", "A10"],
+        "rows": ["B0", "B1", "B2", "B3", "B4", "B5", "B6", "B7", "B8", "B9", "B10", "B12"]
+    },
+    "processor": "WB32FQ95",
+    "qmk": {
+        "tap_keycode_delay": 10
+    },
+    "rgb_matrix": {
+        "animations": {
+            "alphas_mods": true,
+            "gradient_up_down": true,
+            "gradient_left_right": true,
+            "breathing": true,
+            "band_sat": true,
+            "band_val": true,
+            "band_pinwheel_sat": true,
+            "band_pinwheel_val": true,
+            "band_spiral_sat": true,
+            "band_spiral_val": true,
+            "cycle_all": true,
+            "cycle_left_right": true,
+            "cycle_up_down": true,
+            "cycle_out_in": true,
+            "cycle_out_in_dual": true,
+            "rainbow_moving_chevron": true,
+            "cycle_pinwheel": true,
+            "cycle_spiral": true,
+            "dual_beacon": true,
+            "rainbow_beacon": true,
+            "rainbow_pinwheels": true,
+            "raindrops": true,
+            "jellybean_raindrops": true,
+            "hue_breathing": true,
+            "hue_pendulum": true,
+            "hue_wave": true,
+            "pixel_fractal": true,
+            "pixel_flow": true,
+            "pixel_rain": true,
+            "typing_heatmap": true,
+            "digital_rain": true,
+            "solid_reactive_simple": true,
+            "solid_reactive": true,
+            "solid_reactive_wide": true,
+            "solid_reactive_multiwide": true,
+            "solid_reactive_cross": true,
+            "solid_reactive_multicross": true,
+            "solid_reactive_nexus": true,
+            "solid_reactive_multinexus": true,
+            "splash": true,
+            "multisplash": true,
+            "solid_splash": true,
+            "solid_multisplash": true
+        },
+        "center_point": [87, 35],
+        "driver": "aw20216",
+        "layout": [
+            { "flags": 4, "matrix": [1, 3], "x": 0, "y": 0 },
+            { "flags": 4, "matrix": [2, 6], "x": 20, "y": 0 },
+            { "flags": 4, "matrix": [3, 6], "x": 30, "y": 0 },
+            { "flags": 4, "matrix": [3, 1], "x": 40, "y": 0 },
+            { "flags": 4, "matrix": [3, 3], "x": 50, "y": 0 },
+            { "flags": 4, "matrix": [0, 7], "x": 65, "y": 0 },
+            { "flags": 4, "matrix": [6, 3], "x": 75, "y": 0 },
+            { "flags": 4, "matrix": [7, 1], "x": 85, "y": 0 },
+            { "flags": 4, "matrix": [7, 6], "x": 95, "y": 0 },
+            { "flags": 4, "matrix": [10, 6], "x": 110, "y": 0 },
+            { "flags": 4, "matrix": [10, 7], "x": 120, "y": 0 },
+            { "flags": 4, "matrix": [10, 3], "x": 130, "y": 0 },
+            { "flags": 4, "matrix": [10, 5], "x": 140, "y": 0 },
+            { "flags": 4, "matrix": [9, 7], "x": 155, "y": 0 },
+            { "flags": 4, "matrix": [10, 0], "x": 165, "y": 0 },
+            { "flags": 4, "matrix": [9, 6], "x": 175, "y": 0 },
+
+            { "flags": 4, "matrix": [1, 6], "x": 0, "y": 15 },
+            { "flags": 4, "matrix": [1, 7], "x": 10, "y": 15 },
+            { "flags": 4, "matrix": [2, 7], "x": 20, "y": 15 },
+            { "flags": 4, "matrix": [3, 7], "x": 30, "y": 15 },
+            { "flags": 4, "matrix": [4, 7], "x": 40, "y": 15 },
+            { "flags": 4, "matrix": [4, 6], "x": 50, "y": 15 },
+            { "flags": 4, "matrix": [5, 6], "x": 60, "y": 15 },
+            { "flags": 4, "matrix": [5, 7], "x": 70, "y": 15 },
+            { "flags": 4, "matrix": [6, 7], "x": 80, "y": 15 },
+            { "flags": 4, "matrix": [7, 7], "x": 90, "y": 15 },
+            { "flags": 4, "matrix": [8, 7], "x": 100, "y": 15 },
+            { "flags": 4, "matrix": [8, 6], "x": 110, "y": 15 },
+            { "flags": 4, "matrix": [6, 6], "x": 120, "y": 15 },
+            { "flags": 4, "matrix": [10, 1], "x": 130, "y": 15 },
+            { "flags": 4, "matrix": [11, 6], "x": 155, "y": 15 },
+            { "flags": 4, "matrix": [0, 2], "x": 165, "y": 15 },
+            { "flags": 4, "matrix": [1, 5], "x": 175, "y": 15 },
+
+            { "flags": 4, "matrix": [1, 1], "x": 0, "y": 25 },
+            { "flags": 4, "matrix": [1, 0], "x": 15, "y": 25 },
+            { "flags": 4, "matrix": [2, 0], "x": 25, "y": 25 },
+            { "flags": 4, "matrix": [3, 0], "x": 35, "y": 25 },
+            { "flags": 4, "matrix": [4, 0], "x": 45, "y": 25 },
+            { "flags": 4, "matrix": [4, 1], "x": 55, "y": 25 },
+            { "flags": 4, "matrix": [5, 1], "x": 65, "y": 25 },
+            { "flags": 4, "matrix": [5, 0], "x": 75, "y": 25 },
+            { "flags": 4, "matrix": [6, 0], "x": 85, "y": 25 },
+            { "flags": 4, "matrix": [7, 0], "x": 95, "y": 25 },
+            { "flags": 4, "matrix": [8, 0], "x": 105, "y": 25 },
+            { "flags": 4, "matrix": [8, 1], "x": 115, "y": 25 },
+            { "flags": 4, "matrix": [6, 1], "x": 125, "y": 25 },
+            { "flags": 4, "matrix": [10, 2], "x": 135, "y": 25 },
+            { "flags": 4, "matrix": [6, 5], "x": 155, "y": 25 },
+            { "flags": 4, "matrix": [7, 5], "x": 165, "y": 25 },
+            { "flags": 4, "matrix": [2, 5], "x": 175, "y": 25 },
+
+            { "flags": 8, "matrix": [2, 1], "x": 0, "y": 35 },
+            { "flags": 4, "matrix": [1, 2], "x": 17.5, "y": 35 },
+            { "flags": 4, "matrix": [2, 2], "x": 27.5, "y": 35 },
+            { "flags": 4, "matrix": [3, 2], "x": 37.5, "y": 35 },
+            { "flags": 4, "matrix": [4, 2], "x": 47.5, "y": 35 },
+            { "flags": 4, "matrix": [4, 3], "x": 57.5, "y": 35 },
+            { "flags": 4, "matrix": [5, 3], "x": 67.5, "y": 35 },
+            { "flags": 4, "matrix": [5, 2], "x": 77.5, "y": 35 },
+            { "flags": 4, "matrix": [6, 2], "x": 87.5, "y": 35 },
+            { "flags": 4, "matrix": [7, 2], "x": 97.5, "y": 35 },
+            { "flags": 4, "matrix": [8, 2], "x": 107.5, "y": 35 },
+            { "flags": 4, "matrix": [8, 3], "x": 117.5, "y": 35 },
+            { "flags": 4, "matrix": [10, 4], "x": 127.5, "y": 35 },
+
+            { "flags": 4, "matrix": [0, 0], "x": 0, "y": 45 },
+            { "flags": 4, "matrix": [1, 4], "x": 22.5, "y": 45 },
+            { "flags": 4, "matrix": [2, 4], "x": 32.5, "y": 45 },
+            { "flags": 4, "matrix": [3, 4], "x": 42.5, "y": 45 },
+            { "flags": 4, "matrix": [4, 4], "x": 52.5, "y": 45 },
+            { "flags": 4, "matrix": [4, 5], "x": 62.5, "y": 45 },
+            { "flags": 4, "matrix": [5, 5], "x": 72.5, "y": 45 },
+            { "flags": 4, "matrix": [5, 4], "x": 82.5, "y": 45 },
+            { "flags": 4, "matrix": [6, 4], "x": 92.5, "y": 45 },
+            { "flags": 4, "matrix": [7, 4], "x": 102.5, "y": 45 },
+            { "flags": 4, "matrix": [8, 5], "x": 112.5, "y": 45 },
+            { "flags": 4, "matrix": [9, 1], "x": 122.5, "y": 45 },
+            { "flags": 4, "matrix": [3, 5], "x": 165, "y": 45 },
+
+            { "flags": 4, "matrix": [0, 6], "x": 0, "y": 55 },
+            { "flags": 4, "matrix": [9, 0], "x": 12.5, "y": 55 },
+            { "flags": 4, "matrix": [9, 3], "x": 25, "y": 55 },
+            { "flags": 4, "matrix": [9, 4], "x": 37.5, "y": 55 },
+            { "flags": 4, "matrix": [9, 5], "x": 100, "y": 55 },
+            { "flags": 4, "matrix": [9, 2], "x": 112.5, "y": 55 },
+            { "flags": 4, "matrix": [8, 4], "x": 125, "y": 55 },
+            { "flags": 4, "matrix": [0, 4], "x": 137.5, "y": 55 },
+            { "flags": 4, "matrix": [0, 3], "x": 155, "y": 55 },
+            { "flags": 4, "matrix": [7, 3], "x": 165, "y": 55 },
+            { "flags": 4, "matrix": [0, 5], "x": 175, "y": 55 }
+        ]
+    },
+    "url": "",
+    "usb": {
+        "device_version": "0.0.3",
+        "pid": "0xE393",
+        "vid": "0x342D"
+    },
+    "eeprom": {
+        "driver": "wear_leveling"
+    },
+    "community_layouts": ["tkl_ansi"],
+    "layouts": {
+        "LAYOUT_tkl_ansi": {
+            "layout": [
+                { "label": "ESC", "matrix": [1, 3], "x": 0, "y": 0 },
+                { "label": "F1", "matrix": [2, 6], "x": 2, "y": 0 },
+                { "label": "F2", "matrix": [3, 6], "x": 3, "y": 0 },
+                { "label": "F3", "matrix": [3, 1], "x": 4, "y": 0 },
+                { "label": "F4", "matrix": [3, 3], "x": 5, "y": 0 },
+                { "label": "F5", "matrix": [0, 7], "x": 6.5, "y": 0 },
+                { "label": "F6", "matrix": [6, 3], "x": 7.5, "y": 0 },
+                { "label": "F7", "matrix": [7, 1], "x": 8.5, "y": 0 },
+                { "label": "F8", "matrix": [7, 6], "x": 9.5, "y": 0 },
+                { "label": "F9", "matrix": [10, 6], "x": 11, "y": 0 },
+                { "label": "F10", "matrix": [10, 7], "x": 12, "y": 0 },
+                { "label": "F11", "matrix": [10, 3], "x": 13, "y": 0 },
+                { "label": "F12", "matrix": [10, 5], "x": 14, "y": 0 },
+                { "label": "Printscreen", "matrix": [9, 7], "x": 15.5, "y": 0 },
+                { "label": "Scroll Lock", "matrix": [10, 0], "x": 16.5, "y": 0 },
+                { "label": "Pause Break", "matrix": [9, 6], "x": 17.5, "y": 0 },
+                { "label": "`", "matrix": [1, 6], "x": 0, "y": 1.5 },
+                { "label": "1", "matrix": [1, 7], "x": 1, "y": 1.5 },
+                { "label": "2", "matrix": [2, 7], "x": 2, "y": 1.5 },
+                { "label": "3", "matrix": [3, 7], "x": 3, "y": 1.5 },
+                { "label": "4", "matrix": [4, 7], "x": 4, "y": 1.5 },
+                { "label": "5", "matrix": [4, 6], "x": 5, "y": 1.5 },
+                { "label": "6", "matrix": [5, 6], "x": 6, "y": 1.5 },
+                { "label": "7", "matrix": [5, 7], "x": 7, "y": 1.5 },
+                { "label": "8", "matrix": [6, 7], "x": 8, "y": 1.5 },
+                { "label": "9", "matrix": [7, 7], "x": 9, "y": 1.5 },
+                { "label": "0", "matrix": [8, 7], "x": 10, "y": 1.5 },
+                { "label": "-", "matrix": [8, 6], "x": 11, "y": 1.5 },
+                { "label": "=", "matrix": [6, 6], "x": 12, "y": 1.5 },
+                { "label": "Backspace", "matrix": [10, 1], "w": 2, "x": 13, "y": 1.5 },
+                { "label": "INS", "matrix": [11, 6], "x": 15.5, "y": 1.5 },
+                { "label": "Home", "matrix": [0, 2], "x": 16.5, "y": 1.5 },
+                { "label": "PgUp", "matrix": [1, 5], "x": 17.5, "y": 1.5 },
+                { "label": "Tab", "matrix": [1, 1], "w": 1.5, "x": 0, "y": 2.5 },
+                { "label": "Q", "matrix": [1, 0], "x": 1.5, "y": 2.5 },
+                { "label": "W", "matrix": [2, 0], "x": 2.5, "y": 2.5 },
+                { "label": "E", "matrix": [3, 0], "x": 3.5, "y": 2.5 },
+                { "label": "R", "matrix": [4, 0], "x": 4.5, "y": 2.5 },
+                { "label": "T", "matrix": [4, 1], "x": 5.5, "y": 2.5 },
+                { "label": "Y", "matrix": [5, 1], "x": 6.5, "y": 2.5 },
+                { "label": "U", "matrix": [5, 0], "x": 7.5, "y": 2.5 },
+                { "label": "I", "matrix": [6, 0], "x": 8.5, "y": 2.5 },
+                { "label": "O", "matrix": [7, 0], "x": 9.5, "y": 2.5 },
+                { "label": "P", "matrix": [8, 0], "x": 10.5, "y": 2.5 },
+                { "label": "[", "matrix": [8, 1], "x": 11.5, "y": 2.5 },
+                { "label": "]", "matrix": [6, 1], "x": 12.5, "y": 2.5 },
+                { "label": "\\", "matrix": [10, 2], "w": 1.5, "x": 13.5, "y": 2.5 },
+                { "label": "Delete", "matrix": [6, 5], "x": 15.5, "y": 2.5 },
+                { "label": "End", "matrix": [7, 5], "x": 16.5, "y": 2.5 },
+                { "label": "PgDn", "matrix": [2, 5], "x": 17.5, "y": 2.5 },
+                { "label": "Caps Lock", "matrix": [2, 1], "w": 1.75, "x": 0, "y": 3.5 },
+                { "label": "A", "matrix": [1, 2], "x": 1.75, "y": 3.5 },
+                { "label": "S", "matrix": [2, 2], "x": 2.75, "y": 3.5 },
+                { "label": "D", "matrix": [3, 2], "x": 3.75, "y": 3.5 },
+                { "label": "F", "matrix": [4, 2], "x": 4.75, "y": 3.5 },
+                { "label": "G", "matrix": [4, 3], "x": 5.75, "y": 3.5 },
+                { "label": "H", "matrix": [5, 3], "x": 6.75, "y": 3.5 },
+                { "label": "J", "matrix": [5, 2], "x": 7.75, "y": 3.5 },
+                { "label": "K", "matrix": [6, 2], "x": 8.75, "y": 3.5 },
+                { "label": "L", "matrix": [7, 2], "x": 9.75, "y": 3.5 },
+                { "label": ";", "matrix": [8, 2], "x": 10.75, "y": 3.5 },
+                { "label": "'", "matrix": [8, 3], "x": 11.75, "y": 3.5 },
+                { "label": "Enter", "matrix": [10, 4], "w": 2.25, "x": 12.75, "y": 3.5 },
+                { "label": "Shift", "matrix": [0, 0], "w": 2.25, "x": 0, "y": 4.5 },
+                { "label": "Z", "matrix": [1, 4], "x": 2.25, "y": 4.5 },
+                { "label": "X", "matrix": [2, 4], "x": 3.25, "y": 4.5 },
+                { "label": "C", "matrix": [3, 4], "x": 4.25, "y": 4.5 },
+                { "label": "V", "matrix": [4, 4], "x": 5.25, "y": 4.5 },
+                { "label": "B", "matrix": [4, 5], "x": 6.25, "y": 4.5 },
+                { "label": "N", "matrix": [5, 5], "x": 7.25, "y": 4.5 },
+                { "label": "M", "matrix": [5, 4], "x": 8.25, "y": 4.5 },
+                { "label": ",", "matrix": [6, 4], "x": 9.25, "y": 4.5 },
+                { "label": ".", "matrix": [7, 4], "x": 10.25, "y": 4.5 },
+                { "label": "/", "matrix": [8, 5], "x": 11.25, "y": 4.5 },
+                { "label": "Shift", "matrix": [9, 1], "w": 2.75, "x": 12.25, "y": 4.5 },
+                { "label": "Up", "matrix": [3, 5], "x": 16.5, "y": 4.5 },
+                { "label": "Ctrl", "matrix": [0, 6], "w": 1.25, "x": 0, "y": 5.5 },
+                { "label": "Win", "matrix": [9, 0], "w": 1.25, "x": 1.25, "y": 5.5 },
+                { "label": "Alt", "matrix": [9, 3], "w": 1.25, "x": 2.5, "y": 5.5 },
+                { "label": "Space", "matrix": [9, 4], "w": 6.25, "x": 3.75, "y": 5.5 },
+                { "label": "Alt", "matrix": [9, 5], "w": 1.25, "x": 10, "y": 5.5 },
+                { "label": "FN", "matrix": [9, 2], "w": 1.25, "x": 11.25, "y": 5.5 },
+                { "label": "APP", "matrix": [8, 4], "w": 1.25, "x": 12.5, "y": 5.5 },
+                { "label": "Ctrl", "matrix": [0, 4], "w": 1.25, "x": 13.75, "y": 5.5 },
+                { "label": "Left", "matrix": [0, 3], "x": 15.5, "y": 5.5 },
+                { "label": "Down", "matrix": [7, 3], "x": 16.5, "y": 5.5 },
+                { "label": "Right", "matrix": [0, 5], "x": 17.5, "y": 5.5 }
+            ]
+        }
+    }
+}

+ 174 - 0
keyboards/darkproject/kd87a_bfg_edition/kd87a_bfg_edition.c

@@ -0,0 +1,174 @@
+/* Copyright 2022 GSKY <gskyGit@gsky.com.tw>
+ *
+ * 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/>.
+ */
+
+#include "kd87a_bfg_edition.h"
+
+#ifdef RGB_MATRIX_ENABLE
+
+const aw_led g_aw_leds[RGB_MATRIX_LED_COUNT] = {
+/* Refer to IS31 manual for these locations
+ *   driver
+ *   |     R location
+ *   |     |          G location
+ *   |     |          |          B location
+ *   |     |          |          | */
+    //{0, CS1_SW4,   CS2_SW4,   CS3_SW4},   //   0, Esc
+
+    {0, CS1_SW1,   CS2_SW1,   CS3_SW1},   //   1, Esc
+    {0, CS1_SW2,   CS2_SW2,   CS3_SW2},   //   2, F1
+    {0, CS1_SW3,   CS2_SW3,   CS3_SW3},   //   3, F2
+    {0, CS1_SW4,   CS2_SW4,   CS3_SW4},   //   4, F3
+    {0, CS1_SW5,   CS2_SW5,   CS3_SW5},   //   5, F4
+    {0, CS1_SW6,   CS2_SW6,   CS3_SW6},   //   6, F5
+    {0, CS1_SW7,   CS2_SW7,   CS3_SW7},   //   7, F6
+    {0, CS1_SW8,   CS2_SW8,   CS3_SW8},   //   8, F7
+    {0, CS1_SW9,   CS2_SW9,   CS3_SW9},   //   9, F8
+    {0, CS1_SW10,  CS2_SW10,  CS3_SW10},  //  10, F9
+    {0, CS1_SW11,  CS2_SW11,  CS3_SW11},  //  11, F10
+    {0, CS1_SW12,  CS2_SW12,  CS3_SW12},  //  12, F11
+    {1, CS1_SW1,   CS2_SW1,   CS3_SW1},   //  13, F12
+    {1, CS4_SW2,   CS5_SW2,   CS6_SW2},   //  14, Printscreen
+    {1, CS1_SW3,   CS2_SW3,   CS3_SW3},   //  15, Scroll Lock
+    {1, CS1_SW4,   CS2_SW4,   CS3_SW4},   //  16, Pause Break
+
+    {0, CS4_SW1,   CS5_SW1,   CS6_SW1},   //  17, `
+    {0, CS4_SW2,   CS5_SW2,   CS6_SW2},   //  18, 1
+    {0, CS4_SW3,   CS5_SW3,   CS6_SW3},   //  19, 2
+    {0, CS4_SW4,   CS5_SW4,   CS6_SW4},   //  20, 3
+    {0, CS4_SW5,   CS5_SW5,   CS6_SW5},   //  21, 4
+    {0, CS4_SW6,   CS5_SW6,   CS6_SW6},   //  22, 5
+    {0, CS4_SW7,   CS5_SW7,   CS6_SW7},   //  23, 6
+    {0, CS4_SW8,   CS5_SW8,   CS6_SW8},   //  24, 7
+    {0, CS4_SW9,   CS5_SW9,   CS6_SW9},   //  25, 8
+    {0, CS4_SW10,  CS5_SW10,  CS6_SW10},  //  26, 9
+    {0, CS4_SW11,  CS5_SW11,  CS6_SW11},  //  27, 0
+    {0, CS4_SW12,  CS5_SW12,  CS6_SW12},  //  28, -
+    {1, CS1_SW5,   CS2_SW5,   CS3_SW5},   //  29, =
+    {1, CS1_SW7,   CS2_SW7,   CS3_SW7},   //  30, Backspace
+    {1, CS1_SW2,   CS2_SW2,   CS3_SW2},   //  31, Insert
+    {1, CS4_SW5,   CS5_SW5,   CS6_SW5},   //  32, Home
+    {1, CS4_SW4,   CS5_SW4,   CS6_SW4},   //  33, Page Up
+
+    {0, CS7_SW1,   CS8_SW1,   CS9_SW1},   //  34, Tab
+    {0, CS7_SW2,   CS8_SW2,   CS9_SW2},   //  35, Q
+    {0, CS7_SW3,   CS8_SW3,   CS9_SW3},   //  36, W
+    {0, CS7_SW4,   CS8_SW4,   CS9_SW4},   //  37, E
+    {0, CS7_SW5,   CS8_SW5,   CS9_SW5},   //  38, R
+    {0, CS7_SW6,   CS8_SW6,   CS9_SW6},   //  39, T
+    {0, CS7_SW7,   CS8_SW7,   CS9_SW7},   //  40, Y
+    {0, CS7_SW8,   CS8_SW8,   CS9_SW8},   //  41, U
+    {0, CS7_SW9,   CS8_SW9,   CS9_SW9},   //  42, I
+    {0, CS7_SW10,  CS8_SW10,  CS9_SW10},  //  43, O
+    {0, CS7_SW11,  CS8_SW11,  CS9_SW11},  //  44, P
+    {0, CS7_SW12,  CS8_SW12,  CS9_SW12},  //  45, [
+    {1, CS1_SW8,   CS2_SW8,   CS3_SW8},   //  46, ]
+    {1, CS1_SW9,   CS2_SW9,   CS3_SW9},   //  47, "\\"
+    {1, CS4_SW3,   CS5_SW3,   CS6_SW3},   //  48, Delete
+    {1, CS4_SW6,   CS5_SW6,   CS6_SW6},   //  49, END
+    {1, CS4_SW7,   CS5_SW7,   CS6_SW7},   //  50, Page down
+
+    {0, CS10_SW1,  CS11_SW1,  CS12_SW1},  //  51, Caps Lock
+    {0, CS10_SW2,  CS11_SW2,  CS12_SW2},  //  52, A
+    {0, CS10_SW3,  CS11_SW3,  CS12_SW3},  //  53, S
+    {0, CS10_SW4,  CS11_SW4,  CS12_SW4},  //  54, D
+    {0, CS10_SW5,  CS11_SW5,  CS12_SW5},  //  55, F
+    {0, CS10_SW6,  CS11_SW6,  CS12_SW6},  //  56, G
+    {0, CS10_SW7,  CS11_SW7,  CS12_SW7},  //  57, H
+    {0, CS10_SW8,  CS11_SW8,  CS12_SW8},  //  58, J
+    {0, CS10_SW9,  CS11_SW9,  CS12_SW9},  //  59, K
+    {0, CS10_SW10, CS11_SW10, CS12_SW10}, //  60, L
+    {0, CS10_SW11, CS11_SW11, CS12_SW11}, //  61, ;
+    {0, CS10_SW12, CS11_SW12, CS12_SW12}, //  62, '
+    {1, CS1_SW11,  CS2_SW11,  CS3_SW11},  //  63, Enter
+    
+    {0, CS13_SW1,  CS14_SW1,  CS15_SW1},  //  64, Shift_L
+    {0, CS13_SW2,  CS14_SW2,  CS15_SW2},  //  65, Z
+    {0, CS13_SW3,  CS14_SW3,  CS15_SW3},  //  66, X
+    {0, CS13_SW4,  CS14_SW4,  CS15_SW4},  //  67, C
+    {0, CS13_SW5,  CS14_SW5,  CS15_SW5},  //  68, V
+    {0, CS13_SW6,  CS14_SW6,  CS15_SW6},  //  69, B
+    {0, CS13_SW7,  CS14_SW7,  CS15_SW7},  //  70, N
+    {0, CS13_SW8,  CS14_SW8,  CS15_SW8},  //  71, M
+    {0, CS13_SW9,  CS14_SW9,  CS15_SW9},  //  72, ,
+    {0, CS13_SW10, CS14_SW10, CS15_SW10}, //  73, .
+    {0, CS13_SW11, CS14_SW11, CS15_SW11}, //  74, /
+    {1, CS4_SW8,   CS5_SW8,   CS6_SW8},   //  75, Shift_R
+    {1, CS4_SW9,   CS5_SW9,   CS6_SW9},   //  76, Up
+    
+    {0, CS16_SW1,  CS17_SW1,  CS18_SW1},  //  77, Ctrl_L
+    {0, CS16_SW2,  CS17_SW2,  CS18_SW2},  //  78, Win_L
+    {0, CS16_SW3,  CS17_SW3,  CS18_SW3},  //  79, Alt_L
+    {0, CS16_SW6,  CS17_SW6,  CS18_SW6},  //  80, Space
+    {0, CS16_SW9,  CS17_SW9,  CS18_SW9},  //  81, Alt_R
+    {0, CS16_SW10, CS17_SW10, CS18_SW10}, //  82, FN
+    {0, CS16_SW11, CS17_SW11, CS18_SW11}, //  83, APP
+    {0, CS16_SW12, CS17_SW12, CS18_SW12}, //  84, Ctrl_R
+    {1, CS4_SW10,  CS5_SW10,  CS6_SW10},  //  85, Left
+    {1, CS4_SW11,  CS5_SW11,  CS6_SW11},  //  86, Down
+    {1, CS10_SW5,  CS11_SW5,  CS12_SW5},  //  87, Right
+};
+
+#endif
+
+#ifdef EEPROM_ENABLE
+
+#include "spi_master.h"
+
+void spi_init(void) {
+    static bool is_initialised = false;
+    if (!is_initialised) {
+        is_initialised = true;
+
+        // Try releasing special pins for a short time
+        setPinInput(SPI_SCK_PIN);
+        setPinInput(SPI_MOSI_PIN);
+        setPinInput(SPI_MISO_PIN);
+
+        chThdSleepMilliseconds(10);
+
+        palSetPadMode(PAL_PORT(SPI_SCK_PIN), PAL_PAD(SPI_SCK_PIN), PAL_MODE_ALTERNATE(SPI_SCK_PAL_MODE) | PAL_OUTPUT_TYPE_PUSHPULL | PAL_OUTPUT_SPEED_HIGHEST | PAL_WB32_CURRENT_LEVEL3);
+        palSetPadMode(PAL_PORT(SPI_MOSI_PIN), PAL_PAD(SPI_MOSI_PIN), PAL_MODE_ALTERNATE(SPI_MOSI_PAL_MODE) | PAL_OUTPUT_TYPE_PUSHPULL | PAL_OUTPUT_SPEED_HIGHEST);
+        palSetPadMode(PAL_PORT(SPI_MISO_PIN), PAL_PAD(SPI_MISO_PIN), PAL_MODE_ALTERNATE(SPI_MISO_PAL_MODE) | PAL_OUTPUT_TYPE_PUSHPULL | PAL_OUTPUT_SPEED_HIGHEST);
+    }
+}
+
+#endif
+
+void keyboard_pre_init_kb(void) {
+    setPinOutput(C0);
+    setPinOutput(C15);
+    keyboard_pre_init_user();
+};
+void housekeeping_task_kb(void) {
+    writePin(C15, keymap_config.no_gui);
+};
+
+bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
+    if (!process_record_user(keycode, record)) {
+        return false;
+    }
+    switch (keycode) {
+        case KC_SIRI:
+            if (record->event.pressed) {
+                host_consumer_send(0xCF);
+            } else {
+                host_consumer_send(0);
+            }
+            return false; /* Skip all further processing of this key */
+        default:
+            return true; /* Process all other keycodes normally */
+    }
+};

+ 22 - 0
keyboards/darkproject/kd87a_bfg_edition/kd87a_bfg_edition.h

@@ -0,0 +1,22 @@
+/* Copyright 2022 GSKY <gskyGit@gsky.com.tw>
+ *
+ * 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/>.
+ */
+#pragma once
+
+#include "quantum.h"
+
+enum keyboard_keycodes {
+    KC_SIRI = QK_KB_0
+};

+ 69 - 0
keyboards/darkproject/kd87a_bfg_edition/keymaps/default/keymap.c

@@ -0,0 +1,69 @@
+/* Copyright 2022 GSKY <gskyGit@gsky.com.tw>
+ *
+ * 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/>.
+ */
+
+#include QMK_KEYBOARD_H
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+
+enum custom_layers {
+    Win,
+    Mac,
+    Winfn,
+    Macfn,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+  /* Keymap _BL: Base Layer (Default Layer)
+   */
+[Win] = LAYOUT_tkl_ansi(
+  KC_ESC,   KC_F1,    KC_F2,    KC_F3,    KC_F4,    KC_F5,    KC_F6,    KC_F7,    KC_F8,    KC_F9,    KC_F10,   KC_F11,   KC_F12,             KC_PSCR,  KC_SCRL,  KC_PAUS,
+  KC_GRV,   KC_1,     KC_2,     KC_3,     KC_4,     KC_5,     KC_6,     KC_7,     KC_8,     KC_9,     KC_0,     KC_MINS,  KC_EQL,   KC_BSPC,  KC_INS,   KC_HOME,  KC_PGUP,
+  KC_TAB,   KC_Q,     KC_W,     KC_E,     KC_R,     KC_T,     KC_Y,     KC_U,     KC_I,     KC_O,     KC_P,     KC_LBRC,  KC_RBRC,  KC_BSLS,  KC_DEL,   KC_END,   KC_PGDN,
+  KC_CAPS,  KC_A,     KC_S,     KC_D,     KC_F,     KC_G,     KC_H,     KC_J,     KC_K,     KC_L,     KC_SCLN,  KC_QUOT,  KC_ENT,   
+  KC_LSFT,  KC_Z,     KC_X,     KC_C,     KC_V,     KC_B,     KC_N,     KC_M,     KC_COMM,  KC_DOT,   KC_SLSH,  KC_RSFT,                                KC_UP,    
+  KC_LCTL,  KC_LGUI,  KC_LALT,                      KC_SPC,                                 KC_RALT,  MO(Winfn),KC_APP,   KC_RCTL,            KC_LEFT,  KC_DOWN,  KC_RGHT),
+
+[Mac] = LAYOUT_tkl_ansi(
+  KC_ESC,   KC_BRID,  KC_BRIU,  KC_MCTL,  KC_SIRI,  KC_F5,    KC_F6,    KC_MRWD,  KC_MPLY,  KC_MFFD,  KC_MUTE,  KC_VOLD,  KC_VOLU,            KC_PSCR,  KC_SCRL,  KC_PAUS,
+  KC_GRV,   KC_1,     KC_2,     KC_3,     KC_4,     KC_5,     KC_6,     KC_7,     KC_8,     KC_9,     KC_0,     KC_MINS,  KC_EQL,   KC_BSPC,  KC_INS,   KC_HOME,  KC_PGUP,
+  KC_TAB,   KC_Q,     KC_W,     KC_E,     KC_R,     KC_T,     KC_Y,     KC_U,     KC_I,     KC_O,     KC_P,     KC_LBRC,  KC_RBRC,  KC_BSLS,  KC_DEL,   KC_END,   KC_PGDN,
+  KC_CAPS,  KC_A,     KC_S,     KC_D,     KC_F,     KC_G,     KC_H,     KC_J,     KC_K,     KC_L,     KC_SCLN,  KC_QUOT,  KC_ENT,             
+  KC_LSFT,  KC_Z,     KC_X,     KC_C,     KC_V,     KC_B,     KC_N,     KC_M,     KC_COMM,  KC_DOT,   KC_SLSH,  KC_RSFT,                                KC_UP,    
+  KC_LCTL,  KC_LALT,  KC_LGUI,                      KC_SPC,                                 KC_RALT,  MO(Macfn),KC_APP,    KC_RCTL,            KC_LEFT,  KC_DOWN,  KC_RGHT),
+
+[Winfn] = LAYOUT_tkl_ansi(
+  QK_BOOT,  KC_MYCM,  KC_MAIL,  KC_WSCH,  KC_WHOM,  KC_CALC,  KC_MSEL,  KC_MPRV,  KC_MPLY,  KC_MNXT,  KC_MUTE,  KC_VOLD,  KC_VOLU,            KC_PSCR,  KC_SCRL,  KC_PAUS,
+  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  RGB_HUI,  KC_TRNS,
+  KC_TRNS,  KC_TRNS,  TO(Win),  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  RGB_MOD,  KC_TRNS,  KC_TRNS,
+  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,            
+  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  TO(Mac),  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,                                RGB_VAI,
+  KC_TRNS,  GUI_TOG,  KC_TRNS,                      KC_TRNS,                                KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,            RGB_SPD,  RGB_VAD,  RGB_SPI),
+
+[Macfn] = LAYOUT_tkl_ansi(
+  QK_BOOT,  KC_F1,    KC_F2,    KC_F3,    KC_F4,    KC_TRNS,  KC_TRNS,  KC_F7,    KC_F8,    KC_F9,    KC_F10,   KC_F11,   KC_F12,             KC_TRNS,  KC_TRNS,  KC_TRNS,
+  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  RGB_HUI,  KC_TRNS,
+  KC_TRNS,  KC_TRNS,  TO(Win),  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  RGB_MOD,  KC_TRNS,  KC_TRNS,
+  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,            
+  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  TO(Mac),  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,                                RGB_VAI,  
+  KC_TRNS,  KC_TRNS,  KC_TRNS,                      KC_TRNS,                                KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,            RGB_SPD,  RGB_VAD,  RGB_SPI),
+
+};
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+    writePin(C0, layer_state_cmp(state, 1));
+    return state;
+};

+ 69 - 0
keyboards/darkproject/kd87a_bfg_edition/keymaps/via/keymap.c

@@ -0,0 +1,69 @@
+/* Copyright 2022 GSKY <gskyGit@gsky.com.tw>
+ *
+ * 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/>.
+ */
+
+#include QMK_KEYBOARD_H
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+
+enum custom_layers {
+    Win,
+    Mac,
+    Winfn,
+    Macfn,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+  /* Keymap _BL: Base Layer (Default Layer)
+   */
+[Win] = LAYOUT_tkl_ansi(
+  KC_ESC,   KC_F1,    KC_F2,    KC_F3,    KC_F4,    KC_F5,    KC_F6,    KC_F7,    KC_F8,    KC_F9,    KC_F10,   KC_F11,   KC_F12,             KC_PSCR,  KC_SCRL,  KC_PAUS,
+  KC_GRV,   KC_1,     KC_2,     KC_3,     KC_4,     KC_5,     KC_6,     KC_7,     KC_8,     KC_9,     KC_0,     KC_MINS,  KC_EQL,   KC_BSPC,  KC_INS,   KC_HOME,  KC_PGUP,
+  KC_TAB,   KC_Q,     KC_W,     KC_E,     KC_R,     KC_T,     KC_Y,     KC_U,     KC_I,     KC_O,     KC_P,     KC_LBRC,  KC_RBRC,  KC_BSLS,  KC_DEL,   KC_END,   KC_PGDN,
+  KC_CAPS,  KC_A,     KC_S,     KC_D,     KC_F,     KC_G,     KC_H,     KC_J,     KC_K,     KC_L,     KC_SCLN,  KC_QUOT,  KC_ENT,   
+  KC_LSFT,  KC_Z,     KC_X,     KC_C,     KC_V,     KC_B,     KC_N,     KC_M,     KC_COMM,  KC_DOT,   KC_SLSH,  KC_RSFT,                                KC_UP,    
+  KC_LCTL,  KC_LGUI,  KC_LALT,                      KC_SPC,                                 KC_RALT,  MO(Winfn),KC_APP,   KC_RCTL,            KC_LEFT,  KC_DOWN,  KC_RGHT),
+
+[Mac] = LAYOUT_tkl_ansi(
+  KC_ESC,   KC_BRID,  KC_BRIU,  KC_MCTL,  KC_SIRI,  KC_F5,    KC_F6,    KC_MRWD,  KC_MPLY,  KC_MFFD,  KC_MUTE,  KC_VOLD,  KC_VOLU,            KC_PSCR,  KC_SCRL,  KC_PAUS,
+  KC_GRV,   KC_1,     KC_2,     KC_3,     KC_4,     KC_5,     KC_6,     KC_7,     KC_8,     KC_9,     KC_0,     KC_MINS,  KC_EQL,   KC_BSPC,  KC_INS,   KC_HOME,  KC_PGUP,
+  KC_TAB,   KC_Q,     KC_W,     KC_E,     KC_R,     KC_T,     KC_Y,     KC_U,     KC_I,     KC_O,     KC_P,     KC_LBRC,  KC_RBRC,  KC_BSLS,  KC_DEL,   KC_END,   KC_PGDN,
+  KC_CAPS,  KC_A,     KC_S,     KC_D,     KC_F,     KC_G,     KC_H,     KC_J,     KC_K,     KC_L,     KC_SCLN,  KC_QUOT,  KC_ENT,             
+  KC_LSFT,  KC_Z,     KC_X,     KC_C,     KC_V,     KC_B,     KC_N,     KC_M,     KC_COMM,  KC_DOT,   KC_SLSH,  KC_RSFT,                                KC_UP,    
+  KC_LCTL,  KC_LALT,  KC_LGUI,                      KC_SPC,                                 KC_RALT,  MO(Macfn),KC_APP,   KC_RCTL,            KC_LEFT,  KC_DOWN,  KC_RGHT),
+
+[Winfn] = LAYOUT_tkl_ansi(
+  QK_BOOT,  KC_MYCM,  KC_MAIL,  KC_WSCH,  KC_WHOM,  KC_CALC,  KC_MSEL,  KC_MPRV,  KC_MPLY,  KC_MNXT,  KC_MUTE,  KC_VOLD,  KC_VOLU,            KC_PSCR,  KC_SCRL,  KC_PAUS,
+  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  RGB_HUI,  KC_TRNS,
+  KC_TRNS,  KC_TRNS,  TO(Win),  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  RGB_MOD,  KC_TRNS,  KC_TRNS,
+  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,            
+  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  TO(Mac),  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,                                RGB_VAI,
+  KC_TRNS,  GUI_TOG,  KC_TRNS,                      KC_TRNS,                                KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,            RGB_SPD,  RGB_VAD,  RGB_SPI),
+
+[Macfn] = LAYOUT_tkl_ansi(
+  QK_BOOT,  KC_F1,    KC_F2,    KC_F3,    KC_F4,    KC_TRNS,  KC_TRNS,  KC_F7,    KC_F8,    KC_F9,    KC_F10,   KC_F11,   KC_F12,             KC_TRNS,  KC_TRNS,  KC_TRNS,
+  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  RGB_HUI,  KC_TRNS,
+  KC_TRNS,  KC_TRNS,  TO(Win),  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  RGB_MOD,  KC_TRNS,  KC_TRNS,
+  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,            
+  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  TO(Mac),  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,                                RGB_VAI,  
+  KC_TRNS,  KC_TRNS,  KC_TRNS,                      KC_TRNS,                                KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,            RGB_SPD,  RGB_VAD,  RGB_SPI),
+
+};
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+    writePin(C0, layer_state_cmp(state, 1));
+    return state;
+};

+ 1 - 0
keyboards/darkproject/kd87a_bfg_edition/keymaps/via/rules.mk

@@ -0,0 +1 @@
+VIA_ENABLE = yes

+ 25 - 0
keyboards/darkproject/kd87a_bfg_edition/mcuconf.h

@@ -0,0 +1,25 @@
+/* Copyright (C) 2022 Westberry Technology (ChangZhou) Corp., Ltd
+ *
+ * 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/>.
+ */
+
+#pragma once
+
+#include_next <mcuconf.h>
+
+#undef WB32_SPI_USE_QSPI
+#define WB32_SPI_USE_QSPI TRUE
+
+#undef WB32_SPI_USE_SPIM2
+#define WB32_SPI_USE_SPIM2 TRUE

+ 24 - 0
keyboards/darkproject/kd87a_bfg_edition/readme.md

@@ -0,0 +1,24 @@
+# KD87A_BFG_Edition 
+![KD87A_BFG_Edition](https://imgur.com/uOUvWvwh.png)
+
+An 87 keys keyboard, Equipped with the WestBerry Q95 microcontroller.
+
+* Keyboard Maintainer: [GSKY](https://github.com/gksygithub)
+* Hardware Supported: KD87A_BFG_Edition
+* Hardware Availability: [GSKY GitHub](https://github.com/gksygithub/keyboard1)
+
+Make example for this keyboard (after setting up your build environment):
+
+    make darkproject/kd87a_bfg_edition:default
+
+Flashing example for this keyboard:
+
+    make darkproject/kd87a_bfg_edition:default:flash
+
+To reset the board into bootloader mode, do one of the following:
+
+* Hold the Reset switch mounted on the surface of the PCB back side after the USB cable is connected
+* Hold the Escape key while connecting the USB cable (also erases persistent settings)
+* Fn+ESC will reset the board to bootloader mode
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).

+ 1 - 0
keyboards/darkproject/kd87a_bfg_edition/rules.mk

@@ -0,0 +1 @@
+WEAR_LEVELING_DRIVER = spi_flash

+ 2 - 1
keyboards/eason/aeroboard/info.json

@@ -34,7 +34,8 @@
     },
     "diode_direction": "COL2ROW",
     "processor": "STM32F103",
-    "bootloader": "stm32duino",
+    "bootloader": "uf2boot",
+    "board": "STM32_F103_STM32DUINO"
     "layouts": {
         "LAYOUT_7u_space": {
             "layout": [

+ 106 - 0
keyboards/enter67/info.json

@@ -0,0 +1,106 @@
+{
+    "manufacturer": "KipperSun",
+    "keyboard_name": "enter67",
+    "maintainer": "KipperSun",
+    "bootloader": "stm32-dfu",
+    "diode_direction": "COL2ROW",
+    "features": {
+        "bootmagic": true,
+        "extrakey": true,
+        "mousekey": true,
+        "nkro": true
+    },
+    "indicators": {
+        "caps_lock": "B15",
+        "on_state": 0
+    },
+    "matrix_pins": {
+        "cols": ["A7", "B0", "B1", "B2", "B10", "B11", "B12", "B14", "A9", "A10", "A8", "B6", "B7", "B5", "B4"],
+        "rows": ["A1", "A2", "A3", "A4", "A5"]
+    },
+    "processor": "STM32F072",
+    "url": "",
+    "usb": {
+        "device_version": "0.0.1",
+        "pid": "0xAA66",
+        "vid": "0x4040"
+    },
+    "community_layouts": ["65_ansi_blocker"],
+    "layouts": {
+        "LAYOUT_65_ansi_blocker": {
+            "layout": [
+                {"label": "ESC", "matrix": [0, 0], "x": 0, "y": 0},
+                {"label": "!", "matrix": [0, 1], "x": 1, "y": 0},
+                {"label": "@", "matrix": [0, 2], "x": 2, "y": 0},
+                {"label": "#", "matrix": [0, 3], "x": 3, "y": 0},
+                {"label": "$", "matrix": [0, 4], "x": 4, "y": 0},
+                {"label": "%", "matrix": [0, 5], "x": 5, "y": 0},
+                {"label": "^", "matrix": [0, 6], "x": 6, "y": 0},
+                {"label": "&", "matrix": [0, 7], "x": 7, "y": 0},
+                {"label": "*", "matrix": [0, 8], "x": 8, "y": 0},
+                {"label": "(", "matrix": [0, 9], "x": 9, "y": 0},
+                {"label": ")", "matrix": [0, 10], "x": 10, "y": 0},
+                {"label": "_", "matrix": [0, 11], "x": 11, "y": 0},
+                {"label": "+", "matrix": [0, 12], "x": 12, "y": 0},
+                {"label": "Backspace", "matrix": [0, 13], "x": 13, "y": 0, "w": 2},
+                {"label": "Delete", "matrix": [0, 14], "x": 15, "y": 0},
+
+                {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+                {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1},
+                {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1},
+                {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1},
+                {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1},
+                {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1},
+                {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1},
+                {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1},
+                {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1},
+                {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1},
+                {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1},
+                {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1},
+                {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1},
+                {"label": "|", "matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
+                {"label": "Home", "matrix": [1, 14], "x": 15, "y": 1},
+
+                {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+                {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2},
+                {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2},
+                {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2},
+                {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2},
+                {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2},
+                {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2},
+                {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2},
+                {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2},
+                {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2},
+                {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2},
+                {"label": "k90", "matrix": [2, 11], "x": 11.75, "y": 2},
+                {"label": "Enter", "matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
+                {"label": "PgUp", "matrix": [2, 14], "x": 15, "y": 2},
+
+                {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+                {"label": "Z", "matrix": [3, 1], "x": 2.25, "y": 3},
+                {"label": "X", "matrix": [3, 2], "x": 3.25, "y": 3},
+                {"label": "C", "matrix": [3, 3], "x": 4.25, "y": 3},
+                {"label": "V", "matrix": [3, 4], "x": 5.25, "y": 3},
+                {"label": "B", "matrix": [3, 5], "x": 6.25, "y": 3},
+                {"label": "N", "matrix": [3, 6], "x": 7.25, "y": 3},
+                {"label": "M", "matrix": [3, 7], "x": 8.25, "y": 3},
+                {"label": "<", "matrix": [3, 8], "x": 9.25, "y": 3},
+                {"label": ">", "matrix": [3, 9], "x": 10.25, "y": 3},
+                {"label": "?", "matrix": [3, 10], "x": 11.25, "y": 3},
+                {"label": "Shift", "matrix": [3, 11], "x": 12.25, "y": 3, "w": 1.75},
+                {"label": "Up", "matrix": [3, 13], "x": 14, "y": 3},
+                {"label": "PgDn", "matrix": [3, 14], "x": 15, "y": 3},
+
+                {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
+                {"label": "Win", "matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25},
+                {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25},
+                {"label": "Space", "matrix": [4, 6], "x": 3.75, "y": 4, "w": 6.25},
+                {"label": "K91", "matrix": [4, 9], "x": 10, "y": 4, "w": 1.25},
+                {"label": "K92", "matrix": [4, 10], "x": 11.25, "y": 4, "w": 1.25},
+                {"label": "Left", "matrix": [4, 12], "x": 13, "y": 4},
+                {"label": "Down", "matrix": [4, 13], "x": 14, "y": 4},
+                {"label": "Right", "matrix": [4, 14], "x": 15, "y": 4}
+            ]
+        }
+    }
+}

+ 35 - 0
keyboards/enter67/keymaps/default/keymap.c

@@ -0,0 +1,35 @@
+/* Copyright 2022 LXF-YZP(yuezp)
+ *
+ * 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/>.
+ */
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+[0]=LAYOUT_65_ansi_blocker(
+    KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSPC, KC_HOME,
+    KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSLS, KC_END,
+    KC_CAPS, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT,          KC_ENT,  KC_PGUP,
+    KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT,          KC_UP,   KC_PGDN,
+    KC_LCTL, KC_LGUI, KC_LALT,                            KC_SPC,                    MO(1),   KC_RCTL,          KC_LEFT, KC_DOWN, KC_RGHT),
+
+[1]=LAYOUT_65_ansi_blocker(
+    KC_GRV,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_TRNS, KC_TRNS,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS,
+    KC_TRNS, KC_TRNS, KC_TRNS,                            KC_TRNS,                   KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS)
+
+};

+ 35 - 0
keyboards/enter67/keymaps/via/keymap.c

@@ -0,0 +1,35 @@
+/* Copyright 2022 LXF-YZP(yuezp)
+ *
+ * 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/>.
+ */
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+[0]=LAYOUT_65_ansi_blocker(
+    KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSPC, KC_HOME,
+    KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSLS, KC_END,
+    KC_CAPS, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT,          KC_ENT,  KC_PGUP,
+    KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT,          KC_UP,   KC_PGDN,
+    KC_LCTL, KC_LGUI, KC_LALT,                            KC_SPC,                    MO(1),   KC_RCTL,          KC_LEFT, KC_DOWN, KC_RGHT),
+
+[1]=LAYOUT_65_ansi_blocker(
+    KC_GRV,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_TRNS, KC_TRNS,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS,
+    KC_TRNS, KC_TRNS, KC_TRNS,                            KC_TRNS,                   KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS)
+
+};

+ 1 - 0
keyboards/enter67/keymaps/via/rules.mk

@@ -0,0 +1 @@
+VIA_ENABLE = yes

+ 26 - 0
keyboards/enter67/readme.md

@@ -0,0 +1,26 @@
+# ENTER67 - PCB
+
+![enter67](https://imgur.com/igF8Lurh.jpg)
+
+67 layout PCB, with option for stepped Caps Lock
+
+* Keyboard Maintainer: https://github.com/LXF-YZP
+* Hardware Supported: enter67 PCB
+
+Make example for this keyboard (after setting up your build environment):
+    
+    make enter67:default
+    
+Flashing example for this keyboard:
+
+    make enter67:default:flash
+    
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+## Bootloader
+
+Enter the bootloader in 3 ways:
+
+* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
+* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available

+ 1 - 0
keyboards/enter67/rules.mk

@@ -0,0 +1 @@
+# This file intentionally left blank

+ 25 - 0
keyboards/era/sirind/klein_sd/config.h

@@ -0,0 +1,25 @@
+/* Copyright 2023 eerraa
+ *
+ * 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/>.
+ */
+
+#pragma once
+
+/* BACKLIGHT PWM */
+#define BACKLIGHT_PWM_DRIVER PWMD7
+#define BACKLIGHT_PWM_CHANNEL RP2040_PWM_CHANNEL_B
+
+/* RGB Matrix */
+#define RGB_MATRIX_DEFAULT_VAL 60
+#define RGB_DISABLE_WHEN_USB_SUSPENDED

+ 21 - 0
keyboards/era/sirind/klein_sd/halconf.h

@@ -0,0 +1,21 @@
+/* Copyright 2023 eerraa
+ *
+ * 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/>.
+ */
+
+#pragma once
+
+#define HAL_USE_PWM TRUE
+
+#include_next <halconf.h>

+ 588 - 0
keyboards/era/sirind/klein_sd/info.json

@@ -0,0 +1,588 @@
+{
+    "manufacturer": "SIRIND",
+    "keyboard_name": "Klein_SD",
+    "maintainer": "eerraa",
+    "backlight": {
+        "pin": "GP15"
+    },
+    "bootloader": "rp2040",
+    "build": {
+        "debounce_type": "sym_defer_pk"
+    },
+    "diode_direction": "COL2ROW",
+    "features": {
+        "backlight": true,
+        "bootmagic": true,
+        "extrakey": true,
+        "mousekey": true,
+        "nkro": true,
+        "rgb_matrix": true
+    },
+    "indicators": {
+        "caps_lock": "GP16",
+        "on_state": 0,
+        "scroll_lock": "GP17"
+    },
+    "matrix_pins": {
+        "cols": ["GP22", "GP23", "GP24", "GP25", "GP26", "GP27", "GP28", "GP29", "GP11", "GP10", "GP9", "GP7", "GP6", "GP5", "GP4", "GP3"],
+        "rows": ["GP18", "GP19", "GP20", "GP21", "GP14", "GP2", "GP1", "GP8", "GP12", "GP13"]
+    },
+    "processor": "RP2040",
+    "rgb_matrix": {
+        "animations": {
+            "alphas_mods": true,
+            "band_pinwheel_sat": true,
+            "band_pinwheel_val": true,
+            "band_sat": true,
+            "band_spiral_sat": true,
+            "band_spiral_val": true,
+            "band_val": true,
+            "breathing": true,
+            "cycle_all": true,
+            "cycle_left_right": true,
+            "cycle_out_in": true,
+            "cycle_out_in_dual": true,
+            "cycle_pinwheel": true,
+            "cycle_spiral": true,
+            "cycle_up_down": true,
+            "digital_rain": true,
+            "dual_beacon": true,
+            "gradient_left_right": true,
+            "gradient_up_down": true,
+            "hue_breathing": true,
+            "hue_pendulum": true,
+            "hue_wave": true,
+            "jellybean_raindrops": true,
+            "multisplash": true,
+            "pixel_flow": true,
+            "pixel_fractal": true,
+            "pixel_rain": true,
+            "rainbow_beacon": true,
+            "rainbow_moving_chevron": true,
+            "rainbow_pinwheels": true,
+            "raindrops": true,
+            "solid_multisplash": true,
+            "solid_reactive": true,
+            "solid_reactive_cross": true,
+            "solid_reactive_multicross": true,
+            "solid_reactive_multinexus": true,
+            "solid_reactive_multiwide": true,
+            "solid_reactive_nexus": true,
+            "solid_reactive_simple": true,
+            "solid_reactive_wide": true,
+            "solid_splash": true,
+            "splash": true,
+            "typing_heatmap": true
+        },
+        "driver": "ws2812",
+        "layout": [
+            {"matrix": [0, 7], "x": 97, "y": 10, "flags": 4},
+            {"matrix": [0, 6], "x": 84, "y": 8, "flags": 4},
+            {"matrix": [0, 5], "x": 72, "y": 5, "flags": 4},
+            {"matrix": [0, 4], "x": 59, "y": 3, "flags": 4},
+            {"matrix": [0, 3], "x": 46, "y": 1, "flags": 4},
+            {"matrix": [0, 2], "x": 33, "y": 2, "flags": 4},
+            {"matrix": [0, 1], "x": 20, "y": 2, "flags": 4},
+            {"matrix": [0, 0], "x": 4, "y": 0, "flags": 1},
+            {"matrix": [1, 0], "x": 1, "y": 13, "flags": 1},
+            {"matrix": [1, 1], "x": 21, "y": 15, "flags": 1},
+            {"matrix": [1, 2], "x": 37, "y": 15, "flags": 4},
+            {"matrix": [1, 3], "x": 50, "y": 15, "flags": 4},
+            {"matrix": [1, 4], "x": 63, "y": 17, "flags": 4},
+            {"matrix": [1, 5], "x": 76, "y": 20, "flags": 4},
+            {"matrix": [1, 6], "x": 88, "y": 22, "flags": 4},
+            {"matrix": [1, 7], "x": 101, "y": 24, "flags": 4},
+            {"matrix": [2, 6], "x": 90, "y": 36, "flags": 4},
+            {"matrix": [2, 5], "x": 78, "y": 33, "flags": 4},
+            {"matrix": [2, 4], "x": 65, "y": 31, "flags": 4},
+            {"matrix": [2, 3], "x": 52, "y": 29, "flags": 4},
+            {"matrix": [2, 2], "x": 39, "y": 29, "flags": 4},
+            {"matrix": [2, 1], "x": 18, "y": 29, "flags": 1},
+            {"matrix": [2, 0], "x": 0, "y": 27, "flags": 1},
+            {"matrix": [3, 1], "x": 21, "y": 42, "flags": 1},
+            {"matrix": [3, 2], "x": 42, "y": 42, "flags": 4},
+            {"matrix": [3, 3], "x": 55, "y": 43, "flags": 4},
+            {"matrix": [3, 4], "x": 68, "y": 45, "flags": 4},
+            {"matrix": [3, 5], "x": 81, "y": 47, "flags": 4},
+            {"matrix": [3, 6], "x": 93, "y": 50, "flags": 4},
+            {"matrix": [4, 6], "x": 97, "y": 64, "flags": 1},
+            {"matrix": [4, 5], "x": 77, "y": 60, "flags": 4},
+            {"matrix": [4, 3], "x": 53, "y": 57, "flags": 1},
+            {"matrix": [4, 1], "x": 16, "y": 55, "flags": 1},
+            {"matrix": [0, 8], "x": 130, "y": 9, "flags": 4},
+            {"matrix": [0, 9], "x": 143, "y": 7, "flags": 4},
+            {"matrix": [0, 10], "x": 156, "y": 4, "flags": 4},
+            {"matrix": [0, 11], "x": 168, "y": 2, "flags": 4},
+            {"matrix": [0, 12], "x": 182, "y": 1, "flags": 4},
+            {"matrix": [0, 13], "x": 195, "y": 2, "flags": 4},
+            {"matrix": [0, 15], "x": 214, "y": 2, "flags": 1},
+            {"matrix": [1, 15], "x": 220, "y": 15, "flags": 4},
+            {"matrix": [1, 14], "x": 203, "y": 15, "flags": 4},
+            {"matrix": [1, 13], "x": 191, "y": 15, "flags": 4},
+            {"matrix": [1, 12], "x": 178, "y": 15, "flags": 4},
+            {"matrix": [1, 11], "x": 164, "y": 16, "flags": 4},
+            {"matrix": [1, 10], "x": 152, "y": 18, "flags": 4},
+            {"matrix": [1, 9], "x": 139, "y": 21, "flags": 4},
+            {"matrix": [1, 8], "x": 126, "y": 23, "flags": 4},
+            {"matrix": [2, 8], "x": 131, "y": 36, "flags": 4},
+            {"matrix": [2, 9], "x": 144, "y": 33, "flags": 4},
+            {"matrix": [2, 10], "x": 156, "y": 31, "flags": 4},
+            {"matrix": [2, 11], "x": 169, "y": 29, "flags": 4},
+            {"matrix": [2, 12], "x": 182, "y": 29, "flags": 4},
+            {"matrix": [2, 13], "x": 195, "y": 29, "flags": 4},
+            {"matrix": [2, 15], "x": 216, "y": 29, "flags": 1},
+            {"matrix": [3, 15], "x": 216, "y": 42, "flags": 1},
+            {"matrix": [3, 13], "x": 192, "y": 42, "flags": 4},
+            {"matrix": [3, 12], "x": 179, "y": 42, "flags": 4},
+            {"matrix": [3, 11], "x": 166, "y": 43, "flags": 4},
+            {"matrix": [3, 10], "x": 153, "y": 45, "flags": 4},
+            {"matrix": [3, 9], "x": 140, "y": 48, "flags": 4},
+            {"matrix": [3, 8], "x": 128, "y": 50, "flags": 4},
+            {"matrix": [4, 9], "x": 141, "y": 61, "flags": 4},
+            {"matrix": [4, 11], "x": 168, "y": 57, "flags": 1},
+            {"matrix": [4, 13], "x": 192, "y": 55, "flags": 1},
+            {"matrix": [4, 14], "x": 205, "y": 55, "flags": 1},
+            {"matrix": [4, 15], "x": 224, "y": 55, "flags": 1}
+        ]
+    },
+    "url": "",
+    "usb": {
+        "device_version": "1.0.0",
+        "pid": "0x0005",
+        "vid": "0x4552"
+    },
+    "ws2812": {
+        "driver": "vendor",
+        "pin": "GP0"
+    },
+    "layouts": {
+        "LAYOUT": {
+            "layout": [
+                {"matrix": [0, 0], "x": 0, "y": 0},
+                {"matrix": [0, 1], "x": 1.5, "y": 0},
+                {"matrix": [0, 2], "x": 2.5, "y": 0},
+                {"matrix": [0, 3], "x": 3.5, "y": 0},
+                {"matrix": [0, 4], "x": 4.5, "y": 0},
+                {"matrix": [0, 5], "x": 5.5, "y": 0},
+                {"matrix": [0, 6], "x": 6.5, "y": 0},
+                {"matrix": [0, 7], "x": 7.5, "y": 0},
+                {"matrix": [5, 8], "x": 10.75, "y": 0},
+                {"matrix": [5, 9], "x": 11.75, "y": 0},
+                {"matrix": [5, 10], "x": 12.75, "y": 0},
+                {"matrix": [5, 11], "x": 13.75, "y": 0},
+                {"matrix": [5, 12], "x": 14.75, "y": 0},
+                {"matrix": [5, 13], "x": 15.75, "y": 0},
+                {"matrix": [5, 14], "x": 16.75, "y": 0},
+                {"matrix": [5, 15], "x": 17.75, "y": 0},
+                {"matrix": [1, 0], "x": 0, "y": 1},
+                {"matrix": [1, 1], "x": 1.5, "y": 1, "w": 1.5},
+                {"matrix": [1, 2], "x": 3, "y": 1},
+                {"matrix": [1, 3], "x": 4, "y": 1},
+                {"matrix": [1, 4], "x": 5, "y": 1},
+                {"matrix": [1, 5], "x": 6, "y": 1},
+                {"matrix": [1, 6], "x": 7, "y": 1},
+                {"matrix": [1, 7], "x": 8, "y": 1},
+                {"matrix": [6, 8], "x": 10.25, "y": 1},
+                {"matrix": [6, 9], "x": 11.25, "y": 1},
+                {"matrix": [6, 10], "x": 12.25, "y": 1},
+                {"matrix": [6, 11], "x": 13.25, "y": 1},
+                {"matrix": [6, 12], "x": 14.25, "y": 1},
+                {"matrix": [6, 13], "x": 15.25, "y": 1},
+                {"matrix": [6, 14], "x": 16.25, "y": 1},
+                {"matrix": [6, 15], "x": 17.25, "y": 1, "w": 1.5},
+                {"matrix": [2, 0], "x": 0, "y": 2},
+                {"matrix": [2, 1], "x": 1.5, "y": 2, "w": 1.75},
+                {"matrix": [2, 2], "x": 3.25, "y": 2},
+                {"matrix": [2, 3], "x": 4.25, "y": 2},
+                {"matrix": [2, 4], "x": 5.25, "y": 2},
+                {"matrix": [2, 5], "x": 6.25, "y": 2},
+                {"matrix": [2, 6], "x": 7.25, "y": 2},
+                {"matrix": [7, 8], "x": 10.5, "y": 2},
+                {"matrix": [7, 9], "x": 11.5, "y": 2},
+                {"matrix": [7, 10], "x": 12.5, "y": 2},
+                {"matrix": [7, 11], "x": 13.5, "y": 2},
+                {"matrix": [7, 12], "x": 14.5, "y": 2},
+                {"matrix": [7, 13], "x": 15.5, "y": 2},
+                {"matrix": [7, 15], "x": 16.5, "y": 2, "w": 2.25},
+                {"matrix": [3, 1], "x": 1.5, "y": 3, "w": 2.25},
+                {"matrix": [3, 2], "x": 3.75, "y": 3},
+                {"matrix": [3, 3], "x": 4.75, "y": 3},
+                {"matrix": [3, 4], "x": 5.75, "y": 3},
+                {"matrix": [3, 5], "x": 6.75, "y": 3},
+                {"matrix": [3, 6], "x": 7.75, "y": 3},
+                {"matrix": [8, 8], "x": 10, "y": 3},
+                {"matrix": [8, 9], "x": 11, "y": 3},
+                {"matrix": [8, 10], "x": 12, "y": 3},
+                {"matrix": [8, 11], "x": 13, "y": 3},
+                {"matrix": [8, 12], "x": 14, "y": 3},
+                {"matrix": [8, 13], "x": 15, "y": 3},
+                {"matrix": [8, 14], "x": 16, "y": 3, "w": 1.75},
+                {"matrix": [8, 15], "x": 17.75, "y": 3},
+                {"matrix": [4, 1], "x": 1.5, "y": 4},
+                {"matrix": [4, 3], "x": 4.5, "y": 4, "w": 1.5},
+                {"matrix": [4, 5], "x": 6, "y": 4, "w": 2.25},
+                {"matrix": [4, 6], "x": 8.25, "y": 4},
+                {"matrix": [9, 9], "x": 10, "y": 4, "w": 2.75},
+                {"matrix": [9, 11], "x": 12.75, "y": 4, "w": 1.5},
+                {"matrix": [9, 13], "x": 15, "y": 4},
+                {"matrix": [9, 14], "x": 16, "y": 4},
+                {"matrix": [9, 15], "x": 17, "y": 4}
+            ]
+        },
+        "LAYOUT_ansi": {
+            "layout": [
+                {"matrix": [0, 0], "x": 0, "y": 0},
+                {"matrix": [0, 1], "x": 1.5, "y": 0},
+                {"matrix": [0, 2], "x": 2.5, "y": 0},
+                {"matrix": [0, 3], "x": 3.5, "y": 0},
+                {"matrix": [0, 4], "x": 4.5, "y": 0},
+                {"matrix": [0, 5], "x": 5.5, "y": 0},
+                {"matrix": [0, 6], "x": 6.5, "y": 0},
+                {"matrix": [0, 7], "x": 7.5, "y": 0},
+                {"matrix": [5, 8], "x": 10.75, "y": 0},
+                {"matrix": [5, 9], "x": 11.75, "y": 0},
+                {"matrix": [5, 10], "x": 12.75, "y": 0},
+                {"matrix": [5, 11], "x": 13.75, "y": 0},
+                {"matrix": [5, 12], "x": 14.75, "y": 0},
+                {"matrix": [5, 13], "x": 15.75, "y": 0},
+                {"matrix": [5, 15], "x": 16.75, "y": 0, "w": 2},
+                {"matrix": [1, 0], "x": 0, "y": 1},
+                {"matrix": [1, 1], "x": 1.5, "y": 1, "w": 1.5},
+                {"matrix": [1, 2], "x": 3, "y": 1},
+                {"matrix": [1, 3], "x": 4, "y": 1},
+                {"matrix": [1, 4], "x": 5, "y": 1},
+                {"matrix": [1, 5], "x": 6, "y": 1},
+                {"matrix": [1, 6], "x": 7, "y": 1},
+                {"matrix": [1, 7], "x": 8, "y": 1},
+                {"matrix": [6, 8], "x": 10.25, "y": 1},
+                {"matrix": [6, 9], "x": 11.25, "y": 1},
+                {"matrix": [6, 10], "x": 12.25, "y": 1},
+                {"matrix": [6, 11], "x": 13.25, "y": 1},
+                {"matrix": [6, 12], "x": 14.25, "y": 1},
+                {"matrix": [6, 13], "x": 15.25, "y": 1},
+                {"matrix": [6, 14], "x": 16.25, "y": 1},
+                {"matrix": [6, 15], "x": 17.25, "y": 1, "w": 1.5},
+                {"matrix": [2, 0], "x": 0, "y": 2},
+                {"matrix": [2, 1], "x": 1.5, "y": 2, "w": 1.75},
+                {"matrix": [2, 2], "x": 3.25, "y": 2},
+                {"matrix": [2, 3], "x": 4.25, "y": 2},
+                {"matrix": [2, 4], "x": 5.25, "y": 2},
+                {"matrix": [2, 5], "x": 6.25, "y": 2},
+                {"matrix": [2, 6], "x": 7.25, "y": 2},
+                {"matrix": [7, 8], "x": 10.5, "y": 2},
+                {"matrix": [7, 9], "x": 11.5, "y": 2},
+                {"matrix": [7, 10], "x": 12.5, "y": 2},
+                {"matrix": [7, 11], "x": 13.5, "y": 2},
+                {"matrix": [7, 12], "x": 14.5, "y": 2},
+                {"matrix": [7, 13], "x": 15.5, "y": 2},
+                {"matrix": [7, 15], "x": 16.5, "y": 2, "w": 2.25},
+                {"matrix": [3, 1], "x": 1.5, "y": 3, "w": 2.25},
+                {"matrix": [3, 2], "x": 3.75, "y": 3},
+                {"matrix": [3, 3], "x": 4.75, "y": 3},
+                {"matrix": [3, 4], "x": 5.75, "y": 3},
+                {"matrix": [3, 5], "x": 6.75, "y": 3},
+                {"matrix": [3, 6], "x": 7.75, "y": 3},
+                {"matrix": [8, 8], "x": 10, "y": 3},
+                {"matrix": [8, 9], "x": 11, "y": 3},
+                {"matrix": [8, 10], "x": 12, "y": 3},
+                {"matrix": [8, 11], "x": 13, "y": 3},
+                {"matrix": [8, 12], "x": 14, "y": 3},
+                {"matrix": [8, 13], "x": 15, "y": 3},
+                {"matrix": [8, 14], "x": 16, "y": 3, "w": 2.75},
+                {"matrix": [4, 1], "x": 1.5, "y": 4},
+                {"matrix": [4, 3], "x": 4.5, "y": 4, "w": 1.5},
+                {"matrix": [4, 5], "x": 6, "y": 4, "w": 2.25},
+                {"matrix": [4, 6], "x": 8.25, "y": 4},
+                {"matrix": [9, 9], "x": 10, "y": 4, "w": 2.75},
+                {"matrix": [9, 11], "x": 12.75, "y": 4, "w": 1.5},
+                {"matrix": [9, 15], "x": 17.25, "y": 4, "w": 1.5}
+            ]
+        },
+        "LAYOUT_ansi_arrow": {
+            "layout": [
+                {"matrix": [0, 0], "x": 0, "y": 0},
+                {"matrix": [0, 1], "x": 1.5, "y": 0},
+                {"matrix": [0, 2], "x": 2.5, "y": 0},
+                {"matrix": [0, 3], "x": 3.5, "y": 0},
+                {"matrix": [0, 4], "x": 4.5, "y": 0},
+                {"matrix": [0, 5], "x": 5.5, "y": 0},
+                {"matrix": [0, 6], "x": 6.5, "y": 0},
+                {"matrix": [0, 7], "x": 7.5, "y": 0},
+                {"matrix": [5, 8], "x": 10.75, "y": 0},
+                {"matrix": [5, 9], "x": 11.75, "y": 0},
+                {"matrix": [5, 10], "x": 12.75, "y": 0},
+                {"matrix": [5, 11], "x": 13.75, "y": 0},
+                {"matrix": [5, 12], "x": 14.75, "y": 0},
+                {"matrix": [5, 13], "x": 15.75, "y": 0},
+                {"matrix": [5, 15], "x": 16.75, "y": 0, "w": 2},
+                {"matrix": [1, 0], "x": 0, "y": 1},
+                {"matrix": [1, 1], "x": 1.5, "y": 1, "w": 1.5},
+                {"matrix": [1, 2], "x": 3, "y": 1},
+                {"matrix": [1, 3], "x": 4, "y": 1},
+                {"matrix": [1, 4], "x": 5, "y": 1},
+                {"matrix": [1, 5], "x": 6, "y": 1},
+                {"matrix": [1, 6], "x": 7, "y": 1},
+                {"matrix": [1, 7], "x": 8, "y": 1},
+                {"matrix": [6, 8], "x": 10.25, "y": 1},
+                {"matrix": [6, 9], "x": 11.25, "y": 1},
+                {"matrix": [6, 10], "x": 12.25, "y": 1},
+                {"matrix": [6, 11], "x": 13.25, "y": 1},
+                {"matrix": [6, 12], "x": 14.25, "y": 1},
+                {"matrix": [6, 13], "x": 15.25, "y": 1},
+                {"matrix": [6, 14], "x": 16.25, "y": 1},
+                {"matrix": [6, 15], "x": 17.25, "y": 1, "w": 1.5},
+                {"matrix": [2, 0], "x": 0, "y": 2},
+                {"matrix": [2, 1], "x": 1.5, "y": 2, "w": 1.75},
+                {"matrix": [2, 2], "x": 3.25, "y": 2},
+                {"matrix": [2, 3], "x": 4.25, "y": 2},
+                {"matrix": [2, 4], "x": 5.25, "y": 2},
+                {"matrix": [2, 5], "x": 6.25, "y": 2},
+                {"matrix": [2, 6], "x": 7.25, "y": 2},
+                {"matrix": [7, 8], "x": 10.5, "y": 2},
+                {"matrix": [7, 9], "x": 11.5, "y": 2},
+                {"matrix": [7, 10], "x": 12.5, "y": 2},
+                {"matrix": [7, 11], "x": 13.5, "y": 2},
+                {"matrix": [7, 12], "x": 14.5, "y": 2},
+                {"matrix": [7, 13], "x": 15.5, "y": 2},
+                {"matrix": [7, 15], "x": 16.5, "y": 2, "w": 2.25},
+                {"matrix": [3, 1], "x": 1.5, "y": 3, "w": 2.25},
+                {"matrix": [3, 2], "x": 3.75, "y": 3},
+                {"matrix": [3, 3], "x": 4.75, "y": 3},
+                {"matrix": [3, 4], "x": 5.75, "y": 3},
+                {"matrix": [3, 5], "x": 6.75, "y": 3},
+                {"matrix": [3, 6], "x": 7.75, "y": 3},
+                {"matrix": [8, 8], "x": 10, "y": 3},
+                {"matrix": [8, 9], "x": 11, "y": 3},
+                {"matrix": [8, 10], "x": 12, "y": 3},
+                {"matrix": [8, 11], "x": 13, "y": 3},
+                {"matrix": [8, 12], "x": 14, "y": 3},
+                {"matrix": [8, 13], "x": 15, "y": 3},
+                {"matrix": [8, 14], "x": 16, "y": 3},
+                {"matrix": [8, 15], "x": 17, "y": 3, "w": 1.75},
+                {"matrix": [4, 1], "x": 1.5, "y": 4},
+                {"matrix": [4, 3], "x": 4.5, "y": 4, "w": 1.5},
+                {"matrix": [4, 5], "x": 6, "y": 4, "w": 2.25},
+                {"matrix": [4, 6], "x": 8.25, "y": 4},
+                {"matrix": [9, 9], "x": 10, "y": 4, "w": 2.75},
+                {"matrix": [9, 11], "x": 12.75, "y": 4, "w": 1.5},
+                {"matrix": [9, 13], "x": 15, "y": 4},
+                {"matrix": [9, 14], "x": 16, "y": 4},
+                {"matrix": [9, 15], "x": 17, "y": 4}
+            ]
+        },
+        "LAYOUT_ansi_split_bs": {
+            "layout": [
+                {"matrix": [0, 0], "x": 0, "y": 0},
+                {"matrix": [0, 1], "x": 1.5, "y": 0},
+                {"matrix": [0, 2], "x": 2.5, "y": 0},
+                {"matrix": [0, 3], "x": 3.5, "y": 0},
+                {"matrix": [0, 4], "x": 4.5, "y": 0},
+                {"matrix": [0, 5], "x": 5.5, "y": 0},
+                {"matrix": [0, 6], "x": 6.5, "y": 0},
+                {"matrix": [0, 7], "x": 7.5, "y": 0},
+                {"matrix": [5, 8], "x": 10.75, "y": 0},
+                {"matrix": [5, 9], "x": 11.75, "y": 0},
+                {"matrix": [5, 10], "x": 12.75, "y": 0},
+                {"matrix": [5, 11], "x": 13.75, "y": 0},
+                {"matrix": [5, 12], "x": 14.75, "y": 0},
+                {"matrix": [5, 13], "x": 15.75, "y": 0},
+                {"matrix": [5, 14], "x": 16.75, "y": 0},
+                {"matrix": [5, 15], "x": 17.75, "y": 0},
+                {"matrix": [1, 0], "x": 0, "y": 1},
+                {"matrix": [1, 1], "x": 1.5, "y": 1, "w": 1.5},
+                {"matrix": [1, 2], "x": 3, "y": 1},
+                {"matrix": [1, 3], "x": 4, "y": 1},
+                {"matrix": [1, 4], "x": 5, "y": 1},
+                {"matrix": [1, 5], "x": 6, "y": 1},
+                {"matrix": [1, 6], "x": 7, "y": 1},
+                {"matrix": [1, 7], "x": 8, "y": 1},
+                {"matrix": [6, 8], "x": 10.25, "y": 1},
+                {"matrix": [6, 9], "x": 11.25, "y": 1},
+                {"matrix": [6, 10], "x": 12.25, "y": 1},
+                {"matrix": [6, 11], "x": 13.25, "y": 1},
+                {"matrix": [6, 12], "x": 14.25, "y": 1},
+                {"matrix": [6, 13], "x": 15.25, "y": 1},
+                {"matrix": [6, 14], "x": 16.25, "y": 1},
+                {"matrix": [6, 15], "x": 17.25, "y": 1, "w": 1.5},
+                {"matrix": [2, 0], "x": 0, "y": 2},
+                {"matrix": [2, 1], "x": 1.5, "y": 2, "w": 1.75},
+                {"matrix": [2, 2], "x": 3.25, "y": 2},
+                {"matrix": [2, 3], "x": 4.25, "y": 2},
+                {"matrix": [2, 4], "x": 5.25, "y": 2},
+                {"matrix": [2, 5], "x": 6.25, "y": 2},
+                {"matrix": [2, 6], "x": 7.25, "y": 2},
+                {"matrix": [7, 8], "x": 10.5, "y": 2},
+                {"matrix": [7, 9], "x": 11.5, "y": 2},
+                {"matrix": [7, 10], "x": 12.5, "y": 2},
+                {"matrix": [7, 11], "x": 13.5, "y": 2},
+                {"matrix": [7, 12], "x": 14.5, "y": 2},
+                {"matrix": [7, 13], "x": 15.5, "y": 2},
+                {"matrix": [7, 15], "x": 16.5, "y": 2, "w": 2.25},
+                {"matrix": [3, 1], "x": 1.5, "y": 3, "w": 2.25},
+                {"matrix": [3, 2], "x": 3.75, "y": 3},
+                {"matrix": [3, 3], "x": 4.75, "y": 3},
+                {"matrix": [3, 4], "x": 5.75, "y": 3},
+                {"matrix": [3, 5], "x": 6.75, "y": 3},
+                {"matrix": [3, 6], "x": 7.75, "y": 3},
+                {"matrix": [8, 8], "x": 10, "y": 3},
+                {"matrix": [8, 9], "x": 11, "y": 3},
+                {"matrix": [8, 10], "x": 12, "y": 3},
+                {"matrix": [8, 11], "x": 13, "y": 3},
+                {"matrix": [8, 12], "x": 14, "y": 3},
+                {"matrix": [8, 13], "x": 15, "y": 3},
+                {"matrix": [8, 14], "x": 16, "y": 3, "w": 2.75},
+                {"matrix": [4, 1], "x": 1.5, "y": 4},
+                {"matrix": [4, 3], "x": 4.5, "y": 4, "w": 1.5},
+                {"matrix": [4, 5], "x": 6, "y": 4, "w": 2.25},
+                {"matrix": [4, 6], "x": 8.25, "y": 4},
+                {"matrix": [9, 9], "x": 10, "y": 4, "w": 2.75},
+                {"matrix": [9, 11], "x": 12.75, "y": 4, "w": 1.5},
+                {"matrix": [9, 15], "x": 17.25, "y": 4, "w": 1.5}
+            ]
+        },
+        "LAYOUT_ansi_split_bs_rsft": {
+            "layout": [
+                {"matrix": [0, 0], "x": 0, "y": 0},
+                {"matrix": [0, 1], "x": 1.5, "y": 0},
+                {"matrix": [0, 2], "x": 2.5, "y": 0},
+                {"matrix": [0, 3], "x": 3.5, "y": 0},
+                {"matrix": [0, 4], "x": 4.5, "y": 0},
+                {"matrix": [0, 5], "x": 5.5, "y": 0},
+                {"matrix": [0, 6], "x": 6.5, "y": 0},
+                {"matrix": [0, 7], "x": 7.5, "y": 0},
+                {"matrix": [5, 8], "x": 10.75, "y": 0},
+                {"matrix": [5, 9], "x": 11.75, "y": 0},
+                {"matrix": [5, 10], "x": 12.75, "y": 0},
+                {"matrix": [5, 11], "x": 13.75, "y": 0},
+                {"matrix": [5, 12], "x": 14.75, "y": 0},
+                {"matrix": [5, 13], "x": 15.75, "y": 0},
+                {"matrix": [5, 14], "x": 16.75, "y": 0},
+                {"matrix": [5, 15], "x": 17.75, "y": 0},
+                {"matrix": [1, 0], "x": 0, "y": 1},
+                {"matrix": [1, 1], "x": 1.5, "y": 1, "w": 1.5},
+                {"matrix": [1, 2], "x": 3, "y": 1},
+                {"matrix": [1, 3], "x": 4, "y": 1},
+                {"matrix": [1, 4], "x": 5, "y": 1},
+                {"matrix": [1, 5], "x": 6, "y": 1},
+                {"matrix": [1, 6], "x": 7, "y": 1},
+                {"matrix": [1, 7], "x": 8, "y": 1},
+                {"matrix": [6, 8], "x": 10.25, "y": 1},
+                {"matrix": [6, 9], "x": 11.25, "y": 1},
+                {"matrix": [6, 10], "x": 12.25, "y": 1},
+                {"matrix": [6, 11], "x": 13.25, "y": 1},
+                {"matrix": [6, 12], "x": 14.25, "y": 1},
+                {"matrix": [6, 13], "x": 15.25, "y": 1},
+                {"matrix": [6, 14], "x": 16.25, "y": 1},
+                {"matrix": [6, 15], "x": 17.25, "y": 1, "w": 1.5},
+                {"matrix": [2, 0], "x": 0, "y": 2},
+                {"matrix": [2, 1], "x": 1.5, "y": 2, "w": 1.75},
+                {"matrix": [2, 2], "x": 3.25, "y": 2},
+                {"matrix": [2, 3], "x": 4.25, "y": 2},
+                {"matrix": [2, 4], "x": 5.25, "y": 2},
+                {"matrix": [2, 5], "x": 6.25, "y": 2},
+                {"matrix": [2, 6], "x": 7.25, "y": 2},
+                {"matrix": [7, 8], "x": 10.5, "y": 2},
+                {"matrix": [7, 9], "x": 11.5, "y": 2},
+                {"matrix": [7, 10], "x": 12.5, "y": 2},
+                {"matrix": [7, 11], "x": 13.5, "y": 2},
+                {"matrix": [7, 12], "x": 14.5, "y": 2},
+                {"matrix": [7, 13], "x": 15.5, "y": 2},
+                {"matrix": [7, 15], "x": 16.5, "y": 2, "w": 2.25},
+                {"matrix": [3, 1], "x": 1.5, "y": 3, "w": 2.25},
+                {"matrix": [3, 2], "x": 3.75, "y": 3},
+                {"matrix": [3, 3], "x": 4.75, "y": 3},
+                {"matrix": [3, 4], "x": 5.75, "y": 3},
+                {"matrix": [3, 5], "x": 6.75, "y": 3},
+                {"matrix": [3, 6], "x": 7.75, "y": 3},
+                {"matrix": [8, 8], "x": 10, "y": 3},
+                {"matrix": [8, 9], "x": 11, "y": 3},
+                {"matrix": [8, 10], "x": 12, "y": 3},
+                {"matrix": [8, 11], "x": 13, "y": 3},
+                {"matrix": [8, 12], "x": 14, "y": 3},
+                {"matrix": [8, 13], "x": 15, "y": 3},
+                {"matrix": [8, 14], "x": 16, "y": 3, "w": 1.75},
+                {"matrix": [8, 15], "x": 17.75, "y": 3},
+                {"matrix": [4, 1], "x": 1.5, "y": 4},
+                {"matrix": [4, 3], "x": 4.5, "y": 4, "w": 1.5},
+                {"matrix": [4, 5], "x": 6, "y": 4, "w": 2.25},
+                {"matrix": [4, 6], "x": 8.25, "y": 4},
+                {"matrix": [9, 9], "x": 10, "y": 4, "w": 2.75},
+                {"matrix": [9, 11], "x": 12.75, "y": 4, "w": 1.5},
+                {"matrix": [9, 15], "x": 17.25, "y": 4, "w": 1.5}
+            ]
+        },
+        "LAYOUT_arrow_split_bs": {
+            "layout": [
+                {"matrix": [0, 0], "x": 0, "y": 0},
+                {"matrix": [0, 1], "x": 1.5, "y": 0},
+                {"matrix": [0, 2], "x": 2.5, "y": 0},
+                {"matrix": [0, 3], "x": 3.5, "y": 0},
+                {"matrix": [0, 4], "x": 4.5, "y": 0},
+                {"matrix": [0, 5], "x": 5.5, "y": 0},
+                {"matrix": [0, 6], "x": 6.5, "y": 0},
+                {"matrix": [0, 7], "x": 7.5, "y": 0},
+                {"matrix": [5, 8], "x": 10.75, "y": 0},
+                {"matrix": [5, 9], "x": 11.75, "y": 0},
+                {"matrix": [5, 10], "x": 12.75, "y": 0},
+                {"matrix": [5, 11], "x": 13.75, "y": 0},
+                {"matrix": [5, 12], "x": 14.75, "y": 0},
+                {"matrix": [5, 13], "x": 15.75, "y": 0},
+                {"matrix": [5, 14], "x": 16.75, "y": 0},
+                {"matrix": [5, 15], "x": 17.75, "y": 0},
+                {"matrix": [1, 0], "x": 0, "y": 1},
+                {"matrix": [1, 1], "x": 1.5, "y": 1, "w": 1.5},
+                {"matrix": [1, 2], "x": 3, "y": 1},
+                {"matrix": [1, 3], "x": 4, "y": 1},
+                {"matrix": [1, 4], "x": 5, "y": 1},
+                {"matrix": [1, 5], "x": 6, "y": 1},
+                {"matrix": [1, 6], "x": 7, "y": 1},
+                {"matrix": [1, 7], "x": 8, "y": 1},
+                {"matrix": [6, 8], "x": 10.25, "y": 1},
+                {"matrix": [6, 9], "x": 11.25, "y": 1},
+                {"matrix": [6, 10], "x": 12.25, "y": 1},
+                {"matrix": [6, 11], "x": 13.25, "y": 1},
+                {"matrix": [6, 12], "x": 14.25, "y": 1},
+                {"matrix": [6, 13], "x": 15.25, "y": 1},
+                {"matrix": [6, 14], "x": 16.25, "y": 1},
+                {"matrix": [6, 15], "x": 17.25, "y": 1, "w": 1.5},
+                {"matrix": [2, 0], "x": 0, "y": 2},
+                {"matrix": [2, 1], "x": 1.5, "y": 2, "w": 1.75},
+                {"matrix": [2, 2], "x": 3.25, "y": 2},
+                {"matrix": [2, 3], "x": 4.25, "y": 2},
+                {"matrix": [2, 4], "x": 5.25, "y": 2},
+                {"matrix": [2, 5], "x": 6.25, "y": 2},
+                {"matrix": [2, 6], "x": 7.25, "y": 2},
+                {"matrix": [7, 8], "x": 10.5, "y": 2},
+                {"matrix": [7, 9], "x": 11.5, "y": 2},
+                {"matrix": [7, 10], "x": 12.5, "y": 2},
+                {"matrix": [7, 11], "x": 13.5, "y": 2},
+                {"matrix": [7, 12], "x": 14.5, "y": 2},
+                {"matrix": [7, 13], "x": 15.5, "y": 2},
+                {"matrix": [7, 15], "x": 16.5, "y": 2, "w": 2.25},
+                {"matrix": [3, 1], "x": 1.5, "y": 3, "w": 2.25},
+                {"matrix": [3, 2], "x": 3.75, "y": 3},
+                {"matrix": [3, 3], "x": 4.75, "y": 3},
+                {"matrix": [3, 4], "x": 5.75, "y": 3},
+                {"matrix": [3, 5], "x": 6.75, "y": 3},
+                {"matrix": [3, 6], "x": 7.75, "y": 3},
+                {"matrix": [8, 8], "x": 10, "y": 3},
+                {"matrix": [8, 9], "x": 11, "y": 3},
+                {"matrix": [8, 10], "x": 12, "y": 3},
+                {"matrix": [8, 11], "x": 13, "y": 3},
+                {"matrix": [8, 12], "x": 14, "y": 3},
+                {"matrix": [8, 13], "x": 15, "y": 3},
+                {"matrix": [8, 14], "x": 16, "y": 3},
+                {"matrix": [8, 15], "x": 17, "y": 3, "w": 1.75},
+                {"matrix": [4, 1], "x": 1.5, "y": 4},
+                {"matrix": [4, 3], "x": 4.5, "y": 4, "w": 1.5},
+                {"matrix": [4, 5], "x": 6, "y": 4, "w": 2.25},
+                {"matrix": [4, 6], "x": 8.25, "y": 4},
+                {"matrix": [9, 9], "x": 10, "y": 4, "w": 2.75},
+                {"matrix": [9, 11], "x": 12.75, "y": 4, "w": 1.5},
+                {"matrix": [9, 13], "x": 15, "y": 4},
+                {"matrix": [9, 14], "x": 16, "y": 4},
+                {"matrix": [9, 15], "x": 17, "y": 4}
+            ]
+        }
+    }
+}

+ 23 - 0
keyboards/era/sirind/klein_sd/keymaps/default/keymap.c

@@ -0,0 +1,23 @@
+// Copyright 2018-2022 QMK (@qmk)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+    [0] = LAYOUT(
+        KC_ESC,   KC_GRV,   KC_1,     KC_2,     KC_3,     KC_4,     KC_5,     KC_6,     KC_7,     KC_8,     KC_9,     KC_0,     KC_MINS,  KC_EQL,   KC_BSPC,  KC_BSPC,
+        KC_PGUP,  KC_TAB,   KC_Q,     KC_W,     KC_E,     KC_R,     KC_T,     KC_Y,     KC_Y,     KC_U,     KC_I,     KC_O,     KC_P,     KC_LBRC,  KC_RBRC,  KC_BSLS,
+        KC_PGDN,  KC_CAPS,  KC_A,     KC_S,     KC_D,     KC_F,     KC_G,               KC_H,     KC_J,     KC_K,     KC_L,     KC_SCLN,  KC_QUOT,            KC_ENT,
+                  KC_LSFT,  KC_Z,     KC_X,     KC_C,     KC_V,     KC_B,               KC_B,     KC_N,     KC_M,     KC_COMM,  KC_DOT,   KC_SLSH,  KC_RSFT,  MO(1),
+                  KC_LCTL,            KC_LALT,            KC_SPC,   MO(1),                        KC_SPC,             KC_RALT,            KC_LEFT,  KC_DOWN,  KC_RCTL
+    ),
+
+    [1] = LAYOUT(
+        KC_TRNS,  KC_TRNS,  KC_F1,    KC_F2,    KC_F3,    KC_F4,    KC_F5,    KC_F6,    KC_F7,    KC_F8,    KC_F9,    KC_F10,   KC_F11,   KC_F12,   KC_TRNS,  KC_TRNS,
+        KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_PSCR,  KC_SCRL,  KC_PAUS,  KC_TRNS,
+        KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,            KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,            KC_TRNS,
+                  KC_LSFT,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,            KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,
+                  KC_TRNS,            KC_TRNS,            KC_TRNS,  KC_TRNS,                      KC_TRNS,            KC_TRNS,            KC_TRNS,  KC_TRNS,  KC_TRNS
+    )
+};

+ 23 - 0
keyboards/era/sirind/klein_sd/keymaps/via/keymap.c

@@ -0,0 +1,23 @@
+// Copyright 2018-2022 QMK (@qmk)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+    [0] = LAYOUT(
+        KC_ESC,   KC_GRV,   KC_1,     KC_2,     KC_3,     KC_4,     KC_5,     KC_6,     KC_7,     KC_8,     KC_9,     KC_0,     KC_MINS,  KC_EQL,   KC_BSPC,  KC_BSPC,
+        KC_PGUP,  KC_TAB,   KC_Q,     KC_W,     KC_E,     KC_R,     KC_T,     KC_Y,     KC_Y,     KC_U,     KC_I,     KC_O,     KC_P,     KC_LBRC,  KC_RBRC,  KC_BSLS,
+        KC_PGDN,  KC_CAPS,  KC_A,     KC_S,     KC_D,     KC_F,     KC_G,               KC_H,     KC_J,     KC_K,     KC_L,     KC_SCLN,  KC_QUOT,            KC_ENT,
+                  KC_LSFT,  KC_Z,     KC_X,     KC_C,     KC_V,     KC_B,               KC_B,     KC_N,     KC_M,     KC_COMM,  KC_DOT,   KC_SLSH,  KC_RSFT,  MO(1),
+                  KC_LCTL,            KC_LALT,            KC_SPC,   MO(1),                        KC_SPC,             KC_RALT,            KC_LEFT,  KC_DOWN,  KC_RCTL
+    ),
+
+    [1] = LAYOUT(
+        KC_TRNS,  KC_TRNS,  KC_F1,    KC_F2,    KC_F3,    KC_F4,    KC_F5,    KC_F6,    KC_F7,    KC_F8,    KC_F9,    KC_F10,   KC_F11,   KC_F12,   KC_TRNS,  KC_TRNS,
+        KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_PSCR,  KC_SCRL,  KC_PAUS,  KC_TRNS,
+        KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,            KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,            KC_TRNS,
+                  KC_LSFT,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,            KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,
+                  KC_TRNS,            KC_TRNS,            KC_TRNS,  KC_TRNS,                      KC_TRNS,            KC_TRNS,            KC_TRNS,  KC_TRNS,  KC_TRNS
+    )
+};

+ 1 - 0
keyboards/era/sirind/klein_sd/keymaps/via/rules.mk

@@ -0,0 +1 @@
+VIA_ENABLE = yes

+ 22 - 0
keyboards/era/sirind/klein_sd/mcuconf.h

@@ -0,0 +1,22 @@
+/* Copyright 2023 eerraa
+ *
+ * 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/>.
+ */
+
+#pragma once
+
+#include_next <mcuconf.h>
+
+#undef RP_PWM_USE_PWM7
+#define RP_PWM_USE_PWM7 TRUE

+ 23 - 0
keyboards/era/sirind/klein_sd/readme.md

@@ -0,0 +1,23 @@
+# Mont Cervin Klein
+
+* Keyboard Maintainer: [ERA](https://github.com/eerraa)
+* Hardware supported: SIRIND Klein_SD
+* Hardware availability: [Syryan](https://srind.mysoho.com/)
+
+Make example for this keyboard (after setting up your build environment):
+
+    make era/sirind/klein_sd:default
+
+Flashing example for this keyboard:
+
+    make era/sirind/klein_sd:default:flash
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+## Bootloader
+
+Enter the bootloader in 3 ways:
+
+* **Bootmagic reset**: Hold down the key at ESC(0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
+* **Physical reset button**: Briefly short the `RESET` and `GND` pads on the SWD header twice, or short the `BOOT` header and plug in keyboard
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available

+ 1 - 0
keyboards/era/sirind/klein_sd/rules.mk

@@ -0,0 +1 @@
+# This file intentionally left blank

+ 1 - 1
keyboards/fallacy/config.h

@@ -20,7 +20,7 @@
  */
 #define IS31FL3731_I2C_ADDRESS_1 IS31FL3731_I2C_ADDRESS_GND
 #define IS31FL3731_DRIVER_COUNT 1
-#define LED_MATRIX_LED_COUNT 3
+#define IS31FL3731_LED_COUNT 3
 
 /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap
  */

+ 2 - 9
keyboards/fallacy/indicators.c

@@ -22,14 +22,7 @@
  * init IS31FL3731 and i2c
  */
 void init_fallacy_leds(void) {
-    i2c_init();
-    is31fl3731_init(IS31FL3731_I2C_ADDRESS_1);
-
-    for (int i = 0; i < LED_MATRIX_LED_COUNT; i++) {
-        is31fl3731_set_led_control_register(i, true);
-    }
-
-    is31fl3731_update_led_control_registers(IS31FL3731_I2C_ADDRESS_1, 0);
+    is31fl3731_init_drivers();
 }
 
 
@@ -54,7 +47,7 @@ void set_fallacy_led(int index, bool state) {
 
 /* define LED matrix
  */
-const is31fl3731_led_t PROGMEM g_is31fl3731_leds[LED_MATRIX_LED_COUNT] = {
+const is31fl3731_led_t PROGMEM g_is31fl3731_leds[IS31FL3731_LED_COUNT] = {
     {0, C1_1},
     {0, C2_1},
     {0, C3_1},

Some files were not shown because too many files changed in this diff