diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
index f011fb5460d..ce9bd0f3161 100644
--- a/.github/workflows/stale.yml
+++ b/.github/workflows/stale.yml
@@ -3,6 +3,7 @@ name: 'Close stale issues and PRs'
permissions:
issues: write
pull-requests: write
+ actions: write
on:
schedule:
@@ -13,7 +14,7 @@ jobs:
stale:
runs-on: ubuntu-latest
steps:
- - uses: actions/stale@v8
+ - uses: actions/stale@main
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/builddefs/build_keyboard.mk b/builddefs/build_keyboard.mk
index e93ab97cc13..6ae6bc686b3 100644
--- a/builddefs/build_keyboard.mk
+++ b/builddefs/build_keyboard.mk
@@ -495,10 +495,10 @@ check-size: top-symbols
top-symbols: build
echo "###########################################"
echo "# Highest flash usage:"
- $(NM) -Crtd --size-sort $(BUILD_DIR)/$(TARGET).elf | grep -i ' [t] ' | head -n$(NUM_TOP_SYMBOLS) | sed -e 's#^0000000# #g' -e 's#^000000# #g' -e 's#^00000# #g' -e 's#^0000# #g' -e 's#^000# #g' -e 's#^00# #g' -e 's#^0# #g'
+ $(NM) -Crtd --size-sort $(BUILD_DIR)/$(TARGET).elf | grep ' [RrTt] ' | head -n$(NUM_TOP_SYMBOLS) | sed -e 's#^0000000# #g' -e 's#^000000# #g' -e 's#^00000# #g' -e 's#^0000# #g' -e 's#^000# #g' -e 's#^00# #g' -e 's#^0# #g'
echo "###########################################"
echo "# Highest RAM usage:"
- $(NM) -Crtd --size-sort $(BUILD_DIR)/$(TARGET).elf | grep -i ' [dbv] ' | head -n$(NUM_TOP_SYMBOLS) | sed -e 's#^0000000# #g' -e 's#^000000# #g' -e 's#^00000# #g' -e 's#^0000# #g' -e 's#^000# #g' -e 's#^00# #g' -e 's#^0# #g'
+ $(NM) -Crtd --size-sort $(BUILD_DIR)/$(TARGET).elf | grep ' [BbCDdGgSs] ' | head -n$(NUM_TOP_SYMBOLS) | sed -e 's#^0000000# #g' -e 's#^000000# #g' -e 's#^00000# #g' -e 's#^0000# #g' -e 's#^000# #g' -e 's#^00# #g' -e 's#^0# #g'
echo "###########################################"
endif
diff --git a/data/mappings/info_config.hjson b/data/mappings/info_config.hjson
index ab9a4a0e452..76ad55f7da1 100644
--- a/data/mappings/info_config.hjson
+++ b/data/mappings/info_config.hjson
@@ -190,4 +190,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}
}
diff --git a/docs/feature_key_overrides.md b/docs/feature_key_overrides.md
index ec7efd4c017..59eced95c36 100644
--- a/docs/feature_key_overrides.md
+++ b/docs/feature_key_overrides.md
@@ -21,7 +21,7 @@ Then, in your `keymap.c` file, you'll need to define the array `key_overrides`,
The `key_override_t` struct has many options that allow you to precisely tune your overrides. The full reference is shown below. Instead of manually creating a `key_override_t` value, it is recommended to use these dedicated initializers:
#### `ko_make_basic(modifiers, key, replacement)`
-Returns a `key_override_t`, which sends `replacement` (can be a key-modifer combination), when `key` and `modifiers` are all pressed down. This override still activates if any additional modifiers not specified in `modifiers` are also pressed down. See `ko_make_with_layers_and_negmods` to customize this behavior.
+Returns a `key_override_t`, which sends `replacement` (can be a key-modifier combination), when `key` and `modifiers` are all pressed down. This override still activates if any additional modifiers not specified in `modifiers` are also pressed down. See `ko_make_with_layers_and_negmods` to customize this behavior.
#### `ko_make_with_layers(modifiers, key, replacement, layers)`
Additionally takes a bitmask `layers` that defines on which layers the override is used.
@@ -224,7 +224,7 @@ The duration of the key repeat delay is controlled with the `KEY_OVERRIDE_REPEAT
## Difference to Combos :id=difference-to-combos
-Note that key overrides are very different from [combos](https://docs.qmk.fm/#/feature_combo). Combos require that you press down several keys almost _at the same time_ and can work with any combination of non-modifier keys. Key overrides work like keyboard shortcuts (e.g. `ctrl` + `z`): They take combinations of _multiple_ modifiers and _one_ non-modifier key to then perform some custom action. Key overrides are implemented with much care to behave just like normal keyboard shortcuts would in regards to the order of pressed keys, timing, and interacton with other pressed keys. There are a number of optional settings that can be used to really fine-tune the behavior of each key override as well. Using key overrides also does not delay key input for regular key presses, which inherently happens in combos and may be undesirable.
+Note that key overrides are very different from [combos](https://docs.qmk.fm/#/feature_combo). Combos require that you press down several keys almost _at the same time_ and can work with any combination of non-modifier keys. Key overrides work like keyboard shortcuts (e.g. `ctrl` + `z`): They take combinations of _multiple_ modifiers and _one_ non-modifier key to then perform some custom action. Key overrides are implemented with much care to behave just like normal keyboard shortcuts would in regards to the order of pressed keys, timing, and interaction with other pressed keys. There are a number of optional settings that can be used to really fine-tune the behavior of each key override as well. Using key overrides also does not delay key input for regular key presses, which inherently happens in combos and may be undesirable.
## Solution to the problem of flashing modifiers :id=neutralize-flashing-modifiers
diff --git a/docs/feature_rgblight.md b/docs/feature_rgblight.md
index 39b7e6a6f1e..0288fb04b2a 100644
--- a/docs/feature_rgblight.md
+++ b/docs/feature_rgblight.md
@@ -524,7 +524,6 @@ By defining `RGBLIGHT_LED_MAP` as in the example below, you can specify the LED
```
-```
## Clipping Range
Using the `rgblight_set_clipping_range()` function, you can prepare more buffers than the actual number of LEDs, and output some of the buffers to the LEDs. This is useful if you want the split keyboard to treat left and right LEDs as logically contiguous.
@@ -544,8 +543,8 @@ In addition to setting the Clipping Range, you can use `RGBLIGHT_LED_MAP` togeth
#define RGBLED_NUM 8
#define RGBLIGHT_LED_MAP { 7, 6, 5, 4, 3, 2, 1, 0 }
-// some soruce
- rgblight_set_clipping_range(3, 4);
+// some source
+rgblight_set_clipping_range(3, 4);
```
diff --git a/docs/serial_driver.md b/docs/serial_driver.md
index c4b42f38ddd..b7e803154b3 100644
--- a/docs/serial_driver.md
+++ b/docs/serial_driver.md
@@ -235,7 +235,7 @@ Where 'n' matches the peripheral number of your selected USART on the MCU.
The `PIO` subsystem is a Raspberry Pi RP2040 specific implementation, using the integrated PIO peripheral and is therefore only available on this MCU. Because of the flexible nature of the PIO peripherals, **any** GPIO pin can be used as a `TX` or `RX` pin. Half-duplex and Full-duplex operation is fully supported. The Half-duplex operation mode uses the built-in pull-ups and GPIO manipulation on the RP2040 to drive the line high by default. An external pull-up is therefore not necessary.
-Configure the hardware via your config.h:
+You may optionally switch the PIO peripheral used with the following define in config.h:
```c
#define SERIAL_PIO_USE_PIO1 // Force the usage of PIO1 peripheral, by default the Serial implementation uses the PIO0 peripheral
```
diff --git a/docs/ws2812_driver.md b/docs/ws2812_driver.md
index f8cad20ce0c..9b79cfa905e 100644
--- a/docs/ws2812_driver.md
+++ b/docs/ws2812_driver.md
@@ -170,7 +170,7 @@ To configure it, add this to your rules.mk:
WS2812_DRIVER = vendor
```
-Configure the hardware via your config.h:
+You may optionally switch the PIO peripheral used with the following define in config.h:
```c
#define WS2812_PIO_USE_PIO1 // Force the usage of PIO1 peripheral, by default the WS2812 implementation uses the PIO0 peripheral
```
diff --git a/keyboards/4pplet/waffling60/rev_e_ansi/config.h b/keyboards/4pplet/waffling60/rev_e_ansi/config.h
new file mode 100644
index 00000000000..521ddf96a18
--- /dev/null
+++ b/keyboards/4pplet/waffling60/rev_e_ansi/config.h
@@ -0,0 +1,20 @@
+/*
+Copyright 2023 Stefan Sundin "4pplet"
+
+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 .
+*/
+#pragma once
+
+#define WS2812_EXTERNAL_PULLUP
+
diff --git a/keyboards/4pplet/waffling60/rev_e_ansi/info.json b/keyboards/4pplet/waffling60/rev_e_ansi/info.json
new file mode 100644
index 00000000000..c2514700ff0
--- /dev/null
+++ b/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},
+ ]
+ }
+ }
+}
diff --git a/keyboards/4pplet/waffling60/rev_e_ansi/keymaps/default/keymap.c b/keyboards/4pplet/waffling60/rev_e_ansi/keymaps/default/keymap.c
new file mode 100644
index 00000000000..706428c00e7
--- /dev/null
+++ b/keyboards/4pplet/waffling60/rev_e_ansi/keymaps/default/keymap.c
@@ -0,0 +1,40 @@
+/*
+Copyright 2023 Stefan Sundin "4pplet"
+
+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 .
+*/
+#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
diff --git a/keyboards/4pplet/waffling60/rev_e_ansi/keymaps/default/rules.mk b/keyboards/4pplet/waffling60/rev_e_ansi/keymaps/default/rules.mk
new file mode 100644
index 00000000000..ee325681483
--- /dev/null
+++ b/keyboards/4pplet/waffling60/rev_e_ansi/keymaps/default/rules.mk
@@ -0,0 +1 @@
+ENCODER_MAP_ENABLE = yes
diff --git a/keyboards/4pplet/waffling60/rev_e_ansi/keymaps/via/keymap.c b/keyboards/4pplet/waffling60/rev_e_ansi/keymaps/via/keymap.c
new file mode 100644
index 00000000000..706428c00e7
--- /dev/null
+++ b/keyboards/4pplet/waffling60/rev_e_ansi/keymaps/via/keymap.c
@@ -0,0 +1,40 @@
+/*
+Copyright 2023 Stefan Sundin "4pplet"
+
+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 .
+*/
+#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
diff --git a/keyboards/4pplet/waffling60/rev_e_ansi/keymaps/via/rules.mk b/keyboards/4pplet/waffling60/rev_e_ansi/keymaps/via/rules.mk
new file mode 100644
index 00000000000..f1adcab005e
--- /dev/null
+++ b/keyboards/4pplet/waffling60/rev_e_ansi/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+ENCODER_MAP_ENABLE = yes
diff --git a/keyboards/4pplet/waffling60/rev_e_ansi/matrix_diagram.md b/keyboards/4pplet/waffling60/rev_e_ansi/matrix_diagram.md
new file mode 100644
index 00000000000..ae47900a9ba
--- /dev/null
+++ b/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
+└─────┴───┴───────────────────────────────────────┴───┴─────┘
+```
diff --git a/keyboards/4pplet/waffling60/rev_e_ansi/readme.md b/keyboards/4pplet/waffling60/rev_e_ansi/readme.md
new file mode 100644
index 00000000000..1b70d5aba86
--- /dev/null
+++ b/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.
diff --git a/keyboards/4pplet/waffling60/rev_e_ansi/rules.mk b/keyboards/4pplet/waffling60/rev_e_ansi/rules.mk
new file mode 100644
index 00000000000..04fe1eba2ac
--- /dev/null
+++ b/keyboards/4pplet/waffling60/rev_e_ansi/rules.mk
@@ -0,0 +1,2 @@
+# Wildcard to allow APM32 MCU
+DFU_SUFFIX_ARGS = -p FFFF -v FFFF
diff --git a/keyboards/ai03/duet/config.h b/keyboards/ai03/duet/config.h
new file mode 100644
index 00000000000..9cebd11c6ba
--- /dev/null
+++ b/keyboards/ai03/duet/config.h
@@ -0,0 +1,6 @@
+// Copyright 2023 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define PICO_XOSC_STARTUP_DELAY_MULTIPLIER 128
diff --git a/keyboards/ai03/duet/info.json b/keyboards/ai03/duet/info.json
new file mode 100644
index 00000000000..1d11c868a37
--- /dev/null
+++ b/keyboards/ai03/duet/info.json
@@ -0,0 +1,139 @@
+{
+ "manufacturer": "ai03 Design Studio",
+ "keyboard_name": "Duet Switch Tester",
+ "maintainer": "ai03-2725",
+ "bootloader": "rp2040",
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": false,
+ "nkro": true
+ },
+ "matrix_pins": {
+ "cols": ["GP29", "GP28", "GP27", "GP26", "GP25", "GP24", "GP23", "GP22", "GP18", "GP14", "GP13", "GP12", "GP11", "GP10", "GP9", "GP8", "GP7", "GP6"],
+ "rows": ["GP0", "GP1", "GP2", "GP3", "GP4", "GP5"]
+ },
+ "processor": "RP2040",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x0028",
+ "vid": "0xA103"
+ },
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2.25, "y": 0},
+ {"matrix": [0, 3], "x": 3.25, "y": 0},
+ {"matrix": [0, 4], "x": 4.5, "y": 0},
+ {"matrix": [0, 5], "x": 5.5, "y": 0},
+ {"matrix": [0, 6], "x": 6.75, "y": 0},
+ {"matrix": [0, 7], "x": 7.75, "y": 0},
+ {"matrix": [0, 8], "x": 9, "y": 0},
+ {"matrix": [0, 9], "x": 10, "y": 0},
+ {"matrix": [0, 10], "x": 11.25, "y": 0},
+ {"matrix": [0, 11], "x": 12.25, "y": 0},
+ {"matrix": [0, 12], "x": 13.5, "y": 0},
+ {"matrix": [0, 13], "x": 14.5, "y": 0},
+ {"matrix": [0, 14], "x": 15.75, "y": 0},
+ {"matrix": [0, 15], "x": 16.75, "y": 0},
+ {"matrix": [0, 16], "x": 18, "y": 0},
+ {"matrix": [0, 17], "x": 19, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1},
+ {"matrix": [1, 1], "x": 1, "y": 1},
+ {"matrix": [1, 2], "x": 2.25, "y": 1},
+ {"matrix": [1, 3], "x": 3.25, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.75, "y": 1},
+ {"matrix": [1, 7], "x": 7.75, "y": 1},
+ {"matrix": [1, 8], "x": 9, "y": 1},
+ {"matrix": [1, 9], "x": 10, "y": 1},
+ {"matrix": [1, 10], "x": 11.25, "y": 1},
+ {"matrix": [1, 11], "x": 12.25, "y": 1},
+ {"matrix": [1, 12], "x": 13.5, "y": 1},
+ {"matrix": [1, 13], "x": 14.5, "y": 1},
+ {"matrix": [1, 14], "x": 15.75, "y": 1},
+ {"matrix": [1, 15], "x": 16.75, "y": 1},
+ {"matrix": [1, 16], "x": 18, "y": 1},
+ {"matrix": [1, 17], "x": 19, "y": 1},
+ {"matrix": [2, 0], "x": 0, "y": 2},
+ {"matrix": [2, 1], "x": 1, "y": 2},
+ {"matrix": [2, 2], "x": 2.25, "y": 2},
+ {"matrix": [2, 3], "x": 3.25, "y": 2},
+ {"matrix": [2, 4], "x": 4.5, "y": 2},
+ {"matrix": [2, 5], "x": 5.5, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 9, "y": 2},
+ {"matrix": [2, 9], "x": 10, "y": 2},
+ {"matrix": [2, 10], "x": 11.25, "y": 2},
+ {"matrix": [2, 11], "x": 12.25, "y": 2},
+ {"matrix": [2, 12], "x": 13.5, "y": 2},
+ {"matrix": [2, 13], "x": 14.5, "y": 2},
+ {"matrix": [2, 14], "x": 15.75, "y": 2},
+ {"matrix": [2, 15], "x": 16.75, "y": 2},
+ {"matrix": [2, 16], "x": 18, "y": 2},
+ {"matrix": [2, 17], "x": 19, "y": 2},
+ {"matrix": [3, 0], "x": 0, "y": 3},
+ {"matrix": [3, 1], "x": 1, "y": 3},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.5, "y": 3},
+ {"matrix": [3, 5], "x": 5.5, "y": 3},
+ {"matrix": [3, 6], "x": 6.75, "y": 3},
+ {"matrix": [3, 7], "x": 7.75, "y": 3},
+ {"matrix": [3, 8], "x": 9, "y": 3},
+ {"matrix": [3, 9], "x": 10, "y": 3},
+ {"matrix": [3, 10], "x": 11.25, "y": 3},
+ {"matrix": [3, 11], "x": 12.25, "y": 3},
+ {"matrix": [3, 12], "x": 13.5, "y": 3},
+ {"matrix": [3, 13], "x": 14.5, "y": 3},
+ {"matrix": [3, 14], "x": 15.75, "y": 3},
+ {"matrix": [3, 15], "x": 16.75, "y": 3},
+ {"matrix": [3, 16], "x": 18, "y": 3},
+ {"matrix": [3, 17], "x": 19, "y": 3},
+ {"matrix": [4, 0], "x": 0, "y": 4},
+ {"matrix": [4, 1], "x": 1, "y": 4},
+ {"matrix": [4, 2], "x": 2.25, "y": 4},
+ {"matrix": [4, 3], "x": 3.25, "y": 4},
+ {"matrix": [4, 4], "x": 4.5, "y": 4},
+ {"matrix": [4, 5], "x": 5.5, "y": 4},
+ {"matrix": [4, 6], "x": 6.75, "y": 4},
+ {"matrix": [4, 7], "x": 7.75, "y": 4},
+ {"matrix": [4, 8], "x": 9, "y": 4},
+ {"matrix": [4, 9], "x": 10, "y": 4},
+ {"matrix": [4, 10], "x": 11.25, "y": 4},
+ {"matrix": [4, 11], "x": 12.25, "y": 4},
+ {"matrix": [4, 12], "x": 13.5, "y": 4},
+ {"matrix": [4, 13], "x": 14.5, "y": 4},
+ {"matrix": [4, 14], "x": 15.75, "y": 4},
+ {"matrix": [4, 15], "x": 16.75, "y": 4},
+ {"matrix": [4, 16], "x": 18, "y": 4},
+ {"matrix": [4, 17], "x": 19, "y": 4},
+ {"matrix": [5, 0], "x": 0, "y": 5},
+ {"matrix": [5, 1], "x": 1, "y": 5},
+ {"matrix": [5, 2], "x": 2.25, "y": 5},
+ {"matrix": [5, 3], "x": 3.25, "y": 5},
+ {"matrix": [5, 4], "x": 4.5, "y": 5},
+ {"matrix": [5, 5], "x": 5.5, "y": 5},
+ {"matrix": [5, 6], "x": 6.75, "y": 5},
+ {"matrix": [5, 7], "x": 7.75, "y": 5},
+ {"matrix": [5, 8], "x": 9, "y": 5},
+ {"matrix": [5, 9], "x": 10, "y": 5},
+ {"matrix": [5, 10], "x": 11.25, "y": 5},
+ {"matrix": [5, 11], "x": 12.25, "y": 5},
+ {"matrix": [5, 12], "x": 13.5, "y": 5},
+ {"matrix": [5, 13], "x": 14.5, "y": 5},
+ {"matrix": [5, 14], "x": 15.75, "y": 5},
+ {"matrix": [5, 15], "x": 16.75, "y": 5},
+ {"matrix": [5, 16], "x": 18, "y": 5},
+ {"matrix": [5, 17], "x": 19, "y": 5}
+ ]
+ }
+ }
+}
diff --git a/keyboards/ai03/duet/keymaps/coordinate/keymap.c b/keyboards/ai03/duet/keymaps/coordinate/keymap.c
new file mode 100644
index 00000000000..821c0295343
--- /dev/null
+++ b/keyboards/ai03/duet/keymaps/coordinate/keymap.c
@@ -0,0 +1,34 @@
+// Copyright 2023 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+
+/* Coordinate keymap - designed to send a string in the format [a-r][0-5] corresponding to the matrix position, where a0 is the top left and r5 is bottom right */
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT(
+ KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0,
+ KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0,
+ KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0,
+ KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0,
+ KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0,
+ KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0
+ ),
+};
+
+
+/* String generation */
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+
+ if (record->event.pressed) {
+ char col = record->event.key.col + 'a';
+ char row = record->event.key.row + '0';
+ char result[2] = {col, row};
+ send_string(result);
+ }
+
+ return false;
+}
diff --git a/keyboards/ai03/duet/keymaps/coordinate/readme.md b/keyboards/ai03/duet/keymaps/coordinate/readme.md
new file mode 100644
index 00000000000..de8245875d1
--- /dev/null
+++ b/keyboards/ai03/duet/keymaps/coordinate/readme.md
@@ -0,0 +1,4 @@
+# The coordinate keymap for Duet
+
+An example keymap which sends a string `[a-r][0-5]` corresponding to the column-row position of the pressed switch.
+Possibly useful for pairing to a kiosk device provided the display application can parse and handle this format.
diff --git a/keyboards/ai03/duet/keymaps/default/keymap.c b/keyboards/ai03/duet/keymaps/default/keymap.c
new file mode 100644
index 00000000000..29f63678a80
--- /dev/null
+++ b/keyboards/ai03/duet/keymaps/default/keymap.c
@@ -0,0 +1,14 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+ KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0,
+ KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0,
+ KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0,
+ KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0,
+ KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0,
+ KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0, KC_0
+ ),
+};
diff --git a/keyboards/ai03/duet/keymaps/default/readme.md b/keyboards/ai03/duet/keymaps/default/readme.md
new file mode 100644
index 00000000000..fdf727dc96f
--- /dev/null
+++ b/keyboards/ai03/duet/keymaps/default/readme.md
@@ -0,0 +1,4 @@
+# The default keymap for Duet
+
+Since this is a very irregular keyboard with unique use cases, the keymap should be customized to meet one's needs and to match the requirements of the corresponding display software (if any).
+By default, all keys send `KC_0` to simply notify the host that an arbitrary key has been pressed.
diff --git a/keyboards/ai03/duet/readme.md b/keyboards/ai03/duet/readme.md
new file mode 100644
index 00000000000..43c3d6f7c59
--- /dev/null
+++ b/keyboards/ai03/duet/readme.md
@@ -0,0 +1,28 @@
+# Duet Switch Tester
+
+
+
+A switch tester intended for event/storefront use
+
+* Keyboard Maintainer: [ai03](https://github.com/ai03-2725)
+* Hardware Supported: The [Duet PCB](https://github.com/ai03-2725/duet-switch-tester/tree/main/Duet-MainPCB), powered by the RP2040
+* Hardware Availability: [Open-source](https://github.com/ai03-2725/duet-switch-tester)
+
+
+Make example for this keyboard (after setting up your build environment):
+
+ make ai03/duet:default
+
+Flashing example for this keyboard:
+
+ make ai03/duet: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**: Press the reset button on the back of the PCB while holding the Bootmode switch
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
diff --git a/keyboards/ai03/duet/rules.mk b/keyboards/ai03/duet/rules.mk
new file mode 100644
index 00000000000..6e7633bfe01
--- /dev/null
+++ b/keyboards/ai03/duet/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
diff --git a/keyboards/akko/5087/5087.c b/keyboards/akko/5087/5087.c
new file mode 100644
index 00000000000..4d6cf949009
--- /dev/null
+++ b/keyboards/akko/5087/5087.c
@@ -0,0 +1,190 @@
+/* Copyright (C) 2023 jonylee@hfd
+ *
+ * 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 .
+ */
+
+#include "quantum.h"
+// clang-format off
+#ifdef RGB_MATRIX_ENABLE
+const ckled2001_led PROGMEM g_ckled2001_leds[RGB_MATRIX_LED_COUNT] = {
+/* Refer to IS31 manual for these locations
+ * driver
+ * | R location
+ * | | G location
+ * | | | B location
+ * | | | | */
+ /*row0*/
+ {1, A_1, B_1, C_1},
+ {1, A_2, B_2, C_2},
+ {1, A_3, B_3, C_3},
+ {1, A_4, B_4, C_4},
+ {1, A_5, B_5, C_5},
+ {1, A_6, B_6, C_6},
+ {1, A_7, B_7, C_7},
+ {1, A_8, B_8, C_8},
+ {1, A_9, B_9, C_9},
+ {1, A_10, B_10, C_10},
+ {1, A_11, B_11, C_11},
+ {1, A_12, B_12, C_12},
+ {1, A_13, B_13, C_13},
+ {1, A_14, B_14, C_14},
+ {1, A_15, B_15, C_15},
+ {1, A_16, B_16, C_16},
+
+ /*row1*/
+ {0, A_1, B_1, C_1},
+ {0, A_2, B_2, C_2},
+ {0, A_3, B_3, C_3},
+ {0, A_4, B_4, C_4},
+ {0, A_5, B_5, C_5},
+ {0, A_6, B_6, C_6},
+ {0, A_7, B_7, C_7},
+ {0, A_8, B_8, C_8},
+ {0, A_9, B_9, C_9},
+ {0, A_10, B_10, C_10},
+ {0, A_11, B_11, C_11},
+ {0, A_12, B_12, C_12},
+ {0, A_13, B_13, C_13},
+ {0, A_14, B_14, C_14},
+ {1, D_1, E_1, F_1},
+ {1, D_2, E_2, F_2},
+ {1, D_3, E_3, F_3},
+
+ /*row2*/
+ {0, D_1, E_1, F_1},
+ {0, D_2, E_2, F_2},
+ {0, D_3, E_3, F_3},
+ {0, D_4, E_4, F_4},
+ {0, D_5, E_5, F_5},
+ {0, D_6, E_6, F_6},
+ {0, D_7, E_7, F_7},
+ {0, D_8, E_8, F_8},
+ {0, D_9, E_9, F_9},
+ {0, D_10, E_10, F_10},
+ {0, D_11, E_11, F_11},
+ {0, D_12, E_12, F_12},
+ {0, D_13, E_13, F_13},
+ {0, D_14, E_14, F_14},
+ {1, G_1, H_1, I_1},
+ {1, G_2, H_2, I_2},
+ {1, G_3, H_3, I_3},
+
+ /*row3*/
+ {0, G_1, H_1, I_1},
+ {0, G_2, H_2, I_2},
+ {0, G_3, H_3, I_3},
+ {0, G_4, H_4, I_4},
+ {0, G_5, H_5, I_5},
+ {0, G_6, H_6, I_6},
+ {0, G_7, H_7, I_7},
+ {0, G_8, H_8, I_8},
+ {0, G_9, H_9, I_9},
+ {0, G_10, H_10, I_10},
+ {0, G_11, H_11, I_11},
+ {0, G_12, H_12, I_12},
+ {0, G_13, H_13, I_13},
+
+ /*row4*/
+ {0, J_1, K_1, L_1},
+ {0, J_2, K_2, L_2},
+ {0, J_3, K_3, L_3},
+ {0, J_4, K_4, L_4},
+ {0, J_5, K_5, L_5},
+ {0, J_6, K_6, L_6},
+ {0, J_7, K_7, L_7},
+ {0, J_8, K_8, L_8},
+ {0, J_9, K_9, L_9},
+ {0, J_10, K_10, L_10},
+ {0, J_11, K_11, L_11},
+ {0, J_12, K_12, L_12},
+ {1, J_4, K_4, L_4},
+
+ /*row5*/
+ {0, J_13, K_13, L_13},
+ {0, J_14, K_14, L_14},
+ {0, J_15, K_15, L_15},
+ {0, J_16, K_16, L_16},
+ {0, G_14, H_14, I_14},
+ {0, G_15, H_15, I_15},
+ {0, G_16, H_16, I_16},
+ {0, D_15, E_15, F_15},
+ {1, J_1, K_1, L_1},
+ {1, J_2, K_2, L_2},
+ {1, J_3, K_3, L_3},
+};
+#endif // RGB_MATRIX_ENABLE
+
+enum __layers {
+ WIN_B,
+ WIN_W,
+ WIN_FN,
+ MAC_B,
+ MAC_W,
+ MAC_FN,
+};
+
+// clang-format on
+
+void matrix_init_kb(void) {
+ setPinOutput(LED_MAC_OS_PIN); // LDE2 MAC\WIN
+ writePinLow(LED_MAC_OS_PIN);
+ setPinOutput(LED_WIN_LOCK_PIN); // LED3 Win Lock
+ writePinLow(LED_WIN_LOCK_PIN);
+
+ matrix_init_user();
+}
+
+void housekeeping_task_kb(void){
+ writePin(LED_MAC_OS_PIN, (get_highest_layer(default_layer_state) == 3));
+ writePin(LED_WIN_LOCK_PIN, 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 DF(WIN_B):
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(WIN_B);
+ }
+ return false;
+ case DF(MAC_B):
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(MAC_B);
+ keymap_config.no_gui = 0;
+ eeconfig_update_keymap(keymap_config.raw);
+ }
+ return false;
+ case RGB_TOG:
+ if (record->event.pressed) {
+ switch (rgb_matrix_get_flags()) {
+ case LED_FLAG_ALL: {
+ rgb_matrix_set_flags(LED_FLAG_NONE);
+ rgb_matrix_set_color_all(0, 0, 0);
+ } break;
+ default: {
+ rgb_matrix_set_flags(LED_FLAG_ALL);
+ } break;
+ }
+ }
+ if (!rgb_matrix_is_enabled()) {
+ rgb_matrix_set_flags(LED_FLAG_ALL);
+ rgb_matrix_enable();
+ }
+ return false;
+ default:
+ return true;
+ }
+}
diff --git a/keyboards/akko/5087/config.h b/keyboards/akko/5087/config.h
new file mode 100644
index 00000000000..50a1f224f8b
--- /dev/null
+++ b/keyboards/akko/5087/config.h
@@ -0,0 +1,52 @@
+/* Copyright (C) 2023 jonylee@hfd
+ *
+ * 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 .
+ */
+
+#pragma once
+
+
+/* LED Indicators */
+#define LED_MAC_OS_PIN C10
+#define LED_WIN_LOCK_PIN C11
+
+/* 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
+
+/* SPI Config for spi flash*/
+#define SPI_DRIVER SPIDQ
+#define SPI_SCK_PIN B3
+#define SPI_MOSI_PIN B5
+#define SPI_MISO_PIN B4
+#define SPI_MOSI_PAL_MODE 5
+
+#define EXTERNAL_FLASH_SPI_SLAVE_SELECT_PIN C12
+#define WEAR_LEVELING_BACKING_SIZE (8 * 1024)
+
+/* I2C Config for LED Driver */
+#define DRIVER_COUNT 2
+#define DRIVER_ADDR_1 0b1110100
+#define DRIVER_ADDR_2 0b1110111
+#define I2C1_OPMODE OPMODE_I2C
+#define I2C1_CLOCK_SPEED 400000 /* 400000 */
+
+#define RGB_MATRIX_LED_COUNT 87
+
+#define RGB_TRIGGER_ON_KEYDOWN
+#define RGB_DISABLE_WHEN_USB_SUSPENDED // turn off effects when suspended
+#define RGB_MATRIX_FRAMEBUFFER_EFFECTS
+#define RGB_MATRIX_KEYPRESSES
+
diff --git a/keyboards/akko/5087/halconf.h b/keyboards/akko/5087/halconf.h
new file mode 100644
index 00000000000..55bfe5c9779
--- /dev/null
+++ b/keyboards/akko/5087/halconf.h
@@ -0,0 +1,23 @@
+/* Copyright (C) 2023 jonylee@hfd
+ *
+ * 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 .
+ */
+#pragma once
+
+#define HAL_USE_I2C TRUE
+#define HAL_USE_SPI TRUE
+#define SPI_USE_WAIT TRUE
+#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD
+
+#include_next
diff --git a/keyboards/akko/5087/info.json b/keyboards/akko/5087/info.json
new file mode 100644
index 00000000000..43bec927db1
--- /dev/null
+++ b/keyboards/akko/5087/info.json
@@ -0,0 +1,253 @@
+{
+ "keyboard_name": "5087",
+ "manufacturer": "Akko",
+ "url":"https://www.akkogear.com",
+ "maintainer": "jonylee@hfd",
+ "usb": {
+ "vid": "0xFFFE",
+ "pid": "0x000C",
+ "device_version": "1.0.4",
+ "suspend_wakeup_delay": 400,
+ "force_nkro": true
+ },
+ "processor": "WB32FQ95",
+ "bootloader": "wb32-dfu",
+ "features": {
+ "bootmagic": true,
+ "mousekey": false,
+ "extrakey": true,
+ "console": false,
+ "command": false,
+ "nkro": true,
+ "rgb_matrix": true
+ },
+ "dynamic_keymap": {
+ "layer_count": 6
+ },
+ "matrix_pins": {
+ "cols": ["C1", "C2", "C3", "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "C4", "C5", "B0", "B1", "B2", "B10"],
+ "rows": ["B15", "C6", "C7", "C8", "C9", "A8"]
+ },
+ "diode_direction": "ROW2COL",
+ "indicators": {
+ "caps_lock": "A15"
+ },
+ "rgb_matrix": {
+ "driver": "ckled2001",
+ "max_brightness": 180,
+ "animations": {
+ "breathing": true,
+ "cycle_all": true,
+ "cycle_left_right": true,
+ "cycle_up_down": true,
+ "rainbow_moving_chevron": true,
+ "cycle_out_in": true,
+ "cycle_out_in_dual": true,
+ "cycle_pinwheel": true,
+ "cycle_spiral": true,
+ "dual_beacon": true,
+ "rainbow_beacon": true,
+ "raindrops": true,
+ "typing_heatmap": true,
+ "solid_reactive_simple": true,
+ "solid_reactive": true,
+ "solid_reactive_cross": true,
+ "multisplash": true
+ },
+ "layout":[
+ { "flags": 4, "matrix": [0, 0], "x": 0, "y": 0},
+ { "flags": 4, "matrix": [0, 1], "x": 24, "y": 0},
+ { "flags": 4, "matrix": [0, 2], "x": 38, "y": 0},
+ { "flags": 4, "matrix": [0, 3], "x": 52, "y": 0},
+ { "flags": 4, "matrix": [0, 4], "x": 66, "y": 0},
+ { "flags": 4, "matrix": [0, 5], "x": 82, "y": 0},
+ { "flags": 4, "matrix": [0, 6], "x": 96, "y": 0},
+ { "flags": 4, "matrix": [0, 7], "x":110, "y": 0},
+ { "flags": 4, "matrix": [0, 8], "x":124, "y": 0},
+ { "flags": 4, "matrix": [0, 9], "x":140, "y": 0},
+ { "flags": 4, "matrix": [0, 10], "x":154, "y": 0},
+ { "flags": 4, "matrix": [0, 11], "x":168, "y": 0},
+ { "flags": 4, "matrix": [0, 12], "x":182, "y": 0},
+ { "flags": 4, "matrix": [0, 14], "x":196, "y": 0},
+ { "flags": 4, "matrix": [0, 15], "x":210, "y": 0},
+ { "flags": 4, "matrix": [0, 16], "x":224, "y": 0},
+
+ { "flags": 4, "matrix": [1, 0], "x": 0, "y": 12},
+ { "flags": 4, "matrix": [1, 1], "x": 13, "y": 12},
+ { "flags": 4, "matrix": [1, 2], "x": 26, "y": 12},
+ { "flags": 4, "matrix": [1, 3], "x": 39, "y": 12},
+ { "flags": 4, "matrix": [1, 4], "x": 52, "y": 12},
+ { "flags": 4, "matrix": [1, 5], "x": 65, "y": 12},
+ { "flags": 4, "matrix": [1, 6], "x": 79, "y": 12},
+ { "flags": 4, "matrix": [1, 7], "x": 92, "y": 12},
+ { "flags": 4, "matrix": [1, 8], "x":105, "y": 12},
+ { "flags": 4, "matrix": [1, 9], "x":118, "y": 12},
+ { "flags": 4, "matrix": [1, 10], "x":131, "y": 12},
+ { "flags": 4, "matrix": [1, 11], "x":144, "y": 12},
+ { "flags": 4, "matrix": [1, 12], "x":158, "y": 12},
+ { "flags": 4, "matrix": [1, 13], "x":171, "y": 12},
+ { "flags": 4, "matrix": [1, 14], "x":184, "y": 12},
+ { "flags": 4, "matrix": [1, 15], "x":197, "y": 12},
+ { "flags": 4, "matrix": [1, 16], "x":210, "y": 12},
+
+ { "flags": 4, "matrix": [2, 0], "x": 0, "y": 26},
+ { "flags": 4, "matrix": [2, 1], "x": 14, "y": 26},
+ { "flags": 4, "matrix": [2, 2], "x": 28, "y": 26},
+ { "flags": 4, "matrix": [2, 3], "x": 42, "y": 26},
+ { "flags": 4, "matrix": [2, 4], "x": 56, "y": 26},
+ { "flags": 4, "matrix": [2, 5], "x": 70, "y": 26},
+ { "flags": 4, "matrix": [2, 6], "x": 84, "y": 26},
+ { "flags": 4, "matrix": [2, 7], "x": 98, "y": 26},
+ { "flags": 4, "matrix": [2, 8], "x":112, "y": 26},
+ { "flags": 4, "matrix": [2, 9], "x":126, "y": 26},
+ { "flags": 4, "matrix": [2, 10], "x":140, "y": 26},
+ { "flags": 4, "matrix": [2, 11], "x":154, "y": 26},
+ { "flags": 4, "matrix": [2, 12], "x":168, "y": 26},
+ { "flags": 4, "matrix": [2, 13], "x":182, "y": 26},
+ { "flags": 4, "matrix": [2, 14], "x":196, "y": 26},
+ { "flags": 4, "matrix": [2, 15], "x":210, "y": 26},
+ { "flags": 4, "matrix": [2, 16], "x":224, "y": 26},
+
+ { "flags": 4, "matrix": [3, 0], "x": 0, "y": 38},
+ { "flags": 4, "matrix": [3, 1], "x": 14, "y": 38},
+ { "flags": 4, "matrix": [3, 2], "x": 28, "y": 38},
+ { "flags": 4, "matrix": [3, 3], "x": 42, "y": 38},
+ { "flags": 4, "matrix": [3, 4], "x": 56, "y": 38},
+ { "flags": 4, "matrix": [3, 5], "x": 70, "y": 38},
+ { "flags": 4, "matrix": [3, 6], "x": 84, "y": 38},
+ { "flags": 4, "matrix": [3, 7], "x": 98, "y": 38},
+ { "flags": 4, "matrix": [3, 8], "x":112, "y": 38},
+ { "flags": 4, "matrix": [3, 9], "x":126, "y": 38},
+ { "flags": 4, "matrix": [3, 10], "x":140, "y": 38},
+ { "flags": 4, "matrix": [3, 11], "x":154, "y": 38},
+ { "flags": 4, "matrix": [3, 13], "x":182, "y": 38},
+
+ { "flags": 4, "matrix": [4, 0], "x": 0, "y": 51},
+ { "flags": 4, "matrix": [4, 1], "x": 14, "y": 51},
+ { "flags": 4, "matrix": [4, 2], "x": 28, "y": 51},
+ { "flags": 4, "matrix": [4, 3], "x": 42, "y": 51},
+ { "flags": 4, "matrix": [4, 4], "x": 56, "y": 51},
+ { "flags": 4, "matrix": [4, 5], "x": 70, "y": 51},
+ { "flags": 4, "matrix": [4, 6], "x": 84, "y": 51},
+ { "flags": 4, "matrix": [4, 7], "x": 98, "y": 51},
+ { "flags": 4, "matrix": [4, 8], "x":112, "y": 51},
+ { "flags": 4, "matrix": [4, 9], "x":126, "y": 51},
+ { "flags": 4, "matrix": [4, 10], "x":140, "y": 51},
+ { "flags": 4, "matrix": [4, 13], "x":154, "y": 51},
+ { "flags": 4, "matrix": [4, 15], "x":182, "y": 51},
+
+ { "flags": 4, "matrix": [5, 0], "x": 0, "y": 64},
+ { "flags": 4, "matrix": [5, 1], "x": 14, "y": 64},
+ { "flags": 4, "matrix": [5, 2], "x": 28, "y": 64},
+ { "flags": 4, "matrix": [5, 5], "x": 70, "y": 64},
+ { "flags": 4, "matrix": [5, 9], "x":126, "y": 64},
+ { "flags": 4, "matrix": [5, 10], "x":140, "y": 64},
+ { "flags": 4, "matrix": [5, 11], "x":154, "y": 64},
+ { "flags": 4, "matrix": [5, 13], "x":182, "y": 64},
+ { "flags": 4, "matrix": [5, 14], "x":196, "y": 64},
+ { "flags": 4, "matrix": [5, 15], "x":210, "y": 64},
+ { "flags": 4, "matrix": [5, 16], "x":224, "y": 64}
+
+ ]
+ },
+ "community_layouts": ["tkl_ansi"],
+ "layouts": {
+ "LAYOUT_tkl_ansi": {
+ "layout": [
+ { "label": "Esc", "matrix": [0, 0], "x": 0, "y": 0 },
+ { "label": "F1", "matrix": [0, 1], "x": 2, "y": 0 },
+ { "label": "F2", "matrix": [0, 2], "x": 3, "y": 0 },
+ { "label": "F3", "matrix": [0, 3], "x": 4, "y": 0 },
+ { "label": "F4", "matrix": [0, 4], "x": 5, "y": 0 },
+ { "label": "F5", "matrix": [0, 5], "x": 6.5, "y": 0 },
+ { "label": "F6", "matrix": [0, 6], "x": 7.5, "y": 0 },
+ { "label": "F7", "matrix": [0, 7], "x": 8.5, "y": 0 },
+ { "label": "F8", "matrix": [0, 8], "x": 9.5, "y": 0 },
+ { "label": "F9", "matrix": [0, 9], "x": 11, "y": 0 },
+ { "label": "F10", "matrix": [0, 10], "x": 12, "y": 0 },
+ { "label": "F11", "matrix": [0, 11], "x": 13, "y": 0 },
+ { "label": "F12", "matrix": [0, 12], "x": 14, "y": 0 },
+ { "label": "PrtSc", "matrix": [0, 14], "x": 15.25, "y": 0 },
+ { "label": "ScrLk", "matrix": [0, 15], "x": 16.25, "y": 0 },
+ { "label": "Pause", "matrix": [0, 16], "x": 17.25, "y": 0 },
+
+ { "label": "~", "matrix": [1, 0], "x": 0, "y": 1.25 },
+ { "label": "!", "matrix": [1, 1], "x": 1, "y": 1.25 },
+ { "label": "@", "matrix": [1, 2], "x": 2, "y": 1.25 },
+ { "label": "#", "matrix": [1, 3], "x": 3, "y": 1.25 },
+ { "label": "$", "matrix": [1, 4], "x": 4, "y": 1.25 },
+ { "label": "%", "matrix": [1, 5], "x": 5, "y": 1.25 },
+ { "label": "^", "matrix": [1, 6], "x": 6, "y": 1.25 },
+ { "label": "&", "matrix": [1, 7], "x": 7, "y": 1.25 },
+ { "label": "*", "matrix": [1, 8], "x": 8, "y": 1.25 },
+ { "label": "(", "matrix": [1, 9], "x": 9, "y": 1.25 },
+ { "label": ")", "matrix": [1, 10], "x": 10, "y": 1.25 },
+ { "label": "_", "matrix": [1, 11], "x": 11, "y": 1.25 },
+ { "label": "+", "matrix": [1, 12], "x": 12, "y": 1.25 },
+ { "label": "Backspace", "matrix": [1, 13], "x": 13, "y": 1.25, "w": 2 },
+ { "label": "Ins", "matrix": [1, 14], "x": 15.25, "y": 1.25 },
+ { "label": "Home", "matrix": [1, 15], "x": 16.25, "y": 1.25 },
+ { "label": "PgUp", "matrix": [1, 16], "x": 17.25, "y": 1.25 },
+
+ { "label": "Tab", "matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5 },
+ { "label": "Q", "matrix": [2, 1], "x": 1.5, "y": 2.25 },
+ { "label": "W", "matrix": [2, 2], "x": 2.5, "y": 2.25 },
+ { "label": "E", "matrix": [2, 3], "x": 3.5, "y": 2.25 },
+ { "label": "R", "matrix": [2, 4], "x": 4.5, "y": 2.25 },
+ { "label": "T", "matrix": [2, 5], "x": 5.5, "y": 2.25 },
+ { "label": "Y", "matrix": [2, 6], "x": 6.5, "y": 2.25 },
+ { "label": "U", "matrix": [2, 7], "x": 7.5, "y": 2.25 },
+ { "label": "I", "matrix": [2, 8], "x": 8.5, "y": 2.25 },
+ { "label": "O", "matrix": [2, 9], "x": 9.5, "y": 2.25 },
+ { "label": "P", "matrix": [2, 10], "x": 10.5, "y": 2.25 },
+ { "label": "{", "matrix": [2, 11], "x": 11.5, "y": 2.25 },
+ { "label": "}", "matrix": [2, 12], "x": 12.5, "y": 2.25 },
+ { "label": "|", "matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5 },
+ { "label": "Del", "matrix": [2, 14], "x": 15.25, "y": 2.25 },
+ { "label": "End", "matrix": [2, 15], "x": 16.25, "y": 2.25 },
+ { "label": "PgDn", "matrix": [2, 16], "x": 17.25, "y": 2.25 },
+
+ { "label": "Caps Lock", "matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75 },
+ { "label": "A", "matrix": [3, 1], "x": 1.75, "y": 3.25 },
+ { "label": "S", "matrix": [3, 2], "x": 2.75, "y": 3.25 },
+ { "label": "D", "matrix": [3, 3], "x": 3.75, "y": 3.25 },
+ { "label": "F", "matrix": [3, 4], "x": 4.75, "y": 3.25 },
+ { "label": "G", "matrix": [3, 5], "x": 5.75, "y": 3.25 },
+ { "label": "H", "matrix": [3, 6], "x": 6.75, "y": 3.25 },
+ { "label": "J", "matrix": [3, 7], "x": 7.75, "y": 3.25 },
+ { "label": "K", "matrix": [3, 8], "x": 8.75, "y": 3.25 },
+ { "label": "L", "matrix": [3, 9], "x": 9.75, "y": 3.25 },
+ { "label": ":", "matrix": [3, 10], "x": 10.75, "y": 3.25 },
+ { "label": "'", "matrix": [3, 11], "x": 11.75, "y": 3.25 },
+ { "label": "Enter", "matrix": [3, 13], "x": 12.75, "y": 3.25, "w": 2.25 },
+
+ { "label": "Shift", "matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25 },
+ { "label": "Z", "matrix": [4, 1], "x": 2.25, "y": 4.25 },
+ { "label": "X", "matrix": [4, 2], "x": 3.25, "y": 4.25 },
+ { "label": "C", "matrix": [4, 3], "x": 4.25, "y": 4.25 },
+ { "label": "V", "matrix": [4, 4], "x": 5.25, "y": 4.25 },
+ { "label": "B", "matrix": [4, 5], "x": 6.25, "y": 4.25 },
+ { "label": "N", "matrix": [4, 6], "x": 7.25, "y": 4.25 },
+ { "label": "M", "matrix": [4, 7], "x": 8.25, "y": 4.25 },
+ { "label": "<", "matrix": [4, 8], "x": 9.25, "y": 4.25 },
+ { "label": ">", "matrix": [4, 9], "x": 10.25, "y": 4.25 },
+ { "label": "?", "matrix": [4, 10], "x": 11.25, "y": 4.25 },
+ { "label": "Shift", "matrix": [4, 13], "x": 12.25, "y": 4.25, "w": 2.75 },
+ { "label": "Up", "matrix": [4, 15], "x": 16.25, "y": 4.25 },
+
+ { "label": "Ctrl", "matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.25 },
+ { "label": "Win", "matrix": [5, 1], "x": 1.25, "y": 5.25, "w": 1.25 },
+ { "label": "Alt", "matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.25 },
+ { "label": "Space", "matrix": [5, 5], "x": 3.75, "y": 5.25, "w": 6.25 },
+ { "label": "Alt", "matrix": [5, 9], "x": 10, "y": 5.25, "w": 1.25 },
+ { "label": "Win", "matrix": [5, 10], "x": 11.25, "y": 5.25, "w": 1.25 },
+ { "label": "Fn", "matrix": [5, 11], "x": 12.5, "y": 5.25, "w": 1.25 },
+ { "label": "Ctrl", "matrix": [5, 13], "x": 13.75, "y": 5.25, "w": 1.25 },
+ { "label": "Left", "matrix": [5, 14], "x": 15.25, "y": 5.25 },
+ { "label": "Down", "matrix": [5, 15], "x": 16.25, "y": 5.25 },
+ { "label": "Right", "matrix": [5, 16], "x": 17.25, "y": 5.25 }
+
+ ]
+ }
+ }
+}
diff --git a/keyboards/akko/5087/keymaps/default/keymap.c b/keyboards/akko/5087/keymaps/default/keymap.c
new file mode 100644
index 00000000000..07763ccc891
--- /dev/null
+++ b/keyboards/akko/5087/keymaps/default/keymap.c
@@ -0,0 +1,79 @@
+/* Copyright (C) 2023 jonylee@hfd
+ *
+ * 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 .
+ */
+
+#include QMK_KEYBOARD_H
+
+enum __layers {
+ WIN_B,
+ WIN_W,
+ WIN_FN,
+ MAC_B,
+ MAC_W,
+ MAC_FN
+};
+
+// clang-format off
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [WIN_B] = LAYOUT_tkl_ansi( /* Base */
+ 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, KC_RGUI, MO(WIN_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
+
+ [WIN_W] = LAYOUT_tkl_ansi( /* Base */
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_W,
+ _______, _______, _______, _______, _______, _______, MO(WIN_FN), _______, KC_A, KC_S, KC_D),
+
+
+ [WIN_FN] = LAYOUT_tkl_ansi( /* FN */
+ _______, KC_MYCM, KC_MAIL, KC_WSCH, KC_WHOM, KC_MSEL, KC_MPLY, KC_MPRV, KC_MNXT, _______,_______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPD, RGB_SPI, _______, _______, _______, _______,
+ _______, _______,TG(WIN_W),_______, _______, _______, _______, _______, _______, DF(MAC_B),_______,_______, _______, RGB_MOD, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, _______, _______, RGB_HUI,
+ _______, _______, _______, KC_CALC, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, RGB_VAI,
+ _______, GU_TOGG, _______, _______, _______, _______, _______, _______, RGB_SAD, RGB_VAD, RGB_SAI),
+
+ [MAC_B] = LAYOUT_tkl_ansi( /* Base */
+ KC_ESC, KC_BRID, KC_BRIU, KC_MCTL, KC_LPAD, KC_F5, KC_F6, KC_MPRV, KC_MPLY, KC_MNXT, 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_RGUI, KC_RALT, MO(MAC_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
+
+ [MAC_W] = LAYOUT_tkl_ansi( /* Base */
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_W,
+ _______, _______, _______, _______, _______, _______, MO(MAC_FN), _______, KC_A, KC_S, KC_D),
+ [MAC_FN] = LAYOUT_tkl_ansi( /* FN */
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, _______, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPD, RGB_SPI, _______, _______, _______, _______,
+ _______, _______,TG(MAC_W),_______, _______, _______, _______, _______, _______, DF(WIN_B),_______,_______, _______, RGB_MOD, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, _______, _______, RGB_HUI,
+ _______, _______, _______, KC_CALC, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, RGB_VAI,
+ _______, _______, _______, _______, _______, _______, _______, _______, RGB_SAD, RGB_VAD, RGB_SAI)
+};
+// clang-format on
diff --git a/keyboards/akko/5087/keymaps/via/keymap.c b/keyboards/akko/5087/keymaps/via/keymap.c
new file mode 100644
index 00000000000..dd59925fa90
--- /dev/null
+++ b/keyboards/akko/5087/keymaps/via/keymap.c
@@ -0,0 +1,79 @@
+/* Copyright (C) 2023 jonylee@hfd
+ *
+ * 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 .
+ */
+
+#include QMK_KEYBOARD_H
+
+enum __layers {
+ WIN_B,
+ WIN_W,
+ WIN_FN,
+ MAC_B,
+ MAC_W,
+ MAC_FN,
+};
+
+// clang-format off
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [WIN_B] = LAYOUT_tkl_ansi( /* Base */
+ 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, KC_RGUI, MO(WIN_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
+
+ [WIN_W] = LAYOUT_tkl_ansi( /* Base */
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_W,
+ _______, _______, _______, _______, _______, _______, MO(WIN_FN), _______, KC_A, KC_S, KC_D),
+
+
+ [WIN_FN] = LAYOUT_tkl_ansi( /* FN */
+ _______, KC_MYCM, KC_MAIL, KC_WSCH, KC_WHOM, KC_MSEL, KC_MPLY, KC_MPRV, KC_MNXT, _______,_______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPD, RGB_SPI, _______, _______, _______, _______,
+ _______, _______,TG(WIN_W),_______, _______, _______, _______, _______, _______, DF(MAC_B),_______,_______, _______, RGB_MOD, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, _______, _______, RGB_HUI,
+ _______, _______, _______, KC_CALC, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, RGB_VAI,
+ _______, GU_TOGG, _______, _______, _______, _______, _______, _______, RGB_SAD, RGB_VAD, RGB_SAI),
+
+ [MAC_B] = LAYOUT_tkl_ansi( /* Base */
+ KC_ESC, KC_BRID, KC_BRIU, KC_MCTL, KC_LPAD, KC_F5, KC_F6, KC_MPRV, KC_MPLY, KC_MNXT, 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_RGUI, KC_RALT, MO(MAC_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
+
+ [MAC_W] = LAYOUT_tkl_ansi( /* Base */
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_W,
+ _______, _______, _______, _______, _______, _______, MO(MAC_FN), _______, KC_A, KC_S, KC_D),
+ [MAC_FN] = LAYOUT_tkl_ansi( /* FN */
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, _______, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPD, RGB_SPI, _______, _______, _______, _______,
+ _______, _______,TG(MAC_W),_______, _______, _______, _______, _______, _______, DF(WIN_B),_______,_______, _______, RGB_MOD, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, _______, _______, RGB_HUI,
+ _______, _______, _______, KC_CALC, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, RGB_VAI,
+ _______, _______, _______, _______, _______, _______, _______, _______, RGB_SAD, RGB_VAD, RGB_SAI)
+};
+// clang-format on
diff --git a/keyboards/akko/5087/keymaps/via/rules.mk b/keyboards/akko/5087/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/akko/5087/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/akko/5087/mcuconf.h b/keyboards/akko/5087/mcuconf.h
new file mode 100644
index 00000000000..0d16f4f04e4
--- /dev/null
+++ b/keyboards/akko/5087/mcuconf.h
@@ -0,0 +1,24 @@
+/* Copyright (C) 2022 jonylee@hfd
+ *
+ * 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 .
+ */
+#pragma once
+
+#include_next
+
+#undef WB32_SPI_USE_QSPI
+#define WB32_SPI_USE_QSPI TRUE
+
+#undef WB32_I2C_USE_I2C1
+#define WB32_I2C_USE_I2C1 TRUE
diff --git a/keyboards/akko/5087/readme.md b/keyboards/akko/5087/readme.md
new file mode 100644
index 00000000000..1d002fbb9f3
--- /dev/null
+++ b/keyboards/akko/5087/readme.md
@@ -0,0 +1,19 @@
+# 5087
+
+A customizable 80% keyboard.
+
+* Keyboard Maintainer: [jonylee@hfd](https://github.com/jonylee1986)
+* Hardware Supported:Akko 5087
+* Hardware Availability: [akko](https://www.akkogear.com/)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make akko/5087:default
+
+Flashing example for this keyboard:
+
+ make akko/5087:default:flash
+
+**Reset Key**: Hold down the key located at *K000*, which programmed as *Esc* while plugging in the keyboard.
+
+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).
diff --git a/keyboards/akko/5087/rules.mk b/keyboards/akko/5087/rules.mk
new file mode 100644
index 00000000000..0dc7a331420
--- /dev/null
+++ b/keyboards/akko/5087/rules.mk
@@ -0,0 +1,3 @@
+EEPROM_DRIVER = wear_leveling
+WEAR_LEVELING_DRIVER = spi_flash
+
diff --git a/keyboards/alpaca/wfeclipse/info.json b/keyboards/alpaca/wfeclipse/info.json
new file mode 100644
index 00000000000..47288bb190d
--- /dev/null
+++ b/keyboards/alpaca/wfeclipse/info.json
@@ -0,0 +1,210 @@
+{
+ "manufacturer": "Alpaca",
+ "keyboard_name": "WFEclipse",
+ "bootloader": "stm32duino",
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": true,
+ "console": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgb_matrix": true
+ },
+ "matrix_pins": {
+ "cols": ["C11", "C10", "A15", "A10", "A9", "A8", "C9", "C8", "C7", "C6", "B1", "B0", "C5", "C4", "A7", "A6"],
+ "rows": ["A0", "A1", "A2", "A3", "A4"]
+ },
+ "processor": "STM32F103",
+ "rgb_matrix": {
+ "animations": {
+ "band_sat": true,
+ "band_spiral_sat": true,
+ "band_spiral_val": true,
+ "band_val": true,
+ "breathing": true,
+ "cycle_all": true,
+ "cycle_left_right": true,
+ "cycle_up_down": true,
+ "gradient_left_right": true,
+ "gradient_up_down": true,
+ "hue_wave": true,
+ "pixel_fractal": true,
+ "solid_color": true,
+ "solid_reactive_simple": true,
+ "solid_splash": true
+ },
+ "driver": "ws2812",
+ "layout": [
+ {"matrix": [4, 15], "x": 198, "y": 54, "flags": 1},
+ {"matrix": [4, 14], "x": 186, "y": 54, "flags": 1},
+ {"matrix": [4, 13], "x": 174, "y": 54, "flags": 1},
+ {"matrix": [4, 12], "x": 150, "y": 54, "flags": 1},
+ {"matrix": [4, 11], "x": 138, "y": 54, "flags": 1},
+ {"matrix": [4, 10], "x": 126, "y": 54, "flags": 1},
+ {"matrix": [4, 6], "x": 51, "y": 54, "flags": 1},
+ {"matrix": [4, 2], "x": 36, "y": 54, "flags": 1},
+ {"matrix": [4, 1], "x": 21, "y": 54, "flags": 1},
+ {"matrix": [4, 0], "x": 6, "y": 54, "flags": 1},
+ {"matrix": [3, 15], "x": 198, "y": 42, "flags": 1},
+ {"matrix": [3, 14], "x": 186, "y": 42, "flags": 1},
+ {"matrix": [3, 13], "x": 153, "y": 42, "flags": 1},
+ {"matrix": [3, 11], "x": 141, "y": 42, "flags": 1},
+ {"matrix": [3, 10], "x": 129, "y": 42, "flags": 1},
+ {"matrix": [3, 9], "x": 117, "y": 42, "flags": 1},
+ {"matrix": [3, 8], "x": 105, "y": 42, "flags": 1},
+ {"matrix": [3, 7], "x": 93, "y": 42, "flags": 1},
+ {"matrix": [3, 6], "x": 81, "y": 42, "flags": 1},
+ {"matrix": [3, 5], "x": 69, "y": 42, "flags": 1},
+ {"matrix": [3, 4], "x": 57, "y": 42, "flags": 1},
+ {"matrix": [3, 3], "x": 45, "y": 42, "flags": 1},
+ {"matrix": [3, 2], "x": 33, "y": 42, "flags": 1},
+ {"matrix": [3, 0], "x": 6, "y": 42, "flags": 1},
+ {"matrix": [2, 15], "x": 198, "y": 30, "flags": 1},
+ {"matrix": [2, 14], "x": 186, "y": 30, "flags": 1},
+ {"matrix": [2, 13], "x": 159, "y": 30, "flags": 1},
+ {"matrix": [2, 11], "x": 147, "y": 30, "flags": 1},
+ {"matrix": [2, 10], "x": 135, "y": 30, "flags": 1},
+ {"matrix": [2, 9], "x": 123, "y": 30, "flags": 1},
+ {"matrix": [2, 8], "x": 111, "y": 30, "flags": 1},
+ {"matrix": [2, 7], "x": 99, "y": 30, "flags": 1},
+ {"matrix": [2, 6], "x": 87, "y": 30, "flags": 1},
+ {"matrix": [2, 5], "x": 75, "y": 30, "flags": 1},
+ {"matrix": [2, 4], "x": 63, "y": 30, "flags": 1},
+ {"matrix": [2, 3], "x": 51, "y": 30, "flags": 1},
+ {"matrix": [2, 2], "x": 39, "y": 30, "flags": 1},
+ {"matrix": [2, 1], "x": 27, "y": 30, "flags": 1},
+ {"matrix": [2, 0], "x": 6, "y": 30, "flags": 1},
+ {"matrix": [1, 15], "x": 198, "y": 18, "flags": 1},
+ {"matrix": [1, 14], "x": 186, "y": 18, "flags": 1},
+ {"matrix": [1, 13], "x": 168, "y": 18, "flags": 1},
+ {"matrix": [1, 12], "x": 156, "y": 18, "flags": 1},
+ {"matrix": [1, 11], "x": 144, "y": 18, "flags": 1},
+ {"matrix": [1, 10], "x": 132, "y": 18, "flags": 1},
+ {"matrix": [1, 9], "x": 120, "y": 18, "flags": 1},
+ {"matrix": [1, 8], "x": 108, "y": 18, "flags": 1},
+ {"matrix": [1, 7], "x": 96, "y": 18, "flags": 1},
+ {"matrix": [1, 6], "x": 84, "y": 18, "flags": 1},
+ {"matrix": [1, 5], "x": 72, "y": 18, "flags": 1},
+ {"matrix": [1, 4], "x": 60, "y": 18, "flags": 1},
+ {"matrix": [1, 3], "x": 48, "y": 18, "flags": 1},
+ {"matrix": [1, 2], "x": 36, "y": 18, "flags": 1},
+ {"matrix": [1, 1], "x": 24, "y": 18, "flags": 1},
+ {"matrix": [1, 0], "x": 6, "y": 18, "flags": 1},
+ {"matrix": [0, 15], "x": 198, "y": 6, "flags": 1},
+ {"matrix": [0, 14], "x": 186, "y": 6, "flags": 1},
+ {"matrix": [0, 13], "x": 162, "y": 6, "flags": 1},
+ {"matrix": [0, 12], "x": 150, "y": 6, "flags": 1},
+ {"matrix": [0, 11], "x": 138, "y": 6, "flags": 1},
+ {"matrix": [0, 10], "x": 126, "y": 6, "flags": 1},
+ {"matrix": [0, 9], "x": 114, "y": 6, "flags": 1},
+ {"matrix": [0, 8], "x": 102, "y": 6, "flags": 1},
+ {"matrix": [0, 7], "x": 90, "y": 6, "flags": 1},
+ {"matrix": [0, 6], "x": 78, "y": 6, "flags": 1},
+ {"matrix": [0, 5], "x": 66, "y": 6, "flags": 1},
+ {"matrix": [0, 4], "x": 54, "y": 6, "flags": 1},
+ {"matrix": [0, 3], "x": 42, "y": 6, "flags": 1},
+ {"matrix": [0, 2], "x": 30, "y": 6, "flags": 1},
+ {"matrix": [0, 1], "x": 18, "y": 6, "flags": 1},
+ {"matrix": [0, 0], "x": 6, "y": 6, "flags": 1},
+ {"x": 125, "y": 1, "flags": 4},
+ {"x": 125, "y": 2, "flags": 4},
+ {"x": 125, "y": 3, "flags": 4},
+ {"x": 125, "y": 4, "flags": 4},
+ {"x": 125, "y": 5, "flags": 4},
+ {"x": 125, "y": 6, "flags": 4},
+ {"x": 125, "y": 7, "flags": 4},
+ {"x": 125, "y": 8, "flags": 4},
+ {"x": 125, "y": 9, "flags": 4},
+ {"x": 125, "y": 10, "flags": 4},
+ {"x": 125, "y": 11, "flags": 4},
+ {"x": 125, "y": 12, "flags": 4}
+ ],
+ "max_brightness": 50
+ },
+ "usb": {
+ "device_version": "1.0.4",
+ "pid": "0x0038",
+ "vid": "0x308F"
+ },
+ "ws2812": {
+ "pin": "B8"
+ },
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label": "ESC", "matrix": [0, 0], "x": 0, "y": 0},
+ {"label": "1", "matrix": [0, 1], "x": 1, "y": 0},
+ {"label": "2", "matrix": [0, 2], "x": 2, "y": 0},
+ {"label": "3", "matrix": [0, 3], "x": 3, "y": 0},
+ {"label": "4", "matrix": [0, 4], "x": 4, "y": 0},
+ {"label": "5", "matrix": [0, 5], "x": 5, "y": 0},
+ {"label": "6", "matrix": [0, 6], "x": 6, "y": 0},
+ {"label": "7", "matrix": [0, 7], "x": 7, "y": 0},
+ {"label": "8", "matrix": [0, 8], "x": 8, "y": 0},
+ {"label": "9", "matrix": [0, 9], "x": 9, "y": 0},
+ {"label": "0", "matrix": [0, 10], "x": 10, "y": 0},
+ {"label": "MINS", "matrix": [0, 11], "x": 11, "y": 0},
+ {"label": "EQL", "matrix": [0, 12], "x": 12, "y": 0},
+ {"label": "BSPC", "matrix": [0, 13], "x": 13, "y": 0},
+ {"label": "DEL", "matrix": [0, 14], "x": 15, "y": 0},
+ {"label": "INS", "matrix": [0, 15], "x": 16, "y": 0},
+ {"label": "TAB", "matrix": [1, 0], "x": 0, "y": 1},
+ {"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": "LBRC", "matrix": [1, 11], "x": 11.5, "y": 1},
+ {"label": "RBRC", "matrix": [1, 12], "x": 12.5, "y": 1},
+ {"label": "BSLS", "matrix": [1, 13], "x": 13.5, "y": 1},
+ {"label": "HOME", "matrix": [1, 14], "x": 15, "y": 1},
+ {"label": "PGUP", "matrix": [1, 15], "x": 16, "y": 1},
+ {"label": "CAPS", "matrix": [2, 0], "x": 0, "y": 2},
+ {"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": "SCLN", "matrix": [2, 10], "x": 10.75, "y": 2},
+ {"label": "QUOT", "matrix": [2, 11], "x": 11.75, "y": 2},
+ {"label": "ENT", "matrix": [2, 13], "x": 12.75, "y": 2},
+ {"label": "END", "matrix": [2, 14], "x": 15, "y": 2},
+ {"label": "PGDN", "matrix": [2, 15], "x": 16, "y": 2},
+ {"label": "LSFT", "matrix": [3, 0], "x": 0, "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": "COMM", "matrix": [3, 9], "x": 9.25, "y": 3},
+ {"label": "DOT", "matrix": [3, 10], "x": 10.25, "y": 3},
+ {"label": "SLSH", "matrix": [3, 11], "x": 11.25, "y": 3},
+ {"label": "RSFT", "matrix": [3, 13], "x": 12.25, "y": 3},
+ {"label": "UP", "matrix": [3, 14], "x": 15, "y": 3},
+ {"label": "MO(1)", "matrix": [3, 15], "x": 16, "y": 3},
+ {"label": "LCTL", "matrix": [4, 0], "x": 0, "y": 4},
+ {"label": "LGUI", "matrix": [4, 1], "x": 1.25, "y": 4},
+ {"label": "LALT", "matrix": [4, 2], "x": 2.5, "y": 4},
+ {"label": "SPC", "matrix": [4, 6], "x": 3.75, "y": 4},
+ {"label": "RALT", "matrix": [4, 10], "x": 10, "y": 4},
+ {"label": "RGUI", "matrix": [4, 11], "x": 11, "y": 4},
+ {"label": "RCTL", "matrix": [4, 12], "x": 12, "y": 4},
+ {"label": "LEFT", "matrix": [4, 13], "x": 14, "y": 4},
+ {"label": "DOWN", "matrix": [4, 14], "x": 15, "y": 4},
+ {"label": "RGHT", "matrix": [4, 15], "x": 16, "y": 4}
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/keyboards/alpaca/wfeclipse/keymaps/default/keymap.c b/keyboards/alpaca/wfeclipse/keymaps/default/keymap.c
new file mode 100644
index 00000000000..3849b2889c1
--- /dev/null
+++ b/keyboards/alpaca/wfeclipse/keymaps/default/keymap.c
@@ -0,0 +1,39 @@
+/* Copyright 2023 temp4gh
+ *
+ * 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 .
+ */
+
+#include QMK_KEYBOARD_H
+
+enum layer_names {
+ WIN_BASE,
+ WIN_FN,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [WIN_BASE] =LAYOUT(
+ QK_GESC, 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_DEL, KC_INS,
+ 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_HOME, KC_PGUP,
+ 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_END , KC_PGDN,
+ 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, MO(WIN_FN),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [WIN_FN] =LAYOUT(
+ 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_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_MPRV, QK_BOOT,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, 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_MNXT, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_RMOD,RGB_HUD, RGB_TOG, KC_TRNS, KC_TRNS, KC_TRNS
+ )
+};
diff --git a/keyboards/alpaca/wfeclipse/keymaps/via/keymap.c b/keyboards/alpaca/wfeclipse/keymaps/via/keymap.c
new file mode 100644
index 00000000000..ed0d448fb19
--- /dev/null
+++ b/keyboards/alpaca/wfeclipse/keymaps/via/keymap.c
@@ -0,0 +1,39 @@
+/* Copyright 2023 temp4gh
+ *
+ * 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 .
+ */
+
+#include QMK_KEYBOARD_H
+
+enum layer_names {
+ WIN_BASE,
+ WIN_FN,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [WIN_BASE] =LAYOUT(
+ QK_GESC, 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_DEL, KC_INS,
+ 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_HOME, KC_PGUP,
+ 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_END , KC_PGDN,
+ 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, MO(WIN_FN),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [WIN_FN] =LAYOUT(
+ 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_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_MPRV, QK_BOOT,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, 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_MNXT, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_RMOD,RGB_HUD, RGB_TOG, KC_TRNS, KC_TRNS, KC_TRNS
+ )
+};
diff --git a/keyboards/alpaca/wfeclipse/keymaps/via/rules.mk b/keyboards/alpaca/wfeclipse/keymaps/via/rules.mk
new file mode 100644
index 00000000000..036bd6d1c3e
--- /dev/null
+++ b/keyboards/alpaca/wfeclipse/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/alpaca/wfeclipse/readme.md b/keyboards/alpaca/wfeclipse/readme.md
new file mode 100644
index 00000000000..55570e1e7ad
--- /dev/null
+++ b/keyboards/alpaca/wfeclipse/readme.md
@@ -0,0 +1,26 @@
+# Alpaca Keyboards whitefox-eclipse
+
+
+
+A customizable 68% keyboard.
+
+- Keyboard Maintainer: [temp4gh](https://github.com/temp4gh)
+- Hardware Supported: whitefox-eclipse PCB
+- Hardware Availability: https://kono.store/collections/all-products-list/products/whitefox-eclipse?variant=43224249991367
+
+Make example for this keyboard (after setting up your build environment):
+
+ make alpaca/wfeclipse:default
+
+Flashing example for this keyboard:
+
+ make alpaca/wfeclipse: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 2 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
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
diff --git a/keyboards/alpaca/wfeclipse/rules.mk b/keyboards/alpaca/wfeclipse/rules.mk
new file mode 100644
index 00000000000..7ff128fa692
--- /dev/null
+++ b/keyboards/alpaca/wfeclipse/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
\ No newline at end of file
diff --git a/keyboards/beekeeb/piantor_pro/config.h b/keyboards/beekeeb/piantor_pro/config.h
new file mode 100644
index 00000000000..4f0be6dbbea
--- /dev/null
+++ b/keyboards/beekeeb/piantor_pro/config.h
@@ -0,0 +1,17 @@
+// Copyright 2023 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U
+
+#define SERIAL_USART_FULL_DUPLEX
+#define SERIAL_USART_TX_PIN GP0
+#define SERIAL_USART_RX_PIN GP1
+#define SERIAL_USART_PIN_SWAP
+
+#define USB_VBUS_PIN GP19
+
+#define SPLIT_HAND_PIN GP17
+#define SPLIT_HAND_PIN_LOW_IS_LEFT
diff --git a/keyboards/beekeeb/piantor_pro/info.json b/keyboards/beekeeb/piantor_pro/info.json
new file mode 100644
index 00000000000..c85247550e2
--- /dev/null
+++ b/keyboards/beekeeb/piantor_pro/info.json
@@ -0,0 +1,78 @@
+{
+ "manufacturer": "beekeeb",
+ "keyboard_name": "piantor_pro",
+ "maintainer": "beekeeb",
+ "bootloader": "rp2040",
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true
+ },
+ "matrix_pins": {
+ "cols": ["GP11", "GP12", "GP13", "GP14", "GP15", "GP16"],
+ "rows": ["GP7", "GP8", "GP9", "GP10"]
+ },
+ "processor": "RP2040",
+ "url": "",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x0002",
+ "vid": "0xBEEB"
+ },
+ "split": {
+ "enabled": true
+ },
+ "community_layouts": [ "split_3x6_3" ],
+ "layouts": {
+ "LAYOUT_split_3x6_3": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0.25},
+ {"matrix": [0, 1], "x": 1, "y": 0.25},
+ {"matrix": [0, 2], "x": 2, "y": 0.125},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0.125},
+ {"matrix": [0, 5], "x": 5, "y": 0.25},
+ {"matrix": [4, 5], "x": 8, "y": 0.25},
+ {"matrix": [4, 4], "x": 9, "y": 0.125},
+ {"matrix": [4, 3], "x": 10, "y": 0},
+ {"matrix": [4, 2], "x": 11, "y": 0.125},
+ {"matrix": [4, 1], "x": 12, "y": 0.25},
+ {"matrix": [4, 0], "x": 13, "y": 0.25},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.125},
+ {"matrix": [1, 3], "x": 3, "y": 1},
+ {"matrix": [1, 4], "x": 4, "y": 1.125},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [5, 5], "x": 8, "y": 1.25},
+ {"matrix": [5, 4], "x": 9, "y": 1.125},
+ {"matrix": [5, 3], "x": 10, "y": 1},
+ {"matrix": [5, 2], "x": 11, "y": 1.125},
+ {"matrix": [5, 1], "x": 12, "y": 1.25},
+ {"matrix": [5, 0], "x": 13, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25},
+ {"matrix": [2, 1], "x": 1, "y": 2.25},
+ {"matrix": [2, 2], "x": 2, "y": 2.125},
+ {"matrix": [2, 3], "x": 3, "y": 2},
+ {"matrix": [2, 4], "x": 4, "y": 2.125},
+ {"matrix": [2, 5], "x": 5, "y": 2.25},
+ {"matrix": [6, 5], "x": 8, "y": 2.25},
+ {"matrix": [6, 4], "x": 9, "y": 2.125},
+ {"matrix": [6, 3], "x": 10, "y": 2},
+ {"matrix": [6, 2], "x": 11, "y": 2.125},
+ {"matrix": [6, 1], "x": 12, "y": 2.25},
+ {"matrix": [6, 0], "x": 13, "y": 2.25},
+ {"matrix": [3, 3], "x": 3.5, "y": 3.25},
+ {"matrix": [3, 4], "x": 4.5, "y": 3.5},
+ {"matrix": [3, 5], "x": 5.5, "y": 3.75},
+ {"matrix": [7, 5], "x": 7.5, "y": 3.75},
+ {"matrix": [7, 4], "x": 8.5, "y": 3.5},
+ {"matrix": [7, 3], "x": 9.5, "y": 3.25}
+ ]
+ }
+ }
+}
diff --git a/keyboards/beekeeb/piantor_pro/keymaps/default/keymap.c b/keyboards/beekeeb/piantor_pro/keymaps/default/keymap.c
new file mode 100644
index 00000000000..ed09dd7d069
--- /dev/null
+++ b/keyboards/beekeeb/piantor_pro/keymaps/default/keymap.c
@@ -0,0 +1,55 @@
+// Copyright 2023 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_split_3x6_3(
+ //,-----------------------------------------------------. ,-----------------------------------------------------.
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ESC,
+ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
+ KC_LGUI, MO(1), KC_SPC, KC_ENT, MO(2), KC_RALT
+ //`--------------------------' `--------------------------'
+
+ ),
+
+ [1] = LAYOUT_split_3x6_3(
+ //,-----------------------------------------------------. ,-----------------------------------------------------.
+ KC_TAB, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LCTL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP,KC_RIGHT, XXXXXXX, XXXXXXX,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
+ KC_LGUI, _______, KC_SPC, KC_ENT, MO(3), KC_RALT
+ //`--------------------------' `--------------------------'
+ ),
+
+ [2] = LAYOUT_split_3x6_3(
+ //,-----------------------------------------------------. ,-----------------------------------------------------.
+ KC_TAB, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LCTL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, KC_GRV,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, KC_TILD,
+ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
+ KC_LGUI, MO(3), KC_SPC, KC_ENT, _______, KC_RALT
+ //`--------------------------' `--------------------------'
+ ),
+
+ [3] = LAYOUT_split_3x6_3(
+ //,-----------------------------------------------------. ,-----------------------------------------------------.
+ QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
+ KC_LGUI, _______, KC_SPC, KC_ENT, _______, KC_RALT
+ //`--------------------------' `--------------------------'
+ )
+};
diff --git a/keyboards/beekeeb/piantor_pro/readme.md b/keyboards/beekeeb/piantor_pro/readme.md
new file mode 100644
index 00000000000..08012e43dff
--- /dev/null
+++ b/keyboards/beekeeb/piantor_pro/readme.md
@@ -0,0 +1,20 @@
+# Piantor Pro
+
+
+
+A 42 key hotswappable keyboard with RP2040.
+
+* Keyboard Maintainer: [beekeeb](https://github.com/beekeeb)
+* Hardware Availability: [beekeeb.shop](https://beekeeb.shop)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make beekeeb/piantor_pro: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).
+
+## Flashing
+
+To enter the bootloader mode, disconnect the keyboard from the computer. While holding the BOOT button, connect the keyboard to the computer.
+
+Run `make beekeeb/piantor_pro:default:flash` or copy the compiled uf2 firmware to the USB mass storage device.
diff --git a/keyboards/beekeeb/piantor_pro/rules.mk b/keyboards/beekeeb/piantor_pro/rules.mk
new file mode 100644
index 00000000000..161ec22b16e
--- /dev/null
+++ b/keyboards/beekeeb/piantor_pro/rules.mk
@@ -0,0 +1 @@
+SERIAL_DRIVER = vendor
diff --git a/keyboards/boardsource/equals/48/config.h b/keyboards/boardsource/equals/48/config.h
new file mode 100644
index 00000000000..952fa269c6e
--- /dev/null
+++ b/keyboards/boardsource/equals/48/config.h
@@ -0,0 +1,23 @@
+// Copyright 2023 Cole Smith (@boardsource)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 200U
+
+#define RGB_MATRIX_LED_COUNT 58
+
+#define AUDIO_PIN GP29
+#define AUDIO_PWM_DRIVER PWMD6
+#define AUDIO_PWM_CHANNEL RP2040_PWM_CHANNEL_B
+
+#define AUDIO_INIT_DELAY
+
+// SPI Configuration
+#define SPI_DRIVER SPID1
+#define SPI_SCK_PIN GP26
+#define SPI_MOSI_PIN GP27
+
+// Display Configuration
+#define OLED_CS_PIN GP25
+#define OLED_DC_PIN GP20
+#define OLED_RST_PIN GP28
diff --git a/keyboards/boardsource/equals/48/halconf.h b/keyboards/boardsource/equals/48/halconf.h
new file mode 100644
index 00000000000..ec1c061eeca
--- /dev/null
+++ b/keyboards/boardsource/equals/48/halconf.h
@@ -0,0 +1,9 @@
+// Copyright 2023 Cole Smith (@boardsource)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#define HAL_USE_I2C TRUE
+#define HAL_USE_PWM TRUE
+#define HAL_USE_SPI TRUE
+
+#include_next
diff --git a/keyboards/boardsource/equals/48/info.json b/keyboards/boardsource/equals/48/info.json
new file mode 100644
index 00000000000..63561f4c597
--- /dev/null
+++ b/keyboards/boardsource/equals/48/info.json
@@ -0,0 +1,180 @@
+{
+ "keyboard_name": "Equals 48",
+ "bootloader": "rp2040",
+ "processor": "RP2040",
+ "features": {
+ "audio":true
+ },
+ "matrix_pins": {
+ "cols": ["GP0", "GP1", "GP2", "GP3", "GP4", "GP5", "GP6", "GP7", "GP8", "GP9", "GP10", "GP11"],
+ "rows": ["GP12", "GP13", "GP16", "GP17"]
+ },
+ "ws2812": {
+ "driver": "vendor",
+ "pin": "GP21"
+ },
+ "rgb_matrix": {
+ "driver": "ws2812",
+ "max_brightness": 150,
+ "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
+ },
+ "layout": [
+ { "flags": 2, "x": 220, "y": 17 },
+ { "flags": 2, "x": 172, "y": 17 },
+ { "flags": 2, "x": 112, "y": 17 },
+ { "flags": 2, "x": 50, "y": 17 },
+ { "flags": 2, "x": 4, "y": 17 },
+ { "flags": 2, "x": 4, "y": 56 },
+ { "flags": 2, "x": 50, "y": 56 },
+ { "flags": 2, "x": 112, "y": 56 },
+ { "flags": 2, "x": 172, "y": 56 },
+ { "flags": 2, "x": 220, "y": 56 },
+ { "flags": 1, "matrix": [0, 0], "x": 0, "y": 0 },
+ { "flags": 4, "matrix": [0, 1], "x": 20, "y": 0 },
+ { "flags": 4, "matrix": [0, 2], "x": 40, "y": 0 },
+ { "flags": 4, "matrix": [0, 3], "x": 61, "y": 0 },
+ { "flags": 4, "matrix": [0, 4], "x": 81, "y": 0 },
+ { "flags": 4, "matrix": [0, 5], "x": 101, "y": 0 },
+ { "flags": 4, "matrix": [0, 6], "x": 122, "y": 0 },
+ { "flags": 4, "matrix": [0, 7], "x": 142, "y": 0 },
+ { "flags": 4, "matrix": [0, 8], "x": 162, "y": 0 },
+ { "flags": 4, "matrix": [0, 9], "x": 183, "y": 0 },
+ { "flags": 4, "matrix": [0, 10], "x": 203, "y": 0 },
+ { "flags": 1, "matrix": [0, 11], "x": 224, "y": 0 },
+ { "flags": 1, "matrix": [1, 0], "x": 0, "y": 21 },
+ { "flags": 4, "matrix": [1, 1], "x": 20, "y": 21 },
+ { "flags": 4, "matrix": [1, 2], "x": 40, "y": 21 },
+ { "flags": 4, "matrix": [1, 3], "x": 61, "y": 21 },
+ { "flags": 4, "matrix": [1, 4], "x": 81, "y": 21 },
+ { "flags": 4, "matrix": [1, 5], "x": 101, "y": 21 },
+ { "flags": 4, "matrix": [1, 6], "x": 122, "y": 21 },
+ { "flags": 4, "matrix": [1, 7], "x": 142, "y": 21 },
+ { "flags": 4, "matrix": [1, 8], "x": 162, "y": 21 },
+ { "flags": 4, "matrix": [1, 9], "x": 183, "y": 21 },
+ { "flags": 4, "matrix": [1, 10], "x": 203, "y": 21 },
+ { "flags": 1, "matrix": [1, 11], "x": 224, "y": 21 },
+ { "flags": 1, "matrix": [2, 0], "x": 0, "y": 42 },
+ { "flags": 4, "matrix": [2, 1], "x": 20, "y": 42 },
+ { "flags": 4, "matrix": [2, 2], "x": 40, "y": 42 },
+ { "flags": 4, "matrix": [2, 3], "x": 61, "y": 42 },
+ { "flags": 4, "matrix": [2, 4], "x": 81, "y": 42 },
+ { "flags": 4, "matrix": [2, 5], "x": 101, "y": 42 },
+ { "flags": 4, "matrix": [2, 6], "x": 122, "y": 42 },
+ { "flags": 4, "matrix": [2, 7], "x": 142, "y": 42 },
+ { "flags": 4, "matrix": [2, 8], "x": 162, "y": 42 },
+ { "flags": 4, "matrix": [2, 9], "x": 183, "y": 42 },
+ { "flags": 4, "matrix": [2, 10], "x": 203, "y": 42 },
+ { "flags": 1, "matrix": [2, 11], "x": 224, "y": 42 },
+ { "flags": 1, "matrix": [3, 0], "x": 0, "y": 64 },
+ { "flags": 1, "matrix": [3, 1], "x": 20, "y": 64 },
+ { "flags": 1, "matrix": [3, 2], "x": 40, "y": 64 },
+ { "flags": 1, "matrix": [3, 3], "x": 61, "y": 64 },
+ { "flags": 1, "matrix": [3, 4], "x": 81, "y": 64 },
+ { "flags": 4, "matrix": [3, 5], "x": 101, "y": 64 },
+ { "flags": 1, "matrix": [3, 6], "x": 122, "y": 64 },
+ { "flags": 1, "matrix": [3, 7], "x": 142, "y": 64 },
+ { "flags": 1, "matrix": [3, 8], "x": 162, "y": 64 },
+ { "flags": 1, "matrix": [3, 9], "x": 183, "y": 64 },
+ { "flags": 1, "matrix": [3, 10], "x": 203, "y": 64 },
+ { "flags": 1, "matrix": [3, 11], "x": 224, "y": 64 }
+ ]
+ },
+ "community_layouts": ["ortho_4x12"],
+ "layouts": {
+ "LAYOUT_ortho_4x12": {
+ "layout": [
+ { "matrix": [0, 0], "x": 0, "y": 0 },
+ { "matrix": [0, 1], "x": 1, "y": 0 },
+ { "matrix": [0, 2], "x": 2, "y": 0 },
+ { "matrix": [0, 3], "x": 3, "y": 0 },
+ { "matrix": [0, 4], "x": 4, "y": 0 },
+ { "matrix": [0, 5], "x": 5, "y": 0 },
+ { "matrix": [0, 6], "x": 6, "y": 0 },
+ { "matrix": [0, 7], "x": 7, "y": 0 },
+ { "matrix": [0, 8], "x": 8, "y": 0 },
+ { "matrix": [0, 9], "x": 9, "y": 0 },
+ { "matrix": [0, 10], "x": 10, "y": 0 },
+ { "matrix": [0, 11], "x": 11, "y": 0 },
+ { "matrix": [1, 0], "x": 0, "y": 1 },
+ { "matrix": [1, 1], "x": 1, "y": 1 },
+ { "matrix": [1, 2], "x": 2, "y": 1 },
+ { "matrix": [1, 3], "x": 3, "y": 1 },
+ { "matrix": [1, 4], "x": 4, "y": 1 },
+ { "matrix": [1, 5], "x": 5, "y": 1 },
+ { "matrix": [1, 6], "x": 6, "y": 1 },
+ { "matrix": [1, 7], "x": 7, "y": 1 },
+ { "matrix": [1, 8], "x": 8, "y": 1 },
+ { "matrix": [1, 9], "x": 9, "y": 1 },
+ { "matrix": [1, 10], "x": 10, "y": 1 },
+ { "matrix": [1, 11], "x": 11, "y": 1 },
+ { "matrix": [2, 0], "x": 0, "y": 2 },
+ { "matrix": [2, 1], "x": 1, "y": 2 },
+ { "matrix": [2, 2], "x": 2, "y": 2 },
+ { "matrix": [2, 3], "x": 3, "y": 2 },
+ { "matrix": [2, 4], "x": 4, "y": 2 },
+ { "matrix": [2, 5], "x": 5, "y": 2 },
+ { "matrix": [2, 6], "x": 6, "y": 2 },
+ { "matrix": [2, 7], "x": 7, "y": 2 },
+ { "matrix": [2, 8], "x": 8, "y": 2 },
+ { "matrix": [2, 9], "x": 9, "y": 2 },
+ { "matrix": [2, 10], "x": 10, "y": 2 },
+ { "matrix": [2, 11], "x": 11, "y": 2 },
+ { "matrix": [3, 0], "x": 0, "y": 3 },
+ { "matrix": [3, 1], "x": 1, "y": 3 },
+ { "matrix": [3, 2], "x": 2, "y": 3 },
+ { "matrix": [3, 3], "x": 3, "y": 3 },
+ { "matrix": [3, 4], "x": 4, "y": 3 },
+ { "matrix": [3, 5], "x": 5, "y": 3 },
+ { "matrix": [3, 6], "x": 6, "y": 3 },
+ { "matrix": [3, 7], "x": 7, "y": 3 },
+ { "matrix": [3, 8], "x": 8, "y": 3 },
+ { "matrix": [3, 9], "x": 9, "y": 3 },
+ { "matrix": [3, 10], "x": 10, "y": 3 },
+ { "matrix": [3, 11], "x": 11, "y": 3 }
+ ]
+ }
+ }
+}
diff --git a/keyboards/boardsource/equals/48/keymaps/default/keymap.c b/keyboards/boardsource/equals/48/keymaps/default/keymap.c
new file mode 100644
index 00000000000..92d83bb0e89
--- /dev/null
+++ b/keyboards/boardsource/equals/48/keymaps/default/keymap.c
@@ -0,0 +1,33 @@
+// Copyright 2022 @boardsource
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include QMK_KEYBOARD_H
+
+enum layers {
+ _MAIN,
+ _RAISE,
+ _LOWER
+};
+
+#define LOWER MO(_LOWER)
+#define RAISE MO(_RAISE)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_MAIN] = LAYOUT_ortho_4x12(
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
+ KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT,
+ KC_PIPE, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+ ),
+ [_RAISE] = LAYOUT_ortho_4x12(
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC,
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE,
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, _______,
+ QK_BOOT, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+ ),
+ [_LOWER] = LAYOUT_ortho_4x12(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+ )
+};
diff --git a/keyboards/boardsource/equals/48/keymaps/via/keymap.c b/keyboards/boardsource/equals/48/keymaps/via/keymap.c
new file mode 100644
index 00000000000..3c3427d1225
--- /dev/null
+++ b/keyboards/boardsource/equals/48/keymaps/via/keymap.c
@@ -0,0 +1,34 @@
+// Copyright 2022 @boardsource
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include QMK_KEYBOARD_H
+
+enum layers {
+ _MAIN,
+ _RAISE,
+ _LOWER
+};
+
+#define LOWER MO(_LOWER)
+#define RAISE MO(_RAISE)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_MAIN] = LAYOUT_ortho_4x12(
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
+ KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT,
+ KC_PIPE, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+ ),
+ [_RAISE] = LAYOUT_ortho_4x12(
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC,
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE,
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, _______,
+ QK_BOOT, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+ ),
+ [_LOWER] = LAYOUT_ortho_4x12(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______,
+
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY),
+
+};
diff --git a/keyboards/boardsource/equals/48/keymaps/via/rules.mk b/keyboards/boardsource/equals/48/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/boardsource/equals/48/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/boardsource/equals/48/mcuconf.h b/keyboards/boardsource/equals/48/mcuconf.h
new file mode 100644
index 00000000000..e38c802c071
--- /dev/null
+++ b/keyboards/boardsource/equals/48/mcuconf.h
@@ -0,0 +1,11 @@
+// Copyright 2023 Cole Smith (@boardsource)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#include_next
+
+#undef RP_PWM_USE_PWM6
+#define RP_PWM_USE_PWM6 TRUE
+
+#undef RP_SPI_USE_SPI1
+#define RP_SPI_USE_SPI1 TRUE
diff --git a/keyboards/boardsource/equals/48/rules.mk b/keyboards/boardsource/equals/48/rules.mk
new file mode 100644
index 00000000000..4192b0c2e54
--- /dev/null
+++ b/keyboards/boardsource/equals/48/rules.mk
@@ -0,0 +1,3 @@
+AUDIO_DRIVER = pwm_hardware
+QUANTUM_PAINTER_ENABLE = yes
+QUANTUM_PAINTER_DRIVERS += st7735_spi
diff --git a/keyboards/boardsource/equals/60/config.h b/keyboards/boardsource/equals/60/config.h
new file mode 100644
index 00000000000..ee4bc6b1e85
--- /dev/null
+++ b/keyboards/boardsource/equals/60/config.h
@@ -0,0 +1,23 @@
+// Copyright 2023 Cole Smith (@boardsource)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 200U
+
+#define RGB_MATRIX_LED_COUNT 70
+
+#define AUDIO_PIN GP29
+#define AUDIO_PWM_DRIVER PWMD6
+#define AUDIO_PWM_CHANNEL RP2040_PWM_CHANNEL_B
+
+#define AUDIO_INIT_DELAY
+
+// SPI Configuration
+#define SPI_DRIVER SPID1
+#define SPI_SCK_PIN GP26
+#define SPI_MOSI_PIN GP27
+
+// Display Configuration
+#define OLED_CS_PIN GP25
+#define OLED_DC_PIN GP20
+#define OLED_RST_PIN GP28
diff --git a/keyboards/boardsource/equals/60/halconf.h b/keyboards/boardsource/equals/60/halconf.h
new file mode 100644
index 00000000000..ec1c061eeca
--- /dev/null
+++ b/keyboards/boardsource/equals/60/halconf.h
@@ -0,0 +1,9 @@
+// Copyright 2023 Cole Smith (@boardsource)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#define HAL_USE_I2C TRUE
+#define HAL_USE_PWM TRUE
+#define HAL_USE_SPI TRUE
+
+#include_next
diff --git a/keyboards/boardsource/equals/60/info.json b/keyboards/boardsource/equals/60/info.json
new file mode 100644
index 00000000000..355e434b4e5
--- /dev/null
+++ b/keyboards/boardsource/equals/60/info.json
@@ -0,0 +1,203 @@
+{
+ "keyboard_name": "Equals 60",
+ "bootloader": "rp2040",
+ "processor": "RP2040",
+ "features": {
+ "audio":true
+ },
+ "matrix_pins": {
+ "cols": ["GP0", "GP1", "GP2", "GP3", "GP4", "GP5", "GP6", "GP7", "GP8", "GP9", "GP10", "GP11"],
+ "rows": ["GP12", "GP13", "GP16", "GP17", "GP18"]
+ },
+ "ws2812": {
+ "driver": "vendor",
+ "pin": "GP21"
+ },
+ "rgb_matrix": {
+ "driver": "ws2812",
+ "max_brightness": 150,
+ "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
+ },
+ "layout": [
+ { "flags": 2, "x": 220, "y": 17 },
+ { "flags": 2, "x": 172, "y": 17 },
+ { "flags": 2, "x": 112, "y": 17 },
+ { "flags": 2, "x": 50, "y": 17 },
+ { "flags": 2, "x": 4, "y": 17 },
+ { "flags": 2, "x": 4, "y": 56 },
+ { "flags": 2, "x": 50, "y": 56 },
+ { "flags": 2, "x": 112, "y": 56 },
+ { "flags": 2, "x": 172, "y": 56 },
+ { "flags": 2, "x": 220, "y": 56 },
+ { "flags": 1, "matrix": [0, 0], "x": 0, "y": 0 },
+ { "flags": 4, "matrix": [0, 1], "x": 20, "y": 0 },
+ { "flags": 4, "matrix": [0, 2], "x": 40, "y": 0 },
+ { "flags": 4, "matrix": [0, 3], "x": 61, "y": 0 },
+ { "flags": 4, "matrix": [0, 4], "x": 81, "y": 0 },
+ { "flags": 4, "matrix": [0, 5], "x": 101, "y": 0 },
+ { "flags": 4, "matrix": [0, 6], "x": 122, "y": 0 },
+ { "flags": 4, "matrix": [0, 7], "x": 142, "y": 0 },
+ { "flags": 4, "matrix": [0, 8], "x": 162, "y": 0 },
+ { "flags": 4, "matrix": [0, 9], "x": 183, "y": 0 },
+ { "flags": 4, "matrix": [0, 10], "x": 203, "y": 0 },
+ { "flags": 1, "matrix": [0, 11], "x": 224, "y": 0 },
+ { "flags": 1, "matrix": [1, 0], "x": 0, "y": 21 },
+ { "flags": 4, "matrix": [1, 1], "x": 20, "y": 21 },
+ { "flags": 4, "matrix": [1, 2], "x": 40, "y": 21 },
+ { "flags": 4, "matrix": [1, 3], "x": 61, "y": 21 },
+ { "flags": 4, "matrix": [1, 4], "x": 81, "y": 21 },
+ { "flags": 4, "matrix": [1, 5], "x": 101, "y": 21 },
+ { "flags": 4, "matrix": [1, 6], "x": 122, "y": 21 },
+ { "flags": 4, "matrix": [1, 7], "x": 142, "y": 21 },
+ { "flags": 4, "matrix": [1, 8], "x": 162, "y": 21 },
+ { "flags": 4, "matrix": [1, 9], "x": 183, "y": 21 },
+ { "flags": 4, "matrix": [1, 10], "x": 203, "y": 21 },
+ { "flags": 1, "matrix": [1, 11], "x": 224, "y": 21 },
+ { "flags": 1, "matrix": [2, 0], "x": 0, "y": 42 },
+ { "flags": 4, "matrix": [2, 1], "x": 20, "y": 42 },
+ { "flags": 4, "matrix": [2, 2], "x": 40, "y": 42 },
+ { "flags": 4, "matrix": [2, 3], "x": 61, "y": 42 },
+ { "flags": 4, "matrix": [2, 4], "x": 81, "y": 42 },
+ { "flags": 4, "matrix": [2, 5], "x": 101, "y": 42 },
+ { "flags": 4, "matrix": [2, 6], "x": 122, "y": 42 },
+ { "flags": 4, "matrix": [2, 7], "x": 142, "y": 42 },
+ { "flags": 4, "matrix": [2, 8], "x": 162, "y": 42 },
+ { "flags": 4, "matrix": [2, 9], "x": 183, "y": 42 },
+ { "flags": 4, "matrix": [2, 10], "x": 203, "y": 42 },
+ { "flags": 1, "matrix": [2, 11], "x": 224, "y": 42 },
+ { "flags": 1, "matrix": [3, 0], "x": 0, "y": 64 },
+ { "flags": 4, "matrix": [3, 1], "x": 20, "y": 64 },
+ { "flags": 4, "matrix": [3, 2], "x": 40, "y": 64 },
+ { "flags": 4, "matrix": [3, 3], "x": 61, "y": 64 },
+ { "flags": 4, "matrix": [3, 4], "x": 81, "y": 64 },
+ { "flags": 4, "matrix": [3, 5], "x": 101, "y": 64 },
+ { "flags": 4, "matrix": [3, 6], "x": 122, "y": 64 },
+ { "flags": 4, "matrix": [3, 7], "x": 142, "y": 64 },
+ { "flags": 4, "matrix": [3, 8], "x": 162, "y": 64 },
+ { "flags": 4, "matrix": [3, 9], "x": 183, "y": 64 },
+ { "flags": 4, "matrix": [3, 10], "x": 203, "y": 64 },
+ { "flags": 1, "matrix": [3, 11], "x": 224, "y": 64 },
+ { "flags": 1, "matrix": [4, 0], "x": 0, "y": 86 },
+ { "flags": 1, "matrix": [4, 1], "x": 20, "y": 86 },
+ { "flags": 1, "matrix": [4, 2], "x": 40, "y": 86 },
+ { "flags": 1, "matrix": [4, 3], "x": 61, "y": 86 },
+ { "flags": 1, "matrix": [4, 4], "x": 81, "y": 86 },
+ { "flags": 4, "matrix": [4, 5], "x": 111, "y": 86 },
+ { "flags": 1, "matrix": [4, 7], "x": 142, "y": 86 },
+ { "flags": 1, "matrix": [4, 8], "x": 162, "y": 86 },
+ { "flags": 1, "matrix": [4, 9], "x": 183, "y": 86 },
+ { "flags": 1, "matrix": [4, 10], "x": 203, "y": 86 },
+ { "flags": 1, "matrix": [4, 11], "x": 224, "y": 86 }
+ ]
+ },
+ "community_layouts": ["ortho_5x12"],
+ "layouts": {
+ "LAYOUT_ortho_5x12": {
+ "layout": [
+ { "matrix": [0, 0], "x": 0, "y": 0 },
+ { "matrix": [0, 1], "x": 1, "y": 0 },
+ { "matrix": [0, 2], "x": 2, "y": 0 },
+ { "matrix": [0, 3], "x": 3, "y": 0 },
+ { "matrix": [0, 4], "x": 4, "y": 0 },
+ { "matrix": [0, 5], "x": 5, "y": 0 },
+ { "matrix": [0, 6], "x": 6, "y": 0 },
+ { "matrix": [0, 7], "x": 7, "y": 0 },
+ { "matrix": [0, 8], "x": 8, "y": 0 },
+ { "matrix": [0, 9], "x": 9, "y": 0 },
+ { "matrix": [0, 10], "x": 10, "y": 0 },
+ { "matrix": [0, 11], "x": 11, "y": 0 },
+ { "matrix": [1, 0], "x": 0, "y": 1 },
+ { "matrix": [1, 1], "x": 1, "y": 1 },
+ { "matrix": [1, 2], "x": 2, "y": 1 },
+ { "matrix": [1, 3], "x": 3, "y": 1 },
+ { "matrix": [1, 4], "x": 4, "y": 1 },
+ { "matrix": [1, 5], "x": 5, "y": 1 },
+ { "matrix": [1, 6], "x": 6, "y": 1 },
+ { "matrix": [1, 7], "x": 7, "y": 1 },
+ { "matrix": [1, 8], "x": 8, "y": 1 },
+ { "matrix": [1, 9], "x": 9, "y": 1 },
+ { "matrix": [1, 10], "x": 10, "y": 1 },
+ { "matrix": [1, 11], "x": 11, "y": 1 },
+ { "matrix": [2, 0], "x": 0, "y": 2 },
+ { "matrix": [2, 1], "x": 1, "y": 2 },
+ { "matrix": [2, 2], "x": 2, "y": 2 },
+ { "matrix": [2, 3], "x": 3, "y": 2 },
+ { "matrix": [2, 4], "x": 4, "y": 2 },
+ { "matrix": [2, 5], "x": 5, "y": 2 },
+ { "matrix": [2, 6], "x": 6, "y": 2 },
+ { "matrix": [2, 7], "x": 7, "y": 2 },
+ { "matrix": [2, 8], "x": 8, "y": 2 },
+ { "matrix": [2, 9], "x": 9, "y": 2 },
+ { "matrix": [2, 10], "x": 10, "y": 2 },
+ { "matrix": [2, 11], "x": 11, "y": 2 },
+ { "matrix": [3, 0], "x": 0, "y": 3 },
+ { "matrix": [3, 1], "x": 1, "y": 3 },
+ { "matrix": [3, 2], "x": 2, "y": 3 },
+ { "matrix": [3, 3], "x": 3, "y": 3 },
+ { "matrix": [3, 4], "x": 4, "y": 3 },
+ { "matrix": [3, 5], "x": 5, "y": 3 },
+ { "matrix": [3, 6], "x": 6, "y": 3 },
+ { "matrix": [3, 7], "x": 7, "y": 3 },
+ { "matrix": [3, 8], "x": 8, "y": 3 },
+ { "matrix": [3, 9], "x": 9, "y": 3 },
+ { "matrix": [3, 10], "x": 10, "y": 3 },
+ { "matrix": [3, 11], "x": 11, "y": 3 },
+ { "matrix": [4, 0], "x": 0, "y": 4 },
+ { "matrix": [4, 1], "x": 1, "y": 4 },
+ { "matrix": [4, 2], "x": 2, "y": 4 },
+ { "matrix": [4, 3], "x": 3, "y": 4 },
+ { "matrix": [4, 4], "x": 4, "y": 4 },
+ { "matrix": [4, 5], "x": 5, "y": 4 },
+ { "matrix": [4, 6], "x": 6, "y": 4 },
+ { "matrix": [4, 7], "x": 7, "y": 4 },
+ { "matrix": [4, 8], "x": 8, "y": 4 },
+ { "matrix": [4, 9], "x": 9, "y": 4 },
+ { "matrix": [4, 10], "x": 10, "y": 4 },
+ { "matrix": [4, 11], "x": 11, "y": 4 }
+ ]
+ }
+ }
+}
diff --git a/keyboards/boardsource/equals/60/keymaps/default/keymap.c b/keyboards/boardsource/equals/60/keymaps/default/keymap.c
new file mode 100644
index 00000000000..48e26a40947
--- /dev/null
+++ b/keyboards/boardsource/equals/60/keymaps/default/keymap.c
@@ -0,0 +1,36 @@
+// Copyright 2023 Cole Smith (@boardsource)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include QMK_KEYBOARD_H
+
+enum layers {
+ _MAIN,
+ _RAISE,
+ _LOWER
+};
+
+#define LOWER MO(_LOWER)
+#define RAISE MO(_RAISE)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_MAIN] = LAYOUT_ortho_5x12(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, 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_DEL,
+ KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT,
+ KC_PIPE, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_RGHT, RGB_MOD, RGB_TOG
+ ),
+ [_RAISE] = LAYOUT_ortho_5x12(
+ 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_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL,
+ _______, KC_4, KC_5, KC_6, KC_PLUS, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, _______,
+ KC_ENT, KC_7, KC_8, KC_9, KC_MINS, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_MUTE, _______, KC_BSLS,
+ QK_BOOT, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+ ),
+ [_LOWER] = LAYOUT_ortho_5x12(
+ 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_UP, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______,
+ KC_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ QK_BOOT, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+ )
+};
diff --git a/keyboards/boardsource/equals/60/keymaps/via/keymap.c b/keyboards/boardsource/equals/60/keymaps/via/keymap.c
new file mode 100644
index 00000000000..54528b8f600
--- /dev/null
+++ b/keyboards/boardsource/equals/60/keymaps/via/keymap.c
@@ -0,0 +1,36 @@
+// Copyright 2023 Cole Smith (@boardsource)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include QMK_KEYBOARD_H
+
+enum layers {
+ _MAIN,
+ _RAISE,
+ _LOWER
+};
+
+#define LOWER MO(_LOWER)
+#define RAISE MO(_RAISE)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_MAIN] = LAYOUT_ortho_5x12(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, 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_DEL,
+ KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT,
+ KC_PIPE, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+ ),
+ [_RAISE] = LAYOUT_ortho_5x12(
+ 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_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL,
+ _______, KC_4, KC_5, KC_6, KC_PLUS, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, _______,
+ KC_ENT, KC_7, KC_8, KC_9, KC_MINS, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_MUTE, _______, KC_BSLS,
+ QK_BOOT, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+ ),
+ [_LOWER] = LAYOUT_ortho_5x12(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
+ _______, _______, _______, _______, _______, RGB_TOG, RGB_MOD, _______, KC_UP, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______,
+ KC_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ QK_BOOT, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+ )
+};
diff --git a/keyboards/boardsource/equals/60/keymaps/via/rules.mk b/keyboards/boardsource/equals/60/keymaps/via/rules.mk
new file mode 100644
index 00000000000..036bd6d1c3e
--- /dev/null
+++ b/keyboards/boardsource/equals/60/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/boardsource/equals/60/mcuconf.h b/keyboards/boardsource/equals/60/mcuconf.h
new file mode 100644
index 00000000000..e38c802c071
--- /dev/null
+++ b/keyboards/boardsource/equals/60/mcuconf.h
@@ -0,0 +1,11 @@
+// Copyright 2023 Cole Smith (@boardsource)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#include_next
+
+#undef RP_PWM_USE_PWM6
+#define RP_PWM_USE_PWM6 TRUE
+
+#undef RP_SPI_USE_SPI1
+#define RP_SPI_USE_SPI1 TRUE
diff --git a/keyboards/boardsource/equals/60/rules.mk b/keyboards/boardsource/equals/60/rules.mk
new file mode 100644
index 00000000000..4192b0c2e54
--- /dev/null
+++ b/keyboards/boardsource/equals/60/rules.mk
@@ -0,0 +1,3 @@
+AUDIO_DRIVER = pwm_hardware
+QUANTUM_PAINTER_ENABLE = yes
+QUANTUM_PAINTER_DRIVERS += st7735_spi
diff --git a/keyboards/boardsource/equals/avr/config.h b/keyboards/boardsource/equals/avr/config.h
new file mode 100644
index 00000000000..68754cbe528
--- /dev/null
+++ b/keyboards/boardsource/equals/avr/config.h
@@ -0,0 +1,4 @@
+// Copyright 2023 Cole Smith (@boardsource)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+#define RGB_MATRIX_LED_COUNT 70
diff --git a/keyboards/boardsource/equals/avr/info.json b/keyboards/boardsource/equals/avr/info.json
new file mode 100644
index 00000000000..bbade34e638
--- /dev/null
+++ b/keyboards/boardsource/equals/avr/info.json
@@ -0,0 +1,202 @@
+{
+ "keyboard_name": "Equals kit",
+
+ "build": {
+ "lto": true
+ },
+ "development_board": "promicro",
+ "matrix_pins": {
+ "cols": ["F4","F5","F6","F7","B1","B3","B2","B6","B5","B4","E6","D7"],
+ "rows": ["D3","D2","D1","D0","D4"]
+ },
+ "ws2812": {
+ "pin": "C6"
+ },
+ "rgb_matrix": {
+ "driver": "ws2812",
+ "max_brightness": 150,
+ "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
+ },
+ "layout": [
+ { "flags": 2, "x": 220, "y": 17 },
+ { "flags": 2, "x": 172, "y": 17 },
+ { "flags": 2, "x": 112, "y": 17 },
+ { "flags": 2, "x": 50, "y": 17 },
+ { "flags": 2, "x": 4, "y": 17 },
+ { "flags": 2, "x": 4, "y": 56 },
+ { "flags": 2, "x": 50, "y": 56 },
+ { "flags": 2, "x": 112, "y": 56 },
+ { "flags": 2, "x": 172, "y": 56 },
+ { "flags": 2, "x": 220, "y": 56 },
+ { "flags": 1, "matrix": [0, 0], "x": 0, "y": 0 },
+ { "flags": 4, "matrix": [0, 1], "x": 20, "y": 0 },
+ { "flags": 4, "matrix": [0, 2], "x": 40, "y": 0 },
+ { "flags": 4, "matrix": [0, 3], "x": 61, "y": 0 },
+ { "flags": 4, "matrix": [0, 4], "x": 81, "y": 0 },
+ { "flags": 4, "matrix": [0, 5], "x": 101, "y": 0 },
+ { "flags": 4, "matrix": [0, 6], "x": 122, "y": 0 },
+ { "flags": 4, "matrix": [0, 7], "x": 142, "y": 0 },
+ { "flags": 4, "matrix": [0, 8], "x": 162, "y": 0 },
+ { "flags": 4, "matrix": [0, 9], "x": 183, "y": 0 },
+ { "flags": 4, "matrix": [0, 10], "x": 203, "y": 0 },
+ { "flags": 1, "matrix": [0, 11], "x": 224, "y": 0 },
+ { "flags": 1, "matrix": [1, 0], "x": 0, "y": 21 },
+ { "flags": 4, "matrix": [1, 1], "x": 20, "y": 21 },
+ { "flags": 4, "matrix": [1, 2], "x": 40, "y": 21 },
+ { "flags": 4, "matrix": [1, 3], "x": 61, "y": 21 },
+ { "flags": 4, "matrix": [1, 4], "x": 81, "y": 21 },
+ { "flags": 4, "matrix": [1, 5], "x": 101, "y": 21 },
+ { "flags": 4, "matrix": [1, 6], "x": 122, "y": 21 },
+ { "flags": 4, "matrix": [1, 7], "x": 142, "y": 21 },
+ { "flags": 4, "matrix": [1, 8], "x": 162, "y": 21 },
+ { "flags": 4, "matrix": [1, 9], "x": 183, "y": 21 },
+ { "flags": 4, "matrix": [1, 10], "x": 203, "y": 21 },
+ { "flags": 1, "matrix": [1, 11], "x": 224, "y": 21 },
+ { "flags": 1, "matrix": [2, 0], "x": 0, "y": 42 },
+ { "flags": 4, "matrix": [2, 1], "x": 20, "y": 42 },
+ { "flags": 4, "matrix": [2, 2], "x": 40, "y": 42 },
+ { "flags": 4, "matrix": [2, 3], "x": 61, "y": 42 },
+ { "flags": 4, "matrix": [2, 4], "x": 81, "y": 42 },
+ { "flags": 4, "matrix": [2, 5], "x": 101, "y": 42 },
+ { "flags": 4, "matrix": [2, 6], "x": 122, "y": 42 },
+ { "flags": 4, "matrix": [2, 7], "x": 142, "y": 42 },
+ { "flags": 4, "matrix": [2, 8], "x": 162, "y": 42 },
+ { "flags": 4, "matrix": [2, 9], "x": 183, "y": 42 },
+ { "flags": 4, "matrix": [2, 10], "x": 203, "y": 42 },
+ { "flags": 1, "matrix": [2, 11], "x": 224, "y": 42 },
+ { "flags": 1, "matrix": [3, 0], "x": 0, "y": 64 },
+ { "flags": 4, "matrix": [3, 1], "x": 20, "y": 64 },
+ { "flags": 4, "matrix": [3, 2], "x": 40, "y": 64 },
+ { "flags": 4, "matrix": [3, 3], "x": 61, "y": 64 },
+ { "flags": 4, "matrix": [3, 4], "x": 81, "y": 64 },
+ { "flags": 4, "matrix": [3, 5], "x": 101, "y": 64 },
+ { "flags": 4, "matrix": [3, 6], "x": 122, "y": 64 },
+ { "flags": 4, "matrix": [3, 7], "x": 142, "y": 64 },
+ { "flags": 4, "matrix": [3, 8], "x": 162, "y": 64 },
+ { "flags": 4, "matrix": [3, 9], "x": 183, "y": 64 },
+ { "flags": 4, "matrix": [3, 10], "x": 203, "y": 64 },
+ { "flags": 1, "matrix": [3, 11], "x": 224, "y": 64 },
+ { "flags": 1, "matrix": [4, 0], "x": 0, "y": 86 },
+ { "flags": 1, "matrix": [4, 1], "x": 20, "y": 86 },
+ { "flags": 1, "matrix": [4, 2], "x": 40, "y": 86 },
+ { "flags": 1, "matrix": [4, 3], "x": 61, "y": 86 },
+ { "flags": 1, "matrix": [4, 4], "x": 81, "y": 86 },
+ { "flags": 4, "matrix": [4, 5], "x": 111, "y": 86 },
+ { "flags": 1, "matrix": [4, 7], "x": 142, "y": 86 },
+ { "flags": 1, "matrix": [4, 8], "x": 162, "y": 86 },
+ { "flags": 1, "matrix": [4, 9], "x": 183, "y": 86 },
+ { "flags": 1, "matrix": [4, 10], "x": 203, "y": 86 },
+ { "flags": 1, "matrix": [4, 11], "x": 224, "y": 86 }
+ ]
+ },
+ "community_layouts": ["ortho_5x12"],
+ "layouts": {
+ "LAYOUT_ortho_5x12": {
+ "layout": [
+ { "matrix": [0, 0], "x": 0, "y": 0 },
+ { "matrix": [0, 1], "x": 1, "y": 0 },
+ { "matrix": [0, 2], "x": 2, "y": 0 },
+ { "matrix": [0, 3], "x": 3, "y": 0 },
+ { "matrix": [0, 4], "x": 4, "y": 0 },
+ { "matrix": [0, 5], "x": 5, "y": 0 },
+ { "matrix": [0, 6], "x": 6, "y": 0 },
+ { "matrix": [0, 7], "x": 7, "y": 0 },
+ { "matrix": [0, 8], "x": 8, "y": 0 },
+ { "matrix": [0, 9], "x": 9, "y": 0 },
+ { "matrix": [0, 10], "x": 10, "y": 0 },
+ { "matrix": [0, 11], "x": 11, "y": 0 },
+ { "matrix": [1, 0], "x": 0, "y": 1 },
+ { "matrix": [1, 1], "x": 1, "y": 1 },
+ { "matrix": [1, 2], "x": 2, "y": 1 },
+ { "matrix": [1, 3], "x": 3, "y": 1 },
+ { "matrix": [1, 4], "x": 4, "y": 1 },
+ { "matrix": [1, 5], "x": 5, "y": 1 },
+ { "matrix": [1, 6], "x": 6, "y": 1 },
+ { "matrix": [1, 7], "x": 7, "y": 1 },
+ { "matrix": [1, 8], "x": 8, "y": 1 },
+ { "matrix": [1, 9], "x": 9, "y": 1 },
+ { "matrix": [1, 10], "x": 10, "y": 1 },
+ { "matrix": [1, 11], "x": 11, "y": 1 },
+ { "matrix": [2, 0], "x": 0, "y": 2 },
+ { "matrix": [2, 1], "x": 1, "y": 2 },
+ { "matrix": [2, 2], "x": 2, "y": 2 },
+ { "matrix": [2, 3], "x": 3, "y": 2 },
+ { "matrix": [2, 4], "x": 4, "y": 2 },
+ { "matrix": [2, 5], "x": 5, "y": 2 },
+ { "matrix": [2, 6], "x": 6, "y": 2 },
+ { "matrix": [2, 7], "x": 7, "y": 2 },
+ { "matrix": [2, 8], "x": 8, "y": 2 },
+ { "matrix": [2, 9], "x": 9, "y": 2 },
+ { "matrix": [2, 10], "x": 10, "y": 2 },
+ { "matrix": [2, 11], "x": 11, "y": 2 },
+ { "matrix": [3, 0], "x": 0, "y": 3 },
+ { "matrix": [3, 1], "x": 1, "y": 3 },
+ { "matrix": [3, 2], "x": 2, "y": 3 },
+ { "matrix": [3, 3], "x": 3, "y": 3 },
+ { "matrix": [3, 4], "x": 4, "y": 3 },
+ { "matrix": [3, 5], "x": 5, "y": 3 },
+ { "matrix": [3, 6], "x": 6, "y": 3 },
+ { "matrix": [3, 7], "x": 7, "y": 3 },
+ { "matrix": [3, 8], "x": 8, "y": 3 },
+ { "matrix": [3, 9], "x": 9, "y": 3 },
+ { "matrix": [3, 10], "x": 10, "y": 3 },
+ { "matrix": [3, 11], "x": 11, "y": 3 },
+ { "matrix": [4, 0], "x": 0, "y": 4 },
+ { "matrix": [4, 1], "x": 1, "y": 4 },
+ { "matrix": [4, 2], "x": 2, "y": 4 },
+ { "matrix": [4, 3], "x": 3, "y": 4 },
+ { "matrix": [4, 4], "x": 4, "y": 4 },
+ { "matrix": [4, 5], "x": 5, "y": 4 },
+ { "matrix": [4, 6], "x": 6, "y": 4 },
+ { "matrix": [4, 7], "x": 7, "y": 4 },
+ { "matrix": [4, 8], "x": 8, "y": 4 },
+ { "matrix": [4, 9], "x": 9, "y": 4 },
+ { "matrix": [4, 10], "x": 10, "y": 4 },
+ { "matrix": [4, 11], "x": 11, "y": 4 }
+ ]
+ }
+ }
+}
diff --git a/keyboards/boardsource/equals/avr/keymaps/default/keymap.c b/keyboards/boardsource/equals/avr/keymaps/default/keymap.c
new file mode 100644
index 00000000000..99a049214b1
--- /dev/null
+++ b/keyboards/boardsource/equals/avr/keymaps/default/keymap.c
@@ -0,0 +1,36 @@
+// Copyright 2023 Cole Smith (@boardsource)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include QMK_KEYBOARD_H
+
+enum layers {
+ _MAIN,
+ _RAISE,
+ _LOWER
+};
+
+#define LOWER MO(_LOWER)
+#define RAISE MO(_RAISE)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_MAIN] = LAYOUT_ortho_5x12(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, 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_DEL,
+ KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT,
+ KC_PIPE, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, CK_TOGG, RGB_MOD, RGB_TOG
+ ),
+ [_RAISE] = LAYOUT_ortho_5x12(
+ 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_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL,
+ _______, KC_4, KC_5, KC_6, KC_PLUS, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, _______,
+ KC_ENT, KC_7, KC_8, KC_9, KC_MINS, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_MUTE, _______, KC_BSLS,
+ QK_BOOT, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+ ),
+ [_LOWER] = LAYOUT_ortho_5x12(
+ 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_UP, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______,
+ KC_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ QK_BOOT, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+ )
+};
diff --git a/keyboards/boardsource/equals/avr/keymaps/via/keymap.c b/keyboards/boardsource/equals/avr/keymaps/via/keymap.c
new file mode 100644
index 00000000000..54528b8f600
--- /dev/null
+++ b/keyboards/boardsource/equals/avr/keymaps/via/keymap.c
@@ -0,0 +1,36 @@
+// Copyright 2023 Cole Smith (@boardsource)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include QMK_KEYBOARD_H
+
+enum layers {
+ _MAIN,
+ _RAISE,
+ _LOWER
+};
+
+#define LOWER MO(_LOWER)
+#define RAISE MO(_RAISE)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_MAIN] = LAYOUT_ortho_5x12(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, 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_DEL,
+ KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT,
+ KC_PIPE, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+ ),
+ [_RAISE] = LAYOUT_ortho_5x12(
+ 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_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL,
+ _______, KC_4, KC_5, KC_6, KC_PLUS, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, _______,
+ KC_ENT, KC_7, KC_8, KC_9, KC_MINS, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_MUTE, _______, KC_BSLS,
+ QK_BOOT, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+ ),
+ [_LOWER] = LAYOUT_ortho_5x12(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
+ _______, _______, _______, _______, _______, RGB_TOG, RGB_MOD, _______, KC_UP, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______,
+ KC_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ QK_BOOT, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+ )
+};
diff --git a/keyboards/boardsource/equals/avr/keymaps/via/rules.mk b/keyboards/boardsource/equals/avr/keymaps/via/rules.mk
new file mode 100644
index 00000000000..036bd6d1c3e
--- /dev/null
+++ b/keyboards/boardsource/equals/avr/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/boardsource/equals/equals.c b/keyboards/boardsource/equals/equals.c
new file mode 100644
index 00000000000..8eb933e70d2
--- /dev/null
+++ b/keyboards/boardsource/equals/equals.c
@@ -0,0 +1,18 @@
+// Copyright 2023 @boardsource
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include "quantum.h"
+__attribute__((weak)) void ui_init(void) {};
+__attribute__((weak)) void ui_task(void) {};
+
+#ifdef QUANTUM_PAINTER_ENABLE
+void keyboard_post_init_kb(void) {
+ // Init the display
+ ui_init();
+ keyboard_post_init_user();
+}
+
+void housekeeping_task_kb(void) {
+ // Draw the display
+ ui_task();
+}
+#endif //QUANTUM_PAINTER_ENABLE
diff --git a/keyboards/boardsource/equals/graphics/thintel15.qff.c b/keyboards/boardsource/equals/graphics/thintel15.qff.c
new file mode 100644
index 00000000000..c361ad5346e
--- /dev/null
+++ b/keyboards/boardsource/equals/graphics/thintel15.qff.c
@@ -0,0 +1,69 @@
+// Copyright 2023 Cole Smith (@boardsource)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include
+
+// clang-format off
+const uint8_t font_thintel15[966] = {
+ 0x00, 0xFF, 0x14, 0x00, 0x00, 0x51, 0x46, 0x46, 0x01, 0xC6, 0x03, 0x00, 0x00, 0x39, 0xFC, 0xFF,
+ 0xFF, 0x0B, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, 0xFE, 0x1D, 0x01, 0x00, 0x02, 0x00,
+ 0x00, 0xC2, 0x00, 0x00, 0x84, 0x01, 0x00, 0x06, 0x03, 0x00, 0x46, 0x05, 0x00, 0x88, 0x07, 0x00,
+ 0x46, 0x0A, 0x00, 0x82, 0x0C, 0x00, 0x43, 0x0D, 0x00, 0x83, 0x0E, 0x00, 0xC4, 0x0F, 0x00, 0x46,
+ 0x11, 0x00, 0x83, 0x13, 0x00, 0xC5, 0x14, 0x00, 0x82, 0x16, 0x00, 0x44, 0x17, 0x00, 0xC5, 0x18,
+ 0x00, 0x84, 0x1A, 0x00, 0x05, 0x1C, 0x00, 0xC5, 0x1D, 0x00, 0x85, 0x1F, 0x00, 0x45, 0x21, 0x00,
+ 0x05, 0x23, 0x00, 0xC5, 0x24, 0x00, 0x85, 0x26, 0x00, 0x45, 0x28, 0x00, 0x02, 0x2A, 0x00, 0xC3,
+ 0x2A, 0x00, 0x05, 0x2C, 0x00, 0xC5, 0x2D, 0x00, 0x85, 0x2F, 0x00, 0x45, 0x31, 0x00, 0x08, 0x33,
+ 0x00, 0xC5, 0x35, 0x00, 0x85, 0x37, 0x00, 0x45, 0x39, 0x00, 0x05, 0x3B, 0x00, 0xC4, 0x3C, 0x00,
+ 0x44, 0x3E, 0x00, 0xC5, 0x3F, 0x00, 0x85, 0x41, 0x00, 0x44, 0x43, 0x00, 0xC5, 0x44, 0x00, 0x85,
+ 0x46, 0x00, 0x44, 0x48, 0x00, 0xC6, 0x49, 0x00, 0x06, 0x4C, 0x00, 0x45, 0x4E, 0x00, 0x05, 0x50,
+ 0x00, 0xC5, 0x51, 0x00, 0x85, 0x53, 0x00, 0x45, 0x55, 0x00, 0x06, 0x57, 0x00, 0x45, 0x59, 0x00,
+ 0x06, 0x5B, 0x00, 0x46, 0x5D, 0x00, 0x86, 0x5F, 0x00, 0xC6, 0x61, 0x00, 0x06, 0x64, 0x00, 0x44,
+ 0x66, 0x00, 0xC4, 0x67, 0x00, 0x44, 0x69, 0x00, 0xC6, 0x6A, 0x00, 0x05, 0x6D, 0x00, 0xC3, 0x6E,
+ 0x00, 0x05, 0x70, 0x00, 0xC5, 0x71, 0x00, 0x84, 0x73, 0x00, 0x05, 0x75, 0x00, 0xC5, 0x76, 0x00,
+ 0x84, 0x78, 0x00, 0x05, 0x7A, 0x00, 0xC5, 0x7B, 0x00, 0x82, 0x7D, 0x00, 0x43, 0x7E, 0x00, 0x85,
+ 0x7F, 0x00, 0x42, 0x81, 0x00, 0x06, 0x82, 0x00, 0x45, 0x84, 0x00, 0x05, 0x86, 0x00, 0xC5, 0x87,
+ 0x00, 0x85, 0x89, 0x00, 0x44, 0x8B, 0x00, 0xC5, 0x8C, 0x00, 0x83, 0x8E, 0x00, 0xC5, 0x8F, 0x00,
+ 0x86, 0x91, 0x00, 0xC6, 0x93, 0x00, 0x06, 0x96, 0x00, 0x45, 0x98, 0x00, 0x04, 0x9A, 0x00, 0x85,
+ 0x9B, 0x00, 0x42, 0x9D, 0x00, 0x05, 0x9E, 0x00, 0xC5, 0x9F, 0x00, 0x04, 0xFB, 0x86, 0x02, 0x00,
+ 0x00, 0x00, 0x00, 0x54, 0x45, 0x00, 0x50, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xFD, 0xD2,
+ 0xAF, 0x28, 0x00, 0x00, 0x00, 0x84, 0x53, 0x15, 0x0E, 0x55, 0x39, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x12, 0x15, 0x0A, 0x28, 0x54, 0x24, 0x00, 0x00, 0x00, 0x80, 0x50, 0x14, 0x52, 0x95, 0x58, 0x00,
+ 0x00, 0x00, 0x14, 0x00, 0x00, 0x4A, 0x92, 0x24, 0x02, 0x00, 0x91, 0x24, 0x49, 0x01, 0x00, 0x20,
+ 0x27, 0x05, 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0x1F, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x0A, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x24, 0x22,
+ 0x11, 0x00, 0x00, 0xC0, 0xA4, 0x94, 0x52, 0x32, 0x00, 0x00, 0x20, 0x23, 0x22, 0x72, 0x00, 0x00,
+ 0xC0, 0x24, 0x44, 0x44, 0x78, 0x00, 0x00, 0xC0, 0x24, 0x44, 0x50, 0x32, 0x00, 0x00, 0x80, 0x29,
+ 0x95, 0x1E, 0x42, 0x00, 0x00, 0xE0, 0x85, 0x83, 0x50, 0x32, 0x00, 0x00, 0xC0, 0xA4, 0x70, 0x52,
+ 0x32, 0x00, 0x00, 0xE0, 0x21, 0x42, 0x84, 0x10, 0x00, 0x00, 0xC0, 0xA4, 0x64, 0x52, 0x32, 0x00,
+ 0x00, 0xC0, 0xA4, 0xE4, 0x50, 0x32, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x30, 0x60, 0x0A, 0x00,
+ 0x00, 0x11, 0x11, 0x04, 0x41, 0x00, 0x00, 0x00, 0x80, 0x07, 0x1E, 0x00, 0x00, 0x00, 0x20, 0x08,
+ 0x82, 0x88, 0x08, 0x00, 0x00, 0xC0, 0x24, 0x64, 0x04, 0x10, 0x00, 0x00, 0x00, 0x1C, 0x22, 0x59,
+ 0x55, 0x2D, 0x02, 0x1C, 0x00, 0x00, 0x00, 0xC0, 0xA4, 0xF4, 0x52, 0x4A, 0x00, 0x00, 0xE0, 0xA4,
+ 0x74, 0x52, 0x3A, 0x00, 0x00, 0xC0, 0xA4, 0x10, 0x42, 0x32, 0x00, 0x00, 0xE0, 0xA4, 0x94, 0x52,
+ 0x3A, 0x00, 0x00, 0x70, 0x11, 0x17, 0x71, 0x00, 0x00, 0x70, 0x11, 0x17, 0x11, 0x00, 0x00, 0xC0,
+ 0xA4, 0xD0, 0x52, 0x32, 0x00, 0x00, 0x20, 0xA5, 0xF4, 0x52, 0x4A, 0x00, 0x00, 0x70, 0x22, 0x22,
+ 0x72, 0x00, 0x00, 0xC0, 0x21, 0x84, 0x50, 0x32, 0x00, 0x00, 0x20, 0xA5, 0x32, 0x4A, 0x4A, 0x00,
+ 0x00, 0x10, 0x11, 0x11, 0x71, 0x00, 0x00, 0x40, 0xB4, 0x55, 0x51, 0x14, 0x45, 0x00, 0x00, 0x00,
+ 0x40, 0x34, 0x55, 0x59, 0x14, 0x45, 0x00, 0x00, 0x00, 0xC0, 0xA4, 0x94, 0x52, 0x32, 0x00, 0x00,
+ 0xE0, 0xA4, 0x74, 0x42, 0x08, 0x00, 0x00, 0xC0, 0xA4, 0x94, 0x52, 0x51, 0x00, 0x00, 0xE0, 0xA4,
+ 0x74, 0x52, 0x4A, 0x00, 0x00, 0xC0, 0xA4, 0x60, 0x50, 0x32, 0x00, 0x00, 0xC0, 0x47, 0x10, 0x04,
+ 0x41, 0x10, 0x00, 0x00, 0x00, 0x20, 0xA5, 0x94, 0x52, 0x32, 0x00, 0x00, 0x40, 0x14, 0x45, 0x51,
+ 0xA4, 0x10, 0x00, 0x00, 0x00, 0x40, 0x14, 0x45, 0x51, 0xB5, 0x45, 0x00, 0x00, 0x00, 0x40, 0x14,
+ 0x29, 0x84, 0x12, 0x45, 0x00, 0x00, 0x00, 0x40, 0x14, 0x45, 0x0E, 0x41, 0x10, 0x00, 0x00, 0x00,
+ 0xC0, 0x07, 0x21, 0x84, 0x10, 0x7C, 0x00, 0x00, 0x00, 0x17, 0x11, 0x11, 0x11, 0x07, 0x00, 0x10,
+ 0x21, 0x22, 0x44, 0x00, 0x00, 0x47, 0x44, 0x44, 0x44, 0x07, 0x00, 0x84, 0x12, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x93, 0x5C, 0x72, 0x00, 0x00, 0x20, 0x84, 0x93, 0x52, 0x3A, 0x00, 0x00, 0x00, 0x60,
+ 0x11, 0x61, 0x00, 0x00, 0x00, 0x21, 0x97, 0x52, 0x72, 0x00, 0x00, 0x00, 0x00, 0x93, 0x5E, 0x70,
+ 0x00, 0x00, 0x60, 0x11, 0x13, 0x11, 0x00, 0x00, 0x00, 0x00, 0x97, 0x52, 0x72, 0x28, 0x19, 0x20,
+ 0x84, 0x93, 0x52, 0x4A, 0x00, 0x00, 0x10, 0x55, 0x00, 0x80, 0x20, 0x49, 0x0A, 0x00, 0x20, 0x84,
+ 0x94, 0x4E, 0x4A, 0x00, 0x00, 0x54, 0x55, 0x00, 0x00, 0x00, 0x2C, 0x55, 0x55, 0x55, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x93, 0x52, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x93, 0x52, 0x32, 0x00, 0x00, 0x00,
+ 0x80, 0x93, 0x52, 0x3A, 0x21, 0x00, 0x00, 0x00, 0x97, 0x52, 0x72, 0x08, 0x01, 0x00, 0x50, 0x13,
+ 0x11, 0x00, 0x00, 0x00, 0x00, 0x17, 0x0C, 0x3A, 0x00, 0x00, 0x48, 0x96, 0x44, 0x00, 0x00, 0x00,
+ 0x80, 0x94, 0x52, 0x72, 0x00, 0x00, 0x00, 0x00, 0x44, 0x51, 0xA4, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x44, 0x51, 0x54, 0x6D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x0A, 0xA1, 0x44, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x94, 0x52, 0x72, 0x28, 0x19, 0x00, 0x70, 0x24, 0x71, 0x00, 0x00, 0x4C, 0x08,
+ 0x11, 0x84, 0x10, 0x0C, 0x00, 0x55, 0x55, 0x01, 0x83, 0x10, 0x82, 0x08, 0x21, 0x03, 0x00, 0x00,
+ 0x00, 0xB0, 0x1A, 0x00, 0x00, 0x00,
+};
+// clang-format on
diff --git a/keyboards/boardsource/equals/info.json b/keyboards/boardsource/equals/info.json
new file mode 100644
index 00000000000..bed8ec2640c
--- /dev/null
+++ b/keyboards/boardsource/equals/info.json
@@ -0,0 +1,21 @@
+{
+ "manufacturer": "Boardsource",
+ "maintainer": "Boardsource",
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgb_matrix": true
+ },
+ "url": "",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x7688",
+ "vid": "0x4273"
+ }
+
+}
diff --git a/keyboards/boardsource/equals/readme.md b/keyboards/boardsource/equals/readme.md
new file mode 100644
index 00000000000..9c5d48f5c29
--- /dev/null
+++ b/keyboards/boardsource/equals/readme.md
@@ -0,0 +1,33 @@
+# equals
+
+
+
+* Keyboard Maintainer: [Cole Smith](https://github.com/boardsource)
+* Hardware Supported: Equals PCB w/ RP2040
+* Hardware Availability: [boardsource](https://boardsource.xyz)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make boardsource/equals/48:default
+ make boardsource/equals/60:default
+ make boardsource/equals/avr:default
+
+Flashing example for this keyboard:
+
+ make boardsource/equals/48:default:flash
+ make boardsource/equals/60:default:flash
+ make boardsource/equals/avr:default:flash
+
+Compile `avr` firmware if your PCB uses a drop-in microcontroller like Pro Micro.
+
+
+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
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
diff --git a/keyboards/boardsource/equals/ui.c b/keyboards/boardsource/equals/ui.c
new file mode 100644
index 00000000000..f953fc4c889
--- /dev/null
+++ b/keyboards/boardsource/equals/ui.c
@@ -0,0 +1,40 @@
+// Copyright 2023 Cole Smith (@boardsource)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include
+#include "qp.h"
+#include "qp_st7735.h"
+#include "graphics/thintel15.qff.c"
+
+static painter_device_t oled;
+static painter_font_handle_t font;
+
+__attribute__((weak)) void ui_init(void) {
+ oled = qp_st7735_make_spi_device(128, 160, OLED_CS_PIN, OLED_DC_PIN, OLED_RST_PIN, 8, 0);
+ font = qp_load_font_mem(font_thintel15);
+ qp_init(oled, QP_ROTATION_0);
+ qp_rect(oled, 0, 0, 130, 162, 0, 0, 0, true);
+ qp_rect(oled, 20, 20, 108, 60, 55, 55, 55, true);
+ qp_rect(oled, 20, 80, 108, 120, 55, 55, 55, true);
+ qp_flush(oled);
+}
+
+__attribute__((weak)) void ui_task(void) {
+ static const char *text = "Layer:";
+ int16_t width = qp_textwidth(font, text);
+ qp_drawtext(oled, 20, 140, font, text);
+
+ switch (get_highest_layer(layer_state)) {
+ case 0:
+ qp_drawtext(oled, (20 + width), 140, font, "QWERTY");
+ break;
+ case 1:
+ qp_drawtext(oled, (20 + width), 140, font, "SYMBOL");
+ break;
+ case 2:
+ qp_drawtext(oled, (20 + width), 140, font, "NUMBER");
+ break;
+ default:
+ qp_drawtext(oled, (20 + width), 140, font, "_PANIC_");
+ break;
+ }
+}
diff --git a/keyboards/boardsource/unicorne/unicorne.c b/keyboards/boardsource/unicorne/unicorne.c
index 0c443722e02..22cd1e4a37d 100644
--- a/keyboards/boardsource/unicorne/unicorne.c
+++ b/keyboards/boardsource/unicorne/unicorne.c
@@ -20,13 +20,13 @@ bool oled_task_kb(void) {
oled_write_raw(layer_zero, sizeof(layer_zero));
break;
case 1:
- oled_write_raw(layer_zero, sizeof(layer_zero));
+ oled_write_raw(layer_one, sizeof(layer_one));
break;
case 2:
- oled_write_raw(layer_zero, sizeof(layer_zero));
+ oled_write_raw(layer_two, sizeof(layer_two));
break;
case 3:
- oled_write_raw(layer_zero, sizeof(layer_zero));
+ oled_write_raw(layer_three, sizeof(layer_three));
break;
}
} else {
diff --git a/keyboards/cannonkeys/is0gr/info.json b/keyboards/cannonkeys/is0gr/info.json
index 3fd95577d89..49aaaddd525 100644
--- a/keyboards/cannonkeys/is0gr/info.json
+++ b/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 @@
]
}
}
-}
\ No newline at end of file
+}
diff --git a/keyboards/converter/usb_usb/hasu/rules.mk b/keyboards/converter/usb_usb/hasu/rules.mk
index c2ee0bc86f9..6e7633bfe01 100644
--- a/keyboards/converter/usb_usb/hasu/rules.mk
+++ b/keyboards/converter/usb_usb/hasu/rules.mk
@@ -1,2 +1 @@
-# Processor frequency
-F_CPU = 16000000
+# This file intentionally left blank
diff --git a/keyboards/converter/usb_usb/leonardo/info.json b/keyboards/converter/usb_usb/leonardo/info.json
new file mode 100644
index 00000000000..56062f7ad37
--- /dev/null
+++ b/keyboards/converter/usb_usb/leonardo/info.json
@@ -0,0 +1,3 @@
+{
+ "bootloader": "caterina"
+}
diff --git a/keyboards/converter/usb_usb/leonardo/rules.mk b/keyboards/converter/usb_usb/leonardo/rules.mk
new file mode 100644
index 00000000000..6e7633bfe01
--- /dev/null
+++ b/keyboards/converter/usb_usb/leonardo/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
diff --git a/keyboards/converter/usb_usb/readme.md b/keyboards/converter/usb_usb/readme.md
index 594a9be877e..50743b11fcc 100644
--- a/keyboards/converter/usb_usb/readme.md
+++ b/keyboards/converter/usb_usb/readme.md
@@ -11,6 +11,10 @@ Make example for this keyboard (after setting up your build environment):
make converter/usb_usb:default
+If you use Arduino Leonardo with a USB Host Shield:
+
+ make converter/usb_usb/leonardo:default
+
See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information.
Note that you have to choose the right hardware variant as your subproject, otherwise you will probably have issues.
@@ -23,8 +27,6 @@ If you are sure you have this correct, try changeing the default in `usb_usb/rul
The Pro Micro variant uses a 3.3V Pro Micro and thus runs at 8MHz, hence the following line in `usb_usb/pro_micro/rules.mk`:
`F_CPU = 8000000`
-The converter sold by Hasu runs at 16MHz and so the corresponding line in `usb_usb/hasu/rules.mk` is:
-`F_CPU = 16000000`
Getting the Hardware
--------------------
diff --git a/keyboards/crkbd/crkbd.c b/keyboards/crkbd/crkbd.c
index 3c1cd5565be..2ac0e63125f 100644
--- a/keyboards/crkbd/crkbd.c
+++ b/keyboards/crkbd/crkbd.c
@@ -71,6 +71,10 @@ uint8_t last_col;
static const char PROGMEM code_to_name[60] = {' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'R', 'E', 'B', 'T', '_', '-', '=', '[', ']', '\\', '#', ';', '\'', '`', ',', '.', '/', ' ', ' ', ' '};
static void set_keylog(uint16_t keycode, keyrecord_t *record) {
+ // save the row and column (useful even if we can't find a keycode to show)
+ last_row = record->event.key.row;
+ last_col = record->event.key.col;
+
key_name = ' ';
last_keycode = keycode;
if (IS_QK_MOD_TAP(keycode)) {
@@ -92,8 +96,6 @@ static void set_keylog(uint16_t keycode, keyrecord_t *record) {
// update keylog
key_name = pgm_read_byte(&code_to_name[keycode]);
- last_row = record->event.key.row;
- last_col = record->event.key.col;
}
static const char *depad_str(const char *depad_str, char depad_char) {
@@ -103,11 +105,9 @@ static const char *depad_str(const char *depad_str, char depad_char) {
}
static void oled_render_keylog(void) {
- const char *last_row_str = get_u8_str(last_row, ' ');
- oled_write(depad_str(last_row_str, ' '), false);
+ oled_write_char('0' + last_row, false);
oled_write_P(PSTR("x"), false);
- const char *last_col_str = get_u8_str(last_col, ' ');
- oled_write(depad_str(last_col_str, ' '), false);
+ oled_write_char('0' + last_col, false);
oled_write_P(PSTR(", k"), false);
const char *last_keycode_str = get_u16_str(last_keycode, ' ');
oled_write(depad_str(last_keycode_str, ' '), false);
diff --git a/keyboards/darkproject/kd87a_bfg_edition/config.h b/keyboards/darkproject/kd87a_bfg_edition/config.h
new file mode 100644
index 00000000000..335648df9ab
--- /dev/null
+++ b/keyboards/darkproject/kd87a_bfg_edition/config.h
@@ -0,0 +1,44 @@
+/* Copyright 2022 GSKY
+ *
+ * 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 .
+ */
+
+#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)
diff --git a/keyboards/darkproject/kd87a_bfg_edition/halconf.h b/keyboards/darkproject/kd87a_bfg_edition/halconf.h
new file mode 100644
index 00000000000..8f61d3fc64f
--- /dev/null
+++ b/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 .
+ */
+
+#pragma once
+
+#define HAL_USE_SPI TRUE
+#define SPI_USE_WAIT TRUE
+#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD
+
+#include_next
diff --git a/keyboards/darkproject/kd87a_bfg_edition/info.json b/keyboards/darkproject/kd87a_bfg_edition/info.json
new file mode 100644
index 00000000000..1cf428a97f1
--- /dev/null
+++ b/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 }
+ ]
+ }
+ }
+}
diff --git a/keyboards/darkproject/kd87a_bfg_edition/kd87a_bfg_edition.c b/keyboards/darkproject/kd87a_bfg_edition/kd87a_bfg_edition.c
new file mode 100644
index 00000000000..0ce0799e14c
--- /dev/null
+++ b/keyboards/darkproject/kd87a_bfg_edition/kd87a_bfg_edition.c
@@ -0,0 +1,174 @@
+/* Copyright 2022 GSKY
+ *
+ * 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 .
+ */
+
+#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 */
+ }
+};
diff --git a/keyboards/darkproject/kd87a_bfg_edition/kd87a_bfg_edition.h b/keyboards/darkproject/kd87a_bfg_edition/kd87a_bfg_edition.h
new file mode 100644
index 00000000000..e2c656eb0eb
--- /dev/null
+++ b/keyboards/darkproject/kd87a_bfg_edition/kd87a_bfg_edition.h
@@ -0,0 +1,22 @@
+/* Copyright 2022 GSKY
+ *
+ * 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 .
+ */
+#pragma once
+
+#include "quantum.h"
+
+enum keyboard_keycodes {
+ KC_SIRI = QK_KB_0
+};
diff --git a/keyboards/darkproject/kd87a_bfg_edition/keymaps/default/keymap.c b/keyboards/darkproject/kd87a_bfg_edition/keymaps/default/keymap.c
new file mode 100644
index 00000000000..4abb1bdc915
--- /dev/null
+++ b/keyboards/darkproject/kd87a_bfg_edition/keymaps/default/keymap.c
@@ -0,0 +1,69 @@
+/* Copyright 2022 GSKY
+ *
+ * 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 .
+ */
+
+#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;
+};
\ No newline at end of file
diff --git a/keyboards/darkproject/kd87a_bfg_edition/keymaps/via/keymap.c b/keyboards/darkproject/kd87a_bfg_edition/keymaps/via/keymap.c
new file mode 100644
index 00000000000..71fbfa4ff20
--- /dev/null
+++ b/keyboards/darkproject/kd87a_bfg_edition/keymaps/via/keymap.c
@@ -0,0 +1,69 @@
+/* Copyright 2022 GSKY
+ *
+ * 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 .
+ */
+
+#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;
+};
diff --git a/keyboards/darkproject/kd87a_bfg_edition/keymaps/via/rules.mk b/keyboards/darkproject/kd87a_bfg_edition/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/darkproject/kd87a_bfg_edition/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/darkproject/kd87a_bfg_edition/mcuconf.h b/keyboards/darkproject/kd87a_bfg_edition/mcuconf.h
new file mode 100644
index 00000000000..440f78d2bc2
--- /dev/null
+++ b/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 .
+ */
+
+#pragma once
+
+#include_next
+
+#undef WB32_SPI_USE_QSPI
+#define WB32_SPI_USE_QSPI TRUE
+
+#undef WB32_SPI_USE_SPIM2
+#define WB32_SPI_USE_SPIM2 TRUE
diff --git a/keyboards/darkproject/kd87a_bfg_edition/readme.md b/keyboards/darkproject/kd87a_bfg_edition/readme.md
new file mode 100644
index 00000000000..83cc8a923db
--- /dev/null
+++ b/keyboards/darkproject/kd87a_bfg_edition/readme.md
@@ -0,0 +1,24 @@
+# KD87A_BFG_Edition
+
+
+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).
diff --git a/keyboards/darkproject/kd87a_bfg_edition/rules.mk b/keyboards/darkproject/kd87a_bfg_edition/rules.mk
new file mode 100644
index 00000000000..002458405ee
--- /dev/null
+++ b/keyboards/darkproject/kd87a_bfg_edition/rules.mk
@@ -0,0 +1 @@
+WEAR_LEVELING_DRIVER = spi_flash
diff --git a/keyboards/dcpedit/redherring/config.h b/keyboards/dcpedit/redherring/config.h
new file mode 100755
index 00000000000..115be3306e5
--- /dev/null
+++ b/keyboards/dcpedit/redherring/config.h
@@ -0,0 +1,10 @@
+// Copyright 2023 Ming-Gih Lam (@dcpedit)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define LOCKING_SUPPORT_ENABLE
+#define LOCKING_RESYNC_ENABLE
+#define SOLENOID_PIN B5
+#define OLED_IC OLED_IC_SH1107
+#define OLED_DISPLAY_64X128
\ No newline at end of file
diff --git a/keyboards/dcpedit/redherring/info.json b/keyboards/dcpedit/redherring/info.json
new file mode 100644
index 00000000000..2a91291fcb1
--- /dev/null
+++ b/keyboards/dcpedit/redherring/info.json
@@ -0,0 +1,139 @@
+{
+ "manufacturer": "dcpedit",
+ "keyboard_name": "Red Herring",
+ "maintainer": "dcpedit",
+ "bootloader": "usbasploader",
+ "bootmagic": {
+ "matrix": [5, 14]
+ },
+ "diode_direction": "COL2ROW",
+ "encoder": {
+ "rotary": [
+ {"pin_a": "C2", "pin_b": "D7"}
+ ]
+ },
+ "indicators": {
+ "caps_lock": "A0"
+ },
+ "features": {
+ "bootmagic": true,
+ "extrakey": true,
+ "mousekey": true,
+ "encoder": true,
+ "oled": true,
+ "haptic": true
+ },
+ "matrix_pins": {
+ "cols": ["A1", "A2", "A3", "B0", "B1", "B2", "B3", "B4", "D0", "D1", "D5", "D6", "C5", "C4", "C3"],
+ "rows": ["C6", "A6", "A7", "A4", "C7", "A5"]
+ },
+ "processor": "atmega32a",
+ "qmk": {
+ "tap_keycode_delay": 10
+ },
+ "url": "https://github.com/dcpedit/redherring",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x12ED",
+ "vid": "0xDC9E"
+ },
+ "dynamic_keymap": {
+ "layer_count": 2
+ },
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label": "5,14", "matrix": [5, 14], "x": 0.75, "y": 0.25},
+ {"label": "0,0", "matrix": [0, 0], "x": 2.25, "y": 0.25},
+ {"label": "0,1", "matrix": [0, 1], "x": 3.25, "y": 0.25},
+ {"label": "0,2", "matrix": [0, 2], "x": 4.75, "y": 0.25},
+ {"label": "0,3", "matrix": [0, 3], "x": 5.75, "y": 0.13},
+ {"label": "0,4", "matrix": [0, 4], "x": 6.75, "y": 0.25},
+ {"label": "0,5", "matrix": [0, 5], "x": 7.75, "y": 0.38},
+ {"label": "0,6", "matrix": [0, 6], "x": 11.5, "y": 0.38},
+ {"label": "0,7", "matrix": [0, 7], "x": 12.5, "y": 0.25},
+ {"label": "0,8", "matrix": [0, 8], "x": 13.5, "y": 0.13},
+ {"label": "0,9", "matrix": [0, 9], "x": 14.5, "y": 0.25},
+ {"label": "0,10", "matrix": [0, 10], "x": 16, "y": 0.25},
+ {"label": "0,11", "matrix": [0, 11], "x": 17, "y": 0.25},
+ {"label": "0,12", "matrix": [0, 12], "x": 18.13, "y": 0.25},
+ {"label": "0,13", "matrix": [0, 13], "x": 19.13, "y": 0.25},
+ {"label": "0,14", "matrix": [0, 14], "x": 21, "y": 0.25},
+ {"label": "1,0", "matrix": [1, 0], "x": 2, "y": 1.5},
+ {"label": "1,1", "matrix": [1, 1], "x": 3, "y": 1.5},
+ {"label": "1,2", "matrix": [1, 2], "x": 4.75, "y": 1.5},
+ {"label": "1,3", "matrix": [1, 3], "x": 5.75, "y": 1.38},
+ {"label": "1,4", "matrix": [1, 4], "x": 6.75, "y": 1.5},
+ {"label": "1,5", "matrix": [1, 5], "x": 7.75, "y": 1.63},
+ {"label": "1,6", "matrix": [1, 6], "x": 11.5, "y": 1.63},
+ {"label": "1,7", "matrix": [1, 7], "x": 12.5, "y": 1.5},
+ {"label": "1,8", "matrix": [1, 8], "x": 13.5, "y": 1.38},
+ {"label": "1,9", "matrix": [1, 9], "x": 14.5, "y": 1.5},
+ {"label": "1,10", "matrix": [1, 10], "x": 16.25, "y": 1.5},
+ {"label": "1,11", "matrix": [1, 11], "x": 17.25, "y": 1.5},
+ {"label": "1,12", "matrix": [1, 12], "x": 18.25, "y": 1.5},
+ {"label": "1,13", "matrix": [1, 13], "x": 19.25, "y": 1.5},
+ {"label": "1,14", "matrix": [1, 14], "x": 20.25, "y": 1.5},
+ {"label": "2,14", "matrix": [2, 14], "x": 21.75, "y": 1.5},
+ {"label": "2,0", "matrix": [2, 0], "x": 1.25, "y": 2.5, "w": 1.5},
+ {"label": "2,1", "matrix": [2, 1], "x": 2.75, "y": 2.5},
+ {"label": "2,2", "matrix": [2, 2], "x": 4.75, "y": 2.5},
+ {"label": "2,3", "matrix": [2, 3], "x": 5.75, "y": 2.38},
+ {"label": "2,4", "matrix": [2, 4], "x": 6.75, "y": 2.5},
+ {"label": "2,5", "matrix": [2, 5], "x": 7.75, "y": 2.63},
+ {"label": "2,6", "matrix": [2, 6], "x": 11.5, "y": 2.63},
+ {"label": "2,7", "matrix": [2, 7], "x": 12.5, "y": 2.5},
+ {"label": "2,8", "matrix": [2, 8], "x": 13.5, "y": 2.38},
+ {"label": "2,9", "matrix": [2, 9], "x": 14.5, "y": 2.5},
+ {"label": "2,10", "matrix": [2, 10], "x": 16.5, "y": 2.5},
+ {"label": "2,11", "matrix": [2, 11], "x": 17.5, "y": 2.5},
+ {"label": "2,12", "matrix": [2, 12], "x": 18.5, "y": 2.5},
+ {"label": "2,13", "matrix": [2, 13], "x": 19.5, "y": 2.5, "w": 1.5},
+ {"label": "3,13", "matrix": [3, 13], "x": 21.5, "y": 2.5},
+ {"label": "3,0", "matrix": [3, 0], "x": 0.75, "y": 3.5, "w": 1.75},
+ {"label": "3,1", "matrix": [3, 1], "x": 2.5, "y": 3.5},
+ {"label": "3,2", "matrix": [3, 2], "x": 4.75, "y": 3.5},
+ {"label": "3,3", "matrix": [3, 3], "x": 5.75, "y": 3.38},
+ {"label": "3,4", "matrix": [3, 4], "x": 6.75, "y": 3.5},
+ {"label": "3,5", "matrix": [3, 5], "x": 7.75, "y": 3.63},
+ {"label": "3,6", "matrix": [3, 6], "x": 11.5, "y": 3.63},
+ {"label": "3,7", "matrix": [3, 7], "x": 12.5, "y": 3.5},
+ {"label": "3,8", "matrix": [3, 8], "x": 13.5, "y": 3.38},
+ {"label": "3,9", "matrix": [3, 9], "x": 14.5, "y": 3.5},
+ {"label": "3,10", "matrix": [3, 10], "x": 16.75, "y": 3.5},
+ {"label": "3,11", "matrix": [3, 11], "x": 17.75, "y": 3.5},
+ {"label": "3,12", "matrix": [3, 12], "x": 18.75, "y": 3.5, "w": 2.25},
+ {"label": "3,14", "matrix": [3, 14], "x": 21.25, "y": 3.5},
+ {"label": "4,14", "matrix": [4, 14], "x": 0, "y": 4.5, "w": 1.25},
+ {"label": "4,0", "matrix": [4, 0], "x": 1.25, "y": 4.5},
+ {"label": "4,1", "matrix": [4, 1], "x": 2.25, "y": 4.5},
+ {"label": "4,2", "matrix": [4, 2], "x": 4.75, "y": 4.5},
+ {"label": "4,3", "matrix": [4, 3], "x": 5.75, "y": 4.38},
+ {"label": "4,4", "matrix": [4, 4], "x": 6.75, "y": 4.5},
+ {"label": "4,5", "matrix": [4, 5], "x": 7.75, "y": 4.63},
+ {"label": "5,5", "matrix": [5, 5], "x": 8.75, "y": 4.63},
+ {"label": "5,6", "matrix": [5, 6], "x": 10.5, "y": 4.63},
+ {"label": "4,6", "matrix": [4, 6], "x": 11.5, "y": 4.63},
+ {"label": "4,7", "matrix": [4, 7], "x": 12.5, "y": 4.5},
+ {"label": "4,8", "matrix": [4, 8], "x": 13.5, "y": 4.38},
+ {"label": "4,9", "matrix": [4, 9], "x": 14.5, "y": 4.5},
+ {"label": "4,10", "matrix": [4, 10], "x": 17, "y": 4.5},
+ {"label": "4,11", "matrix": [4, 11], "x": 18, "y": 4.5},
+ {"label": "4,12", "matrix": [4, 12], "x": 19, "y": 4.5, "w": 1.25},
+ {"label": "4,13", "matrix": [4, 13], "x": 20.5, "y": 4.75},
+ {"label": "5,0", "matrix": [5, 0], "x": 0.5, "y": 5.5, "w": 1.25},
+ {"label": "5,1", "matrix": [5, 1], "x": 1.75, "y": 5.5, "w": 1.25},
+ {"label": "5,2", "matrix": [5, 2], "x": 5.25, "y": 5.5, "w": 1.25},
+ {"label": "5,3", "matrix": [5, 3], "x": 6.5, "y": 5.5, "w": 1.25},
+ {"label": "5,4", "matrix": [5, 4], "x": 7.75, "y": 5.63, "w": 2},
+ {"label": "5,7", "matrix": [5, 7], "x": 10.5, "y": 5.63, "w": 2.75},
+ {"label": "5,8", "matrix": [5, 8], "x": 13.25, "y": 5.5, "w": 1.25},
+ {"label": "5,9", "matrix": [5, 9], "x": 16.75, "y": 5.5, "w": 1.25},
+ {"label": "5,10", "matrix": [5, 10], "x": 18, "y": 5.5, "w": 1.25},
+ {"label": "5,11", "matrix": [5, 11], "x": 19.5, "y": 5.75},
+ {"label": "5,12", "matrix": [5, 12], "x": 20.5, "y": 5.75},
+ {"label": "5,13", "matrix": [5, 13], "x": 21.5, "y": 5.75}
+ ]
+ }
+ }
+}
diff --git a/keyboards/dcpedit/redherring/keymaps/default/keymap.c b/keyboards/dcpedit/redherring/keymaps/default/keymap.c
new file mode 100644
index 00000000000..36711740506
--- /dev/null
+++ b/keyboards/dcpedit/redherring/keymaps/default/keymap.c
@@ -0,0 +1,29 @@
+// Copyright 2023 Ming-Gih Lam (@dcpedit)
+// 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_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_MUTE,
+ 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_BSLS, 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_PGUP,
+ 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_PGDN,
+ KC_LSFT, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, MO(1), MO(1), KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_MENU, KC_SPC, KC_SPC, KC_ALGR, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT ),
+
+ [1] = LAYOUT(
+ QK_RBT, QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, HF_TOGG,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ 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_PGUP, KC_PGDN) },
+};
+#endif
\ No newline at end of file
diff --git a/keyboards/dcpedit/redherring/keymaps/default/rules.mk b/keyboards/dcpedit/redherring/keymaps/default/rules.mk
new file mode 100644
index 00000000000..a40474b4d5c
--- /dev/null
+++ b/keyboards/dcpedit/redherring/keymaps/default/rules.mk
@@ -0,0 +1 @@
+ENCODER_MAP_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/dcpedit/redherring/keymaps/via/keymap.c b/keyboards/dcpedit/redherring/keymaps/via/keymap.c
new file mode 100644
index 00000000000..de67f00042c
--- /dev/null
+++ b/keyboards/dcpedit/redherring/keymaps/via/keymap.c
@@ -0,0 +1,31 @@
+// Copyright 2023 Ming-Gih Lam (@dcpedit)
+// 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_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_MUTE,
+ 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_BSLS, 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_PGUP,
+ 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_PGDN,
+ KC_LSFT, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, MO(1), MO(1), KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_MENU, KC_SPC, KC_SPC, KC_ALGR, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT ),
+
+ [1] = LAYOUT(
+
+ QK_RBT, QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, HF_TOGG,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ 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_PGUP, KC_PGDN) },
+};
+#endif
\ No newline at end of file
diff --git a/keyboards/dcpedit/redherring/keymaps/via/rules.mk b/keyboards/dcpedit/redherring/keymaps/via/rules.mk
new file mode 100644
index 00000000000..4253f570f0b
--- /dev/null
+++ b/keyboards/dcpedit/redherring/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+ENCODER_MAP_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/dcpedit/redherring/readme.md b/keyboards/dcpedit/redherring/readme.md
new file mode 100644
index 00000000000..67f2bdf33db
--- /dev/null
+++ b/keyboards/dcpedit/redherring/readme.md
@@ -0,0 +1,27 @@
+# Red Herring
+
+
+
+Unibody ergonomic orthilinar keyboard with through-hole components. Supports standard keycaps, a 64x128 OLED, large rotary encoder knob, and a solenoid.
+
+* Keyboard Maintainer: [dcpedit](https://github.com/dcpedit)
+* Hardware Supported: ATMEGA32A
+* Hardware Availability: https://github.com/dcpedit/redherring
+
+Make example for this keyboard (after setting up your build environment):
+
+ make dcpedit/redherring:default
+
+Flashing example for this keyboard:
+
+ make dcpedit/redherring: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 ESC key (top-left key) and plug in the keyboard
+* **Physical reset button**: On the PCB, while holding down the BOOT button, press and release the RESET button
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
\ No newline at end of file
diff --git a/keyboards/dcpedit/redherring/redherring.c b/keyboards/dcpedit/redherring/redherring.c
new file mode 100644
index 00000000000..b2c25eb703c
--- /dev/null
+++ b/keyboards/dcpedit/redherring/redherring.c
@@ -0,0 +1,91 @@
+// Copyright 2023 Ming-Gih Lam (@dcpedit)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "quantum.h"
+
+#define LOGO_SIZE 1024
+
+#ifdef OLED_ENABLE
+
+static void render_logo(void) {
+ static const char PROGMEM oled_logo[LOGO_SIZE] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x30, 0x60, 0x80, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xc3, 0x06, 0x18, 0xe1, 0x03, 0x0c, 0xb0, 0x60,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x80, 0x78, 0x00, 0x00, 0x00, 0xe0, 0x1c,
+ 0x00, 0x00, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xe0, 0x00, 0x00, 0x04, 0x78, 0x80, 0x00,
+ 0x00, 0x38, 0xf8, 0xf8, 0xf0, 0xf0, 0xe0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0xff, 0x1f, 0x3f, 0xfe, 0x3e, 0x7f, 0xfe, 0x7c, 0x7f, 0x7c,
+ 0x3c, 0x20, 0x20, 0xe0, 0x7c, 0x43, 0x40, 0xc0, 0xf8, 0x87, 0x80, 0x80, 0xe0, 0x1e, 0x01, 0x00,
+ 0xc0, 0x7c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1e, 0xe0, 0x00, 0x00, 0x07, 0x78,
+ 0x80, 0x80, 0x83, 0xbf, 0xff, 0xff, 0xe3, 0xc1, 0xc1, 0xc1, 0xc1, 0xf7, 0xfe, 0xfe, 0xfc, 0x78,
+ 0x00, 0x00, 0x10, 0x90, 0x88, 0x4c, 0x64, 0x22, 0x12, 0x11, 0x08, 0x0c, 0x07, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x3c, 0x03, 0x00, 0x80, 0x78, 0x07, 0x00, 0x00, 0xe0, 0x1e, 0x01, 0x01, 0xc1, 0x3d,
+ 0x07, 0x02, 0x02, 0xf2, 0x0e, 0x02, 0x02, 0x06, 0x7e, 0xc2, 0x02, 0x03, 0x1f, 0xe1, 0x01, 0x01,
+ 0x07, 0x78, 0x80, 0x00, 0x03, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x3f, 0x0f, 0x03, 0x00, 0x00,
+ 0x02, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x20, 0x1e, 0x01, 0x00, 0xc0, 0x7c, 0x07, 0x00,
+ 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x7c, 0xc0, 0x00, 0x01, 0x1e, 0xe0,
+ 0x00, 0x00, 0x07, 0x38, 0x00, 0x00, 0x03, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80,
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x38, 0xfe, 0xc7, 0x83, 0xff, 0xff, 0x01, 0x81, 0x03, 0x0f, 0xfe, 0xf0, 0x00, 0xff, 0xff, 0x01,
+ 0x01, 0x61, 0xff, 0x9f, 0x01, 0xfe, 0xef, 0x83, 0xff, 0xff, 0x01, 0x01, 0x03, 0x07, 0xfe, 0xf8,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x19, 0xff, 0xff, 0x3b, 0x79, 0xf8, 0xcf, 0x07, 0x01, 0x00, 0xf1, 0xff, 0x0e,
+ 0x0e, 0x0e, 0x04, 0x00, 0x00, 0x00, 0x01, 0x01, 0xff, 0xff, 0x03, 0x01, 0x00, 0x80, 0xff, 0x7f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x30, 0xf0, 0xf0, 0x00, 0x00, 0x10, 0xf0, 0xf0, 0x00, 0xf0, 0xf0, 0x30, 0x30, 0x30, 0xb0, 0xf0,
+ 0x70, 0x90, 0xc0, 0xe2, 0xf3, 0xf3, 0x70, 0x30, 0x31, 0x63, 0xe3, 0xc2, 0x00, 0x83, 0xc3, 0xe3,
+ 0xf3, 0xf3, 0x73, 0x33, 0x33, 0x60, 0xe0, 0x82, 0x03, 0xf3, 0xf3, 0x13, 0x63, 0xf3, 0xb1, 0xf0,
+ 0xe0, 0x00, 0x00, 0x00, 0x10, 0xf0, 0xf0, 0x00, 0xc0, 0xe0, 0x70, 0x30, 0x30, 0x30, 0xe0, 0xc0,
+
+ 0x00, 0xff, 0xff, 0x30, 0x30, 0x30, 0xff, 0xff, 0x80, 0x1f, 0x7f, 0xe0, 0xc0, 0xc0, 0x9f, 0x1f,
+ 0x00, 0x07, 0x1f, 0x38, 0xff, 0xff, 0x60, 0x60, 0x10, 0x80, 0xff, 0xff, 0x00, 0x0f, 0x1f, 0x38,
+ 0xff, 0xff, 0x60, 0x60, 0x00, 0x80, 0xff, 0x7f, 0x00, 0xff, 0xff, 0x00, 0x00, 0x01, 0x03, 0xff,
+ 0xff, 0x1c, 0x78, 0xe0, 0xc0, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x04, 0xe6, 0xe7, 0x63,
+ 0x60, 0x7f, 0x7f, 0x00, 0x02, 0x46, 0x7f, 0x7f, 0x00, 0x7c, 0x7f, 0x63, 0x61, 0x61, 0x60, 0x60,
+ 0x60, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x47, 0x07, 0x0f, 0x3f, 0x79, 0x60, 0x40, 0x00, 0x00, 0x00,
+ 0x7f, 0x7f, 0x47, 0x07, 0x0f, 0x3f, 0x71, 0x40, 0x00, 0x7f, 0x7f, 0x40, 0x00, 0x00, 0x00, 0x7f,
+ 0x7f, 0x40, 0x00, 0x00, 0x47, 0x7f, 0x7f, 0x00, 0x1f, 0x3f, 0x70, 0x60, 0x60, 0x7f, 0x7f, 0x40,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+ oled_write_raw_P(oled_logo, LOGO_SIZE);
+}
+
+bool oled_task_kb(void) {
+ if (!oled_task_user()) {
+ return false;
+ }
+ render_logo();
+ return true;
+}
+#endif
\ No newline at end of file
diff --git a/keyboards/dcpedit/redherring/rules.mk b/keyboards/dcpedit/redherring/rules.mk
new file mode 100644
index 00000000000..35c76d4cf1c
--- /dev/null
+++ b/keyboards/dcpedit/redherring/rules.mk
@@ -0,0 +1,2 @@
+F_CPU = 16000000
+HAPTIC_DRIVER = solenoid
\ No newline at end of file
diff --git a/keyboards/dnworks/9973/config.h b/keyboards/dnworks/9973/config.h
new file mode 100644
index 00000000000..77970ce4d34
--- /dev/null
+++ b/keyboards/dnworks/9973/config.h
@@ -0,0 +1,20 @@
+/*
+Copyright 2023 zeix (@itsme-zeix)
+
+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 .
+*/
+
+#pragma once
+
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 500U
diff --git a/keyboards/dnworks/9973/info.json b/keyboards/dnworks/9973/info.json
new file mode 100644
index 00000000000..61696060262
--- /dev/null
+++ b/keyboards/dnworks/9973/info.json
@@ -0,0 +1,480 @@
+{
+ "keyboard_name": "DN 997.3",
+ "maintainer": "itsme-zeix",
+ "manufacturer": "dnworks",
+ "processor": "RP2040",
+ "bootloader": "rp2040",
+ "usb": {
+ "vid": "0x4C23",
+ "pid": "0x2936",
+ "device_version": "0.0.1"
+ },
+ "features": {
+ "bootmagic": true,
+ "mousekey": true,
+ "extrakey": true,
+ "nkro": true
+ },
+ "indicators": {
+ "caps_lock": "GP27",
+ "scroll_lock": "GP1",
+ "on_state": 1
+ },
+ "diode_direction": "COL2ROW",
+ "matrix_pins": {
+ "rows": ["GP2", "GP3", "GP4", "GP29", "GP12", "GP13"],
+ "cols": ["GP28", "GP26", "GP25", "GP24", "GP23", "GP22", "GP21", "GP20", "GP19", "GP18", "GP17", "GP16", "GP15", "GP14", "GP6", "GP5", "GP0"]
+ },
+ "community_layouts": ["tkl_ansi_tsangan", "tkl_iso_tsangan"],
+ "layouts": {
+ "LAYOUT_all": {
+ "layout": [
+ { "matrix": [0, 0], "x": 0, "y": 0 },
+ { "matrix": [0, 2], "x": 2, "y": 0 },
+ { "matrix": [0, 3], "x": 3, "y": 0 },
+ { "matrix": [0, 4], "x": 4, "y": 0 },
+ { "matrix": [0, 5], "x": 5, "y": 0 },
+ { "matrix": [0, 6], "x": 6.5, "y": 0 },
+ { "matrix": [0, 7], "x": 7.5, "y": 0 },
+ { "matrix": [0, 8], "x": 8.5, "y": 0 },
+ { "matrix": [0, 9], "x": 9.5, "y": 0 },
+ { "matrix": [0, 10], "x": 11, "y": 0 },
+ { "matrix": [0, 11], "x": 12, "y": 0 },
+ { "matrix": [0, 12], "x": 13, "y": 0 },
+ { "matrix": [0, 13], "x": 14, "y": 0 },
+ { "matrix": [0, 14], "x": 15.25, "y": 0 },
+ { "matrix": [0, 15], "x": 16.25, "y": 0 },
+ { "matrix": [0, 16], "x": 17.25, "y": 0 },
+ { "matrix": [1, 0], "x": 0, "y": 1.5 },
+ { "matrix": [1, 1], "x": 1, "y": 1.5 },
+ { "matrix": [1, 2], "x": 2, "y": 1.5 },
+ { "matrix": [1, 3], "x": 3, "y": 1.5 },
+ { "matrix": [1, 4], "x": 4, "y": 1.5 },
+ { "matrix": [1, 5], "x": 5, "y": 1.5 },
+ { "matrix": [1, 6], "x": 6, "y": 1.5 },
+ { "matrix": [1, 7], "x": 7, "y": 1.5 },
+ { "matrix": [1, 8], "x": 8, "y": 1.5 },
+ { "matrix": [1, 9], "x": 9, "y": 1.5 },
+ { "matrix": [1, 10], "x": 10, "y": 1.5 },
+ { "matrix": [1, 11], "x": 11, "y": 1.5 },
+ { "matrix": [1, 12], "x": 12, "y": 1.5 },
+ { "matrix": [1, 13], "w": 2, "x": 13, "y": 1.5 },
+ { "matrix": [1, 14], "x": 15.25, "y": 1.5 },
+ { "matrix": [1, 15], "x": 16.25, "y": 1.5 },
+ { "matrix": [1, 16], "x": 17.25, "y": 1.5 },
+ { "matrix": [2, 0], "w": 1.5, "x": 0, "y": 2.5 },
+ { "matrix": [2, 1], "x": 1.5, "y": 2.5 },
+ { "matrix": [2, 2], "x": 2.5, "y": 2.5 },
+ { "matrix": [2, 3], "x": 3.5, "y": 2.5 },
+ { "matrix": [2, 4], "x": 4.5, "y": 2.5 },
+ { "matrix": [2, 5], "x": 5.5, "y": 2.5 },
+ { "matrix": [2, 6], "x": 6.5, "y": 2.5 },
+ { "matrix": [2, 7], "x": 7.5, "y": 2.5 },
+ { "matrix": [2, 8], "x": 8.5, "y": 2.5 },
+ { "matrix": [2, 9], "x": 9.5, "y": 2.5 },
+ { "matrix": [2, 10], "x": 10.5, "y": 2.5 },
+ { "matrix": [2, 11], "x": 11.5, "y": 2.5 },
+ { "matrix": [2, 12], "x": 12.5, "y": 2.5 },
+ { "matrix": [2, 13], "w": 1.5, "x": 13.5, "y": 2.5 },
+ { "matrix": [2, 14], "x": 15.25, "y": 2.5 },
+ { "matrix": [2, 15], "x": 16.25, "y": 2.5 },
+ { "matrix": [2, 16], "x": 17.25, "y": 2.5 },
+ { "matrix": [3, 0], "w": 1.75, "x": 0, "y": 3.5 },
+ { "matrix": [3, 1], "x": 1.75, "y": 3.5 },
+ { "matrix": [3, 2], "x": 2.75, "y": 3.5 },
+ { "matrix": [3, 3], "x": 3.75, "y": 3.5 },
+ { "matrix": [3, 4], "x": 4.75, "y": 3.5 },
+ { "matrix": [3, 5], "x": 5.75, "y": 3.5 },
+ { "matrix": [3, 6], "x": 6.75, "y": 3.5 },
+ { "matrix": [3, 7], "x": 7.75, "y": 3.5 },
+ { "matrix": [3, 8], "x": 8.75, "y": 3.5 },
+ { "matrix": [3, 9], "x": 9.75, "y": 3.5 },
+ { "matrix": [3, 10], "x": 10.75, "y": 3.5 },
+ { "matrix": [3, 11], "x": 11.75, "y": 3.5 },
+ { "matrix": [3, 12], "w": 2.25, "x": 12.75, "y": 3.5 },
+ { "matrix": [4, 0], "w": 1.25, "x": 0, "y": 4.5 },
+ { "matrix": [4, 1], "x": 1.25, "y": 4.5 },
+ { "matrix": [4, 2], "x": 2.25, "y": 4.5 },
+ { "matrix": [4, 3], "x": 3.25, "y": 4.5 },
+ { "matrix": [4, 4], "x": 4.25, "y": 4.5 },
+ { "matrix": [4, 5], "x": 5.25, "y": 4.5 },
+ { "matrix": [4, 6], "x": 6.25, "y": 4.5 },
+ { "matrix": [4, 7], "x": 7.25, "y": 4.5 },
+ { "matrix": [4, 8], "x": 8.25, "y": 4.5 },
+ { "matrix": [4, 9], "x": 9.25, "y": 4.5 },
+ { "matrix": [4, 10], "x": 10.25, "y": 4.5 },
+ { "matrix": [4, 11], "x": 11.25, "y": 4.5 },
+ { "matrix": [4, 12], "w": 2.75, "x": 12.25, "y": 4.5 },
+ { "matrix": [4, 15], "x": 16.25, "y": 4.5 },
+ { "matrix": [5, 0], "w": 1.5, "x": 0, "y": 5.5 },
+ { "matrix": [5, 1], "x": 1.5, "y": 5.5 },
+ { "matrix": [5, 2], "w": 1.5, "x": 2.5, "y": 5.5 },
+ { "matrix": [5, 6], "w": 7, "x": 4, "y": 5.5 },
+ { "matrix": [5, 10], "w": 1.5, "x": 11, "y": 5.5 },
+ { "matrix": [5, 11], "x": 12.5, "y": 5.5 },
+ { "matrix": [5, 12], "w": 1.5, "x": 13.5, "y": 5.5 },
+ { "matrix": [5, 14], "x": 15.25, "y": 5.5 },
+ { "matrix": [5, 15], "x": 16.25, "y": 5.5 },
+ { "matrix": [5, 16], "x": 17.25, "y": 5.5 }
+ ]
+ },
+ "LAYOUT_tkl_ansi_tsangan": {
+ "layout": [
+ { "matrix": [0, 0], "x": 0, "y": 0 },
+ { "matrix": [0, 2], "x": 2, "y": 0 },
+ { "matrix": [0, 3], "x": 3, "y": 0 },
+ { "matrix": [0, 4], "x": 4, "y": 0 },
+ { "matrix": [0, 5], "x": 5, "y": 0 },
+ { "matrix": [0, 6], "x": 6.5, "y": 0 },
+ { "matrix": [0, 7], "x": 7.5, "y": 0 },
+ { "matrix": [0, 8], "x": 8.5, "y": 0 },
+ { "matrix": [0, 9], "x": 9.5, "y": 0 },
+ { "matrix": [0, 10], "x": 11, "y": 0 },
+ { "matrix": [0, 11], "x": 12, "y": 0 },
+ { "matrix": [0, 12], "x": 13, "y": 0 },
+ { "matrix": [0, 13], "x": 14, "y": 0 },
+ { "matrix": [0, 14], "x": 15.25, "y": 0 },
+ { "matrix": [0, 15], "x": 16.25, "y": 0 },
+ { "matrix": [0, 16], "x": 17.25, "y": 0 },
+ { "matrix": [1, 0], "x": 0, "y": 1.5 },
+ { "matrix": [1, 1], "x": 1, "y": 1.5 },
+ { "matrix": [1, 2], "x": 2, "y": 1.5 },
+ { "matrix": [1, 3], "x": 3, "y": 1.5 },
+ { "matrix": [1, 4], "x": 4, "y": 1.5 },
+ { "matrix": [1, 5], "x": 5, "y": 1.5 },
+ { "matrix": [1, 6], "x": 6, "y": 1.5 },
+ { "matrix": [1, 7], "x": 7, "y": 1.5 },
+ { "matrix": [1, 8], "x": 8, "y": 1.5 },
+ { "matrix": [1, 9], "x": 9, "y": 1.5 },
+ { "matrix": [1, 10], "x": 10, "y": 1.5 },
+ { "matrix": [1, 11], "x": 11, "y": 1.5 },
+ { "matrix": [1, 12], "x": 12, "y": 1.5 },
+ { "matrix": [1, 13], "w": 2, "x": 13, "y": 1.5 },
+ { "matrix": [1, 14], "x": 15.25, "y": 1.5 },
+ { "matrix": [1, 15], "x": 16.25, "y": 1.5 },
+ { "matrix": [1, 16], "x": 17.25, "y": 1.5 },
+ { "matrix": [2, 0], "w": 1.5, "x": 0, "y": 2.5 },
+ { "matrix": [2, 1], "x": 1.5, "y": 2.5 },
+ { "matrix": [2, 2], "x": 2.5, "y": 2.5 },
+ { "matrix": [2, 3], "x": 3.5, "y": 2.5 },
+ { "matrix": [2, 4], "x": 4.5, "y": 2.5 },
+ { "matrix": [2, 5], "x": 5.5, "y": 2.5 },
+ { "matrix": [2, 6], "x": 6.5, "y": 2.5 },
+ { "matrix": [2, 7], "x": 7.5, "y": 2.5 },
+ { "matrix": [2, 8], "x": 8.5, "y": 2.5 },
+ { "matrix": [2, 9], "x": 9.5, "y": 2.5 },
+ { "matrix": [2, 10], "x": 10.5, "y": 2.5 },
+ { "matrix": [2, 11], "x": 11.5, "y": 2.5 },
+ { "matrix": [2, 12], "x": 12.5, "y": 2.5 },
+ { "matrix": [2, 13], "w": 1.5, "x": 13.5, "y": 2.5 },
+ { "matrix": [2, 14], "x": 15.25, "y": 2.5 },
+ { "matrix": [2, 15], "x": 16.25, "y": 2.5 },
+ { "matrix": [2, 16], "x": 17.25, "y": 2.5 },
+ { "matrix": [3, 0], "w": 1.75, "x": 0, "y": 3.5 },
+ { "matrix": [3, 1], "x": 1.75, "y": 3.5 },
+ { "matrix": [3, 2], "x": 2.75, "y": 3.5 },
+ { "matrix": [3, 3], "x": 3.75, "y": 3.5 },
+ { "matrix": [3, 4], "x": 4.75, "y": 3.5 },
+ { "matrix": [3, 5], "x": 5.75, "y": 3.5 },
+ { "matrix": [3, 6], "x": 6.75, "y": 3.5 },
+ { "matrix": [3, 7], "x": 7.75, "y": 3.5 },
+ { "matrix": [3, 8], "x": 8.75, "y": 3.5 },
+ { "matrix": [3, 9], "x": 9.75, "y": 3.5 },
+ { "matrix": [3, 10], "x": 10.75, "y": 3.5 },
+ { "matrix": [3, 11], "x": 11.75, "y": 3.5 },
+ { "matrix": [3, 12], "w": 2.25, "x": 12.75, "y": 3.5 },
+ { "matrix": [4, 0], "w": 2.25, "x": 0, "y": 4.5 },
+ { "matrix": [4, 2], "x": 2.25, "y": 4.5 },
+ { "matrix": [4, 3], "x": 3.25, "y": 4.5 },
+ { "matrix": [4, 4], "x": 4.25, "y": 4.5 },
+ { "matrix": [4, 5], "x": 5.25, "y": 4.5 },
+ { "matrix": [4, 6], "x": 6.25, "y": 4.5 },
+ { "matrix": [4, 7], "x": 7.25, "y": 4.5 },
+ { "matrix": [4, 8], "x": 8.25, "y": 4.5 },
+ { "matrix": [4, 9], "x": 9.25, "y": 4.5 },
+ { "matrix": [4, 10], "x": 10.25, "y": 4.5 },
+ { "matrix": [4, 11], "x": 11.25, "y": 4.5 },
+ { "matrix": [4, 12], "w": 2.75, "x": 12.25, "y": 4.5 },
+ { "matrix": [4, 15], "x": 16.25, "y": 4.5 },
+ { "matrix": [5, 0], "w": 1.5, "x": 0, "y": 5.5 },
+ { "matrix": [5, 1], "x": 1.5, "y": 5.5 },
+ { "matrix": [5, 2], "w": 1.5, "x": 2.5, "y": 5.5 },
+ { "matrix": [5, 6], "w": 7, "x": 4, "y": 5.5 },
+ { "matrix": [5, 10], "w": 1.5, "x": 11, "y": 5.5 },
+ { "matrix": [5, 11], "x": 12.5, "y": 5.5 },
+ { "matrix": [5, 12], "w": 1.5, "x": 13.5, "y": 5.5 },
+ { "matrix": [5, 14], "x": 15.25, "y": 5.5 },
+ { "matrix": [5, 15], "x": 16.25, "y": 5.5 },
+ { "matrix": [5, 16], "x": 17.25, "y": 5.5 }
+ ]
+ },
+ "LAYOUT_tkl_ansi_wkl": {
+ "layout": [
+ { "matrix": [0, 0], "x": 0, "y": 0 },
+ { "matrix": [0, 2], "x": 2, "y": 0 },
+ { "matrix": [0, 3], "x": 3, "y": 0 },
+ { "matrix": [0, 4], "x": 4, "y": 0 },
+ { "matrix": [0, 5], "x": 5, "y": 0 },
+ { "matrix": [0, 6], "x": 6.5, "y": 0 },
+ { "matrix": [0, 7], "x": 7.5, "y": 0 },
+ { "matrix": [0, 8], "x": 8.5, "y": 0 },
+ { "matrix": [0, 9], "x": 9.5, "y": 0 },
+ { "matrix": [0, 10], "x": 11, "y": 0 },
+ { "matrix": [0, 11], "x": 12, "y": 0 },
+ { "matrix": [0, 12], "x": 13, "y": 0 },
+ { "matrix": [0, 13], "x": 14, "y": 0 },
+ { "matrix": [0, 14], "x": 15.25, "y": 0 },
+ { "matrix": [0, 15], "x": 16.25, "y": 0 },
+ { "matrix": [0, 16], "x": 17.25, "y": 0 },
+ { "matrix": [1, 0], "x": 0, "y": 1.5 },
+ { "matrix": [1, 1], "x": 1, "y": 1.5 },
+ { "matrix": [1, 2], "x": 2, "y": 1.5 },
+ { "matrix": [1, 3], "x": 3, "y": 1.5 },
+ { "matrix": [1, 4], "x": 4, "y": 1.5 },
+ { "matrix": [1, 5], "x": 5, "y": 1.5 },
+ { "matrix": [1, 6], "x": 6, "y": 1.5 },
+ { "matrix": [1, 7], "x": 7, "y": 1.5 },
+ { "matrix": [1, 8], "x": 8, "y": 1.5 },
+ { "matrix": [1, 9], "x": 9, "y": 1.5 },
+ { "matrix": [1, 10], "x": 10, "y": 1.5 },
+ { "matrix": [1, 11], "x": 11, "y": 1.5 },
+ { "matrix": [1, 12], "x": 12, "y": 1.5 },
+ { "matrix": [1, 13], "w": 2, "x": 13, "y": 1.5 },
+ { "matrix": [1, 14], "x": 15.25, "y": 1.5 },
+ { "matrix": [1, 15], "x": 16.25, "y": 1.5 },
+ { "matrix": [1, 16], "x": 17.25, "y": 1.5 },
+ { "matrix": [2, 0], "w": 1.5, "x": 0, "y": 2.5 },
+ { "matrix": [2, 1], "x": 1.5, "y": 2.5 },
+ { "matrix": [2, 2], "x": 2.5, "y": 2.5 },
+ { "matrix": [2, 3], "x": 3.5, "y": 2.5 },
+ { "matrix": [2, 4], "x": 4.5, "y": 2.5 },
+ { "matrix": [2, 5], "x": 5.5, "y": 2.5 },
+ { "matrix": [2, 6], "x": 6.5, "y": 2.5 },
+ { "matrix": [2, 7], "x": 7.5, "y": 2.5 },
+ { "matrix": [2, 8], "x": 8.5, "y": 2.5 },
+ { "matrix": [2, 9], "x": 9.5, "y": 2.5 },
+ { "matrix": [2, 10], "x": 10.5, "y": 2.5 },
+ { "matrix": [2, 11], "x": 11.5, "y": 2.5 },
+ { "matrix": [2, 12], "x": 12.5, "y": 2.5 },
+ { "matrix": [2, 13], "w": 1.5, "x": 13.5, "y": 2.5 },
+ { "matrix": [2, 14], "x": 15.25, "y": 2.5 },
+ { "matrix": [2, 15], "x": 16.25, "y": 2.5 },
+ { "matrix": [2, 16], "x": 17.25, "y": 2.5 },
+ { "matrix": [3, 0], "w": 1.75, "x": 0, "y": 3.5 },
+ { "matrix": [3, 1], "x": 1.75, "y": 3.5 },
+ { "matrix": [3, 2], "x": 2.75, "y": 3.5 },
+ { "matrix": [3, 3], "x": 3.75, "y": 3.5 },
+ { "matrix": [3, 4], "x": 4.75, "y": 3.5 },
+ { "matrix": [3, 5], "x": 5.75, "y": 3.5 },
+ { "matrix": [3, 6], "x": 6.75, "y": 3.5 },
+ { "matrix": [3, 7], "x": 7.75, "y": 3.5 },
+ { "matrix": [3, 8], "x": 8.75, "y": 3.5 },
+ { "matrix": [3, 9], "x": 9.75, "y": 3.5 },
+ { "matrix": [3, 10], "x": 10.75, "y": 3.5 },
+ { "matrix": [3, 11], "x": 11.75, "y": 3.5 },
+ { "matrix": [3, 12], "w": 2.25, "x": 12.75, "y": 3.5 },
+ { "matrix": [4, 0], "w": 2.25, "x": 0, "y": 4.5 },
+ { "matrix": [4, 2], "x": 2.25, "y": 4.5 },
+ { "matrix": [4, 3], "x": 3.25, "y": 4.5 },
+ { "matrix": [4, 4], "x": 4.25, "y": 4.5 },
+ { "matrix": [4, 5], "x": 5.25, "y": 4.5 },
+ { "matrix": [4, 6], "x": 6.25, "y": 4.5 },
+ { "matrix": [4, 7], "x": 7.25, "y": 4.5 },
+ { "matrix": [4, 8], "x": 8.25, "y": 4.5 },
+ { "matrix": [4, 9], "x": 9.25, "y": 4.5 },
+ { "matrix": [4, 10], "x": 10.25, "y": 4.5 },
+ { "matrix": [4, 11], "x": 11.25, "y": 4.5 },
+ { "matrix": [4, 12], "w": 2.75, "x": 12.25, "y": 4.5 },
+ { "matrix": [4, 15], "x": 16.25, "y": 4.5 },
+ { "matrix": [5, 0], "w": 1.5, "x": 0, "y": 5.5 },
+ { "matrix": [5, 2], "w": 1.5, "x": 2.5, "y": 5.5 },
+ { "matrix": [5, 6], "w": 7, "x": 4, "y": 5.5 },
+ { "matrix": [5, 10], "w": 1.5, "x": 11, "y": 5.5 },
+ { "matrix": [5, 12], "w": 1.5, "x": 13.5, "y": 5.5 },
+ { "matrix": [5, 14], "x": 15.25, "y": 5.5 },
+ { "matrix": [5, 15], "x": 16.25, "y": 5.5 },
+ { "matrix": [5, 16], "x": 17.25, "y": 5.5 }
+ ]
+ },
+ "LAYOUT_tkl_iso_tsangan": {
+ "layout": [
+ { "matrix": [0, 0], "x": 0, "y": 0 },
+ { "matrix": [0, 2], "x": 2, "y": 0 },
+ { "matrix": [0, 3], "x": 3, "y": 0 },
+ { "matrix": [0, 4], "x": 4, "y": 0 },
+ { "matrix": [0, 5], "x": 5, "y": 0 },
+ { "matrix": [0, 6], "x": 6.5, "y": 0 },
+ { "matrix": [0, 7], "x": 7.5, "y": 0 },
+ { "matrix": [0, 8], "x": 8.5, "y": 0 },
+ { "matrix": [0, 9], "x": 9.5, "y": 0 },
+ { "matrix": [0, 10], "x": 11, "y": 0 },
+ { "matrix": [0, 11], "x": 12, "y": 0 },
+ { "matrix": [0, 12], "x": 13, "y": 0 },
+ { "matrix": [0, 13], "x": 14, "y": 0 },
+ { "matrix": [0, 14], "x": 15.25, "y": 0 },
+ { "matrix": [0, 15], "x": 16.25, "y": 0 },
+ { "matrix": [0, 16], "x": 17.25, "y": 0 },
+ { "matrix": [1, 0], "x": 0, "y": 1.5 },
+ { "matrix": [1, 1], "x": 1, "y": 1.5 },
+ { "matrix": [1, 2], "x": 2, "y": 1.5 },
+ { "matrix": [1, 3], "x": 3, "y": 1.5 },
+ { "matrix": [1, 4], "x": 4, "y": 1.5 },
+ { "matrix": [1, 5], "x": 5, "y": 1.5 },
+ { "matrix": [1, 6], "x": 6, "y": 1.5 },
+ { "matrix": [1, 7], "x": 7, "y": 1.5 },
+ { "matrix": [1, 8], "x": 8, "y": 1.5 },
+ { "matrix": [1, 9], "x": 9, "y": 1.5 },
+ { "matrix": [1, 10], "x": 10, "y": 1.5 },
+ { "matrix": [1, 11], "x": 11, "y": 1.5 },
+ { "matrix": [1, 12], "x": 12, "y": 1.5 },
+ { "matrix": [1, 13], "w": 2, "x": 13, "y": 1.5 },
+ { "matrix": [1, 14], "x": 15.25, "y": 1.5 },
+ { "matrix": [1, 15], "x": 16.25, "y": 1.5 },
+ { "matrix": [1, 16], "x": 17.25, "y": 1.5 },
+ { "matrix": [2, 0], "w": 1.5, "x": 0, "y": 2.5 },
+ { "matrix": [2, 1], "x": 1.5, "y": 2.5 },
+ { "matrix": [2, 2], "x": 2.5, "y": 2.5 },
+ { "matrix": [2, 3], "x": 3.5, "y": 2.5 },
+ { "matrix": [2, 4], "x": 4.5, "y": 2.5 },
+ { "matrix": [2, 5], "x": 5.5, "y": 2.5 },
+ { "matrix": [2, 6], "x": 6.5, "y": 2.5 },
+ { "matrix": [2, 7], "x": 7.5, "y": 2.5 },
+ { "matrix": [2, 8], "x": 8.5, "y": 2.5 },
+ { "matrix": [2, 9], "x": 9.5, "y": 2.5 },
+ { "matrix": [2, 10], "x": 10.5, "y": 2.5 },
+ { "matrix": [2, 11], "x": 11.5, "y": 2.5 },
+ { "matrix": [2, 12], "x": 12.5, "y": 2.5 },
+ { "matrix": [2, 14], "x": 15.25, "y": 2.5 },
+ { "matrix": [2, 15], "x": 16.25, "y": 2.5 },
+ { "matrix": [2, 16], "x": 17.25, "y": 2.5 },
+ { "matrix": [3, 0], "w": 1.75, "x": 0, "y": 3.5 },
+ { "matrix": [3, 1], "x": 1.75, "y": 3.5 },
+ { "matrix": [3, 2], "x": 2.75, "y": 3.5 },
+ { "matrix": [3, 3], "x": 3.75, "y": 3.5 },
+ { "matrix": [3, 4], "x": 4.75, "y": 3.5 },
+ { "matrix": [3, 5], "x": 5.75, "y": 3.5 },
+ { "matrix": [3, 6], "x": 6.75, "y": 3.5 },
+ { "matrix": [3, 7], "x": 7.75, "y": 3.5 },
+ { "matrix": [3, 8], "x": 8.75, "y": 3.5 },
+ { "matrix": [3, 9], "x": 9.75, "y": 3.5 },
+ { "matrix": [3, 10], "x": 10.75, "y": 3.5 },
+ { "matrix": [3, 11], "x": 11.75, "y": 3.5 },
+ { "matrix": [2, 13], "x": 12.75, "y": 3.5 },
+ { "matrix": [3, 12], "x": 13.75, "y": 2.5, "w": 1.25, "h": 2 },
+ { "matrix": [4, 0], "w": 1.25, "x": 0, "y": 4.5 },
+ { "matrix": [4, 1], "x": 1.25, "y": 4.5 },
+ { "matrix": [4, 2], "x": 2.25, "y": 4.5 },
+ { "matrix": [4, 3], "x": 3.25, "y": 4.5 },
+ { "matrix": [4, 4], "x": 4.25, "y": 4.5 },
+ { "matrix": [4, 5], "x": 5.25, "y": 4.5 },
+ { "matrix": [4, 6], "x": 6.25, "y": 4.5 },
+ { "matrix": [4, 7], "x": 7.25, "y": 4.5 },
+ { "matrix": [4, 8], "x": 8.25, "y": 4.5 },
+ { "matrix": [4, 9], "x": 9.25, "y": 4.5 },
+ { "matrix": [4, 10], "x": 10.25, "y": 4.5 },
+ { "matrix": [4, 11], "x": 11.25, "y": 4.5 },
+ { "matrix": [4, 12], "w": 2.75, "x": 12.25, "y": 4.5 },
+ { "matrix": [4, 15], "x": 16.25, "y": 4.5 },
+ { "matrix": [5, 0], "w": 1.5, "x": 0, "y": 5.5 },
+ { "matrix": [5, 1], "x": 1.5, "y": 5.5 },
+ { "matrix": [5, 2], "w": 1.5, "x": 2.5, "y": 5.5 },
+ { "matrix": [5, 6], "w": 7, "x": 4, "y": 5.5 },
+ { "matrix": [5, 10], "w": 1.5, "x": 11, "y": 5.5 },
+ { "matrix": [5, 11], "x": 12.5, "y": 5.5 },
+ { "matrix": [5, 12], "w": 1.5, "x": 13.5, "y": 5.5 },
+ { "matrix": [5, 14], "x": 15.25, "y": 5.5 },
+ { "matrix": [5, 15], "x": 16.25, "y": 5.5 },
+ { "matrix": [5, 16], "x": 17.25, "y": 5.5 }
+ ]
+ },
+ "LAYOUT_tkl_iso_wkl": {
+ "layout": [
+ { "matrix": [0, 0], "x": 0, "y": 0 },
+ { "matrix": [0, 2], "x": 2, "y": 0 },
+ { "matrix": [0, 3], "x": 3, "y": 0 },
+ { "matrix": [0, 4], "x": 4, "y": 0 },
+ { "matrix": [0, 5], "x": 5, "y": 0 },
+ { "matrix": [0, 6], "x": 6.5, "y": 0 },
+ { "matrix": [0, 7], "x": 7.5, "y": 0 },
+ { "matrix": [0, 8], "x": 8.5, "y": 0 },
+ { "matrix": [0, 9], "x": 9.5, "y": 0 },
+ { "matrix": [0, 10], "x": 11, "y": 0 },
+ { "matrix": [0, 11], "x": 12, "y": 0 },
+ { "matrix": [0, 12], "x": 13, "y": 0 },
+ { "matrix": [0, 13], "x": 14, "y": 0 },
+ { "matrix": [0, 14], "x": 15.25, "y": 0 },
+ { "matrix": [0, 15], "x": 16.25, "y": 0 },
+ { "matrix": [0, 16], "x": 17.25, "y": 0 },
+ { "matrix": [1, 0], "x": 0, "y": 1.5 },
+ { "matrix": [1, 1], "x": 1, "y": 1.5 },
+ { "matrix": [1, 2], "x": 2, "y": 1.5 },
+ { "matrix": [1, 3], "x": 3, "y": 1.5 },
+ { "matrix": [1, 4], "x": 4, "y": 1.5 },
+ { "matrix": [1, 5], "x": 5, "y": 1.5 },
+ { "matrix": [1, 6], "x": 6, "y": 1.5 },
+ { "matrix": [1, 7], "x": 7, "y": 1.5 },
+ { "matrix": [1, 8], "x": 8, "y": 1.5 },
+ { "matrix": [1, 9], "x": 9, "y": 1.5 },
+ { "matrix": [1, 10], "x": 10, "y": 1.5 },
+ { "matrix": [1, 11], "x": 11, "y": 1.5 },
+ { "matrix": [1, 12], "x": 12, "y": 1.5 },
+ { "matrix": [1, 13], "w": 2, "x": 13, "y": 1.5 },
+ { "matrix": [1, 14], "x": 15.25, "y": 1.5 },
+ { "matrix": [1, 15], "x": 16.25, "y": 1.5 },
+ { "matrix": [1, 16], "x": 17.25, "y": 1.5 },
+ { "matrix": [2, 0], "w": 1.5, "x": 0, "y": 2.5 },
+ { "matrix": [2, 1], "x": 1.5, "y": 2.5 },
+ { "matrix": [2, 2], "x": 2.5, "y": 2.5 },
+ { "matrix": [2, 3], "x": 3.5, "y": 2.5 },
+ { "matrix": [2, 4], "x": 4.5, "y": 2.5 },
+ { "matrix": [2, 5], "x": 5.5, "y": 2.5 },
+ { "matrix": [2, 6], "x": 6.5, "y": 2.5 },
+ { "matrix": [2, 7], "x": 7.5, "y": 2.5 },
+ { "matrix": [2, 8], "x": 8.5, "y": 2.5 },
+ { "matrix": [2, 9], "x": 9.5, "y": 2.5 },
+ { "matrix": [2, 10], "x": 10.5, "y": 2.5 },
+ { "matrix": [2, 11], "x": 11.5, "y": 2.5 },
+ { "matrix": [2, 12], "x": 12.5, "y": 2.5 },
+ { "matrix": [2, 14], "x": 15.25, "y": 2.5 },
+ { "matrix": [2, 15], "x": 16.25, "y": 2.5 },
+ { "matrix": [2, 16], "x": 17.25, "y": 2.5 },
+ { "matrix": [3, 0], "w": 1.75, "x": 0, "y": 3.5 },
+ { "matrix": [3, 1], "x": 1.75, "y": 3.5 },
+ { "matrix": [3, 2], "x": 2.75, "y": 3.5 },
+ { "matrix": [3, 3], "x": 3.75, "y": 3.5 },
+ { "matrix": [3, 4], "x": 4.75, "y": 3.5 },
+ { "matrix": [3, 5], "x": 5.75, "y": 3.5 },
+ { "matrix": [3, 6], "x": 6.75, "y": 3.5 },
+ { "matrix": [3, 7], "x": 7.75, "y": 3.5 },
+ { "matrix": [3, 8], "x": 8.75, "y": 3.5 },
+ { "matrix": [3, 9], "x": 9.75, "y": 3.5 },
+ { "matrix": [3, 10], "x": 10.75, "y": 3.5 },
+ { "matrix": [3, 11], "x": 11.75, "y": 3.5 },
+ { "matrix": [2, 13], "x": 12.75, "y": 3.5 },
+ { "matrix": [3, 12], "x": 13.75, "y": 2.5, "w": 1.25, "h": 2 },
+ { "matrix": [4, 0], "w": 1.25, "x": 0, "y": 4.5 },
+ { "matrix": [4, 1], "x": 1.25, "y": 4.5 },
+ { "matrix": [4, 2], "x": 2.25, "y": 4.5 },
+ { "matrix": [4, 3], "x": 3.25, "y": 4.5 },
+ { "matrix": [4, 4], "x": 4.25, "y": 4.5 },
+ { "matrix": [4, 5], "x": 5.25, "y": 4.5 },
+ { "matrix": [4, 6], "x": 6.25, "y": 4.5 },
+ { "matrix": [4, 7], "x": 7.25, "y": 4.5 },
+ { "matrix": [4, 8], "x": 8.25, "y": 4.5 },
+ { "matrix": [4, 9], "x": 9.25, "y": 4.5 },
+ { "matrix": [4, 10], "x": 10.25, "y": 4.5 },
+ { "matrix": [4, 11], "x": 11.25, "y": 4.5 },
+ { "matrix": [4, 12], "w": 2.75, "x": 12.25, "y": 4.5 },
+ { "matrix": [4, 15], "x": 16.25, "y": 4.5 },
+ { "matrix": [5, 0], "w": 1.5, "x": 0, "y": 5.5 },
+ { "matrix": [5, 2], "w": 1.5, "x": 2.5, "y": 5.5 },
+ { "matrix": [5, 6], "w": 7, "x": 4, "y": 5.5 },
+ { "matrix": [5, 10], "w": 1.5, "x": 11, "y": 5.5 },
+ { "matrix": [5, 12], "w": 1.5, "x": 13.5, "y": 5.5 },
+ { "matrix": [5, 14], "x": 15.25, "y": 5.5 },
+ { "matrix": [5, 15], "x": 16.25, "y": 5.5 },
+ { "matrix": [5, 16], "x": 17.25, "y": 5.5 }
+ ]
+ }
+ }
+}
diff --git a/keyboards/dnworks/9973/keymaps/default/keymap.c b/keyboards/dnworks/9973/keymaps/default/keymap.c
new file mode 100644
index 00000000000..8307bf9e766
--- /dev/null
+++ b/keyboards/dnworks/9973/keymaps/default/keymap.c
@@ -0,0 +1,27 @@
+/*
+Copyright 2023 zeix (@itsme-zeix)
+
+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 .
+*/
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+[0] = LAYOUT_all(
+ 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_DEL, 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_INS, 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_NUBS, 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, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT)
+};
diff --git a/keyboards/dnworks/9973/keymaps/via/keymap.c b/keyboards/dnworks/9973/keymaps/via/keymap.c
new file mode 100644
index 00000000000..8307bf9e766
--- /dev/null
+++ b/keyboards/dnworks/9973/keymaps/via/keymap.c
@@ -0,0 +1,27 @@
+/*
+Copyright 2023 zeix (@itsme-zeix)
+
+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 .
+*/
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+[0] = LAYOUT_all(
+ 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_DEL, 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_INS, 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_NUBS, 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, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT)
+};
diff --git a/keyboards/dnworks/9973/keymaps/via/rules.mk b/keyboards/dnworks/9973/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/dnworks/9973/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/dnworks/9973/readme.md b/keyboards/dnworks/9973/readme.md
new file mode 100644
index 00000000000..790f236cb77
--- /dev/null
+++ b/keyboards/dnworks/9973/readme.md
@@ -0,0 +1,27 @@
+# 997.3 TKL
+
+
+
+PCB that supports the 997.3 TKL designed by dnworks, including its variants.
+
+* Keyboard Maintainer: [Zeix](https://github.com/itsme-zeix)
+* Hardware Supported: 997.3 Solder PCB rev1
+* Hardware Availability: dnworks.co
+
+Make example for this keyboard (after setting up your build environment):
+
+ make dnworks/997pt3:default
+
+Flashing example for this keyboard:
+
+ make dnworks/997pt3: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 top left key and plug in the keyboard
+* **Physical reset button**: Briefly press the `RESET` button twice or short the `USB_BOOT` and `GND` pads and plug in the keyboard
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
\ No newline at end of file
diff --git a/keyboards/dnworks/9973/rules.mk b/keyboards/dnworks/9973/rules.mk
new file mode 100644
index 00000000000..6e7633bfe01
--- /dev/null
+++ b/keyboards/dnworks/9973/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
diff --git a/keyboards/eason/aeroboard/info.json b/keyboards/eason/aeroboard/info.json
index 2ee29f792db..c8046d40e4f 100644
--- a/keyboards/eason/aeroboard/info.json
+++ b/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": [
diff --git a/keyboards/enter67/info.json b/keyboards/enter67/info.json
new file mode 100644
index 00000000000..df1d7f6b5b3
--- /dev/null
+++ b/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}
+ ]
+ }
+ }
+}
diff --git a/keyboards/enter67/keymaps/default/keymap.c b/keyboards/enter67/keymaps/default/keymap.c
new file mode 100644
index 00000000000..1f3d16c0953
--- /dev/null
+++ b/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 .
+ */
+
+#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)
+
+};
diff --git a/keyboards/enter67/keymaps/via/keymap.c b/keyboards/enter67/keymaps/via/keymap.c
new file mode 100644
index 00000000000..1f3d16c0953
--- /dev/null
+++ b/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 .
+ */
+
+#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)
+
+};
diff --git a/keyboards/enter67/keymaps/via/rules.mk b/keyboards/enter67/keymaps/via/rules.mk
new file mode 100644
index 00000000000..036bd6d1c3e
--- /dev/null
+++ b/keyboards/enter67/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/enter67/readme.md b/keyboards/enter67/readme.md
new file mode 100644
index 00000000000..8a4890ff1d5
--- /dev/null
+++ b/keyboards/enter67/readme.md
@@ -0,0 +1,26 @@
+# ENTER67 - PCB
+
+
+
+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
\ No newline at end of file
diff --git a/keyboards/enter67/rules.mk b/keyboards/enter67/rules.mk
new file mode 100644
index 00000000000..7ff128fa692
--- /dev/null
+++ b/keyboards/enter67/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
\ No newline at end of file
diff --git a/keyboards/era/sirind/klein_sd/config.h b/keyboards/era/sirind/klein_sd/config.h
new file mode 100644
index 00000000000..ae1d4a9e1d0
--- /dev/null
+++ b/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 .
+ */
+
+#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
\ No newline at end of file
diff --git a/keyboards/era/sirind/klein_sd/halconf.h b/keyboards/era/sirind/klein_sd/halconf.h
new file mode 100644
index 00000000000..f57e86df018
--- /dev/null
+++ b/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 .
+ */
+
+#pragma once
+
+#define HAL_USE_PWM TRUE
+
+#include_next
\ No newline at end of file
diff --git a/keyboards/era/sirind/klein_sd/info.json b/keyboards/era/sirind/klein_sd/info.json
new file mode 100644
index 00000000000..53f89f2cb70
--- /dev/null
+++ b/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}
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/keyboards/era/sirind/klein_sd/keymaps/default/keymap.c b/keyboards/era/sirind/klein_sd/keymaps/default/keymap.c
new file mode 100644
index 00000000000..88878bbcd93
--- /dev/null
+++ b/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
+ )
+};
\ No newline at end of file
diff --git a/keyboards/era/sirind/klein_sd/keymaps/via/keymap.c b/keyboards/era/sirind/klein_sd/keymaps/via/keymap.c
new file mode 100644
index 00000000000..88878bbcd93
--- /dev/null
+++ b/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
+ )
+};
\ No newline at end of file
diff --git a/keyboards/era/sirind/klein_sd/keymaps/via/rules.mk b/keyboards/era/sirind/klein_sd/keymaps/via/rules.mk
new file mode 100644
index 00000000000..036bd6d1c3e
--- /dev/null
+++ b/keyboards/era/sirind/klein_sd/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/era/sirind/klein_sd/mcuconf.h b/keyboards/era/sirind/klein_sd/mcuconf.h
new file mode 100644
index 00000000000..b82cc49d7d0
--- /dev/null
+++ b/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 .
+ */
+
+#pragma once
+
+#include_next
+
+#undef RP_PWM_USE_PWM7
+#define RP_PWM_USE_PWM7 TRUE
\ No newline at end of file
diff --git a/keyboards/era/sirind/klein_sd/readme.md b/keyboards/era/sirind/klein_sd/readme.md
new file mode 100644
index 00000000000..a021b843d78
--- /dev/null
+++ b/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
\ No newline at end of file
diff --git a/keyboards/era/sirind/klein_sd/rules.mk b/keyboards/era/sirind/klein_sd/rules.mk
new file mode 100644
index 00000000000..7ff128fa692
--- /dev/null
+++ b/keyboards/era/sirind/klein_sd/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
\ No newline at end of file
diff --git a/keyboards/gregandcin/teaqueen/info.json b/keyboards/gregandcin/teaqueen/info.json
new file mode 100644
index 00000000000..841c524e62d
--- /dev/null
+++ b/keyboards/gregandcin/teaqueen/info.json
@@ -0,0 +1,115 @@
+{
+ "manufacturer": "gregandcin",
+ "keyboard_name": "gregandcin/teaqueen",
+ "maintainer": "gregandcin",
+ "bootloader": "rp2040",
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true
+ },
+ "matrix_pins": {
+ "cols": ["GP29", "GP28", "GP27", "GP26", "GP22", "GP20", "GP23", "NO_PIN"],
+ "rows": ["GP5", "GP6", "GP7", "GP8", "GP9"]
+ },
+ "processor": "RP2040",
+ "split": {
+ "enabled": true,
+ "matrix_pins": {
+ "right": {
+ "cols": ["GP29", "GP28", "GP27", "GP26", "GP22", "GP20", "GP23", "GP21"],
+ "rows": ["GP5", "GP6", "GP7", "GP8", "GP9"]
+ }
+ },
+ "soft_serial_pin": "GP3"
+ },
+ "url": "https://github.com/gregandcin/teaqueen",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x0000",
+ "vid": "0x4743"
+ },
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0.6, "y": 0},
+ {"matrix": [0, 1], "x": 1.6, "y": 0},
+ {"matrix": [0, 2], "x": 2.6, "y": 0},
+ {"matrix": [0, 3], "x": 3.6, "y": 0},
+ {"matrix": [0, 4], "x": 4.6, "y": 0},
+ {"matrix": [0, 5], "x": 5.6, "y": 0},
+ {"matrix": [0, 6], "x": 6.6, "y": 0},
+
+ {"matrix": [5, 0], "x": 8.5, "y": 0},
+ {"matrix": [5, 1], "x": 9.5, "y": 0},
+ {"matrix": [5, 2], "x": 10.5, "y": 0},
+ {"matrix": [5, 3], "x": 11.5, "y": 0},
+ {"matrix": [5, 4], "x": 12.5, "y": 0},
+ {"matrix": [5, 5], "x": 13.5, "y": 0},
+ {"matrix": [5, 6], "x": 14.5, "y": 0, "w": 2},
+
+ {"matrix": [1, 0], "x": 0.35, "y": 1, "w": 1.5},
+ {"matrix": [1, 2], "x": 1.85, "y": 1},
+ {"matrix": [1, 3], "x": 2.85, "y": 1},
+ {"matrix": [1, 4], "x": 3.85, "y": 1},
+ {"matrix": [1, 5], "x": 4.85, "y": 1},
+ {"matrix": [1, 6], "x": 5.85, "y": 1},
+
+ {"matrix": [6, 0], "x": 8.25, "y": 1},
+ {"matrix": [6, 1], "x": 9.25, "y": 1},
+ {"matrix": [6, 2], "x": 10.25, "y": 1},
+ {"matrix": [6, 3], "x": 11.25, "y": 1},
+ {"matrix": [6, 4], "x": 12.25, "y": 1},
+ {"matrix": [6, 5], "x": 13.25, "y": 1},
+ {"matrix": [6, 6], "x": 14.25, "y": 1},
+ {"matrix": [6, 7], "x": 15.25, "y": 1, "w": 1.5},
+
+ {"matrix": [2, 0], "x": 0.2, "y": 2, "w": 1.75},
+ {"matrix": [2, 2], "x": 1.95, "y": 2},
+ {"matrix": [2, 3], "x": 2.95, "y": 2},
+ {"matrix": [2, 4], "x": 3.95, "y": 2},
+ {"matrix": [2, 5], "x": 4.95, "y": 2},
+ {"matrix": [2, 6], "x": 5.95, "y": 2},
+
+ {"matrix": [7, 0], "x": 8.75, "y": 2},
+ {"matrix": [7, 1], "x": 9.75, "y": 2},
+ {"matrix": [7, 2], "x": 10.75, "y": 2},
+ {"matrix": [7, 3], "x": 11.75, "y": 2},
+ {"matrix": [7, 4], "x": 12.75, "y": 2},
+ {"matrix": [7, 5], "x": 13.75, "y": 2},
+ {"matrix": [7, 7], "x": 14.75, "y": 2, "w": 2.25},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+
+ {"matrix": [8, 0], "x": 8.45, "y": 3},
+ {"matrix": [8, 1], "x": 9.45, "y": 3},
+ {"matrix": [8, 2], "x": 10.45, "y": 3},
+ {"matrix": [8, 3], "x": 11.45, "y": 3},
+ {"matrix": [8, 4], "x": 12.45, "y": 3},
+ {"matrix": [8, 5], "x": 13.45, "y": 3},
+ {"matrix": [8, 6], "x": 14.45, "y": 3, "w": 1.75},
+ {"matrix": [8, 7], "x": 16.20, "y": 3},
+
+ {"matrix": [4, 0], "x": 0.2, "y": 4, "w": 1.5},
+ {"matrix": [4, 1], "x": 1.7, "y": 4},
+ {"matrix": [4, 3], "x": 3.25, "y": 4, "w": 1.5},
+ {"matrix": [4, 5], "x": 4.75, "y": 4, "w": 2},
+ {"matrix": [4, 6], "x": 6.75, "y": 4},
+
+ {"matrix": [9, 1], "x": 8.45, "y": 4, "w": 2.75},
+ {"matrix": [9, 3], "x": 11.20, "y": 4, "w": 1.5},
+ {"matrix": [9, 6], "x": 14.5, "y": 4},
+ {"matrix": [9, 7], "x": 15.5, "y": 4, "w": 1.5}
+ ]
+ }
+ }
+}
diff --git a/keyboards/gregandcin/teaqueen/keymaps/default/keymap.c b/keyboards/gregandcin/teaqueen/keymaps/default/keymap.c
new file mode 100644
index 00000000000..2bcc085b777
--- /dev/null
+++ b/keyboards/gregandcin/teaqueen/keymaps/default/keymap.c
@@ -0,0 +1,40 @@
+// Copyright 2018-2023 Mattia Dal Ben gregandcin
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#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.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+enum custom_layer {
+ _QWERTY,
+ _SYMB,
+ _NAV
+};
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [_QWERTY] = LAYOUT(
+ 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, MO(1), KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(2),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_SPC, KC_RALT, KC_RGUI, KC_RCTL),
+
+ [_SYMB] = LAYOUT(
+ 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_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_HOME, KC_PGUP, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DEL, KC_END, KC_PGDN, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT),
+
+ [_NAV] = LAYOUT(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_BTN2, KC_MS_U, KC_BTN1, KC_WH_U, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+};
+
diff --git a/keyboards/gregandcin/teaqueen/keymaps/via/keymap.c b/keyboards/gregandcin/teaqueen/keymaps/via/keymap.c
new file mode 100644
index 00000000000..2bcc085b777
--- /dev/null
+++ b/keyboards/gregandcin/teaqueen/keymaps/via/keymap.c
@@ -0,0 +1,40 @@
+// Copyright 2018-2023 Mattia Dal Ben gregandcin
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#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.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+enum custom_layer {
+ _QWERTY,
+ _SYMB,
+ _NAV
+};
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [_QWERTY] = LAYOUT(
+ 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, MO(1), KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(2),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_SPC, KC_RALT, KC_RGUI, KC_RCTL),
+
+ [_SYMB] = LAYOUT(
+ 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_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_HOME, KC_PGUP, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DEL, KC_END, KC_PGDN, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT),
+
+ [_NAV] = LAYOUT(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_BTN2, KC_MS_U, KC_BTN1, KC_WH_U, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+};
+
diff --git a/keyboards/gregandcin/teaqueen/keymaps/via/rules.mk b/keyboards/gregandcin/teaqueen/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/gregandcin/teaqueen/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/gregandcin/teaqueen/readme.md b/keyboards/gregandcin/teaqueen/readme.md
new file mode 100644
index 00000000000..2d259e644d2
--- /dev/null
+++ b/keyboards/gregandcin/teaqueen/readme.md
@@ -0,0 +1,26 @@
+# gregandcin/teaqueen
+
+
+
+An Alice inspired, split layout keyboar featuring Kailh hotswap sockets.
+
+* Keyboard Maintainer: [gregandcin](https://github.com/gregandcin)
+* Hardware Supported: Elite-Pi, other RP2040 Community Edition Boards
+
+Make example for this keyboard (after setting up your build environment):
+
+ make gregandcin/teaqueen:default
+
+Flashing example for this keyboard:
+
+ make gregandcin/teaqueen: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
diff --git a/keyboards/gregandcin/teaqueen/rules.mk b/keyboards/gregandcin/teaqueen/rules.mk
new file mode 100644
index 00000000000..161ec22b16e
--- /dev/null
+++ b/keyboards/gregandcin/teaqueen/rules.mk
@@ -0,0 +1 @@
+SERIAL_DRIVER = vendor
diff --git a/keyboards/handwired/iso85k/info.json b/keyboards/handwired/iso85k/info.json
new file mode 100644
index 00000000000..625a356e307
--- /dev/null
+++ b/keyboards/handwired/iso85k/info.json
@@ -0,0 +1,123 @@
+{
+ "manufacturer": "Fredrik A. Kristiansen",
+ "keyboard_name": "iso85k",
+ "maintainer": "FredrikAleksander",
+ "bootloader": "stm32-dfu",
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": false,
+ "nkro": true
+ },
+ "matrix_pins": {
+ "cols": ["A7", "C4", "C5", "B0", "B1", "B2", "B10", "B11", "C10", "C11", "C12", "B3", "B4", "B5", "B8", "B9"],
+ "rows": ["C7", "C6", "B15", "B14", "B13", "B12"]
+ },
+ "processor": "STM32F072",
+ "url": "",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0xCAFE",
+ "vid": "0xD666"
+ },
+ "community_layouts": ["75_iso"],
+ "layouts": {
+ "LAYOUT_75_iso": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15, "y": 0},
+
+ {"matrix": [1, 0], "x": 0, "y": 1},
+ {"matrix": [1, 1], "x": 1, "y": 1},
+ {"matrix": [1, 2], "x": 2, "y": 1},
+ {"matrix": [1, 3], "x": 3, "y": 1},
+ {"matrix": [1, 4], "x": 4, "y": 1},
+ {"matrix": [1, 5], "x": 5, "y": 1},
+ {"matrix": [1, 6], "x": 6, "y": 1},
+ {"matrix": [1, 7], "x": 7, "y": 1},
+ {"matrix": [1, 8], "x": 8, "y": 1},
+ {"matrix": [1, 9], "x": 9, "y": 1},
+ {"matrix": [1, 10], "x": 10, "y": 1},
+ {"matrix": [1, 11], "x": 11, "y": 1},
+ {"matrix": [1, 12], "x": 12, "y": 1},
+ {"matrix": [1, 14], "x": 13, "y": 1, "w": 2},
+ {"matrix": [1, 15], "x": 15, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2},
+ {"matrix": [2, 2], "x": 2.5, "y": 2},
+ {"matrix": [2, 3], "x": 3.5, "y": 2},
+ {"matrix": [2, 4], "x": 4.5, "y": 2},
+ {"matrix": [2, 5], "x": 5.5, "y": 2},
+ {"matrix": [2, 6], "x": 6.5, "y": 2},
+ {"matrix": [2, 7], "x": 7.5, "y": 2},
+ {"matrix": [2, 8], "x": 8.5, "y": 2},
+ {"matrix": [2, 9], "x": 9.5, "y": 2},
+ {"matrix": [2, 10], "x": 10.5, "y": 2},
+ {"matrix": [2, 11], "x": 11.5, "y": 2},
+ {"matrix": [2, 12], "x": 12.5, "y": 2},
+ {"matrix": [2, 15], "x": 15, "y": 2},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3},
+ {"matrix": [3, 2], "x": 2.75, "y": 3},
+ {"matrix": [3, 3], "x": 3.75, "y": 3},
+ {"matrix": [3, 4], "x": 4.75, "y": 3},
+ {"matrix": [3, 5], "x": 5.75, "y": 3},
+ {"matrix": [3, 6], "x": 6.75, "y": 3},
+ {"matrix": [3, 7], "x": 7.75, "y": 3},
+ {"matrix": [3, 8], "x": 8.75, "y": 3},
+ {"matrix": [3, 9], "x": 9.75, "y": 3},
+ {"matrix": [3, 10], "x": 10.75, "y": 3},
+ {"matrix": [3, 11], "x": 11.75, "y": 3},
+ {"matrix": [3, 12], "x": 12.75, "y": 3},
+ {"matrix": [2, 14], "x": 13.75, "y": 2, "w": 1.25, "h": 2},
+ {"matrix": [3, 15], "x": 15, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4},
+ {"matrix": [4, 2], "x": 2.25, "y": 4},
+ {"matrix": [4, 3], "x": 3.25, "y": 4},
+ {"matrix": [4, 4], "x": 4.25, "y": 4},
+ {"matrix": [4, 5], "x": 5.25, "y": 4},
+ {"matrix": [4, 6], "x": 6.25, "y": 4},
+ {"matrix": [4, 7], "x": 7.25, "y": 4},
+ {"matrix": [4, 8], "x": 8.25, "y": 4},
+ {"matrix": [4, 9], "x": 9.25, "y": 4},
+ {"matrix": [4, 10], "x": 10.25, "y": 4},
+ {"matrix": [4, 11], "x": 11.25, "y": 4},
+ {"matrix": [4, 13], "x": 12.25, "y": 4, "w": 1.75},
+ {"matrix": [4, 14], "x": 14, "y": 4},
+ {"matrix": [4, 15], "x": 15, "y": 4},
+
+ {"matrix": [5, 0], "x": 0, "y": 5, "w": 1.25},
+ {"matrix": [5, 1], "x": 1.25, "y": 5, "w": 1.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5, "w": 1.25},
+ {"matrix": [5, 6], "x": 3.75, "y": 5, "w": 6.25},
+ {"matrix": [5, 10], "x": 10, "y": 5},
+ {"matrix": [5, 11], "x": 11, "y": 5},
+ {"matrix": [5, 12], "x": 12, "y": 5},
+ {"matrix": [5, 13], "x": 13, "y": 5},
+ {"matrix": [5, 14], "x": 14, "y": 5},
+ {"matrix": [5, 15], "x": 15, "y": 5}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/iso85k/keymaps/default/keymap.c b/keyboards/handwired/iso85k/keymaps/default/keymap.c
new file mode 100644
index 00000000000..aaba9c1ea1e
--- /dev/null
+++ b/keyboards/handwired/iso85k/keymaps/default/keymap.c
@@ -0,0 +1,28 @@
+// Copyright 2023 Fredrik A. Kristiansen (fredrikaxk@gmail.com)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+enum layers {
+ _BL,
+ _FL
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_BL] = LAYOUT_75_iso(
+ 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_PAUS, KC_DEL,
+ 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_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_PGUP,
+ 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_PGDN,
+ 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_UP, KC_END,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FL), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [_FL] = LAYOUT_75_iso(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_NUM, KC_SCRL, KC_INS,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+};
diff --git a/keyboards/handwired/iso85k/keymaps/via/keymap.c b/keyboards/handwired/iso85k/keymaps/via/keymap.c
new file mode 100644
index 00000000000..3d64364cc69
--- /dev/null
+++ b/keyboards/handwired/iso85k/keymaps/via/keymap.c
@@ -0,0 +1,28 @@
+// Copyright 2023 Fredrik A. Kristiansen (fredrikaxk@gmail.com)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+enum layers {
+ _BL,
+ _FL
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_BL] = LAYOUT_75_iso(
+ 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_PAUS, KC_DEL,
+ 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_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_PGUP,
+ 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_PGDN,
+ 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_UP, KC_END,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FL), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [_FL] = LAYOUT_75_iso(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_NUM, KC_SCRL, KC_INS,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+};
diff --git a/keyboards/handwired/iso85k/keymaps/via/rules.mk b/keyboards/handwired/iso85k/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/handwired/iso85k/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/handwired/iso85k/readme.md b/keyboards/handwired/iso85k/readme.md
new file mode 100644
index 00000000000..89e3d60d2ae
--- /dev/null
+++ b/keyboards/handwired/iso85k/readme.md
@@ -0,0 +1,25 @@
+# iso85k
+
+*A 85-key ISO keyboard*
+
+* Keyboard Maintainer: [Fredrik A. Kristiansen](https://github.com/FredrikAleksander)
+* Hardware Supported: Custom PCB using STM32F072
+* Hardware Availability: PCB gerbers available upon request (fredrikaxk@gmail.com)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make handwired/iso85k:via
+
+Flashing example for this keyboard:
+
+ make handwired/iso85k:via: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, while shorting the pins marked BOOT0
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
diff --git a/keyboards/handwired/iso85k/rules.mk b/keyboards/handwired/iso85k/rules.mk
new file mode 100644
index 00000000000..6e7633bfe01
--- /dev/null
+++ b/keyboards/handwired/iso85k/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
diff --git a/keyboards/handwired/riblee_split/config.h b/keyboards/handwired/riblee_split/config.h
new file mode 100644
index 00000000000..c3b0720ba5d
--- /dev/null
+++ b/keyboards/handwired/riblee_split/config.h
@@ -0,0 +1,11 @@
+// Copyright 2023 Daniel Reibl (@riblee)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+// If the pin is high, then the controller assumes it is the left hand, and if it’s low, it’s assumed to be the right side.
+#define SPLIT_HAND_PIN C15
+
+#define SERIAL_USART_FULL_DUPLEX
+#define SERIAL_USART_TX_PIN B6
+#define SERIAL_USART_RX_PIN B7
diff --git a/keyboards/handwired/riblee_split/halconf.h b/keyboards/handwired/riblee_split/halconf.h
new file mode 100644
index 00000000000..1d5c3fd700f
--- /dev/null
+++ b/keyboards/handwired/riblee_split/halconf.h
@@ -0,0 +1,8 @@
+// Copyright 2023 Daniel Reibl (@riblee)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define HAL_USE_SERIAL TRUE
+
+#include_next
diff --git a/keyboards/handwired/riblee_split/info.json b/keyboards/handwired/riblee_split/info.json
new file mode 100644
index 00000000000..49b5ca3a54f
--- /dev/null
+++ b/keyboards/handwired/riblee_split/info.json
@@ -0,0 +1,108 @@
+{
+ "manufacturer": "Riblee",
+ "keyboard_name": "Split",
+ "maintainer": "riblee",
+ "bootloader": "stm32-dfu",
+ "diode_direction": "ROW2COL",
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true
+ },
+ "matrix_pins": {
+ "cols": ["B10", "B1", "B0", "A7", "A6", "A5"],
+ "rows": ["A4", "A3", "A2", "A1", "A0"]
+ },
+ "development_board": "blackpill_f411",
+ "url": "",
+ "usb": {
+ "device_version": "1.0.0",
+ "vid": "0xFEED",
+ "pid": "0x2B2B"
+ },
+ "split": {
+ "enabled": true,
+ "transport": {
+ "sync_matrix_state": true
+ }
+ },
+ "community_layouts": ["ortho_5x12"],
+ "layouts": {
+ "LAYOUT_ortho_5x12": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+
+ {"matrix": [5, 0], "x": 7, "y": 0},
+ {"matrix": [5, 1], "x": 8, "y": 0},
+ {"matrix": [5, 2], "x": 9, "y": 0},
+ {"matrix": [5, 3], "x": 10, "y": 0},
+ {"matrix": [5, 4], "x": 11, "y": 0},
+ {"matrix": [5, 5], "x": 12, "y": 0},
+
+ {"matrix": [1, 0], "x": 0, "y": 1},
+ {"matrix": [1, 1], "x": 1, "y": 1},
+ {"matrix": [1, 2], "x": 2, "y": 1},
+ {"matrix": [1, 3], "x": 3, "y": 1},
+ {"matrix": [1, 4], "x": 4, "y": 1},
+ {"matrix": [1, 5], "x": 5, "y": 1},
+
+ {"matrix": [6, 0], "x": 7, "y": 1},
+ {"matrix": [6, 1], "x": 8, "y": 1},
+ {"matrix": [6, 2], "x": 9, "y": 1},
+ {"matrix": [6, 3], "x": 10, "y": 1},
+ {"matrix": [6, 4], "x": 11, "y": 1},
+ {"matrix": [6, 5], "x": 12, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2},
+ {"matrix": [2, 1], "x": 1, "y": 2},
+ {"matrix": [2, 2], "x": 2, "y": 2},
+ {"matrix": [2, 3], "x": 3, "y": 2},
+ {"matrix": [2, 4], "x": 4, "y": 2},
+ {"matrix": [2, 5], "x": 5, "y": 2},
+
+ {"matrix": [7, 0], "x": 7, "y": 2},
+ {"matrix": [7, 1], "x": 8, "y": 2},
+ {"matrix": [7, 2], "x": 9, "y": 2},
+ {"matrix": [7, 3], "x": 10, "y": 2},
+ {"matrix": [7, 4], "x": 11, "y": 2},
+ {"matrix": [7, 5], "x": 12, "y": 2},
+
+ {"matrix": [3, 0], "x": 0, "y": 3},
+ {"matrix": [3, 1], "x": 1, "y": 3},
+ {"matrix": [3, 2], "x": 2, "y": 3},
+ {"matrix": [3, 3], "x": 3, "y": 3},
+ {"matrix": [3, 4], "x": 4, "y": 3},
+ {"matrix": [3, 5], "x": 5, "y": 3},
+
+ {"matrix": [8, 0], "x": 7, "y": 3},
+ {"matrix": [8, 1], "x": 8, "y": 3},
+ {"matrix": [8, 2], "x": 9, "y": 3},
+ {"matrix": [8, 3], "x": 10, "y": 3},
+ {"matrix": [8, 4], "x": 11, "y": 3},
+ {"matrix": [8, 5], "x": 12, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4},
+ {"matrix": [4, 1], "x": 1, "y": 4},
+ {"matrix": [4, 2], "x": 2, "y": 4},
+ {"matrix": [4, 3], "x": 3, "y": 4},
+ {"matrix": [4, 4], "x": 4, "y": 4},
+ {"matrix": [4, 5], "x": 5, "y": 4},
+
+ {"matrix": [9, 0], "x": 7, "y": 4},
+ {"matrix": [9, 1], "x": 8, "y": 4},
+ {"matrix": [9, 2], "x": 9, "y": 4},
+ {"matrix": [9, 3], "x": 10, "y": 4},
+ {"matrix": [9, 4], "x": 11, "y": 4},
+ {"matrix": [9, 5], "x": 12, "y": 4}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/riblee_split/keymaps/default/keymap.c b/keyboards/handwired/riblee_split/keymaps/default/keymap.c
new file mode 100644
index 00000000000..f954599c90e
--- /dev/null
+++ b/keyboards/handwired/riblee_split/keymaps/default/keymap.c
@@ -0,0 +1,155 @@
+// Copyright 2023 Daniel Reibl (@riblee)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#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.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+enum layer_names {
+ _QWERTY,
+ _COLEMAK,
+ _DVORAK,
+ _LOWER,
+ _RAISE,
+ _ADJUST
+};
+
+enum custom_keycodes {
+ QWERTY = SAFE_RANGE,
+ COLEMAK,
+ DVORAK,
+ LOWER,
+ RAISE,
+ ADJUST,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /* Qwerty
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Tab | Q | W | E | R | T | Y | U | I | O | P | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | A | S | D | F | G | H | J | K | L | ; | " |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [_QWERTY] = LAYOUT_ortho_5x12(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, 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_DEL,
+ KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT ,
+ ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+ ),
+
+ /* Colemak
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | A | R | S | T | D | H | N | E | I | O | " |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [_COLEMAK] = LAYOUT_ortho_5x12(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
+ KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL,
+ KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT ,
+ ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+ ),
+
+ /* Dvorak
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Tab | " | , | . | P | Y | F | G | C | R | L | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | A | O | E | U | I | D | H | T | N | S | / |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [_DVORAK] = LAYOUT_ortho_5x12(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
+ KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL,
+ KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH,
+ KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT ,
+ ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+ ),
+
+ /* Lower
+ * ,-----------------------------------------------------------------------------------.
+ * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | | \ | | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | Home | End | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [_LOWER] = LAYOUT_ortho_5x12(
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC,
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL,
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE,
+ BL_STEP, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),KC_HOME,KC_END, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+ ),
+
+ /* Raise
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / |Pg Up |Pg Dn | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [_RAISE] = LAYOUT_ortho_5x12(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL,
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+ ),
+
+ /* Adjust (Lower + Raise)
+ * ,-----------------------------------------------------------------------------------.
+ * | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | Reset|RGB Tg|RGB Md|Hue Up|Hue Dn|Sat Up|Sat Dn|Val Up|Val Dn| | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | | | |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [_ADJUST] = LAYOUT_ortho_5x12(
+ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
+ _______, QK_BOOT, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, _______, KC_DEL,
+ _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+
+};
diff --git a/keyboards/handwired/riblee_split/mcuconf.h b/keyboards/handwired/riblee_split/mcuconf.h
new file mode 100644
index 00000000000..4ea061c7bf3
--- /dev/null
+++ b/keyboards/handwired/riblee_split/mcuconf.h
@@ -0,0 +1,7 @@
+// Copyright 2023 Daniel Reibl (@riblee)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include_next
+
+#undef STM32_SERIAL_USE_USART1
+#define STM32_SERIAL_USE_USART1 TRUE
diff --git a/keyboards/handwired/riblee_split/readme.md b/keyboards/handwired/riblee_split/readme.md
new file mode 100644
index 00000000000..b0acf5b3ba6
--- /dev/null
+++ b/keyboards/handwired/riblee_split/readme.md
@@ -0,0 +1,24 @@
+# Handwired Split
+
+This is a compact (12x5) ortholinear split keyboard.
+
+* Keyboard Maintainer: [Daniel Reibl](https://github.com/riblee)
+* Hardware Supported: STM32F411 BlackPill
+
+Make example for this keyboard (after setting up your build environment):
+
+ make handwired/riblee_split:default
+
+Flashing example for this keyboard:
+
+ make handwired/riblee_split: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
diff --git a/keyboards/handwired/riblee_split/rules.mk b/keyboards/handwired/riblee_split/rules.mk
new file mode 100644
index 00000000000..c6e29883213
--- /dev/null
+++ b/keyboards/handwired/riblee_split/rules.mk
@@ -0,0 +1 @@
+SERIAL_DRIVER = usart
diff --git a/keyboards/kaly/kaly42/config.h b/keyboards/kaly/kaly42/config.h
new file mode 100644
index 00000000000..e97f0a8aa45
--- /dev/null
+++ b/keyboards/kaly/kaly42/config.h
@@ -0,0 +1,9 @@
+// Copyright 2023 Kael Soares Augusto (@Dwctor)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define SERIAL_USART_FULL_DUPLEX // Enable full duplex operation mode.
+
+#define SERIAL_USART_TX_PIN B6 // USART TX pin
+#define SERIAL_USART_RX_PIN B7 // USART RX pin
diff --git a/keyboards/kaly/kaly42/halconf.h b/keyboards/kaly/kaly42/halconf.h
new file mode 100644
index 00000000000..7cbbf596103
--- /dev/null
+++ b/keyboards/kaly/kaly42/halconf.h
@@ -0,0 +1,7 @@
+// Copyright 2023 Kael Soares Augusto (@Dwctor)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define HAL_USE_SERIAL TRUE
+#include_next
diff --git a/keyboards/kaly/kaly42/info.json b/keyboards/kaly/kaly42/info.json
new file mode 100644
index 00000000000..38de4ccea50
--- /dev/null
+++ b/keyboards/kaly/kaly42/info.json
@@ -0,0 +1,93 @@
+{
+ "manufacturer": "Dwctor",
+ "keyboard_name": "kaly/kaly42",
+ "maintainer": "Dwctor",
+ "development_board": "blackpill_f401",
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true
+ },
+ "matrix_pins": {
+ "direct": [
+ ["B1", "B10", "A8", "B15", "B14", "B13"],
+ ["B9", "B8", "B5", "B4", "B3", "A15"],
+ ["A4", "A3", "A5", "A6", "A7", "B0"],
+ ["A2", "A1", "A0", "NO_PIN", "NO_PIN", "NO_PIN"]
+ ]
+ },
+ "split": {
+ "enabled": true,
+ "bootmagic": {
+ "matrix": [4, 5]
+ },
+ "matrix_pins": {
+ "right": {
+ "direct": [
+ ["B13", "B14", "B15", "A8", "B10", "B1"],
+ ["A15", "B3", "B4", "B5", "B8", "B9"],
+ ["B0", "A7", "A6", "A5", "A3", "A4"],
+ ["A0", "A1", "A2", "NO_PIN", "NO_PIN", "NO_PIN"]
+ ]
+ }
+ }
+ },
+ "url": "https://github.com/Dwctor/Kaly",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x0000",
+ "vid": "0xFEED"
+ },
+ "community_layouts": ["split_3x6_3"],
+ "layouts": {
+ "LAYOUT_split_3x6_3": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0.25},
+ {"matrix": [0, 1], "x": 1, "y": 0.25},
+ {"matrix": [0, 2], "x": 2, "y": 0.125},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0.125},
+ {"matrix": [0, 5], "x": 5, "y": 0.25},
+ {"matrix": [4, 0], "x": 8, "y": 0.25},
+ {"matrix": [4, 1], "x": 9, "y": 0.125},
+ {"matrix": [4, 2], "x": 10, "y": 0},
+ {"matrix": [4, 3], "x": 11, "y": 0.125},
+ {"matrix": [4, 4], "x": 12, "y": 0.25},
+ {"matrix": [4, 5], "x": 13, "y": 0.25},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.125},
+ {"matrix": [1, 3], "x": 3, "y": 1},
+ {"matrix": [1, 4], "x": 4, "y": 1.125},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [5, 0], "x": 8, "y": 1.25},
+ {"matrix": [5, 1], "x": 9, "y": 1.125},
+ {"matrix": [5, 2], "x": 10, "y": 1},
+ {"matrix": [5, 3], "x": 11, "y": 1.125},
+ {"matrix": [5, 4], "x": 12, "y": 1.25},
+ {"matrix": [5, 5], "x": 13, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25},
+ {"matrix": [2, 1], "x": 1, "y": 2.25},
+ {"matrix": [2, 2], "x": 2, "y": 2.125},
+ {"matrix": [2, 3], "x": 3, "y": 2},
+ {"matrix": [2, 4], "x": 4, "y": 2.125},
+ {"matrix": [2, 5], "x": 5, "y": 2.25},
+ {"matrix": [6, 0], "x": 8, "y": 2.25},
+ {"matrix": [6, 1], "x": 9, "y": 2.125},
+ {"matrix": [6, 2], "x": 10, "y": 2},
+ {"matrix": [6, 3], "x": 11, "y": 2.125},
+ {"matrix": [6, 4], "x": 12, "y": 2.25},
+ {"matrix": [6, 5], "x": 13, "y": 2.25},
+ {"matrix": [3, 0], "x": 3.5, "y": 3.25},
+ {"matrix": [3, 1], "x": 4.5, "y": 3.5},
+ {"matrix": [3, 2], "x": 5.5, "y": 3.75},
+ {"matrix": [7, 0], "x": 7.5, "y": 3.75},
+ {"matrix": [7, 1], "x": 8.5, "y": 3.5},
+ {"matrix": [7, 2], "x": 9.5, "y": 3.25}
+ ]
+ }
+ }
+}
diff --git a/keyboards/kaly/kaly42/keymaps/default/keymap.c b/keyboards/kaly/kaly42/keymaps/default/keymap.c
new file mode 100644
index 00000000000..54d46c54dbb
--- /dev/null
+++ b/keyboards/kaly/kaly42/keymaps/default/keymap.c
@@ -0,0 +1,27 @@
+// Copyright 2023 Kael Soares Augusto (@Dwctor)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /*
+ * ┌───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┬───┬───┬───┐
+ * │Tab│ Q │ W │ E │ R │ T │ │ Y │ U │ I │ O │ P │Bsp│
+ * ├───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┤
+ * │Ctl│ A │ S │ D │ F │ G │ │ H │ J │ K │ L │ ; │ ' │
+ * ├───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┤
+ * │Sft│ Z │ X │ C │ V │ B │ │ N │ M │ , │ . │ / │Sft│
+ * └───┴───┴───┴───┴───┴───┘ └───┴───┴───┴───┴───┴───┘
+ * ┌───┐ ┌───┐
+ * │GUI├───┐ ┌───┤Alt│
+ * └───┤Bsp├───┐ ┌───┤Ent├───┘
+ * └───┤ │ │ ├───┘
+ * └───┘ └───┘
+ */
+ [0] = LAYOUT_split_3x6_3(
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
+ KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ 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_LGUI, KC_BSPC, KC_SPC, KC_SPC, KC_ENT, KC_RALT
+ )
+};
diff --git a/keyboards/kaly/kaly42/mcuconf.h b/keyboards/kaly/kaly42/mcuconf.h
new file mode 100644
index 00000000000..6db1e6072a6
--- /dev/null
+++ b/keyboards/kaly/kaly42/mcuconf.h
@@ -0,0 +1,10 @@
+// Copyright 2023 Kael Soares Augusto (@Dwctor)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include_next
+
+#undef STM32_SERIAL_USE_USART1
+
+#define STM32_SERIAL_USE_USART1 TRUE
diff --git a/keyboards/kaly/kaly42/readme.md b/keyboards/kaly/kaly42/readme.md
new file mode 100644
index 00000000000..d3b0ff7a3d5
--- /dev/null
+++ b/keyboards/kaly/kaly42/readme.md
@@ -0,0 +1,27 @@
+# kaly/kaly42
+
+
+
+The Kaly is a split, ergonomic keyboard inspired by the [Ferris](https://github.com/pierrechevalier83/ferris) and the [Cantor](https://github.com/diepala/cantor) with the main goals of comfort, affordability and cuteness! The stand-out features of the Kaly is the ease-to-solder and the natural thumb cluster that allow users to confortably reach all keys of the keyboard! To see more of the Kaly, visit [this video](https://www.youtube.com/watch?v=PhxM8o__9Xo) outlining the journey of making this keybord.
+
+* Keyboard Maintainer: [Kael Soares Augusto](https://github.com/Dwctor)
+* Hardware Supported: Blackpill STM32F401
+* Hardware Availability: [https://github.com/Dwctor/Kaly](https://github.com/Dwctor/Kaly)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make kaly/kaly42:default
+
+Flashing example for this keyboard:
+
+ make kaly/kaly42: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
diff --git a/keyboards/kaly/kaly42/rules.mk b/keyboards/kaly/kaly42/rules.mk
new file mode 100644
index 00000000000..c6e29883213
--- /dev/null
+++ b/keyboards/kaly/kaly42/rules.mk
@@ -0,0 +1 @@
+SERIAL_DRIVER = usart
diff --git a/keyboards/kelwin/utopia88/info.json b/keyboards/kelwin/utopia88/info.json
new file mode 100644
index 00000000000..406642d41c7
--- /dev/null
+++ b/keyboards/kelwin/utopia88/info.json
@@ -0,0 +1,131 @@
+{
+ "keyboard_name": "Utopia88",
+ "manufacturer": "Kelwin Studio",
+ "maintainer": "Kelwin Studio",
+ "bootloader": "atmel-dfu",
+ "build": {
+ "lto": true
+ },
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": false,
+ "nkro": true
+ },
+ "indicators": {
+ "caps_lock": "B0"
+ },
+ "matrix_pins": {
+ "cols": ["E6", "F0", "F1", "F4", "F5", "F6", "F7", "C7", "C6", "B6", "B5", "B4", "D7", "D6", "D4", "B2", "B3", "B1"],
+ "rows": ["B7", "D5", "D3", "D2", "D1", "D0"]
+ },
+ "processor": "atmega32u4",
+ "url": "",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x0001",
+ "vid": "0x4B53"
+ },
+ "community_layouts": ["tkl_f13_ansi_tsangan"],
+ "layouts": {
+ "LAYOUT_tkl_f13_ansi_tsangan": {
+ "layout": [
+ {"matrix":[0,0], "x":0, "y":0},
+ {"matrix":[0,1], "x":1.25, "y":0},
+ {"matrix":[0,2], "x":2.25, "y":0},
+ {"matrix":[0,3], "x":3.25, "y":0},
+ {"matrix":[0,4], "x":4.25, "y":0},
+ {"matrix":[0,6], "x":5.5, "y":0},
+ {"matrix":[0,7], "x":6.5, "y":0},
+ {"matrix":[0,8], "x":7.5, "y":0},
+ {"matrix":[0,9], "x":8.5, "y":0},
+ {"matrix":[0,10], "x":9.75, "y":0},
+ {"matrix":[0,11], "x":10.75, "y":0},
+ {"matrix":[0,12], "x":11.75, "y":0},
+ {"matrix":[0,13], "x":12.75, "y":0},
+ {"matrix":[0,14], "x":14, "y":0},
+ {"matrix":[0,15], "x":15.25, "y":0},
+ {"matrix":[0,16], "x":16.25, "y":0},
+ {"matrix":[0,17], "x":17.25, "y":0},
+
+ {"matrix":[1,0], "x":0, "y":1.25},
+ {"matrix":[1,1], "x":1, "y":1.25},
+ {"matrix":[1,2], "x":2, "y":1.25},
+ {"matrix":[1,3], "x":3, "y":1.25},
+ {"matrix":[1,4], "x":4, "y":1.25},
+ {"matrix":[1,5], "x":5, "y":1.25},
+ {"matrix":[1,6], "x":6, "y":1.25},
+ {"matrix":[1,7], "x":7, "y":1.25},
+ {"matrix":[1,8], "x":8, "y":1.25},
+ {"matrix":[1,9], "x":9, "y":1.25},
+ {"matrix":[1,10], "x":10, "y":1.25},
+ {"matrix":[1,11], "x":11, "y":1.25},
+ {"matrix":[1,12], "x":12, "y":1.25},
+ {"matrix":[1,14], "x":13, "y":1.25, "w":2},
+ {"matrix":[1,15], "x":15.25, "y":1.25},
+ {"matrix":[1,16], "x":16.25, "y":1.25},
+ {"matrix":[1,17], "x":17.25, "y":1.25},
+
+ {"matrix":[2,0], "x":0, "y":2.25, "w":1.5},
+ {"matrix":[2,2], "x":1.5, "y":2.25},
+ {"matrix":[2,3], "x":2.5, "y":2.25},
+ {"matrix":[2,4], "x":3.5, "y":2.25},
+ {"matrix":[2,5], "x":4.5, "y":2.25},
+ {"matrix":[2,6], "x":5.5, "y":2.25},
+ {"matrix":[2,7], "x":6.5, "y":2.25},
+ {"matrix":[2,8], "x":7.5, "y":2.25},
+ {"matrix":[2,9], "x":8.5, "y":2.25},
+ {"matrix":[2,10], "x":9.5, "y":2.25},
+ {"matrix":[2,11], "x":10.5, "y":2.25},
+ {"matrix":[2,12], "x":11.5, "y":2.25},
+ {"matrix":[2,13], "x":12.5, "y":2.25},
+ {"matrix":[2,14], "x":13.5, "y":2.25, "w":1.5},
+ {"matrix":[2,15], "x":15.25, "y":2.25},
+ {"matrix":[2,16], "x":16.25, "y":2.25},
+ {"matrix":[2,17], "x":17.25, "y":2.25},
+
+ {"matrix":[3,0], "x":0, "y":3.25, "w":1.75},
+ {"matrix":[3,2], "x":1.75, "y":3.25},
+ {"matrix":[3,3], "x":2.75, "y":3.25},
+ {"matrix":[3,4], "x":3.75, "y":3.25},
+ {"matrix":[3,5], "x":4.75, "y":3.25},
+ {"matrix":[3,6], "x":5.75, "y":3.25},
+ {"matrix":[3,7], "x":6.75, "y":3.25},
+ {"matrix":[3,8], "x":7.75, "y":3.25},
+ {"matrix":[3,9], "x":8.75, "y":3.25},
+ {"matrix":[3,10], "x":9.75, "y":3.25},
+ {"matrix":[3,11], "x":10.75, "y":3.25},
+ {"matrix":[3,12], "x":11.75, "y":3.25},
+ {"matrix":[3,13], "x":12.75, "y":3.25, "w":2.25},
+ {"matrix":[4,1], "x":0, "y":4.25, "w":2.25},
+ {"matrix":[4,2], "x":2.25, "y":4.25},
+ {"matrix":[4,3], "x":3.25, "y":4.25},
+ {"matrix":[4,4], "x":4.25, "y":4.25},
+ {"matrix":[4,5], "x":5.25, "y":4.25},
+ {"matrix":[4,6], "x":6.25, "y":4.25},
+ {"matrix":[4,7], "x":7.25, "y":4.25},
+ {"matrix":[4,8], "x":8.25, "y":4.25},
+ {"matrix":[4,9], "x":9.25, "y":4.25},
+ {"matrix":[4,10], "x":10.25, "y":4.25},
+ {"matrix":[4,11], "x":11.25, "y":4.25},
+ {"matrix":[4,13], "x":12.25, "y":4.25, "w":2.75},
+ {"matrix":[4,16], "x":16.25, "y":4.25},
+
+ {"matrix":[5,0], "x":0, "y":5.25, "w":1.5},
+ {"matrix":[5,2], "x":1.5, "y":5.25},
+ {"matrix":[5,3], "x":2.5, "y":5.25, "w":1.5},
+ {"matrix":[5,7], "x":4, "y":5.25, "w":7},
+ {"matrix":[5,11], "x":11, "y":5.25, "w":1.5},
+ {"matrix":[5,13], "x":12.5, "y":5.25},
+ {"matrix":[5,14], "x":13.5, "y":5.25, "w":1.5},
+ {"matrix":[5,15], "x":15.25, "y":5.25},
+ {"matrix":[5,16], "x":16.25, "y":5.25},
+ {"matrix":[5,17], "x":17.25, "y":5.25}
+ ]
+ }
+ }
+}
+
\ No newline at end of file
diff --git a/keyboards/kelwin/utopia88/keymaps/default/keymap.c b/keyboards/kelwin/utopia88/keymaps/default/keymap.c
new file mode 100644
index 00000000000..d7afaf0877a
--- /dev/null
+++ b/keyboards/kelwin/utopia88/keymaps/default/keymap.c
@@ -0,0 +1,36 @@
+/* Copyright 2023 kelwin
+ *
+ * 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 .
+ */
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_tkl_f13_ansi_tsangan(
+ 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_NO, 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, MO(1), KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [1] = LAYOUT_tkl_f13_ansi_tsangan(
+ QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+};
diff --git a/keyboards/kelwin/utopia88/keymaps/via/keymap.c b/keyboards/kelwin/utopia88/keymaps/via/keymap.c
new file mode 100644
index 00000000000..d7afaf0877a
--- /dev/null
+++ b/keyboards/kelwin/utopia88/keymaps/via/keymap.c
@@ -0,0 +1,36 @@
+/* Copyright 2023 kelwin
+ *
+ * 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 .
+ */
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_tkl_f13_ansi_tsangan(
+ 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_NO, 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, MO(1), KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [1] = LAYOUT_tkl_f13_ansi_tsangan(
+ QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+};
diff --git a/keyboards/kelwin/utopia88/keymaps/via/rules.mk b/keyboards/kelwin/utopia88/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/kelwin/utopia88/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/kelwin/utopia88/readme.md b/keyboards/kelwin/utopia88/readme.md
new file mode 100644
index 00000000000..f34e3540ec8
--- /dev/null
+++ b/keyboards/kelwin/utopia88/readme.md
@@ -0,0 +1,25 @@
+# Utopia88
+
+
+
+* Keyboard Maintainer: [kelwin](https://github.com/Kelwin0313)
+* Hardware Supported: Utopia88 PCBs, atmega32u4
+* Hardware Availability: Private Group-Buy
+
+Make example for this keyboard (after setting up your build environment):
+
+ make kelwin/utopia88:default
+
+Flashing example for this keyboard:
+
+ make kelwin/utopia88: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
diff --git a/keyboards/kelwin/utopia88/rules.mk b/keyboards/kelwin/utopia88/rules.mk
new file mode 100644
index 00000000000..6e7633bfe01
--- /dev/null
+++ b/keyboards/kelwin/utopia88/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
diff --git a/keyboards/kindakeyboards/conone65/keymaps/default/keymap.c b/keyboards/kindakeyboards/conone65/keymaps/default/keymap.c
index a3cf3191611..4c0d09aa3a0 100644
--- a/keyboards/kindakeyboards/conone65/keymaps/default/keymap.c
+++ b/keyboards/kindakeyboards/conone65/keymaps/default/keymap.c
@@ -35,5 +35,5 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
- ),
+ )
};
diff --git a/keyboards/kindakeyboards/conone65/keymaps/default/readme.md b/keyboards/kindakeyboards/conone65/keymaps/default/readme.md
deleted file mode 100644
index 2f161963477..00000000000
--- a/keyboards/kindakeyboards/conone65/keymaps/default/readme.md
+++ /dev/null
@@ -1 +0,0 @@
-# The default keymap for Conone 65
diff --git a/keyboards/kindakeyboards/conone65/keymaps/via/keymap.c b/keyboards/kindakeyboards/conone65/keymaps/via/keymap.c
new file mode 100644
index 00000000000..a70f5041840
--- /dev/null
+++ b/keyboards/kindakeyboards/conone65/keymaps/via/keymap.c
@@ -0,0 +1,39 @@
+/* Copyright 2023 Matt Chan
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+// Defines names for use in layer keycodes and the keymap
+enum layer_names {
+ _BASE,
+ _FN
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_BASE] = LAYOUT_all(
+ QK_GESC, 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_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_PGUP,
+ 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_BSLS, KC_ENT, KC_PGDN,
+ 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_UP, KC_END,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_APP, MO(1), KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [_FN] = LAYOUT_all(
+ 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_DEL, KC_DEL, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+};
diff --git a/keyboards/kindakeyboards/conone65/keymaps/via/rules.mk b/keyboards/kindakeyboards/conone65/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/kindakeyboards/conone65/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/kindakeyboards/conone65/readme.md b/keyboards/kindakeyboards/conone65/readme.md
index f3429142dca..d0694fcc03b 100644
--- a/keyboards/kindakeyboards/conone65/readme.md
+++ b/keyboards/kindakeyboards/conone65/readme.md
@@ -1,10 +1,12 @@
# Conone 65
+
+
The Conone 65 is a custom keyboard designed and machined in Belgium.
-* Keyboard Maintainer: [Evyd13](https://github.com/evyd13)
-* Hardware Supported: Conone 65 PCB
-* Hardware Availability: [Group buy](https://forms.gle/nEFTxzBxy4KDm3nG8)
+* Keyboard Maintainer: [Evyd13](https://github.com/evyd13), [Matt Chan](https://github.com/mattchan)
+* Hardware Supported: Conone 65 PCB, ATMega32u4
+* Hardware Availability: https://www.kindakeyboards.be/conone65
Make example for this keyboard (after setting up your build environment):
@@ -15,3 +17,11 @@ Flashing example for this keyboard:
make kindakeyboards/conone65: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
\ No newline at end of file
diff --git a/keyboards/kwstudio/pisces/info.json b/keyboards/kwstudio/pisces/info.json
new file mode 100644
index 00000000000..48f4e6a4f66
--- /dev/null
+++ b/keyboards/kwstudio/pisces/info.json
@@ -0,0 +1,127 @@
+{
+ "keyboard_name": "Pisces",
+ "manufacturer": "kws",
+ "maintainer": "kws",
+ "bootloader": "atmel-dfu",
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true
+ },
+ "indicators": {
+ "caps_lock": "B0"
+ },
+ "matrix_pins": {
+ "cols": ["E6", "F0", "F1", "F4", "F5", "F6", "F7", "C7", "C6", "B6", "B5", "B4", "D7", "D6", "D4", "B2", "B3", "B1"],
+ "rows": ["B7", "D5", "D3", "D2", "D1", "D0"]
+ },
+ "processor": "atmega32u4",
+ "url": "",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x0001",
+ "vid": "0x4B53"
+ },
+ "community_layouts": ["tkl_f13_ansi_tsangan"],
+ "layouts": {
+ "LAYOUT_tkl_f13_ansi_tsangan": {
+ "layout": [
+ {"matrix":[0,0], "x":0, "y":0},
+ {"matrix":[0,1], "x":1.25, "y":0},
+ {"matrix":[0,2], "x":2.25, "y":0},
+ {"matrix":[0,3], "x":3.25, "y":0},
+ {"matrix":[0,4], "x":4.25, "y":0},
+ {"matrix":[0,6], "x":5.5, "y":0},
+ {"matrix":[0,7], "x":6.5, "y":0},
+ {"matrix":[0,8], "x":7.5, "y":0},
+ {"matrix":[0,9], "x":8.5, "y":0},
+ {"matrix":[0,10], "x":9.75, "y":0},
+ {"matrix":[0,11], "x":10.75, "y":0},
+ {"matrix":[0,12], "x":11.75, "y":0},
+ {"matrix":[0,13], "x":12.75, "y":0},
+ {"matrix":[0,14], "x":14, "y":0},
+ {"matrix":[0,15], "x":15.25, "y":0},
+ {"matrix":[0,16], "x":16.25, "y":0},
+ {"matrix":[0,17], "x":17.25, "y":0},
+
+ {"matrix":[1,0], "x":0, "y":1.25},
+ {"matrix":[1,1], "x":1, "y":1.25},
+ {"matrix":[1,2], "x":2, "y":1.25},
+ {"matrix":[1,3], "x":3, "y":1.25},
+ {"matrix":[1,4], "x":4, "y":1.25},
+ {"matrix":[1,5], "x":5, "y":1.25},
+ {"matrix":[1,6], "x":6, "y":1.25},
+ {"matrix":[1,7], "x":7, "y":1.25},
+ {"matrix":[1,8], "x":8, "y":1.25},
+ {"matrix":[1,9], "x":9, "y":1.25},
+ {"matrix":[1,10], "x":10, "y":1.25},
+ {"matrix":[1,11], "x":11, "y":1.25},
+ {"matrix":[1,12], "x":12, "y":1.25},
+ {"matrix":[1,14], "x":13, "y":1.25, "w":2},
+ {"matrix":[1,15], "x":15.25, "y":1.25},
+ {"matrix":[1,16], "x":16.25, "y":1.25},
+ {"matrix":[1,17], "x":17.25, "y":1.25},
+
+ {"matrix":[2,0], "x":0, "y":2.25, "w":1.5},
+ {"matrix":[2,2], "x":1.5, "y":2.25},
+ {"matrix":[2,3], "x":2.5, "y":2.25},
+ {"matrix":[2,4], "x":3.5, "y":2.25},
+ {"matrix":[2,5], "x":4.5, "y":2.25},
+ {"matrix":[2,6], "x":5.5, "y":2.25},
+ {"matrix":[2,7], "x":6.5, "y":2.25},
+ {"matrix":[2,8], "x":7.5, "y":2.25},
+ {"matrix":[2,9], "x":8.5, "y":2.25},
+ {"matrix":[2,10], "x":9.5, "y":2.25},
+ {"matrix":[2,11], "x":10.5, "y":2.25},
+ {"matrix":[2,12], "x":11.5, "y":2.25},
+ {"matrix":[2,13], "x":12.5, "y":2.25},
+ {"matrix":[2,14], "x":13.5, "y":2.25, "w":1.5},
+ {"matrix":[2,15], "x":15.25, "y":2.25},
+ {"matrix":[2,16], "x":16.25, "y":2.25},
+ {"matrix":[2,17], "x":17.25, "y":2.25},
+
+ {"matrix":[3,0], "x":0, "y":3.25, "w":1.75},
+ {"matrix":[3,2], "x":1.75, "y":3.25},
+ {"matrix":[3,3], "x":2.75, "y":3.25},
+ {"matrix":[3,4], "x":3.75, "y":3.25},
+ {"matrix":[3,5], "x":4.75, "y":3.25},
+ {"matrix":[3,6], "x":5.75, "y":3.25},
+ {"matrix":[3,7], "x":6.75, "y":3.25},
+ {"matrix":[3,8], "x":7.75, "y":3.25},
+ {"matrix":[3,9], "x":8.75, "y":3.25},
+ {"matrix":[3,10], "x":9.75, "y":3.25},
+ {"matrix":[3,11], "x":10.75, "y":3.25},
+ {"matrix":[3,12], "x":11.75, "y":3.25},
+ {"matrix":[3,13], "x":12.75, "y":3.25, "w":2.25},
+ {"matrix":[4,1], "x":0, "y":4.25, "w":2.25},
+ {"matrix":[4,2], "x":2.25, "y":4.25},
+ {"matrix":[4,3], "x":3.25, "y":4.25},
+ {"matrix":[4,4], "x":4.25, "y":4.25},
+ {"matrix":[4,5], "x":5.25, "y":4.25},
+ {"matrix":[4,6], "x":6.25, "y":4.25},
+ {"matrix":[4,7], "x":7.25, "y":4.25},
+ {"matrix":[4,8], "x":8.25, "y":4.25},
+ {"matrix":[4,9], "x":9.25, "y":4.25},
+ {"matrix":[4,10], "x":10.25, "y":4.25},
+ {"matrix":[4,11], "x":11.25, "y":4.25},
+ {"matrix":[4,13], "x":12.25, "y":4.25, "w":2.75},
+ {"matrix":[4,16], "x":16.25, "y":4.25},
+
+ {"matrix":[5,0], "x":0, "y":5.25, "w":1.5},
+ {"matrix":[5,2], "x":1.5, "y":5.25},
+ {"matrix":[5,3], "x":2.5, "y":5.25, "w":1.5},
+ {"matrix":[5,7], "x":4, "y":5.25, "w":7},
+ {"matrix":[5,11], "x":11, "y":5.25, "w":1.5},
+ {"matrix":[5,13], "x":12.5, "y":5.25},
+ {"matrix":[5,14], "x":13.5, "y":5.25, "w":1.5},
+ {"matrix":[5,15], "x":15.25, "y":5.25},
+ {"matrix":[5,16], "x":16.25, "y":5.25},
+ {"matrix":[5,17], "x":17.25, "y":5.25}
+ ]
+ }
+ }
+}
diff --git a/keyboards/kwstudio/pisces/keymaps/default/keymap.c b/keyboards/kwstudio/pisces/keymaps/default/keymap.c
new file mode 100644
index 00000000000..6b20a3aa900
--- /dev/null
+++ b/keyboards/kwstudio/pisces/keymaps/default/keymap.c
@@ -0,0 +1,36 @@
+/* Copyright 2023 kwstudio
+ *
+ * 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 .
+ */
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_tkl_f13_ansi_tsangan(
+ 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_NO, 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(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [1] = LAYOUT_tkl_f13_ansi_tsangan(
+ QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+};
diff --git a/keyboards/kwstudio/pisces/keymaps/via/keymap.c b/keyboards/kwstudio/pisces/keymaps/via/keymap.c
new file mode 100644
index 00000000000..6b20a3aa900
--- /dev/null
+++ b/keyboards/kwstudio/pisces/keymaps/via/keymap.c
@@ -0,0 +1,36 @@
+/* Copyright 2023 kwstudio
+ *
+ * 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 .
+ */
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_tkl_f13_ansi_tsangan(
+ 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_NO, 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(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [1] = LAYOUT_tkl_f13_ansi_tsangan(
+ QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+};
diff --git a/keyboards/kwstudio/pisces/keymaps/via/rules.mk b/keyboards/kwstudio/pisces/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/kwstudio/pisces/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/kwstudio/pisces/readme.md b/keyboards/kwstudio/pisces/readme.md
new file mode 100644
index 00000000000..29cf8ebf5c4
--- /dev/null
+++ b/keyboards/kwstudio/pisces/readme.md
@@ -0,0 +1,25 @@
+# Pisces
+
+
+
+* Keyboard Maintainer: [khchen](https://github.com/khchen2004)
+* Hardware Supported: Pisces PCB
+* Hardware Availability: Private GB
+
+Make example for this keyboard (after setting up your build environment):
+
+ make kwstudio/pisces:default
+
+Flashing example for this keyboard:
+
+ make kwstudio/pisces: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
diff --git a/keyboards/kwstudio/pisces/rules.mk b/keyboards/kwstudio/pisces/rules.mk
new file mode 100644
index 00000000000..6e7633bfe01
--- /dev/null
+++ b/keyboards/kwstudio/pisces/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
diff --git a/keyboards/lgbtkl/info.json b/keyboards/lgbtkl/info.json
new file mode 100644
index 00000000000..a3f126e8620
--- /dev/null
+++ b/keyboards/lgbtkl/info.json
@@ -0,0 +1,111 @@
+{
+ "manufacturer": "queertykeys",
+ "keyboard_name": "lgbtkl",
+ "maintainer": "ojthetiny",
+ "processor": "STM32F072",
+ "bootloader": "stm32-dfu",
+ "usb": {
+ "vid": "0x6F6A",
+ "pid": "0x4C54",
+ "device_version": "1.0.0"
+ },
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true
+ },
+ "diode_direction": "COL2ROW",
+ "matrix_pins": {
+ "rows": ["C10", "A15", "A5", "C1", "C2"],
+ "cols": ["C8", "C7", "C6", "B15", "B14", "B13", "B12", "B11", "B10", "B2", "B1", "B0", "C5", "C4", "A7", "A6", "C3", "C14", "C13"]
+ },
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ { "matrix": [0, 0], "x": 0, "y": 0 },
+ { "matrix": [0, 1], "x": 1.25, "y": 0 },
+ { "matrix": [0, 2], "x": 2.25, "y": 0 },
+ { "matrix": [0, 3], "x": 3.25, "y": 0 },
+ { "matrix": [0, 4], "x": 4.25, "y": 0 },
+ { "matrix": [0, 5], "x": 5.25, "y": 0 },
+ { "matrix": [0, 6], "x": 6.25, "y": 0 },
+ { "matrix": [0, 7], "x": 7.25, "y": 0 },
+ { "matrix": [0, 8], "x": 8.25, "y": 0 },
+ { "matrix": [0, 9], "x": 9.25, "y": 0 },
+ { "matrix": [0, 10], "x": 10.25, "y": 0 },
+ { "matrix": [0, 11], "x": 11.25, "y": 0 },
+ { "matrix": [0, 12], "x": 12.25, "y": 0 },
+ { "matrix": [0, 13], "x": 13.25, "y": 0 },
+ { "matrix": [0, 14], "x": 14.25, "y": 0 },
+ { "matrix": [0, 15], "x": 15.25, "y": 0 },
+ { "matrix": [0, 16], "x": 16.5, "y": 0 },
+ { "matrix": [0, 17], "x": 17.5, "y": 0 },
+ { "matrix": [0, 18], "x": 18.5, "y": 0 },
+ { "matrix": [1, 0], "x": 0, "y": 1 },
+ { "matrix": [1, 1], "w": 1.5, "x": 1.25, "y": 1 },
+ { "matrix": [1, 2], "x": 2.75, "y": 1 },
+ { "matrix": [1, 3], "x": 3.75, "y": 1 },
+ { "matrix": [1, 4], "x": 4.75, "y": 1 },
+ { "matrix": [1, 5], "x": 5.75, "y": 1 },
+ { "matrix": [1, 6], "x": 6.75, "y": 1 },
+ { "matrix": [1, 7], "x": 7.75, "y": 1 },
+ { "matrix": [1, 8], "x": 8.75, "y": 1 },
+ { "matrix": [1, 9], "x": 9.75, "y": 1 },
+ { "matrix": [1, 10], "x": 10.75, "y": 1 },
+ { "matrix": [1, 11], "x": 11.75, "y": 1 },
+ { "matrix": [1, 12], "x": 12.75, "y": 1 },
+ { "matrix": [1, 13], "x": 13.75, "y": 1 },
+ { "matrix": [1, 15], "w": 1.5, "x": 14.75, "y": 1 },
+ { "matrix": [1, 16], "x": 16.5, "y": 1 },
+ { "matrix": [1, 17], "x": 17.5, "y": 1 },
+ { "matrix": [1, 18], "x": 18.5, "y": 1 },
+ { "matrix": [2, 0], "x": 0, "y": 2 },
+ { "matrix": [2, 1], "w": 1.75, "x": 1.25, "y": 2 },
+ { "matrix": [2, 2], "x": 3, "y": 2 },
+ { "matrix": [2, 3], "x": 4, "y": 2 },
+ { "matrix": [2, 4], "x": 5, "y": 2 },
+ { "matrix": [2, 5], "x": 6, "y": 2 },
+ { "matrix": [2, 6], "x": 7, "y": 2 },
+ { "matrix": [2, 7], "x": 8, "y": 2 },
+ { "matrix": [2, 8], "x": 9, "y": 2 },
+ { "matrix": [2, 9], "x": 10, "y": 2 },
+ { "matrix": [2, 10], "x": 11, "y": 2 },
+ { "matrix": [2, 11], "x": 12, "y": 2 },
+ { "matrix": [2, 12], "x": 13, "y": 2 },
+ { "matrix": [2, 14], "w": 2.25, "x": 14, "y": 2 },
+ { "matrix": [3, 0], "x": 0, "y": 3 },
+ { "matrix": [3, 1], "w": 2.25, "x": 1.25, "y": 3 },
+ { "matrix": [3, 2], "x": 3.5, "y": 3 },
+ { "matrix": [3, 3], "x": 4.5, "y": 3 },
+ { "matrix": [3, 4], "x": 5.5, "y": 3 },
+ { "matrix": [3, 5], "x": 6.5, "y": 3 },
+ { "matrix": [3, 6], "x": 7.5, "y": 3 },
+ { "matrix": [3, 7], "x": 8.5, "y": 3 },
+ { "matrix": [3, 8], "x": 9.5, "y": 3 },
+ { "matrix": [3, 9], "x": 10.5, "y": 3 },
+ { "matrix": [3, 10], "x": 11.5, "y": 3 },
+ { "matrix": [3, 11], "x": 12.5, "y": 3 },
+ { "matrix": [3, 13], "w": 1.75, "x": 13.5, "y": 3 },
+ { "matrix": [3, 14], "w": 2.75, "x": 13.5, "y": 3 },
+ { "matrix": [3, 15], "x": 15.25, "y": 3 },
+ { "matrix": [3, 17], "x": 17.5, "y": 3 },
+ { "matrix": [4, 0], "x": 0, "y": 4 },
+ { "matrix": [4, 1], "w": 1.5, "x": 1.25, "y": 4 },
+ { "matrix": [4, 2], "x": 2.75, "y": 4 },
+ { "matrix": [4, 3], "w": 1.5, "x": 3.75, "y": 4 },
+ { "matrix": [4, 5], "w": 3, "x": 5.25, "y": 4 },
+ { "matrix": [4, 7], "x": 8.25, "y": 4 },
+ { "matrix": [4, 9], "w": 3, "x": 9.25, "y": 4 },
+ { "matrix": [4, 11], "w": 1.5, "x": 12.25, "y": 4 },
+ { "matrix": [4, 13], "x": 13.75, "y": 4 },
+ { "matrix": [4, 15], "w": 1.5, "x": 14.75, "y": 4 },
+ { "matrix": [4, 16], "x": 16.5, "y": 4 },
+ { "matrix": [4, 17], "x": 17.5, "y": 4 },
+ { "matrix": [4, 18], "x": 18.5, "y": 4 }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/keyboards/lgbtkl/keymaps/default/keymap.c b/keyboards/lgbtkl/keymaps/default/keymap.c
new file mode 100644
index 00000000000..01dcedcc18d
--- /dev/null
+++ b/keyboards/lgbtkl/keymaps/default/keymap.c
@@ -0,0 +1,37 @@
+/* Copyright 2023 ojthetiny
+ *
+ * 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 .
+ */
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT(
+ KC_F1, 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_GRV, KC_BSLS, KC_INS, KC_HOME, KC_PGUP,
+ KC_F2, 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_BSPC, KC_DEL, KC_END, KC_PGDN,
+ KC_F3, 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_F4, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, XXXXXXX, MO(1), KC_UP,
+ KC_F5, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ [1] = LAYOUT(
+ XXXXXXX, XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX,
+ QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+ ),
+
+};
diff --git a/keyboards/lgbtkl/keymaps/via/keymap.c b/keyboards/lgbtkl/keymaps/via/keymap.c
new file mode 100644
index 00000000000..2fc44ae8cc0
--- /dev/null
+++ b/keyboards/lgbtkl/keymaps/via/keymap.c
@@ -0,0 +1,38 @@
+/* Copyright 2023 ojthetiny
+ *
+ * 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 .
+ */
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT(
+ KC_F1, 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_GRV, KC_BSLS, KC_INS, KC_HOME, KC_PGUP,
+ KC_F2, 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_BSPC, KC_DEL, KC_END, KC_PGDN,
+ KC_F3, 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_F4, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, XXXXXXX, MO(1), KC_UP,
+ KC_F5, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ [1] = LAYOUT(
+ XXXXXXX, XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX,
+ QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+ ),
+
+
+};
diff --git a/keyboards/lgbtkl/keymaps/via/rules.mk b/keyboards/lgbtkl/keymaps/via/rules.mk
new file mode 100644
index 00000000000..036bd6d1c3e
--- /dev/null
+++ b/keyboards/lgbtkl/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/lgbtkl/readme.md b/keyboards/lgbtkl/readme.md
new file mode 100644
index 00000000000..cd6f94b6e97
--- /dev/null
+++ b/keyboards/lgbtkl/readme.md
@@ -0,0 +1,26 @@
+# LGBTKL
+
+LGBTKL keyboard by Queertykeys
+
+* Keyboard Maintainer: [Liv](https://github.com/ojthetiny)
+* Hardware Supported: LGBTKL
+* Hardware Availability: Private GB
+
+
+Make example for this keyboard (after setting up your build environment):
+
+ make lgbtkl:default
+
+Flashing example for this keyboard:
+
+ make lgbtkl: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 using one of the following methods:
+
+* **Bootmagic reset**: Hold the F1 key while connecting the USB cable
+* **Physical reset button**: Hold the button labeled 'B/R' for a while to enter bootloader.
+* **Keycode in layout**: In the case of the default keymap, use the key combination Fn + F5
\ No newline at end of file
diff --git a/keyboards/lgbtkl/rules.mk b/keyboards/lgbtkl/rules.mk
new file mode 100644
index 00000000000..7ff128fa692
--- /dev/null
+++ b/keyboards/lgbtkl/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
\ No newline at end of file
diff --git a/keyboards/lily58/lib/layer_state_reader.c b/keyboards/lily58/lib/layer_state_reader.c
index ffc2c4e2c67..69b46130931 100644
--- a/keyboards/lily58/lib/layer_state_reader.c
+++ b/keyboards/lily58/lib/layer_state_reader.c
@@ -13,7 +13,7 @@ const char *read_layer_state(void) {
switch (layer_state)
{
case L_BASE:
- snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Default");
+ snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Base");
break;
case L_RAISE:
snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Raise");
diff --git a/keyboards/lucid/velvet_hotswap/info.json b/keyboards/lucid/velvet_hotswap/info.json
index 2cbecb782d8..4fa4ad46987 100644
--- a/keyboards/lucid/velvet_hotswap/info.json
+++ b/keyboards/lucid/velvet_hotswap/info.json
@@ -4,7 +4,7 @@
"url": "http://www.makerkeyboards.com",
"maintainer": "Maker Keyboards",
"usb": {
- "device_version": "1.0.0",
+ "device_version": "1.0.1",
"pid": "0x0008",
"vid": "0x7667"
},
@@ -14,9 +14,6 @@
"rows": ["B4", "B5", "B6", "C0", "E1", "E0"]
},
"features": {
- "bootmagic": true,
- "command": false,
- "console": false,
"extrakey": true,
"mousekey": true,
"nkro": true
diff --git a/keyboards/lucid/velvet_hotswap/keymaps/default/keymap.c b/keyboards/lucid/velvet_hotswap/keymaps/default/keymap.c
index 23e76c78544..a8f6dae2ae0 100644
--- a/keyboards/lucid/velvet_hotswap/keymaps/default/keymap.c
+++ b/keyboards/lucid/velvet_hotswap/keymaps/default/keymap.c
@@ -1,5 +1,5 @@
/*
-Copyright 2022
+Copyright 2023
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
@@ -28,14 +28,5 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
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_RSFT, KC_UP,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_MENU, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
- ),
-
- [_LAYER1] = LAYOUT_tkl_f13_ansi_split_bs_rshift(
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
)
};
diff --git a/keyboards/lucid/velvet_hotswap/keymaps/via/keymap.c b/keyboards/lucid/velvet_hotswap/keymaps/via/keymap.c
index b7257c8274b..2a0247c7159 100644
--- a/keyboards/lucid/velvet_hotswap/keymaps/via/keymap.c
+++ b/keyboards/lucid/velvet_hotswap/keymaps/via/keymap.c
@@ -1,5 +1,5 @@
/*
-Copyright 2022
+Copyright 2023
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
@@ -30,32 +30,5 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
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_RSFT, KC_UP,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_MENU, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
- ),
-
- [_LAYER1] = LAYOUT_tkl_f13_ansi_split_bs_rshift(
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
- ),
-
- [_LAYER2] = LAYOUT_tkl_f13_ansi_split_bs_rshift(
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
- ),
-
- [_LAYER3] = LAYOUT_tkl_f13_ansi_split_bs_rshift(
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
)
};
diff --git a/keyboards/lucid/velvet_hotswap/readme.md b/keyboards/lucid/velvet_hotswap/readme.md
index 7c6c72ee381..1262386236b 100644
--- a/keyboards/lucid/velvet_hotswap/readme.md
+++ b/keyboards/lucid/velvet_hotswap/readme.md
@@ -1,4 +1,6 @@
-# Velvet Hotswap PCB by Lucid
+# Velvet Hotswap PCB by Maker Keyboards
+
+
The following is the QMK Firmware for the Velvet Hotswap PCB by [Maker Keyboards](http://www.makerkeyboards.com).
* Keyboard Maintainer: Maker Keyboards
diff --git a/keyboards/lucid/velvet_solder/info.json b/keyboards/lucid/velvet_solder/info.json
index 1cc8e43cdbc..b94b4160162 100644
--- a/keyboards/lucid/velvet_solder/info.json
+++ b/keyboards/lucid/velvet_solder/info.json
@@ -4,7 +4,7 @@
"url": "http://www.makerkeyboards.com",
"maintainer": "Maker Keyboards",
"usb": {
- "device_version": "1.0.0",
+ "device_version": "1.0.1",
"pid": "0x0007",
"vid": "0x7667"
},
@@ -14,9 +14,6 @@
"rows": ["B4", "B5", "B6", "C0", "E1", "E0"]
},
"features": {
- "bootmagic": true,
- "command": false,
- "console": false,
"extrakey": true,
"mousekey": true,
"nkro": true
diff --git a/keyboards/lucid/velvet_solder/keymaps/default/keymap.c b/keyboards/lucid/velvet_solder/keymaps/default/keymap.c
index 57fa9bf2bc0..7c120c64533 100644
--- a/keyboards/lucid/velvet_solder/keymaps/default/keymap.c
+++ b/keyboards/lucid/velvet_solder/keymaps/default/keymap.c
@@ -1,5 +1,5 @@
/*
-Copyright 2022
+Copyright 2023
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
@@ -28,14 +28,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
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_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT, KC_UP,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_MENU, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
- ),
-
- [_LAYER1] = LAYOUT_all(
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
)
+
};
diff --git a/keyboards/lucid/velvet_solder/keymaps/via/keymap.c b/keyboards/lucid/velvet_solder/keymaps/via/keymap.c
index 2c7cd72db8b..6b756175432 100644
--- a/keyboards/lucid/velvet_solder/keymaps/via/keymap.c
+++ b/keyboards/lucid/velvet_solder/keymaps/via/keymap.c
@@ -1,5 +1,5 @@
/*
-Copyright 2022
+Copyright 2023
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
@@ -30,32 +30,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
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_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT, KC_UP,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_MENU, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
- ),
-
- [_LAYER1] = LAYOUT_all(
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
- ),
-
- [_LAYER2] = LAYOUT_all(
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
- ),
-
- [_LAYER3] = LAYOUT_all(
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
)
+
};
diff --git a/keyboards/lucid/velvet_solder/readme.md b/keyboards/lucid/velvet_solder/readme.md
index 83fd074047a..120974634b7 100644
--- a/keyboards/lucid/velvet_solder/readme.md
+++ b/keyboards/lucid/velvet_solder/readme.md
@@ -1,4 +1,6 @@
-# Velvet Solder PCB by Lucid
+# Velvet Solder PCB by Maker Keyboards
+
+
The following is the QMK Firmware for the Velvet Solder PCB by [Maker Keyboards](http://www.makerkeyboards.com).
* Keyboard Maintainer: Maker Keyboards
diff --git a/keyboards/mariorion_v25/halconf.h b/keyboards/mariorion_v25/halconf.h
new file mode 100644
index 00000000000..a25bad2c7f9
--- /dev/null
+++ b/keyboards/mariorion_v25/halconf.h
@@ -0,0 +1,10 @@
+// Copyright 2023 Maria (@toril940)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define HAL_USE_PWM TRUE
+
+#define HAL_USE_SPI FALSE
+
+#include_next
\ No newline at end of file
diff --git a/keyboards/mariorion_v25/keymaps/default/keymap.c b/keyboards/mariorion_v25/keymaps/default/keymap.c
new file mode 100644
index 00000000000..4bee23b2728
--- /dev/null
+++ b/keyboards/mariorion_v25/keymaps/default/keymap.c
@@ -0,0 +1,32 @@
+// Copyright 2023 Maria (@toril940)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /*
+ * ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
+ * │Esc│ │F1 │F2 │F3 │F4 │ │F5 │F6 │F7 │F8 │ │F9 │F10│F11│F12│ │PSc│Scr│Pse│
+ * └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┐
+ * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Bk│ Bk│ │Ins│Hom│PgU│
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ ├───┼───┼───┤
+ * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │ │Del│End│PgD│
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘
+ * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ ┌───┐
+ * │Shft│ \ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shft │Fn │ │ ↑ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┼───┼───┴───┴──┬┴───┼───┴┬────┬┴───┤ ┌───┼───┼───┐
+ * │Ctrl│GUI │Alt │ │ │ │ Alt│ GUI│Menu│Ctrl│ │ ← │ ↓ │ → │
+ * └────┴────┴────┴─────────┴───┴──────────┴────┴────┴────┴────┘ └───┴───┴───┘
+ */
+ [0] = LAYOUT_all(
+ 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, EE_CLR, QK_BOOT,
+
+ 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_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, RGB_TOG, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, RGB_MOD, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ )
+};
diff --git a/keyboards/mariorion_v25/keymaps/via/keymap.c b/keyboards/mariorion_v25/keymaps/via/keymap.c
new file mode 100644
index 00000000000..95bbe9cfc28
--- /dev/null
+++ b/keyboards/mariorion_v25/keymaps/via/keymap.c
@@ -0,0 +1,32 @@
+// Copyright 2023 Maria (@toril940)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /*
+ * ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
+ * │Esc│ │F1 │F2 │F3 │F4 │ │F5 │F6 │F7 │F8 │ │F9 │F10│F11│F12│ │PSc│Scr│Pse│
+ * └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┐
+ * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Bk│ Bk│ │Ins│Hom│PgU│
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ ├───┼───┼───┤
+ * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │ │Del│End│PgD│
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘
+ * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ ┌───┐
+ * │Shft│ \ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shft │Fn │ │ ↑ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┼───┼───┴───┴──┬┴───┼───┴┬────┬┴───┤ ┌───┼───┼───┐
+ * │Ctrl│GUI │Alt │ │ │ │ Alt│ GUI│Menu│Ctrl│ │ ← │ ↓ │ → │
+ * └────┴────┴────┴─────────┴───┴──────────┴────┴────┴────┴────┘ └───┴───┴───┘
+ */
+ [0] = LAYOUT_all(
+ 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_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, RGB_TOG, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, RGB_MOD, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+};
diff --git a/keyboards/mariorion_v25/keymaps/via/rules.mk b/keyboards/mariorion_v25/keymaps/via/rules.mk
new file mode 100644
index 00000000000..036bd6d1c3e
--- /dev/null
+++ b/keyboards/mariorion_v25/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/mariorion_v25/mariorion_v25.c b/keyboards/mariorion_v25/mariorion_v25.c
new file mode 100644
index 00000000000..7c57c29dfd1
--- /dev/null
+++ b/keyboards/mariorion_v25/mariorion_v25.c
@@ -0,0 +1,72 @@
+// Copyright @
+//
+// 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 .
+
+#include "quantum.h"
+
+// Optional override functions below.
+// You can leave any or all of these undefined.
+// These are only required if you want to perform custom actions.
+
+void matrix_init_kb(void) {
+ // put your keyboard start-up code here
+ // runs once when the firmware starts up
+
+ setPinOutput(INDICATOR_0);
+ setPinOutput(INDICATOR_1);
+ setPinOutput(INDICATOR_2);
+ matrix_init_user();
+}
+
+layer_state_t layer_state_set_kb(layer_state_t state) {
+ switch (get_highest_layer(state)) {
+ case 1:
+ writePinHigh(INDICATOR_0);
+ writePinLow(INDICATOR_1);
+ writePinLow(INDICATOR_2);
+ break;
+ case 2:
+ writePinLow(INDICATOR_0);
+ writePinHigh(INDICATOR_1);
+ writePinLow(INDICATOR_2);
+ break;
+ case 3:
+ writePinLow(INDICATOR_0);
+ writePinLow(INDICATOR_1);
+ writePinHigh(INDICATOR_2);
+ break;
+ default:
+ writePinHigh(INDICATOR_0);
+ writePinHigh(INDICATOR_1);
+ writePinHigh(INDICATOR_2);
+ break;
+ }
+ return layer_state_set_user(state);
+}
+
+void suspend_power_down_kb(void) {
+ writePinLow(INDICATOR_0);
+ writePinLow(INDICATOR_1);
+ writePinLow(INDICATOR_2);
+
+ suspend_power_down_user();
+}
+
+void suspend_wakeup_init_kb(void) {
+ writePinHigh(INDICATOR_0);
+ writePinHigh(INDICATOR_1);
+ writePinHigh(INDICATOR_2);
+
+ suspend_wakeup_init_user();
+}
diff --git a/keyboards/mariorion_v25/matrix_diagram.md b/keyboards/mariorion_v25/matrix_diagram.md
new file mode 100644
index 00000000000..f37df5a6e10
--- /dev/null
+++ b/keyboards/mariorion_v25/matrix_diagram.md
@@ -0,0 +1,29 @@
+# Matrix Diagram for MariOrion v2.5
+```
+┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
+│00 │ │02 │03 │04 │05 │ │06 │07 │08 │09 │ │0A │0B │0C │0D │ │0F │0G │0H │
+└───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘
+┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┐ ┌───────┐
+│10 │11 │12 │13 │14 │15 │16 │17 │18 │19 │1A │1B │1C │1D │1E │ │2F │1G │1H │ │1D │ 2u Backspace
+├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ ├───┼───┼───┤ └─┬─────┤
+│20 │21 │22 │23 │24 │25 │26 │27 │28 │29 │2A │2B │2C │2D │ │3F │2G │2H │ │ │
+├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘ ┌──┴┐3D │ ISO Enter
+│30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3A │3B │3D │ │3C │ │
+├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ ┌───┐ └───┴────┘
+│40 │41 │42 │43 │44 │45 │46 │47 │48 │49 │4A │4B │4C │4D │ │4G │
+├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬┴───┤ ┌───┼───┼───┐
+│50 │51 │52 │55 │5A │5B │5C │5D │ │5F │5G │5H │
+└────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘
+┌────────┐ ┌──────────┐
+│40 │ 2.25u LShift 2.75u RShift │4C │
+└────────┘ └──────────┘
+┌─────┬───┬─────┬───────────────────────────┬─────┬───┬─────┐
+│50 │51 │52 │55 │5B │5C │5D │ Tsangan/WKL
+└─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘
+┌─────┬───┬─────┬───────────┬───┬───────────┬─────┬───┬─────┐
+│50 │51 │52 │53 │55 │57 │5B │5C │5D │ Split 7u Spacebar
+└─────┴───┴─────┴───────────┴───┴───────────┴─────┴───┴─────┘
+┌─────┬───┬───────────────────────────────────────┬───┬─────┐
+│50 │51 │55 │5C │5D │ 10u Spacebar
+└─────┴───┴───────────────────────────────────────┴───┴─────┘
+```
\ No newline at end of file
diff --git a/keyboards/mariorion_v25/mcuconf.h b/keyboards/mariorion_v25/mcuconf.h
new file mode 100644
index 00000000000..c2cf95aef2e
--- /dev/null
+++ b/keyboards/mariorion_v25/mcuconf.h
@@ -0,0 +1,9 @@
+// Copyright 2023 Maria (@toril940)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include_next
+
+#define STM32_PWM_USE_TIM17 TRUE
+#define STM32_TIM17_SUPPRESS_ISR
\ No newline at end of file
diff --git a/keyboards/mariorion_v25/prod/config.h b/keyboards/mariorion_v25/prod/config.h
new file mode 100644
index 00000000000..042f7662d8e
--- /dev/null
+++ b/keyboards/mariorion_v25/prod/config.h
@@ -0,0 +1,16 @@
+// Copyright 2023 Maria (@toril940)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define WS2812_EXTERNAL_PULLUP
+
+#define WS2812_PWM_DRIVER PWMD17
+#define WS2812_PWM_CHANNEL 1
+#define WS2812_DMA_STREAM STM32_DMA1_STREAM1
+#define WS2812_DMA_CHANNEL 1
+// #define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM17_UP
+
+#define INDICATOR_0 C9
+#define INDICATOR_1 C8
+#define INDICATOR_2 C7
\ No newline at end of file
diff --git a/keyboards/mariorion_v25/prod/info.json b/keyboards/mariorion_v25/prod/info.json
new file mode 100644
index 00000000000..dd014be03ae
--- /dev/null
+++ b/keyboards/mariorion_v25/prod/info.json
@@ -0,0 +1,889 @@
+{
+ "manufacturer": "Maria",
+ "keyboard_name": "MariOrion v2.5",
+ "maintainer": "toril940",
+ "bootloader": "stm32-dfu",
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgblight" : true
+ },
+ "indicators": {
+ "caps_lock": "A6",
+ "num_lock": "A15",
+ "on_state": 0
+ },
+ "rgblight": {
+ "led_count": 25,
+ "animations": {
+ "static_light": true,
+ "breathing": true,
+ "rainbow_mood": true,
+ "rainbow_swirl": true,
+ "snake": true,
+ "christmas": true,
+ "static_gradient": true,
+ "twinkle": true
+ },
+ "driver": "ws2812",
+ "led_map": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 24, 23, 22, 21, 20],
+ "sleep": true
+ },
+ "ws2812": {
+ "driver": "pwm",
+ "pin": "B9"
+ },
+ "matrix_pins": {
+ "cols": ["A4", "A5", "A7", "C4", "C5", "B0", "B1", "B2", "B10", "B11", "B13", "B14", "B15", "C6", "B12",
+ "F0", "C15", "C14"],
+ "rows": ["B5", "B4", "B3", "A2", "C13", "B8"]
+ },
+ "processor": "STM32F072",
+ "url": "",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x0002",
+ "vid": "0x6108"
+ },
+ "community_layouts": ["tkl_ansi", "tkl_ansi_split_bs_rshift", "tkl_ansi_tsangan", "tkl_ansi_tsangan_split_bs_rshift",
+ "tkl_iso", "tkl_iso_split_bs_rshift", "tkl_iso_tsangan", "tkl_iso_tsangan_split_bs_rshift"],
+ "layouts": {
+ "LAYOUT_all": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6.5, "y": 0},
+ {"matrix": [0, 7], "x": 7.5, "y": 0},
+ {"matrix": [0, 8], "x": 8.5, "y": 0},
+ {"matrix": [0, 9], "x": 9.5, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15.25, "y": 0},
+ {"matrix": [0, 16], "x": 16.25, "y": 0},
+ {"matrix": [0, 17], "x": 17.25, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.25},
+ {"matrix": [1, 3], "x": 3, "y": 1.25},
+ {"matrix": [1, 4], "x": 4, "y": 1.25},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [1, 6], "x": 6, "y": 1.25},
+ {"matrix": [1, 7], "x": 7, "y": 1.25},
+ {"matrix": [1, 8], "x": 8, "y": 1.25},
+ {"matrix": [1, 9], "x": 9, "y": 1.25},
+ {"matrix": [1, 10], "x": 10, "y": 1.25},
+ {"matrix": [1, 11], "x": 11, "y": 1.25},
+ {"matrix": [1, 12], "x": 12, "y": 1.25},
+ {"matrix": [1, 13], "x": 13, "y": 1.25},
+ {"matrix": [1, 14], "x": 14, "y": 1.25},
+ {"matrix": [1, 15], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 16], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 17], "x": 17.25, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2.25},
+ {"matrix": [2, 2], "x": 2.5, "y": 2.25},
+ {"matrix": [2, 3], "x": 3.5, "y": 2.25},
+ {"matrix": [2, 4], "x": 4.5, "y": 2.25},
+ {"matrix": [2, 5], "x": 5.5, "y": 2.25},
+ {"matrix": [2, 6], "x": 6.5, "y": 2.25},
+ {"matrix": [2, 7], "x": 7.5, "y": 2.25},
+ {"matrix": [2, 8], "x": 8.5, "y": 2.25},
+ {"matrix": [2, 9], "x": 9.5, "y": 2.25},
+ {"matrix": [2, 10], "x": 10.5, "y": 2.25},
+ {"matrix": [2, 11], "x": 11.5, "y": 2.25},
+ {"matrix": [2, 12], "x": 12.5, "y": 2.25},
+ {"matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 15], "x":15.25, "y":2.25},
+ {"matrix": [2, 16], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 17], "x": 17.25, "y": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3.25},
+ {"matrix": [3, 2], "x": 2.75, "y": 3.25},
+ {"matrix": [3, 3], "x": 3.75, "y": 3.25},
+ {"matrix": [3, 4], "x": 4.75, "y": 3.25},
+ {"matrix": [3, 5], "x": 5.75, "y": 3.25},
+ {"matrix": [3, 6], "x": 6.75, "y": 3.25},
+ {"matrix": [3, 7], "x": 7.75, "y": 3.25},
+ {"matrix": [3, 8], "x": 8.75, "y": 3.25},
+ {"matrix": [3, 9], "x": 9.75, "y": 3.25},
+ {"matrix": [3, 10], "x": 10.75, "y": 3.25},
+ {"matrix": [3, 11], "x": 11.75, "y": 3.25},
+ {"matrix": [3, 13], "x": 12.75, "y": 3.25, "w": 2.25},
+ {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"matrix": [4, 7], "x": 7.25, "y": 4.25},
+ {"matrix": [4, 8], "x": 8.25, "y": 4.25},
+ {"matrix": [4, 9], "x": 9.25, "y": 4.25},
+ {"matrix": [4, 10], "x": 10.25, "y": 4.25},
+ {"matrix": [4, 11], "x": 11.25, "y": 4.25},
+ {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 1.75},
+ {"matrix": [4, 13], "x": 14, "y": 4.25},
+ {"matrix": [4, 16], "x": 16.25, "y": 4.25},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 1], "x": 1.25, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 3], "x": 3.75, "y": 5.25, "w": 2.375},
+ {"matrix": [5, 5], "x": 6.25, "y": 5.25},
+ {"matrix": [5, 7], "x": 7.25, "y": 5.25, "w": 2.375},
+ {"matrix": [5, 10], "x": 10, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 11], "x": 11.25, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 12], "x": 12.5, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 13], "x": 13.75, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 15], "x": 15.25, "y": 5.25},
+ {"matrix": [5, 16], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 17], "x": 17.25, "y": 5.25}
+ ]
+ },
+ "LAYOUT_tkl_ansi": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6.5, "y": 0},
+ {"matrix": [0, 7], "x": 7.5, "y": 0},
+ {"matrix": [0, 8], "x": 8.5, "y": 0},
+ {"matrix": [0, 9], "x": 9.5, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15.25, "y": 0},
+ {"matrix": [0, 16], "x": 16.25, "y": 0},
+ {"matrix": [0, 17], "x": 17.25, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.25},
+ {"matrix": [1, 3], "x": 3, "y": 1.25},
+ {"matrix": [1, 4], "x": 4, "y": 1.25},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [1, 6], "x": 6, "y": 1.25},
+ {"matrix": [1, 7], "x": 7, "y": 1.25},
+ {"matrix": [1, 8], "x": 8, "y": 1.25},
+ {"matrix": [1, 9], "x": 9, "y": 1.25},
+ {"matrix": [1, 10], "x": 10, "y": 1.25},
+ {"matrix": [1, 11], "x": 11, "y": 1.25},
+ {"matrix": [1, 12], "x": 12, "y": 1.25},
+ {"matrix": [1, 13], "x": 13, "y": 1.25, "w": 2},
+ {"matrix": [1, 15], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 16], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 17], "x": 17.25, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2.25},
+ {"matrix": [2, 2], "x": 2.5, "y": 2.25},
+ {"matrix": [2, 3], "x": 3.5, "y": 2.25},
+ {"matrix": [2, 4], "x": 4.5, "y": 2.25},
+ {"matrix": [2, 5], "x": 5.5, "y": 2.25},
+ {"matrix": [2, 6], "x": 6.5, "y": 2.25},
+ {"matrix": [2, 7], "x": 7.5, "y": 2.25},
+ {"matrix": [2, 8], "x": 8.5, "y": 2.25},
+ {"matrix": [2, 9], "x": 9.5, "y": 2.25},
+ {"matrix": [2, 10], "x": 10.5, "y": 2.25},
+ {"matrix": [2, 11], "x": 11.5, "y": 2.25},
+ {"matrix": [2, 12], "x": 12.5, "y": 2.25},
+ {"matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 15], "x":15.25, "y":2.25},
+ {"matrix": [2, 16], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 17], "x": 17.25, "y": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3.25},
+ {"matrix": [3, 2], "x": 2.75, "y": 3.25},
+ {"matrix": [3, 3], "x": 3.75, "y": 3.25},
+ {"matrix": [3, 4], "x": 4.75, "y": 3.25},
+ {"matrix": [3, 5], "x": 5.75, "y": 3.25},
+ {"matrix": [3, 6], "x": 6.75, "y": 3.25},
+ {"matrix": [3, 7], "x": 7.75, "y": 3.25},
+ {"matrix": [3, 8], "x": 8.75, "y": 3.25},
+ {"matrix": [3, 9], "x": 9.75, "y": 3.25},
+ {"matrix": [3, 10], "x": 10.75, "y": 3.25},
+ {"matrix": [3, 11], "x": 11.75, "y": 3.25},
+ {"matrix": [3, 13], "x": 12.75, "y": 3.25, "w": 2.25},
+ {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"matrix": [4, 7], "x": 7.25, "y": 4.25},
+ {"matrix": [4, 8], "x": 8.25, "y": 4.25},
+ {"matrix": [4, 9], "x": 9.25, "y": 4.25},
+ {"matrix": [4, 10], "x": 10.25, "y": 4.25},
+ {"matrix": [4, 11], "x": 11.25, "y": 4.25},
+ {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 2.75},
+ {"matrix": [4, 16], "x": 16.25, "y": 4.25},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 1], "x": 1.25, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 5], "x": 3.75, "y": 5.25, "w": 6.25},
+ {"matrix": [5, 10], "x": 10, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 11], "x": 11.25, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 12], "x": 12.5, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 13], "x": 13.75, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 15], "x": 15.25, "y": 5.25},
+ {"matrix": [5, 16], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 17], "x": 17.25, "y": 5.25}
+ ]
+ },
+ "LAYOUT_tkl_ansi_split_bs_rshift": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6.5, "y": 0},
+ {"matrix": [0, 7], "x": 7.5, "y": 0},
+ {"matrix": [0, 8], "x": 8.5, "y": 0},
+ {"matrix": [0, 9], "x": 9.5, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15.25, "y": 0},
+ {"matrix": [0, 16], "x": 16.25, "y": 0},
+ {"matrix": [0, 17], "x": 17.25, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.25},
+ {"matrix": [1, 3], "x": 3, "y": 1.25},
+ {"matrix": [1, 4], "x": 4, "y": 1.25},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [1, 6], "x": 6, "y": 1.25},
+ {"matrix": [1, 7], "x": 7, "y": 1.25},
+ {"matrix": [1, 8], "x": 8, "y": 1.25},
+ {"matrix": [1, 9], "x": 9, "y": 1.25},
+ {"matrix": [1, 10], "x": 10, "y": 1.25},
+ {"matrix": [1, 11], "x": 11, "y": 1.25},
+ {"matrix": [1, 12], "x": 12, "y": 1.25},
+ {"matrix": [1, 13], "x": 13, "y": 1.25},
+ {"matrix": [1, 14], "x": 14, "y": 1.25},
+ {"matrix": [1, 15], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 16], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 17], "x": 17.25, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2.25},
+ {"matrix": [2, 2], "x": 2.5, "y": 2.25},
+ {"matrix": [2, 3], "x": 3.5, "y": 2.25},
+ {"matrix": [2, 4], "x": 4.5, "y": 2.25},
+ {"matrix": [2, 5], "x": 5.5, "y": 2.25},
+ {"matrix": [2, 6], "x": 6.5, "y": 2.25},
+ {"matrix": [2, 7], "x": 7.5, "y": 2.25},
+ {"matrix": [2, 8], "x": 8.5, "y": 2.25},
+ {"matrix": [2, 9], "x": 9.5, "y": 2.25},
+ {"matrix": [2, 10], "x": 10.5, "y": 2.25},
+ {"matrix": [2, 11], "x": 11.5, "y": 2.25},
+ {"matrix": [2, 12], "x": 12.5, "y": 2.25},
+ {"matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 15], "x":15.25, "y":2.25},
+ {"matrix": [2, 16], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 17], "x": 17.25, "y": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3.25},
+ {"matrix": [3, 2], "x": 2.75, "y": 3.25},
+ {"matrix": [3, 3], "x": 3.75, "y": 3.25},
+ {"matrix": [3, 4], "x": 4.75, "y": 3.25},
+ {"matrix": [3, 5], "x": 5.75, "y": 3.25},
+ {"matrix": [3, 6], "x": 6.75, "y": 3.25},
+ {"matrix": [3, 7], "x": 7.75, "y": 3.25},
+ {"matrix": [3, 8], "x": 8.75, "y": 3.25},
+ {"matrix": [3, 9], "x": 9.75, "y": 3.25},
+ {"matrix": [3, 10], "x": 10.75, "y": 3.25},
+ {"matrix": [3, 11], "x": 11.75, "y": 3.25},
+ {"matrix": [3, 13], "x": 12.75, "y": 3.25, "w": 2.25},
+ {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"matrix": [4, 7], "x": 7.25, "y": 4.25},
+ {"matrix": [4, 8], "x": 8.25, "y": 4.25},
+ {"matrix": [4, 9], "x": 9.25, "y": 4.25},
+ {"matrix": [4, 10], "x": 10.25, "y": 4.25},
+ {"matrix": [4, 11], "x": 11.25, "y": 4.25},
+ {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 1.75},
+ {"matrix": [4, 13], "x": 14, "y": 4.25},
+ {"matrix": [4, 16], "x": 16.25, "y": 4.25},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 1], "x": 1.25, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 5], "x": 3.75, "y": 5.25, "w": 6.25},
+ {"matrix": [5, 10], "x": 10, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 11], "x": 11.25, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 12], "x": 12.5, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 13], "x": 13.75, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 15], "x": 15.25, "y": 5.25},
+ {"matrix": [5, 16], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 17], "x": 17.25, "y": 5.25}
+ ]
+ },
+ "LAYOUT_tkl_ansi_tsangan": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6.5, "y": 0},
+ {"matrix": [0, 7], "x": 7.5, "y": 0},
+ {"matrix": [0, 8], "x": 8.5, "y": 0},
+ {"matrix": [0, 9], "x": 9.5, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15.25, "y": 0},
+ {"matrix": [0, 16], "x": 16.25, "y": 0},
+ {"matrix": [0, 17], "x": 17.25, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.25},
+ {"matrix": [1, 3], "x": 3, "y": 1.25},
+ {"matrix": [1, 4], "x": 4, "y": 1.25},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [1, 6], "x": 6, "y": 1.25},
+ {"matrix": [1, 7], "x": 7, "y": 1.25},
+ {"matrix": [1, 8], "x": 8, "y": 1.25},
+ {"matrix": [1, 9], "x": 9, "y": 1.25},
+ {"matrix": [1, 10], "x": 10, "y": 1.25},
+ {"matrix": [1, 11], "x": 11, "y": 1.25},
+ {"matrix": [1, 12], "x": 12, "y": 1.25},
+ {"matrix": [1, 13], "x": 13, "y": 1.25, "w": 2},
+ {"matrix": [1, 15], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 16], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 17], "x": 17.25, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2.25},
+ {"matrix": [2, 2], "x": 2.5, "y": 2.25},
+ {"matrix": [2, 3], "x": 3.5, "y": 2.25},
+ {"matrix": [2, 4], "x": 4.5, "y": 2.25},
+ {"matrix": [2, 5], "x": 5.5, "y": 2.25},
+ {"matrix": [2, 6], "x": 6.5, "y": 2.25},
+ {"matrix": [2, 7], "x": 7.5, "y": 2.25},
+ {"matrix": [2, 8], "x": 8.5, "y": 2.25},
+ {"matrix": [2, 9], "x": 9.5, "y": 2.25},
+ {"matrix": [2, 10], "x": 10.5, "y": 2.25},
+ {"matrix": [2, 11], "x": 11.5, "y": 2.25},
+ {"matrix": [2, 12], "x": 12.5, "y": 2.25},
+ {"matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 15], "x":15.25, "y":2.25},
+ {"matrix": [2, 16], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 17], "x": 17.25, "y": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3.25},
+ {"matrix": [3, 2], "x": 2.75, "y": 3.25},
+ {"matrix": [3, 3], "x": 3.75, "y": 3.25},
+ {"matrix": [3, 4], "x": 4.75, "y": 3.25},
+ {"matrix": [3, 5], "x": 5.75, "y": 3.25},
+ {"matrix": [3, 6], "x": 6.75, "y": 3.25},
+ {"matrix": [3, 7], "x": 7.75, "y": 3.25},
+ {"matrix": [3, 8], "x": 8.75, "y": 3.25},
+ {"matrix": [3, 9], "x": 9.75, "y": 3.25},
+ {"matrix": [3, 10], "x": 10.75, "y": 3.25},
+ {"matrix": [3, 11], "x": 11.75, "y": 3.25},
+ {"matrix": [3, 13], "x": 12.75, "y": 3.25, "w": 2.25},
+ {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"matrix": [4, 7], "x": 7.25, "y": 4.25},
+ {"matrix": [4, 8], "x": 8.25, "y": 4.25},
+ {"matrix": [4, 9], "x": 9.25, "y": 4.25},
+ {"matrix": [4, 10], "x": 10.25, "y": 4.25},
+ {"matrix": [4, 11], "x": 11.25, "y": 4.25},
+ {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 2.75},
+ {"matrix": [4, 16], "x": 16.25, "y": 4.25},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 1], "x": 1.5, "y": 5.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 5], "x": 4, "y": 5.25, "w": 7},
+ {"matrix": [5, 11], "x": 11, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 12], "x": 12.5, "y": 5.25},
+ {"matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 15], "x": 15.25, "y": 5.25},
+ {"matrix": [5, 16], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 17], "x": 17.25, "y": 5.25}
+ ]
+ },
+ "LAYOUT_tkl_ansi_tsangan_split_bs_rshift": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6.5, "y": 0},
+ {"matrix": [0, 7], "x": 7.5, "y": 0},
+ {"matrix": [0, 8], "x": 8.5, "y": 0},
+ {"matrix": [0, 9], "x": 9.5, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15.25, "y": 0},
+ {"matrix": [0, 16], "x": 16.25, "y": 0},
+ {"matrix": [0, 17], "x": 17.25, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.25},
+ {"matrix": [1, 3], "x": 3, "y": 1.25},
+ {"matrix": [1, 4], "x": 4, "y": 1.25},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [1, 6], "x": 6, "y": 1.25},
+ {"matrix": [1, 7], "x": 7, "y": 1.25},
+ {"matrix": [1, 8], "x": 8, "y": 1.25},
+ {"matrix": [1, 9], "x": 9, "y": 1.25},
+ {"matrix": [1, 10], "x": 10, "y": 1.25},
+ {"matrix": [1, 11], "x": 11, "y": 1.25},
+ {"matrix": [1, 12], "x": 12, "y": 1.25},
+ {"matrix": [1, 13], "x": 13, "y": 1.25},
+ {"matrix": [1, 14], "x": 14, "y": 1.25},
+ {"matrix": [1, 15], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 16], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 17], "x": 17.25, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2.25},
+ {"matrix": [2, 2], "x": 2.5, "y": 2.25},
+ {"matrix": [2, 3], "x": 3.5, "y": 2.25},
+ {"matrix": [2, 4], "x": 4.5, "y": 2.25},
+ {"matrix": [2, 5], "x": 5.5, "y": 2.25},
+ {"matrix": [2, 6], "x": 6.5, "y": 2.25},
+ {"matrix": [2, 7], "x": 7.5, "y": 2.25},
+ {"matrix": [2, 8], "x": 8.5, "y": 2.25},
+ {"matrix": [2, 9], "x": 9.5, "y": 2.25},
+ {"matrix": [2, 10], "x": 10.5, "y": 2.25},
+ {"matrix": [2, 11], "x": 11.5, "y": 2.25},
+ {"matrix": [2, 12], "x": 12.5, "y": 2.25},
+ {"matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 15], "x":15.25, "y":2.25},
+ {"matrix": [2, 16], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 17], "x": 17.25, "y": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3.25},
+ {"matrix": [3, 2], "x": 2.75, "y": 3.25},
+ {"matrix": [3, 3], "x": 3.75, "y": 3.25},
+ {"matrix": [3, 4], "x": 4.75, "y": 3.25},
+ {"matrix": [3, 5], "x": 5.75, "y": 3.25},
+ {"matrix": [3, 6], "x": 6.75, "y": 3.25},
+ {"matrix": [3, 7], "x": 7.75, "y": 3.25},
+ {"matrix": [3, 8], "x": 8.75, "y": 3.25},
+ {"matrix": [3, 9], "x": 9.75, "y": 3.25},
+ {"matrix": [3, 10], "x": 10.75, "y": 3.25},
+ {"matrix": [3, 11], "x": 11.75, "y": 3.25},
+ {"matrix": [3, 13], "x": 12.75, "y": 3.25, "w": 2.25},
+ {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"matrix": [4, 7], "x": 7.25, "y": 4.25},
+ {"matrix": [4, 8], "x": 8.25, "y": 4.25},
+ {"matrix": [4, 9], "x": 9.25, "y": 4.25},
+ {"matrix": [4, 10], "x": 10.25, "y": 4.25},
+ {"matrix": [4, 11], "x": 11.25, "y": 4.25},
+ {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 1.75},
+ {"matrix": [4, 13], "x": 14, "y": 4.25},
+ {"matrix": [4, 16], "x": 16.25, "y": 4.25},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 1], "x": 1.5, "y": 5.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 5], "x": 4, "y": 5.25, "w": 7},
+ {"matrix": [5, 11], "x": 11, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 12], "x": 12.5, "y": 5.25},
+ {"matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 15], "x": 15.25, "y": 5.25},
+ {"matrix": [5, 16], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 17], "x": 17.25, "y": 5.25}
+ ]
+ },
+ "LAYOUT_tkl_iso": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6.5, "y": 0},
+ {"matrix": [0, 7], "x": 7.5, "y": 0},
+ {"matrix": [0, 8], "x": 8.5, "y": 0},
+ {"matrix": [0, 9], "x": 9.5, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15.25, "y": 0},
+ {"matrix": [0, 16], "x": 16.25, "y": 0},
+ {"matrix": [0, 17], "x": 17.25, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.25},
+ {"matrix": [1, 3], "x": 3, "y": 1.25},
+ {"matrix": [1, 4], "x": 4, "y": 1.25},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [1, 6], "x": 6, "y": 1.25},
+ {"matrix": [1, 7], "x": 7, "y": 1.25},
+ {"matrix": [1, 8], "x": 8, "y": 1.25},
+ {"matrix": [1, 9], "x": 9, "y": 1.25},
+ {"matrix": [1, 10], "x": 10, "y": 1.25},
+ {"matrix": [1, 11], "x": 11, "y": 1.25},
+ {"matrix": [1, 12], "x": 12, "y": 1.25},
+ {"matrix": [1, 13], "x": 13, "y": 1.25, "w": 2},
+ {"matrix": [1, 15], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 16], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 17], "x": 17.25, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2.25},
+ {"matrix": [2, 2], "x": 2.5, "y": 2.25},
+ {"matrix": [2, 3], "x": 3.5, "y": 2.25},
+ {"matrix": [2, 4], "x": 4.5, "y": 2.25},
+ {"matrix": [2, 5], "x": 5.5, "y": 2.25},
+ {"matrix": [2, 6], "x": 6.5, "y": 2.25},
+ {"matrix": [2, 7], "x": 7.5, "y": 2.25},
+ {"matrix": [2, 8], "x": 8.5, "y": 2.25},
+ {"matrix": [2, 9], "x": 9.5, "y": 2.25},
+ {"matrix": [2, 10], "x": 10.5, "y": 2.25},
+ {"matrix": [2, 11], "x": 11.5, "y": 2.25},
+ {"matrix": [2, 12], "x": 12.5, "y": 2.25},
+ {"matrix": [2, 15], "x": 15.25, "y": 2.25},
+ {"matrix": [2, 16], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 17], "x": 17.25, "y": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3.25},
+ {"matrix": [3, 2], "x": 2.75, "y": 3.25},
+ {"matrix": [3, 3], "x": 3.75, "y": 3.25},
+ {"matrix": [3, 4], "x": 4.75, "y": 3.25},
+ {"matrix": [3, 5], "x": 5.75, "y": 3.25},
+ {"matrix": [3, 6], "x": 6.75, "y": 3.25},
+ {"matrix": [3, 7], "x": 7.75, "y": 3.25},
+ {"matrix": [3, 8], "x": 8.75, "y": 3.25},
+ {"matrix": [3, 9], "x": 9.75, "y": 3.25},
+ {"matrix": [3, 10], "x": 10.75, "y": 3.25},
+ {"matrix": [3, 11], "x": 11.75, "y": 3.25},
+ {"matrix": [3, 12], "x": 12.75, "y": 3.25},
+ {"matrix": [3, 13], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2},
+ {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"matrix": [4, 7], "x": 7.25, "y": 4.25},
+ {"matrix": [4, 8], "x": 8.25, "y": 4.25},
+ {"matrix": [4, 9], "x": 9.25, "y": 4.25},
+ {"matrix": [4, 10], "x": 10.25, "y": 4.25},
+ {"matrix": [4, 11], "x": 11.25, "y": 4.25},
+ {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 2.75},
+ {"matrix": [4, 16], "x": 16.25, "y": 4.25},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 1], "x": 1.25, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 5], "x": 3.75, "y": 5.25, "w": 6.25},
+ {"matrix": [5, 10], "x": 10, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 11], "x": 11.25, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 12], "x": 12.5, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 13], "x": 13.75, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 15], "x": 15.25, "y": 5.25},
+ {"matrix": [5, 16], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 17], "x": 17.25, "y": 5.25}
+ ]
+ },
+ "LAYOUT_tkl_iso_split_bs_rshift": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6.5, "y": 0},
+ {"matrix": [0, 7], "x": 7.5, "y": 0},
+ {"matrix": [0, 8], "x": 8.5, "y": 0},
+ {"matrix": [0, 9], "x": 9.5, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15.25, "y": 0},
+ {"matrix": [0, 16], "x": 16.25, "y": 0},
+ {"matrix": [0, 17], "x": 17.25, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.25},
+ {"matrix": [1, 3], "x": 3, "y": 1.25},
+ {"matrix": [1, 4], "x": 4, "y": 1.25},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [1, 6], "x": 6, "y": 1.25},
+ {"matrix": [1, 7], "x": 7, "y": 1.25},
+ {"matrix": [1, 8], "x": 8, "y": 1.25},
+ {"matrix": [1, 9], "x": 9, "y": 1.25},
+ {"matrix": [1, 10], "x": 10, "y": 1.25},
+ {"matrix": [1, 11], "x": 11, "y": 1.25},
+ {"matrix": [1, 12], "x": 12, "y": 1.25},
+ {"matrix": [1, 13], "x": 13, "y": 1.25},
+ {"matrix": [1, 14], "x": 14, "y": 1.25},
+ {"matrix": [1, 15], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 16], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 17], "x": 17.25, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2.25},
+ {"matrix": [2, 2], "x": 2.5, "y": 2.25},
+ {"matrix": [2, 3], "x": 3.5, "y": 2.25},
+ {"matrix": [2, 4], "x": 4.5, "y": 2.25},
+ {"matrix": [2, 5], "x": 5.5, "y": 2.25},
+ {"matrix": [2, 6], "x": 6.5, "y": 2.25},
+ {"matrix": [2, 7], "x": 7.5, "y": 2.25},
+ {"matrix": [2, 8], "x": 8.5, "y": 2.25},
+ {"matrix": [2, 9], "x": 9.5, "y": 2.25},
+ {"matrix": [2, 10], "x": 10.5, "y": 2.25},
+ {"matrix": [2, 11], "x": 11.5, "y": 2.25},
+ {"matrix": [2, 12], "x": 12.5, "y": 2.25},
+ {"matrix": [2, 15], "x": 15.25, "y": 2.25},
+ {"matrix": [2, 16], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 17], "x": 17.25, "y": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3.25},
+ {"matrix": [3, 2], "x": 2.75, "y": 3.25},
+ {"matrix": [3, 3], "x": 3.75, "y": 3.25},
+ {"matrix": [3, 4], "x": 4.75, "y": 3.25},
+ {"matrix": [3, 5], "x": 5.75, "y": 3.25},
+ {"matrix": [3, 6], "x": 6.75, "y": 3.25},
+ {"matrix": [3, 7], "x": 7.75, "y": 3.25},
+ {"matrix": [3, 8], "x": 8.75, "y": 3.25},
+ {"matrix": [3, 9], "x": 9.75, "y": 3.25},
+ {"matrix": [3, 10], "x": 10.75, "y": 3.25},
+ {"matrix": [3, 11], "x": 11.75, "y": 3.25},
+ {"matrix": [3, 12], "x": 12.75, "y": 3.25},
+ {"matrix": [3, 13], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2},
+ {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"matrix": [4, 7], "x": 7.25, "y": 4.25},
+ {"matrix": [4, 8], "x": 8.25, "y": 4.25},
+ {"matrix": [4, 9], "x": 9.25, "y": 4.25},
+ {"matrix": [4, 10], "x": 10.25, "y": 4.25},
+ {"matrix": [4, 11], "x": 11.25, "y": 4.25},
+ {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 1.75},
+ {"matrix": [4, 13], "x": 14, "y": 4.25},
+ {"matrix": [4, 16], "x": 16.25, "y": 4.25},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 1], "x": 1.25, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 5], "x": 3.75, "y": 5.25, "w": 6.25},
+ {"matrix": [5, 10], "x": 10, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 11], "x": 11.25, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 12], "x": 12.5, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 13], "x": 13.75, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 15], "x": 15.25, "y": 5.25},
+ {"matrix": [5, 16], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 17], "x": 17.25, "y": 5.25}
+ ]
+ },
+ "LAYOUT_tkl_iso_tsangan": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6.5, "y": 0},
+ {"matrix": [0, 7], "x": 7.5, "y": 0},
+ {"matrix": [0, 8], "x": 8.5, "y": 0},
+ {"matrix": [0, 9], "x": 9.5, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15.25, "y": 0},
+ {"matrix": [0, 16], "x": 16.25, "y": 0},
+ {"matrix": [0, 17], "x": 17.25, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.25},
+ {"matrix": [1, 3], "x": 3, "y": 1.25},
+ {"matrix": [1, 4], "x": 4, "y": 1.25},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [1, 6], "x": 6, "y": 1.25},
+ {"matrix": [1, 7], "x": 7, "y": 1.25},
+ {"matrix": [1, 8], "x": 8, "y": 1.25},
+ {"matrix": [1, 9], "x": 9, "y": 1.25},
+ {"matrix": [1, 10], "x": 10, "y": 1.25},
+ {"matrix": [1, 11], "x": 11, "y": 1.25},
+ {"matrix": [1, 12], "x": 12, "y": 1.25},
+ {"matrix": [1, 13], "x": 13, "y": 1.25, "w": 2},
+ {"matrix": [1, 15], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 16], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 17], "x": 17.25, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2.25},
+ {"matrix": [2, 2], "x": 2.5, "y": 2.25},
+ {"matrix": [2, 3], "x": 3.5, "y": 2.25},
+ {"matrix": [2, 4], "x": 4.5, "y": 2.25},
+ {"matrix": [2, 5], "x": 5.5, "y": 2.25},
+ {"matrix": [2, 6], "x": 6.5, "y": 2.25},
+ {"matrix": [2, 7], "x": 7.5, "y": 2.25},
+ {"matrix": [2, 8], "x": 8.5, "y": 2.25},
+ {"matrix": [2, 9], "x": 9.5, "y": 2.25},
+ {"matrix": [2, 10], "x": 10.5, "y": 2.25},
+ {"matrix": [2, 11], "x": 11.5, "y": 2.25},
+ {"matrix": [2, 12], "x": 12.5, "y": 2.25},
+ {"matrix": [2, 15], "x": 15.25, "y": 2.25},
+ {"matrix": [2, 16], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 17], "x": 17.25, "y": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3.25},
+ {"matrix": [3, 2], "x": 2.75, "y": 3.25},
+ {"matrix": [3, 3], "x": 3.75, "y": 3.25},
+ {"matrix": [3, 4], "x": 4.75, "y": 3.25},
+ {"matrix": [3, 5], "x": 5.75, "y": 3.25},
+ {"matrix": [3, 6], "x": 6.75, "y": 3.25},
+ {"matrix": [3, 7], "x": 7.75, "y": 3.25},
+ {"matrix": [3, 8], "x": 8.75, "y": 3.25},
+ {"matrix": [3, 9], "x": 9.75, "y": 3.25},
+ {"matrix": [3, 10], "x": 10.75, "y": 3.25},
+ {"matrix": [3, 11], "x": 11.75, "y": 3.25},
+ {"matrix": [3, 12], "x": 12.75, "y": 3.25},
+ {"matrix": [3, 13], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2},
+ {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"matrix": [4, 7], "x": 7.25, "y": 4.25},
+ {"matrix": [4, 8], "x": 8.25, "y": 4.25},
+ {"matrix": [4, 9], "x": 9.25, "y": 4.25},
+ {"matrix": [4, 10], "x": 10.25, "y": 4.25},
+ {"matrix": [4, 11], "x": 11.25, "y": 4.25},
+ {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 2.75},
+ {"matrix": [4, 16], "x": 16.25, "y": 4.25},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 1], "x": 1.5, "y": 5.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 5], "x": 4, "y": 5.25, "w": 7},
+ {"matrix": [5, 11], "x": 11, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 12], "x": 12.5, "y": 5.25},
+ {"matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 15], "x": 15.25, "y": 5.25},
+ {"matrix": [5, 16], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 17], "x": 17.25, "y": 5.25}
+ ]
+ },
+ "LAYOUT_tkl_iso_tsangan_split_bs_rshift": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6.5, "y": 0},
+ {"matrix": [0, 7], "x": 7.5, "y": 0},
+ {"matrix": [0, 8], "x": 8.5, "y": 0},
+ {"matrix": [0, 9], "x": 9.5, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15.25, "y": 0},
+ {"matrix": [0, 16], "x": 16.25, "y": 0},
+ {"matrix": [0, 17], "x": 17.25, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.25},
+ {"matrix": [1, 3], "x": 3, "y": 1.25},
+ {"matrix": [1, 4], "x": 4, "y": 1.25},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [1, 6], "x": 6, "y": 1.25},
+ {"matrix": [1, 7], "x": 7, "y": 1.25},
+ {"matrix": [1, 8], "x": 8, "y": 1.25},
+ {"matrix": [1, 9], "x": 9, "y": 1.25},
+ {"matrix": [1, 10], "x": 10, "y": 1.25},
+ {"matrix": [1, 11], "x": 11, "y": 1.25},
+ {"matrix": [1, 12], "x": 12, "y": 1.25},
+ {"matrix": [1, 13], "x": 13, "y": 1.25},
+ {"matrix": [1, 14], "x": 14, "y": 1.25},
+ {"matrix": [1, 15], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 16], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 17], "x": 17.25, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2.25},
+ {"matrix": [2, 2], "x": 2.5, "y": 2.25},
+ {"matrix": [2, 3], "x": 3.5, "y": 2.25},
+ {"matrix": [2, 4], "x": 4.5, "y": 2.25},
+ {"matrix": [2, 5], "x": 5.5, "y": 2.25},
+ {"matrix": [2, 6], "x": 6.5, "y": 2.25},
+ {"matrix": [2, 7], "x": 7.5, "y": 2.25},
+ {"matrix": [2, 8], "x": 8.5, "y": 2.25},
+ {"matrix": [2, 9], "x": 9.5, "y": 2.25},
+ {"matrix": [2, 10], "x": 10.5, "y": 2.25},
+ {"matrix": [2, 11], "x": 11.5, "y": 2.25},
+ {"matrix": [2, 12], "x": 12.5, "y": 2.25},
+ {"matrix": [2, 15], "x": 15.25, "y": 2.25},
+ {"matrix": [2, 16], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 17], "x": 17.25, "y": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3.25},
+ {"matrix": [3, 2], "x": 2.75, "y": 3.25},
+ {"matrix": [3, 3], "x": 3.75, "y": 3.25},
+ {"matrix": [3, 4], "x": 4.75, "y": 3.25},
+ {"matrix": [3, 5], "x": 5.75, "y": 3.25},
+ {"matrix": [3, 6], "x": 6.75, "y": 3.25},
+ {"matrix": [3, 7], "x": 7.75, "y": 3.25},
+ {"matrix": [3, 8], "x": 8.75, "y": 3.25},
+ {"matrix": [3, 9], "x": 9.75, "y": 3.25},
+ {"matrix": [3, 10], "x": 10.75, "y": 3.25},
+ {"matrix": [3, 11], "x": 11.75, "y": 3.25},
+ {"matrix": [3, 12], "x": 12.75, "y": 3.25},
+ {"matrix": [3, 13], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2},
+ {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"matrix": [4, 7], "x": 7.25, "y": 4.25},
+ {"matrix": [4, 8], "x": 8.25, "y": 4.25},
+ {"matrix": [4, 9], "x": 9.25, "y": 4.25},
+ {"matrix": [4, 10], "x": 10.25, "y": 4.25},
+ {"matrix": [4, 11], "x": 11.25, "y": 4.25},
+ {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 1.75},
+ {"matrix": [4, 13], "x": 14, "y": 4.25},
+ {"matrix": [4, 16], "x": 16.25, "y": 4.25},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 1], "x": 1.5, "y": 5.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 5], "x": 4, "y": 5.25, "w": 7},
+ {"matrix": [5, 11], "x": 11, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 12], "x": 12.5, "y": 5.25},
+ {"matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 15], "x": 15.25, "y": 5.25},
+ {"matrix": [5, 16], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 17], "x": 17.25, "y": 5.25}
+ ]
+ }
+ }
+}
diff --git a/keyboards/mariorion_v25/prod/rules.mk b/keyboards/mariorion_v25/prod/rules.mk
new file mode 100644
index 00000000000..6e7633bfe01
--- /dev/null
+++ b/keyboards/mariorion_v25/prod/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
diff --git a/keyboards/mariorion_v25/proto/config.h b/keyboards/mariorion_v25/proto/config.h
new file mode 100644
index 00000000000..6865f2dbb01
--- /dev/null
+++ b/keyboards/mariorion_v25/proto/config.h
@@ -0,0 +1,16 @@
+// Copyright 2023 Maria (@toril940)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define WS2812_EXTERNAL_PULLUP
+
+#define WS2812_PWM_DRIVER PWMD17
+#define WS2812_PWM_CHANNEL 1
+#define WS2812_DMA_STREAM STM32_DMA1_STREAM1
+#define WS2812_DMA_CHANNEL 1
+// #define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM17_UP
+
+#define INDICATOR_0 C8
+#define INDICATOR_1 C7
+#define INDICATOR_2 C6
\ No newline at end of file
diff --git a/keyboards/mariorion_v25/proto/info.json b/keyboards/mariorion_v25/proto/info.json
new file mode 100644
index 00000000000..be00d447d2b
--- /dev/null
+++ b/keyboards/mariorion_v25/proto/info.json
@@ -0,0 +1,889 @@
+{
+ "manufacturer": "Maria",
+ "keyboard_name": "MariOrion v2.5",
+ "maintainer": "toril940",
+ "bootloader": "stm32-dfu",
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgblight": true
+ },
+ "rgblight": {
+ "led_count": 25,
+ "animations": {
+ "static_light": true,
+ "breathing": true,
+ "rainbow_mood": true,
+ "rainbow_swirl": true,
+ "snake": true,
+ "christmas": true,
+ "static_gradient": true,
+ "twinkle": true
+ },
+ "driver": "ws2812",
+ "led_map": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 24, 23, 22, 21, 20],
+ "sleep": true
+ },
+ "indicators": {
+ "caps_lock": "A5",
+ "num_lock": "A15",
+ "on_state": 0
+ },
+ "ws2812": {
+ "driver": "pwm",
+ "pin": "B9"
+ },
+ "matrix_pins": {
+ "cols": ["A3", "A4", "A6", "A7", "C4", "C5", "B0", "B1", "B2", "B10", "B12", "B13", "B14", "B15", "B11",
+ "F0", "C15", "C14"],
+ "rows": ["B5", "B4", "B3", "A2", "C13", "B8"]
+ },
+ "processor": "STM32F072",
+ "url": "",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x0001",
+ "vid": "0x6108"
+ },
+ "community_layouts": ["tkl_ansi", "tkl_ansi_split_bs_rshift", "tkl_ansi_tsangan", "tkl_ansi_tsangan_split_bs_rshift",
+ "tkl_iso", "tkl_iso_split_bs_rshift", "tkl_iso_tsangan", "tkl_iso_tsangan_split_bs_rshift"],
+ "layouts": {
+ "LAYOUT_all": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6.5, "y": 0},
+ {"matrix": [0, 7], "x": 7.5, "y": 0},
+ {"matrix": [0, 8], "x": 8.5, "y": 0},
+ {"matrix": [0, 9], "x": 9.5, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15.25, "y": 0},
+ {"matrix": [0, 16], "x": 16.25, "y": 0},
+ {"matrix": [0, 17], "x": 17.25, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.25},
+ {"matrix": [1, 3], "x": 3, "y": 1.25},
+ {"matrix": [1, 4], "x": 4, "y": 1.25},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [1, 6], "x": 6, "y": 1.25},
+ {"matrix": [1, 7], "x": 7, "y": 1.25},
+ {"matrix": [1, 8], "x": 8, "y": 1.25},
+ {"matrix": [1, 9], "x": 9, "y": 1.25},
+ {"matrix": [1, 10], "x": 10, "y": 1.25},
+ {"matrix": [1, 11], "x": 11, "y": 1.25},
+ {"matrix": [1, 12], "x": 12, "y": 1.25},
+ {"matrix": [1, 13], "x": 13, "y": 1.25},
+ {"matrix": [1, 14], "x": 14, "y": 1.25},
+ {"matrix": [1, 15], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 16], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 17], "x": 17.25, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2.25},
+ {"matrix": [2, 2], "x": 2.5, "y": 2.25},
+ {"matrix": [2, 3], "x": 3.5, "y": 2.25},
+ {"matrix": [2, 4], "x": 4.5, "y": 2.25},
+ {"matrix": [2, 5], "x": 5.5, "y": 2.25},
+ {"matrix": [2, 6], "x": 6.5, "y": 2.25},
+ {"matrix": [2, 7], "x": 7.5, "y": 2.25},
+ {"matrix": [2, 8], "x": 8.5, "y": 2.25},
+ {"matrix": [2, 9], "x": 9.5, "y": 2.25},
+ {"matrix": [2, 10], "x": 10.5, "y": 2.25},
+ {"matrix": [2, 11], "x": 11.5, "y": 2.25},
+ {"matrix": [2, 12], "x": 12.5, "y": 2.25},
+ {"matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 15], "x":15.25, "y":2.25},
+ {"matrix": [2, 16], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 17], "x": 17.25, "y": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3.25},
+ {"matrix": [3, 2], "x": 2.75, "y": 3.25},
+ {"matrix": [3, 3], "x": 3.75, "y": 3.25},
+ {"matrix": [3, 4], "x": 4.75, "y": 3.25},
+ {"matrix": [3, 5], "x": 5.75, "y": 3.25},
+ {"matrix": [3, 6], "x": 6.75, "y": 3.25},
+ {"matrix": [3, 7], "x": 7.75, "y": 3.25},
+ {"matrix": [3, 8], "x": 8.75, "y": 3.25},
+ {"matrix": [3, 9], "x": 9.75, "y": 3.25},
+ {"matrix": [3, 10], "x": 10.75, "y": 3.25},
+ {"matrix": [3, 11], "x": 11.75, "y": 3.25},
+ {"matrix": [3, 13], "x": 12.75, "y": 3.25, "w": 2.25},
+ {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"matrix": [4, 7], "x": 7.25, "y": 4.25},
+ {"matrix": [4, 8], "x": 8.25, "y": 4.25},
+ {"matrix": [4, 9], "x": 9.25, "y": 4.25},
+ {"matrix": [4, 10], "x": 10.25, "y": 4.25},
+ {"matrix": [4, 11], "x": 11.25, "y": 4.25},
+ {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 1.75},
+ {"matrix": [4, 13], "x": 14, "y": 4.25},
+ {"matrix": [4, 16], "x": 16.25, "y": 4.25},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 1], "x": 1.25, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 3], "x": 3.75, "y": 5.25, "w": 2.375},
+ {"matrix": [5, 5], "x": 6.25, "y": 5.25},
+ {"matrix": [5, 7], "x": 7.25, "y": 5.25, "w": 2.375},
+ {"matrix": [5, 10], "x": 10, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 11], "x": 11.25, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 12], "x": 12.5, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 13], "x": 13.75, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 15], "x": 15.25, "y": 5.25},
+ {"matrix": [5, 16], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 17], "x": 17.25, "y": 5.25}
+ ]
+ },
+ "LAYOUT_tkl_ansi": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6.5, "y": 0},
+ {"matrix": [0, 7], "x": 7.5, "y": 0},
+ {"matrix": [0, 8], "x": 8.5, "y": 0},
+ {"matrix": [0, 9], "x": 9.5, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15.25, "y": 0},
+ {"matrix": [0, 16], "x": 16.25, "y": 0},
+ {"matrix": [0, 17], "x": 17.25, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.25},
+ {"matrix": [1, 3], "x": 3, "y": 1.25},
+ {"matrix": [1, 4], "x": 4, "y": 1.25},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [1, 6], "x": 6, "y": 1.25},
+ {"matrix": [1, 7], "x": 7, "y": 1.25},
+ {"matrix": [1, 8], "x": 8, "y": 1.25},
+ {"matrix": [1, 9], "x": 9, "y": 1.25},
+ {"matrix": [1, 10], "x": 10, "y": 1.25},
+ {"matrix": [1, 11], "x": 11, "y": 1.25},
+ {"matrix": [1, 12], "x": 12, "y": 1.25},
+ {"matrix": [1, 13], "x": 13, "y": 1.25, "w": 2},
+ {"matrix": [1, 15], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 16], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 17], "x": 17.25, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2.25},
+ {"matrix": [2, 2], "x": 2.5, "y": 2.25},
+ {"matrix": [2, 3], "x": 3.5, "y": 2.25},
+ {"matrix": [2, 4], "x": 4.5, "y": 2.25},
+ {"matrix": [2, 5], "x": 5.5, "y": 2.25},
+ {"matrix": [2, 6], "x": 6.5, "y": 2.25},
+ {"matrix": [2, 7], "x": 7.5, "y": 2.25},
+ {"matrix": [2, 8], "x": 8.5, "y": 2.25},
+ {"matrix": [2, 9], "x": 9.5, "y": 2.25},
+ {"matrix": [2, 10], "x": 10.5, "y": 2.25},
+ {"matrix": [2, 11], "x": 11.5, "y": 2.25},
+ {"matrix": [2, 12], "x": 12.5, "y": 2.25},
+ {"matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 15], "x":15.25, "y":2.25},
+ {"matrix": [2, 16], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 17], "x": 17.25, "y": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3.25},
+ {"matrix": [3, 2], "x": 2.75, "y": 3.25},
+ {"matrix": [3, 3], "x": 3.75, "y": 3.25},
+ {"matrix": [3, 4], "x": 4.75, "y": 3.25},
+ {"matrix": [3, 5], "x": 5.75, "y": 3.25},
+ {"matrix": [3, 6], "x": 6.75, "y": 3.25},
+ {"matrix": [3, 7], "x": 7.75, "y": 3.25},
+ {"matrix": [3, 8], "x": 8.75, "y": 3.25},
+ {"matrix": [3, 9], "x": 9.75, "y": 3.25},
+ {"matrix": [3, 10], "x": 10.75, "y": 3.25},
+ {"matrix": [3, 11], "x": 11.75, "y": 3.25},
+ {"matrix": [3, 13], "x": 12.75, "y": 3.25, "w": 2.25},
+ {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"matrix": [4, 7], "x": 7.25, "y": 4.25},
+ {"matrix": [4, 8], "x": 8.25, "y": 4.25},
+ {"matrix": [4, 9], "x": 9.25, "y": 4.25},
+ {"matrix": [4, 10], "x": 10.25, "y": 4.25},
+ {"matrix": [4, 11], "x": 11.25, "y": 4.25},
+ {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 2.75},
+ {"matrix": [4, 16], "x": 16.25, "y": 4.25},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 1], "x": 1.25, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 5], "x": 3.75, "y": 5.25, "w": 6.25},
+ {"matrix": [5, 10], "x": 10, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 11], "x": 11.25, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 12], "x": 12.5, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 13], "x": 13.75, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 15], "x": 15.25, "y": 5.25},
+ {"matrix": [5, 16], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 17], "x": 17.25, "y": 5.25}
+ ]
+ },
+ "LAYOUT_tkl_ansi_split_bs_rshift": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6.5, "y": 0},
+ {"matrix": [0, 7], "x": 7.5, "y": 0},
+ {"matrix": [0, 8], "x": 8.5, "y": 0},
+ {"matrix": [0, 9], "x": 9.5, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15.25, "y": 0},
+ {"matrix": [0, 16], "x": 16.25, "y": 0},
+ {"matrix": [0, 17], "x": 17.25, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.25},
+ {"matrix": [1, 3], "x": 3, "y": 1.25},
+ {"matrix": [1, 4], "x": 4, "y": 1.25},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [1, 6], "x": 6, "y": 1.25},
+ {"matrix": [1, 7], "x": 7, "y": 1.25},
+ {"matrix": [1, 8], "x": 8, "y": 1.25},
+ {"matrix": [1, 9], "x": 9, "y": 1.25},
+ {"matrix": [1, 10], "x": 10, "y": 1.25},
+ {"matrix": [1, 11], "x": 11, "y": 1.25},
+ {"matrix": [1, 12], "x": 12, "y": 1.25},
+ {"matrix": [1, 13], "x": 13, "y": 1.25},
+ {"matrix": [1, 14], "x": 14, "y": 1.25},
+ {"matrix": [1, 15], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 16], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 17], "x": 17.25, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2.25},
+ {"matrix": [2, 2], "x": 2.5, "y": 2.25},
+ {"matrix": [2, 3], "x": 3.5, "y": 2.25},
+ {"matrix": [2, 4], "x": 4.5, "y": 2.25},
+ {"matrix": [2, 5], "x": 5.5, "y": 2.25},
+ {"matrix": [2, 6], "x": 6.5, "y": 2.25},
+ {"matrix": [2, 7], "x": 7.5, "y": 2.25},
+ {"matrix": [2, 8], "x": 8.5, "y": 2.25},
+ {"matrix": [2, 9], "x": 9.5, "y": 2.25},
+ {"matrix": [2, 10], "x": 10.5, "y": 2.25},
+ {"matrix": [2, 11], "x": 11.5, "y": 2.25},
+ {"matrix": [2, 12], "x": 12.5, "y": 2.25},
+ {"matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 15], "x":15.25, "y":2.25},
+ {"matrix": [2, 16], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 17], "x": 17.25, "y": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3.25},
+ {"matrix": [3, 2], "x": 2.75, "y": 3.25},
+ {"matrix": [3, 3], "x": 3.75, "y": 3.25},
+ {"matrix": [3, 4], "x": 4.75, "y": 3.25},
+ {"matrix": [3, 5], "x": 5.75, "y": 3.25},
+ {"matrix": [3, 6], "x": 6.75, "y": 3.25},
+ {"matrix": [3, 7], "x": 7.75, "y": 3.25},
+ {"matrix": [3, 8], "x": 8.75, "y": 3.25},
+ {"matrix": [3, 9], "x": 9.75, "y": 3.25},
+ {"matrix": [3, 10], "x": 10.75, "y": 3.25},
+ {"matrix": [3, 11], "x": 11.75, "y": 3.25},
+ {"matrix": [3, 13], "x": 12.75, "y": 3.25, "w": 2.25},
+ {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"matrix": [4, 7], "x": 7.25, "y": 4.25},
+ {"matrix": [4, 8], "x": 8.25, "y": 4.25},
+ {"matrix": [4, 9], "x": 9.25, "y": 4.25},
+ {"matrix": [4, 10], "x": 10.25, "y": 4.25},
+ {"matrix": [4, 11], "x": 11.25, "y": 4.25},
+ {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 1.75},
+ {"matrix": [4, 13], "x": 14, "y": 4.25},
+ {"matrix": [4, 16], "x": 16.25, "y": 4.25},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 1], "x": 1.25, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 5], "x": 3.75, "y": 5.25, "w": 6.25},
+ {"matrix": [5, 10], "x": 10, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 11], "x": 11.25, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 12], "x": 12.5, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 13], "x": 13.75, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 15], "x": 15.25, "y": 5.25},
+ {"matrix": [5, 16], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 17], "x": 17.25, "y": 5.25}
+ ]
+ },
+ "LAYOUT_tkl_ansi_tsangan": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6.5, "y": 0},
+ {"matrix": [0, 7], "x": 7.5, "y": 0},
+ {"matrix": [0, 8], "x": 8.5, "y": 0},
+ {"matrix": [0, 9], "x": 9.5, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15.25, "y": 0},
+ {"matrix": [0, 16], "x": 16.25, "y": 0},
+ {"matrix": [0, 17], "x": 17.25, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.25},
+ {"matrix": [1, 3], "x": 3, "y": 1.25},
+ {"matrix": [1, 4], "x": 4, "y": 1.25},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [1, 6], "x": 6, "y": 1.25},
+ {"matrix": [1, 7], "x": 7, "y": 1.25},
+ {"matrix": [1, 8], "x": 8, "y": 1.25},
+ {"matrix": [1, 9], "x": 9, "y": 1.25},
+ {"matrix": [1, 10], "x": 10, "y": 1.25},
+ {"matrix": [1, 11], "x": 11, "y": 1.25},
+ {"matrix": [1, 12], "x": 12, "y": 1.25},
+ {"matrix": [1, 13], "x": 13, "y": 1.25, "w": 2},
+ {"matrix": [1, 15], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 16], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 17], "x": 17.25, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2.25},
+ {"matrix": [2, 2], "x": 2.5, "y": 2.25},
+ {"matrix": [2, 3], "x": 3.5, "y": 2.25},
+ {"matrix": [2, 4], "x": 4.5, "y": 2.25},
+ {"matrix": [2, 5], "x": 5.5, "y": 2.25},
+ {"matrix": [2, 6], "x": 6.5, "y": 2.25},
+ {"matrix": [2, 7], "x": 7.5, "y": 2.25},
+ {"matrix": [2, 8], "x": 8.5, "y": 2.25},
+ {"matrix": [2, 9], "x": 9.5, "y": 2.25},
+ {"matrix": [2, 10], "x": 10.5, "y": 2.25},
+ {"matrix": [2, 11], "x": 11.5, "y": 2.25},
+ {"matrix": [2, 12], "x": 12.5, "y": 2.25},
+ {"matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 15], "x":15.25, "y":2.25},
+ {"matrix": [2, 16], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 17], "x": 17.25, "y": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3.25},
+ {"matrix": [3, 2], "x": 2.75, "y": 3.25},
+ {"matrix": [3, 3], "x": 3.75, "y": 3.25},
+ {"matrix": [3, 4], "x": 4.75, "y": 3.25},
+ {"matrix": [3, 5], "x": 5.75, "y": 3.25},
+ {"matrix": [3, 6], "x": 6.75, "y": 3.25},
+ {"matrix": [3, 7], "x": 7.75, "y": 3.25},
+ {"matrix": [3, 8], "x": 8.75, "y": 3.25},
+ {"matrix": [3, 9], "x": 9.75, "y": 3.25},
+ {"matrix": [3, 10], "x": 10.75, "y": 3.25},
+ {"matrix": [3, 11], "x": 11.75, "y": 3.25},
+ {"matrix": [3, 13], "x": 12.75, "y": 3.25, "w": 2.25},
+ {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"matrix": [4, 7], "x": 7.25, "y": 4.25},
+ {"matrix": [4, 8], "x": 8.25, "y": 4.25},
+ {"matrix": [4, 9], "x": 9.25, "y": 4.25},
+ {"matrix": [4, 10], "x": 10.25, "y": 4.25},
+ {"matrix": [4, 11], "x": 11.25, "y": 4.25},
+ {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 2.75},
+ {"matrix": [4, 16], "x": 16.25, "y": 4.25},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 1], "x": 1.5, "y": 5.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 5], "x": 4, "y": 5.25, "w": 7},
+ {"matrix": [5, 11], "x": 11, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 12], "x": 12.5, "y": 5.25},
+ {"matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 15], "x": 15.25, "y": 5.25},
+ {"matrix": [5, 16], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 17], "x": 17.25, "y": 5.25}
+ ]
+ },
+ "LAYOUT_tkl_ansi_tsangan_split_bs_rshift": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6.5, "y": 0},
+ {"matrix": [0, 7], "x": 7.5, "y": 0},
+ {"matrix": [0, 8], "x": 8.5, "y": 0},
+ {"matrix": [0, 9], "x": 9.5, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15.25, "y": 0},
+ {"matrix": [0, 16], "x": 16.25, "y": 0},
+ {"matrix": [0, 17], "x": 17.25, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.25},
+ {"matrix": [1, 3], "x": 3, "y": 1.25},
+ {"matrix": [1, 4], "x": 4, "y": 1.25},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [1, 6], "x": 6, "y": 1.25},
+ {"matrix": [1, 7], "x": 7, "y": 1.25},
+ {"matrix": [1, 8], "x": 8, "y": 1.25},
+ {"matrix": [1, 9], "x": 9, "y": 1.25},
+ {"matrix": [1, 10], "x": 10, "y": 1.25},
+ {"matrix": [1, 11], "x": 11, "y": 1.25},
+ {"matrix": [1, 12], "x": 12, "y": 1.25},
+ {"matrix": [1, 13], "x": 13, "y": 1.25},
+ {"matrix": [1, 14], "x": 14, "y": 1.25},
+ {"matrix": [1, 15], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 16], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 17], "x": 17.25, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2.25},
+ {"matrix": [2, 2], "x": 2.5, "y": 2.25},
+ {"matrix": [2, 3], "x": 3.5, "y": 2.25},
+ {"matrix": [2, 4], "x": 4.5, "y": 2.25},
+ {"matrix": [2, 5], "x": 5.5, "y": 2.25},
+ {"matrix": [2, 6], "x": 6.5, "y": 2.25},
+ {"matrix": [2, 7], "x": 7.5, "y": 2.25},
+ {"matrix": [2, 8], "x": 8.5, "y": 2.25},
+ {"matrix": [2, 9], "x": 9.5, "y": 2.25},
+ {"matrix": [2, 10], "x": 10.5, "y": 2.25},
+ {"matrix": [2, 11], "x": 11.5, "y": 2.25},
+ {"matrix": [2, 12], "x": 12.5, "y": 2.25},
+ {"matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 15], "x":15.25, "y":2.25},
+ {"matrix": [2, 16], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 17], "x": 17.25, "y": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3.25},
+ {"matrix": [3, 2], "x": 2.75, "y": 3.25},
+ {"matrix": [3, 3], "x": 3.75, "y": 3.25},
+ {"matrix": [3, 4], "x": 4.75, "y": 3.25},
+ {"matrix": [3, 5], "x": 5.75, "y": 3.25},
+ {"matrix": [3, 6], "x": 6.75, "y": 3.25},
+ {"matrix": [3, 7], "x": 7.75, "y": 3.25},
+ {"matrix": [3, 8], "x": 8.75, "y": 3.25},
+ {"matrix": [3, 9], "x": 9.75, "y": 3.25},
+ {"matrix": [3, 10], "x": 10.75, "y": 3.25},
+ {"matrix": [3, 11], "x": 11.75, "y": 3.25},
+ {"matrix": [3, 13], "x": 12.75, "y": 3.25, "w": 2.25},
+ {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"matrix": [4, 7], "x": 7.25, "y": 4.25},
+ {"matrix": [4, 8], "x": 8.25, "y": 4.25},
+ {"matrix": [4, 9], "x": 9.25, "y": 4.25},
+ {"matrix": [4, 10], "x": 10.25, "y": 4.25},
+ {"matrix": [4, 11], "x": 11.25, "y": 4.25},
+ {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 1.75},
+ {"matrix": [4, 13], "x": 14, "y": 4.25},
+ {"matrix": [4, 16], "x": 16.25, "y": 4.25},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 1], "x": 1.5, "y": 5.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 5], "x": 4, "y": 5.25, "w": 7},
+ {"matrix": [5, 11], "x": 11, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 12], "x": 12.5, "y": 5.25},
+ {"matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 15], "x": 15.25, "y": 5.25},
+ {"matrix": [5, 16], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 17], "x": 17.25, "y": 5.25}
+ ]
+ },
+ "LAYOUT_tkl_iso": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6.5, "y": 0},
+ {"matrix": [0, 7], "x": 7.5, "y": 0},
+ {"matrix": [0, 8], "x": 8.5, "y": 0},
+ {"matrix": [0, 9], "x": 9.5, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15.25, "y": 0},
+ {"matrix": [0, 16], "x": 16.25, "y": 0},
+ {"matrix": [0, 17], "x": 17.25, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.25},
+ {"matrix": [1, 3], "x": 3, "y": 1.25},
+ {"matrix": [1, 4], "x": 4, "y": 1.25},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [1, 6], "x": 6, "y": 1.25},
+ {"matrix": [1, 7], "x": 7, "y": 1.25},
+ {"matrix": [1, 8], "x": 8, "y": 1.25},
+ {"matrix": [1, 9], "x": 9, "y": 1.25},
+ {"matrix": [1, 10], "x": 10, "y": 1.25},
+ {"matrix": [1, 11], "x": 11, "y": 1.25},
+ {"matrix": [1, 12], "x": 12, "y": 1.25},
+ {"matrix": [1, 13], "x": 13, "y": 1.25, "w": 2},
+ {"matrix": [1, 15], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 16], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 17], "x": 17.25, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2.25},
+ {"matrix": [2, 2], "x": 2.5, "y": 2.25},
+ {"matrix": [2, 3], "x": 3.5, "y": 2.25},
+ {"matrix": [2, 4], "x": 4.5, "y": 2.25},
+ {"matrix": [2, 5], "x": 5.5, "y": 2.25},
+ {"matrix": [2, 6], "x": 6.5, "y": 2.25},
+ {"matrix": [2, 7], "x": 7.5, "y": 2.25},
+ {"matrix": [2, 8], "x": 8.5, "y": 2.25},
+ {"matrix": [2, 9], "x": 9.5, "y": 2.25},
+ {"matrix": [2, 10], "x": 10.5, "y": 2.25},
+ {"matrix": [2, 11], "x": 11.5, "y": 2.25},
+ {"matrix": [2, 12], "x": 12.5, "y": 2.25},
+ {"matrix": [2, 15], "x": 15.25, "y": 2.25},
+ {"matrix": [2, 16], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 17], "x": 17.25, "y": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3.25},
+ {"matrix": [3, 2], "x": 2.75, "y": 3.25},
+ {"matrix": [3, 3], "x": 3.75, "y": 3.25},
+ {"matrix": [3, 4], "x": 4.75, "y": 3.25},
+ {"matrix": [3, 5], "x": 5.75, "y": 3.25},
+ {"matrix": [3, 6], "x": 6.75, "y": 3.25},
+ {"matrix": [3, 7], "x": 7.75, "y": 3.25},
+ {"matrix": [3, 8], "x": 8.75, "y": 3.25},
+ {"matrix": [3, 9], "x": 9.75, "y": 3.25},
+ {"matrix": [3, 10], "x": 10.75, "y": 3.25},
+ {"matrix": [3, 11], "x": 11.75, "y": 3.25},
+ {"matrix": [3, 12], "x": 12.75, "y": 3.25},
+ {"matrix": [3, 13], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2},
+ {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"matrix": [4, 7], "x": 7.25, "y": 4.25},
+ {"matrix": [4, 8], "x": 8.25, "y": 4.25},
+ {"matrix": [4, 9], "x": 9.25, "y": 4.25},
+ {"matrix": [4, 10], "x": 10.25, "y": 4.25},
+ {"matrix": [4, 11], "x": 11.25, "y": 4.25},
+ {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 2.75},
+ {"matrix": [4, 16], "x": 16.25, "y": 4.25},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 1], "x": 1.25, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 5], "x": 3.75, "y": 5.25, "w": 6.25},
+ {"matrix": [5, 10], "x": 10, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 11], "x": 11.25, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 12], "x": 12.5, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 13], "x": 13.75, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 15], "x": 15.25, "y": 5.25},
+ {"matrix": [5, 16], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 17], "x": 17.25, "y": 5.25}
+ ]
+ },
+ "LAYOUT_tkl_iso_split_bs_rshift": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6.5, "y": 0},
+ {"matrix": [0, 7], "x": 7.5, "y": 0},
+ {"matrix": [0, 8], "x": 8.5, "y": 0},
+ {"matrix": [0, 9], "x": 9.5, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15.25, "y": 0},
+ {"matrix": [0, 16], "x": 16.25, "y": 0},
+ {"matrix": [0, 17], "x": 17.25, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.25},
+ {"matrix": [1, 3], "x": 3, "y": 1.25},
+ {"matrix": [1, 4], "x": 4, "y": 1.25},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [1, 6], "x": 6, "y": 1.25},
+ {"matrix": [1, 7], "x": 7, "y": 1.25},
+ {"matrix": [1, 8], "x": 8, "y": 1.25},
+ {"matrix": [1, 9], "x": 9, "y": 1.25},
+ {"matrix": [1, 10], "x": 10, "y": 1.25},
+ {"matrix": [1, 11], "x": 11, "y": 1.25},
+ {"matrix": [1, 12], "x": 12, "y": 1.25},
+ {"matrix": [1, 13], "x": 13, "y": 1.25},
+ {"matrix": [1, 14], "x": 14, "y": 1.25},
+ {"matrix": [1, 15], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 16], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 17], "x": 17.25, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2.25},
+ {"matrix": [2, 2], "x": 2.5, "y": 2.25},
+ {"matrix": [2, 3], "x": 3.5, "y": 2.25},
+ {"matrix": [2, 4], "x": 4.5, "y": 2.25},
+ {"matrix": [2, 5], "x": 5.5, "y": 2.25},
+ {"matrix": [2, 6], "x": 6.5, "y": 2.25},
+ {"matrix": [2, 7], "x": 7.5, "y": 2.25},
+ {"matrix": [2, 8], "x": 8.5, "y": 2.25},
+ {"matrix": [2, 9], "x": 9.5, "y": 2.25},
+ {"matrix": [2, 10], "x": 10.5, "y": 2.25},
+ {"matrix": [2, 11], "x": 11.5, "y": 2.25},
+ {"matrix": [2, 12], "x": 12.5, "y": 2.25},
+ {"matrix": [2, 15], "x": 15.25, "y": 2.25},
+ {"matrix": [2, 16], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 17], "x": 17.25, "y": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3.25},
+ {"matrix": [3, 2], "x": 2.75, "y": 3.25},
+ {"matrix": [3, 3], "x": 3.75, "y": 3.25},
+ {"matrix": [3, 4], "x": 4.75, "y": 3.25},
+ {"matrix": [3, 5], "x": 5.75, "y": 3.25},
+ {"matrix": [3, 6], "x": 6.75, "y": 3.25},
+ {"matrix": [3, 7], "x": 7.75, "y": 3.25},
+ {"matrix": [3, 8], "x": 8.75, "y": 3.25},
+ {"matrix": [3, 9], "x": 9.75, "y": 3.25},
+ {"matrix": [3, 10], "x": 10.75, "y": 3.25},
+ {"matrix": [3, 11], "x": 11.75, "y": 3.25},
+ {"matrix": [3, 12], "x": 12.75, "y": 3.25},
+ {"matrix": [3, 13], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2},
+ {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"matrix": [4, 7], "x": 7.25, "y": 4.25},
+ {"matrix": [4, 8], "x": 8.25, "y": 4.25},
+ {"matrix": [4, 9], "x": 9.25, "y": 4.25},
+ {"matrix": [4, 10], "x": 10.25, "y": 4.25},
+ {"matrix": [4, 11], "x": 11.25, "y": 4.25},
+ {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 1.75},
+ {"matrix": [4, 13], "x": 14, "y": 4.25},
+ {"matrix": [4, 16], "x": 16.25, "y": 4.25},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 1], "x": 1.25, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 5], "x": 3.75, "y": 5.25, "w": 6.25},
+ {"matrix": [5, 10], "x": 10, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 11], "x": 11.25, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 12], "x": 12.5, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 13], "x": 13.75, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 15], "x": 15.25, "y": 5.25},
+ {"matrix": [5, 16], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 17], "x": 17.25, "y": 5.25}
+ ]
+ },
+ "LAYOUT_tkl_iso_tsangan": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6.5, "y": 0},
+ {"matrix": [0, 7], "x": 7.5, "y": 0},
+ {"matrix": [0, 8], "x": 8.5, "y": 0},
+ {"matrix": [0, 9], "x": 9.5, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15.25, "y": 0},
+ {"matrix": [0, 16], "x": 16.25, "y": 0},
+ {"matrix": [0, 17], "x": 17.25, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.25},
+ {"matrix": [1, 3], "x": 3, "y": 1.25},
+ {"matrix": [1, 4], "x": 4, "y": 1.25},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [1, 6], "x": 6, "y": 1.25},
+ {"matrix": [1, 7], "x": 7, "y": 1.25},
+ {"matrix": [1, 8], "x": 8, "y": 1.25},
+ {"matrix": [1, 9], "x": 9, "y": 1.25},
+ {"matrix": [1, 10], "x": 10, "y": 1.25},
+ {"matrix": [1, 11], "x": 11, "y": 1.25},
+ {"matrix": [1, 12], "x": 12, "y": 1.25},
+ {"matrix": [1, 13], "x": 13, "y": 1.25, "w": 2},
+ {"matrix": [1, 15], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 16], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 17], "x": 17.25, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2.25},
+ {"matrix": [2, 2], "x": 2.5, "y": 2.25},
+ {"matrix": [2, 3], "x": 3.5, "y": 2.25},
+ {"matrix": [2, 4], "x": 4.5, "y": 2.25},
+ {"matrix": [2, 5], "x": 5.5, "y": 2.25},
+ {"matrix": [2, 6], "x": 6.5, "y": 2.25},
+ {"matrix": [2, 7], "x": 7.5, "y": 2.25},
+ {"matrix": [2, 8], "x": 8.5, "y": 2.25},
+ {"matrix": [2, 9], "x": 9.5, "y": 2.25},
+ {"matrix": [2, 10], "x": 10.5, "y": 2.25},
+ {"matrix": [2, 11], "x": 11.5, "y": 2.25},
+ {"matrix": [2, 12], "x": 12.5, "y": 2.25},
+ {"matrix": [2, 15], "x": 15.25, "y": 2.25},
+ {"matrix": [2, 16], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 17], "x": 17.25, "y": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3.25},
+ {"matrix": [3, 2], "x": 2.75, "y": 3.25},
+ {"matrix": [3, 3], "x": 3.75, "y": 3.25},
+ {"matrix": [3, 4], "x": 4.75, "y": 3.25},
+ {"matrix": [3, 5], "x": 5.75, "y": 3.25},
+ {"matrix": [3, 6], "x": 6.75, "y": 3.25},
+ {"matrix": [3, 7], "x": 7.75, "y": 3.25},
+ {"matrix": [3, 8], "x": 8.75, "y": 3.25},
+ {"matrix": [3, 9], "x": 9.75, "y": 3.25},
+ {"matrix": [3, 10], "x": 10.75, "y": 3.25},
+ {"matrix": [3, 11], "x": 11.75, "y": 3.25},
+ {"matrix": [3, 12], "x": 12.75, "y": 3.25},
+ {"matrix": [3, 13], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2},
+ {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"matrix": [4, 7], "x": 7.25, "y": 4.25},
+ {"matrix": [4, 8], "x": 8.25, "y": 4.25},
+ {"matrix": [4, 9], "x": 9.25, "y": 4.25},
+ {"matrix": [4, 10], "x": 10.25, "y": 4.25},
+ {"matrix": [4, 11], "x": 11.25, "y": 4.25},
+ {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 2.75},
+ {"matrix": [4, 16], "x": 16.25, "y": 4.25},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 1], "x": 1.5, "y": 5.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 5], "x": 4, "y": 5.25, "w": 7},
+ {"matrix": [5, 11], "x": 11, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 12], "x": 12.5, "y": 5.25},
+ {"matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 15], "x": 15.25, "y": 5.25},
+ {"matrix": [5, 16], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 17], "x": 17.25, "y": 5.25}
+ ]
+ },
+ "LAYOUT_tkl_iso_tsangan_split_bs_rshift": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6.5, "y": 0},
+ {"matrix": [0, 7], "x": 7.5, "y": 0},
+ {"matrix": [0, 8], "x": 8.5, "y": 0},
+ {"matrix": [0, 9], "x": 9.5, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15.25, "y": 0},
+ {"matrix": [0, 16], "x": 16.25, "y": 0},
+ {"matrix": [0, 17], "x": 17.25, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.25},
+ {"matrix": [1, 3], "x": 3, "y": 1.25},
+ {"matrix": [1, 4], "x": 4, "y": 1.25},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [1, 6], "x": 6, "y": 1.25},
+ {"matrix": [1, 7], "x": 7, "y": 1.25},
+ {"matrix": [1, 8], "x": 8, "y": 1.25},
+ {"matrix": [1, 9], "x": 9, "y": 1.25},
+ {"matrix": [1, 10], "x": 10, "y": 1.25},
+ {"matrix": [1, 11], "x": 11, "y": 1.25},
+ {"matrix": [1, 12], "x": 12, "y": 1.25},
+ {"matrix": [1, 13], "x": 13, "y": 1.25},
+ {"matrix": [1, 14], "x": 14, "y": 1.25},
+ {"matrix": [1, 15], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 16], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 17], "x": 17.25, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2.25},
+ {"matrix": [2, 2], "x": 2.5, "y": 2.25},
+ {"matrix": [2, 3], "x": 3.5, "y": 2.25},
+ {"matrix": [2, 4], "x": 4.5, "y": 2.25},
+ {"matrix": [2, 5], "x": 5.5, "y": 2.25},
+ {"matrix": [2, 6], "x": 6.5, "y": 2.25},
+ {"matrix": [2, 7], "x": 7.5, "y": 2.25},
+ {"matrix": [2, 8], "x": 8.5, "y": 2.25},
+ {"matrix": [2, 9], "x": 9.5, "y": 2.25},
+ {"matrix": [2, 10], "x": 10.5, "y": 2.25},
+ {"matrix": [2, 11], "x": 11.5, "y": 2.25},
+ {"matrix": [2, 12], "x": 12.5, "y": 2.25},
+ {"matrix": [2, 15], "x": 15.25, "y": 2.25},
+ {"matrix": [2, 16], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 17], "x": 17.25, "y": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3.25},
+ {"matrix": [3, 2], "x": 2.75, "y": 3.25},
+ {"matrix": [3, 3], "x": 3.75, "y": 3.25},
+ {"matrix": [3, 4], "x": 4.75, "y": 3.25},
+ {"matrix": [3, 5], "x": 5.75, "y": 3.25},
+ {"matrix": [3, 6], "x": 6.75, "y": 3.25},
+ {"matrix": [3, 7], "x": 7.75, "y": 3.25},
+ {"matrix": [3, 8], "x": 8.75, "y": 3.25},
+ {"matrix": [3, 9], "x": 9.75, "y": 3.25},
+ {"matrix": [3, 10], "x": 10.75, "y": 3.25},
+ {"matrix": [3, 11], "x": 11.75, "y": 3.25},
+ {"matrix": [3, 12], "x": 12.75, "y": 3.25},
+ {"matrix": [3, 13], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2},
+ {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"matrix": [4, 7], "x": 7.25, "y": 4.25},
+ {"matrix": [4, 8], "x": 8.25, "y": 4.25},
+ {"matrix": [4, 9], "x": 9.25, "y": 4.25},
+ {"matrix": [4, 10], "x": 10.25, "y": 4.25},
+ {"matrix": [4, 11], "x": 11.25, "y": 4.25},
+ {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 1.75},
+ {"matrix": [4, 13], "x": 14, "y": 4.25},
+ {"matrix": [4, 16], "x": 16.25, "y": 4.25},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 1], "x": 1.5, "y": 5.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 5], "x": 4, "y": 5.25, "w": 7},
+ {"matrix": [5, 11], "x": 11, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 12], "x": 12.5, "y": 5.25},
+ {"matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 15], "x": 15.25, "y": 5.25},
+ {"matrix": [5, 16], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 17], "x": 17.25, "y": 5.25}
+ ]
+ }
+ }
+}
diff --git a/keyboards/mariorion_v25/proto/rules.mk b/keyboards/mariorion_v25/proto/rules.mk
new file mode 100644
index 00000000000..6e7633bfe01
--- /dev/null
+++ b/keyboards/mariorion_v25/proto/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
diff --git a/keyboards/mariorion_v25/readme.md b/keyboards/mariorion_v25/readme.md
new file mode 100644
index 00000000000..13f2f9dc2ab
--- /dev/null
+++ b/keyboards/mariorion_v25/readme.md
@@ -0,0 +1,36 @@
+# MariOrion v2.5
+
+
+
+
+This project was a revival of the Duck Orion v2.5, where we don't have very many PCBs with modern features, and
+especially Alps support as well. This PCB has both Alps and MX support as well as universal layout support! It also
+features a 3u/1u/3u split spacebar variant for fun :)
+
+The prototype version is for use only by Maria, and it's the r0 run in essence. Please do use prod unless otherwise
+stated (prod me if you're confused, @mawiaa on Discord)!
+
+* Keyboard Maintainer: [Maria](https://github.com/toril940)
+* Hardware Supported: MariOrion v2.5 PCB
+* Hardware Availability: Link coming soon, through Hineybush :)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make mariorion_v25/prod:default
+ make mariorion_v25/proto:default
+
+Flashing example for this keyboard:
+
+ make mariorion_v25/prod:default:flash
+ make mariorion_v25/proto: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**: Hold the reset button on the back of the PCB for 4-10 seconds or so -
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
diff --git a/keyboards/mariorion_v25/rules.mk b/keyboards/mariorion_v25/rules.mk
new file mode 100644
index 00000000000..f0bfa47284c
--- /dev/null
+++ b/keyboards/mariorion_v25/rules.mk
@@ -0,0 +1 @@
+DEFAULT_FOLDER = mariorion_v25/prod
diff --git a/keyboards/millet/doksin/info.json b/keyboards/millet/doksin/info.json
new file mode 100644
index 00000000000..7a848662cd4
--- /dev/null
+++ b/keyboards/millet/doksin/info.json
@@ -0,0 +1,31 @@
+{
+ "manufacturer": "millet",
+ "keyboard_name": "doksin",
+ "maintainer": "millet",
+ "bootloader": "atmel-dfu",
+ "features": {
+ "bootmagic": true,
+ "extrakey": true,
+ "mousekey": true
+ },
+ "matrix_pins": {
+ "direct": [
+ ["D4"]
+ ]
+ },
+ "processor": "atmega32u2",
+ "url": "",
+ "usb": {
+ "device_version": "0.0.1",
+ "pid": "0x1919",
+ "vid": "0xBDD1"
+ },
+ "community_layouts": ["ortho_1x1"],
+ "layouts": {
+ "LAYOUT_ortho_1x1": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0}
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/keyboards/millet/doksin/keymaps/default/keymap.c b/keyboards/millet/doksin/keymaps/default/keymap.c
new file mode 100644
index 00000000000..2d9e565f3a4
--- /dev/null
+++ b/keyboards/millet/doksin/keymaps/default/keymap.c
@@ -0,0 +1,22 @@
+/* Copyright 2019 Biacco42
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_ortho_1x1(
+ KC_1
+ ),
+};
diff --git a/keyboards/millet/doksin/keymaps/default/readme.md b/keyboards/millet/doksin/keymaps/default/readme.md
new file mode 100644
index 00000000000..5ddd4572c40
--- /dev/null
+++ b/keyboards/millet/doksin/keymaps/default/readme.md
@@ -0,0 +1 @@
+# default keymap for DOKSIN
\ No newline at end of file
diff --git a/keyboards/millet/doksin/keymaps/via/keymap.c b/keyboards/millet/doksin/keymaps/via/keymap.c
new file mode 100644
index 00000000000..56d8f970841
--- /dev/null
+++ b/keyboards/millet/doksin/keymaps/via/keymap.c
@@ -0,0 +1,23 @@
+/* Copyright 2019 Biacco42
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_ortho_1x1( /* Base */
+ KC_1
+ ),
+
+};
diff --git a/keyboards/millet/doksin/keymaps/via/rules.mk b/keyboards/millet/doksin/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/millet/doksin/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/millet/doksin/readme.md b/keyboards/millet/doksin/readme.md
new file mode 100644
index 00000000000..175416eb8b6
--- /dev/null
+++ b/keyboards/millet/doksin/readme.md
@@ -0,0 +1,19 @@
+# DOKСИН
+
+
+
+Can be used as a keyboard...
+
+* Keyboard Maintainer: [millet](https://github.com/milletmilletmilletmilletmilletmilletmil)
+* Hardware Supported: The DOKСИН PCB
+* Hardware Availability: None
+
+Make example for this keyboard (after setting up your build environment):
+
+ make millet/doksin:default
+
+Flashing example for this keyboard:
+
+ make millet/doksin: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).
diff --git a/keyboards/millet/doksin/rules.mk b/keyboards/millet/doksin/rules.mk
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/keyboards/ploopyco/madromys/config.h b/keyboards/ploopyco/madromys/config.h
new file mode 100644
index 00000000000..19fa1fada40
--- /dev/null
+++ b/keyboards/ploopyco/madromys/config.h
@@ -0,0 +1,29 @@
+/* Copyright 2023 Colin Lam (Ploopy Corporation)
+ * Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna)
+ * Copyright 2019 Sunjun Kim
+ *
+ * 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 .
+ */
+
+#pragma once
+
+// #define ROTATIONAL_TRANSFORM_ANGLE 0
+#define POINTING_DEVICE_INVERT_Y
+
+/* PMW3360 Settings */
+#define PMW33XX_LIFTOFF_DISTANCE 0x00
+#define PMW33XX_CS_PIN GP5
+#define SPI_SCK_PIN GP2
+#define SPI_MISO_PIN GP0
+#define SPI_MOSI_PIN GP7
\ No newline at end of file
diff --git a/keyboards/ploopyco/madromys/info.json b/keyboards/ploopyco/madromys/info.json
new file mode 100644
index 00000000000..e39f593df9f
--- /dev/null
+++ b/keyboards/ploopyco/madromys/info.json
@@ -0,0 +1,35 @@
+{
+ "keyboard_name": "Ploopy Adept Trackball",
+ "url": "www.ploopy.co",
+ "maintainer": "ploopyco",
+ "manufacturer": "Ploopy Corporation",
+ "processor": "RP2040",
+ "bootloader": "rp2040",
+ "usb": {
+ "vid": "0x5043",
+ "pid": "0x5C47",
+ "max_power": 100
+ },
+ "features": {
+ "bootmagic": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "pointing_device": true,
+ },
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"matrix": [0, 1], "label":"Top Left Left", "x":0, "y":0, "h":2},
+ {"matrix": [0, 2], "label":"Top Left", "x":1.25, "y":0, "h":1.25},
+ {"matrix": [0, 3], "label":"Top Right", "x":2.5, "y":0, "h":1.25},
+ {"matrix": [0, 4], "label":"Top Right Right", "x":3.75, "y":0, "h":2},
+ {"matrix": [0, 0], "label":"Bottom Left", "x":0, "y":2.25, "w":1.75, "h":2},
+ {"matrix": [0, 5], "label":"Bottom Right", "x":3, "y":2.25, "w":1.75, "h":2}
+ ]
+ }
+ },
+ "dynamic_keymap": {
+ "layer_count": 8
+ },
+}
diff --git a/keyboards/ploopyco/madromys/keymaps/default/keymap.c b/keyboards/ploopyco/madromys/keymaps/default/keymap.c
new file mode 100644
index 00000000000..bc8265b39d0
--- /dev/null
+++ b/keyboards/ploopyco/madromys/keymaps/default/keymap.c
@@ -0,0 +1,22 @@
+/* Copyright 2023 Colin Lam (Ploopy Corporation)
+ * Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna)
+ * Copyright 2019 Sunjun Kim
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT( KC_BTN4, KC_BTN5, DRAG_SCROLL, KC_BTN2, KC_BTN1, KC_BTN3 )
+};
diff --git a/keyboards/ploopyco/madromys/keymaps/via/keymap.c b/keyboards/ploopyco/madromys/keymaps/via/keymap.c
new file mode 100644
index 00000000000..bc8265b39d0
--- /dev/null
+++ b/keyboards/ploopyco/madromys/keymaps/via/keymap.c
@@ -0,0 +1,22 @@
+/* Copyright 2023 Colin Lam (Ploopy Corporation)
+ * Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna)
+ * Copyright 2019 Sunjun Kim
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT( KC_BTN4, KC_BTN5, DRAG_SCROLL, KC_BTN2, KC_BTN1, KC_BTN3 )
+};
diff --git a/keyboards/ploopyco/madromys/keymaps/via/readme.md b/keyboards/ploopyco/madromys/keymaps/via/readme.md
new file mode 100644
index 00000000000..c8717fe1f74
--- /dev/null
+++ b/keyboards/ploopyco/madromys/keymaps/via/readme.md
@@ -0,0 +1 @@
+This is the VIA keymap for Ploopyco Madromys Trackball, which can be used to customise the key layout. See [the VIA online app](https://usevia.app/) for how to do this.
diff --git a/keyboards/ploopyco/madromys/keymaps/via/rules.mk b/keyboards/ploopyco/madromys/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/ploopyco/madromys/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/ploopyco/madromys/madromys.c b/keyboards/ploopyco/madromys/madromys.c
new file mode 100644
index 00000000000..8ea1bcdbd78
--- /dev/null
+++ b/keyboards/ploopyco/madromys/madromys.c
@@ -0,0 +1,176 @@
+/* Copyright 2023 Colin Lam (Ploopy Corporation)
+ * Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna)
+ * Copyright 2019 Sunjun Kim
+ *
+ * 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 .
+ */
+
+#include "madromys.h"
+
+#ifndef PLOOPY_DPI_OPTIONS
+# define PLOOPY_DPI_OPTIONS \
+ { 600, 900, 1200, 1600 }
+# ifndef PLOOPY_DPI_DEFAULT
+# define PLOOPY_DPI_DEFAULT 1
+# endif
+#endif
+#ifndef PLOOPY_DPI_DEFAULT
+# define PLOOPY_DPI_DEFAULT 0
+#endif
+#ifndef PLOOPY_DRAGSCROLL_DPI
+# define PLOOPY_DRAGSCROLL_DPI 100 // Fixed-DPI Drag Scroll
+#endif
+#ifndef PLOOPY_DRAGSCROLL_FIXED
+# define PLOOPY_DRAGSCROLL_FIXED 1
+#endif
+#ifndef PLOOPY_DRAGSCROLL_MULTIPLIER
+# define PLOOPY_DRAGSCROLL_MULTIPLIER 0.75 // Variable-DPI Drag Scroll
+#endif
+#ifndef PLOOPY_DRAGSCROLL_SEMAPHORE
+# define PLOOPY_DRAGSCROLL_SEMAPHORE 4
+#endif
+#ifndef PLOOPY_DRAGSCROLL_MOMENTARY
+# define PLOOPY_DRAGSCROLL_MOMENTARY 1
+#endif
+#ifndef PLOOPY_DRAGSCROLL_INVERT
+# define PLOOPY_DRAGSCROLL_INVERT 1
+#endif
+
+keyboard_config_t keyboard_config;
+uint16_t dpi_array[] = PLOOPY_DPI_OPTIONS;
+#define DPI_OPTION_SIZE (sizeof(dpi_array) / sizeof(uint16_t))
+
+// TODO: Implement libinput profiles
+// https://wayland.freedesktop.org/libinput/doc/latest/pointer-acceleration.html
+// Compile time accel selection
+// Valid options are ACC_NONE, ACC_LINEAR, ACC_CUSTOM, ACC_QUADRATIC
+
+// Trackball State
+bool is_drag_scroll = false;
+
+// drag scroll divisor state
+int8_t drag_scroll_x_semaphore = 0;
+int8_t drag_scroll_y_semaphore = 0;
+
+report_mouse_t pointing_device_task_kb(report_mouse_t mouse_report) {
+ if (is_drag_scroll) {
+ int16_t mouse_report_x_temp = mouse_report.x;
+ int16_t mouse_report_y_temp = mouse_report.y;
+ int16_t mouse_report_x_calc = 0;
+ int16_t mouse_report_y_calc = 0;
+ int16_t valx = (mouse_report_x_temp > 0) ? -1 : 1;
+ int16_t valy = (mouse_report_y_temp > 0) ? -1 : 1;
+
+ while (mouse_report_x_temp != 0) {
+ mouse_report_x_temp += valx;
+ drag_scroll_x_semaphore -= valx;
+
+ if (abs(drag_scroll_x_semaphore) >= PLOOPY_DRAGSCROLL_SEMAPHORE) {
+ mouse_report_x_calc -= valx;
+ drag_scroll_x_semaphore = 0;
+ }
+ }
+
+ while (mouse_report_y_temp != 0) {
+ mouse_report_y_temp += valy;
+ drag_scroll_y_semaphore -= valy;
+
+ if (abs(drag_scroll_y_semaphore) >= PLOOPY_DRAGSCROLL_SEMAPHORE) {
+ mouse_report_y_calc -= valy;
+ drag_scroll_y_semaphore = 0;
+ }
+ }
+
+ mouse_report.h = mouse_report_x_calc;
+
+#ifdef PLOOPY_DRAGSCROLL_INVERT
+ // Invert vertical scroll direction
+ mouse_report.v = -mouse_report_y_calc;
+#else
+ mouse_report.v = mouse_report_y_calc;
+#endif
+ mouse_report.x = 0;
+ mouse_report.y = 0;
+ }
+
+ return pointing_device_task_user(mouse_report);
+}
+
+bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
+ if (!process_record_user(keycode, record)) {
+ return false;
+ }
+
+ if (keycode == DPI_CONFIG && record->event.pressed) {
+ keyboard_config.dpi_config = (keyboard_config.dpi_config + 1) % DPI_OPTION_SIZE;
+ eeconfig_update_kb(keyboard_config.raw);
+ pointing_device_set_cpi(dpi_array[keyboard_config.dpi_config]);
+ }
+
+ if (keycode == DRAG_SCROLL) {
+#ifndef PLOOPY_DRAGSCROLL_MOMENTARY
+ if (record->event.pressed)
+#endif
+ {
+ is_drag_scroll ^= 1;
+ }
+#ifdef PLOOPY_DRAGSCROLL_FIXED
+ pointing_device_set_cpi(is_drag_scroll ? PLOOPY_DRAGSCROLL_DPI : dpi_array[keyboard_config.dpi_config]);
+#else
+ pointing_device_set_cpi(is_drag_scroll ? (dpi_array[keyboard_config.dpi_config] * PLOOPY_DRAGSCROLL_MULTIPLIER) : dpi_array[keyboard_config.dpi_config]);
+#endif
+ }
+
+ return true;
+}
+
+// Hardware Setup
+void keyboard_pre_init_kb(void) {
+ // debug_enable = true;
+ // debug_matrix = true;
+ // debug_mouse = true;
+ // debug_encoder = true;
+
+ /* Ground all output pins connected to ground. This provides additional
+ * pathways to ground. If you're messing with this, know this: driving ANY
+ * of these pins high will cause a short. On the MCU. Ka-blooey.
+ */
+ const pin_t unused_pins[] = { GP1, GP3, GP4, GP6, GP8, GP10, GP14, GP16,
+ GP18, GP20, GP22, GP24, GP25, GP26, GP27, GP28, GP29 };
+
+ for (uint8_t i = 0; i < (sizeof(unused_pins) / sizeof(pin_t)); i++) {
+ setPinOutput(unused_pins[i]);
+ writePinLow(unused_pins[i]);
+ }
+
+ keyboard_pre_init_user();
+}
+
+void pointing_device_init_kb(void) { pointing_device_set_cpi(dpi_array[keyboard_config.dpi_config]); }
+
+void eeconfig_init_kb(void) {
+ keyboard_config.dpi_config = PLOOPY_DPI_DEFAULT;
+ eeconfig_update_kb(keyboard_config.raw);
+ eeconfig_init_user();
+}
+
+void matrix_init_kb(void) {
+ // is safe to just read DPI setting since matrix init
+ // comes before pointing device init.
+ keyboard_config.raw = eeconfig_read_kb();
+ if (keyboard_config.dpi_config > DPI_OPTION_SIZE) {
+ eeconfig_init_kb();
+ }
+ matrix_init_user();
+}
diff --git a/keyboards/ploopyco/madromys/madromys.h b/keyboards/ploopyco/madromys/madromys.h
new file mode 100644
index 00000000000..944cce937b4
--- /dev/null
+++ b/keyboards/ploopyco/madromys/madromys.h
@@ -0,0 +1,37 @@
+/* Copyright 2023 Colin Lam (Ploopy Corporation)
+ * Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna)
+ * Copyright 2019 Sunjun Kim
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "quantum.h"
+
+typedef union {
+ uint32_t raw;
+ struct {
+ uint8_t dpi_config;
+ };
+} keyboard_config_t;
+_Static_assert(sizeof(keyboard_config_t) == sizeof(uint32_t), "keyboard_config_t size mismatch compared to EEPROM area");
+
+extern keyboard_config_t keyboard_config;
+extern uint16_t dpi_array[];
+
+enum ploopy_keycodes {
+ DPI_CONFIG = QK_KB_0,
+ DRAG_SCROLL,
+};
diff --git a/keyboards/ploopyco/madromys/readme.md b/keyboards/ploopyco/madromys/readme.md
new file mode 100644
index 00000000000..456a3c7db20
--- /dev/null
+++ b/keyboards/ploopyco/madromys/readme.md
@@ -0,0 +1,43 @@
+
+# Ploopyco Madromys Trackball
+
+It's a DIY, QMK-powered trackball!
+
+* Keyboard Maintainer: [PloopyCo](https://github.com/ploopyco)
+* Hardware Supported: RP2040
+* Hardware Availability: [Store](https://ploopy.co), [GitHub](https://github.com/ploopyco)
+
+Make example for this keyboard (after setting up your build environment):
+
+ qmk compile -kb ploopyco/madromys -km default
+
+# Building Firmware
+
+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).
+
+# Triggering the Bootloader
+
+[Do you see those two golden holes in the board](https://ploopy.co/wp-content/uploads/2023/11/boot.jpg)? Those are called **vias**. They act exactly like a switch does. Right now, that switch is OFF. However, if you take a paperclip or a pair of metal tweezers and touch those two vias, the two vias will form an electrical connection. Effectively, that switch turns ON.
+
+Go ahead and connect the two vias, and then (while the vias are connected) plug in the Madromys board into your computer.
+
+The computer should recognise that a mass storage device was just plugged in. Once this is done, you should be able to drag and drop files onto the Madromys board, as if the board was a USB drive. Feel free to remove the tweezers or paperclip at this point.
+
+If you want to upload a new firmware file (a ".uf2" file, like "madromys_awesome_version.uf2" or something), just drag it into the folder, and it'll automatically install on the Madromys board and restart itself, in normal operating mode. You're done!
+
+**TIP**: If your firmware is in some kind of strange state and uploading new firmware isn't fixing it, try uploading [a flash nuke](https://learn.adafruit.com/getting-started-with-raspberry-pi-pico-circuitpython/circuitpython#flash-resetting-uf2-3083182) to the Madromys board before flashing the new firmware. It wipes the memory of the Madromys board completely clean, which can help clear a few types of errors.
+
+# Drag Scroll
+
+Drag Scroll is a custom keycode for Ploopy devices that allows you to hold or tap a button and have the mouse movement translate into scrolling instead.
+
+Nothing needs to be enabled to use this functionality; it's enabled on Madromys by default.
+
+### Drag Scroll Configuration
+
+* `#define PLOOPY_DRAGSCROLL_MOMENTARY` - Makes the key into a momentary key, rather than a toggle.
+* `#define PLOOPY_DRAGSCROLL_MULTIPLIER 0.75` - Sets the DPI multiplier to use when drag scroll is enabled.
+* `#define PLOOPY_DRAGSCROLL_FIXED` - Normally, when activating Drag Scroll, it uses a fraction of the current DPI. You can define this to use a specific, set DPI rather than a fraction of the current DPI.
+ * `#define PLOOPY_DRAGSCROLL_DPI 100` - When the fixed DPI option is enabled, this sets the DPI to be used for Drag Scroll.
+* `#define PLOOPY_DRAGSCROLL_INVERT` - This reverses the direction that the scroll is performed.
+* `#define PLOOPY_DRAGSCROLL_SEMAPHORE` - This is a divisor on the drag scroll sensitivity. The default is 0, which means that the drag scroll is at maximum sensitivity. A value of 4 would mean that the drag scroll is 4 times less sensitive.
\ No newline at end of file
diff --git a/keyboards/ploopyco/madromys/rev1_001/info.json b/keyboards/ploopyco/madromys/rev1_001/info.json
new file mode 100644
index 00000000000..5cb4ee39381
--- /dev/null
+++ b/keyboards/ploopyco/madromys/rev1_001/info.json
@@ -0,0 +1,23 @@
+{
+ "usb": {
+ "device_version": "1.0.0"
+ },
+ "diode_direction": "COL2ROW",
+ "matrix_pins": {
+ "direct": [
+ ["GP15", "GP17", "GP19", "GP21", "GP23", "GP11"]
+ ]
+ },
+ "rgblight": {
+ "led_count": 3,
+ "max_brightness": 40,
+ "animations": {
+ "breathing": true,
+ "rainbow_mood": true,
+ "rainbow_swirl": true
+ }
+ },
+ "ws2812": {
+ "pin": "GP12"
+ }
+}
diff --git a/keyboards/ploopyco/madromys/rev1_001/readme.md b/keyboards/ploopyco/madromys/rev1_001/readme.md
new file mode 100644
index 00000000000..b9a2e106dbd
--- /dev/null
+++ b/keyboards/ploopyco/madromys/rev1_001/readme.md
@@ -0,0 +1,3 @@
+This is the R1.001+ version of Madromys. Future versions may have other features.
+
+See the [main readme](../readme.md) for more details.
diff --git a/keyboards/ploopyco/madromys/rev1_001/rules.mk b/keyboards/ploopyco/madromys/rev1_001/rules.mk
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/keyboards/ploopyco/madromys/rules.mk b/keyboards/ploopyco/madromys/rules.mk
new file mode 100644
index 00000000000..b7e33d92f92
--- /dev/null
+++ b/keyboards/ploopyco/madromys/rules.mk
@@ -0,0 +1,3 @@
+POINTING_DEVICE_DRIVER = pmw3360
+
+DEFAULT_FOLDER = ploopyco/madromys/rev1_001
diff --git a/keyboards/purin/info.json b/keyboards/purin/info.json
new file mode 100644
index 00000000000..08a8b06e342
--- /dev/null
+++ b/keyboards/purin/info.json
@@ -0,0 +1,108 @@
+{
+ "manufacturer": "oRE-o",
+ "keyboard_name": "purin",
+ "maintainer": "oRE-o",
+ "bootloader": "atmel-dfu",
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true
+ },
+ "matrix_pins": {
+ "cols": ["C7", "C6", "B6", "B5", "B4", "D7", "D6", "D0", "D1", "D2", "B7", "B3", "F4", "F1", "F0"],
+ "rows": ["F6", "F7", "D4", "D5", "D3"]
+ },
+ "processor": "atmega32u4",
+ "url": "",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x0000",
+ "vid": "0x6F52"
+ },
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+
+ {"matrix": [0, 1], "x": 1.25, "y": 0},
+ {"matrix": [0, 2], "x": 2.25, "y": 0},
+ {"matrix": [0, 3], "x": 3.25, "y": 0},
+ {"matrix": [0, 4], "x": 4.25, "y": 0},
+ {"matrix": [0, 5], "x": 5.25, "y": 0},
+ {"matrix": [0, 6], "x": 6.25, "y": 0},
+ {"matrix": [0, 7], "x": 7.25, "y": 0},
+
+ {"matrix": [0, 8], "x": 10.25, "y": 0},
+ {"matrix": [0, 9], "x": 11.25, "y": 0},
+ {"matrix": [0, 10], "x": 12.25, "y": 0},
+ {"matrix": [0, 11], "x": 13.25, "y": 0},
+ {"matrix": [0, 12], "x": 14.25, "y": 0},
+ {"matrix": [0, 13], "x": 15.25, "y": 0},
+ {"matrix": [0, 14], "x": 16.25, "y": 0, "w": 2},
+
+ {"matrix": [1, 0], "x": 0, "y": 1},
+
+ {"matrix": [1, 1], "x": 1.25, "y": 1, "w": 1.5},
+ {"matrix": [1, 2], "x": 2.75, "y": 1},
+ {"matrix": [1, 3], "x": 3.75, "y": 1},
+ {"matrix": [1, 4], "x": 4.75, "y": 1},
+ {"matrix": [1, 5], "x": 5.75, "y": 1},
+ {"matrix": [1, 6], "x": 6.75, "y": 1},
+
+ {"matrix": [1, 7], "x": 9.75, "y": 1},
+ {"matrix": [1, 8], "x": 10.75, "y": 1},
+ {"matrix": [1, 9], "x": 11.75, "y": 1},
+ {"matrix": [1, 10], "x": 12.75, "y": 1},
+ {"matrix": [1, 11], "x": 13.75, "y": 1},
+ {"matrix": [1, 12], "x": 14.75, "y": 1},
+ {"matrix": [1, 13], "x": 15.75, "y": 1},
+ {"matrix": [1, 14], "x": 16.75, "y": 1, "w": 1.5},
+
+ {"matrix": [2, 0], "x": 0, "y": 2},
+ {"matrix": [2, 1], "x": 1.25, "y": 2, "w": 1.75},
+ {"matrix": [2, 2], "x": 3, "y": 2},
+ {"matrix": [2, 3], "x": 4, "y": 2},
+ {"matrix": [2, 4], "x": 5, "y": 2},
+ {"matrix": [2, 5], "x": 6, "y": 2},
+ {"matrix": [2, 6], "x": 7, "y": 2},
+
+ {"matrix": [2, 7], "x": 10, "y": 2},
+ {"matrix": [2, 8], "x": 11, "y": 2},
+ {"matrix": [2, 9], "x": 12, "y": 2},
+ {"matrix": [2, 10], "x": 13, "y": 2},
+ {"matrix": [2, 11], "x": 14, "y": 2},
+ {"matrix": [2, 12], "x": 15, "y": 2},
+ {"matrix": [2, 13], "x": 16, "y": 2, "w": 2.25},
+
+ {"matrix": [3, 0], "x": 1.25, "y": 3, "w": 2.25},
+ {"matrix": [3, 1], "x": 3.5, "y": 3},
+ {"matrix": [3, 2], "x": 4.5, "y": 3},
+ {"matrix": [3, 3], "x": 5.5, "y": 3},
+ {"matrix": [3, 4], "x": 6.5, "y": 3},
+ {"matrix": [3, 5], "x": 7.5, "y": 3},
+
+ {"matrix": [3, 6], "x": 9.5, "y": 3},
+ {"matrix": [3, 7], "x": 10.5, "y": 3},
+ {"matrix": [3, 8], "x": 11.5, "y": 3},
+ {"matrix": [3, 9], "x": 12.5, "y": 3},
+ {"matrix": [3, 10], "x": 13.5, "y": 3},
+ {"matrix": [3, 11], "x": 14.5, "y": 3},
+ {"matrix": [3, 12], "x": 15.5, "y": 3, "w": 1.75},
+ {"matrix": [3, 13], "x": 17.25, "y": 3},
+
+ {"matrix": [4, 0], "x": 1.25, "y": 4, "w": 1.25},
+ {"matrix": [4, 1], "x": 2.5, "y": 4, "w": 1.25},
+ {"matrix": [4, 2], "x": 4.25, "y": 4, "w": 1.25},
+ {"matrix": [4, 3], "x": 5.75, "y": 4, "w": 2},
+ {"matrix": [4, 4], "x": 7.75, "y": 4, "w": 1.25},
+ {"matrix": [4, 5], "x": 9.5, "y": 4, "w": 2.75},
+ {"matrix": [4, 6], "x": 12.25, "y": 4, "w": 1.5},
+ {"matrix": [4, 7], "x": 16.75, "y": 4, "w": 1.5}
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/keyboards/purin/keymaps/default/keymap.c b/keyboards/purin/keymaps/default/keymap.c
new file mode 100644
index 00000000000..f5c2cd7bbfe
--- /dev/null
+++ b/keyboards/purin/keymaps/default/keymap.c
@@ -0,0 +1,31 @@
+// Copyright 2023 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT( // for windows
+ KC_ESC, QK_GESC, 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_RALT, 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(2),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(2), KC_SPC, KC_RALT, KC_RCTL
+ ),
+
+ [1] = LAYOUT( // for mac
+ KC_ESC, QK_GESC, 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_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(2),
+ KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, MO(2), KC_SPC, KC_RGUI, KC_RALT
+ ),
+
+ [2] = LAYOUT( // FN Layer 1
+ _______, 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_DEL,
+ KC_PGUP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_UP, DF(0), DF(1),
+ KC_PGDN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_RGHT, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DOWN, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+};
diff --git a/keyboards/purin/keymaps/via/keymap.c b/keyboards/purin/keymaps/via/keymap.c
new file mode 100644
index 00000000000..e13eea3c748
--- /dev/null
+++ b/keyboards/purin/keymaps/via/keymap.c
@@ -0,0 +1,31 @@
+// Copyright 2023 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT( // for windows
+ KC_ESC, QK_GESC, 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_RALT, 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(2),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(2), KC_SPC, KC_RALT, KC_RCTL
+ ),
+
+ [1] = LAYOUT( // for mac
+ KC_ESC, QK_GESC, 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_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(2),
+ KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, MO(2), KC_SPC, KC_RGUI, KC_RALT
+ ),
+
+ [2] = LAYOUT( // FN Layer 1
+ _______, 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_DEL,
+ KC_PGUP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_UP, DF(0), DF(1),
+ KC_PGDN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_RGHT, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DOWN, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+};
diff --git a/keyboards/purin/keymaps/via/rules.mk b/keyboards/purin/keymaps/via/rules.mk
new file mode 100644
index 00000000000..036bd6d1c3e
--- /dev/null
+++ b/keyboards/purin/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/purin/readme.md b/keyboards/purin/readme.md
new file mode 100644
index 00000000000..4b4eb6a1b86
--- /dev/null
+++ b/keyboards/purin/readme.md
@@ -0,0 +1,28 @@
+# purin
+
+
+
+Keyboard developed by oREo!
+Project for learning about qmk, Atmega32u4.
+
+* Keyboard Maintainer: [oRE-o](https://github.com/oRE-o)
+* Hardware Supported: Purin PCB by oREo
+* Hardware Availability: Not yet
+
+Make example for this keyboard (after setting up your build environment):
+
+ make purin:default
+
+Flashing example for this keyboard:
+
+ make purin: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
diff --git a/keyboards/purin/rules.mk b/keyboards/purin/rules.mk
new file mode 100644
index 00000000000..7ff128fa692
--- /dev/null
+++ b/keyboards/purin/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
\ No newline at end of file
diff --git a/keyboards/qwertykeys/qk100/ansi/ansi.c b/keyboards/qwertykeys/qk100/ansi/ansi.c
new file mode 100644
index 00000000000..87e1b99e1b7
--- /dev/null
+++ b/keyboards/qwertykeys/qk100/ansi/ansi.c
@@ -0,0 +1,197 @@
+/*
+Copyright 2023 Qwertykeys
+
+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 .
+*/
+#include "quantum.h"
+
+#ifdef RGB_MATRIX_ENABLE
+const is31_led g_is31_leds[RGB_MATRIX_LED_COUNT] = {
+ {0, CS2_SW1, CS3_SW1, CS1_SW1}, /* RGB0-ESC ROW0*/
+ {0, CS5_SW1, CS6_SW1, CS4_SW1}, /* RGB1-F1 */
+ {0, CS8_SW1, CS9_SW1, CS7_SW1}, /* RGB2-F2 */
+ {0, CS11_SW1, CS12_SW1, CS10_SW1}, /* RGB3-F3 */
+ {0, CS14_SW1, CS15_SW1, CS13_SW1}, /* RGB4-F4 */
+ {0, CS17_SW1, CS18_SW1, CS16_SW1}, /* RGB5-F5 */
+ {0, CS20_SW1, CS21_SW1, CS19_SW1}, /* RGB6-F6 */
+ {0, CS23_SW1, CS24_SW1, CS22_SW1}, /* RGB7-F7 */
+ {0, CS26_SW1, CS27_SW1, CS25_SW1}, /* RGB8-F8 */
+ {0, CS29_SW1, CS30_SW1, CS28_SW1}, /* RGB9-F9 */
+ {0, CS32_SW1, CS33_SW1, CS31_SW1}, /* RGB10-F10 */
+ {0, CS35_SW1, CS36_SW1, CS34_SW1}, /* RGB11-F11 */
+ {0, CS38_SW1, CS39_SW1, CS37_SW1}, /* RGB12-F12 */
+ {0, CS29_SW7, CS30_SW7, CS28_SW7}, /* RGB13-Delete */
+ {0, CS32_SW7, CS33_SW7, CS31_SW7}, /* RGB14-End */
+ {0, CS35_SW7, CS36_SW7, CS34_SW7}, /* RGB15-Insert */
+ {0, CS38_SW7, CS39_SW7, CS37_SW7}, /* RGB16-Home */
+ {0, CS2_SW2, CS3_SW2, CS1_SW2}, /* RGB17-~ ----ROW1*/
+ {0, CS5_SW2, CS6_SW2, CS4_SW2}, /* RGB18-1 */
+ {0, CS8_SW2, CS9_SW2, CS7_SW2}, /* RGB19-2 */
+ {0, CS11_SW2, CS12_SW2, CS10_SW2}, /* RGB20-3 */
+ {0, CS14_SW2, CS15_SW2, CS13_SW2}, /* RGB21-4 */
+ {0, CS17_SW2, CS18_SW2, CS16_SW2}, /* RGB22-5 */
+ {0, CS20_SW2, CS21_SW2, CS19_SW2}, /* RGB23-6 */
+ {0, CS23_SW2, CS24_SW2, CS22_SW2}, /* RGB24-7 */
+ {0, CS26_SW2, CS27_SW2, CS25_SW2}, /* RGB25-8 */
+ {0, CS29_SW2, CS30_SW2, CS28_SW2}, /* RGB26-9 */
+ {0, CS32_SW2, CS33_SW2, CS31_SW2}, /* RGB27-0 */
+ {0, CS35_SW2, CS36_SW2, CS34_SW2}, /* RGB28--- */
+ {0, CS38_SW2, CS39_SW2, CS37_SW2}, /* RGB29-+= */
+ {0, CS26_SW7, CS27_SW7, CS25_SW7}, /* RGB30-BS */
+ {0, CS29_SW8, CS30_SW8, CS28_SW8}, /* RGB31-Num Lock */
+ {0, CS32_SW8, CS33_SW8, CS31_SW8}, /* RGB32- / */
+ {0, CS35_SW8, CS36_SW8, CS34_SW8}, /* RGB33- * */
+ {0, CS38_SW8, CS39_SW8, CS37_SW8}, /* RGB34- - */
+ {0, CS2_SW3, CS3_SW3, CS1_SW3}, /* RGB35-TAB ----ROW2*/
+ {0, CS5_SW3, CS6_SW3, CS4_SW3}, /* RGB36-Q */
+ {0, CS8_SW3, CS9_SW3, CS7_SW3}, /* RGB37-W */
+ {0, CS11_SW3, CS12_SW3, CS10_SW3}, /* RGB38-E */
+ {0, CS14_SW3, CS15_SW3, CS13_SW3}, /* RGB39-R */
+ {0, CS17_SW3, CS18_SW3, CS16_SW3}, /* RGB40-T */
+ {0, CS20_SW3, CS21_SW3, CS19_SW3}, /* RGB41-Y */
+ {0, CS23_SW3, CS24_SW3, CS22_SW3}, /* RGB42-U */
+ {0, CS26_SW3, CS27_SW3, CS25_SW3}, /* RGB43-I */
+ {0, CS29_SW3, CS30_SW3, CS28_SW3}, /* RGB44-O */
+ {0, CS32_SW3, CS33_SW3, CS31_SW3}, /* RGB45-P */
+ {0, CS35_SW3, CS36_SW3, CS34_SW3}, /* RGB46-[ */
+ {0, CS38_SW3, CS39_SW3, CS37_SW3}, /* RGB47-] */
+ {0, CS26_SW9, CS27_SW9, CS25_SW9}, /* RGB48-\ */
+ {0, CS29_SW9, CS30_SW9, CS28_SW9}, /* RGB49-page up */
+ {0, CS32_SW9, CS33_SW9, CS31_SW9}, /* RGB50-7 */
+ {0, CS35_SW9, CS36_SW9, CS34_SW9}, /* RGB51-8 */
+ {0, CS38_SW9, CS39_SW9, CS37_SW9}, /* RGB52-9 */
+ {0, CS2_SW4, CS3_SW4, CS1_SW4}, /* RGB53-CAPS---ROW3*/
+ {0, CS5_SW4, CS6_SW4, CS4_SW4}, /* RGB54-A-- */
+ {0, CS8_SW4, CS9_SW4, CS7_SW4}, /* RGB55-S-- */
+ {0, CS11_SW4, CS12_SW4, CS10_SW4}, /* RGB56-D */
+ {0, CS14_SW4, CS15_SW4, CS13_SW4}, /* RGB57-F */
+ {0, CS17_SW4, CS18_SW4, CS16_SW4}, /* RGB58-G */
+ {0, CS20_SW4, CS21_SW4, CS19_SW4}, /* RGB59-H */
+ {0, CS23_SW4, CS24_SW4, CS22_SW4}, /* RGB60-J */
+ {0, CS26_SW4, CS27_SW4, CS25_SW4}, /* RGB61-K */
+ {0, CS29_SW4, CS30_SW4, CS28_SW4}, /* RGB62-L */
+ {0, CS32_SW4, CS33_SW4, CS31_SW4}, /* RGB63-;: */
+ {0, CS35_SW4, CS36_SW4, CS34_SW4}, /* RGB64-'" */
+ {0, CS38_SW4, CS39_SW4, CS37_SW4}, /* RGB65-ENTER */
+ {0, CS11_SW7, CS12_SW7, CS10_SW7}, /* RGB66-Page Down */
+ {0, CS14_SW7, CS15_SW7, CS13_SW7}, /* RGB67-4 */
+ {0, CS17_SW7, CS18_SW7, CS16_SW7}, /* RGB68-5 */
+ {0, CS20_SW7, CS21_SW7, CS19_SW7}, /* RGB69-6 */
+ {0, CS23_SW7, CS24_SW7, CS22_SW7}, /* RGB70-+ */
+ {0, CS2_SW5, CS3_SW5, CS1_SW5}, /* RGB71-LSF --ROW4*/
+ {0, CS5_SW5, CS6_SW5, CS4_SW5}, /* RGB72-Z */
+ {0, CS8_SW5, CS9_SW5, CS7_SW5}, /* RGB73-X */
+ {0, CS11_SW5, CS12_SW5, CS10_SW5}, /* RGB74-C */
+ {0, CS14_SW5, CS15_SW5, CS13_SW5}, /* RGB75-V */
+ {0, CS17_SW5, CS18_SW5, CS16_SW5}, /* RGB76-B */
+ {0, CS20_SW5, CS21_SW5, CS19_SW5}, /* RGB77-N */
+ {0, CS23_SW5, CS24_SW5, CS22_SW5}, /* RGB78-M */
+ {0, CS26_SW5, CS27_SW5, CS25_SW5}, /* RGB79-,< */
+ {0, CS29_SW5, CS30_SW5, CS28_SW5}, /* RGB80->. */
+ {0, CS32_SW5, CS33_SW5, CS31_SW5}, /* RGB81-?/ */
+ {0, CS35_SW5, CS36_SW5, CS34_SW5}, /* RGB82-RSF */
+ {0, CS38_SW5, CS39_SW5, CS37_SW5}, /* RGB83-UP */
+ {0, CS14_SW8, CS15_SW8, CS13_SW8}, /* RGB84-1*/
+ {0, CS17_SW8, CS18_SW8, CS16_SW8}, /* RGB85-2 */
+ {0, CS20_SW8, CS21_SW8, CS19_SW8}, /* RGB86-3 */
+ {0, CS23_SW8, CS24_SW8, CS22_SW8}, /* RGB87-Enter */
+ {0, CS2_SW6, CS3_SW6, CS1_SW6}, /* RGB88-lct-- ROW5*/
+ {0, CS5_SW6, CS6_SW6, CS4_SW6}, /* RGB89-lwin */
+ {0, CS8_SW6, CS9_SW6, CS7_SW6}, /* RGB90-lalt */
+ {0, CS11_SW6, CS12_SW6, CS10_SW6}, /* RGB91-sp0 */
+ {0, CS17_SW6, CS18_SW6, CS16_SW6}, /* RGB92-sp */
+ {0, CS26_SW6, CS27_SW6, CS25_SW6}, /* RGB93-sp2 */
+ {0, CS29_SW6, CS30_SW6, CS28_SW6}, /* RGB94-ralt */
+ {0, CS32_SW6, CS33_SW6, CS31_SW6}, /* RGB95- fn */
+ {0, CS35_SW6, CS36_SW6, CS34_SW6}, /* RGB96-left */
+ {0, CS38_SW6, CS39_SW6, CS37_SW6}, /* RGB97-down */
+ {0, CS11_SW9, CS12_SW9, CS10_SW9}, /* RGB98-right */
+ {0, CS14_SW9, CS15_SW9, CS13_SW9}, /* RGB99- 0 */
+ {0, CS20_SW9, CS21_SW9, CS19_SW9} /* RGB100- . */
+};
+
+bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
+ if (record->event.pressed) {
+ switch (keycode) {
+ case QK_KB_0:
+ rgb_matrix_toggle();
+ break;
+
+ case QK_KB_1:
+ rgb_matrix_step();
+ break;
+
+ case QK_KB_2:
+ rgb_matrix_step_reverse();
+ break;
+
+ case QK_KB_3:
+ rgb_matrix_increase_hue(); // Increase the hue for effect range LEDs
+ break;
+
+ case QK_KB_4:
+ rgb_matrix_decrease_hue(); // Decrease the hue for effect range LEDs
+ break;
+
+ case QK_KB_5:
+ rgb_matrix_increase_sat(); // Increase the saturation for effect range LEDs
+ break;
+
+ case QK_KB_6:
+ rgb_matrix_decrease_sat(); // Decrease the saturation for effect range LEDs
+ break;
+
+ case QK_KB_7:
+ rgb_matrix_increase_val(); // Increase the value for effect range LEDs
+ break;
+
+ case QK_KB_8:
+ rgb_matrix_decrease_val(); // Decrease the value for effect range LEDs
+ break;
+
+ case QK_KB_9:
+ rgb_matrix_increase_speed(); // Increase the speed of the animations
+ break;
+
+ case QK_KB_10:
+ rgb_matrix_decrease_speed(); // Decrease the speed of the animations
+ break;
+
+ default:
+ break;
+ }
+ }
+ return process_record_user(keycode, record);
+}
+#endif
+
+const rgblight_segment_t PROGMEM my_capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, 3, HSV_WHITE});
+
+const rgblight_segment_t PROGMEM my_numlock_layer[] = RGBLIGHT_LAYER_SEGMENTS({3, 3, HSV_WHITE});
+
+const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(my_capslock_layer, my_numlock_layer);
+
+void keyboard_post_init_kb(void) {
+ rgblight_layers = my_rgb_layers;
+ keyboard_post_init_user();
+}
+
+bool led_update_kb(led_t led_state) {
+ bool res = led_update_user(led_state);
+ if (res) {
+ rgblight_set_layer_state(0, led_state.caps_lock);
+ rgblight_set_layer_state(1, !led_state.num_lock);
+ }
+ return res;
+}
\ No newline at end of file
diff --git a/keyboards/qwertykeys/qk100/ansi/config.h b/keyboards/qwertykeys/qk100/ansi/config.h
new file mode 100644
index 00000000000..6d0401a3dc8
--- /dev/null
+++ b/keyboards/qwertykeys/qk100/ansi/config.h
@@ -0,0 +1,43 @@
+/*
+Copyright 2023 Qwertykeys
+
+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 .
+*/
+
+#pragma once
+
+# define RGBLIGHT_LAYERS
+# define RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF
+# define RGBLIGHT_LAYERS_RETAIN_VAL
+# define RGBLIGHT_DEFAULT_VAL 10
+# define RGBLIGHT_DEFAULT_MODE RGBLIGHT_MODE_RAINBOW_SWIRL + 5
+# define RGBLIGHT_SLEEP
+/*== customize breathing effect ==*/
+# define RGBLIGHT_BREATHE_TABLE_SIZE 128
+# define RGBLIGHT_EFFECT_BREATHE_CENTER 1.0
+# define RGBLIGHT_EFFECT_BREATHE_MAX 60
+
+/* RGB matrix */
+#define I2C1_CLOCK_SPEED 400000
+#define I2C1_DUTY_CYCLE FAST_DUTY_CYCLE_2
+# define RGB_MATRIX_DISABLE_KEYCODES
+# define RGB_DISABLE_WHEN_USB_SUSPENDED // turn off effects when suspended
+# define RGB_MATRIX_KEYPRESSES // reacts to keypresses
+# define RGB_MATRIX_FRAMEBUFFER_EFFECTS
+# define RGB_MATRIX_LED_PROCESS_LIMIT 4
+# define RGB_MATRIX_LED_FLUSH_LIMIT 26
+# define RGB_MATRIX_STARTUP_VAL 128
+# define DRIVER_ADDR_1 0b0110000
+# define DRIVER_COUNT 1
+# define RGB_MATRIX_LED_COUNT 101
\ No newline at end of file
diff --git a/keyboards/qwertykeys/qk100/ansi/halconf.h b/keyboards/qwertykeys/qk100/ansi/halconf.h
new file mode 100644
index 00000000000..0deaa06aa2e
--- /dev/null
+++ b/keyboards/qwertykeys/qk100/ansi/halconf.h
@@ -0,0 +1,21 @@
+/* Copyright 2023 Qwertykeys
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#define HAL_USE_I2C TRUE
+
+#include_next
\ No newline at end of file
diff --git a/keyboards/qwertykeys/qk100/ansi/info.json b/keyboards/qwertykeys/qk100/ansi/info.json
new file mode 100644
index 00000000000..e9cd6ca3f20
--- /dev/null
+++ b/keyboards/qwertykeys/qk100/ansi/info.json
@@ -0,0 +1,266 @@
+{
+ "keyboard_name": "QK100 ANSI",
+ "usb": {
+ "pid": "0x3030",
+ "device_version": "0.0.1"
+ },
+ "features": {
+ "rgb_matrix": true
+ },
+ "rgb_matrix": {
+ "driver": "is31fl3741",
+ "max_brightness": 200,
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0, "flags": 1},
+ {"matrix": [0, 1], "x": 18, "y": 0, "flags": 1},
+ {"matrix": [0, 2], "x": 30, "y": 0, "flags": 1},
+ {"matrix": [0, 3], "x": 42, "y": 0, "flags": 1},
+ {"matrix": [0, 4], "x": 54, "y": 0, "flags": 1},
+ {"matrix": [0, 5], "x": 72, "y": 0, "flags": 1},
+ {"matrix": [0, 6], "x": 84, "y": 0, "flags": 1},
+ {"matrix": [0, 7], "x": 96, "y": 0, "flags": 1},
+ {"matrix": [0, 8], "x": 108, "y": 0, "flags": 1},
+ {"matrix": [0, 9], "x": 126, "y": 0, "flags": 1},
+ {"matrix": [0, 10], "x": 138, "y": 0, "flags": 1},
+ {"matrix": [0, 11], "x": 150, "y": 0, "flags": 1},
+ {"matrix": [0, 12], "x": 162, "y": 0, "flags": 1},
+ {"matrix": [0, 13], "x": 188, "y": 0, "flags": 1},
+ {"matrix": [0, 14], "x": 200, "y": 0, "flags": 1},
+ {"matrix": [0, 15], "x": 212, "y": 0, "flags": 1},
+ {"matrix": [0, 16], "x": 224, "y": 0, "flags": 1},
+ {"matrix": [1, 0], "x": 0, "y": 13, "flags": 4},
+ {"matrix": [1, 1], "x": 12, "y": 13, "flags": 4},
+ {"matrix": [1, 2], "x": 24, "y": 13, "flags": 4},
+ {"matrix": [1, 3], "x": 36, "y": 13, "flags": 4},
+ {"matrix": [1, 4], "x": 48, "y": 13, "flags": 4},
+ {"matrix": [1, 5], "x": 60, "y": 13, "flags": 4},
+ {"matrix": [1, 6], "x": 72, "y": 13, "flags": 4},
+ {"matrix": [1, 7], "x": 84, "y": 13, "flags": 4},
+ {"matrix": [1, 8], "x": 96, "y": 13, "flags": 4},
+ {"matrix": [1, 9], "x": 108, "y": 13, "flags": 4},
+ {"matrix": [1, 10], "x": 120, "y": 13, "flags": 4},
+ {"matrix": [1, 11], "x": 132, "y": 13, "flags": 4},
+ {"matrix": [1, 12], "x": 144, "y": 13, "flags": 4},
+ {"matrix": [1, 13], "x": 156, "y": 13, "flags": 1},
+ {"matrix": [1, 15], "x": 188, "y": 13, "flags": 1},
+ {"matrix": [1, 16], "x": 200, "y": 13, "flags": 1},
+ {"matrix": [1, 17], "x": 212, "y": 13, "flags": 1},
+ {"matrix": [1, 18], "x": 224, "y": 13, "flags": 1},
+ {"matrix": [2, 0], "x": 0, "y": 26, "flags": 1},
+ {"matrix": [2, 1], "x": 18, "y": 26, "flags": 4},
+ {"matrix": [2, 2], "x": 30, "y": 26, "flags": 4},
+ {"matrix": [2, 3], "x": 42, "y": 26, "flags": 4},
+ {"matrix": [2, 4], "x": 54, "y": 26, "flags": 4},
+ {"matrix": [2, 5], "x": 66, "y": 26, "flags": 4},
+ {"matrix": [2, 6], "x": 78, "y": 26, "flags": 4},
+ {"matrix": [2, 7], "x": 90, "y": 26, "flags": 4},
+ {"matrix": [2, 8], "x": 102, "y": 26, "flags": 4},
+ {"matrix": [2, 9], "x": 114, "y": 26, "flags": 4},
+ {"matrix": [2, 10], "x": 126, "y": 26, "flags": 4},
+ {"matrix": [2, 11], "x": 138, "y": 26, "flags": 4},
+ {"matrix": [2, 12], "x": 150, "y": 26, "flags": 4},
+ {"matrix": [2, 13], "x": 162, "y": 26, "flags": 4},
+ {"matrix": [2, 14], "x": 176, "y": 26, "flags": 1},
+ {"matrix": [2, 15], "x": 188, "y": 26, "flags": 4},
+ {"matrix": [2, 16], "x": 200, "y": 26, "flags": 4},
+ {"matrix": [2, 17], "x": 212, "y": 26, "flags": 4},
+ {"matrix": [3, 0], "x": 0, "y": 39, "flags": 1},
+ {"matrix": [3, 1], "x": 20, "y": 39, "flags": 4},
+ {"matrix": [3, 2], "x": 32, "y": 39, "flags": 4},
+ {"matrix": [3, 3], "x": 44, "y": 39, "flags": 4},
+ {"matrix": [3, 4], "x": 56, "y": 39, "flags": 4},
+ {"matrix": [3, 5], "x": 68, "y": 39, "flags": 4},
+ {"matrix": [3, 6], "x": 80, "y": 39, "flags": 4},
+ {"matrix": [3, 7], "x": 92, "y": 39, "flags": 4},
+ {"matrix": [3, 8], "x": 104, "y": 39, "flags": 4},
+ {"matrix": [3, 9], "x": 116, "y": 39, "flags": 4},
+ {"matrix": [3, 10], "x": 128, "y": 39, "flags": 4},
+ {"matrix": [3, 11], "x": 140, "y": 39, "flags": 4},
+ {"matrix": [3, 13], "x": 158, "y": 39, "flags": 1},
+ {"matrix": [3, 14], "x": 176, "y": 39, "flags": 1},
+ {"matrix": [3, 15], "x": 188, "y": 39, "flags": 4},
+ {"matrix": [3, 16], "x": 200, "y": 39, "flags": 4},
+ {"matrix": [3, 17], "x": 212, "y": 39, "flags": 4},
+ {"matrix": [3, 18], "x": 224, "y": 39, "flags": 1},
+ {"matrix": [4, 0], "x": 0, "y": 52, "flags": 1},
+ {"matrix": [4, 1], "x": 26, "y": 52, "flags": 4},
+ {"matrix": [4, 2], "x": 38, "y": 52, "flags": 4},
+ {"matrix": [4, 3], "x": 50, "y": 52, "flags": 4},
+ {"matrix": [4, 4], "x": 62, "y": 52, "flags": 4},
+ {"matrix": [4, 5], "x": 74, "y": 52, "flags": 4},
+ {"matrix": [4, 6], "x": 86, "y": 52, "flags": 4},
+ {"matrix": [4, 7], "x": 98, "y": 52, "flags": 4},
+ {"matrix": [4, 8], "x": 110, "y": 52, "flags": 4},
+ {"matrix": [4, 9], "x": 122, "y": 52, "flags": 4},
+ {"matrix": [4, 10], "x": 134, "y": 52, "flags": 4},
+ {"matrix": [4, 11], "x": 150, "y": 52, "flags": 1},
+ {"matrix": [4, 13], "x": 170, "y": 52, "flags": 1},
+ {"matrix": [4, 15], "x": 188, "y": 52, "flags": 4},
+ {"matrix": [4, 16], "x": 200, "y": 52, "flags": 4},
+ {"matrix": [4, 17], "x": 212, "y": 52, "flags": 4},
+ {"matrix": [4, 18], "x": 224, "y": 52, "flags": 1},
+ {"matrix": [5, 0], "x": 0, "y": 52, "flags": 1},
+ {"matrix": [5, 1], "x": 14, "y": 52, "flags": 1},
+ {"matrix": [5, 2], "x": 28, "y": 52, "flags": 1},
+ {"matrix": [5, 5], "x": 74, "y": 52, "flags": 4},
+ {"matrix": [5, 9], "x": 122, "y": 52, "flags": 1},
+ {"matrix": [5, 10], "x": 148, "y": 52, "flags": 1},
+ {"matrix": [5, 12], "x": 158, "y": 52, "flags": 1},
+ {"matrix": [5, 13], "x": 170, "y": 52, "flags": 1},
+ {"matrix": [5, 14], "x": 182, "y": 52, "flags": 1},
+ {"matrix": [5, 15], "x": 196, "y": 52, "flags": 4},
+ {"matrix": [5, 17], "x": 212, "y": 52, "flags": 4}
+ ],
+ "animations": {
+ "solid_color": true,
+ "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
+ }
+ },
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"matrix": [0, 0], "x":0, "y":0},
+ {"matrix": [0, 1], "x":2, "y":0},
+ {"matrix": [0, 2], "x":3, "y":0},
+ {"matrix": [0, 3], "x":4, "y":0},
+ {"matrix": [0, 4], "x":5, "y":0},
+ {"matrix": [0, 5], "x":6.5, "y":0},
+ {"matrix": [0, 6], "x":7.5, "y":0},
+ {"matrix": [0, 7], "x":8.5, "y":0},
+ {"matrix": [0, 8], "x":9.5, "y":0},
+ {"matrix": [0, 9], "x":11, "y":0},
+ {"matrix": [0, 10], "x":12, "y":0},
+ {"matrix": [0, 11], "x":13, "y":0},
+ {"matrix": [0, 12], "x":14, "y":0},
+ {"matrix": [0, 15], "x":16.5, "y":0},
+ {"matrix": [0, 16], "x":17.5, "y":0},
+ {"matrix": [0, 17], "x":18.5, "y":0},
+ {"matrix": [0, 18], "x":19.5, "y":0},
+ {"matrix": [1, 0], "x":0, "y":1.25},
+ {"matrix": [1, 1], "x":1, "y":1.25},
+ {"matrix": [1, 2], "x":2, "y":1.25},
+ {"matrix": [1, 3], "x":3, "y":1.25},
+ {"matrix": [1, 4], "x":4, "y":1.25},
+ {"matrix": [1, 5], "x":5, "y":1.25},
+ {"matrix": [1, 6], "x":6, "y":1.25},
+ {"matrix": [1, 7], "x":7, "y":1.25},
+ {"matrix": [1, 8], "x":8, "y":1.25},
+ {"matrix": [1, 9], "x":9, "y":1.25},
+ {"matrix": [1, 10], "x":10, "y":1.25},
+ {"matrix": [1, 11], "x":11, "y":1.25},
+ {"matrix": [1, 12], "x":12, "y":1.25},
+ {"matrix": [1, 13], "x":13, "y":1.25, "w":2},
+ {"matrix": [1, 15], "x":16.5, "y":1.25},
+ {"matrix": [1, 16], "x":17.5, "y":1.25},
+ {"matrix": [1, 17], "x":18.5, "y":1.25},
+ {"matrix": [1, 18], "x":19.5, "y":1.25},
+ {"matrix": [2, 0], "x":0, "y":2.25, "w":1.5},
+ {"matrix": [2, 1], "x":1.5, "y":2.25},
+ {"matrix": [2, 2], "x":2.5, "y":2.25},
+ {"matrix": [2, 3], "x":3.5, "y":2.25},
+ {"matrix": [2, 4], "x":4.5, "y":2.25},
+ {"matrix": [2, 5], "x":5.5, "y":2.25},
+ {"matrix": [2, 6], "x":6.5, "y":2.25},
+ {"matrix": [2, 7], "x":7.5, "y":2.25},
+ {"matrix": [2, 8], "x":8.5, "y":2.25},
+ {"matrix": [2, 9], "x":9.5, "y":2.25},
+ {"matrix": [2, 10], "x":10.5, "y":2.25},
+ {"matrix": [2, 11], "x":11.5, "y":2.25},
+ {"matrix": [2, 12], "x":12.5, "y":2.25},
+ {"matrix": [2, 13], "x":13.5, "y":2.25, "w":1.5},
+ {"matrix": [2, 14], "x":15.25, "y":2.25},
+ {"matrix": [2, 15], "x":16.5, "y":2.25},
+ {"matrix": [2, 16], "x":17.5, "y":2.25},
+ {"matrix": [2, 17], "x":18.5, "y":2.25},
+ {"matrix": [3, 0], "x":0, "y":3.25, "w":1.75},
+ {"matrix": [3, 1], "x":1.75, "y":3.25},
+ {"matrix": [3, 2], "x":2.75, "y":3.25},
+ {"matrix": [3, 3], "x":3.75, "y":3.25},
+ {"matrix": [3, 4], "x":4.75, "y":3.25},
+ {"matrix": [3, 5], "x":5.75, "y":3.25},
+ {"matrix": [3, 6], "x":6.75, "y":3.25},
+ {"matrix": [3, 7], "x":7.75, "y":3.25},
+ {"matrix": [3, 8], "x":8.75, "y":3.25},
+ {"matrix": [3, 9], "x":9.75, "y":3.25},
+ {"matrix": [3, 10], "x":10.75, "y":3.25},
+ {"matrix": [3, 11], "x":11.75, "y":3.25},
+ {"matrix": [3, 13], "x":12.75, "y":3.25, "w":2.25},
+ {"matrix": [3, 14], "x":15.25, "y":3.25},
+ {"matrix": [3, 15], "x":16.5, "y":3.25},
+ {"matrix": [3, 16], "x":17.5, "y":3.25},
+ {"matrix": [3, 17], "x":18.5, "y":3.25},
+ {"matrix": [3, 18], "x":19.5, "y":2.25, "h":2},
+ {"matrix": [4, 0], "x":0, "y":4.25, "w":2.25},
+ {"matrix": [4, 1], "x":2.25, "y":4.25},
+ {"matrix": [4, 2], "x":3.25, "y":4.25},
+ {"matrix": [4, 3], "x":4.25, "y":4.25},
+ {"matrix": [4, 4], "x":5.25, "y":4.25},
+ {"matrix": [4, 5], "x":6.25, "y":4.25},
+ {"matrix": [4, 6], "x":7.25, "y":4.25},
+ {"matrix": [4, 7], "x":8.25, "y":4.25},
+ {"matrix": [4, 8], "x":9.25, "y":4.25},
+ {"matrix": [4, 9], "x":10.25, "y":4.25},
+ {"matrix": [4, 10], "x":11.25, "y":4.25},
+ {"matrix": [4, 11], "x":12.25, "y":4.25, "w":1.75},
+ {"matrix": [4, 13], "x":14.25, "y":4.5},
+ {"matrix": [4, 15], "x":16.5, "y":4.25},
+ {"matrix": [4, 16], "x":17.5, "y":4.25},
+ {"matrix": [4, 17], "x":18.5, "y":4.25},
+ {"matrix": [4, 18], "x":19.5, "y":4.25, "h":2},
+ {"matrix": [5, 0], "x":0, "y":5.25, "w":1.25},
+ {"matrix": [5, 1], "x":1.25, "y":5.25, "w":1.25},
+ {"matrix": [5, 2], "x":2.5, "y":5.25, "w":1.25},
+ {"matrix": [5, 5], "x":3.75, "y":5.25, "w":6.25},
+ {"matrix": [5, 9], "x":10, "y":5.25, "w":1.5},
+ {"matrix": [5, 10], "x":11.5, "y":5.25, "w":1.5},
+ {"matrix": [5, 12], "x":13.25, "y":5.5},
+ {"matrix": [5, 13], "x":14.25, "y":5.5},
+ {"matrix": [5, 14], "x":15.25, "y":5.5},
+ {"matrix": [5, 15], "x":16.5, "y":5.25, "w":2},
+ {"matrix": [5, 17], "x":18.5, "y":5.25}
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/keyboards/qwertykeys/qk100/ansi/keymaps/default/keymap.c b/keyboards/qwertykeys/qk100/ansi/keymaps/default/keymap.c
new file mode 100644
index 00000000000..f081299d50e
--- /dev/null
+++ b/keyboards/qwertykeys/qk100/ansi/keymaps/default/keymap.c
@@ -0,0 +1,38 @@
+/*
+Copyright 2023 Qwertykeys
+
+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 .
+*/
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT(
+ 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_DEL, KC_END, KC_INS, KC_HOME,
+ 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_NUM, KC_PSLS, KC_PAST,KC_PMNS,
+ 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_PGUP, KC_P7, KC_P8, KC_P9,
+ 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_PGDN, KC_P4, KC_P5, KC_P6, KC_PPLS,
+ 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_P1, KC_P2, KC_P3, KC_PENT,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT,KC_P0, KC_PDOT
+ ),
+ [1] = LAYOUT(
+ QK_KB_0, QK_KB_1, QK_KB_2, QK_KB_3, QK_KB_4, QK_KB_5, QK_KB_6, QK_KB_7, QK_KB_8, QK_KB_9, QK_KB_10,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, NK_TOGG, KC_TRNS, 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_TOG, RGB_MOD, RGB_RMOD,RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAD, RGB_VAI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ )
+};
\ No newline at end of file
diff --git a/keyboards/qwertykeys/qk100/ansi/keymaps/via/keymap.c b/keyboards/qwertykeys/qk100/ansi/keymaps/via/keymap.c
new file mode 100644
index 00000000000..f081299d50e
--- /dev/null
+++ b/keyboards/qwertykeys/qk100/ansi/keymaps/via/keymap.c
@@ -0,0 +1,38 @@
+/*
+Copyright 2023 Qwertykeys
+
+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 .
+*/
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT(
+ 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_DEL, KC_END, KC_INS, KC_HOME,
+ 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_NUM, KC_PSLS, KC_PAST,KC_PMNS,
+ 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_PGUP, KC_P7, KC_P8, KC_P9,
+ 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_PGDN, KC_P4, KC_P5, KC_P6, KC_PPLS,
+ 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_P1, KC_P2, KC_P3, KC_PENT,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT,KC_P0, KC_PDOT
+ ),
+ [1] = LAYOUT(
+ QK_KB_0, QK_KB_1, QK_KB_2, QK_KB_3, QK_KB_4, QK_KB_5, QK_KB_6, QK_KB_7, QK_KB_8, QK_KB_9, QK_KB_10,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, NK_TOGG, KC_TRNS, 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_TOG, RGB_MOD, RGB_RMOD,RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAD, RGB_VAI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ )
+};
\ No newline at end of file
diff --git a/keyboards/qwertykeys/qk100/ansi/keymaps/via/rules.mk b/keyboards/qwertykeys/qk100/ansi/keymaps/via/rules.mk
new file mode 100644
index 00000000000..43061db1dd4
--- /dev/null
+++ b/keyboards/qwertykeys/qk100/ansi/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/qwertykeys/qk100/ansi/mcuconf.h b/keyboards/qwertykeys/qk100/ansi/mcuconf.h
new file mode 100644
index 00000000000..a8228a149f1
--- /dev/null
+++ b/keyboards/qwertykeys/qk100/ansi/mcuconf.h
@@ -0,0 +1,25 @@
+/* Copyright 2023 Qwertykeys
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include_next
+
+/*
+ * I2C driver system settings.
+ */
+#undef STM32_I2C_USE_I2C1
+#define STM32_I2C_USE_I2C1 TRUE
\ No newline at end of file
diff --git a/keyboards/qwertykeys/qk100/ansi/readme.md b/keyboards/qwertykeys/qk100/ansi/readme.md
new file mode 100644
index 00000000000..d3360b0420b
--- /dev/null
+++ b/keyboards/qwertykeys/qk100/ansi/readme.md
@@ -0,0 +1,21 @@
+# qk100 - ANSI PCB
+
+
+
+A 100% made by Qwertykeys.
+
+* Keyboard Maintainer: [Qwertykeys](https://github.com/owlab-git)
+* Hardware Supported: qk100 ANSI PCB
+* Hardware Availability: Ended groupbuy: https://www.zfrontier.com/app/flow/qRwKr7mW1oWy
+
+Make example for this keyboard (after setting up your build environment):
+
+ make qwertykeys/qk100/ansi:default
+
+Flashing example for this keyboard:
+
+ make qwertykeys/qk100/ansi:default:flash
+
+**Bootloader:** Press the button B on PCB while plugging in the board.
+
+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).
\ No newline at end of file
diff --git a/keyboards/qwertykeys/qk100/ansi/rules.mk b/keyboards/qwertykeys/qk100/ansi/rules.mk
new file mode 100644
index 00000000000..7ff128fa692
--- /dev/null
+++ b/keyboards/qwertykeys/qk100/ansi/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
\ No newline at end of file
diff --git a/keyboards/qwertykeys/qk100/info.json b/keyboards/qwertykeys/qk100/info.json
new file mode 100644
index 00000000000..c8498f3eafc
--- /dev/null
+++ b/keyboards/qwertykeys/qk100/info.json
@@ -0,0 +1,43 @@
+{
+ "manufacturer": "Qwertykeys",
+ "url": "",
+ "maintainer": "Qwertykeys",
+ "usb": {
+ "vid": "0x4F53"
+ },
+ "matrix_pins": {
+ "cols": ["A7", "B0", "B1", "B2", "B10", "B11", "B12", "B13", "B14", "B15", "A8", "A9", "A10", "A15", "B4", "B5", "B8", "B9", "C13" ],
+ "rows": ["A1", "A2", "A3", "A5", "A4", "A6" ]
+ },
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": true,
+ "extrakey": true,
+ "mousekey": true,
+ "rgblight": true,
+ "nkro": true
+ },
+ "processor": "STM32F103",
+ "bootloader": "stm32duino",
+ "ws2812": {
+ "pin": "B3"
+ },
+ "rgblight": {
+ "animations": {
+ "breathing": true,
+ "knight": true,
+ "rainbow_mood": true,
+ "rainbow_swirl": true,
+ "snake": true,
+ "static_gradient": true
+ },
+ "brightness_steps": 10,
+ "saturation_steps": 8,
+ "led_count": 6,
+ "max_brightness": 120
+
+ },
+ "dynamic_keymap": {
+ "layer_count": 2
+ }
+}
\ No newline at end of file
diff --git a/keyboards/qwertykeys/qk100/solder/config.h b/keyboards/qwertykeys/qk100/solder/config.h
new file mode 100644
index 00000000000..714f01a1daa
--- /dev/null
+++ b/keyboards/qwertykeys/qk100/solder/config.h
@@ -0,0 +1,29 @@
+/*
+Copyright 2023 Qwertykeys
+
+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 .
+*/
+
+#pragma once
+
+# define RGBLIGHT_LAYERS
+# define RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF
+# define RGBLIGHT_LAYERS_RETAIN_VAL
+# define RGBLIGHT_DEFAULT_VAL 10
+# define RGBLIGHT_DEFAULT_MODE RGBLIGHT_MODE_RAINBOW_SWIRL + 5
+# define RGBLIGHT_SLEEP
+/*== customize breathing effect ==*/
+# define RGBLIGHT_BREATHE_TABLE_SIZE 128
+# define RGBLIGHT_EFFECT_BREATHE_CENTER 1.0
+# define RGBLIGHT_EFFECT_BREATHE_MAX 60
\ No newline at end of file
diff --git a/keyboards/qwertykeys/qk100/solder/info.json b/keyboards/qwertykeys/qk100/solder/info.json
new file mode 100644
index 00000000000..64f8945b7fd
--- /dev/null
+++ b/keyboards/qwertykeys/qk100/solder/info.json
@@ -0,0 +1,114 @@
+{
+ "keyboard_name": "qk100 Solder",
+ "usb": {
+ "pid": "0x3053",
+ "device_version": "0.0.1"
+ },
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"matrix": [0, 0], "x":0, "y":0},
+ {"matrix": [0, 1], "x":2, "y":0},
+ {"matrix": [0, 2], "x":3, "y":0},
+ {"matrix": [0, 3], "x":4, "y":0},
+ {"matrix": [0, 4], "x":5, "y":0},
+ {"matrix": [0, 5], "x":6.5, "y":0},
+ {"matrix": [0, 6], "x":7.5, "y":0},
+ {"matrix": [0, 7], "x":8.5, "y":0},
+ {"matrix": [0, 8], "x":9.5, "y":0},
+ {"matrix": [0, 9], "x":11, "y":0},
+ {"matrix": [0, 10], "x":12, "y":0},
+ {"matrix": [0, 11], "x":13, "y":0},
+ {"matrix": [0, 12], "x":14, "y":0},
+ {"matrix": [0, 15], "x":16.5, "y":0},
+ {"matrix": [0, 16], "x":17.5, "y":0},
+ {"matrix": [0, 17], "x":18.5, "y":0},
+ {"matrix": [0, 18], "x":19.5, "y":0},
+ {"matrix": [1, 0], "x":0, "y":1.25},
+ {"matrix": [1, 1], "x":1, "y":1.25},
+ {"matrix": [1, 2], "x":2, "y":1.25},
+ {"matrix": [1, 3], "x":3, "y":1.25},
+ {"matrix": [1, 4], "x":4, "y":1.25},
+ {"matrix": [1, 5], "x":5, "y":1.25},
+ {"matrix": [1, 6], "x":6, "y":1.25},
+ {"matrix": [1, 7], "x":7, "y":1.25},
+ {"matrix": [1, 8], "x":8, "y":1.25},
+ {"matrix": [1, 9], "x":9, "y":1.25},
+ {"matrix": [1, 10], "x":10, "y":1.25},
+ {"matrix": [1, 11], "x":11, "y":1.25},
+ {"matrix": [1, 12], "x":12, "y":1.25},
+ {"matrix": [2, 13], "x":13, "y":1.25},
+ {"matrix": [1, 13], "x":14, "y":1.25},
+ {"matrix": [1, 15], "x":16.5, "y":1.25},
+ {"matrix": [1, 16], "x":17.5, "y":1.25},
+ {"matrix": [1, 17], "x":18.5, "y":1.25},
+ {"matrix": [1, 18], "x":19.5, "y":1.25},
+ {"matrix": [2, 0], "x":0, "y":2.25, "w":1.5},
+ {"matrix": [2, 1], "x":1.5, "y":2.25},
+ {"matrix": [2, 2], "x":2.5, "y":2.25},
+ {"matrix": [2, 3], "x":3.5, "y":2.25},
+ {"matrix": [2, 4], "x":4.5, "y":2.25},
+ {"matrix": [2, 5], "x":5.5, "y":2.25},
+ {"matrix": [2, 6], "x":6.5, "y":2.25},
+ {"matrix": [2, 7], "x":7.5, "y":2.25},
+ {"matrix": [2, 8], "x":8.5, "y":2.25},
+ {"matrix": [2, 9], "x":9.5, "y":2.25},
+ {"matrix": [2, 10], "x":10.5, "y":2.25},
+ {"matrix": [2, 11], "x":11.5, "y":2.25},
+ {"matrix": [2, 12], "x":12.5, "y":2.25},
+ {"matrix": [3, 12], "x":13.5, "y":2.25, "w":1.5},
+ {"matrix": [2, 14], "x":15.25, "y":2.25},
+ {"matrix": [2, 15], "x":16.5, "y":2.25},
+ {"matrix": [2, 16], "x":17.5, "y":2.25},
+ {"matrix": [2, 17], "x":18.5, "y":2.25},
+ {"matrix": [3, 0], "x":0, "y":3.25, "w":1.75},
+ {"matrix": [3, 1], "x":1.75, "y":3.25},
+ {"matrix": [3, 2], "x":2.75, "y":3.25},
+ {"matrix": [3, 3], "x":3.75, "y":3.25},
+ {"matrix": [3, 4], "x":4.75, "y":3.25},
+ {"matrix": [3, 5], "x":5.75, "y":3.25},
+ {"matrix": [3, 6], "x":6.75, "y":3.25},
+ {"matrix": [3, 7], "x":7.75, "y":3.25},
+ {"matrix": [3, 8], "x":8.75, "y":3.25},
+ {"matrix": [3, 9], "x":9.75, "y":3.25},
+ {"matrix": [3, 10], "x":10.75, "y":3.25},
+ {"matrix": [3, 11], "x":11.75, "y":3.25},
+ {"matrix": [3, 13], "x":12.75, "y":3.25, "w":2.25},
+ {"matrix": [3, 14], "x":15.25, "y":3.25},
+ {"matrix": [3, 15], "x":16.5, "y":3.25},
+ {"matrix": [3, 16], "x":17.5, "y":3.25},
+ {"matrix": [3, 17], "x":18.5, "y":3.25},
+ {"matrix": [3, 18], "x":19.5, "y":2.25, "h":2},
+ {"matrix": [4, 0], "x":0, "y":4.25, "w":1.25},
+ {"matrix": [5, 3], "x":1.25, "y":4.25},
+ {"matrix": [4, 1], "x":2.25, "y":4.25},
+ {"matrix": [4, 2], "x":3.25, "y":4.25},
+ {"matrix": [4, 3], "x":4.25, "y":4.25},
+ {"matrix": [4, 4], "x":5.25, "y":4.25},
+ {"matrix": [4, 5], "x":6.25, "y":4.25},
+ {"matrix": [4, 6], "x":7.25, "y":4.25},
+ {"matrix": [4, 7], "x":8.25, "y":4.25},
+ {"matrix": [4, 8], "x":9.25, "y":4.25},
+ {"matrix": [4, 9], "x":10.25, "y":4.25},
+ {"matrix": [4, 10], "x":11.25, "y":4.25},
+ {"matrix": [4, 11], "x":12.25, "y":4.25, "w":1.75},
+ {"matrix": [4, 13], "x":14.25, "y":4.5},
+ {"matrix": [4, 15], "x":16.5, "y":4.25},
+ {"matrix": [4, 16], "x":17.5, "y":4.25},
+ {"matrix": [4, 17], "x":18.5, "y":4.25},
+ {"matrix": [4, 18], "x":19.5, "y":4.25, "h":2},
+ {"matrix": [5, 0], "x":0, "y":5.25, "w":1.25},
+ {"matrix": [5, 1], "x":1.25, "y":5.25, "w":1.25},
+ {"matrix": [5, 2], "x":2.5, "y":5.25, "w":1.25},
+ {"matrix": [5, 5], "x":3.75, "y":5.25, "w":6.25},
+ {"matrix": [5, 9], "x":10, "y":5.25, "w":1.5},
+ {"matrix": [5, 10], "x":11.5, "y":5.25, "w":1.5},
+ {"matrix": [5, 12], "x":13.25, "y":5.5},
+ {"matrix": [5, 13], "x":14.25, "y":5.5},
+ {"matrix": [5, 14], "x":15.25, "y":5.5},
+ {"matrix": [5, 15], "x":16.5, "y":5.25, "w":2},
+ {"matrix": [5, 17], "x":18.5, "y":5.25}
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/keyboards/qwertykeys/qk100/solder/keymaps/default/keymap.c b/keyboards/qwertykeys/qk100/solder/keymaps/default/keymap.c
new file mode 100644
index 00000000000..20d727431cb
--- /dev/null
+++ b/keyboards/qwertykeys/qk100/solder/keymaps/default/keymap.c
@@ -0,0 +1,38 @@
+/*
+Copyright 2023 Qwertykeys
+
+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 .
+*/
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT(
+ 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_DEL, KC_END, KC_INS, KC_HOME,
+ 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_BSLS, KC_BSPC, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS,
+ 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_PGUP, KC_P7, KC_P8, KC_P9,
+ 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_PGDN, KC_P4, KC_P5, KC_P6, KC_PPLS,
+ 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_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT,KC_P0, KC_PDOT
+ ),
+ [1] = LAYOUT(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, NK_TOGG, KC_TRNS, KC_TRNS, 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_TOG, RGB_MOD, RGB_RMOD,RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAD, RGB_VAI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ )
+};
\ No newline at end of file
diff --git a/keyboards/qwertykeys/qk100/solder/keymaps/via/keymap.c b/keyboards/qwertykeys/qk100/solder/keymaps/via/keymap.c
new file mode 100644
index 00000000000..20d727431cb
--- /dev/null
+++ b/keyboards/qwertykeys/qk100/solder/keymaps/via/keymap.c
@@ -0,0 +1,38 @@
+/*
+Copyright 2023 Qwertykeys
+
+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 .
+*/
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT(
+ 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_DEL, KC_END, KC_INS, KC_HOME,
+ 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_BSLS, KC_BSPC, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS,
+ 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_PGUP, KC_P7, KC_P8, KC_P9,
+ 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_PGDN, KC_P4, KC_P5, KC_P6, KC_PPLS,
+ 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_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT,KC_P0, KC_PDOT
+ ),
+ [1] = LAYOUT(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, NK_TOGG, KC_TRNS, KC_TRNS, 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_TOG, RGB_MOD, RGB_RMOD,RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAD, RGB_VAI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ )
+};
\ No newline at end of file
diff --git a/keyboards/qwertykeys/qk100/solder/keymaps/via/rules.mk b/keyboards/qwertykeys/qk100/solder/keymaps/via/rules.mk
new file mode 100644
index 00000000000..43061db1dd4
--- /dev/null
+++ b/keyboards/qwertykeys/qk100/solder/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/qwertykeys/qk100/solder/readme.md b/keyboards/qwertykeys/qk100/solder/readme.md
new file mode 100644
index 00000000000..f660fe0d42c
--- /dev/null
+++ b/keyboards/qwertykeys/qk100/solder/readme.md
@@ -0,0 +1,21 @@
+# qk100 - Solder PCB
+
+
+
+A 100% made by Qwertykeys.
+
+* Keyboard Maintainer: [Qwertykeys](https://github.com/owlab-git)
+* Hardware Supported: qk100 Solder PCB
+* Hardware Availability: Ended groupbuy: https://www.zfrontier.com/app/flow/qRwKr7mW1oWy
+
+Make example for this keyboard (after setting up your build environment):
+
+ make qwertykeys/qk100/solder:default
+
+Flashing example for this keyboard:
+
+ make qwertykeys/qk100/solder:default:flash
+
+**Bootloader:** Press the button B on PCB while plugging in the board.
+
+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).
\ No newline at end of file
diff --git a/keyboards/qwertykeys/qk100/solder/rules.mk b/keyboards/qwertykeys/qk100/solder/rules.mk
new file mode 100644
index 00000000000..7ff128fa692
--- /dev/null
+++ b/keyboards/qwertykeys/qk100/solder/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
\ No newline at end of file
diff --git a/keyboards/qwertykeys/qk100/solder/solder.c b/keyboards/qwertykeys/qk100/solder/solder.c
new file mode 100644
index 00000000000..8a3e46dab79
--- /dev/null
+++ b/keyboards/qwertykeys/qk100/solder/solder.c
@@ -0,0 +1,37 @@
+/*
+Copyright 2023 Qwertykeys
+
+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 .
+*/
+#include "quantum.h"
+
+const rgblight_segment_t PROGMEM my_capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, 3, HSV_WHITE});
+
+const rgblight_segment_t PROGMEM my_numlock_layer[] = RGBLIGHT_LAYER_SEGMENTS({3, 3, HSV_WHITE});
+
+const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(my_capslock_layer, my_numlock_layer);
+
+void keyboard_post_init_kb(void) {
+ rgblight_layers = my_rgb_layers;
+ keyboard_post_init_user();
+}
+
+bool led_update_kb(led_t led_state) {
+ bool res = led_update_user(led_state);
+ if (res) {
+ rgblight_set_layer_state(0, led_state.caps_lock);
+ rgblight_set_layer_state(1, !led_state.num_lock);
+ }
+ return res;
+}
\ No newline at end of file
diff --git a/keyboards/rmi_kb/herringbone/pro/info.json b/keyboards/rmi_kb/herringbone/pro/info.json
index bbef69f28aa..caab0f11e15 100644
--- a/keyboards/rmi_kb/herringbone/pro/info.json
+++ b/keyboards/rmi_kb/herringbone/pro/info.json
@@ -15,7 +15,7 @@
"diode_direction": "COL2ROW",
"encoder": {
"rotary": [
- {"pin_a": "C3", "pin_b": "C2"}
+ {"pin_a": "C3", "pin_b": "C2", "resolution": 2}
]
},
"processor": "atmega32a",
@@ -247,9 +247,7 @@
{"matrix": [0, 13], "x": 14, "y": 0},
- {"matrix": [6, 0], "x": 15.25, "y": 0},
- {"matrix": [0, 14], "x": 16.25, "y": 0},
- {"matrix": [6, 1], "x": 17.25, "y": 0},
+ {"matrix": [0, 14], "x": 15.5, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1.25},
{"matrix": [1, 1], "x": 1, "y": 1.25},
@@ -329,7 +327,9 @@
{"matrix": [5, 9], "x": 10, "y": 5.25, "w": 1.5},
{"matrix": [5, 10], "x": 11.5, "y": 5.25, "w": 1.5},
- {"matrix": [5, 13], "x": 14.25, "y": 5.5}
+ {"matrix": [5, 12], "x": 13.25, "y": 5.5},
+ {"matrix": [5, 13], "x": 14.25, "y": 5.5},
+ {"matrix": [5, 14], "x": 15.25, "y": 5.5}
]
}
}
diff --git a/keyboards/snes_macropad/config.h b/keyboards/snes_macropad/config.h
new file mode 100644
index 00000000000..c5edeb55f1d
--- /dev/null
+++ b/keyboards/snes_macropad/config.h
@@ -0,0 +1,12 @@
+// Copyright 2023 John Barbero Unenge (@jbarberu)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED GP25
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 500U
+
+#define I2C_DRIVER I2CD1
+#define I2C1_SDA_PIN GP14
+#define I2C1_SCL_PIN GP15
diff --git a/keyboards/snes_macropad/halconf.h b/keyboards/snes_macropad/halconf.h
new file mode 100644
index 00000000000..3fcb2f4eb60
--- /dev/null
+++ b/keyboards/snes_macropad/halconf.h
@@ -0,0 +1,8 @@
+// Copyright 2023 John Barbero Unenge (@jbarberu)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define HAL_USE_I2C TRUE
+
+#include_next
diff --git a/keyboards/snes_macropad/info.json b/keyboards/snes_macropad/info.json
new file mode 100644
index 00000000000..15e3c9ee678
--- /dev/null
+++ b/keyboards/snes_macropad/info.json
@@ -0,0 +1,79 @@
+{
+ "manufacturer": "JBarberU's",
+ "keyboard_name": "SNES Macropad",
+ "maintainer": "jbarberu",
+ "bootloader": "rp2040",
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": false,
+ "command": false,
+ "console": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgblight": true,
+ "oled": true
+ },
+ "ws2812": {
+ "pin": "GP5",
+ "driver": "vendor"
+ },
+ "processor": "RP2040",
+ "matrix_size": {
+ "cols": 4,
+ "rows": 6
+ },
+ "url": "",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x0000",
+ "vid": "0xFEED"
+ },
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1},
+ {"matrix": [1, 1], "x": 1, "y": 1},
+ {"matrix": [1, 2], "x": 2, "y": 1},
+ {"matrix": [1, 3], "x": 3, "y": 1},
+ {"matrix": [2, 0], "x": 0, "y": 2},
+ {"matrix": [2, 1], "x": 1, "y": 2},
+ {"matrix": [2, 2], "x": 2, "y": 2},
+ {"matrix": [2, 3], "x": 3, "y": 2},
+
+ {"matrix": [3, 0], "x": 5.2, "y": 0, "w": 2, "h": 0.75},
+ {"matrix": [3, 1], "x": 10.65, "y": 0, "w": 2, "h": 0.75},
+ {"matrix": [3, 2], "x": 7.9, "y": 2.5, "w": 1, "h": 0.75},
+ {"matrix": [3, 3], "x": 8.9, "y": 2.5, "w": 1, "h": 0.75},
+ {"matrix": [4, 0], "x": 6, "y": 1, "w": 0.85, "h": 0.85},
+ {"matrix": [4, 1], "x": 6, "y": 3, "w": 0.85, "h": 0.85},
+ {"matrix": [4, 2], "x": 5.2, "y": 2, "w": 0.85, "h": 0.85},
+ {"matrix": [4, 3], "x": 6.8, "y": 2, "w": 0.85, "h": 0.85},
+ {"matrix": [5, 0], "x": 11.8, "y": 2, "w": 0.85, "h": 0.85},
+ {"matrix": [5, 1], "x": 11, "y": 3, "w": 0.85, "h": 0.85},
+ {"matrix": [5, 2], "x": 11, "y": 1, "w": 0.85, "h": 0.85},
+ {"matrix": [5, 3], "x": 10.2, "y": 2, "w": 0.85, "h": 0.85}
+ ]
+ }
+ },
+ "rgblight": {
+ "led_count": 12,
+ "max_brightness": 80,
+ "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
+ }
+ }
+}
diff --git a/keyboards/snes_macropad/keymaps/default/keymap.c b/keyboards/snes_macropad/keymaps/default/keymap.c
new file mode 100644
index 00000000000..c4896b1f49b
--- /dev/null
+++ b/keyboards/snes_macropad/keymaps/default/keymap.c
@@ -0,0 +1,75 @@
+// Copyright 2023 John Barbero Unenge (@jbarberu)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+enum Layer {
+ L_Numpad = 0,
+ L_Symbols,
+ L_RGB,
+};
+
+// clang-format off
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /*
+ * Macropad Button Order
+ * ┌───┬───┬───┬───┐
+ * │ 7 │ 8 │ 9 │ - │
+ * ├───┼───┼───┼───┤
+ * │ 4 │ 5 │ 6 │ + │
+ * ├───┼───┼───┼───┤
+ * │ 1 │ 2 │ 3 │ 0 │
+ * └───┴───┴───┴───┘
+ *
+ * SNES Button Order
+ * ┌────────┬────────┬────────┬────────┐
+ * │ LT │ RT │ START │ SELECT │
+ * ├────────┼────────┼────────┼────────┤
+ * │ UP │ DOWN │ LEFT │ RIGHT │
+ * ├────────┼────────┼────────┼────────┤
+ * │ A │ B │ X │ Y │
+ * └────────┴────────┴────────┴────────┘
+ *
+ */
+ [L_Numpad] = LAYOUT(
+ KC_P7, KC_P8, KC_P9, TO(L_RGB)
+ , KC_P4, KC_P5, KC_P6, LT(L_Symbols, KC_PCMM)
+ , KC_P1, KC_P2, KC_P3, KC_P0
+
+ , KC_A, KC_S, KC_ENT, KC_BSPC
+ , KC_UP, KC_DOWN, KC_LEFT, KC_RIGHT
+ , KC_X, KC_Z, LSFT(KC_F1),KC_TAB
+ ),
+ [L_RGB] = LAYOUT(
+ RGB_M_P, RGB_M_B, RGB_TOG, KC_NO
+ , RGB_MOD, RGB_HUI, RGB_VAI, TO(L_Numpad)
+ , RGB_RMOD, RGB_HUD, RGB_VAD, KC_NO
+
+ , KC_A, KC_B, KC_C, KC_D
+ , KC_E, KC_F, KC_G, KC_H
+ , KC_I, KC_J, KC_K, KC_L
+ ),
+ [L_Symbols] = LAYOUT(
+ KC_PPLS, KC_PMNS, KC_PEQL, KC_NO
+ , KC_PAST, KC_PSLS, KC_ENT, KC_TRNS
+ , KC_NUM, KC_NO, KC_NO, QK_BOOT
+
+ , KC_A, KC_B, KC_C, KC_D
+ , KC_E, KC_F, KC_G, KC_H
+ , KC_I, KC_J, KC_K, KC_L
+ )
+};
+// clang-format on
+
+const char* get_layer_name_user(uint8_t layer) {
+ switch (layer) {
+ case L_Numpad:
+ return "Numpad";
+ case L_RGB:
+ return "RGB Controls";
+ case L_Symbols:
+ return "Symbols";
+ default:
+ return "Undef";
+ }
+}
diff --git a/keyboards/snes_macropad/keymaps/jbarberu/keymap.c b/keyboards/snes_macropad/keymaps/jbarberu/keymap.c
new file mode 100644
index 00000000000..478d1461e25
--- /dev/null
+++ b/keyboards/snes_macropad/keymaps/jbarberu/keymap.c
@@ -0,0 +1,99 @@
+// Copyright 2023 John Barbero Unenge (@jbarberu)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+enum Layer {
+ L_Numpad = 0,
+ L_Symbols,
+ L_EasyEDA,
+ L_RGB,
+ L_Adjust
+};
+
+// clang-format off
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /*
+ * Macropad Button Order
+ * ┌───┬───┬───┬───┐
+ * │ 7 │ 8 │ 9 │ - │
+ * ├───┼───┼───┼───┤
+ * │ 4 │ 5 │ 6 │ + │
+ * ├───┼───┼───┼───┤
+ * │ 1 │ 2 │ 3 │ 0 │
+ * └───┴───┴───┴───┘
+ *
+ * SNES Button Order
+ * ┌────────┬────────┬────────┬────────┐
+ * │ LT │ RT │ START │ SELECT │
+ * ├────────┼────────┼────────┼────────┤
+ * │ UP │ DOWN │ LEFT │ RIGHT │
+ * ├────────┼────────┼────────┼────────┤
+ * │ A │ B │ X │ Y │
+ * └────────┴────────┴────────┴────────┘
+ *
+ */
+ [L_Numpad] = LAYOUT(
+ KC_P7, KC_P8, KC_P9, TO(L_EasyEDA)
+ , KC_P4, KC_P5, KC_P6, LT(L_Symbols, KC_PCMM)
+ , KC_P1, KC_P2, KC_P3, KC_P0
+
+ , KC_A, KC_S, KC_ENT, KC_BSPC
+ , KC_UP, KC_DOWN, KC_LEFT, KC_RIGHT
+ , KC_X, KC_Z, LSFT(KC_F1), KC_TAB
+ ),
+ [L_EasyEDA] = LAYOUT(
+ KC_COMM, KC_DOT, KC_K, TO(L_RGB)
+ , KC_LSFT, KC_M, KC_N, TO(L_Numpad)
+ , KC_LCTL, KC_SPC, KC_DEL, KC_BSPC
+
+ , KC_A, KC_B, KC_C, KC_D
+ , QK_BOOT, KC_TRNS, KC_G, KC_H
+ , KC_I, KC_J, KC_K, KC_L
+ ),
+ [L_RGB] = LAYOUT(
+ RGB_M_P, RGB_M_B, RGB_TOG, TO(L_Adjust)
+ , RGB_MOD, RGB_HUI, RGB_VAI, TO(L_Numpad)
+ , RGB_RMOD, RGB_HUD, RGB_VAD, KC_NO
+
+ , KC_A, KC_B, KC_C, KC_D
+ , KC_E, KC_F, KC_G, KC_H
+ , KC_I, KC_J, KC_K, KC_L
+ ),
+ [L_Adjust] = LAYOUT(
+ KC_NO, KC_P8, KC_NO, KC_NO
+ , KC_NO, RGB_HUD, KC_NO, TO(L_Numpad)
+ , RGB_HUI, KC_NO, KC_TRNS, KC_NO
+
+ , KC_A, KC_B, KC_C, KC_D
+ , KC_E, KC_F, KC_G, KC_H
+ , KC_I, KC_J, KC_K, KC_L
+ ),
+ [L_Symbols] = LAYOUT(
+ KC_PPLS, KC_PMNS, KC_PEQL, KC_NO
+ , KC_PAST, KC_PSLS, KC_ENT, KC_TRNS
+ , KC_NUM, KC_NO, KC_NO, QK_BOOT
+
+ , KC_A, KC_B, KC_C, KC_D
+ , KC_E, KC_F, KC_G, KC_H
+ , KC_I, KC_J, KC_K, KC_L
+ )
+};
+// clang-format on
+
+const char * get_layer_name_user(uint8_t layer) {
+ switch (layer) {
+ case L_Numpad:
+ return "Numpad";
+ case L_EasyEDA:
+ return "EasyEDA";
+ case L_RGB:
+ return "RGB Controls";
+ case L_Adjust:
+ return "Adjust";
+ case L_Symbols:
+ return "Symbols";
+ default:
+ return "Undef";
+ }
+}
diff --git a/keyboards/snes_macropad/keymaps/test/keymap.c b/keyboards/snes_macropad/keymaps/test/keymap.c
new file mode 100644
index 00000000000..72be941694c
--- /dev/null
+++ b/keyboards/snes_macropad/keymaps/test/keymap.c
@@ -0,0 +1,75 @@
+// Copyright 2023 John Barbero Unenge (@jbarberu)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+enum Layer {
+ L_Numpad = 0,
+ L_Symbols,
+ L_RGB
+};
+
+// clang-format off
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /*
+ * Macropad Button Order
+ * ┌───┬───┬───┬───┐
+ * │ 7 │ 8 │ 9 │ - │
+ * ├───┼───┼───┼───┤
+ * │ 4 │ 5 │ 6 │ + │
+ * ├───┼───┼───┼───┤
+ * │ 1 │ 2 │ 3 │ 0 │
+ * └───┴───┴───┴───┘
+ *
+ * SNES Button Order
+ * ┌────────┬────────┬────────┬────────┐
+ * │ LT │ RT │ START │ SELECT │
+ * ├────────┼────────┼────────┼────────┤
+ * │ UP │ DOWN │ LEFT │ RIGHT │
+ * ├────────┼────────┼────────┼────────┤
+ * │ A │ B │ X │ Y │
+ * └────────┴────────┴────────┴────────┘
+ *
+ */
+ [L_Numpad] = LAYOUT(
+ KC_1, KC_2, KC_3, KC_4
+ , KC_5, KC_6, KC_7, KC_8
+ , KC_9, KC_0, KC_A, KC_S
+
+ , KC_A, KC_S, KC_ENT, KC_BSPC
+ , KC_UP, KC_DOWN, KC_LEFT, KC_RIGHT
+ , KC_X, KC_Z, LSFT(KC_F1),KC_TAB
+ ),
+ [L_RGB] = LAYOUT(
+ RGB_M_P, RGB_M_B, RGB_TOG, KC_NO
+ , RGB_MOD, RGB_HUI, RGB_VAI, TO(L_Numpad)
+ , RGB_RMOD, RGB_HUD, RGB_VAD, KC_NO
+
+ , KC_A, KC_B, KC_C, KC_D
+ , KC_E, KC_F, KC_G, KC_H
+ , KC_I, KC_J, KC_K, KC_L
+ ),
+ [L_Symbols] = LAYOUT(
+ KC_PPLS, KC_PMNS, KC_PEQL, KC_NO
+ , KC_PAST, KC_PSLS, KC_ENT, KC_TRNS
+ , KC_NUM, KC_NO, KC_NO, QK_BOOT
+
+ , KC_A, KC_B, KC_C, KC_D
+ , KC_E, KC_F, KC_G, KC_H
+ , KC_I, KC_J, KC_K, KC_L
+ )
+};
+// clang-format on
+
+const char * get_layer_name_user(uint8_t layer) {
+ switch (layer) {
+ case L_Numpad:
+ return "Numpad";
+ case L_RGB:
+ return "RGB Controls";
+ case L_Symbols:
+ return "Symbols";
+ default:
+ return "Undef";
+ }
+}
diff --git a/keyboards/snes_macropad/matrix.c b/keyboards/snes_macropad/matrix.c
new file mode 100644
index 00000000000..28d036aca9c
--- /dev/null
+++ b/keyboards/snes_macropad/matrix.c
@@ -0,0 +1,146 @@
+// Copyright 2023 John Barbero Unenge (@jbarberu)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "matrix.h"
+#include "gpio.h"
+#include "wait.h"
+#include "string.h"
+
+#define SNES_CLOCK GP0
+#define SNES_LATCH GP1
+#define SNES_D0 GP2
+#define SNES_D1 GP3
+#define SNES_IO GP4
+
+#define KBD_ROW0 GP24
+#define KBD_ROW1 GP23
+#define KBD_ROW2 GP22
+#define KBD_NUM_ROWS 3
+
+#define KBD_COL0 GP18
+#define KBD_COL1 GP19
+#define KBD_COL2 GP20
+#define KBD_COL3 GP21
+#define KBD_ROW_SETUP_DELAY_US 5
+
+// The real snes will clock 16 bits out of the controller, but only really has 12 bits of data
+#define SNES_DATA_BITS 16
+#define SNES_DATA_SETUP_DELAY_US 10
+#define SNES_CLOCK_PULSE_DURATION 10
+
+static const int kbd_pin_map[] = {
+ KBD_ROW0,
+ KBD_ROW1,
+ KBD_ROW2
+};
+
+void matrix_init_custom(void) {
+ // init snes controller
+ setPinInputHigh(SNES_D0);
+ // todo: look into protocol for other strange snes controllers that use D1 and IO
+ // setPinInputHigh(SNES_D1);
+ // setPinInputHigh(SNES_IO);
+ setPinOutput(SNES_CLOCK);
+ setPinOutput(SNES_LATCH);
+ writePinLow(SNES_CLOCK);
+ writePinLow(SNES_LATCH);
+
+ // init rows
+ setPinOutput(KBD_ROW0);
+ setPinOutput(KBD_ROW1);
+ setPinOutput(KBD_ROW2);
+ writePinHigh(KBD_ROW0);
+ writePinHigh(KBD_ROW1);
+ writePinHigh(KBD_ROW2);
+
+ // init columns
+ setPinInputHigh(KBD_COL0);
+ setPinInputHigh(KBD_COL1);
+ setPinInputHigh(KBD_COL2);
+ setPinInputHigh(KBD_COL3);
+}
+
+static matrix_row_t readRow(size_t row, int setupDelay) {
+ const int pin = kbd_pin_map[row];
+
+ // select the row
+ setPinOutput(pin);
+ writePinLow(pin);
+ wait_us(setupDelay);
+
+ // read the column data
+ const matrix_row_t ret =
+ (readPin(KBD_COL0) ? 0 : 1 << 0)
+ | (readPin(KBD_COL1) ? 0 : 1 << 1)
+ | (readPin(KBD_COL2) ? 0 : 1 << 2)
+ | (readPin(KBD_COL3) ? 0 : 1 << 3);
+
+ // deselect the row
+ setPinOutput(pin);
+ writePinHigh(pin);
+
+ return ret;
+}
+
+static void readKeyboard(matrix_row_t current_matrix[]) {
+ for (size_t row = 0; row < KBD_NUM_ROWS; ++row) {
+ current_matrix[row] = readRow(row, KBD_ROW_SETUP_DELAY_US);
+ }
+}
+
+static matrix_row_t getBits(uint16_t value, size_t bit0, size_t bit1, size_t bit2, size_t bit3) {
+ matrix_row_t ret = 0;
+ ret |= (value >> bit3) & 1;
+ ret <<= 1;
+ ret |= (value >> bit2) & 1;
+ ret <<= 1;
+ ret |= (value >> bit1) & 1;
+ ret <<= 1;
+ ret |= (value >> bit0) & 1;
+ return ret;
+}
+
+static void readSnesController(matrix_row_t current_matrix[]) {
+ uint16_t controller = 0;
+
+ writePinHigh(SNES_LATCH);
+
+ for (size_t bit = 0; bit < SNES_DATA_BITS; ++bit) {
+ // Wait for shift register to setup the data line
+ wait_us(SNES_DATA_SETUP_DELAY_US);
+
+ // Shift accumulated data and read data pin
+ controller <<= 1;
+ controller |= readPin(SNES_D0) ? 0 : 1;
+ // todo: maybe read D1 and IO here too
+
+ // Shift next bit in
+ writePinHigh(SNES_CLOCK);
+ wait_us(SNES_CLOCK_PULSE_DURATION);
+ writePinLow(SNES_CLOCK);
+ }
+
+ writePinLow(SNES_LATCH);
+
+ controller >>= 4;
+
+ // SNES button order is pretty random, and we'd like them to be a bit tidier
+ current_matrix[3] = getBits(controller, 1, 0, 8, 9);
+ current_matrix[4] = getBits(controller, 7, 6, 5, 4);
+ current_matrix[5] = getBits(controller, 3, 11, 2, 10);
+}
+
+bool matrix_scan_custom(matrix_row_t current_matrix[]) {
+ const size_t MATRIX_ARRAY_SIZE = MATRIX_ROWS * sizeof(matrix_row_t);
+
+ // create a copy of the current_matrix, before we read hardware state
+ matrix_row_t last_value[MATRIX_ROWS];
+ memcpy(last_value, current_matrix, MATRIX_ARRAY_SIZE);
+
+ // read hardware state into current_matrix
+ readKeyboard(current_matrix);
+ readSnesController(current_matrix);
+
+ // check if anything changed
+ return memcmp(last_value, current_matrix, MATRIX_ARRAY_SIZE) != 0;
+}
diff --git a/keyboards/snes_macropad/mcuconf.h b/keyboards/snes_macropad/mcuconf.h
new file mode 100644
index 00000000000..0bbd4fef628
--- /dev/null
+++ b/keyboards/snes_macropad/mcuconf.h
@@ -0,0 +1,18 @@
+// Copyright 2023 John Barbero Unenge (@jbarberu)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include_next
+
+#undef RP_PWM_USE_PWM0
+#define RP_PWM_USE_PWM0 TRUE
+
+#undef RP_PWM_USE_PWM4
+#define RP_PWM_USE_PWM4 TRUE
+
+#undef RP_I2C_USE_I2C0
+#define RP_I2C_USE_I2C0 FALSE
+
+#undef RP_I2C_USE_I2C1
+#define RP_I2C_USE_I2C1 TRUE
diff --git a/keyboards/snes_macropad/readme.md b/keyboards/snes_macropad/readme.md
new file mode 100644
index 00000000000..9ef5e041496
--- /dev/null
+++ b/keyboards/snes_macropad/readme.md
@@ -0,0 +1,36 @@
+# snes_macropad
+
+
+*Completed Build*
+
+
+*Completed Build, closer with RGB off*
+
+
+*PCB and FR4 top/bottom plates*
+
+The SNES Macropad is, as it sounds, a macropad that features a SNES connector. In addition it has a qwiic connector and a 3.5mm jack for 3.3V I2C (not audio), allowing additional expansion.
+
+This QMK implementation exposes the SNES controller as a part of the keyboard, meaning you can map the controller to do anything a qmk keyboard can. The layout is thus a 4x6 keyboard logically, split with the 3 first rows being on the macro pad and the 3 following being buttons on the snes controller.
+
+* Keyboard Maintainer: [JBarberU](https://github.com/jbarberu)
+* Hardware Supported: SNES Macropad Rev 1, with a Raspberry Pi Pico Lite (AliExpress clone of Raspberry Pico with fewer grounds and all GPIO's exposed on the headers)
+* Hardware Availability: The SNES Macro pad can be found [here](https://www.tindie.com/products/jbarberu/snes-macropad/) either as a kit, partially built or fully built.
+
+Make example for this keyboard (after setting up your build environment):
+
+ make snes_macropad:default
+
+Flashing example for this keyboard:
+
+ make snes_macropad: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:
+
+* **Physical bootsel button**: Hold down the bootsel button on the RPi Pico while plugging in the keyboard, or while pressing the reset button
+* **Physical reset button**: Quickly double press the reset button
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
diff --git a/keyboards/snes_macropad/rules.mk b/keyboards/snes_macropad/rules.mk
new file mode 100644
index 00000000000..52cdd84a78b
--- /dev/null
+++ b/keyboards/snes_macropad/rules.mk
@@ -0,0 +1,4 @@
+# Enable features
+CUSTOM_MATRIX = lite
+
+SRC += matrix.c
diff --git a/keyboards/snes_macropad/snes_macropad.c b/keyboards/snes_macropad/snes_macropad.c
new file mode 100644
index 00000000000..ba4ce44bd1e
--- /dev/null
+++ b/keyboards/snes_macropad/snes_macropad.c
@@ -0,0 +1,130 @@
+// Copyright 2023 John Barbero Unenge (@jbarberu)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "quantum.h"
+
+// oled keylog rendering has been kindly borrowed from crkbd <3
+
+char key_name = ' ';
+uint16_t last_keycode;
+uint8_t last_row;
+uint8_t last_col;
+
+static const char PROGMEM code_to_name[60] = {' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'R', 'E', 'B', 'T', '_', '-', '=', '[', ']', '\\', '#', ';', '\'', '`', ',', '.', '/', ' ', ' ', ' '};
+
+static void set_keylog(uint16_t keycode, keyrecord_t *record) {
+ last_row = record->event.key.row;
+ last_col = record->event.key.col;
+
+ key_name = ' ';
+ last_keycode = keycode;
+ if (IS_QK_MOD_TAP(keycode)) {
+ if (record->tap.count) {
+ keycode = QK_MOD_TAP_GET_TAP_KEYCODE(keycode);
+ } else {
+ keycode = 0xE0 + biton(QK_MOD_TAP_GET_MODS(keycode) & 0xF) + biton(QK_MOD_TAP_GET_MODS(keycode) & 0x10);
+ }
+ } else if (IS_QK_LAYER_TAP(keycode) && record->tap.count) {
+ keycode = QK_LAYER_TAP_GET_TAP_KEYCODE(keycode);
+ } else if (IS_QK_MODS(keycode)) {
+ keycode = QK_MODS_GET_BASIC_KEYCODE(keycode);
+ } else if (IS_QK_ONE_SHOT_MOD(keycode)) {
+ keycode = 0xE0 + biton(QK_ONE_SHOT_MOD_GET_MODS(keycode) & 0xF) + biton(QK_ONE_SHOT_MOD_GET_MODS(keycode) & 0x10);
+ }
+ if (keycode > ARRAY_SIZE(code_to_name)) {
+ return;
+ }
+
+ // update keylog
+ key_name = pgm_read_byte(&code_to_name[keycode]);
+}
+
+static const char *depad_str(const char *depad_str, char depad_char) {
+ while (*depad_str == depad_char) {
+ ++depad_str;
+ }
+ return depad_str;
+}
+
+static void oled_render_keylog(void) {
+ oled_write_char('0' + last_row, false);
+ oled_write("x", false);
+ oled_write_char('0' + last_col, false);
+ oled_write(", k", false);
+ const char *last_keycode_str = get_u16_str(last_keycode, ' ');
+ oled_write(depad_str(last_keycode_str, ' '), false);
+ oled_write(":", false);
+ oled_write_char(key_name, false);
+}
+
+__attribute__((weak)) const char * get_layer_name_user(uint8_t layer) {
+ return get_u8_str(layer, ' ');
+}
+
+static void oled_render_layer(void) {
+ oled_write("Layer: ", false);
+ oled_write_ln(get_layer_name_user(get_highest_layer(layer_state)), false);
+}
+
+bool oled_task_kb(void) {
+ if (!oled_task_user()) {
+ return false;
+ }
+
+ oled_render_layer();
+ oled_render_keylog();
+ oled_advance_page(true);
+ return false;
+}
+
+static void setupForFlashing(void) {
+ oled_clear();
+ oled_write(" ", false);
+ oled_write(" In flash mode... ", false);
+ oled_write(" ", false);
+ oled_write(" ", false);
+
+ // QMK is clever about only rendering a certain number of chunks per frame,
+ // but since the device will go into flash mode right after this call,
+ // we want to override this behavior and force all the chunks to be sent to
+ // the display immediately.
+ const size_t numIterations = OLED_DISPLAY_WIDTH * OLED_DISPLAY_HEIGHT / OLED_UPDATE_PROCESS_LIMIT;
+ for (size_t num = 0; num < numIterations; ++num) {
+ oled_render();
+ }
+ // todo: Replace the above hack with this, once develop branch is merged at the end of November 2023
+ // oled_render_dirty(true);
+
+ // Set alternating backlight colors
+ const uint8_t max = 20;
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
+ for (size_t i = 0; i < RGBLED_NUM; ++i) {
+ LED_TYPE *led_ = (LED_TYPE *)&led[i];
+ switch (i % 2) {
+ case 0:
+ setrgb(max, 0, max, led_);
+ break;
+ case 1:
+ setrgb(0, max, max, led_);
+ break;
+ }
+ }
+ rgblight_set();
+}
+
+bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
+ if (record->event.pressed) {
+ set_keylog(keycode, record);
+ }
+ if (keycode == QK_BOOT) {
+ setupForFlashing();
+ }
+ return process_record_user(keycode, record);
+}
+
+void keyboard_post_init_kb(void) {
+ rgblight_enable_noeeprom();
+ rgblight_sethsv_noeeprom(HSV_MAGENTA);
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_RAINBOW_SWIRL);
+ keyboard_post_init_user();
+}
diff --git a/keyboards/sofle/rev1/rev1.c b/keyboards/sofle/rev1/rev1.c
index d0197ffba55..df0f23a26cc 100644
--- a/keyboards/sofle/rev1/rev1.c
+++ b/keyboards/sofle/rev1/rev1.c
@@ -68,14 +68,14 @@ led_config_t g_led_config = {
{144, 10}, {144, 22}, {144, 34}, {144, 47},
},
{
- LED_FLAG_NONE, LED_FLAG_UNDERGLOW, LED_FLAG_UNDERGLOW, LED_FLAG_UNDERGLOW, LED_FLAG_UNDERGLOW, LED_FLAG_UNDERGLOW, LED_FLAG_UNDERGLOW,
+ LED_FLAG_INDICATOR, LED_FLAG_UNDERGLOW, LED_FLAG_UNDERGLOW, LED_FLAG_UNDERGLOW, LED_FLAG_UNDERGLOW, LED_FLAG_UNDERGLOW, LED_FLAG_UNDERGLOW,
LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT,
LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT,
LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT,
LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT,
LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT,
LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT,
- LED_FLAG_NONE, LED_FLAG_UNDERGLOW, LED_FLAG_UNDERGLOW, LED_FLAG_UNDERGLOW, LED_FLAG_UNDERGLOW, LED_FLAG_UNDERGLOW, LED_FLAG_UNDERGLOW,
+ LED_FLAG_INDICATOR, LED_FLAG_UNDERGLOW, LED_FLAG_UNDERGLOW, LED_FLAG_UNDERGLOW, LED_FLAG_UNDERGLOW, LED_FLAG_UNDERGLOW, LED_FLAG_UNDERGLOW,
LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT,
LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT,
LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT,
diff --git a/keyboards/spaceholdings/nebula68b/info.json b/keyboards/spaceholdings/nebula68b/info.json
index 85236629768..c82e52299d3 100755
--- a/keyboards/spaceholdings/nebula68b/info.json
+++ b/keyboards/spaceholdings/nebula68b/info.json
@@ -21,7 +21,88 @@
"diode_direction": "COL2ROW",
"processor": "atmega32u4",
"bootloader": "atmel-dfu",
+ "community_layouts": ["68_ansi"],
"layouts": {
+ "LAYOUT_68_ansi": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0, "w": 2},
+
+ {"matrix": [0, 14], "x": 15.25, "y": 0},
+ {"matrix": [2, 14], "x": 16.25, "y": 0},
+
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+ {"matrix": [2, 12], "x": 13.5, "y": 1, "w": 1.5},
+
+ {"matrix": [1, 14], "x": 15.25, "y": 1},
+ {"matrix": [3, 14], "x": 16.25, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75},
+
+ {"matrix": [3, 13], "x": 15.25, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25},
+ {"matrix": [4, 6], "x": 3.75, "y": 4, "w": 6.25},
+ {"matrix": [4, 9], "x": 10, "y": 4, "w": 1.25},
+ {"matrix": [4, 10], "x": 11.25, "y": 4, "w": 1.25},
+ {"matrix": [4, 11], "x": 12.5, "y": 4, "w": 1.25},
+
+ {"matrix": [4, 12], "x": 14.25, "y": 4},
+ {"matrix": [4, 13], "x": 15.25, "y": 4},
+ {"matrix": [4, 14], "x": 16.25, "y": 4}
+ ]
+ },
"LAYOUT_68_ansi_split_bs": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
diff --git a/keyboards/studiokestra/line_tkl/info.json b/keyboards/studiokestra/line_tkl/info.json
index 312dd6e5cfd..ba6601a3304 100644
--- a/keyboards/studiokestra/line_tkl/info.json
+++ b/keyboards/studiokestra/line_tkl/info.json
@@ -12,6 +12,11 @@
"mousekey": true,
"nkro": true
},
+ "indicators": {
+ "caps_lock": "B6",
+ "on_state": 1,
+ "scroll_lock": "D2"
+ },
"matrix_pins": {
"cols": ["F0", "F1", "F4", "F5", "F6", "F7", "B5", "D5", "D3"],
"rows": ["D0", "D1", "B0", "B7", "B3", "E6", "C7", "C6", "B4", "D7", "D6", "D4"]
@@ -23,196 +28,188 @@
"pid": "0x8704",
"vid": "0x7C10"
},
- "indicators": {
- "caps_lock": "B6",
- "scroll_lock": "D2",
- "on_state": 1
- },
- "community_layouts": [
- "tkl_ansi_tsangan",
- "tkl_ansi_tsangan_split_bs_rshift"
- ],
+ "community_layouts": ["tkl_ansi_tsangan", "tkl_ansi_tsangan_split_bs_rshift"],
"layouts": {
"LAYOUT_tkl_ansi_tsangan": {
"layout": [
- { "matrix": [0,0], "x":0, "y":0},
- { "matrix": [0,1], "x":2.25, "y":0},
- { "matrix": [0,2], "x":3.25, "y":0},
- { "matrix": [1,2], "x":4.25, "y":0},
- { "matrix": [0,3], "x":5.5, "y":0},
- { "matrix": [1,3], "x":6.5, "y":0},
- { "matrix": [0,4], "x":7.5, "y":0},
- { "matrix": [1,4], "x":8.5, "y":0},
- { "matrix": [0,5], "x":9.75, "y":0},
- { "matrix": [1,5], "x":10.75, "y":0},
- { "matrix": [0,6], "x":11.75, "y":0},
- { "matrix": [1,6], "x":12.75, "y":0},
- { "matrix": [0,7], "x":14, "y":0},
- { "matrix": [1,7], "x":15.25, "y":0},
- { "matrix": [0,8], "x":16.25, "y":0},
- { "matrix": [1,8], "x":17.25, "y":0},
- { "matrix": [2,0], "x":0, "y":1.25},
- { "matrix": [3,0], "x":1, "y":1.25},
- { "matrix": [2,1], "x":2, "y":1.25},
- { "matrix": [3,1], "x":3, "y":1.25},
- { "matrix": [2,2], "x":4, "y":1.25},
- { "matrix": [3,2], "x":5, "y":1.25},
- { "matrix": [2,3], "x":6, "y":1.25},
- { "matrix": [3,3], "x":7, "y":1.25},
- { "matrix": [2,4], "x":8, "y":1.25},
- { "matrix": [3,4], "x":9, "y":1.25},
- { "matrix": [2,5], "x":10, "y":1.25},
- { "matrix": [3,5], "x":11, "y":1.25},
- { "matrix": [2,6], "x":12, "y":1.25},
- { "matrix": [3,6], "x":13, "y":1.25},
- { "matrix": [3,7], "x":15.25, "y":1.25},
- { "matrix": [2,8], "x":16.25, "y":1.25},
- { "matrix": [3,8], "x":17.25, "y":1.25},
- { "matrix": [4,0], "x":0, "y":2.25, "w":1.5},
- { "matrix": [5,0], "x":1.5, "y":2.25},
- { "matrix": [4,1], "x":2.5, "y":2.25},
- { "matrix": [5,1], "x":3.5, "y":2.25},
- { "matrix": [4,2], "x":4.5, "y":2.25},
- { "matrix": [5,2], "x":5.5, "y":2.25},
- { "matrix": [4,3], "x":6.5, "y":2.25},
- { "matrix": [5,3], "x":7.5, "y":2.25},
- { "matrix": [4,4], "x":8.5, "y":2.25},
- { "matrix": [5,4], "x":9.5, "y":2.25},
- { "matrix": [4,5], "x":10.5, "y":2.25},
- { "matrix": [5,5], "x":11.5, "y":2.25},
- { "matrix": [4,6], "x":12.5, "y":2.25},
- { "matrix": [4,7], "x":13.5, "y":2.25, "w":1.5},
- { "matrix": [5,7], "x":15.25, "y":2.25},
- { "matrix": [4,8], "x":16.25, "y":2.25},
- { "matrix": [5,8], "x":17.25, "y":2.25},
- { "matrix": [6,0], "x":0, "y":3.25, "w":1.75},
- { "matrix": [7,0], "x":1.75, "y":3.25},
- { "matrix": [6,1], "x":2.75, "y":3.25},
- { "matrix": [7,1], "x":3.75, "y":3.25},
- { "matrix": [6,2], "x":4.75, "y":3.25},
- { "matrix": [7,2], "x":5.75, "y":3.25},
- { "matrix": [6,3], "x":6.75, "y":3.25},
- { "matrix": [7,3], "x":7.75, "y":3.25},
- { "matrix": [6,4], "x":8.75, "y":3.25},
- { "matrix": [7,4], "x":9.75, "y":3.25},
- { "matrix": [6,5], "x":10.75, "y":3.25},
- { "matrix": [7,5], "x":11.75, "y":3.25},
- { "matrix": [6,6], "x":12.75, "y":3.25, "w":2.25},
- { "matrix": [8,0], "x":0, "y":4.25, "w":1.25},
- { "matrix": [8,1], "x":2.25, "y":4.25},
- { "matrix": [9,1], "x":3.25, "y":4.25},
- { "matrix": [8,2], "x":4.25, "y":4.25},
- { "matrix": [9,2], "x":5.25, "y":4.25},
- { "matrix": [8,3], "x":6.25, "y":4.25},
- { "matrix": [9,3], "x":7.25, "y":4.25},
- { "matrix": [8,4], "x":8.25, "y":4.25},
- { "matrix": [9,4], "x":9.25, "y":4.25},
- { "matrix": [8,5], "x":10.25, "y":4.25},
- { "matrix": [9,5], "x":11.25, "y":4.25},
- { "matrix": [8,6], "x":12.25, "y":4.25, "w":1.75},
- { "matrix": [9,8], "x":16.25, "y":4.25},
- { "matrix": [10,0], "x":0, "y":5.25, "w":1.5},
- { "matrix": [11,0], "x":1.5,"y":5.25},
- { "matrix": [10,1], "x":2.5,"y":5.25,"w":1.5},
- { "matrix": [10,3], "x":4,"y":5.25,"w":7},
- { "matrix": [11,5], "x":11,"y":5.25,"w":1.5},
- { "matrix": [10,6], "x":12.5,"y":5.25},
- { "matrix": [10,7], "x":13.5,"y":5.25,"w":1.5},
- { "matrix": [11,7], "x":15.25, "y":5.25},
- { "matrix": [10,8], "x":16.25, "y":5.25},
- { "matrix": [11,8], "x":17.25, "y":5.25}
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 2, "y": 0},
+ {"matrix": [0, 2], "x": 3, "y": 0},
+ {"matrix": [1, 2], "x": 4, "y": 0},
+ {"matrix": [0, 3], "x": 5, "y": 0},
+ {"matrix": [1, 3], "x": 6.5, "y": 0},
+ {"matrix": [0, 4], "x": 7.5, "y": 0},
+ {"matrix": [1, 4], "x": 8.5, "y": 0},
+ {"matrix": [0, 5], "x": 9.5, "y": 0},
+ {"matrix": [1, 5], "x": 11, "y": 0},
+ {"matrix": [0, 6], "x": 12, "y": 0},
+ {"matrix": [1, 6], "x": 13, "y": 0},
+ {"matrix": [0, 7], "x": 14, "y": 0},
+ {"matrix": [1, 7], "x": 15.25, "y": 0},
+ {"matrix": [0, 8], "x": 16.25, "y": 0},
+ {"matrix": [1, 8], "x": 17.25, "y": 0},
+ {"matrix": [2, 0], "x": 0, "y": 1.25},
+ {"matrix": [3, 0], "x": 1, "y": 1.25},
+ {"matrix": [2, 1], "x": 2, "y": 1.25},
+ {"matrix": [3, 1], "x": 3, "y": 1.25},
+ {"matrix": [2, 2], "x": 4, "y": 1.25},
+ {"matrix": [3, 2], "x": 5, "y": 1.25},
+ {"matrix": [2, 3], "x": 6, "y": 1.25},
+ {"matrix": [3, 3], "x": 7, "y": 1.25},
+ {"matrix": [2, 4], "x": 8, "y": 1.25},
+ {"matrix": [3, 4], "x": 9, "y": 1.25},
+ {"matrix": [2, 5], "x": 10, "y": 1.25},
+ {"matrix": [3, 5], "x": 11, "y": 1.25},
+ {"matrix": [2, 6], "x": 12, "y": 1.25},
+ {"matrix": [3, 6], "x": 13, "y": 1.25, "w": 2},
+ {"matrix": [3, 7], "x": 15.25, "y": 1.25},
+ {"matrix": [2, 8], "x": 16.25, "y": 1.25},
+ {"matrix": [3, 8], "x": 17.25, "y": 1.25},
+ {"matrix": [4, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"matrix": [5, 0], "x": 1.5, "y": 2.25},
+ {"matrix": [4, 1], "x": 2.5, "y": 2.25},
+ {"matrix": [5, 1], "x": 3.5, "y": 2.25},
+ {"matrix": [4, 2], "x": 4.5, "y": 2.25},
+ {"matrix": [5, 2], "x": 5.5, "y": 2.25},
+ {"matrix": [4, 3], "x": 6.5, "y": 2.25},
+ {"matrix": [5, 3], "x": 7.5, "y": 2.25},
+ {"matrix": [4, 4], "x": 8.5, "y": 2.25},
+ {"matrix": [5, 4], "x": 9.5, "y": 2.25},
+ {"matrix": [4, 5], "x": 10.5, "y": 2.25},
+ {"matrix": [5, 5], "x": 11.5, "y": 2.25},
+ {"matrix": [4, 6], "x": 12.5, "y": 2.25},
+ {"matrix": [4, 7], "x": 13.5, "y": 2.25, "w": 1.5},
+ {"matrix": [5, 7], "x": 15.25, "y": 2.25},
+ {"matrix": [4, 8], "x": 16.25, "y": 2.25},
+ {"matrix": [5, 8], "x": 17.25, "y": 2.25},
+ {"matrix": [6, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"matrix": [7, 0], "x": 1.75, "y": 3.25},
+ {"matrix": [6, 1], "x": 2.75, "y": 3.25},
+ {"matrix": [7, 1], "x": 3.75, "y": 3.25},
+ {"matrix": [6, 2], "x": 4.75, "y": 3.25},
+ {"matrix": [7, 2], "x": 5.75, "y": 3.25},
+ {"matrix": [6, 3], "x": 6.75, "y": 3.25},
+ {"matrix": [7, 3], "x": 7.75, "y": 3.25},
+ {"matrix": [6, 4], "x": 8.75, "y": 3.25},
+ {"matrix": [7, 4], "x": 9.75, "y": 3.25},
+ {"matrix": [6, 5], "x": 10.75, "y": 3.25},
+ {"matrix": [7, 5], "x": 11.75, "y": 3.25},
+ {"matrix": [6, 6], "x": 12.75, "y": 3.25, "w": 2.25},
+ {"matrix": [8, 0], "x": 0, "y": 4.25, "w": 2.25},
+ {"matrix": [8, 1], "x": 2.25, "y": 4.25},
+ {"matrix": [9, 1], "x": 3.25, "y": 4.25},
+ {"matrix": [8, 2], "x": 4.25, "y": 4.25},
+ {"matrix": [9, 2], "x": 5.25, "y": 4.25},
+ {"matrix": [8, 3], "x": 6.25, "y": 4.25},
+ {"matrix": [9, 3], "x": 7.25, "y": 4.25},
+ {"matrix": [8, 4], "x": 8.25, "y": 4.25},
+ {"matrix": [9, 4], "x": 9.25, "y": 4.25},
+ {"matrix": [8, 5], "x": 10.25, "y": 4.25},
+ {"matrix": [9, 5], "x": 11.25, "y": 4.25},
+ {"matrix": [8, 6], "x": 12.25, "y": 4.25, "w": 2.75},
+ {"matrix": [9, 8], "x": 16.25, "y": 4.25},
+ {"matrix": [10, 0], "x": 0, "y": 5.25, "w": 1.5},
+ {"matrix": [11, 0], "x": 1.5, "y": 5.25},
+ {"matrix": [10, 1], "x": 2.5, "y": 5.25, "w": 1.5},
+ {"matrix": [10, 3], "x": 4, "y": 5.25, "w": 7},
+ {"matrix": [11, 5], "x": 11, "y": 5.25, "w": 1.5},
+ {"matrix": [10, 6], "x": 12.5, "y": 5.25},
+ {"matrix": [10, 7], "x": 13.5, "y": 5.25, "w": 1.5},
+ {"matrix": [11, 7], "x": 15.25, "y": 5.25},
+ {"matrix": [10, 8], "x": 16.25, "y": 5.25},
+ {"matrix": [11, 8], "x": 17.25, "y": 5.25}
]
},
"LAYOUT_tkl_ansi_tsangan_split_bs_rshift": {
"layout": [
- { "matrix": [0,0], "x":0, "y":0},
- { "matrix": [0,1], "x":2.25, "y":0},
- { "matrix": [0,2], "x":3.25, "y":0},
- { "matrix": [1,2], "x":4.25, "y":0},
- { "matrix": [0,3], "x":5.5, "y":0},
- { "matrix": [1,3], "x":6.5, "y":0},
- { "matrix": [0,4], "x":7.5, "y":0},
- { "matrix": [1,4], "x":8.5, "y":0},
- { "matrix": [0,5], "x":9.75, "y":0},
- { "matrix": [1,5], "x":10.75, "y":0},
- { "matrix": [0,6], "x":11.75, "y":0},
- { "matrix": [1,6], "x":12.75, "y":0},
- { "matrix": [0,7], "x":14, "y":0},
- { "matrix": [1,7], "x":15.25, "y":0},
- { "matrix": [0,8], "x":16.25, "y":0},
- { "matrix": [1,8], "x":17.25, "y":0},
- { "matrix": [2,0], "x":0, "y":1.25},
- { "matrix": [3,0], "x":1, "y":1.25},
- { "matrix": [2,1], "x":2, "y":1.25},
- { "matrix": [3,1], "x":3, "y":1.25},
- { "matrix": [2,2], "x":4, "y":1.25},
- { "matrix": [3,2], "x":5, "y":1.25},
- { "matrix": [2,3], "x":6, "y":1.25},
- { "matrix": [3,3], "x":7, "y":1.25},
- { "matrix": [2,4], "x":8, "y":1.25},
- { "matrix": [3,4], "x":9, "y":1.25},
- { "matrix": [2,5], "x":10, "y":1.25},
- { "matrix": [3,5], "x":11, "y":1.25},
- { "matrix": [2,6], "x":12, "y":1.25},
- { "matrix": [3,6], "x":13, "y":1.25},
- { "matrix": [2,7], "x":14, "y":1.25},
- { "matrix": [3,7], "x":15.25, "y":1.25},
- { "matrix": [2,8], "x":16.25, "y":1.25},
- { "matrix": [3,8], "x":17.25, "y":1.25},
- { "matrix": [4,0], "x":0, "y":2.25, "w":1.5},
- { "matrix": [5,0], "x":1.5, "y":2.25},
- { "matrix": [4,1], "x":2.5, "y":2.25},
- { "matrix": [5,1], "x":3.5, "y":2.25},
- { "matrix": [4,2], "x":4.5, "y":2.25},
- { "matrix": [5,2], "x":5.5, "y":2.25},
- { "matrix": [4,3], "x":6.5, "y":2.25},
- { "matrix": [5,3], "x":7.5, "y":2.25},
- { "matrix": [4,4], "x":8.5, "y":2.25},
- { "matrix": [5,4], "x":9.5, "y":2.25},
- { "matrix": [4,5], "x":10.5, "y":2.25},
- { "matrix": [5,5], "x":11.5, "y":2.25},
- { "matrix": [4,6], "x":12.5, "y":2.25},
- { "matrix": [4,7], "x":13.5, "y":2.25, "w":1.5},
- { "matrix": [5,7], "x":15.25, "y":2.25},
- { "matrix": [4,8], "x":16.25, "y":2.25},
- { "matrix": [5,8], "x":17.25, "y":2.25},
- { "matrix": [6,0], "x":0, "y":3.25, "w":1.75},
- { "matrix": [7,0], "x":1.75, "y":3.25},
- { "matrix": [6,1], "x":2.75, "y":3.25},
- { "matrix": [7,1], "x":3.75, "y":3.25},
- { "matrix": [6,2], "x":4.75, "y":3.25},
- { "matrix": [7,2], "x":5.75, "y":3.25},
- { "matrix": [6,3], "x":6.75, "y":3.25},
- { "matrix": [7,3], "x":7.75, "y":3.25},
- { "matrix": [6,4], "x":8.75, "y":3.25},
- { "matrix": [7,4], "x":9.75, "y":3.25},
- { "matrix": [6,5], "x":10.75, "y":3.25},
- { "matrix": [7,5], "x":11.75, "y":3.25},
- { "matrix": [6,6], "x":12.75, "y":3.25, "w":2.25},
- { "matrix": [8,0], "x":0, "y":4.25, "w":1.25},
- { "matrix": [8,1], "x":2.25, "y":4.25},
- { "matrix": [9,1], "x":3.25, "y":4.25},
- { "matrix": [8,2], "x":4.25, "y":4.25},
- { "matrix": [9,2], "x":5.25, "y":4.25},
- { "matrix": [8,3], "x":6.25, "y":4.25},
- { "matrix": [9,3], "x":7.25, "y":4.25},
- { "matrix": [8,4], "x":8.25, "y":4.25},
- { "matrix": [9,4], "x":9.25, "y":4.25},
- { "matrix": [8,5], "x":10.25, "y":4.25},
- { "matrix": [9,5], "x":11.25, "y":4.25},
- { "matrix": [8,6], "x":12.25, "y":4.25, "w":1.75},
- { "matrix": [9,6], "x":14, "y":4.25},
- { "matrix": [9,8], "x":16.25, "y":4.25},
- { "matrix": [10,0], "x":0, "y":5.25, "w":1.5},
- { "matrix": [11,0], "x":1.5,"y":5.25},
- { "matrix": [10,1], "x":2.5,"y":5.25,"w":1.5},
- { "matrix": [10,3], "x":4,"y":5.25,"w":7},
- { "matrix": [11,5], "x":11,"y":5.25,"w":1.5},
- { "matrix": [10,6], "x":12.5,"y":5.25},
- { "matrix": [10,7], "x":13.5,"y":5.25,"w":1.5},
- { "matrix": [11,7], "x":15.25, "y":5.25},
- { "matrix": [10,8], "x":16.25, "y":5.25},
- { "matrix": [11,8], "x":17.25, "y":5.25}
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 2, "y": 0},
+ {"matrix": [0, 2], "x": 3, "y": 0},
+ {"matrix": [1, 2], "x": 4, "y": 0},
+ {"matrix": [0, 3], "x": 5, "y": 0},
+ {"matrix": [1, 3], "x": 6.5, "y": 0},
+ {"matrix": [0, 4], "x": 7.5, "y": 0},
+ {"matrix": [1, 4], "x": 8.5, "y": 0},
+ {"matrix": [0, 5], "x": 9.5, "y": 0},
+ {"matrix": [1, 5], "x": 11, "y": 0},
+ {"matrix": [0, 6], "x": 12, "y": 0},
+ {"matrix": [1, 6], "x": 13, "y": 0},
+ {"matrix": [0, 7], "x": 14, "y": 0},
+ {"matrix": [1, 7], "x": 15.25, "y": 0},
+ {"matrix": [0, 8], "x": 16.25, "y": 0},
+ {"matrix": [1, 8], "x": 17.25, "y": 0},
+ {"matrix": [2, 0], "x": 0, "y": 1.25},
+ {"matrix": [3, 0], "x": 1, "y": 1.25},
+ {"matrix": [2, 1], "x": 2, "y": 1.25},
+ {"matrix": [3, 1], "x": 3, "y": 1.25},
+ {"matrix": [2, 2], "x": 4, "y": 1.25},
+ {"matrix": [3, 2], "x": 5, "y": 1.25},
+ {"matrix": [2, 3], "x": 6, "y": 1.25},
+ {"matrix": [3, 3], "x": 7, "y": 1.25},
+ {"matrix": [2, 4], "x": 8, "y": 1.25},
+ {"matrix": [3, 4], "x": 9, "y": 1.25},
+ {"matrix": [2, 5], "x": 10, "y": 1.25},
+ {"matrix": [3, 5], "x": 11, "y": 1.25},
+ {"matrix": [2, 6], "x": 12, "y": 1.25},
+ {"matrix": [3, 6], "x": 13, "y": 1.25},
+ {"matrix": [2, 7], "x": 14, "y": 1.25},
+ {"matrix": [3, 7], "x": 15.25, "y": 1.25},
+ {"matrix": [2, 8], "x": 16.25, "y": 1.25},
+ {"matrix": [3, 8], "x": 17.25, "y": 1.25},
+ {"matrix": [4, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"matrix": [5, 0], "x": 1.5, "y": 2.25},
+ {"matrix": [4, 1], "x": 2.5, "y": 2.25},
+ {"matrix": [5, 1], "x": 3.5, "y": 2.25},
+ {"matrix": [4, 2], "x": 4.5, "y": 2.25},
+ {"matrix": [5, 2], "x": 5.5, "y": 2.25},
+ {"matrix": [4, 3], "x": 6.5, "y": 2.25},
+ {"matrix": [5, 3], "x": 7.5, "y": 2.25},
+ {"matrix": [4, 4], "x": 8.5, "y": 2.25},
+ {"matrix": [5, 4], "x": 9.5, "y": 2.25},
+ {"matrix": [4, 5], "x": 10.5, "y": 2.25},
+ {"matrix": [5, 5], "x": 11.5, "y": 2.25},
+ {"matrix": [4, 6], "x": 12.5, "y": 2.25},
+ {"matrix": [4, 7], "x": 13.5, "y": 2.25, "w": 1.5},
+ {"matrix": [5, 7], "x": 15.25, "y": 2.25},
+ {"matrix": [4, 8], "x": 16.25, "y": 2.25},
+ {"matrix": [5, 8], "x": 17.25, "y": 2.25},
+ {"matrix": [6, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"matrix": [7, 0], "x": 1.75, "y": 3.25},
+ {"matrix": [6, 1], "x": 2.75, "y": 3.25},
+ {"matrix": [7, 1], "x": 3.75, "y": 3.25},
+ {"matrix": [6, 2], "x": 4.75, "y": 3.25},
+ {"matrix": [7, 2], "x": 5.75, "y": 3.25},
+ {"matrix": [6, 3], "x": 6.75, "y": 3.25},
+ {"matrix": [7, 3], "x": 7.75, "y": 3.25},
+ {"matrix": [6, 4], "x": 8.75, "y": 3.25},
+ {"matrix": [7, 4], "x": 9.75, "y": 3.25},
+ {"matrix": [6, 5], "x": 10.75, "y": 3.25},
+ {"matrix": [7, 5], "x": 11.75, "y": 3.25},
+ {"matrix": [6, 6], "x": 12.75, "y": 3.25, "w": 2.25},
+ {"matrix": [8, 0], "x": 0, "y": 4.25, "w": 2.25},
+ {"matrix": [8, 1], "x": 2.25, "y": 4.25},
+ {"matrix": [9, 1], "x": 3.25, "y": 4.25},
+ {"matrix": [8, 2], "x": 4.25, "y": 4.25},
+ {"matrix": [9, 2], "x": 5.25, "y": 4.25},
+ {"matrix": [8, 3], "x": 6.25, "y": 4.25},
+ {"matrix": [9, 3], "x": 7.25, "y": 4.25},
+ {"matrix": [8, 4], "x": 8.25, "y": 4.25},
+ {"matrix": [9, 4], "x": 9.25, "y": 4.25},
+ {"matrix": [8, 5], "x": 10.25, "y": 4.25},
+ {"matrix": [9, 5], "x": 11.25, "y": 4.25},
+ {"matrix": [8, 6], "x": 12.25, "y": 4.25, "w": 1.75},
+ {"matrix": [9, 6], "x": 14, "y": 4.25},
+ {"matrix": [9, 8], "x": 16.25, "y": 4.25},
+ {"matrix": [10, 0], "x": 0, "y": 5.25, "w": 1.5},
+ {"matrix": [11, 0], "x": 1.5, "y": 5.25},
+ {"matrix": [10, 1], "x": 2.5, "y": 5.25, "w": 1.5},
+ {"matrix": [10, 3], "x": 4, "y": 5.25, "w": 7},
+ {"matrix": [11, 5], "x": 11, "y": 5.25, "w": 1.5},
+ {"matrix": [10, 6], "x": 12.5, "y": 5.25},
+ {"matrix": [10, 7], "x": 13.5, "y": 5.25, "w": 1.5},
+ {"matrix": [11, 7], "x": 15.25, "y": 5.25},
+ {"matrix": [10, 8], "x": 16.25, "y": 5.25},
+ {"matrix": [11, 8], "x": 17.25, "y": 5.25}
]
}
}
diff --git a/keyboards/zeix/eden/config.h b/keyboards/zeix/eden/config.h
new file mode 100644
index 00000000000..77970ce4d34
--- /dev/null
+++ b/keyboards/zeix/eden/config.h
@@ -0,0 +1,20 @@
+/*
+Copyright 2023 zeix (@itsme-zeix)
+
+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 .
+*/
+
+#pragma once
+
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 500U
diff --git a/keyboards/zeix/eden/info.json b/keyboards/zeix/eden/info.json
new file mode 100644
index 00000000000..2b5fd6eae7c
--- /dev/null
+++ b/keyboards/zeix/eden/info.json
@@ -0,0 +1,1017 @@
+{
+ "keyboard_name": "Eden",
+ "maintainer": "itsme-zeix",
+ "manufacturer": "dnworks",
+ "processor": "RP2040",
+ "bootloader": "rp2040",
+ "usb": {
+ "vid": "0x4C27",
+ "pid": "0x2901",
+ "device_version": "0.0.1"
+ },
+ "features": {
+ "bootmagic": true,
+ "mousekey": true,
+ "extrakey": true,
+ "console": false,
+ "command": false,
+ "nkro": true
+ },
+ "indicators": {
+ "caps_lock": "GP29",
+ "on_state": 1
+ },
+ "diode_direction": "COL2ROW",
+ "matrix_pins": {
+ "rows": ["GP6", "GP5", "GP4", "GP0", "GP12"],
+ "cols": ["GP28", "GP27", "GP26", "GP25", "GP24", "GP23", "GP22", "GP3", "GP2", "GP1", "GP8", "GP9", "GP10", "GP11", "GP7"]
+ },
+ "community_layouts": [
+ "60_ansi",
+ "60_ansi_split_bs_rshift",
+ "60_ansi_tsangan",
+ "60_tsangan_hhkb",
+ "60_ansi_wkl",
+ "60_ansi_wkl_split_bs_rshift",
+ "60_hhkb",
+ "60_iso",
+ "60_iso_split_bs_rshift",
+ "60_iso_tsangan",
+ "60_iso_tsangan_split_bs_rshift",
+ "60_iso_wkl",
+ "60_iso_wkl_split_bs_rshift"
+ ],
+ "layouts": {
+ "LAYOUT_all": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+ {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "x": 12.75, "y": 2},
+ {"matrix": [2, 13], "x": 13.75, "y": 2, "w": 1.25},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
+ {"matrix": [3, 1], "x": 1.25, "y": 3},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25},
+ {"matrix": [4, 6], "x": 3.75, "y": 4, "w": 6.25},
+ {"matrix": [4, 10], "x": 10, "y": 4, "w": 1.25},
+ {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25},
+ {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25},
+ {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25}
+ ]
+ },
+ "LAYOUT_60_ansi": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 14], "x": 13, "y": 0, "w": 2},
+
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+ {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25},
+ {"matrix": [4, 6], "x": 3.75, "y": 4, "w": 6.25},
+ {"matrix": [4, 10], "x": 10, "y": 4, "w": 1.25},
+ {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25},
+ {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25},
+ {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25}
+ ]
+ },
+ "LAYOUT_60_ansi_split_bs_rshift": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+ {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25},
+ {"matrix": [4, 6], "x": 3.75, "y": 4, "w": 6.25},
+ {"matrix": [4, 10], "x": 10, "y": 4, "w": 1.25},
+ {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25},
+ {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25},
+ {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25}
+ ]
+ },
+ "LAYOUT_60_ansi_tsangan": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 14], "x": 13, "y": 0, "w": 2},
+
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+ {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"matrix": [4, 1], "x": 1.5, "y": 4},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
+ {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
+ {"matrix": [4, 12], "x": 12.5, "y": 4},
+ {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
+ ]
+ },
+ "LAYOUT_60_tsangan_hhkb": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+ {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"matrix": [4, 1], "x": 1.5, "y": 4},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
+ {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
+ {"matrix": [4, 12], "x": 12.5, "y": 4},
+ {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
+ ]
+ },
+ "LAYOUT_60_hhkb": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+ {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+
+ {"matrix": [4, 1], "x": 1.5, "y": 4},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
+ {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
+ {"matrix": [4, 12], "x": 12.5, "y": 4}
+ ]
+ },
+ "LAYOUT_60_ansi_wkl": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 14], "x": 13, "y": 0, "w": 2},
+
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+ {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
+ {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
+ {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
+ ]
+ },
+ "LAYOUT_60_ansi_wkl_split_bs_rshift": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+ {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
+ {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
+ {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
+ ]
+ },
+ "LAYOUT_60_iso": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 14], "x": 13, "y": 0, "w": 2},
+
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "x": 12.75, "y": 2},
+ {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
+ {"matrix": [3, 1], "x": 1.25, "y": 3},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25},
+ {"matrix": [4, 6], "x": 3.75, "y": 4, "w": 6.25},
+ {"matrix": [4, 10], "x": 10, "y": 4, "w": 1.25},
+ {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25},
+ {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25},
+ {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25}
+ ]
+ },
+ "LAYOUT_60_iso_split_bs_rshift": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "x": 12.75, "y": 2},
+ {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
+ {"matrix": [3, 1], "x": 1.25, "y": 3},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25},
+ {"matrix": [4, 6], "x": 3.75, "y": 4, "w": 6.25},
+ {"matrix": [4, 10], "x": 10, "y": 4, "w": 1.25},
+ {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25},
+ {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25},
+ {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25}
+ ]
+ },
+ "LAYOUT_60_iso_tsangan": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 14], "x": 13, "y": 0, "w": 2},
+
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "x": 12.75, "y": 2},
+ {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
+ {"matrix": [3, 1], "x": 1.25, "y": 3},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"matrix": [4, 1], "x": 1.5, "y": 4},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
+ {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
+ {"matrix": [4, 12], "x": 12.5, "y": 4},
+ {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
+ ]
+ },
+ "LAYOUT_60_iso_tsangan_split_bs_rshift": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "x": 12.75, "y": 2},
+ {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
+ {"matrix": [3, 1], "x": 1.25, "y": 3},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"matrix": [4, 1], "x": 1.5, "y": 4},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
+ {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
+ {"matrix": [4, 12], "x": 12.5, "y": 4},
+ {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
+ ]
+ },
+ "LAYOUT_60_iso_wkl": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 14], "x": 13, "y": 0, "w": 2},
+
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "x": 12.75, "y": 2},
+ {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
+ {"matrix": [3, 1], "x": 1.25, "y": 3},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
+ {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
+ {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
+ ]
+ },
+ "LAYOUT_60_iso_wkl_split_bs_rshift": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "x": 12.75, "y": 2},
+ {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
+ {"matrix": [3, 1], "x": 1.25, "y": 3},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
+ {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
+ {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
+ ]
+ }
+ }
+}
diff --git a/keyboards/zeix/eden/keymaps/default/keymap.c b/keyboards/zeix/eden/keymaps/default/keymap.c
new file mode 100644
index 00000000000..c209675b378
--- /dev/null
+++ b/keyboards/zeix/eden/keymaps/default/keymap.c
@@ -0,0 +1,33 @@
+/*
+Copyright 2023 zeix (@itsme-zeix)
+
+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 .
+*/
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+[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_RALT, KC_RGUI, MO(1), KC_RCTL),
+
+[1] = LAYOUT_all(
+ 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_DEL,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+};
diff --git a/keyboards/zeix/eden/keymaps/via/keymap.c b/keyboards/zeix/eden/keymaps/via/keymap.c
new file mode 100644
index 00000000000..c209675b378
--- /dev/null
+++ b/keyboards/zeix/eden/keymaps/via/keymap.c
@@ -0,0 +1,33 @@
+/*
+Copyright 2023 zeix (@itsme-zeix)
+
+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 .
+*/
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+[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_RALT, KC_RGUI, MO(1), KC_RCTL),
+
+[1] = LAYOUT_all(
+ 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_DEL,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+};
diff --git a/keyboards/zeix/eden/keymaps/via/rules.mk b/keyboards/zeix/eden/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/zeix/eden/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/zeix/eden/matrix_diagram.md b/keyboards/zeix/eden/matrix_diagram.md
new file mode 100644
index 00000000000..4686e997b29
--- /dev/null
+++ b/keyboards/zeix/eden/matrix_diagram.md
@@ -0,0 +1,23 @@
+# Matrix Diagram for Eden
+
+```
+ ┌───────┐
+ 2u Backspace │0E │
+ └───────┘
+┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
+│00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0A │0B │0C │0D │0E │
+├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ ┌─────┐
+│10 │11 │12 │13 │14 │15 │16 │17 │18 │19 │1A │1B │1C │1D │ │ │
+├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ ┌──┴┐2D │ ISO Enter
+│20 │21 │22 │23 │24 │25 │26 │27 │28 │29 │2A │2B │2D │ │2C │ │
+├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ └───┴────┘
+│30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3A │3B │3C │3D │
+├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬┴───┤
+│40 │41 │42 │46 │4A │4B │4C │4D │
+└────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+┌────────┐ ┌──────────┐
+│30 │ 2.25u LShift 2.75u RShift │3C │
+└────────┘ └──────────┘
+┌─────┬───┬─────┬───────────────────────────┬─────┬───┬─────┐
+│40 │41 │42 │46 │4B │4C │4D │ Tsangan/WKL/HHKB
+└─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘
diff --git a/keyboards/zeix/eden/readme.md b/keyboards/zeix/eden/readme.md
new file mode 100644
index 00000000000..85f1ff66ded
--- /dev/null
+++ b/keyboards/zeix/eden/readme.md
@@ -0,0 +1,27 @@
+# Eden
+
+
+
+A 60% mounted with tadpoles designed by The Flying Penguin.
+
+* Keyboard Maintainer: [Zeix](https://github.com/itsme-zeix)
+* Hardware Supported: Eden Solder PCB rev1
+* Hardware Availability: mecha.store
+
+Make example for this keyboard (after setting up your build environment):
+
+ make zeix/eden:default
+
+Flashing example for this keyboard:
+
+ make zeix/eden: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 `RESET` button twice or short the `USB_BOOT` and `GND` pads and plug in the keyboard
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
\ No newline at end of file
diff --git a/keyboards/zeix/eden/rules.mk b/keyboards/zeix/eden/rules.mk
new file mode 100644
index 00000000000..7ff128fa692
--- /dev/null
+++ b/keyboards/zeix/eden/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
\ No newline at end of file
diff --git a/lib/python/qmk/cli/__init__.py b/lib/python/qmk/cli/__init__.py
index b8bc99aa0d3..695a1800661 100644
--- a/lib/python/qmk/cli/__init__.py
+++ b/lib/python/qmk/cli/__init__.py
@@ -69,6 +69,7 @@ subcommands = [
'qmk.cli.import.keymap',
'qmk.cli.info',
'qmk.cli.json2c',
+ 'qmk.cli.license_check',
'qmk.cli.lint',
'qmk.cli.kle2json',
'qmk.cli.list.keyboards',
diff --git a/lib/python/qmk/cli/find.py b/lib/python/qmk/cli/find.py
index 2836eb8a542..f2135bbc16c 100644
--- a/lib/python/qmk/cli/find.py
+++ b/lib/python/qmk/cli/find.py
@@ -23,7 +23,7 @@ def find(cli):
if len(cli.args.filter) == 0 and len(cli.args.print) > 0:
cli.log.warning('No filters supplied -- keymaps not parsed, unable to print requested values.')
- targets = search_keymap_targets(cli.args.keymap, cli.args.filter, cli.args.print)
+ targets = search_keymap_targets([('all', cli.config.find.keymap)], cli.args.filter, cli.args.print)
for keyboard, keymap, print_vals in targets:
print(f'{keyboard}:{keymap}')
diff --git a/lib/python/qmk/cli/license_check.py b/lib/python/qmk/cli/license_check.py
new file mode 100644
index 00000000000..4bda272ec9b
--- /dev/null
+++ b/lib/python/qmk/cli/license_check.py
@@ -0,0 +1,116 @@
+# Copyright 2023 Nick Brassel (@tzarc)
+# SPDX-License-Identifier: GPL-2.0-or-later
+import re
+from pathlib import Path
+from milc import cli
+from qmk.constants import LICENSE_TEXTS
+
+L_PAREN = re.compile(r'\(\[\{\<')
+R_PAREN = re.compile(r'\)\]\}\>')
+PUNCTUATION = re.compile(r'[\.,;:]+')
+TRASH_PREFIX = re.compile(r'^(\s|/|\*|#)+')
+TRASH_SUFFIX = re.compile(r'(\s|/|\*|#|\\)+$')
+SPACE = re.compile(r'\s+')
+SUFFIXES = ['.c', '.h', '.cpp', '.cxx', '.hpp', '.hxx']
+
+
+def _simplify_text(input):
+ lines = input.lower().split('\n')
+ lines = [PUNCTUATION.sub('', line) for line in lines]
+ lines = [TRASH_PREFIX.sub('', line) for line in lines]
+ lines = [TRASH_SUFFIX.sub('', line) for line in lines]
+ lines = [SPACE.sub(' ', line) for line in lines]
+ lines = [L_PAREN.sub('(', line) for line in lines]
+ lines = [R_PAREN.sub(')', line) for line in lines]
+ lines = [line.strip() for line in lines]
+ lines = [line for line in lines if line is not None and line != '']
+ return ' '.join(lines)
+
+
+def _detect_license_from_file_contents(filename, absolute=False):
+ data = filename.read_text(encoding='utf-8', errors='ignore')
+ filename_out = str(filename.absolute()) if absolute else str(filename)
+
+ if 'SPDX-License-Identifier:' in data:
+ res = data.split('SPDX-License-Identifier:')
+ license = re.split(r'\s|//|\*', res[1].strip())[0].strip()
+ found = False
+ for short_license, _ in LICENSE_TEXTS:
+ if license.lower() == short_license.lower():
+ license = short_license
+ found = True
+ break
+
+ if not found:
+ if cli.args.short:
+ print(f'{filename_out} UNKNOWN')
+ else:
+ cli.log.error(f'{{fg_cyan}}{filename_out}{{fg_reset}} -- unknown license, or no license detected!')
+ return False
+
+ if cli.args.short:
+ print(f'{filename_out} {license}')
+ else:
+ cli.log.info(f'{{fg_cyan}}{filename_out}{{fg_reset}} -- license detected: {license} (SPDX License Identifier)')
+ return True
+
+ else:
+ simple_text = _simplify_text(data)
+ for short_license, long_licenses in LICENSE_TEXTS:
+ for long_license in long_licenses:
+ if long_license in simple_text:
+ if cli.args.short:
+ print(f'{filename_out} {short_license}')
+ else:
+ cli.log.info(f'{{fg_cyan}}{filename_out}{{fg_reset}} -- license detected: {short_license} (Full text)')
+ return True
+
+ if cli.args.short:
+ print(f'{filename_out} UNKNOWN')
+ else:
+ cli.log.error(f'{{fg_cyan}}{filename_out}{{fg_reset}} -- unknown license, or no license detected!')
+
+ return False
+
+
+@cli.argument('inputs', nargs='*', arg_only=True, type=Path, help='List of input files or directories.')
+@cli.argument('-s', '--short', action='store_true', help='Short output.')
+@cli.argument('-a', '--absolute', action='store_true', help='Print absolute paths.')
+@cli.argument('-e', '--extension', arg_only=True, action='append', default=[], help='Override list of extensions. Can be specified multiple times for multiple extensions.')
+@cli.subcommand('File license check.', hidden=False if cli.config.user.developer else True)
+def license_check(cli):
+ def _default_suffix_condition(s):
+ return s in SUFFIXES
+
+ conditional = _default_suffix_condition
+
+ if len(cli.args.extension) > 0:
+ suffixes = [f'.{s}' if not s.startswith('.') else s for s in cli.args.extension]
+
+ def _specific_suffix_condition(s):
+ return s in suffixes
+
+ conditional = _specific_suffix_condition
+
+ # Pre-format all the licenses
+ for _, long_licenses in LICENSE_TEXTS:
+ for i in range(len(long_licenses)):
+ long_licenses[i] = _simplify_text(long_licenses[i])
+
+ check_list = set()
+ for filename in sorted(cli.args.inputs):
+ if filename.is_dir():
+ for file in sorted(filename.rglob('*')):
+ if file.is_file() and conditional(file.suffix):
+ check_list.add(file)
+ elif filename.is_file():
+ if conditional(filename.suffix):
+ check_list.add(filename)
+
+ failed = False
+ for filename in sorted(check_list):
+ if not _detect_license_from_file_contents(filename, absolute=cli.args.absolute):
+ failed = True
+
+ if failed:
+ return False
diff --git a/lib/python/qmk/cli/mass_compile.py b/lib/python/qmk/cli/mass_compile.py
index 1227f435e74..06e6e411a72 100755
--- a/lib/python/qmk/cli/mass_compile.py
+++ b/lib/python/qmk/cli/mass_compile.py
@@ -97,6 +97,6 @@ def mass_compile(cli):
if len(cli.args.builds) > 0:
targets = search_make_targets(cli.args.builds, cli.args.filter)
else:
- targets = search_keymap_targets(cli.args.keymap, cli.args.filter)
+ targets = search_keymap_targets([('all', cli.config.mass_compile.keymap)], cli.args.filter)
- return mass_compile_targets(targets, cli.args.clean, cli.args.dry_run, cli.args.no_temp, cli.args.parallel, cli.args.env)
+ return mass_compile_targets(targets, cli.args.clean, cli.args.dry_run, cli.config.mass_compile.no_temp, cli.config.mass_compile.parallel, cli.args.env)
diff --git a/lib/python/qmk/constants.py b/lib/python/qmk/constants.py
index 97bd84aa234..1967441fc89 100644
--- a/lib/python/qmk/constants.py
+++ b/lib/python/qmk/constants.py
@@ -189,3 +189,126 @@ GENERATED_HEADER_SH_LIKE = '''\
#
################################################################################
'''
+
+LICENSE_TEXTS = [
+ (
+ 'GPL-2.0-or-later', [
+ """\
+ 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 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 any later version.
+ """
+ ]
+ ),
+ ('GPL-2.0-only', ["""\
+ 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; version 2.
+ """]),
+ (
+ 'GPL-3.0-or-later', [
+ """\
+ 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 3 of
+ the License, or (at your option) any later version.
+ """, """\
+ 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 3 of
+ the License, or any later version.
+ """
+ ]
+ ),
+ ('GPL-3.0-only', ["""\
+ 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, version 3.
+ """]),
+ (
+ 'LGPL-2.1-or-later', [
+ """\
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public License
+ as published by the Free Software Foundation; either version 2.1
+ of the License, or (at your option) any later version.
+ """, """\
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public License
+ as published by the Free Software Foundation; either version 2.1
+ of the License, or any later version.
+ """, """\
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public License
+ as published by the Free Software Foundation; either version 2.1
+ of the License, or (at your option) any later version.
+ """, """\
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public License
+ as published by the Free Software Foundation; either version 2.1
+ of the License, or any later version.
+ """
+ ]
+ ),
+ (
+ 'LGPL-2.1-only', [
+ """\
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; version 2.1.
+ """, """\
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; version 2.1.
+ """
+ ]
+ ),
+ (
+ 'LGPL-3.0-or-later', [
+ """\
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public License
+ as published by the Free Software Foundation; either version 3
+ of the License, or (at your option) any later version.
+ """, """\
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public License
+ as published by the Free Software Foundation; either version 3
+ of the License, or any later version.
+ """, """\
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public License
+ as published by the Free Software Foundation; either version 3
+ of the License, or (at your option) any later version.
+ """, """\
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public License
+ as published by the Free Software Foundation; either version 3
+ of the License, or any later version.
+ """
+ ]
+ ),
+ (
+ 'LGPL-3.0-only', [
+ """\
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; version 3.
+ """, """\
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; version 3.
+ """
+ ]
+ ),
+ ('Apache-2.0', ["""\
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ """]),
+]
diff --git a/lib/python/qmk/search.py b/lib/python/qmk/search.py
index 0b5d4892189..a74450ca87d 100644
--- a/lib/python/qmk/search.py
+++ b/lib/python/qmk/search.py
@@ -4,12 +4,12 @@ import contextlib
import functools
import fnmatch
import logging
-import multiprocessing
import re
from typing import List, Tuple
from dotty_dict import dotty
from milc import cli
+from qmk.util import parallel_map
from qmk.info import keymap_json
import qmk.keyboard
import qmk.keymap
@@ -78,17 +78,16 @@ def _expand_keymap_target(keyboard: str, keymap: str, all_keyboards: List[str] =
all_keyboards = qmk.keyboard.list_keyboards()
if keyboard == 'all':
- with multiprocessing.Pool() as pool:
- if keymap == 'all':
- cli.log.info('Retrieving list of all keyboards and keymaps...')
- targets = []
- for kb in pool.imap_unordered(_all_keymaps, all_keyboards):
- targets.extend(kb)
- return targets
- else:
- cli.log.info(f'Retrieving list of keyboards with keymap "{keymap}"...')
- keyboard_filter = functools.partial(_keymap_exists, keymap=keymap)
- return [(kb, keymap) for kb in filter(lambda e: e is not None, pool.imap_unordered(keyboard_filter, all_keyboards))]
+ if keymap == 'all':
+ cli.log.info('Retrieving list of all keyboards and keymaps...')
+ targets = []
+ for kb in parallel_map(_all_keymaps, all_keyboards):
+ targets.extend(kb)
+ return targets
+ else:
+ cli.log.info(f'Retrieving list of keyboards with keymap "{keymap}"...')
+ keyboard_filter = functools.partial(_keymap_exists, keymap=keymap)
+ return [(kb, keymap) for kb in filter(lambda e: e is not None, parallel_map(keyboard_filter, all_keyboards))]
else:
if keymap == 'all':
keyboard = qmk.keyboard.resolve_keyboard(keyboard)
@@ -117,8 +116,7 @@ def _filter_keymap_targets(target_list: List[Tuple[str, str]], filters: List[str
targets = [(kb, km, {}) for kb, km in target_list]
else:
cli.log.info('Parsing data for all matching keyboard/keymap combinations...')
- with multiprocessing.Pool() as pool:
- valid_keymaps = [(e[0], e[1], dotty(e[2])) for e in pool.imap_unordered(_load_keymap_info, target_list)]
+ valid_keymaps = [(e[0], e[1], dotty(e[2])) for e in parallel_map(_load_keymap_info, target_list)]
function_re = re.compile(r'^(?P[a-zA-Z]+)\((?P[a-zA-Z0-9_\.]+)(,\s*(?P[^#]+))?\)$')
equals_re = re.compile(r'^(?P[a-zA-Z0-9_\.]+)\s*=\s*(?P[^#]+)$')
@@ -179,10 +177,10 @@ def _filter_keymap_targets(target_list: List[Tuple[str, str]], filters: List[str
return targets
-def search_keymap_targets(keymap='default', filters: List[str] = [], print_vals: List[str] = []) -> List[Tuple[str, str, List[Tuple[str, str]]]]:
+def search_keymap_targets(targets: List[Tuple[str, str]] = [('all', 'default')], filters: List[str] = [], print_vals: List[str] = []) -> List[Tuple[str, str, List[Tuple[str, str]]]]:
"""Search for build targets matching the supplied criteria.
"""
- return list(sorted(_filter_keymap_targets(expand_keymap_targets([('all', keymap)]), filters, print_vals), key=lambda e: (e[0], e[1])))
+ return list(sorted(_filter_keymap_targets(expand_keymap_targets(targets), filters, print_vals), key=lambda e: (e[0], e[1])))
def search_make_targets(targets: List[str], filters: List[str] = [], print_vals: List[str] = []) -> List[Tuple[str, str, List[Tuple[str, str]]]]:
diff --git a/lib/python/qmk/util.py b/lib/python/qmk/util.py
new file mode 100644
index 00000000000..db7debd5788
--- /dev/null
+++ b/lib/python/qmk/util.py
@@ -0,0 +1,56 @@
+"""Utility functions.
+"""
+import contextlib
+import multiprocessing
+
+from milc import cli
+
+
+@contextlib.contextmanager
+def parallelize():
+ """Returns a function that can be used in place of a map() call.
+
+ Attempts to use `mpire`, falling back to `multiprocessing` if it's not
+ available. If parallelization is not requested, returns the original map()
+ function.
+ """
+
+ # Work out if we've already got a config value for parallel searching
+ if cli.config.user.parallel_search is None:
+ parallel_search = True
+ else:
+ parallel_search = cli.config.user.parallel_search
+
+ # Non-parallel searches use `map()`
+ if not parallel_search:
+ yield map
+ return
+
+ # Prefer mpire's `WorkerPool` if it's available
+ with contextlib.suppress(ImportError):
+ from mpire import WorkerPool
+ from mpire.utils import make_single_arguments
+ with WorkerPool() as pool:
+
+ def _worker(func, *args):
+ # Ensure we don't unpack tuples -- mpire's `WorkerPool` tries to do so normally so we tell it not to.
+ for r in pool.imap_unordered(func, make_single_arguments(*args, generator=False), progress_bar=True):
+ yield r
+
+ yield _worker
+ return
+
+ # Otherwise fall back to multiprocessing's `Pool`
+ with multiprocessing.Pool() as pool:
+ yield pool.imap_unordered
+
+
+def parallel_map(*args, **kwargs):
+ """Effectively runs `map()` but executes it in parallel if necessary.
+ """
+ with parallelize() as map_fn:
+ # This needs to be enclosed in a `list()` as some implementations return
+ # a generator function, which means the scope of the pool is closed off
+ # before the results are returned. Returning a list ensures results are
+ # materialised before any worker pool is shut down.
+ return list(map_fn(*args, **kwargs))
diff --git a/quantum/led_matrix/led_matrix.c b/quantum/led_matrix/led_matrix.c
index 1676a60aa35..2ec0ec4b19f 100644
--- a/quantum/led_matrix/led_matrix.c
+++ b/quantum/led_matrix/led_matrix.c
@@ -389,7 +389,6 @@ void led_matrix_task(void) {
void led_matrix_indicators(void) {
led_matrix_indicators_kb();
- led_matrix_indicators_user();
}
__attribute__((weak)) bool led_matrix_indicators_kb(void) {
@@ -415,7 +414,6 @@ void led_matrix_indicators_advanced(effect_params_t *params) {
uint8_t max = LED_MATRIX_LED_COUNT;
#endif
led_matrix_indicators_advanced_kb(min, max);
- led_matrix_indicators_advanced_user(min, max);
}
__attribute__((weak)) bool led_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
diff --git a/readme.md b/readme.md
index 5649ddfa097..f0e49a08e95 100644
--- a/readme.md
+++ b/readme.md
@@ -6,7 +6,7 @@
[](https://github.com/qmk/qmk_firmware/pulse/monthly)
[](https://github.com/qmk/qmk_firmware/)
-This is a keyboard firmware based on the [tmk\_keyboard firmware](https://github.com/tmk/tmk_keyboard) with some useful features for Atmel AVR and ARM controllers, and more specifically, the [OLKB product line](https://olkb.com), the [ErgoDox EZ](https://ergodox-ez.com) keyboard, and the [Clueboard product line](https://clueboard.co).
+This is a keyboard firmware based on the [tmk\_keyboard firmware](https://github.com/tmk/tmk_keyboard) with some useful features for Atmel AVR and ARM controllers, and more specifically, the [OLKB product line](https://olkb.com), the [ErgoDox EZ](https://ergodox-ez.com) keyboard, and the Clueboard product line.
## Documentation