diff --git a/.clangd b/.clangd
index 2be2d817fc7..6133ae7229d 100644
--- a/.clangd
+++ b/.clangd
@@ -1,4 +1,4 @@
CompileFlags:
Add: [-Wno-unknown-attributes, -Wno-maybe-uninitialized, -Wno-unknown-warning-option]
- Remove: [-W*, -mcall-prologues]
+ Remove: [-W*, -mmcu=*, -mcpu=*, -mfpu=*, -mfloat-abi=*, -mno-unaligned-access, -mno-thumb-interwork, -mcall-prologues]
Compiler: clang
diff --git a/.github/workflows/ci_builds.yml b/.github/workflows/ci_builds.yml
deleted file mode 100644
index 7fa07fe09d9..00000000000
--- a/.github/workflows/ci_builds.yml
+++ /dev/null
@@ -1,74 +0,0 @@
-name: CI Builds
-
-permissions:
- contents: read
-
-on:
- push:
- branches: [master, develop]
- workflow_dispatch:
- inputs:
- branch:
- type: choice
- description: 'Branch to build'
- options: [master, develop]
-
-concurrency: ci_build-${{ github.event.inputs.branch || github.ref_name }}
-
-jobs:
- ci_builds:
- if: github.repository == 'qmk/qmk_firmware'
- name: "CI Build"
- runs-on: self-hosted
- timeout-minutes: 1380
-
- strategy:
- fail-fast: false
- matrix:
- keymap: [default, via]
-
- container: ghcr.io/qmk/qmk_cli
-
- steps:
- - name: Disable safe.directory check
- run : git config --global --add safe.directory '*'
-
- - uses: actions/checkout@v4
- with:
- submodules: recursive
- ref: ${{ github.event.inputs.branch || github.ref }}
-
- - name: Install dependencies
- run: pip3 install -r requirements.txt
-
- - name: Run `qmk mass-compile` (keymap ${{ matrix.keymap }})
- run: |
- export NCPUS=$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || getconf _NPROCESSORS_ONLN 2>/dev/null)
- qmk mass-compile -t -j $NCPUS -km ${{ matrix.keymap }} -e DUMP_CI_METADATA=yes || touch .failed
- # Generate the step summary markdown
- ./util/ci/generate_failure_markdown.sh > $GITHUB_STEP_SUMMARY || true
- # Truncate to a maximum of 1MB to deal with GitHub workflow limit
- truncate --size='<960K' $GITHUB_STEP_SUMMARY || true
- # Exit with failure if the compilation stage failed
- [ ! -f .failed ] || exit 1
-
- - name: 'Upload artifacts'
- uses: actions/upload-artifact@v4
- if: always()
- with:
- name: artifacts-${{ github.event.inputs.branch || github.ref_name }}-${{ matrix.keymap }}
- if-no-files-found: ignore
- path: |
- *.bin
- *.hex
- *.uf2
- .build/failed.*
-
- - name: 'CI Discord Notification'
- if: always()
- working-directory: util/ci/
- env:
- DISCORD_WEBHOOK: ${{ secrets.CI_DISCORD_WEBHOOK }}
- run: |
- python3 -m pip install -r requirements.txt
- python3 ./discord-results.py --branch ${{ github.event.inputs.branch || github.ref_name }} --keymap ${{ matrix.keymap }} --url ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
diff --git a/keyboards/cannonkeys/petrichor/config.h b/keyboards/cannonkeys/petrichor/config.h
new file mode 100644
index 00000000000..ea5c26b6c72
--- /dev/null
+++ b/keyboards/cannonkeys/petrichor/config.h
@@ -0,0 +1,9 @@
+// Copyright 2024 Andrew Kannan
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 500U
+
+#define PICO_XOSC_STARTUP_DELAY_MULTIPLIER 64
\ No newline at end of file
diff --git a/keyboards/cannonkeys/petrichor/info.json b/keyboards/cannonkeys/petrichor/info.json
new file mode 100644
index 00000000000..ecec61e7cf2
--- /dev/null
+++ b/keyboards/cannonkeys/petrichor/info.json
@@ -0,0 +1,394 @@
+{
+ "manufacturer": "CannonKeys",
+ "keyboard_name": "Petrichor",
+ "maintainer": "awkannan",
+ "bootloader": "rp2040",
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgblight": true
+ },
+ "matrix_pins": {
+ "cols": ["GP28", "GP27", "GP26", "GP25", "GP24", "GP23", "GP22", "GP21", "GP20", "GP19", "GP18", "GP17", "GP16", "GP9", "GP6", "GP5", "GP4", "GP3"],
+ "rows": ["GP13", "GP12", "GP11", "GP10", "GP8"]
+ },
+ "processor": "RP2040",
+ "rgblight": {
+ "animations": {
+ "rainbow_mood": true,
+ "rainbow_swirl": true,
+ "static_gradient": true,
+ "twinkle": true
+ },
+ "led_count": 3,
+ "layers": {
+ "enabled": true,
+ "override_rgb": false
+ },
+ "default": {
+ "animation": "rainbow_swirl"
+ }
+ },
+ "url": "https://cannonkeys.com",
+ "usb": {
+ "device_version": "0.0.1",
+ "pid": "0x0029",
+ "vid": "0xCA04"
+ },
+ "ws2812": {
+ "driver": "vendor",
+ "pin": "GP7"
+ },
+ "layouts": {
+ "LAYOUT_7u_no_split": {
+ "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.5, "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": [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": [1, 14], "x": 15.5, "y": 1},
+ {"matrix": [1, 15], "x": 16.5, "y": 1},
+ {"matrix": [1, 16], "x": 17.5, "y": 1},
+ {"matrix": [1, 17], "x": 18.5, "y": 1, "h": 2},
+ {"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": [2, 14], "x": 15.5, "y": 2},
+ {"matrix": [2, 15], "x": 16.5, "y": 2},
+ {"matrix": [2, 16], "x": 17.5, "y": 2},
+ {"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.25, "y": 3.25},
+ {"matrix": [3, 14], "x": 15.5, "y": 3},
+ {"matrix": [3, 15], "x": 16.5, "y": 3},
+ {"matrix": [3, 16], "x": 17.5, "y": 3},
+ {"matrix": [3, 17], "x": 18.5, "y": 3, "h": 2},
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"matrix": [4, 1], "x": 1.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 6], "x": 3, "y": 4, "w": 7},
+ {"matrix": [4, 10], "x": 10, "y": 4, "w": 1.5},
+ {"matrix": [4, 11], "x": 11.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 12], "x": 13.25, "y": 4.25},
+ {"matrix": [4, 13], "x": 14.25, "y": 4.25},
+ {"matrix": [4, 14], "x": 15.25, "y": 4.25},
+ {"matrix": [4, 15], "x": 16.5, "y": 4},
+ {"matrix": [4, 16], "x": 17.5, "y": 4}
+ ]
+ },
+ "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": [2, 12], "x": 14, "y": 0},
+ {"matrix": [0, 14], "x": 15.5, "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": [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": [1, 14], "x": 15.5, "y": 1},
+ {"matrix": [1, 15], "x": 16.5, "y": 1},
+ {"matrix": [1, 16], "x": 17.5, "y": 1},
+ {"matrix": [1, 17], "x": 18.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, 13], "x": 12.75, "y": 2, "w": 2.25},
+ {"matrix": [2, 14], "x": 15.5, "y": 2},
+ {"matrix": [2, 15], "x": 16.5, "y": 2},
+ {"matrix": [2, 16], "x": 17.5, "y": 2},
+ {"matrix": [2, 17], "x": 18.5, "y": 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.25, "y": 3.25},
+ {"matrix": [3, 14], "x": 15.5, "y": 3},
+ {"matrix": [3, 15], "x": 16.5, "y": 3},
+ {"matrix": [3, 16], "x": 17.5, "y": 3},
+ {"matrix": [3, 17], "x": 18.5, "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, "w": 1.25},
+ {"matrix": [4, 6], "x": 3.5, "y": 4, "w": 6},
+ {"matrix": [4, 9], "x": 9.5, "y": 4, "w": 1.25},
+ {"matrix": [4, 10], "x": 10.75, "y": 4},
+ {"matrix": [4, 11], "x": 11.75, "y": 4, "w": 1.25},
+ {"matrix": [4, 12], "x": 13.25, "y": 4.25},
+ {"matrix": [4, 13], "x": 14.25, "y": 4.25},
+ {"matrix": [4, 14], "x": 15.25, "y": 4.25},
+ {"matrix": [4, 15], "x": 16.5, "y": 4},
+ {"matrix": [4, 16], "x": 17.5, "y": 4},
+ {"matrix": [4, 17], "x": 18.5, "y": 4}
+ ]
+ },
+ "LAYOUT_default": {
+ "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.5, "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": [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": [1, 14], "x": 15.5, "y": 1},
+ {"matrix": [1, 15], "x": 16.5, "y": 1},
+ {"matrix": [1, 16], "x": 17.5, "y": 1},
+ {"matrix": [1, 17], "x": 18.5, "y": 1, "h": 2},
+ {"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": [2, 14], "x": 15.5, "y": 2},
+ {"matrix": [2, 15], "x": 16.5, "y": 2},
+ {"matrix": [2, 16], "x": 17.5, "y": 2},
+ {"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.25, "y": 3.25},
+ {"matrix": [3, 14], "x": 15.5, "y": 3},
+ {"matrix": [3, 15], "x": 16.5, "y": 3},
+ {"matrix": [3, 16], "x": 17.5, "y": 3},
+ {"matrix": [3, 17], "x": 18.5, "y": 3, "h": 2},
+ {"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.5},
+ {"matrix": [4, 11], "x": 11.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 12], "x": 13.25, "y": 4.25},
+ {"matrix": [4, 13], "x": 14.25, "y": 4.25},
+ {"matrix": [4, 14], "x": 15.25, "y": 4.25},
+ {"matrix": [4, 15], "x": 16.5, "y": 4},
+ {"matrix": [4, 16], "x": 17.5, "y": 4}
+ ]
+ },
+ "LAYOUT_iso_6u_split_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": [2, 12], "x": 14, "y": 0},
+ {"matrix": [0, 14], "x": 15.5, "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": [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, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
+ {"matrix": [1, 14], "x": 15.5, "y": 1},
+ {"matrix": [1, 15], "x": 16.5, "y": 1},
+ {"matrix": [1, 16], "x": 17.5, "y": 1},
+ {"matrix": [1, 17], "x": 18.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": [1, 13], "x": 12.75, "y": 2},
+ {"matrix": [2, 14], "x": 15.5, "y": 2},
+ {"matrix": [2, 15], "x": 16.5, "y": 2},
+ {"matrix": [2, 16], "x": 17.5, "y": 2},
+ {"matrix": [2, 17], "x": 18.5, "y": 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.25, "y": 3.25},
+ {"matrix": [3, 14], "x": 15.5, "y": 3},
+ {"matrix": [3, 15], "x": 16.5, "y": 3},
+ {"matrix": [3, 16], "x": 17.5, "y": 3},
+ {"matrix": [3, 17], "x": 18.5, "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, "w": 1.25},
+ {"matrix": [4, 6], "x": 3.5, "y": 4, "w": 6},
+ {"matrix": [4, 9], "x": 9.5, "y": 4, "w": 1.25},
+ {"matrix": [4, 10], "x": 10.75, "y": 4},
+ {"matrix": [4, 11], "x": 11.75, "y": 4, "w": 1.25},
+ {"matrix": [4, 12], "x": 13.25, "y": 4.25},
+ {"matrix": [4, 13], "x": 14.25, "y": 4.25},
+ {"matrix": [4, 14], "x": 15.25, "y": 4.25},
+ {"matrix": [4, 15], "x": 16.5, "y": 4},
+ {"matrix": [4, 16], "x": 17.5, "y": 4},
+ {"matrix": [4, 17], "x": 18.5, "y": 4}
+ ]
+ }
+ }
+}
diff --git a/keyboards/cannonkeys/petrichor/keymaps/default/keymap.c b/keyboards/cannonkeys/petrichor/keymaps/default/keymap.c
new file mode 100644
index 00000000000..8f2a516b732
--- /dev/null
+++ b/keyboards/cannonkeys/petrichor/keymaps/default/keymap.c
@@ -0,0 +1,24 @@
+// Copyright 2024 Andrew Kannan
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT_all( /* Base */
+ 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_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_P7, KC_P8, KC_P9, KC_PPLS,
+ 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_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_RGUI, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT
+ ),
+
+ [1] = LAYOUT_all( /* Function Layer */
+ 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, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______,_______, _______, _______, _______, _______, _______, _______
+ ),
+
+};
\ No newline at end of file
diff --git a/keyboards/cannonkeys/petrichor/keymaps/via/keymap.c b/keyboards/cannonkeys/petrichor/keymaps/via/keymap.c
new file mode 100644
index 00000000000..8f2a516b732
--- /dev/null
+++ b/keyboards/cannonkeys/petrichor/keymaps/via/keymap.c
@@ -0,0 +1,24 @@
+// Copyright 2024 Andrew Kannan
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT_all( /* Base */
+ 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_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_P7, KC_P8, KC_P9, KC_PPLS,
+ 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_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_RGUI, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT
+ ),
+
+ [1] = LAYOUT_all( /* Function Layer */
+ 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, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______,_______, _______, _______, _______, _______, _______, _______
+ ),
+
+};
\ No newline at end of file
diff --git a/keyboards/cannonkeys/petrichor/keymaps/via/rules.mk b/keyboards/cannonkeys/petrichor/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/cannonkeys/petrichor/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/cannonkeys/petrichor/petrichor.c b/keyboards/cannonkeys/petrichor/petrichor.c
new file mode 100644
index 00000000000..a80036c7b3a
--- /dev/null
+++ b/keyboards/cannonkeys/petrichor/petrichor.c
@@ -0,0 +1,40 @@
+// Copyright 2023 Andrew Kannan
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "quantum.h"
+
+const rgblight_segment_t PROGMEM my_capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS(
+ {2, 1, HSV_PURPLE}
+);
+const rgblight_segment_t PROGMEM my_numlock_layer[] = RGBLIGHT_LAYER_SEGMENTS(
+ {1, 1, HSV_GREEN}
+);
+const rgblight_segment_t PROGMEM my_layer1_layer[] = RGBLIGHT_LAYER_SEGMENTS(
+ {0, 1, HSV_BLUE}
+);
+
+const rgblight_segment_t* const PROGMEM enabled_rgb_layers[] = RGBLIGHT_LAYERS_LIST(
+ my_capslock_layer,
+ my_numlock_layer,
+ my_layer1_layer
+);
+
+void keyboard_post_init_kb(void) {
+ keyboard_post_init_user();
+ rgblight_layers = enabled_rgb_layers;
+}
+
+bool led_update_kb(led_t led_state) {
+ if(!led_update_user(led_state)){
+ return false;
+ }
+ rgblight_set_layer_state(0, led_state.caps_lock);
+ rgblight_set_layer_state(1, led_state.num_lock);
+ return true;
+}
+
+layer_state_t layer_state_set_kb(layer_state_t state) {
+ state = layer_state_set_user(state);
+ rgblight_set_layer_state(2, layer_state_cmp(state, 1));
+ return state;
+}
diff --git a/keyboards/cannonkeys/petrichor/readme.md b/keyboards/cannonkeys/petrichor/readme.md
new file mode 100644
index 00000000000..5eb1c96e48f
--- /dev/null
+++ b/keyboards/cannonkeys/petrichor/readme.md
@@ -0,0 +1,28 @@
+# Petrichor PCB
+
+Petrichor PCB from CannonKeys for the AKB Petrichor keyboard
+(This firmware is used for both the hotswap and solderable variant)
+
+* Keyboard Maintainer: [Andrew Kannan](https://github.com/awkannan)
+* Hardware Supported: RP2040
+* Hardware Availability: [CannonKeys](https://cannonkeys.com)
+
+
+Make example for this keyboard (after setting up your build environment):
+
+ make cannonkeys/petrichor:default
+
+Flashing example for this keyboard:
+
+ make cannonkeys/petrichor: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 4 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 "BOOTSEL" button on the back of the PCB and briefly press the "REBOOT" button on the back of the PCB.
+* **Top side reboot pads**: Bridge the reboot pads on the top of the PCB with a pair of tweezers twice in a row, quickly.
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
diff --git a/keyboards/cannonkeys/petrichor/rules.mk b/keyboards/cannonkeys/petrichor/rules.mk
new file mode 100644
index 00000000000..6e7633bfe01
--- /dev/null
+++ b/keyboards/cannonkeys/petrichor/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
diff --git a/keyboards/chew/config.h b/keyboards/chew/config.h
new file mode 100644
index 00000000000..22b43cf799d
--- /dev/null
+++ b/keyboards/chew/config.h
@@ -0,0 +1,11 @@
+// Copyright 2024 Florent (@FLinguenheld)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+/* Flash */
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET // Activates the double-tap behavior
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 200U // In ms in which the double tap can occur
+
+#define EE_HANDS
+#define SERIAL_USART_TX_PIN GP11
diff --git a/keyboards/chew/info.json b/keyboards/chew/info.json
new file mode 100644
index 00000000000..f6ddaa627d8
--- /dev/null
+++ b/keyboards/chew/info.json
@@ -0,0 +1,84 @@
+{
+ "manufacturer": "florent@linguenheld.fr",
+ "keyboard_name": "chew",
+ "maintainer": "florent@linguenheld.fr",
+ "bootloader": "rp2040",
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true
+ },
+ "matrix_pins": {
+ "direct": [
+ ["GP4", "GP3", "GP2", "GP1", "GP0"],
+ ["GP15", "GP26", "GP27", "GP28", "GP29"],
+ ["GP14", "GP13", "GP9", "GP8", "NO_PIN"],
+ ["GP7", "GP6", "GP5", "NO_PIN", "NO_PIN"]
+ ]
+ },
+ "processor": "RP2040",
+ "split": {
+ "enabled": true,
+ "matrix_pins": {
+ "right": {
+ "direct": [
+ ["GP0", "GP1", "GP2", "GP3", "GP4"],
+ ["GP29", "GP28", "GP27", "GP26", "GP15"],
+ ["GP8", "GP9", "GP13", "GP14", "NO_PIN"],
+ ["GP5", "GP6", "GP7", "NO_PIN", "NO_PIN"]
+ ]
+ }
+ },
+ "transport": {
+ "watchdog": true
+ }
+ },
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x0000",
+ "vid": "0xFEED"
+ },
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0.25},
+ {"matrix": [0, 1], "x": 1, "y": 0.125},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0.125},
+ {"matrix": [0, 4], "x": 4, "y": 0.25},
+ {"matrix": [4, 0], "x": 7, "y": 0.25},
+ {"matrix": [4, 1], "x": 8, "y": 0.125},
+ {"matrix": [4, 2], "x": 9, "y": 0},
+ {"matrix": [4, 3], "x": 10, "y": 0.125},
+ {"matrix": [4, 4], "x": 11, "y": 0.25},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.125},
+ {"matrix": [1, 2], "x": 2, "y": 1},
+ {"matrix": [1, 3], "x": 3, "y": 1.125},
+ {"matrix": [1, 4], "x": 4, "y": 1.25},
+ {"matrix": [5, 0], "x": 7, "y": 1.25},
+ {"matrix": [5, 1], "x": 8, "y": 1.125},
+ {"matrix": [5, 2], "x": 9, "y": 1},
+ {"matrix": [5, 3], "x": 10, "y": 1.125},
+ {"matrix": [5, 4], "x": 11, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25},
+ {"matrix": [2, 1], "x": 1, "y": 2.125},
+ {"matrix": [2, 2], "x": 2, "y": 2},
+ {"matrix": [2, 3], "x": 3, "y": 2.125},
+ {"matrix": [6, 0], "x": 8, "y": 2.125},
+ {"matrix": [6, 1], "x": 9, "y": 2},
+ {"matrix": [6, 2], "x": 10, "y": 2.125},
+ {"matrix": [6, 3], "x": 11, "y": 2.25},
+ {"matrix": [3, 0], "x": 2.5, "y": 3.25},
+ {"matrix": [3, 1], "x": 3.5, "y": 3.5},
+ {"matrix": [3, 2], "x": 4.5, "y": 3.75},
+ {"matrix": [7, 0], "x": 6.5, "y": 3.75},
+ {"matrix": [7, 1], "x": 7.5, "y": 3.5},
+ {"matrix": [7, 2], "x": 8.5, "y": 3.25}
+ ]
+ }
+ }
+}
diff --git a/keyboards/chew/keymaps/default/keymap.c b/keyboards/chew/keymaps/default/keymap.c
new file mode 100644
index 00000000000..541ddbdf1c3
--- /dev/null
+++ b/keyboards/chew/keymaps/default/keymap.c
@@ -0,0 +1,27 @@
+// Copyright 2024 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /*
+ * ┌───┬───┬───┬───┬───┐ ┌───┬───┬───┬───┬───┐
+ * │ Q │ W │ E │ R │ T │ │ Y │ U │ I │ O │ P │
+ * ├───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┤
+ * │ A │ S │ D │ F │ G │ │ H │ J │ K │ L │ ; │
+ * ├───┼───┼───┼───┼───┘ └───┼───┼───┼───┼───┤
+ * │ Z │ X │ C │ V │ │ M │ , │ . │ / │
+ * └───┴───┴───┴───┘ └───┴───┴───┴───┘
+ * ┌───┐ ┌───┐
+ * │ B ├───┐ ┌───┤ N │
+ * └───┤Bsp├───┐ ┌───┤Ent├───┘
+ * └───┤Alt│ │ ├───┘
+ * └───┘ └───┘
+ */
+ [0] = LAYOUT(
+ KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,
+ KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,
+ KC_Z, KC_X, KC_C, KC_V, KC_M, KC_COMM, KC_DOT, KC_SLSH,
+ KC_B, KC_BSPC, KC_RALT, KC_SPC, KC_ENT, KC_N
+ )
+};
diff --git a/keyboards/chew/readme.md b/keyboards/chew/readme.md
new file mode 100644
index 00000000000..a08398ea0fa
--- /dev/null
+++ b/keyboards/chew/readme.md
@@ -0,0 +1,38 @@
+## Chew
+
+
+
+
+A humble 34 key choc-spaced keyboard.
+
+- Keyboard Maintainer: [Florent Linguenheld](https://github.com/flinguenheld/)
+- Visit the repository to get the last release: [Chew](https://github.com/flinguenheld/chew)
+- Read the wiki to have some help or information: [Chew wiki](https://github.com/flinguenheld/chew/wiki)
+
+
+
+
+### Requirements
+
+- 2x PCB
+- 2x MCU board [RP2040-Zero](https://www.waveshare.com/wiki/RP2040-Zero)
+- 2x TRRS jack
+- 34 switches Choc V1 **only**
+- 34 keycaps Choc V1
+
+Optional:
+- 23 [Mill Max sockets](https://splitkb.com/collections/keyboard-parts/products/mill-max-low-profile-sockets)
+- 34 [kailh hotswap sockets](https://cdn.shopify.com/s/files/1/0588/1108/9090/files/5118-Choc-Socket.pdf?v=1686715063)
+- 2x Back PCB + screws and bolts
+- 2x [Tenting pucks](https://splitkb.com/collections/keyboard-parts/products/tenting-puck)
+- 2x [Tripods](https://www.manfrotto.com/us-en/pocket-support-large-black-mp3-bk/)
+
+### Bootloader
+
+The controller has two buttons, so you can enter the bootloader in 2 ways:
+
+- Maintain the **boot** button and plug the usb cable in.
+- Press twice the **reset** button.
+
+
+
diff --git a/keyboards/chew/rules.mk b/keyboards/chew/rules.mk
new file mode 100644
index 00000000000..161ec22b16e
--- /dev/null
+++ b/keyboards/chew/rules.mk
@@ -0,0 +1 @@
+SERIAL_DRIVER = vendor
diff --git a/keyboards/cipulot/chroma/info.json b/keyboards/cipulot/chroma/info.json
new file mode 100644
index 00000000000..5d418fdce1f
--- /dev/null
+++ b/keyboards/cipulot/chroma/info.json
@@ -0,0 +1,679 @@
+{
+ "manufacturer": "Cipulot",
+ "keyboard_name": "Chroma",
+ "maintainer": "Cipulot",
+ "bootloader": "stm32-dfu",
+ "build": {
+ "lto": true
+ },
+ "diode_direction": "COL2ROW",
+ "features": {
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true
+ },
+ "matrix_pins": {
+ "cols": ["A5", "A6", "A7", "B0", "B1", "B2", "B10", "B11", "B12", "A15", "B3", "B4", "B5", "B7", "B6"],
+ "rows": ["F0", "A2", "A3", "A4", "C15"]
+ },
+ "processor": "STM32F072",
+ "usb": {
+ "device_version": "0.0.1",
+ "pid": "0x6BBF",
+ "shared_endpoint": {
+ "keyboard": true
+ },
+ "vid": "0x6369"
+ },
+ "community_layouts": ["60_ansi_tsangan", "60_tsangan_hhkb", "60_ansi_wkl", "60_ansi_wkl_split_bs_rshift", "60_hhkb", "60_iso_tsangan", "60_iso_tsangan_split_bs_rshift", "60_iso_wkl", "60_iso_wkl_split_bs_rshift"],
+ "layouts": {
+ "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, 7], "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_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, 7], "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, 7], "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_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, 7], "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_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, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
+ {"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": [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, 7], "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, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
+ {"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": [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, 7], "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, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
+ {"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": [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, 7], "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, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
+ {"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": [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, 7], "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_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, 7], "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_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.5},
+ {"matrix": [4, 1], "x": 1.5, "y": 4},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 7], "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}
+ ]
+ }
+ }
+}
diff --git a/keyboards/cipulot/chroma/keymaps/60_ansi_tsangan/keymap.c b/keyboards/cipulot/chroma/keymaps/60_ansi_tsangan/keymap.c
new file mode 100644
index 00000000000..df27a14861a
--- /dev/null
+++ b/keyboards/cipulot/chroma/keymaps/60_ansi_tsangan/keymap.c
@@ -0,0 +1,43 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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] = {
+ // clang-format off
+ [0] = LAYOUT_60_ansi_tsangan(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL
+ ),
+ [1] = LAYOUT_60_ansi_tsangan(
+ 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_UP, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, _______, _______, _______,
+ _______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______
+ ),
+ [2] = LAYOUT_60_ansi_tsangan(
+ QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______
+ )
+ // clang-format on
+};
diff --git a/keyboards/cipulot/chroma/keymaps/60_ansi_wkl/keymap.c b/keyboards/cipulot/chroma/keymaps/60_ansi_wkl/keymap.c
new file mode 100644
index 00000000000..4bc80d1d24b
--- /dev/null
+++ b/keyboards/cipulot/chroma/keymaps/60_ansi_wkl/keymap.c
@@ -0,0 +1,43 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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] = {
+ // clang-format off
+ [0] = LAYOUT_60_ansi_wkl(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_RCTL
+ ),
+ [1] = LAYOUT_60_ansi_wkl(
+ 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_UP, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, _______, _______, _______,
+ _______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______
+ ),
+ [2] = LAYOUT_60_ansi_wkl(
+ QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______
+ )
+ // clang-format on
+};
diff --git a/keyboards/cipulot/chroma/keymaps/60_ansi_wkl_split_bs_rshift/keymap.c b/keyboards/cipulot/chroma/keymaps/60_ansi_wkl_split_bs_rshift/keymap.c
new file mode 100644
index 00000000000..e9cdf26567f
--- /dev/null
+++ b/keyboards/cipulot/chroma/keymaps/60_ansi_wkl_split_bs_rshift/keymap.c
@@ -0,0 +1,43 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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] = {
+ // clang-format off
+ [0] = LAYOUT_60_ansi_wkl_split_bs_rshift(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, 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_LALT, KC_SPC, KC_RALT, KC_RCTL
+ ),
+ [1] = LAYOUT_60_ansi_wkl_split_bs_rshift(
+ 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_UP, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, _______, _______, _______,
+ _______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, MO(2)
+ ),
+ [2] = LAYOUT_60_ansi_wkl_split_bs_rshift(
+ QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______
+ )
+ // clang-format on
+};
diff --git a/keyboards/cipulot/chroma/keymaps/60_iso_tsangan/keymap.c b/keyboards/cipulot/chroma/keymaps/60_iso_tsangan/keymap.c
new file mode 100644
index 00000000000..55492c3e4d4
--- /dev/null
+++ b/keyboards/cipulot/chroma/keymaps/60_iso_tsangan/keymap.c
@@ -0,0 +1,43 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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] = {
+ // clang-format off
+ [0] = LAYOUT_60_iso_tsangan(
+ 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_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,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL
+ ),
+ [1] = LAYOUT_60_iso_tsangan(
+ 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_UP, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, _______, _______,
+ _______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______
+ ),
+ [2] = LAYOUT_60_iso_tsangan(
+ QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______
+ )
+ // clang-format on
+};
diff --git a/keyboards/cipulot/chroma/keymaps/60_iso_tsangan_split_bs_rshift/keymap.c b/keyboards/cipulot/chroma/keymaps/60_iso_tsangan_split_bs_rshift/keymap.c
new file mode 100644
index 00000000000..3cce7112447
--- /dev/null
+++ b/keyboards/cipulot/chroma/keymaps/60_iso_tsangan_split_bs_rshift/keymap.c
@@ -0,0 +1,43 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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] = {
+ // clang-format off
+ [0] = LAYOUT_60_iso_tsangan_split_bs_rshift(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, 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_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, KC_RCTL
+ ),
+ [1] = LAYOUT_60_iso_tsangan_split_bs_rshift(
+ 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_UP, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, _______, _______,
+ _______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, MO(2)
+ ),
+ [2] = LAYOUT_60_iso_tsangan_split_bs_rshift(
+ QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______
+ )
+ // clang-format on
+};
diff --git a/keyboards/cipulot/chroma/keymaps/60_iso_wkl/keymap.c b/keyboards/cipulot/chroma/keymaps/60_iso_wkl/keymap.c
new file mode 100644
index 00000000000..01bb84f50d4
--- /dev/null
+++ b/keyboards/cipulot/chroma/keymaps/60_iso_wkl/keymap.c
@@ -0,0 +1,43 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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] = {
+ // clang-format off
+ [0] = LAYOUT_60_iso_wkl(
+ 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_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,
+ KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_RCTL
+ ),
+ [1] = LAYOUT_60_iso_wkl(
+ 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_UP, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, _______, _______,
+ _______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______
+ ),
+ [2] = LAYOUT_60_iso_wkl(
+ QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______
+ )
+ // clang-format on
+};
diff --git a/keyboards/cipulot/chroma/keymaps/60_iso_wkl_split_bs_rshift/keymap.c b/keyboards/cipulot/chroma/keymaps/60_iso_wkl_split_bs_rshift/keymap.c
new file mode 100644
index 00000000000..d412f2a977d
--- /dev/null
+++ b/keyboards/cipulot/chroma/keymaps/60_iso_wkl_split_bs_rshift/keymap.c
@@ -0,0 +1,43 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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] = {
+ // clang-format off
+ [0] = LAYOUT_60_iso_wkl_split_bs_rshift(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, 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_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_LALT, KC_SPC, KC_RALT, KC_RCTL
+ ),
+ [1] = LAYOUT_60_iso_wkl_split_bs_rshift(
+ 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_UP, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, _______, _______,
+ _______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, MO(2)
+ ),
+ [2] = LAYOUT_60_iso_wkl_split_bs_rshift(
+ QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______
+ )
+ // clang-format on
+};
diff --git a/keyboards/cipulot/chroma/keymaps/default/keymap.c b/keyboards/cipulot/chroma/keymaps/default/keymap.c
new file mode 100644
index 00000000000..c93d9110efe
--- /dev/null
+++ b/keyboards/cipulot/chroma/keymaps/default/keymap.c
@@ -0,0 +1,43 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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] = {
+ // clang-format off
+ [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_BSPC, 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, KC_RCTL
+ ),
+ [1] = 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_UP, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, _______, _______, _______,
+ _______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, MO(2)
+ ),
+ [2] = LAYOUT_all(
+ QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______
+ )
+ // clang-format on
+};
diff --git a/keyboards/cipulot/chroma/keymaps/via/keymap.c b/keyboards/cipulot/chroma/keymaps/via/keymap.c
new file mode 100644
index 00000000000..c93d9110efe
--- /dev/null
+++ b/keyboards/cipulot/chroma/keymaps/via/keymap.c
@@ -0,0 +1,43 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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] = {
+ // clang-format off
+ [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_BSPC, 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, KC_RCTL
+ ),
+ [1] = 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_UP, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, _______, _______, _______,
+ _______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, MO(2)
+ ),
+ [2] = LAYOUT_all(
+ QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______
+ )
+ // clang-format on
+};
diff --git a/keyboards/cipulot/chroma/keymaps/via/rules.mk b/keyboards/cipulot/chroma/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/cipulot/chroma/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/cipulot/chroma/readme.md b/keyboards/cipulot/chroma/readme.md
new file mode 100644
index 00000000000..9a08bbecac1
--- /dev/null
+++ b/keyboards/cipulot/chroma/readme.md
@@ -0,0 +1,27 @@
+# Chroma
+
+
+
+A 60% hot swap PCB for MX switches.
+
+* Keyboard Maintainer: [cipulot](https://github.com/cipulot)
+* Hardware Supported: Chroma
+* Hardware Availability: [Eloquent Clicks](https://eloquentclicks.com/)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make cipulot/chroma:default
+
+Flashing example for this keyboard:
+
+ make cipulot/chroma: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:
+
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is configured.
+* **Physical reset button**: Long press the reset button soldered on the PCB.
+* **Bootmagic reset**: Hold down the top left key and plug in the controller.
diff --git a/keyboards/cipulot/chroma/rules.mk b/keyboards/cipulot/chroma/rules.mk
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/keyboards/cipulot/ec_23u/config.h b/keyboards/cipulot/ec_23u/config.h
index 3a3d482e3d3..f5b74b9e600 100644
--- a/keyboards/cipulot/ec_23u/config.h
+++ b/keyboards/cipulot/ec_23u/config.h
@@ -62,8 +62,3 @@
#define EECONFIG_KB_DATA_SIZE 57
-/* 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
diff --git a/keyboards/cipulot/ec_23u/info.json b/keyboards/cipulot/ec_23u/info.json
index 0f656f8e8ca..17aa5eb6e7a 100644
--- a/keyboards/cipulot/ec_23u/info.json
+++ b/keyboards/cipulot/ec_23u/info.json
@@ -6,6 +6,12 @@
"build": {
"lto": true
},
+ "qmk": {
+ "locking": {
+ "enabled": true,
+ "resync": true
+ }
+ },
"diode_direction": "COL2ROW",
"features": {
"bootmagic": false,
diff --git a/keyboards/cipulot/ec_23u/rules.mk b/keyboards/cipulot/ec_23u/rules.mk
index ab6c37cad43..318e0215ce9 100644
--- a/keyboards/cipulot/ec_23u/rules.mk
+++ b/keyboards/cipulot/ec_23u/rules.mk
@@ -1,4 +1,5 @@
CUSTOM_MATRIX = lite
ANALOG_DRIVER_REQUIRED = yes
-SRC += keyboards/cipulot/common/matrix.c keyboards/cipulot/common/ec_board.c keyboards/cipulot/common/ec_switch_matrix.c
+VPATH += keyboards/cipulot/common
+SRC += matrix.c ec_board.c ec_switch_matrix.c
OPT = 2
diff --git a/keyboards/cipulot/ec_60/config.h b/keyboards/cipulot/ec_60/config.h
index c936b248c45..24525501439 100644
--- a/keyboards/cipulot/ec_60/config.h
+++ b/keyboards/cipulot/ec_60/config.h
@@ -64,9 +64,3 @@
// #define DEBUG_MATRIX_SCAN_RATE
#define EECONFIG_KB_DATA_SIZE 159
-
-/* 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
diff --git a/keyboards/cipulot/ec_60/info.json b/keyboards/cipulot/ec_60/info.json
index a86b20bfd63..860594f611a 100644
--- a/keyboards/cipulot/ec_60/info.json
+++ b/keyboards/cipulot/ec_60/info.json
@@ -6,6 +6,12 @@
"build": {
"lto": true
},
+ "qmk": {
+ "locking": {
+ "enabled": true,
+ "resync": true
+ }
+ },
"diode_direction": "COL2ROW",
"features": {
"bootmagic": false,
diff --git a/keyboards/cipulot/ec_60/rules.mk b/keyboards/cipulot/ec_60/rules.mk
index 70494b635f6..ce525670a68 100644
--- a/keyboards/cipulot/ec_60/rules.mk
+++ b/keyboards/cipulot/ec_60/rules.mk
@@ -1,4 +1,5 @@
CUSTOM_MATRIX = lite
ANALOG_DRIVER_REQUIRED = yes
-SRC += keyboards/cipulot/common/matrix.c keyboards/cipulot/common/ec_board.c keyboards/cipulot/common/ec_switch_matrix.c
+VPATH += keyboards/cipulot/common
+SRC += matrix.c ec_board.c ec_switch_matrix.c
OPT = 3
diff --git a/keyboards/cipulot/ec_660c/config.h b/keyboards/cipulot/ec_660c/config.h
new file mode 100644
index 00000000000..9e883c40da2
--- /dev/null
+++ b/keyboards/cipulot/ec_660c/config.h
@@ -0,0 +1,66 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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 MATRIX_ROWS 5
+#define MATRIX_COLS 15
+
+#define MATRIX_ROW_PINS \
+ { B1, B10, B0, A1, A0 }
+
+#define AMUX_COUNT 2
+#define AMUX_MAX_COLS_COUNT 8
+
+#define AMUX_EN_PINS \
+ { B7, B6 }
+
+#define AMUX_SEL_PINS \
+ { B5, B4, B3 }
+
+#define AMUX_COL_CHANNELS_SIZES \
+ { 8, 7 }
+
+#define AMUX_0_COL_CHANNELS \
+ { 3, 0, 1, 2, 4, 6, 7, 5 }
+
+#define AMUX_1_COL_CHANNELS \
+ { 3, 0, 1, 2, 4, 6, 7 }
+
+#define AMUX_COL_CHANNELS AMUX_0_COL_CHANNELS, AMUX_1_COL_CHANNELS
+
+#define DISCHARGE_PIN A5
+#define ANALOG_PORT A4
+
+#define DEFAULT_ACTUATION_MODE 0
+#define DEFAULT_MODE_0_ACTUATION_LEVEL 550
+#define DEFAULT_MODE_0_RELEASE_LEVEL 500
+#define DEFAULT_MODE_1_INITIAL_DEADZONE_OFFSET DEFAULT_MODE_0_ACTUATION_LEVEL
+#define DEFAULT_MODE_1_ACTUATION_OFFSET 70
+#define DEFAULT_MODE_1_RELEASE_OFFSET 70
+#define DEFAULT_EXTREMUM 1023
+#define EXPECTED_NOISE_FLOOR 0
+#define NOISE_FLOOR_THRESHOLD 50
+#define BOTTOMING_CALIBRATION_THRESHOLD 100
+#define DEFAULT_NOISE_FLOOR_SAMPLING_COUNT 30
+#define DEFAULT_BOTTOMING_READING 1023
+#define DEFAULT_CALIBRATION_STARTER true
+
+#define DISCHARGE_TIME 10
+
+// #define DEBUG_MATRIX_SCAN_RATE
+
+#define EECONFIG_KB_DATA_SIZE 159
diff --git a/keyboards/cipulot/ec_660c/halconf.h b/keyboards/cipulot/ec_660c/halconf.h
new file mode 100644
index 00000000000..835d43b6a0a
--- /dev/null
+++ b/keyboards/cipulot/ec_660c/halconf.h
@@ -0,0 +1,21 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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_ADC TRUE
+
+#include_next
diff --git a/keyboards/cipulot/ec_660c/info.json b/keyboards/cipulot/ec_660c/info.json
new file mode 100644
index 00000000000..32ac397b6bf
--- /dev/null
+++ b/keyboards/cipulot/ec_660c/info.json
@@ -0,0 +1,111 @@
+{
+ "manufacturer": "Cipulot",
+ "keyboard_name": "EC 660C",
+ "maintainer": "Cipulot",
+ "bootloader": "stm32-dfu",
+ "build": {
+ "lto": true
+ },
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": false,
+ "console": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true
+ },
+ "indicators": {
+ "caps_lock": "B14",
+ "scroll_lock": "B15"
+ },
+ "processor": "STM32F401",
+ "qmk": {
+ "locking": {
+ "enabled": true,
+ "resync": true
+ }
+ },
+ "usb": {
+ "device_version": "0.0.1",
+ "pid": "0x6BA6",
+ "shared_endpoint": {
+ "keyboard": true
+ },
+ "vid": "0x6369"
+ },
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label": "0,0", "matrix": [0, 0], "x": 0, "y": 0},
+ {"label": "0,1", "matrix": [0, 1], "x": 1, "y": 0},
+ {"label": "0,2", "matrix": [0, 2], "x": 2, "y": 0},
+ {"label": "0,3", "matrix": [0, 3], "x": 3, "y": 0},
+ {"label": "0,4", "matrix": [0, 4], "x": 4, "y": 0},
+ {"label": "0,5", "matrix": [0, 5], "x": 5, "y": 0},
+ {"label": "0,6", "matrix": [0, 6], "x": 6, "y": 0},
+ {"label": "0,7", "matrix": [0, 7], "x": 7, "y": 0},
+ {"label": "0,8", "matrix": [0, 8], "x": 8, "y": 0},
+ {"label": "0,9", "matrix": [0, 9], "x": 9, "y": 0},
+ {"label": "0,10", "matrix": [0, 10], "x": 10, "y": 0},
+ {"label": "0,11", "matrix": [0, 11], "x": 11, "y": 0},
+ {"label": "0,12", "matrix": [0, 12], "x": 12, "y": 0},
+ {"label": "0,13", "matrix": [0, 13], "x": 13, "y": 0},
+ {"label": "0,14", "matrix": [0, 14], "x": 14, "y": 0},
+ {"label": "1,14", "matrix": [1, 14], "x": 15.5, "y": 0},
+ {"label": "1,0", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"label": "1,1", "matrix": [1, 1], "x": 1.5, "y": 1},
+ {"label": "1,2", "matrix": [1, 2], "x": 2.5, "y": 1},
+ {"label": "1,3", "matrix": [1, 3], "x": 3.5, "y": 1},
+ {"label": "1,4", "matrix": [1, 4], "x": 4.5, "y": 1},
+ {"label": "1,5", "matrix": [1, 5], "x": 5.5, "y": 1},
+ {"label": "1,6", "matrix": [1, 6], "x": 6.5, "y": 1},
+ {"label": "1,7", "matrix": [1, 7], "x": 7.5, "y": 1},
+ {"label": "1,8", "matrix": [1, 8], "x": 8.5, "y": 1},
+ {"label": "1,9", "matrix": [1, 9], "x": 9.5, "y": 1},
+ {"label": "1,10", "matrix": [1, 10], "x": 10.5, "y": 1},
+ {"label": "1,11", "matrix": [1, 11], "x": 11.5, "y": 1},
+ {"label": "1,12", "matrix": [1, 12], "x": 12.5, "y": 1},
+ {"label": "1,13", "matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
+ {"label": "2,14", "matrix": [2, 14], "x": 15.5, "y": 1},
+ {"label": "2,0", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"label": "2,1", "matrix": [2, 1], "x": 1.75, "y": 2},
+ {"label": "2,2", "matrix": [2, 2], "x": 2.75, "y": 2},
+ {"label": "2,3", "matrix": [2, 3], "x": 3.75, "y": 2},
+ {"label": "2,4", "matrix": [2, 4], "x": 4.75, "y": 2},
+ {"label": "2,5", "matrix": [2, 5], "x": 5.75, "y": 2},
+ {"label": "2,6", "matrix": [2, 6], "x": 6.75, "y": 2},
+ {"label": "2,7", "matrix": [2, 7], "x": 7.75, "y": 2},
+ {"label": "2,8", "matrix": [2, 8], "x": 8.75, "y": 2},
+ {"label": "2,9", "matrix": [2, 9], "x": 9.75, "y": 2},
+ {"label": "2,10", "matrix": [2, 10], "x": 10.75, "y": 2},
+ {"label": "2,11", "matrix": [2, 11], "x": 11.75, "y": 2},
+ {"label": "2,12", "matrix": [2, 12], "x": 12.75, "y": 2},
+ {"label": "2,13", "matrix": [2, 13], "x": 13.75, "y": 2, "w": 1.25},
+ {"label": "3,0", "matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
+ {"label": "3,1", "matrix": [3, 1], "x": 1.25, "y": 3},
+ {"label": "3,2", "matrix": [3, 2], "x": 2.25, "y": 3},
+ {"label": "3,3", "matrix": [3, 3], "x": 3.25, "y": 3},
+ {"label": "3,4", "matrix": [3, 4], "x": 4.25, "y": 3},
+ {"label": "3,5", "matrix": [3, 5], "x": 5.25, "y": 3},
+ {"label": "3,6", "matrix": [3, 6], "x": 6.25, "y": 3},
+ {"label": "3,7", "matrix": [3, 7], "x": 7.25, "y": 3},
+ {"label": "3,8", "matrix": [3, 8], "x": 8.25, "y": 3},
+ {"label": "3,9", "matrix": [3, 9], "x": 9.25, "y": 3},
+ {"label": "3,10", "matrix": [3, 10], "x": 10.25, "y": 3},
+ {"label": "3,11", "matrix": [3, 11], "x": 11.25, "y": 3},
+ {"label": "3,12", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.25},
+ {"label": "3,13", "matrix": [3, 13], "x": 14.5, "y": 3},
+ {"label": "4,0", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
+ {"label": "4,1", "matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25},
+ {"label": "4,2", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25},
+ {"label": "4,6", "matrix": [4, 6], "x": 3.75, "y": 4, "w": 6},
+ {"label": "4,9", "matrix": [4, 9], "x": 9.75, "y": 4, "w": 1.25},
+ {"label": "4,10", "matrix": [4, 10], "x": 11, "y": 4, "w": 1.25},
+ {"label": "4,11", "matrix": [4, 11], "x": 12.25, "y": 4, "w": 1.25},
+ {"label": "4,12", "matrix": [4, 12], "x": 13.5, "y": 4},
+ {"label": "4,13", "matrix": [4, 13], "x": 14.5, "y": 4},
+ {"label": "4,14", "matrix": [4, 14], "x": 15.5, "y": 4}
+ ]
+ }
+ }
+}
diff --git a/keyboards/cipulot/ec_660c/keymaps/default/keymap.c b/keyboards/cipulot/ec_660c/keymaps/default/keymap.c
new file mode 100644
index 00000000000..5d82bdc3abd
--- /dev/null
+++ b/keyboards/cipulot/ec_660c/keymaps/default/keymap.c
@@ -0,0 +1,43 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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] = {
+ // clang-format off
+ [0] = 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_BSPC, 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_DEL,
+ 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_BSLS, 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_RCTL, MO(1), KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [1] = 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_CAPS, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUS, _______, _______, _______, _______,
+ _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, KC_HOME, KC_PGUP, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, KC_PGDN, _______, _______, _______,
+ _______, _______, _______, _______, _______, MO(2), _______, _______, _______, _______
+ ),
+ [2] = LAYOUT(
+ QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+ // clang-format on
+};
diff --git a/keyboards/cipulot/ec_660c/keymaps/via/keymap.c b/keyboards/cipulot/ec_660c/keymaps/via/keymap.c
new file mode 100644
index 00000000000..5d82bdc3abd
--- /dev/null
+++ b/keyboards/cipulot/ec_660c/keymaps/via/keymap.c
@@ -0,0 +1,43 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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] = {
+ // clang-format off
+ [0] = 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_BSPC, 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_DEL,
+ 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_BSLS, 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_RCTL, MO(1), KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [1] = 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_CAPS, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUS, _______, _______, _______, _______,
+ _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, KC_HOME, KC_PGUP, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, KC_PGDN, _______, _______, _______,
+ _______, _______, _______, _______, _______, MO(2), _______, _______, _______, _______
+ ),
+ [2] = LAYOUT(
+ QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+ // clang-format on
+};
diff --git a/keyboards/cipulot/ec_660c/keymaps/via/rules.mk b/keyboards/cipulot/ec_660c/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/cipulot/ec_660c/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/cipulot/ec_660c/mcuconf.h b/keyboards/cipulot/ec_660c/mcuconf.h
new file mode 100644
index 00000000000..fa3c955e0d8
--- /dev/null
+++ b/keyboards/cipulot/ec_660c/mcuconf.h
@@ -0,0 +1,22 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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 STM32_ADC_USE_ADC1
+#define STM32_ADC_USE_ADC1 TRUE
diff --git a/keyboards/cipulot/ec_660c/post_rules.mk b/keyboards/cipulot/ec_660c/post_rules.mk
new file mode 100644
index 00000000000..d726a112a8c
--- /dev/null
+++ b/keyboards/cipulot/ec_660c/post_rules.mk
@@ -0,0 +1,3 @@
+ifeq ($(strip $(VIA_ENABLE)), yes)
+ SRC += keyboards/cipulot/common/via_ec.c
+endif
diff --git a/keyboards/cipulot/ec_660c/readme.md b/keyboards/cipulot/ec_660c/readme.md
new file mode 100644
index 00000000000..c01bb3252e0
--- /dev/null
+++ b/keyboards/cipulot/ec_660c/readme.md
@@ -0,0 +1,26 @@
+# EC660C
+
+
+
+Replacement PCB for the Leopold FC660C.
+
+* Keyboard Maintainer: [cipulot](https://github.com/cipulot)
+* Hardware Supported: EC660C PCB
+* Hardware Availability: TBD
+
+Make example for this keyboard (after setting up your build environment):
+
+ make cipulot/ec_660c:default
+
+Flashing example for this keyboard:
+
+ make cipulot/ec_660c: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:
+
+* **Physical reset**: Long short the exposed pads on the top of the PCB
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
diff --git a/keyboards/cipulot/ec_660c/rules.mk b/keyboards/cipulot/ec_660c/rules.mk
new file mode 100644
index 00000000000..ce525670a68
--- /dev/null
+++ b/keyboards/cipulot/ec_660c/rules.mk
@@ -0,0 +1,5 @@
+CUSTOM_MATRIX = lite
+ANALOG_DRIVER_REQUIRED = yes
+VPATH += keyboards/cipulot/common
+SRC += matrix.c ec_board.c ec_switch_matrix.c
+OPT = 3
diff --git a/keyboards/cipulot/ec_980c/config.h b/keyboards/cipulot/ec_980c/config.h
new file mode 100644
index 00000000000..e3723822e33
--- /dev/null
+++ b/keyboards/cipulot/ec_980c/config.h
@@ -0,0 +1,86 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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 MATRIX_ROWS 6
+#define MATRIX_COLS 19
+
+#define MATRIX_ROW_PINS \
+ { B13, B12, B14, A9, B6, B7 }
+
+#define AMUX_COUNT 3
+#define AMUX_MAX_COLS_COUNT 8
+
+#define AMUX_EN_PINS \
+ { A0, A1, A8 }
+
+#define AMUX_SEL_PINS \
+ { A4, A3, A2 }
+
+#define AMUX_COL_CHANNELS_SIZES \
+ { 8, 7, 4 }
+
+#define AMUX_0_COL_CHANNELS \
+ { 0, 3, 1, 2, 4, 6, 7, 5 }
+
+#define AMUX_1_COL_CHANNELS \
+ { 1, 0, 3, 2, 4, 6, 7 }
+
+#define AMUX_2_COL_CHANNELS \
+ { 4, 6, 7, 5 }
+
+#define AMUX_COL_CHANNELS AMUX_0_COL_CHANNELS, AMUX_1_COL_CHANNELS, AMUX_2_COL_CHANNELS
+
+#define DISCHARGE_PIN A6
+#define ANALOG_PORT A7
+
+#define DEFAULT_ACTUATION_MODE 0
+#define DEFAULT_MODE_0_ACTUATION_LEVEL 550
+#define DEFAULT_MODE_0_RELEASE_LEVEL 500
+#define DEFAULT_MODE_1_INITIAL_DEADZONE_OFFSET DEFAULT_MODE_0_ACTUATION_LEVEL
+#define DEFAULT_MODE_1_ACTUATION_OFFSET 70
+#define DEFAULT_MODE_1_RELEASE_OFFSET 70
+#define DEFAULT_EXTREMUM 1023
+#define EXPECTED_NOISE_FLOOR 0
+#define NOISE_FLOOR_THRESHOLD 50
+#define BOTTOMING_CALIBRATION_THRESHOLD 100
+#define DEFAULT_NOISE_FLOOR_SAMPLING_COUNT 30
+#define DEFAULT_BOTTOMING_READING 1023
+#define DEFAULT_CALIBRATION_STARTER true
+
+#define DISCHARGE_TIME 10
+
+//#define DEBUG_MATRIX_SCAN_RATE
+
+#define EECONFIG_KB_DATA_SIZE 249
+
+// Indicators
+// PWM driver with direct memory access (DMA) support
+#define WS2812_PWM_COMPLEMENTARY_OUTPUT
+#define WS2812_PWM_DRIVER PWMD1
+#define WS2812_PWM_CHANNEL 3
+#define WS2812_PWM_PAL_MODE 1
+#define WS2812_DMA_STREAM STM32_DMA2_STREAM5
+#define WS2812_DMA_CHANNEL 6
+
+#define NUM_INDICATOR_INDEX 0
+#define CAPS_INDICATOR_INDEX 1
+#define SCROLL_INDICATOR_INDEX 2
+
+#define RGB_MATRIX_DEFAULT_VAL 60
+#define RGB_MATRIX_SLEEP
+#define RGB_MATRIX_DEFAULT_MODE RGB_MATRIX_SOLID_COLOR
diff --git a/keyboards/cipulot/ec_980c/ec_980c.c b/keyboards/cipulot/ec_980c/ec_980c.c
new file mode 100644
index 00000000000..2b40d5a5e69
--- /dev/null
+++ b/keyboards/cipulot/ec_980c/ec_980c.c
@@ -0,0 +1,116 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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 "ec_switch_matrix.h"
+#include "quantum.h"
+
+void eeconfig_init_kb(void) {
+ // Default values
+ eeprom_ec_config.num.h = 0;
+ eeprom_ec_config.num.s = 0;
+ eeprom_ec_config.num.v = 60;
+ eeprom_ec_config.num.enabled = true;
+ eeprom_ec_config.caps.h = 0;
+ eeprom_ec_config.caps.s = 0;
+ eeprom_ec_config.caps.v = 60;
+ eeprom_ec_config.caps.enabled = true;
+ eeprom_ec_config.scroll.h = 0;
+ eeprom_ec_config.scroll.s = 0;
+ eeprom_ec_config.scroll.v = 60;
+ eeprom_ec_config.scroll.enabled = true;
+ eeprom_ec_config.actuation_mode = DEFAULT_ACTUATION_MODE;
+ eeprom_ec_config.mode_0_actuation_threshold = DEFAULT_MODE_0_ACTUATION_LEVEL;
+ eeprom_ec_config.mode_0_release_threshold = DEFAULT_MODE_0_RELEASE_LEVEL;
+ eeprom_ec_config.mode_1_initial_deadzone_offset = DEFAULT_MODE_1_INITIAL_DEADZONE_OFFSET;
+ eeprom_ec_config.mode_1_actuation_offset = DEFAULT_MODE_1_ACTUATION_OFFSET;
+ eeprom_ec_config.mode_1_release_offset = DEFAULT_MODE_1_RELEASE_OFFSET;
+
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ for (uint8_t col = 0; col < MATRIX_COLS; col++) {
+ eeprom_ec_config.bottoming_reading[row][col] = DEFAULT_BOTTOMING_READING;
+ }
+ }
+ // Write default value to EEPROM now
+ eeconfig_update_kb_datablock(&eeprom_ec_config);
+
+ eeconfig_init_user();
+}
+
+// On Keyboard startup
+void keyboard_post_init_kb(void) {
+ // Read custom menu variables from memory
+ eeconfig_read_kb_datablock(&eeprom_ec_config);
+
+ // Set runtime values to EEPROM values
+ ec_config.actuation_mode = eeprom_ec_config.actuation_mode;
+ ec_config.mode_0_actuation_threshold = eeprom_ec_config.mode_0_actuation_threshold;
+ ec_config.mode_0_release_threshold = eeprom_ec_config.mode_0_release_threshold;
+ ec_config.mode_1_initial_deadzone_offset = eeprom_ec_config.mode_1_initial_deadzone_offset;
+ ec_config.mode_1_actuation_offset = eeprom_ec_config.mode_1_actuation_offset;
+ ec_config.mode_1_release_offset = eeprom_ec_config.mode_1_release_offset;
+ ec_config.bottoming_calibration = false;
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ for (uint8_t col = 0; col < MATRIX_COLS; col++) {
+ ec_config.bottoming_calibration_starter[row][col] = true;
+ ec_config.bottoming_reading[row][col] = eeprom_ec_config.bottoming_reading[row][col];
+ ec_config.rescaled_mode_0_actuation_threshold[row][col] = rescale(ec_config.mode_0_actuation_threshold, 0, 1023, ec_config.noise_floor[row][col], eeprom_ec_config.bottoming_reading[row][col]);
+ ec_config.rescaled_mode_0_release_threshold[row][col] = rescale(ec_config.mode_0_release_threshold, 0, 1023, ec_config.noise_floor[row][col], eeprom_ec_config.bottoming_reading[row][col]);
+ ec_config.rescaled_mode_1_initial_deadzone_offset[row][col] = rescale(ec_config.mode_1_initial_deadzone_offset, 0, 1023, ec_config.noise_floor[row][col], eeprom_ec_config.bottoming_reading[row][col]);
+ }
+ }
+
+ // Call the indicator callback to set the indicator color
+ rgb_matrix_indicators_kb();
+
+ keyboard_post_init_user();
+}
+
+// INDICATOR CALLBACK ------------------------------------------------------------------------------
+/* LED index to physical position
+ *
+ * LED0 | LED1 | LED2
+ * -----+------+--------
+ * Num | Caps | Scroll |
+ */
+bool rgb_matrix_indicators_kb(void) {
+ if (eeprom_ec_config.num.enabled) {
+ // The rgb_matrix_set_color function needs an RGB code to work, so first the indicator color is cast to an HSV value and then translated to RGB
+ HSV hsv_num_indicator_color = {eeprom_ec_config.num.h, eeprom_ec_config.num.s, eeprom_ec_config.num.v};
+ RGB rgb_num_indicator_color = hsv_to_rgb(hsv_num_indicator_color);
+ if (host_keyboard_led_state().num_lock)
+ rgb_matrix_set_color(NUM_INDICATOR_INDEX, rgb_num_indicator_color.r, rgb_num_indicator_color.g, rgb_num_indicator_color.b);
+ else
+ rgb_matrix_set_color(NUM_INDICATOR_INDEX, 0, 0, 0);
+ }
+ if (eeprom_ec_config.caps.enabled) {
+ HSV hsv_caps_indicator_color = {eeprom_ec_config.caps.h, eeprom_ec_config.caps.s, eeprom_ec_config.caps.v};
+ RGB rgb_caps_indicator_color = hsv_to_rgb(hsv_caps_indicator_color);
+ if (host_keyboard_led_state().caps_lock)
+ rgb_matrix_set_color(CAPS_INDICATOR_INDEX, rgb_caps_indicator_color.r, rgb_caps_indicator_color.g, rgb_caps_indicator_color.b);
+ else
+ rgb_matrix_set_color(CAPS_INDICATOR_INDEX, 0, 0, 0);
+ }
+ if (eeprom_ec_config.scroll.enabled) {
+ HSV hsv_scroll_indicator_color = {eeprom_ec_config.scroll.h, eeprom_ec_config.scroll.s, eeprom_ec_config.scroll.v};
+ RGB rgb_scroll_indicator_color = hsv_to_rgb(hsv_scroll_indicator_color);
+ if (host_keyboard_led_state().scroll_lock)
+ rgb_matrix_set_color(SCROLL_INDICATOR_INDEX, rgb_scroll_indicator_color.r, rgb_scroll_indicator_color.g, rgb_scroll_indicator_color.b);
+ else
+ rgb_matrix_set_color(SCROLL_INDICATOR_INDEX, 0, 0, 0);
+ }
+
+ return true;
+}
diff --git a/keyboards/cipulot/ec_980c/ec_switch_matrix.c b/keyboards/cipulot/ec_980c/ec_switch_matrix.c
new file mode 100644
index 00000000000..33123bd236e
--- /dev/null
+++ b/keyboards/cipulot/ec_980c/ec_switch_matrix.c
@@ -0,0 +1,318 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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 "ec_switch_matrix.h"
+#include "analog.h"
+#include "atomic_util.h"
+#include "math.h"
+#include "print.h"
+#include "wait.h"
+
+#if defined(__AVR__)
+# error "AVR platforms not supported due to a variety of reasons. Among them there are limited memory, limited number of pins and ADC not being able to give satisfactory results."
+#endif
+
+#define OPEN_DRAIN_SUPPORT defined(PAL_MODE_OUTPUT_OPENDRAIN)
+
+eeprom_ec_config_t eeprom_ec_config;
+ec_config_t ec_config;
+
+// Pin and port array
+const pin_t row_pins[] = MATRIX_ROW_PINS;
+const pin_t amux_sel_pins[] = AMUX_SEL_PINS;
+const pin_t amux_en_pins[] = AMUX_EN_PINS;
+const pin_t amux_n_col_sizes[] = AMUX_COL_CHANNELS_SIZES;
+const pin_t amux_n_col_channels[][AMUX_MAX_COLS_COUNT] = {AMUX_COL_CHANNELS};
+
+#define AMUX_SEL_PINS_COUNT ARRAY_SIZE(amux_sel_pins)
+#define EXPECTED_AMUX_SEL_PINS_COUNT ceil(log2(AMUX_MAX_COLS_COUNT)
+// Checks for the correctness of the configuration
+_Static_assert(ARRAY_SIZE(amux_en_pins) == AMUX_COUNT, "AMUX_EN_PINS doesn't have the minimum number of bits required to enable all the multiplexers available");
+// Check that number of select pins is enough to select all the channels
+_Static_assert(AMUX_SEL_PINS_COUNT == EXPECTED_AMUX_SEL_PINS_COUNT), "AMUX_SEL_PINS doesn't have the minimum number of bits required address all the channels");
+// Check that number of elements in AMUX_COL_CHANNELS_SIZES is enough to specify the number of channels for all the multiplexers available
+_Static_assert(ARRAY_SIZE(amux_n_col_sizes) == AMUX_COUNT, "AMUX_COL_CHANNELS_SIZES doesn't have the minimum number of elements required to specify the number of channels for all the multiplexers available");
+
+static uint16_t sw_value[MATRIX_ROWS][MATRIX_COLS];
+
+static adc_mux adcMux;
+
+// Initialize the row pins
+void init_row(void) {
+ // Set all row pins as output and low
+ for (uint8_t idx = 0; idx < MATRIX_ROWS; idx++) {
+ gpio_set_pin_output(row_pins[idx]);
+ gpio_write_pin_low(row_pins[idx]);
+ }
+}
+
+// Initialize the multiplexers
+void init_amux(void) {
+ for (uint8_t idx = 0; idx < AMUX_COUNT; idx++) {
+ gpio_set_pin_output(amux_en_pins[idx]);
+ gpio_write_pin_low(amux_en_pins[idx]);
+ }
+ for (uint8_t idx = 0; idx < AMUX_SEL_PINS_COUNT; idx++) {
+ gpio_set_pin_output(amux_sel_pins[idx]);
+ }
+}
+
+// Select the multiplexer channel of the specified multiplexer
+void select_amux_channel(uint8_t channel, uint8_t col) {
+ // Get the channel for the specified multiplexer
+ uint8_t ch = amux_n_col_channels[channel][col];
+ // momentarily disable specified multiplexer
+ gpio_write_pin_high(amux_en_pins[channel]);
+ // Select the multiplexer channel
+ for (uint8_t i = 0; i < AMUX_SEL_PINS_COUNT; i++) {
+ gpio_write_pin(amux_sel_pins[i], ch & (1 << i));
+ }
+ // re enable specified multiplexer
+ gpio_write_pin_low(amux_en_pins[channel]);
+}
+
+// Disable all the unused multiplexers
+void disable_unused_amux(uint8_t channel) {
+ // disable all the other multiplexers apart from the current selected one
+ for (uint8_t idx = 0; idx < AMUX_COUNT; idx++) {
+ if (idx != channel) {
+ gpio_write_pin_high(amux_en_pins[idx]);
+ }
+ }
+}
+// Discharge the peak hold capacitor
+void discharge_capacitor(void) {
+#ifdef OPEN_DRAIN_SUPPORT
+ gpio_write_pin_low(DISCHARGE_PIN);
+#else
+ gpio_write_pin_low(DISCHARGE_PIN);
+ gpio_set_pin_output(DISCHARGE_PIN);
+#endif
+}
+
+// Charge the peak hold capacitor
+void charge_capacitor(uint8_t row) {
+#ifdef OPEN_DRAIN_SUPPORT
+ gpio_write_pin_high(DISCHARGE_PIN);
+#else
+ gpio_set_pin_input(DISCHARGE_PIN);
+#endif
+ gpio_write_pin_high(row_pins[row]);
+}
+
+// Initialize the peripherals pins
+int ec_init(void) {
+ // Initialize ADC
+ palSetLineMode(ANALOG_PORT, PAL_MODE_INPUT_ANALOG);
+ adcMux = pinToMux(ANALOG_PORT);
+
+ // Dummy call to make sure that adcStart() has been called in the appropriate state
+ adc_read(adcMux);
+
+ // Initialize discharge pin as discharge mode
+ gpio_write_pin_low(DISCHARGE_PIN);
+#ifdef OPEN_DRAIN_SUPPORT
+ gpio_set_pin_output_open_drain(DISCHARGE_PIN);
+#else
+ gpio_set_pin_output(DISCHARGE_PIN);
+#endif
+
+ // Initialize drive lines
+ init_row();
+
+ // Initialize AMUXs
+ init_amux();
+
+ return 0;
+}
+
+// Get the noise floor
+void ec_noise_floor(void) {
+ // Initialize the noise floor
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ for (uint8_t col = 0; col < MATRIX_COLS; col++) {
+ ec_config.noise_floor[row][col] = 0;
+ }
+ }
+
+ // Sample the noise floor
+ for (uint8_t i = 0; i < DEFAULT_NOISE_FLOOR_SAMPLING_COUNT; i++) {
+ for (uint8_t amux = 0; amux < AMUX_COUNT; amux++) {
+ disable_unused_amux(amux);
+ for (uint8_t col = 0; col < amux_n_col_sizes[amux]; col++) {
+ uint8_t sum = 0;
+ for (uint8_t i = 0; i < (amux > 0 ? amux : 0); i++)
+ sum += amux_n_col_sizes[i];
+ uint8_t adjusted_col = col + sum;
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ ec_config.noise_floor[row][adjusted_col] += ec_readkey_raw(amux, row, col);
+ }
+ }
+ }
+ wait_ms(5);
+ }
+
+ // Average the noise floor
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ for (uint8_t col = 0; col < MATRIX_COLS; col++) {
+ ec_config.noise_floor[row][col] /= DEFAULT_NOISE_FLOOR_SAMPLING_COUNT;
+ }
+ }
+}
+
+// Scan key values and update matrix state
+bool ec_matrix_scan(matrix_row_t current_matrix[]) {
+ bool updated = false;
+
+ for (uint8_t amux = 0; amux < AMUX_COUNT; amux++) {
+ disable_unused_amux(amux);
+ for (uint8_t col = 0; col < amux_n_col_sizes[amux]; col++) {
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ uint8_t sum = 0;
+ for (uint8_t i = 0; i < (amux > 0 ? amux : 0); i++)
+ sum += amux_n_col_sizes[i];
+ uint8_t adjusted_col = col + sum;
+ sw_value[row][adjusted_col] = ec_readkey_raw(amux, row, col);
+
+ if (ec_config.bottoming_calibration) {
+ if (ec_config.bottoming_calibration_starter[row][adjusted_col]) {
+ ec_config.bottoming_reading[row][adjusted_col] = sw_value[row][adjusted_col];
+ ec_config.bottoming_calibration_starter[row][adjusted_col] = false;
+ } else if (sw_value[row][adjusted_col] > ec_config.bottoming_reading[row][adjusted_col]) {
+ ec_config.bottoming_reading[row][adjusted_col] = sw_value[row][adjusted_col];
+ }
+ } else {
+ updated |= ec_update_key(¤t_matrix[row], row, adjusted_col, sw_value[row][adjusted_col]);
+ }
+ }
+ }
+ }
+
+ return ec_config.bottoming_calibration ? false : updated;
+}
+
+// Read the capacitive sensor value
+uint16_t ec_readkey_raw(uint8_t channel, uint8_t row, uint8_t col) {
+ uint16_t sw_value = 0;
+
+ // Select the multiplexer
+ select_amux_channel(channel, col);
+
+ // Set the row pin to low state to avoid ghosting
+ gpio_write_pin_low(row_pins[row]);
+
+ ATOMIC_BLOCK_FORCEON {
+ // Set the row pin to high state and have capacitor charge
+ charge_capacitor(row);
+ // Read the ADC value
+ sw_value = adc_read(adcMux);
+ }
+ // Discharge peak hold capacitor
+ discharge_capacitor();
+ // Waiting for the ghost capacitor to discharge fully
+ wait_us(DISCHARGE_TIME);
+
+ return sw_value;
+}
+
+// Update press/release state of key
+bool ec_update_key(matrix_row_t* current_row, uint8_t row, uint8_t col, uint16_t sw_value) {
+ bool current_state = (*current_row >> col) & 1;
+
+ // Real Time Noise Floor Calibration
+ if (sw_value < (ec_config.noise_floor[row][col] - NOISE_FLOOR_THRESHOLD)) {
+ uprintf("Noise Floor Change: %d, %d, %d\n", row, col, sw_value);
+ ec_config.noise_floor[row][col] = sw_value;
+ ec_config.rescaled_mode_0_actuation_threshold[row][col] = rescale(ec_config.mode_0_actuation_threshold, 0, 1023, ec_config.noise_floor[row][col], eeprom_ec_config.bottoming_reading[row][col]);
+ ec_config.rescaled_mode_0_release_threshold[row][col] = rescale(ec_config.mode_0_release_threshold, 0, 1023, ec_config.noise_floor[row][col], eeprom_ec_config.bottoming_reading[row][col]);
+ ec_config.rescaled_mode_1_initial_deadzone_offset[row][col] = rescale(ec_config.mode_1_initial_deadzone_offset, 0, 1023, ec_config.noise_floor[row][col], eeprom_ec_config.bottoming_reading[row][col]);
+ }
+
+ // Normal board-wide APC
+ if (ec_config.actuation_mode == 0) {
+ if (current_state && sw_value < ec_config.rescaled_mode_0_release_threshold[row][col]) {
+ *current_row &= ~(1 << col);
+ uprintf("Key released: %d, %d, %d\n", row, col, sw_value);
+ return true;
+ }
+ if ((!current_state) && sw_value > ec_config.rescaled_mode_0_actuation_threshold[row][col]) {
+ *current_row |= (1 << col);
+ uprintf("Key pressed: %d, %d, %d\n", row, col, sw_value);
+ return true;
+ }
+ }
+ // Rapid Trigger
+ else if (ec_config.actuation_mode == 1) {
+ // Is key in active zone?
+ if (sw_value > ec_config.rescaled_mode_1_initial_deadzone_offset[row][col]) {
+ // Is key pressed while in active zone?
+ if (current_state) {
+ // Is the key still moving down?
+ if (sw_value > ec_config.extremum[row][col]) {
+ ec_config.extremum[row][col] = sw_value;
+ uprintf("Key pressed: %d, %d, %d\n", row, col, sw_value);
+ }
+ // Has key moved up enough to be released?
+ else if (sw_value < ec_config.extremum[row][col] - ec_config.mode_1_release_offset) {
+ ec_config.extremum[row][col] = sw_value;
+ *current_row &= ~(1 << col);
+ uprintf("Key released: %d, %d, %d\n", row, col, sw_value);
+ return true;
+ }
+ }
+ // Key is not pressed while in active zone
+ else {
+ // Is the key still moving up?
+ if (sw_value < ec_config.extremum[row][col]) {
+ ec_config.extremum[row][col] = sw_value;
+ }
+ // Has key moved down enough to be pressed?
+ else if (sw_value > ec_config.extremum[row][col] + ec_config.mode_1_actuation_offset) {
+ ec_config.extremum[row][col] = sw_value;
+ *current_row |= (1 << col);
+ uprintf("Key pressed: %d, %d, %d\n", row, col, sw_value);
+ return true;
+ }
+ }
+ }
+ // Key is not in active zone
+ else {
+ // Check to avoid key being stuck in pressed state near the active zone threshold
+ if (sw_value < ec_config.extremum[row][col]) {
+ ec_config.extremum[row][col] = sw_value;
+ *current_row &= ~(1 << col);
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+// Print the matrix values
+void ec_print_matrix(void) {
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ for (uint8_t col = 0; col < MATRIX_COLS - 1; col++) {
+ uprintf("%4d,", sw_value[row][col]);
+ }
+ uprintf("%4d\n", sw_value[row][MATRIX_COLS - 1]);
+ }
+ print("\n");
+}
+
+// Rescale the value to a different range
+uint16_t rescale(uint16_t x, uint16_t in_min, uint16_t in_max, uint16_t out_min, uint16_t out_max) {
+ return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
+}
diff --git a/keyboards/cipulot/ec_980c/ec_switch_matrix.h b/keyboards/cipulot/ec_980c/ec_switch_matrix.h
new file mode 100644
index 00000000000..8a75b5de5fb
--- /dev/null
+++ b/keyboards/cipulot/ec_980c/ec_switch_matrix.h
@@ -0,0 +1,83 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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
+#include
+#include "matrix.h"
+#include "eeconfig.h"
+#include "util.h"
+
+typedef struct _indicator_config_t {
+ uint8_t h;
+ uint8_t s;
+ uint8_t v;
+ bool enabled;
+} indicator_config;
+
+typedef struct PACKED {
+ indicator_config num;
+ indicator_config caps;
+ indicator_config scroll;
+ uint8_t actuation_mode; // 0: normal board-wide APC, 1: Rapid trigger from specific board-wide actuation point, 2: Rapid trigger from resting point
+ uint16_t mode_0_actuation_threshold; // threshold for key press in mode 0
+ uint16_t mode_0_release_threshold; // threshold for key release in mode 0
+ uint16_t mode_1_initial_deadzone_offset; // threshold for key press in mode 1
+ uint8_t mode_1_actuation_offset; // offset for key press in mode 1 and 2 (1-255)
+ uint8_t mode_1_release_offset; // offset for key release in mode 1 and 2 (1-255)
+ uint16_t bottoming_reading[MATRIX_ROWS][MATRIX_COLS]; // bottoming reading
+} eeprom_ec_config_t;
+
+typedef struct {
+ uint8_t actuation_mode; // 0: normal board-wide APC, 1: Rapid trigger from specific board-wide actuation point (it can be very near that baseline noise and be "full travel")
+ uint16_t mode_0_actuation_threshold; // threshold for key press in mode 0
+ uint16_t mode_0_release_threshold; // threshold for key release in mode 0
+ uint16_t mode_1_initial_deadzone_offset; // threshold for key press in mode 1 (initial deadzone)
+ uint16_t rescaled_mode_0_actuation_threshold[MATRIX_ROWS][MATRIX_COLS]; // threshold for key press in mode 0 rescaled to actual scale
+ uint16_t rescaled_mode_0_release_threshold[MATRIX_ROWS][MATRIX_COLS]; // threshold for key release in mode 0 rescaled to actual scale
+ uint16_t rescaled_mode_1_initial_deadzone_offset[MATRIX_ROWS][MATRIX_COLS]; // threshold for key press in mode 1 (initial deadzone) rescaled to actual scale
+ uint8_t mode_1_actuation_offset; // offset for key press in mode 1 (1-255)
+ uint8_t mode_1_release_offset; // offset for key release in mode 1 (1-255)
+ uint16_t extremum[MATRIX_ROWS][MATRIX_COLS]; // extremum values for mode 1
+ uint16_t noise_floor[MATRIX_ROWS][MATRIX_COLS]; // noise floor detected during startup
+ bool bottoming_calibration; // calibration mode for bottoming out values (true: calibration mode, false: normal mode)
+ bool bottoming_calibration_starter[MATRIX_ROWS][MATRIX_COLS]; // calibration mode for bottoming out values (true: calibration mode, false: normal mode)
+ uint16_t bottoming_reading[MATRIX_ROWS][MATRIX_COLS]; // bottoming reading
+} ec_config_t;
+
+// Check if the size of the reserved persistent memory is the same as the size of struct eeprom_ec_config_t
+_Static_assert(sizeof(eeprom_ec_config_t) == EECONFIG_KB_DATA_SIZE, "Mismatch in keyboard EECONFIG stored data");
+
+extern eeprom_ec_config_t eeprom_ec_config;
+
+extern ec_config_t ec_config;
+
+void init_row(void);
+void init_amux(void);
+void select_amux_channel(uint8_t channel, uint8_t col);
+void disable_unused_amux(uint8_t channel);
+void discharge_capacitor(void);
+void charge_capacitor(uint8_t row);
+
+int ec_init(void);
+void ec_noise_floor(void);
+bool ec_matrix_scan(matrix_row_t current_matrix[]);
+uint16_t ec_readkey_raw(uint8_t channel, uint8_t row, uint8_t col);
+bool ec_update_key(matrix_row_t* current_row, uint8_t row, uint8_t col, uint16_t sw_value);
+void ec_print_matrix(void);
+
+uint16_t rescale(uint16_t x, uint16_t in_min, uint16_t in_max, uint16_t out_min, uint16_t out_max);
diff --git a/keyboards/cipulot/ec_980c/halconf.h b/keyboards/cipulot/ec_980c/halconf.h
new file mode 100644
index 00000000000..24de0954858
--- /dev/null
+++ b/keyboards/cipulot/ec_980c/halconf.h
@@ -0,0 +1,23 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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_ADC TRUE
+#define HAL_USE_PWM TRUE
+#define HAL_USE_PAL TRUE
+
+#include_next
diff --git a/keyboards/cipulot/ec_980c/info.json b/keyboards/cipulot/ec_980c/info.json
new file mode 100644
index 00000000000..6d3cb22719c
--- /dev/null
+++ b/keyboards/cipulot/ec_980c/info.json
@@ -0,0 +1,170 @@
+{
+ "manufacturer": "Cipulot",
+ "keyboard_name": "EC 980C",
+ "maintainer": "Cipulot",
+ "bootloader": "stm32-dfu",
+ "build": {
+ "lto": true
+ },
+ "diode_direction": "COL2ROW",
+ "eeprom": {
+ "wear_leveling": {
+ "backing_size": 4096
+ }
+ },
+ "features": {
+ "bootmagic": false,
+ "console": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgb_matrix": true
+ },
+ "processor": "STM32F411",
+ "qmk": {
+ "locking": {
+ "enabled": true,
+ "resync": true
+ }
+ },
+ "rgb_matrix": {
+ "animations": {
+ "breathing": true,
+ "cycle_left_right": true,
+ "solid_color": true
+ },
+ "driver": "ws2812",
+ "layout": [
+ {"matrix": [0, 15], "x": 16.25, "y": 1, "flags": 4},
+ {"matrix": [0, 16], "x": 17.25, "y": 1, "flags": 4},
+ {"matrix": [0, 17], "x": 18.25, "y": 1, "flags": 4}
+ ],
+ "led_count": 3,
+ "max_brightness": 255
+ },
+ "usb": {
+ "device_version": "0.0.1",
+ "pid": "0x6BBE",
+ "shared_endpoint": {
+ "keyboard": true
+ },
+ "vid": "0x6369"
+ },
+ "ws2812": {
+ "driver": "pwm",
+ "pin": "B15"
+ },
+ "layouts": {
+ "LAYOUT": {
+ "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.5, "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.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], "x": 13, "y": 1.5},
+ {"matrix": [1, 14], "x": 14, "y": 1.5},
+ {"matrix": [1, 15], "x": 15.5, "y": 1.5},
+ {"matrix": [1, 16], "x": 16.5, "y": 1.5},
+ {"matrix": [1, 17], "x": 17.5, "y": 1.5},
+ {"matrix": [1, 18], "x": 18.5, "y": 1.5},
+ {"matrix": [2, 0], "x": 0, "y": 2.5, "w": 1.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], "x": 13.5, "y": 2.5, "w": 0.75},
+ {"matrix": [2, 14], "x": 14.25, "y": 2.5, "w": 0.75},
+ {"matrix": [2, 15], "x": 15.5, "y": 2.5},
+ {"matrix": [2, 16], "x": 16.5, "y": 2.5},
+ {"matrix": [2, 17], "x": 17.5, "y": 2.5},
+ {"matrix": [2, 18], "x": 18.5, "y": 2.5},
+ {"matrix": [3, 0], "x": 0, "y": 3.5, "w": 1.75},
+ {"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], "x": 12.75, "y": 3.5},
+ {"matrix": [3, 13], "x": 13.75, "y": 3.5, "w": 1.25},
+ {"matrix": [3, 15], "x": 15.5, "y": 3.5},
+ {"matrix": [3, 16], "x": 16.5, "y": 3.5},
+ {"matrix": [3, 17], "x": 17.5, "y": 3.5},
+ {"matrix": [3, 18], "x": 18.5, "y": 3.5},
+ {"matrix": [4, 0], "x": 0, "y": 4.5, "w": 1.25},
+ {"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], "x": 12.25, "y": 4.5, "w": 1.75},
+ {"matrix": [4, 14], "x": 14.25, "y": 4.75},
+ {"matrix": [4, 15], "x": 15.5, "y": 4.5},
+ {"matrix": [4, 16], "x": 16.5, "y": 4.5},
+ {"matrix": [4, 17], "x": 17.5, "y": 4.5},
+ {"matrix": [4, 18], "x": 18.5, "y": 4.5},
+ {"matrix": [5, 0], "x": 0, "y": 5.5, "w": 1.25},
+ {"matrix": [5, 1], "x": 1.25, "y": 5.5},
+ {"matrix": [5, 2], "x": 2.25, "y": 5.5, "w": 1.25},
+ {"matrix": [5, 3], "x": 3.5, "y": 5.5},
+ {"matrix": [5, 5], "x": 4.5, "y": 5.5, "w": 2.5},
+ {"matrix": [5, 6], "x": 7, "y": 5.5, "w": 1.25},
+ {"matrix": [5, 8], "x": 8.25, "y": 5.5, "w": 1.25},
+ {"matrix": [5, 9], "x": 9.5, "y": 5.5, "w": 1.25},
+ {"matrix": [5, 10], "x": 10.75, "y": 5.5},
+ {"matrix": [5, 11], "x": 11.75, "y": 5.5, "w": 1.25},
+ {"matrix": [5, 13], "x": 13.25, "y": 5.75},
+ {"matrix": [5, 14], "x": 14.25, "y": 5.75},
+ {"matrix": [5, 15], "x": 15.25, "y": 5.75},
+ {"matrix": [5, 16], "x": 16.5, "y": 5.5},
+ {"matrix": [5, 17], "x": 17.5, "y": 5.5},
+ {"matrix": [5, 18], "x": 18.5, "y": 5.5}
+ ]
+ }
+ }
+}
diff --git a/keyboards/cipulot/ec_980c/keymaps/default/keymap.c b/keyboards/cipulot/ec_980c/keymaps/default/keymap.c
new file mode 100644
index 00000000000..c60db783528
--- /dev/null
+++ b/keyboards/cipulot/ec_980c/keymaps/default/keymap.c
@@ -0,0 +1,48 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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
+
+#include "keymap_japanese.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ // clang-format off
+ [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_INS, KC_PGUP, KC_PGDN,
+ 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, JP_YEN, 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_ENT, KC_P7, KC_P8, KC_P9, KC_PPLS,
+ 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_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_SPC, _______, KC_RALT, KC_RCTL, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT, KC_P0, KC_PDOT, KC_PENT
+ ),
+ [1] = LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ KC_CAPS, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, MO(2), _______, _______, _______, _______, _______, _______, _______
+ ),
+ [2] = LAYOUT(
+ QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+ // clang-format on
+};
diff --git a/keyboards/cipulot/ec_980c/keymaps/via/keymap.c b/keyboards/cipulot/ec_980c/keymaps/via/keymap.c
new file mode 100644
index 00000000000..c60db783528
--- /dev/null
+++ b/keyboards/cipulot/ec_980c/keymaps/via/keymap.c
@@ -0,0 +1,48 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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
+
+#include "keymap_japanese.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ // clang-format off
+ [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_INS, KC_PGUP, KC_PGDN,
+ 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, JP_YEN, 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_ENT, KC_P7, KC_P8, KC_P9, KC_PPLS,
+ 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_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_SPC, _______, KC_RALT, KC_RCTL, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT, KC_P0, KC_PDOT, KC_PENT
+ ),
+ [1] = LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ KC_CAPS, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, MO(2), _______, _______, _______, _______, _______, _______, _______
+ ),
+ [2] = LAYOUT(
+ QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+ // clang-format on
+};
diff --git a/keyboards/cipulot/ec_980c/keymaps/via/rules.mk b/keyboards/cipulot/ec_980c/keymaps/via/rules.mk
new file mode 100644
index 00000000000..b870b6349c0
--- /dev/null
+++ b/keyboards/cipulot/ec_980c/keymaps/via/rules.mk
@@ -0,0 +1,3 @@
+VIA_ENABLE = yes
+
+SRC += via_ec_indicators.c
diff --git a/keyboards/cipulot/ec_980c/keymaps/via/via_ec_indicators.c b/keyboards/cipulot/ec_980c/keymaps/via/via_ec_indicators.c
new file mode 100644
index 00000000000..f885e794357
--- /dev/null
+++ b/keyboards/cipulot/ec_980c/keymaps/via/via_ec_indicators.c
@@ -0,0 +1,499 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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 "keyboards/cipulot/common/eeprom_tools.h"
+#include "ec_switch_matrix.h"
+#include "action.h"
+#include "print.h"
+#include "via.h"
+
+#ifdef VIA_ENABLE
+
+void ec_rescale_values(uint8_t item);
+void ec_save_threshold_data(uint8_t option);
+void ec_save_bottoming_reading(void);
+void ec_show_calibration_data(void);
+void ec_clear_bottoming_calibration_data(void);
+
+// Declaring enums for VIA config menu
+enum via_enums {
+ // clang-format off
+ id_num_indicator_enabled = 1,
+ id_num_indicator_brightness = 2,
+ id_num_indicator_color = 3,
+ id_caps_indicator_enabled = 4,
+ id_caps_indicator_brightness = 5,
+ id_caps_indicator_color = 6,
+ id_scroll_indicator_enabled = 7,
+ id_scroll_indicator_brightness = 8,
+ id_scroll_indicator_color = 9,
+ id_actuation_mode = 10,
+ id_mode_0_actuation_threshold = 11,
+ id_mode_0_release_threshold = 12,
+ id_save_threshold_data = 13,
+ id_mode_1_initial_deadzone_offset = 14,
+ id_mode_1_actuation_offset = 15,
+ id_mode_1_release_offset = 16,
+ id_bottoming_calibration = 17,
+ id_noise_floor_calibration = 18,
+ id_show_calibration_data = 19,
+ id_clear_bottoming_calibration_data = 20
+ // clang-format on
+};
+
+// Handle the data received by the keyboard from the VIA menus
+void via_config_set_value(uint8_t *data) {
+ // data = [ value_id, value_data ]
+ uint8_t *value_id = &(data[0]);
+ uint8_t *value_data = &(data[1]);
+
+ switch (*value_id) {
+ case id_num_indicator_enabled: {
+ if (value_data[0] == 1) {
+ eeprom_ec_config.num.enabled = true;
+ uprintf("#########################\n");
+ uprintf("# Num indicator enabled #\n");
+ uprintf("#########################\n");
+ } else {
+ eeprom_ec_config.num.enabled = false;
+ uprintf("##########################\n");
+ uprintf("# Num indicator disabled #\n");
+ uprintf("##########################\n");
+ }
+ EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, num.enabled);
+ break;
+ }
+ case id_num_indicator_brightness: {
+ eeprom_ec_config.num.v = value_data[0];
+ uprintf("Num indicator brightness: %d\n", eeprom_ec_config.num.v);
+ EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, num.v);
+ break;
+ }
+ case id_num_indicator_color: {
+ eeprom_ec_config.num.h = value_data[0];
+ eeprom_ec_config.num.s = value_data[1];
+ uprintf("Num indicator color: %d, %d\n", eeprom_ec_config.num.h, eeprom_ec_config.num.s);
+ EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, num.h);
+ EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, num.s);
+ break;
+ }
+ case id_caps_indicator_enabled: {
+ if (value_data[0] == 1) {
+ eeprom_ec_config.caps.enabled = true;
+ uprintf("##########################\n");
+ uprintf("# Caps indicator enabled #\n");
+ uprintf("##########################\n");
+ } else {
+ eeprom_ec_config.caps.enabled = false;
+ uprintf("###########################\n");
+ uprintf("# Caps indicator disabled #\n");
+ uprintf("###########################\n");
+ }
+ EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, caps.enabled);
+ break;
+ }
+ case id_caps_indicator_brightness: {
+ eeprom_ec_config.caps.v = value_data[0];
+ uprintf("Caps indicator brightness: %d\n", eeprom_ec_config.caps.v);
+ EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, caps.v);
+ break;
+ }
+ case id_caps_indicator_color: {
+ eeprom_ec_config.caps.h = value_data[0];
+ eeprom_ec_config.caps.s = value_data[1];
+ uprintf("Caps indicator color: %d, %d\n", eeprom_ec_config.caps.h, eeprom_ec_config.caps.s);
+ EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, caps.h);
+ EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, caps.s);
+ break;
+ }
+ case id_scroll_indicator_enabled: {
+ if (value_data[0] == 1) {
+ eeprom_ec_config.scroll.enabled = true;
+ uprintf("############################\n");
+ uprintf("# Scroll indicator enabled #\n");
+ uprintf("############################\n");
+ } else {
+ eeprom_ec_config.scroll.enabled = false;
+ uprintf("#############################\n");
+ uprintf("# Scroll indicator disabled #\n");
+ uprintf("#############################\n");
+ }
+ EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, scroll.enabled);
+ break;
+ }
+ case id_scroll_indicator_brightness: {
+ eeprom_ec_config.scroll.v = value_data[0];
+ uprintf("Scroll indicator brightness: %d\n", eeprom_ec_config.scroll.v);
+ EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, scroll.v);
+ break;
+ }
+ case id_scroll_indicator_color: {
+ eeprom_ec_config.scroll.h = value_data[0];
+ eeprom_ec_config.scroll.s = value_data[1];
+ uprintf("Scroll indicator color: %d, %d\n", eeprom_ec_config.scroll.h, eeprom_ec_config.scroll.s);
+ EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, scroll.h);
+ EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, scroll.s);
+ break;
+ }
+ case id_actuation_mode: {
+ eeprom_ec_config.actuation_mode = value_data[0];
+ ec_config.actuation_mode = eeprom_ec_config.actuation_mode;
+ if (ec_config.actuation_mode == 0) {
+ uprintf("#########################\n");
+ uprintf("# Actuation Mode: APC #\n");
+ uprintf("#########################\n");
+ } else if (ec_config.actuation_mode == 1) {
+ uprintf("#################################\n");
+ uprintf("# Actuation Mode: Rapid Trigger #\n");
+ uprintf("#################################\n");
+ }
+ EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, actuation_mode);
+ break;
+ }
+ case id_mode_0_actuation_threshold: {
+ ec_config.mode_0_actuation_threshold = value_data[1] | (value_data[0] << 8);
+ uprintf("APC Mode Actuation Threshold: %d\n", ec_config.mode_0_actuation_threshold);
+ break;
+ }
+ case id_mode_0_release_threshold: {
+ ec_config.mode_0_release_threshold = value_data[1] | (value_data[0] << 8);
+ uprintf("APC Mode Release Threshold: %d\n", ec_config.mode_0_release_threshold);
+ break;
+ }
+ case id_mode_1_initial_deadzone_offset: {
+ ec_config.mode_1_initial_deadzone_offset = value_data[1] | (value_data[0] << 8);
+ uprintf("Rapid Trigger Mode Initial Deadzone Offset: %d\n", ec_config.mode_1_initial_deadzone_offset);
+ break;
+ }
+ case id_mode_1_actuation_offset: {
+ ec_config.mode_1_actuation_offset = value_data[0];
+ uprintf("Rapid Trigger Mode Actuation Offset: %d\n", ec_config.mode_1_actuation_offset);
+ break;
+ }
+ case id_mode_1_release_offset: {
+ ec_config.mode_1_release_offset = value_data[0];
+ uprintf("Rapid Trigger Mode Release Offset: %d\n", ec_config.mode_1_release_offset);
+ break;
+ }
+ case id_bottoming_calibration: {
+ if (value_data[0] == 1) {
+ ec_config.bottoming_calibration = true;
+ uprintf("##############################\n");
+ uprintf("# Bottoming calibration mode #\n");
+ uprintf("##############################\n");
+ } else {
+ ec_config.bottoming_calibration = false;
+ ec_save_bottoming_reading();
+ uprintf("## Bottoming calibration done ##\n");
+ ec_show_calibration_data();
+ }
+ break;
+ }
+ case id_save_threshold_data: {
+ ec_save_threshold_data(value_data[0]);
+ break;
+ }
+ case id_noise_floor_calibration: {
+ if (value_data[0] == 0) {
+ ec_noise_floor();
+ ec_rescale_values(0);
+ ec_rescale_values(1);
+ ec_rescale_values(2);
+ uprintf("#############################\n");
+ uprintf("# Noise floor data acquired #\n");
+ uprintf("#############################\n");
+ break;
+ }
+ }
+ case id_show_calibration_data: {
+ if (value_data[0] == 0) {
+ ec_show_calibration_data();
+ break;
+ }
+ }
+ case id_clear_bottoming_calibration_data: {
+ if (value_data[0] == 0) {
+ ec_clear_bottoming_calibration_data();
+ }
+ }
+ default: {
+ // Unhandled value.
+ break;
+ }
+ }
+}
+
+// Handle the data sent by the keyboard to the VIA menus
+void via_config_get_value(uint8_t *data) {
+ // data = [ value_id, value_data ]
+ uint8_t *value_id = &(data[0]);
+ uint8_t *value_data = &(data[1]);
+
+ switch (*value_id) {
+ case id_num_indicator_enabled: {
+ value_data[0] = eeprom_ec_config.num.enabled;
+ break;
+ }
+ case id_num_indicator_brightness: {
+ value_data[0] = eeprom_ec_config.num.v;
+ break;
+ }
+ case id_num_indicator_color: {
+ value_data[0] = eeprom_ec_config.num.h;
+ value_data[1] = eeprom_ec_config.num.s;
+ break;
+ }
+ case id_caps_indicator_enabled: {
+ value_data[0] = eeprom_ec_config.caps.enabled;
+ break;
+ }
+ case id_caps_indicator_brightness: {
+ value_data[0] = eeprom_ec_config.caps.v;
+ break;
+ }
+ case id_caps_indicator_color: {
+ value_data[0] = eeprom_ec_config.caps.h;
+ value_data[1] = eeprom_ec_config.caps.s;
+ break;
+ }
+ case id_scroll_indicator_enabled: {
+ value_data[0] = eeprom_ec_config.scroll.enabled;
+ break;
+ }
+ case id_scroll_indicator_brightness: {
+ value_data[0] = eeprom_ec_config.scroll.v;
+ break;
+ }
+ case id_scroll_indicator_color: {
+ value_data[0] = eeprom_ec_config.scroll.h;
+ value_data[1] = eeprom_ec_config.scroll.s;
+ break;
+ }
+ case id_actuation_mode: {
+ value_data[0] = eeprom_ec_config.actuation_mode;
+ break;
+ }
+ case id_mode_0_actuation_threshold: {
+ value_data[0] = eeprom_ec_config.mode_0_actuation_threshold >> 8;
+ value_data[1] = eeprom_ec_config.mode_0_actuation_threshold & 0xFF;
+ break;
+ }
+ case id_mode_0_release_threshold: {
+ value_data[0] = eeprom_ec_config.mode_0_release_threshold >> 8;
+ value_data[1] = eeprom_ec_config.mode_0_release_threshold & 0xFF;
+ break;
+ }
+ case id_mode_1_initial_deadzone_offset: {
+ value_data[0] = eeprom_ec_config.mode_1_initial_deadzone_offset >> 8;
+ value_data[1] = eeprom_ec_config.mode_1_initial_deadzone_offset & 0xFF;
+ break;
+ }
+ case id_mode_1_actuation_offset: {
+ value_data[0] = eeprom_ec_config.mode_1_actuation_offset;
+ break;
+ }
+ case id_mode_1_release_offset: {
+ value_data[0] = eeprom_ec_config.mode_1_release_offset;
+ break;
+ }
+ default: {
+ // Unhandled value.
+ break;
+ }
+ }
+}
+
+// Handle the commands sent and received by the keyboard with VIA
+void via_custom_value_command_kb(uint8_t *data, uint8_t length) {
+ // data = [ command_id, channel_id, value_id, value_data ]
+ uint8_t *command_id = &(data[0]);
+ uint8_t *channel_id = &(data[1]);
+ uint8_t *value_id_and_data = &(data[2]);
+
+ if (*channel_id == id_custom_channel) {
+ switch (*command_id) {
+ case id_custom_set_value: {
+ via_config_set_value(value_id_and_data);
+ break;
+ }
+ case id_custom_get_value: {
+ via_config_get_value(value_id_and_data);
+ break;
+ }
+ case id_custom_save: {
+ // Bypass the save function in favor of pinpointed saves
+ break;
+ }
+ default: {
+ // Unhandled message.
+ *command_id = id_unhandled;
+ break;
+ }
+ }
+ return;
+ }
+
+ *command_id = id_unhandled;
+}
+
+// Rescale the values received by VIA to fit the new range
+void ec_rescale_values(uint8_t item) {
+ switch (item) {
+ // Rescale the APC mode actuation thresholds
+ case 0:
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ for (uint8_t col = 0; col < MATRIX_COLS; col++) {
+ ec_config.rescaled_mode_0_actuation_threshold[row][col] = rescale(ec_config.mode_0_actuation_threshold, 0, 1023, ec_config.noise_floor[row][col], eeprom_ec_config.bottoming_reading[row][col]);
+ }
+ }
+ break;
+ // Rescale the APC mode release thresholds
+ case 1:
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ for (uint8_t col = 0; col < MATRIX_COLS; col++) {
+ ec_config.rescaled_mode_0_release_threshold[row][col] = rescale(ec_config.mode_0_release_threshold, 0, 1023, ec_config.noise_floor[row][col], eeprom_ec_config.bottoming_reading[row][col]);
+ }
+ }
+ break;
+ // Rescale the Rapid Trigger mode initial deadzone offsets
+ case 2:
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ for (uint8_t col = 0; col < MATRIX_COLS; col++) {
+ ec_config.rescaled_mode_1_initial_deadzone_offset[row][col] = rescale(ec_config.mode_1_initial_deadzone_offset, 0, 1023, ec_config.noise_floor[row][col], eeprom_ec_config.bottoming_reading[row][col]);
+ }
+ }
+ break;
+
+ default:
+ // Unhandled item.
+ break;
+ }
+}
+
+void ec_save_threshold_data(uint8_t option) {
+ // Save APC mode thresholds and rescale them for runtime usage
+ if (option == 0) {
+ eeprom_ec_config.mode_0_actuation_threshold = ec_config.mode_0_actuation_threshold;
+ eeprom_ec_config.mode_0_release_threshold = ec_config.mode_0_release_threshold;
+ ec_rescale_values(0);
+ ec_rescale_values(1);
+ }
+ // Save Rapid Trigger mode thresholds and rescale them for runtime usage
+ else if (option == 1) {
+ eeprom_ec_config.mode_1_initial_deadzone_offset = ec_config.mode_1_initial_deadzone_offset;
+ eeprom_ec_config.mode_1_actuation_offset = ec_config.mode_1_actuation_offset;
+ eeprom_ec_config.mode_1_release_offset = ec_config.mode_1_release_offset;
+ ec_rescale_values(2);
+ }
+ eeconfig_update_kb_datablock(&eeprom_ec_config);
+ uprintf("####################################\n");
+ uprintf("# New thresholds applied and saved #\n");
+ uprintf("####################################\n");
+}
+
+// Save the bottoming reading
+void ec_save_bottoming_reading(void) {
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ for (uint8_t col = 0; col < MATRIX_COLS; col++) {
+ // If the bottom reading doesn't go over the noise floor by BOTTOMING_CALIBRATION_THRESHOLD, it is likely that:
+ // 1. The key is not actually in the matrix
+ // 2. The key is on an alternative layout, therefore not being pressed
+ // 3. The key in in the current layout but not being pressed
+ if (ec_config.bottoming_reading[row][col] < (ec_config.noise_floor[row][col] + BOTTOMING_CALIBRATION_THRESHOLD)) {
+ eeprom_ec_config.bottoming_reading[row][col] = 1023;
+ } else {
+ eeprom_ec_config.bottoming_reading[row][col] = ec_config.bottoming_reading[row][col];
+ }
+ }
+ }
+ // Rescale the values to fit the new range for runtime usage
+ ec_rescale_values(0);
+ ec_rescale_values(1);
+ ec_rescale_values(2);
+ eeconfig_update_kb_datablock(&eeprom_ec_config);
+}
+
+// Show the calibration data
+void ec_show_calibration_data(void) {
+ uprintf("\n###############\n");
+ uprintf("# Noise Floor #\n");
+ uprintf("###############\n");
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ for (uint8_t col = 0; col < MATRIX_COLS - 1; col++) {
+ uprintf("%4d,", ec_config.noise_floor[row][col]);
+ }
+ uprintf("%4d\n", ec_config.noise_floor[row][MATRIX_COLS - 1]);
+ }
+
+ uprintf("\n######################\n");
+ uprintf("# Bottoming Readings #\n");
+ uprintf("######################\n");
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ for (uint8_t col = 0; col < MATRIX_COLS - 1; col++) {
+ uprintf("%4d,", eeprom_ec_config.bottoming_reading[row][col]);
+ }
+ uprintf("%4d\n", eeprom_ec_config.bottoming_reading[row][MATRIX_COLS - 1]);
+ }
+
+ uprintf("\n######################################\n");
+ uprintf("# Rescaled APC Mode Actuation Points #\n");
+ uprintf("######################################\n");
+ uprintf("Original APC Mode Actuation Point: %4d\n", ec_config.mode_0_actuation_threshold);
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ for (uint8_t col = 0; col < MATRIX_COLS - 1; col++) {
+ uprintf("%4d,", ec_config.rescaled_mode_0_actuation_threshold[row][col]);
+ }
+ uprintf("%4d\n", ec_config.rescaled_mode_0_actuation_threshold[row][MATRIX_COLS - 1]);
+ }
+
+ uprintf("\n######################################\n");
+ uprintf("# Rescaled APC Mode Release Points #\n");
+ uprintf("######################################\n");
+ uprintf("Original APC Mode Release Point: %4d\n", ec_config.mode_0_release_threshold);
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ for (uint8_t col = 0; col < MATRIX_COLS - 1; col++) {
+ uprintf("%4d,", ec_config.rescaled_mode_0_release_threshold[row][col]);
+ }
+ uprintf("%4d\n", ec_config.rescaled_mode_0_release_threshold[row][MATRIX_COLS - 1]);
+ }
+
+ uprintf("\n#######################################################\n");
+ uprintf("# Rescaled Rapid Trigger Mode Initial Deadzone Offset #\n");
+ uprintf("#######################################################\n");
+ uprintf("Original Rapid Trigger Mode Initial Deadzone Offset: %4d\n", ec_config.mode_1_initial_deadzone_offset);
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ for (uint8_t col = 0; col < MATRIX_COLS - 1; col++) {
+ uprintf("%4d,", ec_config.rescaled_mode_1_initial_deadzone_offset[row][col]);
+ }
+ uprintf("%4d\n", ec_config.rescaled_mode_1_initial_deadzone_offset[row][MATRIX_COLS - 1]);
+ }
+ print("\n");
+}
+
+// Clear the calibration data
+void ec_clear_bottoming_calibration_data(void) {
+ // Clear the EEPROM data
+ eeconfig_init_kb();
+
+ // Reset the runtime values to the EEPROM values
+ keyboard_post_init_kb();
+
+ uprintf("######################################\n");
+ uprintf("# Bottoming calibration data cleared #\n");
+ uprintf("######################################\n");
+}
+
+#endif // VIA_ENABLE
diff --git a/keyboards/cipulot/ec_980c/matrix.c b/keyboards/cipulot/ec_980c/matrix.c
new file mode 100644
index 00000000000..cfa2efe0506
--- /dev/null
+++ b/keyboards/cipulot/ec_980c/matrix.c
@@ -0,0 +1,42 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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 "ec_switch_matrix.h"
+#include "matrix.h"
+
+extern matrix_row_t raw_matrix[MATRIX_ROWS]; // raw values
+extern matrix_row_t matrix[MATRIX_ROWS]; // debounced values
+
+// Custom matrix init function
+void matrix_init_custom(void) {
+ // Initialize EC
+ ec_init();
+
+ // Get the noise floor at boot
+ ec_noise_floor();
+}
+
+// Custom matrix scan function
+bool matrix_scan_custom(matrix_row_t current_matrix[]) {
+ bool updated = ec_matrix_scan(current_matrix);
+
+ return updated;
+}
+
+// Bootmagic overriden to avoid conflicts with EC
+void bootmagic_scan(void) {
+ ;
+}
diff --git a/keyboards/cipulot/ec_980c/mcuconf.h b/keyboards/cipulot/ec_980c/mcuconf.h
new file mode 100644
index 00000000000..5f9ecca48dd
--- /dev/null
+++ b/keyboards/cipulot/ec_980c/mcuconf.h
@@ -0,0 +1,28 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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 STM32_ADC_USE_ADC1
+#define STM32_ADC_USE_ADC1 TRUE
+
+#undef STM32_PWM_USE_ADVANCED
+#define STM32_PWM_USE_ADVANCED TRUE
+
+#undef STM32_PWM_USE_TIM1
+#define STM32_PWM_USE_TIM1 TRUE
diff --git a/keyboards/cipulot/ec_980c/readme.md b/keyboards/cipulot/ec_980c/readme.md
new file mode 100644
index 00000000000..20be2d4928b
--- /dev/null
+++ b/keyboards/cipulot/ec_980c/readme.md
@@ -0,0 +1,26 @@
+# EC980C
+
+
+
+Replacement PCB for the Leopold FC980C.
+
+* Keyboard Maintainer: [cipulot](https://github.com/cipulot)
+* Hardware Supported: EC980C PCB
+* Hardware Availability: TBD
+
+Make example for this keyboard (after setting up your build environment):
+
+ make cipulot/ec_980c:default
+
+Flashing example for this keyboard:
+
+ make cipulot/ec_980c: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:
+
+* **Physical reset**: Long short the exposed pads on the top of the PCB
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
diff --git a/keyboards/cipulot/ec_980c/rules.mk b/keyboards/cipulot/ec_980c/rules.mk
new file mode 100644
index 00000000000..1ff311f102d
--- /dev/null
+++ b/keyboards/cipulot/ec_980c/rules.mk
@@ -0,0 +1,4 @@
+CUSTOM_MATRIX = lite
+ANALOG_DRIVER_REQUIRED = yes
+SRC += matrix.c ec_switch_matrix.c
+OPT = 2
diff --git a/keyboards/cipulot/ec_alveus/1_0_0/config.h b/keyboards/cipulot/ec_alveus/1_0_0/config.h
index ea43ba348d5..ab51289c023 100644
--- a/keyboards/cipulot/ec_alveus/1_0_0/config.h
+++ b/keyboards/cipulot/ec_alveus/1_0_0/config.h
@@ -63,9 +63,3 @@
// #define DEBUG_MATRIX_SCAN_RATE
#define EECONFIG_KB_DATA_SIZE 169
-
-/* 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
diff --git a/keyboards/cipulot/ec_alveus/1_0_0/info.json b/keyboards/cipulot/ec_alveus/1_0_0/info.json
index 4652166cc5e..cffd3ade586 100644
--- a/keyboards/cipulot/ec_alveus/1_0_0/info.json
+++ b/keyboards/cipulot/ec_alveus/1_0_0/info.json
@@ -6,6 +6,12 @@
"build": {
"lto": true
},
+ "qmk": {
+ "locking": {
+ "enabled": true,
+ "resync": true
+ }
+ },
"diode_direction": "COL2ROW",
"features": {
"bootmagic": false,
diff --git a/keyboards/cipulot/ec_alveus/1_0_0/rules.mk b/keyboards/cipulot/ec_alveus/1_0_0/rules.mk
index 70494b635f6..ce525670a68 100644
--- a/keyboards/cipulot/ec_alveus/1_0_0/rules.mk
+++ b/keyboards/cipulot/ec_alveus/1_0_0/rules.mk
@@ -1,4 +1,5 @@
CUSTOM_MATRIX = lite
ANALOG_DRIVER_REQUIRED = yes
-SRC += keyboards/cipulot/common/matrix.c keyboards/cipulot/common/ec_board.c keyboards/cipulot/common/ec_switch_matrix.c
+VPATH += keyboards/cipulot/common
+SRC += matrix.c ec_board.c ec_switch_matrix.c
OPT = 3
diff --git a/keyboards/cipulot/ec_alveus/1_2_0/config.h b/keyboards/cipulot/ec_alveus/1_2_0/config.h
index ea43ba348d5..ab51289c023 100644
--- a/keyboards/cipulot/ec_alveus/1_2_0/config.h
+++ b/keyboards/cipulot/ec_alveus/1_2_0/config.h
@@ -63,9 +63,3 @@
// #define DEBUG_MATRIX_SCAN_RATE
#define EECONFIG_KB_DATA_SIZE 169
-
-/* 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
diff --git a/keyboards/cipulot/ec_alveus/1_2_0/info.json b/keyboards/cipulot/ec_alveus/1_2_0/info.json
index 8b63d02f770..da212f83411 100644
--- a/keyboards/cipulot/ec_alveus/1_2_0/info.json
+++ b/keyboards/cipulot/ec_alveus/1_2_0/info.json
@@ -6,6 +6,12 @@
"build": {
"lto": true
},
+ "qmk": {
+ "locking": {
+ "enabled": true,
+ "resync": true
+ }
+ },
"diode_direction": "COL2ROW",
"features": {
"bootmagic": false,
diff --git a/keyboards/cipulot/ec_alveus/1_2_0/rules.mk b/keyboards/cipulot/ec_alveus/1_2_0/rules.mk
index 70494b635f6..ce525670a68 100644
--- a/keyboards/cipulot/ec_alveus/1_2_0/rules.mk
+++ b/keyboards/cipulot/ec_alveus/1_2_0/rules.mk
@@ -1,4 +1,5 @@
CUSTOM_MATRIX = lite
ANALOG_DRIVER_REQUIRED = yes
-SRC += keyboards/cipulot/common/matrix.c keyboards/cipulot/common/ec_board.c keyboards/cipulot/common/ec_switch_matrix.c
+VPATH += keyboards/cipulot/common
+SRC += matrix.c ec_board.c ec_switch_matrix.c
OPT = 3
diff --git a/keyboards/cipulot/ec_dolice/config.h b/keyboards/cipulot/ec_dolice/config.h
new file mode 100644
index 00000000000..a5c56e79491
--- /dev/null
+++ b/keyboards/cipulot/ec_dolice/config.h
@@ -0,0 +1,66 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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 MATRIX_ROWS 5
+#define MATRIX_COLS 15
+
+#define MATRIX_ROW_PINS \
+ { B13, A8, B12, B14, B15 }
+
+#define AMUX_COUNT 2
+#define AMUX_MAX_COLS_COUNT 8
+
+#define AMUX_EN_PINS \
+ { B9, B8 }
+
+#define AMUX_SEL_PINS \
+ { B7, B6, B5 }
+
+#define AMUX_COL_CHANNELS_SIZES \
+ { 8, 7 }
+
+#define AMUX_0_COL_CHANNELS \
+ { 3, 0, 1, 2, 4, 6, 7, 5 }
+
+#define AMUX_1_COL_CHANNELS \
+ { 3, 0, 1, 2, 4, 6, 7 }
+
+#define AMUX_COL_CHANNELS AMUX_0_COL_CHANNELS, AMUX_1_COL_CHANNELS
+
+#define DISCHARGE_PIN A3
+#define ANALOG_PORT A2
+
+#define DEFAULT_ACTUATION_MODE 0
+#define DEFAULT_MODE_0_ACTUATION_LEVEL 550
+#define DEFAULT_MODE_0_RELEASE_LEVEL 500
+#define DEFAULT_MODE_1_INITIAL_DEADZONE_OFFSET DEFAULT_MODE_0_ACTUATION_LEVEL
+#define DEFAULT_MODE_1_ACTUATION_OFFSET 70
+#define DEFAULT_MODE_1_RELEASE_OFFSET 70
+#define DEFAULT_EXTREMUM 1023
+#define EXPECTED_NOISE_FLOOR 0
+#define NOISE_FLOOR_THRESHOLD 50
+#define BOTTOMING_CALIBRATION_THRESHOLD 100
+#define DEFAULT_NOISE_FLOOR_SAMPLING_COUNT 30
+#define DEFAULT_BOTTOMING_READING 1023
+#define DEFAULT_CALIBRATION_STARTER true
+
+#define DISCHARGE_TIME 10
+
+// #define DEBUG_MATRIX_SCAN_RATE
+
+#define EECONFIG_KB_DATA_SIZE 159
diff --git a/keyboards/cipulot/ec_dolice/halconf.h b/keyboards/cipulot/ec_dolice/halconf.h
new file mode 100644
index 00000000000..835d43b6a0a
--- /dev/null
+++ b/keyboards/cipulot/ec_dolice/halconf.h
@@ -0,0 +1,21 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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_ADC TRUE
+
+#include_next
diff --git a/keyboards/cipulot/ec_dolice/info.json b/keyboards/cipulot/ec_dolice/info.json
new file mode 100644
index 00000000000..e81422e2c54
--- /dev/null
+++ b/keyboards/cipulot/ec_dolice/info.json
@@ -0,0 +1,319 @@
+{
+ "manufacturer": "Cipulot",
+ "keyboard_name": "Dolice EC",
+ "maintainer": "Cipulot",
+ "bootloader": "stm32-dfu",
+ "build": {
+ "lto": true
+ },
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": false,
+ "console": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true
+ },
+ "indicators": {
+ "caps_lock": "B4",
+ "num_lock": "A15",
+ "scroll_lock": "B3",
+ "on_state": 0
+ },
+ "processor": "STM32F411",
+ "qmk": {
+ "locking": {
+ "enabled": true,
+ "resync": true
+ }
+ },
+ "usb": {
+ "device_version": "0.0.1",
+ "pid": "0x6BB9",
+ "shared_endpoint": {
+ "keyboard": true
+ },
+ "vid": "0x6369"
+ },
+ "layout_aliases": {
+ "LAYOUT_all": "LAYOUT_alice_split_bs"
+ },
+ "layouts": {
+ "LAYOUT_alice": {
+ "layout": [
+ {"matrix": [1, 0], "x": 0, "y": 0},
+ {"matrix": [0, 0], "x": 1.25, "y": 0},
+ {"matrix": [0, 1], "x": 2.25, "y": 0},
+ {"matrix": [0, 2], "x": 3.25, "y": 0},
+ {"matrix": [0, 3], "x": 4.25, "y": 0},
+ {"matrix": [0, 4], "x": 5.25, "y": 0},
+ {"matrix": [0, 5], "x": 6.25, "y": 0},
+ {"matrix": [0, 6], "x": 7.25, "y": 0},
+ {"matrix": [0, 7], "x": 10.25, "y": 0},
+ {"matrix": [0, 8], "x": 11.25, "y": 0},
+ {"matrix": [0, 9], "x": 12.25, "y": 0},
+ {"matrix": [0, 10], "x": 13.25, "y": 0},
+ {"matrix": [0, 11], "x": 14.25, "y": 0},
+ {"matrix": [0, 12], "x": 15.25, "y": 0},
+ {"matrix": [0, 14], "x": 16.25, "y": 0, "w": 2},
+ {"matrix": [2, 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": [3, 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, 1], "x": 1.25, "y": 3, "w": 2.25},
+ {"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": 9.5, "y": 3},
+ {"matrix": [3, 8], "x": 10.5, "y": 3},
+ {"matrix": [3, 9], "x": 11.5, "y": 3},
+ {"matrix": [3, 10], "x": 12.5, "y": 3},
+ {"matrix": [3, 11], "x": 13.5, "y": 3},
+ {"matrix": [3, 12], "x": 14.5, "y": 3},
+ {"matrix": [3, 13], "x": 15.5, "y": 3, "w": 1.75},
+ {"matrix": [3, 14], "x": 17.25, "y": 3},
+ {"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.5},
+ {"matrix": [4, 2], "x": 4.25, "y": 4, "w": 1.5},
+ {"matrix": [4, 5], "x": 5.75, "y": 4, "w": 2},
+ {"matrix": [4, 6], "x": 7.75, "y": 4, "w": 1.25},
+ {"matrix": [4, 8], "x": 9.5, "y": 4, "w": 2.75},
+ {"matrix": [4, 10], "x": 12.25, "y": 4, "w": 1.5},
+ {"matrix": [4, 14], "x": 16.75, "y": 4, "w": 1.5}
+ ]
+ },
+ "LAYOUT_alice_split_bs": {
+ "layout": [
+ {"matrix": [1, 0], "x": 0, "y": 0},
+ {"matrix": [0, 0], "x": 1.25, "y": 0},
+ {"matrix": [0, 1], "x": 2.25, "y": 0},
+ {"matrix": [0, 2], "x": 3.25, "y": 0},
+ {"matrix": [0, 3], "x": 4.25, "y": 0},
+ {"matrix": [0, 4], "x": 5.25, "y": 0},
+ {"matrix": [0, 5], "x": 6.25, "y": 0},
+ {"matrix": [0, 6], "x": 7.25, "y": 0},
+ {"matrix": [0, 7], "x": 10.25, "y": 0},
+ {"matrix": [0, 8], "x": 11.25, "y": 0},
+ {"matrix": [0, 9], "x": 12.25, "y": 0},
+ {"matrix": [0, 10], "x": 13.25, "y": 0},
+ {"matrix": [0, 11], "x": 14.25, "y": 0},
+ {"matrix": [0, 12], "x": 15.25, "y": 0},
+ {"matrix": [0, 13], "x": 16.25, "y": 0},
+ {"matrix": [0, 14], "x": 17.25, "y": 0},
+ {"matrix": [2, 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": [3, 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, 1], "x": 1.25, "y": 3, "w": 2.25},
+ {"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": 9.5, "y": 3},
+ {"matrix": [3, 8], "x": 10.5, "y": 3},
+ {"matrix": [3, 9], "x": 11.5, "y": 3},
+ {"matrix": [3, 10], "x": 12.5, "y": 3},
+ {"matrix": [3, 11], "x": 13.5, "y": 3},
+ {"matrix": [3, 12], "x": 14.5, "y": 3},
+ {"matrix": [3, 13], "x": 15.5, "y": 3, "w": 1.75},
+ {"matrix": [3, 14], "x": 17.25, "y": 3},
+ {"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.5},
+ {"matrix": [4, 2], "x": 4.25, "y": 4, "w": 1.5},
+ {"matrix": [4, 5], "x": 5.75, "y": 4, "w": 2},
+ {"matrix": [4, 6], "x": 7.75, "y": 4, "w": 1.25},
+ {"matrix": [4, 8], "x": 9.5, "y": 4, "w": 2.75},
+ {"matrix": [4, 10], "x": 12.25, "y": 4, "w": 1.5},
+ {"matrix": [4, 14], "x": 16.75, "y": 4, "w": 1.5}
+ ]
+ },
+ "LAYOUT_long_rshift": {
+ "layout": [
+ {"matrix": [1, 0], "x": 0, "y": 0},
+ {"matrix": [0, 0], "x": 1.25, "y": 0},
+ {"matrix": [0, 1], "x": 2.25, "y": 0},
+ {"matrix": [0, 2], "x": 3.25, "y": 0},
+ {"matrix": [0, 3], "x": 4.25, "y": 0},
+ {"matrix": [0, 4], "x": 5.25, "y": 0},
+ {"matrix": [0, 5], "x": 6.25, "y": 0},
+ {"matrix": [0, 6], "x": 7.25, "y": 0},
+ {"matrix": [0, 7], "x": 10.25, "y": 0},
+ {"matrix": [0, 8], "x": 11.25, "y": 0},
+ {"matrix": [0, 9], "x": 12.25, "y": 0},
+ {"matrix": [0, 10], "x": 13.25, "y": 0},
+ {"matrix": [0, 11], "x": 14.25, "y": 0},
+ {"matrix": [0, 12], "x": 15.25, "y": 0},
+ {"matrix": [0, 14], "x": 16.25, "y": 0, "w": 2},
+ {"matrix": [2, 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": [3, 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, 1], "x": 1.25, "y": 3, "w": 2.25},
+ {"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": 9.5, "y": 3},
+ {"matrix": [3, 8], "x": 10.5, "y": 3},
+ {"matrix": [3, 9], "x": 11.5, "y": 3},
+ {"matrix": [3, 10], "x": 12.5, "y": 3},
+ {"matrix": [3, 11], "x": 13.5, "y": 3},
+ {"matrix": [3, 12], "x": 14.5, "y": 3},
+ {"matrix": [3, 13], "x": 15.5, "y": 3, "w": 2.75},
+ {"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.5},
+ {"matrix": [4, 2], "x": 4.25, "y": 4, "w": 1.5},
+ {"matrix": [4, 5], "x": 5.75, "y": 4, "w": 2},
+ {"matrix": [4, 6], "x": 7.75, "y": 4, "w": 1.25},
+ {"matrix": [4, 8], "x": 9.5, "y": 4, "w": 2.75},
+ {"matrix": [4, 10], "x": 12.25, "y": 4, "w": 1.5},
+ {"matrix": [4, 14], "x": 16.75, "y": 4, "w": 1.5}
+ ]
+ },
+ "LAYOUT_long_rshift_split_bs": {
+ "layout": [
+ {"matrix": [1, 0], "x": 0, "y": 0},
+ {"matrix": [0, 0], "x": 1.25, "y": 0},
+ {"matrix": [0, 1], "x": 2.25, "y": 0},
+ {"matrix": [0, 2], "x": 3.25, "y": 0},
+ {"matrix": [0, 3], "x": 4.25, "y": 0},
+ {"matrix": [0, 4], "x": 5.25, "y": 0},
+ {"matrix": [0, 5], "x": 6.25, "y": 0},
+ {"matrix": [0, 6], "x": 7.25, "y": 0},
+ {"matrix": [0, 7], "x": 10.25, "y": 0},
+ {"matrix": [0, 8], "x": 11.25, "y": 0},
+ {"matrix": [0, 9], "x": 12.25, "y": 0},
+ {"matrix": [0, 10], "x": 13.25, "y": 0},
+ {"matrix": [0, 11], "x": 14.25, "y": 0},
+ {"matrix": [0, 12], "x": 15.25, "y": 0},
+ {"matrix": [0, 13], "x": 16.25, "y": 0},
+ {"matrix": [0, 14], "x": 17.25, "y": 0},
+ {"matrix": [2, 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": [3, 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, 1], "x": 1.25, "y": 3, "w": 2.25},
+ {"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": 9.5, "y": 3},
+ {"matrix": [3, 8], "x": 10.5, "y": 3},
+ {"matrix": [3, 9], "x": 11.5, "y": 3},
+ {"matrix": [3, 10], "x": 12.5, "y": 3},
+ {"matrix": [3, 11], "x": 13.5, "y": 3},
+ {"matrix": [3, 12], "x": 14.5, "y": 3},
+ {"matrix": [3, 13], "x": 15.5, "y": 3, "w": 2.75},
+ {"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.5},
+ {"matrix": [4, 2], "x": 4.25, "y": 4, "w": 1.5},
+ {"matrix": [4, 5], "x": 5.75, "y": 4, "w": 2},
+ {"matrix": [4, 6], "x": 7.75, "y": 4, "w": 1.25},
+ {"matrix": [4, 8], "x": 9.5, "y": 4, "w": 2.75},
+ {"matrix": [4, 10], "x": 12.25, "y": 4, "w": 1.5},
+ {"matrix": [4, 14], "x": 16.75, "y": 4, "w": 1.5}
+ ]
+ }
+ }
+}
diff --git a/keyboards/cipulot/ec_dolice/keymaps/default/keymap.c b/keyboards/cipulot/ec_dolice/keymaps/default/keymap.c
new file mode 100644
index 00000000000..5a501e29823
--- /dev/null
+++ b/keyboards/cipulot/ec_dolice/keymaps/default/keymap.c
@@ -0,0 +1,41 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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_PSCR, 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_DEL,
+ 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_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, KC_LGUI, KC_SPC, KC_RALT, KC_RCTL
+ ),
+ [1] = 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,
+ _______, _______, KC_HOME, KC_UP, KC_END, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_CAPS, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, KC_VOLD, KC_VOLU, KC_MUTE, KC_MPRV, KC_MNXT, KC_MPLY, _______, _______,
+ _______, _______, _______, _______, _______, _______, MO(2)
+ ),
+ [2] = LAYOUT_all(
+ QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______
+ )
+};
diff --git a/keyboards/cipulot/ec_dolice/keymaps/via/keymap.c b/keyboards/cipulot/ec_dolice/keymaps/via/keymap.c
new file mode 100644
index 00000000000..5a501e29823
--- /dev/null
+++ b/keyboards/cipulot/ec_dolice/keymaps/via/keymap.c
@@ -0,0 +1,41 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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_PSCR, 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_DEL,
+ 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_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, KC_LGUI, KC_SPC, KC_RALT, KC_RCTL
+ ),
+ [1] = 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,
+ _______, _______, KC_HOME, KC_UP, KC_END, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_CAPS, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, KC_VOLD, KC_VOLU, KC_MUTE, KC_MPRV, KC_MNXT, KC_MPLY, _______, _______,
+ _______, _______, _______, _______, _______, _______, MO(2)
+ ),
+ [2] = LAYOUT_all(
+ QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______
+ )
+};
diff --git a/keyboards/cipulot/ec_dolice/keymaps/via/rules.mk b/keyboards/cipulot/ec_dolice/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/cipulot/ec_dolice/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/cipulot/ec_dolice/mcuconf.h b/keyboards/cipulot/ec_dolice/mcuconf.h
new file mode 100644
index 00000000000..fa3c955e0d8
--- /dev/null
+++ b/keyboards/cipulot/ec_dolice/mcuconf.h
@@ -0,0 +1,22 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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 STM32_ADC_USE_ADC1
+#define STM32_ADC_USE_ADC1 TRUE
diff --git a/keyboards/cipulot/ec_dolice/post_rules.mk b/keyboards/cipulot/ec_dolice/post_rules.mk
new file mode 100644
index 00000000000..d726a112a8c
--- /dev/null
+++ b/keyboards/cipulot/ec_dolice/post_rules.mk
@@ -0,0 +1,3 @@
+ifeq ($(strip $(VIA_ENABLE)), yes)
+ SRC += keyboards/cipulot/common/via_ec.c
+endif
diff --git a/keyboards/cipulot/ec_dolice/readme.md b/keyboards/cipulot/ec_dolice/readme.md
new file mode 100644
index 00000000000..a947df139c3
--- /dev/null
+++ b/keyboards/cipulot/ec_dolice/readme.md
@@ -0,0 +1,26 @@
+# Dolice EC
+
+
+
+The Dolice is a alice keyboard designed by Lx3 (Linworks) and yuktsi (TGR) and run by KLC. EC Version designed by Cipulot.
+
+* Keyboard Maintainer: [cipulot](https://github.com/cipulot)
+* Hardware Supported: Dolice EC
+* Hardware availability: Groupbuys. Check the ongoing ones on [the KLC Discord](https://discord.gg/d2A72mGPRB) or [Webshop](https://klc-playground.com/).
+
+Make example for this keyboard (after setting up your build environment):
+
+ make cipulot/ec_dolice:default
+
+Flashing example for this keyboard:
+
+ make cipulot/ec_dolice: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:
+
+* **Physical reset**: Long short the exposed pads on the top of the PCB
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
diff --git a/keyboards/cipulot/ec_dolice/rules.mk b/keyboards/cipulot/ec_dolice/rules.mk
new file mode 100644
index 00000000000..ce525670a68
--- /dev/null
+++ b/keyboards/cipulot/ec_dolice/rules.mk
@@ -0,0 +1,5 @@
+CUSTOM_MATRIX = lite
+ANALOG_DRIVER_REQUIRED = yes
+VPATH += keyboards/cipulot/common
+SRC += matrix.c ec_board.c ec_switch_matrix.c
+OPT = 3
diff --git a/keyboards/cipulot/ec_menhir/config.h b/keyboards/cipulot/ec_menhir/config.h
new file mode 100644
index 00000000000..bd0094c7f15
--- /dev/null
+++ b/keyboards/cipulot/ec_menhir/config.h
@@ -0,0 +1,61 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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 MATRIX_ROWS 4
+#define MATRIX_COLS 12
+
+#define MATRIX_ROW_PINS \
+ { A0, A3, A2, A1 }
+
+#define AMUX_COUNT 1
+#define AMUX_MAX_COLS_COUNT 12
+
+#define AMUX_EN_PINS \
+ { C10 }
+
+#define AMUX_SEL_PINS \
+ { C11, B3, A15, A14 }
+
+#define AMUX_COL_CHANNELS_SIZES \
+ { 12 }
+
+#define AMUX_0_COL_CHANNELS \
+ { 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10 }
+
+#define AMUX_COL_CHANNELS AMUX_0_COL_CHANNELS
+
+#define DISCHARGE_PIN A4
+#define ANALOG_PORT A5
+
+#define DEFAULT_ACTUATION_MODE 0
+#define DEFAULT_MODE_0_ACTUATION_LEVEL 550
+#define DEFAULT_MODE_0_RELEASE_LEVEL 500
+#define DEFAULT_MODE_1_INITIAL_DEADZONE_OFFSET DEFAULT_MODE_0_ACTUATION_LEVEL
+#define DEFAULT_MODE_1_ACTUATION_OFFSET 70
+#define DEFAULT_MODE_1_RELEASE_OFFSET 70
+#define DEFAULT_EXTREMUM 1023
+#define EXPECTED_NOISE_FLOOR 0
+#define NOISE_FLOOR_THRESHOLD 50
+#define BOTTOMING_CALIBRATION_THRESHOLD 50
+#define DEFAULT_NOISE_FLOOR_SAMPLING_COUNT 30
+#define DEFAULT_BOTTOMING_READING 1023
+#define DEFAULT_CALIBRATION_STARTER true
+
+#define DISCHARGE_TIME 10
+
+#define EECONFIG_KB_DATA_SIZE 105
diff --git a/keyboards/cipulot/ec_menhir/halconf.h b/keyboards/cipulot/ec_menhir/halconf.h
new file mode 100644
index 00000000000..835d43b6a0a
--- /dev/null
+++ b/keyboards/cipulot/ec_menhir/halconf.h
@@ -0,0 +1,21 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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_ADC TRUE
+
+#include_next
diff --git a/keyboards/cipulot/ec_menhir/info.json b/keyboards/cipulot/ec_menhir/info.json
new file mode 100644
index 00000000000..4cc6a845259
--- /dev/null
+++ b/keyboards/cipulot/ec_menhir/info.json
@@ -0,0 +1,87 @@
+{
+ "manufacturer": "Cipulot",
+ "keyboard_name": "EC Menhir",
+ "maintainer": "Cipulot",
+ "bootloader": "stm32-dfu",
+ "build": {
+ "lto": true
+ },
+ "diode_direction": "COL2ROW",
+ "eeprom": {
+ "driver": "wear_leveling",
+ "wear_leveling": {
+ "driver": "embedded_flash",
+ "backing_size": 4096
+ }
+ },
+ "features": {
+ "bootmagic": false,
+ "console": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true
+ },
+ "processor": "STM32G431",
+ "qmk": {
+ "locking": {
+ "enabled": true,
+ "resync": true
+ }
+ },
+ "usb": {
+ "device_version": "0.0.1",
+ "pid": "0x6BB8",
+ "shared_endpoint": {
+ "keyboard": true
+ },
+ "vid": "0x6369"
+ },
+ "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": [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, "w": 1.75},
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.25},
+ {"matrix": [1, 1], "x": 1.25, "y": 1},
+ {"matrix": [1, 2], "x": 2.25, "y": 1},
+ {"matrix": [1, 3], "x": 3.25, "y": 1},
+ {"matrix": [1, 4], "x": 4.25, "y": 1},
+ {"matrix": [1, 5], "x": 5.25, "y": 1},
+ {"matrix": [1, 6], "x": 6.25, "y": 1},
+ {"matrix": [1, 7], "x": 7.25, "y": 1},
+ {"matrix": [1, 8], "x": 8.25, "y": 1},
+ {"matrix": [1, 9], "x": 9.25, "y": 1},
+ {"matrix": [1, 10], "x": 10.25, "y": 1},
+ {"matrix": [1, 11], "x": 11.25, "y": 1, "w": 1.5},
+ {"matrix": [2, 0], "x": 0.5, "y": 2, "w": 1.25},
+ {"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, "w": 1.5},
+ {"matrix": [3, 1], "x": 1.75, "y": 3, "w": 1.25},
+ {"matrix": [3, 2], "x": 3, "y": 3},
+ {"matrix": [3, 4], "x": 4, "y": 3, "w": 2},
+ {"matrix": [3, 5], "x": 6, "y": 3},
+ {"matrix": [3, 6], "x": 7, "y": 3, "w": 2},
+ {"matrix": [3, 8], "x": 9, "y": 3},
+ {"matrix": [3, 9], "x": 10, "y": 3}
+ ]
+ }
+ }
+}
diff --git a/keyboards/cipulot/ec_menhir/keymaps/default/keymap.c b/keyboards/cipulot/ec_menhir/keymaps/default/keymap.c
new file mode 100644
index 00000000000..e6780e6439f
--- /dev/null
+++ b/keyboards/cipulot/ec_menhir/keymaps/default/keymap.c
@@ -0,0 +1,27 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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] = {
+ // clang-format off
+ [0] = LAYOUT(
+ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
+ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_RSFT,
+ KC_LALT, KC_LGUI, MO(1), KC_SPC, KC_SPC, MO(2), KC_LCTL)
+ // clang-format on
+};
diff --git a/keyboards/cipulot/ec_menhir/keymaps/via/keymap.c b/keyboards/cipulot/ec_menhir/keymaps/via/keymap.c
new file mode 100644
index 00000000000..e6780e6439f
--- /dev/null
+++ b/keyboards/cipulot/ec_menhir/keymaps/via/keymap.c
@@ -0,0 +1,27 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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] = {
+ // clang-format off
+ [0] = LAYOUT(
+ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
+ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_RSFT,
+ KC_LALT, KC_LGUI, MO(1), KC_SPC, KC_SPC, MO(2), KC_LCTL)
+ // clang-format on
+};
diff --git a/keyboards/cipulot/ec_menhir/keymaps/via/rules.mk b/keyboards/cipulot/ec_menhir/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/cipulot/ec_menhir/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/cipulot/ec_menhir/mcuconf.h b/keyboards/cipulot/ec_menhir/mcuconf.h
new file mode 100644
index 00000000000..b120f145c5b
--- /dev/null
+++ b/keyboards/cipulot/ec_menhir/mcuconf.h
@@ -0,0 +1,22 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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 STM32_ADC_USE_ADC2
+#define STM32_ADC_USE_ADC2 TRUE
diff --git a/keyboards/cipulot/ec_menhir/post_rules.mk b/keyboards/cipulot/ec_menhir/post_rules.mk
new file mode 100644
index 00000000000..d726a112a8c
--- /dev/null
+++ b/keyboards/cipulot/ec_menhir/post_rules.mk
@@ -0,0 +1,3 @@
+ifeq ($(strip $(VIA_ENABLE)), yes)
+ SRC += keyboards/cipulot/common/via_ec.c
+endif
diff --git a/keyboards/cipulot/ec_menhir/readme.md b/keyboards/cipulot/ec_menhir/readme.md
new file mode 100644
index 00000000000..234b1ab9d0e
--- /dev/null
+++ b/keyboards/cipulot/ec_menhir/readme.md
@@ -0,0 +1,26 @@
+# EC Menhir
+
+
+
+EC version of the Menhir.
+
+* Keyboard Maintainer: [cipulot](https://github.com/cipulot)
+* Hardware Supported: EC Menhir
+* Hardware Availability: [fruitykeeb](https://fruitykeeb.xyz/)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make cipulot/ec_menhir:default
+
+Flashing example for this keyboard:
+
+ make cipulot/ec_menhir: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:
+
+* **Physical Boot0 pins**: Short the Boot0 pins on the back of the PCB while plugging in the keyboard
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
diff --git a/keyboards/cipulot/ec_menhir/rules.mk b/keyboards/cipulot/ec_menhir/rules.mk
new file mode 100644
index 00000000000..e7d73cefc98
--- /dev/null
+++ b/keyboards/cipulot/ec_menhir/rules.mk
@@ -0,0 +1,4 @@
+CUSTOM_MATRIX = lite
+ANALOG_DRIVER_REQUIRED = yes
+VPATH += keyboards/cipulot/common
+SRC += matrix.c ec_board.c ec_switch_matrix.c
diff --git a/keyboards/cipulot/ec_pro2/config.h b/keyboards/cipulot/ec_pro2/config.h
index c936b248c45..a05e716823a 100644
--- a/keyboards/cipulot/ec_pro2/config.h
+++ b/keyboards/cipulot/ec_pro2/config.h
@@ -65,8 +65,3 @@
#define EECONFIG_KB_DATA_SIZE 159
-/* 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
diff --git a/keyboards/cipulot/ec_pro2/info.json b/keyboards/cipulot/ec_pro2/info.json
index 2929edfb19c..2e05cff3c16 100644
--- a/keyboards/cipulot/ec_pro2/info.json
+++ b/keyboards/cipulot/ec_pro2/info.json
@@ -6,6 +6,12 @@
"build": {
"lto": true
},
+ "qmk": {
+ "locking": {
+ "enabled": true,
+ "resync": true
+ }
+ },
"diode_direction": "COL2ROW",
"features": {
"bootmagic": false,
diff --git a/keyboards/cipulot/ec_pro2/rules.mk b/keyboards/cipulot/ec_pro2/rules.mk
index ab6c37cad43..318e0215ce9 100644
--- a/keyboards/cipulot/ec_pro2/rules.mk
+++ b/keyboards/cipulot/ec_pro2/rules.mk
@@ -1,4 +1,5 @@
CUSTOM_MATRIX = lite
ANALOG_DRIVER_REQUIRED = yes
-SRC += keyboards/cipulot/common/matrix.c keyboards/cipulot/common/ec_board.c keyboards/cipulot/common/ec_switch_matrix.c
+VPATH += keyboards/cipulot/common
+SRC += matrix.c ec_board.c ec_switch_matrix.c
OPT = 2
diff --git a/keyboards/cipulot/ec_prox/ansi_iso/config.h b/keyboards/cipulot/ec_prox/ansi_iso/config.h
index 6a165cf3abd..bf25d0b7128 100644
--- a/keyboards/cipulot/ec_prox/ansi_iso/config.h
+++ b/keyboards/cipulot/ec_prox/ansi_iso/config.h
@@ -64,9 +64,3 @@
// #define DEBUG_MATRIX_SCAN_RATE
#define EECONFIG_KB_DATA_SIZE 159
-
-/* 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
diff --git a/keyboards/cipulot/ec_prox/ansi_iso/info.json b/keyboards/cipulot/ec_prox/ansi_iso/info.json
index 3f390d0bc61..9a68d8b0bf7 100644
--- a/keyboards/cipulot/ec_prox/ansi_iso/info.json
+++ b/keyboards/cipulot/ec_prox/ansi_iso/info.json
@@ -6,6 +6,12 @@
"build": {
"lto": true
},
+ "qmk": {
+ "locking": {
+ "enabled": true,
+ "resync": true
+ }
+ },
"diode_direction": "COL2ROW",
"features": {
"bootmagic": false,
diff --git a/keyboards/cipulot/ec_prox/ansi_iso/rules.mk b/keyboards/cipulot/ec_prox/ansi_iso/rules.mk
index ab6c37cad43..318e0215ce9 100644
--- a/keyboards/cipulot/ec_prox/ansi_iso/rules.mk
+++ b/keyboards/cipulot/ec_prox/ansi_iso/rules.mk
@@ -1,4 +1,5 @@
CUSTOM_MATRIX = lite
ANALOG_DRIVER_REQUIRED = yes
-SRC += keyboards/cipulot/common/matrix.c keyboards/cipulot/common/ec_board.c keyboards/cipulot/common/ec_switch_matrix.c
+VPATH += keyboards/cipulot/common
+SRC += matrix.c ec_board.c ec_switch_matrix.c
OPT = 2
diff --git a/keyboards/cipulot/ec_prox/jis/config.h b/keyboards/cipulot/ec_prox/jis/config.h
index 6a686d74044..fd3c048bc38 100644
--- a/keyboards/cipulot/ec_prox/jis/config.h
+++ b/keyboards/cipulot/ec_prox/jis/config.h
@@ -64,9 +64,3 @@
// #define DEBUG_MATRIX_SCAN_RATE
#define EECONFIG_KB_DATA_SIZE 149
-
-/* 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
diff --git a/keyboards/cipulot/ec_prox/jis/info.json b/keyboards/cipulot/ec_prox/jis/info.json
index 88067f9305e..4c92f8c6732 100644
--- a/keyboards/cipulot/ec_prox/jis/info.json
+++ b/keyboards/cipulot/ec_prox/jis/info.json
@@ -6,6 +6,12 @@
"build": {
"lto": true
},
+ "qmk": {
+ "locking": {
+ "enabled": true,
+ "resync": true
+ }
+ },
"diode_direction": "COL2ROW",
"features": {
"bootmagic": false,
diff --git a/keyboards/cipulot/ec_prox/jis/rules.mk b/keyboards/cipulot/ec_prox/jis/rules.mk
index ab6c37cad43..318e0215ce9 100644
--- a/keyboards/cipulot/ec_prox/jis/rules.mk
+++ b/keyboards/cipulot/ec_prox/jis/rules.mk
@@ -1,4 +1,5 @@
CUSTOM_MATRIX = lite
ANALOG_DRIVER_REQUIRED = yes
-SRC += keyboards/cipulot/common/matrix.c keyboards/cipulot/common/ec_board.c keyboards/cipulot/common/ec_switch_matrix.c
+VPATH += keyboards/cipulot/common
+SRC += matrix.c ec_board.c ec_switch_matrix.c
OPT = 2
diff --git a/keyboards/cipulot/ec_theca/config.h b/keyboards/cipulot/ec_theca/config.h
index 4b834fdff68..d9fea559675 100644
--- a/keyboards/cipulot/ec_theca/config.h
+++ b/keyboards/cipulot/ec_theca/config.h
@@ -63,9 +63,3 @@
// #define DEBUG_MATRIX_SCAN_RATE
#define DYNAMIC_KEYMAP_LAYER_COUNT 3
#define EECONFIG_KB_DATA_SIZE 201
-
-/* 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
diff --git a/keyboards/cipulot/ec_theca/info.json b/keyboards/cipulot/ec_theca/info.json
index fbd7d7ec471..a438e401806 100644
--- a/keyboards/cipulot/ec_theca/info.json
+++ b/keyboards/cipulot/ec_theca/info.json
@@ -6,6 +6,12 @@
"build": {
"lto": true
},
+ "qmk": {
+ "locking": {
+ "enabled": true,
+ "resync": true
+ }
+ },
"diode_direction": "COL2ROW",
"features": {
"bootmagic": false,
@@ -27,10 +33,6 @@
"LAYOUT_all": "LAYOUT_tkl_ansi",
"LAYOUT_tkl_ansi_tsangan_wkl": "LAYOUT_tkl_ansi_wkl"
},
- "community_layouts": [
- "tkl_ansi",
- "tkl_ansi_tsangan"
- ],
"layouts": {
"LAYOUT_tkl_ansi": {
"layout": [
diff --git a/keyboards/cipulot/ec_theca/rules.mk b/keyboards/cipulot/ec_theca/rules.mk
index 70494b635f6..ce525670a68 100644
--- a/keyboards/cipulot/ec_theca/rules.mk
+++ b/keyboards/cipulot/ec_theca/rules.mk
@@ -1,4 +1,5 @@
CUSTOM_MATRIX = lite
ANALOG_DRIVER_REQUIRED = yes
-SRC += keyboards/cipulot/common/matrix.c keyboards/cipulot/common/ec_board.c keyboards/cipulot/common/ec_switch_matrix.c
+VPATH += keyboards/cipulot/common
+SRC += matrix.c ec_board.c ec_switch_matrix.c
OPT = 3
diff --git a/keyboards/cipulot/ec_tkl/config.h b/keyboards/cipulot/ec_tkl/config.h
new file mode 100644
index 00000000000..95a7f9137a1
--- /dev/null
+++ b/keyboards/cipulot/ec_tkl/config.h
@@ -0,0 +1,69 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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 MATRIX_ROWS 6
+#define MATRIX_COLS 16
+
+#define MATRIX_ROW_PINS \
+ { B6, B5, B12, B10, B13, B7 }
+
+#define AMUX_COUNT 1
+#define AMUX_MAX_COLS_COUNT 16
+
+#define AMUX_EN_PINS \
+ { A8 }
+
+#define AMUX_SEL_PINS \
+ { B14, B15, A9, A10 }
+
+#define AMUX_COL_CHANNELS_SIZES \
+ { 16 }
+
+#define AMUX_0_COL_CHANNELS \
+ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
+
+#define AMUX_COL_CHANNELS AMUX_0_COL_CHANNELS
+
+#define DISCHARGE_PIN A4
+#define ANALOG_PORT A2
+
+#define DEFAULT_ACTUATION_MODE 0
+#define DEFAULT_MODE_0_ACTUATION_LEVEL 550
+#define DEFAULT_MODE_0_RELEASE_LEVEL 500
+#define DEFAULT_MODE_1_INITIAL_DEADZONE_OFFSET DEFAULT_MODE_0_ACTUATION_LEVEL
+#define DEFAULT_MODE_1_ACTUATION_OFFSET 70
+#define DEFAULT_MODE_1_RELEASE_OFFSET 70
+#define DEFAULT_EXTREMUM 1023
+#define EXPECTED_NOISE_FLOOR 0
+#define NOISE_FLOOR_THRESHOLD 50
+#define BOTTOMING_CALIBRATION_THRESHOLD 50
+#define DEFAULT_NOISE_FLOOR_SAMPLING_COUNT 30
+#define DEFAULT_BOTTOMING_READING 1023
+#define DEFAULT_CALIBRATION_STARTER true
+
+#define DISCHARGE_TIME 10
+
+// #define DEBUG_MATRIX_SCAN_RATE
+#define EECONFIG_KB_DATA_SIZE 201
+
+// PWM driver with direct memory access (DMA) support
+#define WS2812_PWM_DRIVER PWMD3
+#define WS2812_PWM_CHANNEL 1
+#define WS2812_PWM_PAL_MODE 2
+#define WS2812_DMA_STREAM STM32_DMA1_STREAM2
+#define WS2812_DMA_CHANNEL 5
diff --git a/keyboards/cipulot/ec_tkl/halconf.h b/keyboards/cipulot/ec_tkl/halconf.h
new file mode 100644
index 00000000000..f2c22202313
--- /dev/null
+++ b/keyboards/cipulot/ec_tkl/halconf.h
@@ -0,0 +1,23 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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_ADC TRUE
+#define HAL_USE_PAL TRUE
+#define HAL_USE_PWM TRUE
+
+#include_next
diff --git a/keyboards/cipulot/ec_tkl/info.json b/keyboards/cipulot/ec_tkl/info.json
new file mode 100644
index 00000000000..0c56fb838d8
--- /dev/null
+++ b/keyboards/cipulot/ec_tkl/info.json
@@ -0,0 +1,433 @@
+{
+ "manufacturer": "Cipulot",
+ "keyboard_name": "EC TKL",
+ "maintainer": "Cipulot",
+ "bootloader": "stm32-dfu",
+ "build": {
+ "lto": true
+ },
+ "diode_direction": "COL2ROW",
+ "eeprom": {
+ "wear_leveling": {
+ "backing_size": 4096
+ }
+ },
+ "features": {
+ "bootmagic": false,
+ "console": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgblight": true
+ },
+ "processor": "STM32F411",
+ "qmk": {
+ "locking": {
+ "enabled": true,
+ "resync": true
+ }
+ },
+ "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": 22
+ },
+ "usb": {
+ "device_version": "0.0.1",
+ "pid": "0x6BC3",
+ "shared_endpoint": {
+ "keyboard": true
+ },
+ "vid": "0x6369"
+ },
+ "ws2812": {
+ "driver": "pwm",
+ "pin": "B4"
+ },
+ "layouts": {
+ "LAYOUT_all": {
+ "layout": [
+ {"label": "0,0", "matrix": [0, 0], "x": 0, "y": 0},
+ {"label": "0,1", "matrix": [0, 1], "x": 2, "y": 0},
+ {"label": "0,2", "matrix": [0, 2], "x": 3, "y": 0},
+ {"label": "0,3", "matrix": [0, 3], "x": 4, "y": 0},
+ {"label": "0,4", "matrix": [0, 4], "x": 5, "y": 0},
+ {"label": "0,5", "matrix": [0, 5], "x": 6.5, "y": 0},
+ {"label": "0,6", "matrix": [0, 6], "x": 7.5, "y": 0},
+ {"label": "0,7", "matrix": [0, 7], "x": 8.5, "y": 0},
+ {"label": "0,8", "matrix": [0, 8], "x": 9.5, "y": 0},
+ {"label": "0,9", "matrix": [0, 9], "x": 11, "y": 0},
+ {"label": "0,10", "matrix": [0, 10], "x": 12, "y": 0},
+ {"label": "0,11", "matrix": [0, 11], "x": 13, "y": 0},
+ {"label": "0,12", "matrix": [0, 12], "x": 14, "y": 0},
+ {"label": "0,13", "matrix": [0, 13], "x": 15.25, "y": 0},
+ {"label": "0,14", "matrix": [0, 14], "x": 16.25, "y": 0},
+ {"label": "0,15", "matrix": [0, 15], "x": 17.25, "y": 0},
+ {"label": "1,0", "matrix": [1, 0], "x": 0, "y": 1.25},
+ {"label": "1,1", "matrix": [1, 1], "x": 1, "y": 1.25},
+ {"label": "1,2", "matrix": [1, 2], "x": 2, "y": 1.25},
+ {"label": "1,3", "matrix": [1, 3], "x": 3, "y": 1.25},
+ {"label": "1,4", "matrix": [1, 4], "x": 4, "y": 1.25},
+ {"label": "1,5", "matrix": [1, 5], "x": 5, "y": 1.25},
+ {"label": "1,6", "matrix": [1, 6], "x": 6, "y": 1.25},
+ {"label": "1,7", "matrix": [1, 7], "x": 7, "y": 1.25},
+ {"label": "1,8", "matrix": [1, 8], "x": 8, "y": 1.25},
+ {"label": "1,9", "matrix": [1, 9], "x": 9, "y": 1.25},
+ {"label": "1,10", "matrix": [1, 10], "x": 10, "y": 1.25},
+ {"label": "1,11", "matrix": [1, 11], "x": 11, "y": 1.25},
+ {"label": "1,12", "matrix": [1, 12], "x": 12, "y": 1.25},
+ {"label": "1,13", "matrix": [1, 13], "x": 13, "y": 1.25},
+ {"label": "1,14", "matrix": [1, 14], "x": 14, "y": 1.25},
+ {"label": "3,14", "matrix": [3, 14], "x": 15.25, "y": 1.25},
+ {"label": "2,15", "matrix": [2, 15], "x": 16.25, "y": 1.25},
+ {"label": "1,15", "matrix": [1, 15], "x": 17.25, "y": 1.25},
+ {"label": "2,0", "matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"label": "2,1", "matrix": [2, 1], "x": 1.5, "y": 2.25},
+ {"label": "2,2", "matrix": [2, 2], "x": 2.5, "y": 2.25},
+ {"label": "2,3", "matrix": [2, 3], "x": 3.5, "y": 2.25},
+ {"label": "2,4", "matrix": [2, 4], "x": 4.5, "y": 2.25},
+ {"label": "2,5", "matrix": [2, 5], "x": 5.5, "y": 2.25},
+ {"label": "2,6", "matrix": [2, 6], "x": 6.5, "y": 2.25},
+ {"label": "2,7", "matrix": [2, 7], "x": 7.5, "y": 2.25},
+ {"label": "2,8", "matrix": [2, 8], "x": 8.5, "y": 2.25},
+ {"label": "2,9", "matrix": [2, 9], "x": 9.5, "y": 2.25},
+ {"label": "2,10", "matrix": [2, 10], "x": 10.5, "y": 2.25},
+ {"label": "2,11", "matrix": [2, 11], "x": 11.5, "y": 2.25},
+ {"label": "2,12", "matrix": [2, 12], "x": 12.5, "y": 2.25},
+ {"label": "2,13", "matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 0.75},
+ {"label": "2,14", "matrix": [2, 14], "x": 14.25, "y": 2.25, "w": 0.75},
+ {"label": "4,14", "matrix": [4, 14], "x": 15.25, "y": 2.25},
+ {"label": "4,15", "matrix": [4, 15], "x": 16.25, "y": 2.25},
+ {"label": "3,15", "matrix": [3, 15], "x": 17.25, "y": 2.25},
+ {"label": "3,0", "matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"label": "3,1", "matrix": [3, 1], "x": 1.75, "y": 3.25},
+ {"label": "3,2", "matrix": [3, 2], "x": 2.75, "y": 3.25},
+ {"label": "3,3", "matrix": [3, 3], "x": 3.75, "y": 3.25},
+ {"label": "3,4", "matrix": [3, 4], "x": 4.75, "y": 3.25},
+ {"label": "3,5", "matrix": [3, 5], "x": 5.75, "y": 3.25},
+ {"label": "3,6", "matrix": [3, 6], "x": 6.75, "y": 3.25},
+ {"label": "3,7", "matrix": [3, 7], "x": 7.75, "y": 3.25},
+ {"label": "3,8", "matrix": [3, 8], "x": 8.75, "y": 3.25},
+ {"label": "3,9", "matrix": [3, 9], "x": 9.75, "y": 3.25},
+ {"label": "3,10", "matrix": [3, 10], "x": 10.75, "y": 3.25},
+ {"label": "3,11", "matrix": [3, 11], "x": 11.75, "y": 3.25},
+ {"label": "3,12", "matrix": [3, 12], "x": 12.75, "y": 3.25},
+ {"label": "3,13", "matrix": [3, 13], "x": 13.75, "y": 3.25, "w": 1.25},
+ {"label": "4,0", "matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25},
+ {"label": "4,1", "matrix": [4, 1], "x": 1.25, "y": 4.25},
+ {"label": "4,2", "matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"label": "4,3", "matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"label": "4,4", "matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"label": "4,5", "matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"label": "4,6", "matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"label": "4,7", "matrix": [4, 7], "x": 7.25, "y": 4.25},
+ {"label": "4,8", "matrix": [4, 8], "x": 8.25, "y": 4.25},
+ {"label": "4,9", "matrix": [4, 9], "x": 9.25, "y": 4.25},
+ {"label": "4,10", "matrix": [4, 10], "x": 10.25, "y": 4.25},
+ {"label": "4,11", "matrix": [4, 11], "x": 11.25, "y": 4.25},
+ {"label": "4,12", "matrix": [4, 12], "x": 12.25, "y": 4.25},
+ {"label": "4,13", "matrix": [4, 13], "x": 13.25, "y": 4.25, "w": 1.75},
+ {"label": "5,14", "matrix": [5, 14], "x": 16.25, "y": 4.25},
+ {"label": "5,0", "matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5},
+ {"label": "5,1", "matrix": [5, 1], "x": 1.5, "y": 5.25},
+ {"label": "5,2", "matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5},
+ {"label": "5,4", "matrix": [5, 4], "x": 4, "y": 5.25, "w": 1.5},
+ {"label": "5,6", "matrix": [5, 6], "x": 5.5, "y": 5.25, "w": 2.5},
+ {"label": "5,7", "matrix": [5, 7], "x": 8, "y": 5.25, "w": 1.5},
+ {"label": "5,8", "matrix": [5, 8], "x": 9.5, "y": 5.25, "w": 1.5},
+ {"label": "5,9", "matrix": [5, 9], "x": 11, "y": 5.25, "w": 1.5},
+ {"label": "5,10", "matrix": [5, 10], "x": 12.5, "y": 5.25},
+ {"label": "5,11", "matrix": [5, 11], "x": 13.5, "y": 5.25, "w": 1.5},
+ {"label": "5,12", "matrix": [5, 12], "x": 15.25, "y": 5.25},
+ {"label": "5,13", "matrix": [5, 13], "x": 16.25, "y": 5.25},
+ {"label": "5,15", "matrix": [5, 15], "x": 17.25, "y": 5.25}
+ ]
+ },
+ "LAYOUT_tkl_ansi_tsangan": {
+ "layout": [
+ {"label": "0,0", "matrix": [0, 0], "x": 0, "y": 0},
+ {"label": "0,1", "matrix": [0, 1], "x": 2, "y": 0},
+ {"label": "0,2", "matrix": [0, 2], "x": 3, "y": 0},
+ {"label": "0,3", "matrix": [0, 3], "x": 4, "y": 0},
+ {"label": "0,4", "matrix": [0, 4], "x": 5, "y": 0},
+ {"label": "0,5", "matrix": [0, 5], "x": 6.5, "y": 0},
+ {"label": "0,6", "matrix": [0, 6], "x": 7.5, "y": 0},
+ {"label": "0,7", "matrix": [0, 7], "x": 8.5, "y": 0},
+ {"label": "0,8", "matrix": [0, 8], "x": 9.5, "y": 0},
+ {"label": "0,9", "matrix": [0, 9], "x": 11, "y": 0},
+ {"label": "0,10", "matrix": [0, 10], "x": 12, "y": 0},
+ {"label": "0,11", "matrix": [0, 11], "x": 13, "y": 0},
+ {"label": "0,12", "matrix": [0, 12], "x": 14, "y": 0},
+ {"label": "0,13", "matrix": [0, 13], "x": 15.25, "y": 0},
+ {"label": "0,14", "matrix": [0, 14], "x": 16.25, "y": 0},
+ {"label": "0,15", "matrix": [0, 15], "x": 17.25, "y": 0},
+ {"label": "1,0", "matrix": [1, 0], "x": 0, "y": 1.25},
+ {"label": "1,1", "matrix": [1, 1], "x": 1, "y": 1.25},
+ {"label": "1,2", "matrix": [1, 2], "x": 2, "y": 1.25},
+ {"label": "1,3", "matrix": [1, 3], "x": 3, "y": 1.25},
+ {"label": "1,4", "matrix": [1, 4], "x": 4, "y": 1.25},
+ {"label": "1,5", "matrix": [1, 5], "x": 5, "y": 1.25},
+ {"label": "1,6", "matrix": [1, 6], "x": 6, "y": 1.25},
+ {"label": "1,7", "matrix": [1, 7], "x": 7, "y": 1.25},
+ {"label": "1,8", "matrix": [1, 8], "x": 8, "y": 1.25},
+ {"label": "1,9", "matrix": [1, 9], "x": 9, "y": 1.25},
+ {"label": "1,10", "matrix": [1, 10], "x": 10, "y": 1.25},
+ {"label": "1,11", "matrix": [1, 11], "x": 11, "y": 1.25},
+ {"label": "1,12", "matrix": [1, 12], "x": 12, "y": 1.25},
+ {"label": "1,14", "matrix": [1, 14], "x": 13, "y": 1.25, "w": 2},
+ {"label": "3,14", "matrix": [3, 14], "x": 15.25, "y": 1.25},
+ {"label": "2,15", "matrix": [2, 15], "x": 16.25, "y": 1.25},
+ {"label": "1,15", "matrix": [1, 15], "x": 17.25, "y": 1.25},
+ {"label": "2,0", "matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"label": "2,1", "matrix": [2, 1], "x": 1.5, "y": 2.25},
+ {"label": "2,2", "matrix": [2, 2], "x": 2.5, "y": 2.25},
+ {"label": "2,3", "matrix": [2, 3], "x": 3.5, "y": 2.25},
+ {"label": "2,4", "matrix": [2, 4], "x": 4.5, "y": 2.25},
+ {"label": "2,5", "matrix": [2, 5], "x": 5.5, "y": 2.25},
+ {"label": "2,6", "matrix": [2, 6], "x": 6.5, "y": 2.25},
+ {"label": "2,7", "matrix": [2, 7], "x": 7.5, "y": 2.25},
+ {"label": "2,8", "matrix": [2, 8], "x": 8.5, "y": 2.25},
+ {"label": "2,9", "matrix": [2, 9], "x": 9.5, "y": 2.25},
+ {"label": "2,10", "matrix": [2, 10], "x": 10.5, "y": 2.25},
+ {"label": "2,11", "matrix": [2, 11], "x": 11.5, "y": 2.25},
+ {"label": "2,12", "matrix": [2, 12], "x": 12.5, "y": 2.25},
+ {"label": "2,13", "matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5},
+ {"label": "4,14", "matrix": [4, 14], "x": 15.25, "y": 2.25},
+ {"label": "4,15", "matrix": [4, 15], "x": 16.25, "y": 2.25},
+ {"label": "3,15", "matrix": [3, 15], "x": 17.25, "y": 2.25},
+ {"label": "3,0", "matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"label": "3,1", "matrix": [3, 1], "x": 1.75, "y": 3.25},
+ {"label": "3,2", "matrix": [3, 2], "x": 2.75, "y": 3.25},
+ {"label": "3,3", "matrix": [3, 3], "x": 3.75, "y": 3.25},
+ {"label": "3,4", "matrix": [3, 4], "x": 4.75, "y": 3.25},
+ {"label": "3,5", "matrix": [3, 5], "x": 5.75, "y": 3.25},
+ {"label": "3,6", "matrix": [3, 6], "x": 6.75, "y": 3.25},
+ {"label": "3,7", "matrix": [3, 7], "x": 7.75, "y": 3.25},
+ {"label": "3,8", "matrix": [3, 8], "x": 8.75, "y": 3.25},
+ {"label": "3,9", "matrix": [3, 9], "x": 9.75, "y": 3.25},
+ {"label": "3,10", "matrix": [3, 10], "x": 10.75, "y": 3.25},
+ {"label": "3,11", "matrix": [3, 11], "x": 11.75, "y": 3.25},
+ {"label": "3,13", "matrix": [3, 13], "x": 12.75, "y": 3.25, "w": 2.25},
+ {"label": "4,0", "matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25},
+ {"label": "4,2", "matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"label": "4,3", "matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"label": "4,4", "matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"label": "4,5", "matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"label": "4,6", "matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"label": "4,7", "matrix": [4, 7], "x": 7.25, "y": 4.25},
+ {"label": "4,8", "matrix": [4, 8], "x": 8.25, "y": 4.25},
+ {"label": "4,9", "matrix": [4, 9], "x": 9.25, "y": 4.25},
+ {"label": "4,10", "matrix": [4, 10], "x": 10.25, "y": 4.25},
+ {"label": "4,11", "matrix": [4, 11], "x": 11.25, "y": 4.25},
+ {"label": "4,13", "matrix": [4, 13], "x": 12.25, "y": 4.25, "w": 2.75},
+ {"label": "5,14", "matrix": [5, 14], "x": 16.25, "y": 4.25},
+ {"label": "5,0", "matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5},
+ {"label": "5,1", "matrix": [5, 1], "x": 1.5, "y": 5.25},
+ {"label": "5,2", "matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5},
+ {"label": "5,6", "matrix": [5, 6], "x": 4, "y": 5.25, "w": 7},
+ {"label": "5,9", "matrix": [5, 9], "x": 11, "y": 5.25, "w": 1.5},
+ {"label": "5,10", "matrix": [5, 10], "x": 12.5, "y": 5.25},
+ {"label": "5,11", "matrix": [5, 11], "x": 13.5, "y": 5.25, "w": 1.5},
+ {"label": "5,12", "matrix": [5, 12], "x": 15.25, "y": 5.25},
+ {"label": "5,13", "matrix": [5, 13], "x": 16.25, "y": 5.25},
+ {"label": "5,15", "matrix": [5, 15], "x": 17.25, "y": 5.25}
+ ]
+ },
+ "LAYOUT_tkl_iso_tsangan": {
+ "layout": [
+ {"label": "0,0", "matrix": [0, 0], "x": 0, "y": 0},
+ {"label": "0,1", "matrix": [0, 1], "x": 2, "y": 0},
+ {"label": "0,2", "matrix": [0, 2], "x": 3, "y": 0},
+ {"label": "0,3", "matrix": [0, 3], "x": 4, "y": 0},
+ {"label": "0,4", "matrix": [0, 4], "x": 5, "y": 0},
+ {"label": "0,5", "matrix": [0, 5], "x": 6.5, "y": 0},
+ {"label": "0,6", "matrix": [0, 6], "x": 7.5, "y": 0},
+ {"label": "0,7", "matrix": [0, 7], "x": 8.5, "y": 0},
+ {"label": "0,8", "matrix": [0, 8], "x": 9.5, "y": 0},
+ {"label": "0,9", "matrix": [0, 9], "x": 11, "y": 0},
+ {"label": "0,10", "matrix": [0, 10], "x": 12, "y": 0},
+ {"label": "0,11", "matrix": [0, 11], "x": 13, "y": 0},
+ {"label": "0,12", "matrix": [0, 12], "x": 14, "y": 0},
+ {"label": "0,13", "matrix": [0, 13], "x": 15.25, "y": 0},
+ {"label": "0,14", "matrix": [0, 14], "x": 16.25, "y": 0},
+ {"label": "0,15", "matrix": [0, 15], "x": 17.25, "y": 0},
+ {"label": "1,0", "matrix": [1, 0], "x": 0, "y": 1.25},
+ {"label": "1,1", "matrix": [1, 1], "x": 1, "y": 1.25},
+ {"label": "1,2", "matrix": [1, 2], "x": 2, "y": 1.25},
+ {"label": "1,3", "matrix": [1, 3], "x": 3, "y": 1.25},
+ {"label": "1,4", "matrix": [1, 4], "x": 4, "y": 1.25},
+ {"label": "1,5", "matrix": [1, 5], "x": 5, "y": 1.25},
+ {"label": "1,6", "matrix": [1, 6], "x": 6, "y": 1.25},
+ {"label": "1,7", "matrix": [1, 7], "x": 7, "y": 1.25},
+ {"label": "1,8", "matrix": [1, 8], "x": 8, "y": 1.25},
+ {"label": "1,9", "matrix": [1, 9], "x": 9, "y": 1.25},
+ {"label": "1,10", "matrix": [1, 10], "x": 10, "y": 1.25},
+ {"label": "1,11", "matrix": [1, 11], "x": 11, "y": 1.25},
+ {"label": "1,12", "matrix": [1, 12], "x": 12, "y": 1.25},
+ {"label": "1,14", "matrix": [1, 14], "x": 13, "y": 1.25, "w": 2},
+ {"label": "3,14", "matrix": [3, 14], "x": 15.25, "y": 1.25},
+ {"label": "2,15", "matrix": [2, 15], "x": 16.25, "y": 1.25},
+ {"label": "1,15", "matrix": [1, 15], "x": 17.25, "y": 1.25},
+ {"label": "2,0", "matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"label": "2,1", "matrix": [2, 1], "x": 1.5, "y": 2.25},
+ {"label": "2,2", "matrix": [2, 2], "x": 2.5, "y": 2.25},
+ {"label": "2,3", "matrix": [2, 3], "x": 3.5, "y": 2.25},
+ {"label": "2,4", "matrix": [2, 4], "x": 4.5, "y": 2.25},
+ {"label": "2,5", "matrix": [2, 5], "x": 5.5, "y": 2.25},
+ {"label": "2,6", "matrix": [2, 6], "x": 6.5, "y": 2.25},
+ {"label": "2,7", "matrix": [2, 7], "x": 7.5, "y": 2.25},
+ {"label": "2,8", "matrix": [2, 8], "x": 8.5, "y": 2.25},
+ {"label": "2,9", "matrix": [2, 9], "x": 9.5, "y": 2.25},
+ {"label": "2,10", "matrix": [2, 10], "x": 10.5, "y": 2.25},
+ {"label": "2,11", "matrix": [2, 11], "x": 11.5, "y": 2.25},
+ {"label": "2,12", "matrix": [2, 12], "x": 12.5, "y": 2.25},
+ {"label": "2,14", "matrix": [2, 14], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2},
+ {"label": "4,14", "matrix": [4, 14], "x": 15.25, "y": 2.25},
+ {"label": "4,15", "matrix": [4, 15], "x": 16.25, "y": 2.25},
+ {"label": "3,15", "matrix": [3, 15], "x": 17.25, "y": 2.25},
+ {"label": "3,0", "matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"label": "3,1", "matrix": [3, 1], "x": 1.75, "y": 3.25},
+ {"label": "3,2", "matrix": [3, 2], "x": 2.75, "y": 3.25},
+ {"label": "3,3", "matrix": [3, 3], "x": 3.75, "y": 3.25},
+ {"label": "3,4", "matrix": [3, 4], "x": 4.75, "y": 3.25},
+ {"label": "3,5", "matrix": [3, 5], "x": 5.75, "y": 3.25},
+ {"label": "3,6", "matrix": [3, 6], "x": 6.75, "y": 3.25},
+ {"label": "3,7", "matrix": [3, 7], "x": 7.75, "y": 3.25},
+ {"label": "3,8", "matrix": [3, 8], "x": 8.75, "y": 3.25},
+ {"label": "3,9", "matrix": [3, 9], "x": 9.75, "y": 3.25},
+ {"label": "3,10", "matrix": [3, 10], "x": 10.75, "y": 3.25},
+ {"label": "3,11", "matrix": [3, 11], "x": 11.75, "y": 3.25},
+ {"label": "3,12", "matrix": [3, 12], "x": 12.75, "y": 3.25},
+ {"label": "4,0", "matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25},
+ {"label": "4,1", "matrix": [4, 1], "x": 1.25, "y": 4.25},
+ {"label": "4,2", "matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"label": "4,3", "matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"label": "4,4", "matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"label": "4,5", "matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"label": "4,6", "matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"label": "4,7", "matrix": [4, 7], "x": 7.25, "y": 4.25},
+ {"label": "4,8", "matrix": [4, 8], "x": 8.25, "y": 4.25},
+ {"label": "4,9", "matrix": [4, 9], "x": 9.25, "y": 4.25},
+ {"label": "4,10", "matrix": [4, 10], "x": 10.25, "y": 4.25},
+ {"label": "4,11", "matrix": [4, 11], "x": 11.25, "y": 4.25},
+ {"label": "4,13", "matrix": [4, 13], "x": 12.25, "y": 4.25, "w": 2.75},
+ {"label": "5,14", "matrix": [5, 14], "x": 16.25, "y": 4.25},
+ {"label": "5,0", "matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5},
+ {"label": "5,1", "matrix": [5, 1], "x": 1.5, "y": 5.25},
+ {"label": "5,2", "matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5},
+ {"label": "5,6", "matrix": [5, 6], "x": 4, "y": 5.25, "w": 7},
+ {"label": "5,9", "matrix": [5, 9], "x": 11, "y": 5.25, "w": 1.5},
+ {"label": "5,10", "matrix": [5, 10], "x": 12.5, "y": 5.25},
+ {"label": "5,11", "matrix": [5, 11], "x": 13.5, "y": 5.25, "w": 1.5},
+ {"label": "5,12", "matrix": [5, 12], "x": 15.25, "y": 5.25},
+ {"label": "5,13", "matrix": [5, 13], "x": 16.25, "y": 5.25},
+ {"label": "5,15", "matrix": [5, 15], "x": 17.25, "y": 5.25}
+ ]
+ },
+ "LAYOUT_tkl_jis": {
+ "layout": [
+ {"label": "0,0", "matrix": [0, 0], "x": 0, "y": 0},
+ {"label": "0,1", "matrix": [0, 1], "x": 2, "y": 0},
+ {"label": "0,2", "matrix": [0, 2], "x": 3, "y": 0},
+ {"label": "0,3", "matrix": [0, 3], "x": 4, "y": 0},
+ {"label": "0,4", "matrix": [0, 4], "x": 5, "y": 0},
+ {"label": "0,5", "matrix": [0, 5], "x": 6.5, "y": 0},
+ {"label": "0,6", "matrix": [0, 6], "x": 7.5, "y": 0},
+ {"label": "0,7", "matrix": [0, 7], "x": 8.5, "y": 0},
+ {"label": "0,8", "matrix": [0, 8], "x": 9.5, "y": 0},
+ {"label": "0,9", "matrix": [0, 9], "x": 11, "y": 0},
+ {"label": "0,10", "matrix": [0, 10], "x": 12, "y": 0},
+ {"label": "0,11", "matrix": [0, 11], "x": 13, "y": 0},
+ {"label": "0,12", "matrix": [0, 12], "x": 14, "y": 0},
+ {"label": "0,13", "matrix": [0, 13], "x": 15.25, "y": 0},
+ {"label": "0,14", "matrix": [0, 14], "x": 16.25, "y": 0},
+ {"label": "0,15", "matrix": [0, 15], "x": 17.25, "y": 0},
+ {"label": "1,0", "matrix": [1, 0], "x": 0, "y": 1.25},
+ {"label": "1,1", "matrix": [1, 1], "x": 1, "y": 1.25},
+ {"label": "1,2", "matrix": [1, 2], "x": 2, "y": 1.25},
+ {"label": "1,3", "matrix": [1, 3], "x": 3, "y": 1.25},
+ {"label": "1,4", "matrix": [1, 4], "x": 4, "y": 1.25},
+ {"label": "1,5", "matrix": [1, 5], "x": 5, "y": 1.25},
+ {"label": "1,6", "matrix": [1, 6], "x": 6, "y": 1.25},
+ {"label": "1,7", "matrix": [1, 7], "x": 7, "y": 1.25},
+ {"label": "1,8", "matrix": [1, 8], "x": 8, "y": 1.25},
+ {"label": "1,9", "matrix": [1, 9], "x": 9, "y": 1.25},
+ {"label": "1,10", "matrix": [1, 10], "x": 10, "y": 1.25},
+ {"label": "1,11", "matrix": [1, 11], "x": 11, "y": 1.25},
+ {"label": "1,12", "matrix": [1, 12], "x": 12, "y": 1.25},
+ {"label": "1,13", "matrix": [1, 13], "x": 13, "y": 1.25},
+ {"label": "1,14", "matrix": [1, 14], "x": 14, "y": 1.25},
+ {"label": "3,14", "matrix": [3, 14], "x": 15.25, "y": 1.25},
+ {"label": "2,15", "matrix": [2, 15], "x": 16.25, "y": 1.25},
+ {"label": "1,15", "matrix": [1, 15], "x": 17.25, "y": 1.25},
+ {"label": "2,0", "matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"label": "2,1", "matrix": [2, 1], "x": 1.5, "y": 2.25},
+ {"label": "2,2", "matrix": [2, 2], "x": 2.5, "y": 2.25},
+ {"label": "2,3", "matrix": [2, 3], "x": 3.5, "y": 2.25},
+ {"label": "2,4", "matrix": [2, 4], "x": 4.5, "y": 2.25},
+ {"label": "2,5", "matrix": [2, 5], "x": 5.5, "y": 2.25},
+ {"label": "2,6", "matrix": [2, 6], "x": 6.5, "y": 2.25},
+ {"label": "2,7", "matrix": [2, 7], "x": 7.5, "y": 2.25},
+ {"label": "2,8", "matrix": [2, 8], "x": 8.5, "y": 2.25},
+ {"label": "2,9", "matrix": [2, 9], "x": 9.5, "y": 2.25},
+ {"label": "2,10", "matrix": [2, 10], "x": 10.5, "y": 2.25},
+ {"label": "2,11", "matrix": [2, 11], "x": 11.5, "y": 2.25},
+ {"label": "2,12", "matrix": [2, 12], "x": 12.5, "y": 2.25},
+ {"label": "2,14", "matrix": [2, 14], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2},
+ {"label": "4,14", "matrix": [4, 14], "x": 15.25, "y": 2.25},
+ {"label": "4,15", "matrix": [4, 15], "x": 16.25, "y": 2.25},
+ {"label": "3,15", "matrix": [3, 15], "x": 17.25, "y": 2.25},
+ {"label": "3,0", "matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"label": "3,1", "matrix": [3, 1], "x": 1.75, "y": 3.25},
+ {"label": "3,2", "matrix": [3, 2], "x": 2.75, "y": 3.25},
+ {"label": "3,3", "matrix": [3, 3], "x": 3.75, "y": 3.25},
+ {"label": "3,4", "matrix": [3, 4], "x": 4.75, "y": 3.25},
+ {"label": "3,5", "matrix": [3, 5], "x": 5.75, "y": 3.25},
+ {"label": "3,6", "matrix": [3, 6], "x": 6.75, "y": 3.25},
+ {"label": "3,7", "matrix": [3, 7], "x": 7.75, "y": 3.25},
+ {"label": "3,8", "matrix": [3, 8], "x": 8.75, "y": 3.25},
+ {"label": "3,9", "matrix": [3, 9], "x": 9.75, "y": 3.25},
+ {"label": "3,10", "matrix": [3, 10], "x": 10.75, "y": 3.25},
+ {"label": "3,11", "matrix": [3, 11], "x": 11.75, "y": 3.25},
+ {"label": "3,12", "matrix": [3, 12], "x": 12.75, "y": 3.25},
+ {"label": "4,0", "matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25},
+ {"label": "4,2", "matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"label": "4,3", "matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"label": "4,4", "matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"label": "4,5", "matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"label": "4,6", "matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"label": "4,7", "matrix": [4, 7], "x": 7.25, "y": 4.25},
+ {"label": "4,8", "matrix": [4, 8], "x": 8.25, "y": 4.25},
+ {"label": "4,9", "matrix": [4, 9], "x": 9.25, "y": 4.25},
+ {"label": "4,10", "matrix": [4, 10], "x": 10.25, "y": 4.25},
+ {"label": "4,11", "matrix": [4, 11], "x": 11.25, "y": 4.25},
+ {"label": "4,12", "matrix": [4, 12], "x": 12.25, "y": 4.25},
+ {"label": "4,13", "matrix": [4, 13], "x": 13.25, "y": 4.25, "w": 1.75},
+ {"label": "5,14", "matrix": [5, 14], "x": 16.25, "y": 4.25},
+ {"label": "5,0", "matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5},
+ {"label": "5,1", "matrix": [5, 1], "x": 1.5, "y": 5.25},
+ {"label": "5,2", "matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5},
+ {"label": "5,4", "matrix": [5, 4], "x": 4, "y": 5.25, "w": 1.5},
+ {"label": "5,6", "matrix": [5, 6], "x": 5.5, "y": 5.25, "w": 2.5},
+ {"label": "5,7", "matrix": [5, 7], "x": 8, "y": 5.25, "w": 1.5},
+ {"label": "5,8", "matrix": [5, 8], "x": 9.5, "y": 5.25, "w": 1.5},
+ {"label": "5,9", "matrix": [5, 9], "x": 11, "y": 5.25, "w": 1.5},
+ {"label": "5,10", "matrix": [5, 10], "x": 12.5, "y": 5.25},
+ {"label": "5,11", "matrix": [5, 11], "x": 13.5, "y": 5.25, "w": 1.5},
+ {"label": "5,12", "matrix": [5, 12], "x": 15.25, "y": 5.25},
+ {"label": "5,13", "matrix": [5, 13], "x": 16.25, "y": 5.25},
+ {"label": "5,15", "matrix": [5, 15], "x": 17.25, "y": 5.25}
+ ]
+ }
+ }
+}
diff --git a/keyboards/cipulot/ec_tkl/keymaps/default/keymap.c b/keyboards/cipulot/ec_tkl/keymaps/default/keymap.c
new file mode 100644
index 00000000000..983bdefe8a9
--- /dev/null
+++ b/keyboards/cipulot/ec_tkl/keymaps/default/keymap.c
@@ -0,0 +1,39 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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
+
+#include "keymap_japanese.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ // clang-format off
+ [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, JP_YEN, 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_ENTER, 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_NUHS, KC_ENTER,
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, JP_UNDS, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, JP_MHEN, KC_SPC, JP_KANA, KC_RALT, KC_RGUI, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT),
+
+ [1] = LAYOUT_all(
+ QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______)
+ // clang-format on
+};
diff --git a/keyboards/cipulot/ec_tkl/keymaps/tkl_ansi_tsangan/keymap.c b/keyboards/cipulot/ec_tkl/keymaps/tkl_ansi_tsangan/keymap.c
new file mode 100644
index 00000000000..ba948b4fc12
--- /dev/null
+++ b/keyboards/cipulot/ec_tkl/keymaps/tkl_ansi_tsangan/keymap.c
@@ -0,0 +1,37 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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] = {
+ // clang-format off
+ [0] = LAYOUT_tkl_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_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_ENTER,
+ 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_RIGHT),
+
+ [1] = LAYOUT_tkl_ansi_tsangan(
+ QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______)
+ // clang-format on
+};
diff --git a/keyboards/cipulot/ec_tkl/keymaps/tkl_iso_tsangan/keymap.c b/keyboards/cipulot/ec_tkl/keymaps/tkl_iso_tsangan/keymap.c
new file mode 100644
index 00000000000..1689d44d408
--- /dev/null
+++ b/keyboards/cipulot/ec_tkl/keymaps/tkl_iso_tsangan/keymap.c
@@ -0,0 +1,37 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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] = {
+ // clang-format off
+ [0] = LAYOUT_tkl_iso_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_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_ENT, 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_NUHS,
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT),
+
+ [1] = LAYOUT_tkl_iso_tsangan(
+ QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______)
+ // clang-format on
+};
diff --git a/keyboards/cipulot/ec_tkl/keymaps/tkl_jis/keymap.c b/keyboards/cipulot/ec_tkl/keymaps/tkl_jis/keymap.c
new file mode 100644
index 00000000000..e44575f74f9
--- /dev/null
+++ b/keyboards/cipulot/ec_tkl/keymaps/tkl_jis/keymap.c
@@ -0,0 +1,39 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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
+
+#include "keymap_japanese.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ // clang-format off
+ [0] = LAYOUT_tkl_jis(
+ 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,
+ JP_ZKHK, JP_1, JP_2, JP_3, JP_4, JP_5, JP_6, JP_7, JP_8, JP_9, JP_0, JP_MINS, JP_CIRC, JP_YEN, KC_BSPC, KC_INS, KC_HOME, KC_PGUP,
+ KC_TAB, JP_Q, JP_W, JP_E, JP_R, JP_T, JP_Y, JP_U, JP_I, JP_O, JP_P, JP_AT, JP_LBRC, KC_ENTER, KC_DEL, KC_END, KC_PGDN,
+ JP_EISU, JP_A, JP_S, JP_D, JP_F, JP_G, JP_H, JP_J, JP_K, JP_L, JP_SCLN, JP_COLN, JP_RBRC,
+ KC_LSFT, JP_Z, JP_X, JP_C, JP_V, JP_B, JP_N, JP_M, JP_COMM, JP_DOT, JP_SLSH, JP_BSLS, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, JP_MHEN, KC_SPC, JP_HENK, JP_KANA, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT),
+
+ [1] = LAYOUT_tkl_jis(
+ QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______)
+ // clang-format on
+};
diff --git a/keyboards/cipulot/kawayo/config.h b/keyboards/cipulot/ec_tkl/keymaps/via/config.h
similarity index 76%
rename from keyboards/cipulot/kawayo/config.h
rename to keyboards/cipulot/ec_tkl/keymaps/via/config.h
index a08011b9cf9..1ab0d3d9aa2 100644
--- a/keyboards/cipulot/kawayo/config.h
+++ b/keyboards/cipulot/ec_tkl/keymaps/via/config.h
@@ -1,4 +1,4 @@
-/* Copyright 2022 Cipulot
+/* Copyright 2023 Cipulot
*
* 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
@@ -16,7 +16,5 @@
#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
+// This is the firmware version for VIA support to avoid conflicts on menu fetching
+#define VIA_FIRMWARE_VERSION 1
diff --git a/keyboards/cipulot/ec_tkl/keymaps/via/keymap.c b/keyboards/cipulot/ec_tkl/keymaps/via/keymap.c
new file mode 100644
index 00000000000..983bdefe8a9
--- /dev/null
+++ b/keyboards/cipulot/ec_tkl/keymaps/via/keymap.c
@@ -0,0 +1,39 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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
+
+#include "keymap_japanese.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ // clang-format off
+ [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, JP_YEN, 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_ENTER, 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_NUHS, KC_ENTER,
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, JP_UNDS, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, JP_MHEN, KC_SPC, JP_KANA, KC_RALT, KC_RGUI, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT),
+
+ [1] = LAYOUT_all(
+ QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______)
+ // clang-format on
+};
diff --git a/keyboards/cipulot/ec_tkl/keymaps/via/rules.mk b/keyboards/cipulot/ec_tkl/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/cipulot/ec_tkl/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/cipulot/ec_tkl/mcuconf.h b/keyboards/cipulot/ec_tkl/mcuconf.h
new file mode 100644
index 00000000000..206928272fb
--- /dev/null
+++ b/keyboards/cipulot/ec_tkl/mcuconf.h
@@ -0,0 +1,25 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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 STM32_ADC_USE_ADC1
+#define STM32_ADC_USE_ADC1 TRUE
+
+#undef STM32_PWM_USE_TIM3
+#define STM32_PWM_USE_TIM3 TRUE
diff --git a/keyboards/cipulot/ec_tkl/post_rules.mk b/keyboards/cipulot/ec_tkl/post_rules.mk
new file mode 100644
index 00000000000..d726a112a8c
--- /dev/null
+++ b/keyboards/cipulot/ec_tkl/post_rules.mk
@@ -0,0 +1,3 @@
+ifeq ($(strip $(VIA_ENABLE)), yes)
+ SRC += keyboards/cipulot/common/via_ec.c
+endif
diff --git a/keyboards/cipulot/ec_tkl/readme.md b/keyboards/cipulot/ec_tkl/readme.md
new file mode 100644
index 00000000000..31467b94d74
--- /dev/null
+++ b/keyboards/cipulot/ec_tkl/readme.md
@@ -0,0 +1,26 @@
+# EC TKL
+
+
+
+Universal TKL Electrostatic Capacitive PCB, with multi-layout support.
+
+* Keyboard Maintainer: [cipulot](https://github.com/cipulot)
+* Hardware Supported: EC TKL PCB Rev 1.1
+* Hardware Availability: TBD
+
+Make example for this keyboard (after setting up your build environment):
+
+ make cipulot/ec_tkl:default
+
+Flashing example for this keyboard:
+
+ make cipulot/ec_tkl: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:
+
+* **Physical reset**: Long short the exposed pins on the PCB
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
diff --git a/keyboards/cipulot/ec_tkl/rules.mk b/keyboards/cipulot/ec_tkl/rules.mk
new file mode 100644
index 00000000000..318e0215ce9
--- /dev/null
+++ b/keyboards/cipulot/ec_tkl/rules.mk
@@ -0,0 +1,5 @@
+CUSTOM_MATRIX = lite
+ANALOG_DRIVER_REQUIRED = yes
+VPATH += keyboards/cipulot/common
+SRC += matrix.c ec_board.c ec_switch_matrix.c
+OPT = 2
diff --git a/keyboards/cipulot/ec_typeb/config.h b/keyboards/cipulot/ec_typeb/config.h
new file mode 100644
index 00000000000..bf25d0b7128
--- /dev/null
+++ b/keyboards/cipulot/ec_typeb/config.h
@@ -0,0 +1,66 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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 MATRIX_ROWS 5
+#define MATRIX_COLS 15
+
+#define MATRIX_ROW_PINS \
+ { A7, B0, A4, A5, A6 }
+
+#define AMUX_COUNT 2
+#define AMUX_MAX_COLS_COUNT 8
+
+#define AMUX_EN_PINS \
+ { B7, B3 }
+
+#define AMUX_SEL_PINS \
+ { B4, B5, B6 }
+
+#define AMUX_COL_CHANNELS_SIZES \
+ { 8, 7 }
+
+#define AMUX_0_COL_CHANNELS \
+ { 0, 3, 1, 2, 5, 7, 6, 4 }
+
+#define AMUX_1_COL_CHANNELS \
+ { 0, 3, 1, 2, 5, 7, 6 }
+
+#define AMUX_COL_CHANNELS AMUX_0_COL_CHANNELS, AMUX_1_COL_CHANNELS
+
+#define DISCHARGE_PIN A2
+#define ANALOG_PORT A1
+
+#define DEFAULT_ACTUATION_MODE 0
+#define DEFAULT_MODE_0_ACTUATION_LEVEL 550
+#define DEFAULT_MODE_0_RELEASE_LEVEL 500
+#define DEFAULT_MODE_1_INITIAL_DEADZONE_OFFSET DEFAULT_MODE_0_ACTUATION_LEVEL
+#define DEFAULT_MODE_1_ACTUATION_OFFSET 70
+#define DEFAULT_MODE_1_RELEASE_OFFSET 70
+#define DEFAULT_EXTREMUM 1023
+#define EXPECTED_NOISE_FLOOR 0
+#define NOISE_FLOOR_THRESHOLD 50
+#define BOTTOMING_CALIBRATION_THRESHOLD 100
+#define DEFAULT_NOISE_FLOOR_SAMPLING_COUNT 30
+#define DEFAULT_BOTTOMING_READING 1023
+#define DEFAULT_CALIBRATION_STARTER true
+
+#define DISCHARGE_TIME 10
+
+// #define DEBUG_MATRIX_SCAN_RATE
+
+#define EECONFIG_KB_DATA_SIZE 159
diff --git a/keyboards/cipulot/ec_typeb/halconf.h b/keyboards/cipulot/ec_typeb/halconf.h
new file mode 100644
index 00000000000..835d43b6a0a
--- /dev/null
+++ b/keyboards/cipulot/ec_typeb/halconf.h
@@ -0,0 +1,21 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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_ADC TRUE
+
+#include_next
diff --git a/keyboards/cipulot/ec_typeb/info.json b/keyboards/cipulot/ec_typeb/info.json
new file mode 100644
index 00000000000..2036632af59
--- /dev/null
+++ b/keyboards/cipulot/ec_typeb/info.json
@@ -0,0 +1,98 @@
+{
+ "manufacturer": "Cipulot",
+ "keyboard_name": "EC Type-B",
+ "maintainer": "Cipulot",
+ "bootloader": "stm32-dfu",
+ "build": {
+ "lto": true
+ },
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": false,
+ "console": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true
+ },
+ "processor": "STM32F411",
+ "qmk": {
+ "locking": {
+ "enabled": true,
+ "resync": true
+ }
+ },
+ "usb": {
+ "device_version": "0.0.1",
+ "pid": "0x6BAA",
+ "shared_endpoint": {
+ "keyboard": true
+ },
+ "vid": "0x6369"
+ },
+ "layouts": {
+ "LAYOUT_60_hhkb": {
+ "layout": [
+ {"label": "0,0", "matrix": [0, 0], "x": 0, "y": 0},
+ {"label": "0,1", "matrix": [0, 1], "x": 1, "y": 0},
+ {"label": "0,2", "matrix": [0, 2], "x": 2, "y": 0},
+ {"label": "0,3", "matrix": [0, 3], "x": 3, "y": 0},
+ {"label": "0,4", "matrix": [0, 4], "x": 4, "y": 0},
+ {"label": "0,5", "matrix": [0, 5], "x": 5, "y": 0},
+ {"label": "0,6", "matrix": [0, 6], "x": 6, "y": 0},
+ {"label": "0,7", "matrix": [0, 7], "x": 7, "y": 0},
+ {"label": "0,8", "matrix": [0, 8], "x": 8, "y": 0},
+ {"label": "0,9", "matrix": [0, 9], "x": 9, "y": 0},
+ {"label": "0,10", "matrix": [0, 10], "x": 10, "y": 0},
+ {"label": "0,11", "matrix": [0, 11], "x": 11, "y": 0},
+ {"label": "0,12", "matrix": [0, 12], "x": 12, "y": 0},
+ {"label": "0,13", "matrix": [0, 13], "x": 13, "y": 0},
+ {"label": "0,14", "matrix": [0, 14], "x": 14, "y": 0},
+ {"label": "1,0", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"label": "1,1", "matrix": [1, 1], "x": 1.5, "y": 1},
+ {"label": "1,2", "matrix": [1, 2], "x": 2.5, "y": 1},
+ {"label": "1,3", "matrix": [1, 3], "x": 3.5, "y": 1},
+ {"label": "1,4", "matrix": [1, 4], "x": 4.5, "y": 1},
+ {"label": "1,5", "matrix": [1, 5], "x": 5.5, "y": 1},
+ {"label": "1,6", "matrix": [1, 6], "x": 6.5, "y": 1},
+ {"label": "1,7", "matrix": [1, 7], "x": 7.5, "y": 1},
+ {"label": "1,8", "matrix": [1, 8], "x": 8.5, "y": 1},
+ {"label": "1,9", "matrix": [1, 9], "x": 9.5, "y": 1},
+ {"label": "1,10", "matrix": [1, 10], "x": 10.5, "y": 1},
+ {"label": "1,11", "matrix": [1, 11], "x": 11.5, "y": 1},
+ {"label": "1,12", "matrix": [1, 12], "x": 12.5, "y": 1},
+ {"label": "1,13", "matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
+ {"label": "2,0", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"label": "2,1", "matrix": [2, 1], "x": 1.75, "y": 2},
+ {"label": "2,2", "matrix": [2, 2], "x": 2.75, "y": 2},
+ {"label": "2,3", "matrix": [2, 3], "x": 3.75, "y": 2},
+ {"label": "2,4", "matrix": [2, 4], "x": 4.75, "y": 2},
+ {"label": "2,5", "matrix": [2, 5], "x": 5.75, "y": 2},
+ {"label": "2,6", "matrix": [2, 6], "x": 6.75, "y": 2},
+ {"label": "2,7", "matrix": [2, 7], "x": 7.75, "y": 2},
+ {"label": "2,8", "matrix": [2, 8], "x": 8.75, "y": 2},
+ {"label": "2,9", "matrix": [2, 9], "x": 9.75, "y": 2},
+ {"label": "2,10", "matrix": [2, 10], "x": 10.75, "y": 2},
+ {"label": "2,11", "matrix": [2, 11], "x": 11.75, "y": 2},
+ {"label": "2,13", "matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
+ {"label": "3,0", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+ {"label": "3,2", "matrix": [3, 2], "x": 2.25, "y": 3},
+ {"label": "3,3", "matrix": [3, 3], "x": 3.25, "y": 3},
+ {"label": "3,4", "matrix": [3, 4], "x": 4.25, "y": 3},
+ {"label": "3,5", "matrix": [3, 5], "x": 5.25, "y": 3},
+ {"label": "3,6", "matrix": [3, 6], "x": 6.25, "y": 3},
+ {"label": "3,7", "matrix": [3, 7], "x": 7.25, "y": 3},
+ {"label": "3,8", "matrix": [3, 8], "x": 8.25, "y": 3},
+ {"label": "3,9", "matrix": [3, 9], "x": 9.25, "y": 3},
+ {"label": "3,10", "matrix": [3, 10], "x": 10.25, "y": 3},
+ {"label": "3,11", "matrix": [3, 11], "x": 11.25, "y": 3},
+ {"label": "3,13", "matrix": [3, 13], "x": 12.25, "y": 3, "w": 1.75},
+ {"label": "3,14", "matrix": [3, 14], "x": 14, "y": 3},
+ {"label": "4,1", "matrix": [4, 1], "x": 1.5, "y": 4},
+ {"label": "4,2", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+ {"label": "4,6", "matrix": [4, 6], "x": 4, "y": 4, "w": 6},
+ {"label": "4,9", "matrix": [4, 9], "x": 10, "y": 4, "w": 1.5},
+ {"label": "4,10", "matrix": [4, 10], "x": 11.5, "y": 4}
+ ]
+ }
+ }
+}
diff --git a/keyboards/cipulot/ec_typeb/keymaps/default/keymap.c b/keyboards/cipulot/ec_typeb/keymaps/default/keymap.c
new file mode 100644
index 00000000000..71f8cd0368d
--- /dev/null
+++ b/keyboards/cipulot/ec_typeb/keymaps/default/keymap.c
@@ -0,0 +1,42 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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] = {
+ // clang-format off
+ [0] = LAYOUT_60_hhkb(
+ 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_GRV,
+ 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_DEL,
+ 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_ENTER,
+ 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_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT),
+
+ [1] = LAYOUT_60_hhkb(
+ _______, 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_INS, KC_DEL,
+ KC_CAPS, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, KC_UP, _______, KC_BSPC,
+ _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, S(KC_8), KC_SLSH, KC_HOME, KC_PGUP, KC_LEFT, KC_RIGHT, _______,
+ _______, _______, _______, _______, _______, _______, S(KC_EQL), KC_MINS, KC_END, KC_PGDN, KC_DOWN, _______, _______,
+ _______, _______, _______, _______, MO(2)),
+
+ [2] = LAYOUT_60_hhkb(
+ QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______)
+ // clang-format on
+};
diff --git a/keyboards/cipulot/ec_typeb/keymaps/via/keymap.c b/keyboards/cipulot/ec_typeb/keymaps/via/keymap.c
new file mode 100644
index 00000000000..71f8cd0368d
--- /dev/null
+++ b/keyboards/cipulot/ec_typeb/keymaps/via/keymap.c
@@ -0,0 +1,42 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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] = {
+ // clang-format off
+ [0] = LAYOUT_60_hhkb(
+ 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_GRV,
+ 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_DEL,
+ 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_ENTER,
+ 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_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT),
+
+ [1] = LAYOUT_60_hhkb(
+ _______, 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_INS, KC_DEL,
+ KC_CAPS, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, KC_UP, _______, KC_BSPC,
+ _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, S(KC_8), KC_SLSH, KC_HOME, KC_PGUP, KC_LEFT, KC_RIGHT, _______,
+ _______, _______, _______, _______, _______, _______, S(KC_EQL), KC_MINS, KC_END, KC_PGDN, KC_DOWN, _______, _______,
+ _______, _______, _______, _______, MO(2)),
+
+ [2] = LAYOUT_60_hhkb(
+ QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______)
+ // clang-format on
+};
diff --git a/keyboards/cipulot/ec_typeb/keymaps/via/rules.mk b/keyboards/cipulot/ec_typeb/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/cipulot/ec_typeb/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/cipulot/ec_typeb/mcuconf.h b/keyboards/cipulot/ec_typeb/mcuconf.h
new file mode 100644
index 00000000000..fa3c955e0d8
--- /dev/null
+++ b/keyboards/cipulot/ec_typeb/mcuconf.h
@@ -0,0 +1,22 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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 STM32_ADC_USE_ADC1
+#define STM32_ADC_USE_ADC1 TRUE
diff --git a/keyboards/cipulot/ec_typeb/post_rules.mk b/keyboards/cipulot/ec_typeb/post_rules.mk
new file mode 100644
index 00000000000..d726a112a8c
--- /dev/null
+++ b/keyboards/cipulot/ec_typeb/post_rules.mk
@@ -0,0 +1,3 @@
+ifeq ($(strip $(VIA_ENABLE)), yes)
+ SRC += keyboards/cipulot/common/via_ec.c
+endif
diff --git a/keyboards/cipulot/ec_typeb/readme.md b/keyboards/cipulot/ec_typeb/readme.md
new file mode 100644
index 00000000000..c3bfe812388
--- /dev/null
+++ b/keyboards/cipulot/ec_typeb/readme.md
@@ -0,0 +1,26 @@
+# EC Type-B
+
+
+
+EC Type-B Keyboard by bababaul.
+
+* Keyboard Maintainer: [cipulot](https://github.com/cipulot)
+* Hardware Supported: EC Type-B
+* Hardware Availability: [Sand Keys](https://sandkeys.me/)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make cipulot/ec_typeb:default
+
+Flashing example for this keyboard:
+
+ make cipulot/ec_typeb: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:
+
+* **Physical Boot0 pins**: Short the Boot0 pins on the back of the PCB while plugging in the keyboard
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
diff --git a/keyboards/cipulot/ec_typeb/rules.mk b/keyboards/cipulot/ec_typeb/rules.mk
new file mode 100644
index 00000000000..ce525670a68
--- /dev/null
+++ b/keyboards/cipulot/ec_typeb/rules.mk
@@ -0,0 +1,5 @@
+CUSTOM_MATRIX = lite
+ANALOG_DRIVER_REQUIRED = yes
+VPATH += keyboards/cipulot/common
+SRC += matrix.c ec_board.c ec_switch_matrix.c
+OPT = 3
diff --git a/keyboards/cipulot/ec_vero/config.h b/keyboards/cipulot/ec_vero/config.h
new file mode 100644
index 00000000000..89f7474b552
--- /dev/null
+++ b/keyboards/cipulot/ec_vero/config.h
@@ -0,0 +1,61 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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 MATRIX_ROWS 5
+#define MATRIX_COLS 15
+
+#define MATRIX_ROW_PINS \
+ { B7, B6, A9, A10, B3 }
+
+#define AMUX_COUNT 1
+#define AMUX_MAX_COLS_COUNT 15
+
+#define AMUX_EN_PINS \
+ { B14 }
+
+#define AMUX_SEL_PINS \
+ { B13, B12, B15, A8 }
+
+#define AMUX_COL_CHANNELS_SIZES \
+ { 15 }
+
+#define AMUX_0_COL_CHANNELS \
+ { 1, 2, 3, 4, 5, 6, 7, 0, 8, 9, 10, 11, 13, 12, 14}
+
+#define AMUX_COL_CHANNELS AMUX_0_COL_CHANNELS
+
+#define DISCHARGE_PIN A4
+#define ANALOG_PORT A2
+
+#define DEFAULT_ACTUATION_MODE 0
+#define DEFAULT_MODE_0_ACTUATION_LEVEL 550
+#define DEFAULT_MODE_0_RELEASE_LEVEL 500
+#define DEFAULT_MODE_1_INITIAL_DEADZONE_OFFSET DEFAULT_MODE_0_ACTUATION_LEVEL
+#define DEFAULT_MODE_1_ACTUATION_OFFSET 70
+#define DEFAULT_MODE_1_RELEASE_OFFSET 70
+#define DEFAULT_EXTREMUM 1023
+#define EXPECTED_NOISE_FLOOR 0
+#define NOISE_FLOOR_THRESHOLD 50
+#define BOTTOMING_CALIBRATION_THRESHOLD 50
+#define DEFAULT_NOISE_FLOOR_SAMPLING_COUNT 30
+#define DEFAULT_BOTTOMING_READING 1023
+#define DEFAULT_CALIBRATION_STARTER true
+
+#define DISCHARGE_TIME 10
+
+#define EECONFIG_KB_DATA_SIZE 159
diff --git a/keyboards/cipulot/ec_vero/halconf.h b/keyboards/cipulot/ec_vero/halconf.h
new file mode 100644
index 00000000000..835d43b6a0a
--- /dev/null
+++ b/keyboards/cipulot/ec_vero/halconf.h
@@ -0,0 +1,21 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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_ADC TRUE
+
+#include_next
diff --git a/keyboards/cipulot/ec_vero/info.json b/keyboards/cipulot/ec_vero/info.json
new file mode 100644
index 00000000000..a2cc1e4a07d
--- /dev/null
+++ b/keyboards/cipulot/ec_vero/info.json
@@ -0,0 +1,165 @@
+{
+ "manufacturer": "Cipulot",
+ "keyboard_name": "Vero EC",
+ "maintainer": "Cipulot",
+ "bootloader": "stm32-dfu",
+ "build": {
+ "lto": true
+ },
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": false,
+ "console": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true
+ },
+ "processor": "STM32F411",
+ "qmk": {
+ "locking": {
+ "enabled": true,
+ "resync": true
+ }
+ },
+ "usb": {
+ "device_version": "0.0.1",
+ "pid": "0x6BC1",
+ "shared_endpoint": {
+ "keyboard": true
+ },
+ "vid": "0x6369"
+ },
+ "layouts": {
+ "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, 13], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [3, 14], "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": 6},
+ {"matrix": [4, 10], "x": 10, "y": 4, "w": 1.5},
+ {"matrix": [4, 11], "x": 11.5, "y": 4}
+ ]
+ },
+ "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": 0.75},
+ {"matrix": [1, 14], "x": 14.25, "y": 1, "w": 0.75},
+ {"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, 13], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [3, 14], "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": 6},
+ {"matrix": [4, 10], "x": 10, "y": 4, "w": 1.5},
+ {"matrix": [4, 11], "x": 11.5, "y": 4}
+ ]
+ }
+ }
+}
diff --git a/keyboards/cipulot/ec_vero/keymaps/60_hhkb/keymap.c b/keyboards/cipulot/ec_vero/keymaps/60_hhkb/keymap.c
new file mode 100644
index 00000000000..bd4df694af9
--- /dev/null
+++ b/keyboards/cipulot/ec_vero/keymaps/60_hhkb/keymap.c
@@ -0,0 +1,42 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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] = {
+ // clang-format off
+ [0] = LAYOUT_60_hhkb(
+ 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_GRV,
+ 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_DEL,
+ 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_ENTER,
+ 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_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT),
+
+ [1] = LAYOUT_60_hhkb(
+ _______, 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_INS, KC_DEL,
+ KC_CAPS, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, KC_UP, _______, KC_BSPC,
+ _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, S(KC_8), KC_SLSH, KC_HOME, KC_PGUP, KC_LEFT, KC_RIGHT, _______,
+ _______, _______, _______, _______, _______, _______, S(KC_EQL), KC_MINS, KC_END, KC_PGDN, KC_DOWN, _______, _______,
+ _______, _______, _______, _______, MO(2)),
+
+ [2] = LAYOUT_60_hhkb(
+ QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______)
+ // clang-format on
+};
diff --git a/keyboards/cipulot/ec_vero/keymaps/default/keymap.c b/keyboards/cipulot/ec_vero/keymaps/default/keymap.c
new file mode 100644
index 00000000000..06b3651d94a
--- /dev/null
+++ b/keyboards/cipulot/ec_vero/keymaps/default/keymap.c
@@ -0,0 +1,42 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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] = {
+ // clang-format off
+ [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_GRV,
+ 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_DEL, KC_ENTER,
+ 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_NUHS, KC_ENTER,
+ KC_LSFT, KC_BSLS, 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_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT),
+
+ [1] = LAYOUT_all(
+ _______, 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_INS, KC_DEL,
+ KC_CAPS, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, KC_UP, _______, KC_BSPC, _______,
+ _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, S(KC_8), KC_SLSH, KC_HOME, KC_PGUP, KC_LEFT, KC_RIGHT, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, S(KC_EQL), KC_MINS, KC_END, KC_PGDN, KC_DOWN, _______, _______,
+ _______, _______, _______, _______, MO(2)),
+
+ [2] = LAYOUT_all(
+ QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______)
+ // clang-format on
+};
diff --git a/keyboards/cipulot/ec_vero/keymaps/via/keymap.c b/keyboards/cipulot/ec_vero/keymaps/via/keymap.c
new file mode 100644
index 00000000000..06b3651d94a
--- /dev/null
+++ b/keyboards/cipulot/ec_vero/keymaps/via/keymap.c
@@ -0,0 +1,42 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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] = {
+ // clang-format off
+ [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_GRV,
+ 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_DEL, KC_ENTER,
+ 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_NUHS, KC_ENTER,
+ KC_LSFT, KC_BSLS, 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_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT),
+
+ [1] = LAYOUT_all(
+ _______, 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_INS, KC_DEL,
+ KC_CAPS, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, KC_UP, _______, KC_BSPC, _______,
+ _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, S(KC_8), KC_SLSH, KC_HOME, KC_PGUP, KC_LEFT, KC_RIGHT, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, S(KC_EQL), KC_MINS, KC_END, KC_PGDN, KC_DOWN, _______, _______,
+ _______, _______, _______, _______, MO(2)),
+
+ [2] = LAYOUT_all(
+ QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______)
+ // clang-format on
+};
diff --git a/keyboards/cipulot/ec_vero/keymaps/via/rules.mk b/keyboards/cipulot/ec_vero/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/cipulot/ec_vero/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/cipulot/ec_vero/mcuconf.h b/keyboards/cipulot/ec_vero/mcuconf.h
new file mode 100644
index 00000000000..fa3c955e0d8
--- /dev/null
+++ b/keyboards/cipulot/ec_vero/mcuconf.h
@@ -0,0 +1,22 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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 STM32_ADC_USE_ADC1
+#define STM32_ADC_USE_ADC1 TRUE
diff --git a/keyboards/cipulot/ec_vero/post_rules.mk b/keyboards/cipulot/ec_vero/post_rules.mk
new file mode 100644
index 00000000000..d726a112a8c
--- /dev/null
+++ b/keyboards/cipulot/ec_vero/post_rules.mk
@@ -0,0 +1,3 @@
+ifeq ($(strip $(VIA_ENABLE)), yes)
+ SRC += keyboards/cipulot/common/via_ec.c
+endif
diff --git a/keyboards/cipulot/ec_vero/readme.md b/keyboards/cipulot/ec_vero/readme.md
new file mode 100644
index 00000000000..590423fa023
--- /dev/null
+++ b/keyboards/cipulot/ec_vero/readme.md
@@ -0,0 +1,26 @@
+# Vero EC
+
+
+
+EC version of the Vero R2 keyboard.
+
+* Keyboard Maintainer: [cipulot](https://github.com/cipulot)
+* Hardware Supported: Vero EC PCB
+* Hardware Availability: [Antipode](https://www.antipode.no/)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make cipulot/ec_vero:default
+
+Flashing example for this keyboard:
+
+ make cipulot/ec_vero: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:
+
+* **Physical reset**: Long short the exposed pads on the top of the PCB
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
diff --git a/keyboards/cipulot/ec_vero/rules.mk b/keyboards/cipulot/ec_vero/rules.mk
new file mode 100644
index 00000000000..ce525670a68
--- /dev/null
+++ b/keyboards/cipulot/ec_vero/rules.mk
@@ -0,0 +1,5 @@
+CUSTOM_MATRIX = lite
+ANALOG_DRIVER_REQUIRED = yes
+VPATH += keyboards/cipulot/common
+SRC += matrix.c ec_board.c ec_switch_matrix.c
+OPT = 3
diff --git a/keyboards/cipulot/ec_virgo/config.h b/keyboards/cipulot/ec_virgo/config.h
new file mode 100644
index 00000000000..2fce8cd7fa7
--- /dev/null
+++ b/keyboards/cipulot/ec_virgo/config.h
@@ -0,0 +1,66 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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 MATRIX_ROWS 6
+#define MATRIX_COLS 18
+
+#define MATRIX_ROW_PINS \
+ { B6, B7, B5, B4, B3, A15 }
+
+#define AMUX_COUNT 2
+#define AMUX_MAX_COLS_COUNT 16
+
+#define AMUX_EN_PINS \
+ { A9, A8 }
+
+#define AMUX_SEL_PINS \
+ { B12, B13, B15, B14 }
+
+#define AMUX_COL_CHANNELS_SIZES \
+ { 7, 11 }
+
+#define AMUX_0_COL_CHANNELS \
+ { 2, 1, 0, 3, 5, 4, 7 }
+
+#define AMUX_1_COL_CHANNELS \
+ { 2, 1, 0, 15, 14, 13, 12, 8, 11, 10, 9 }
+
+#define AMUX_COL_CHANNELS AMUX_0_COL_CHANNELS, AMUX_1_COL_CHANNELS
+
+#define DISCHARGE_PIN A4
+#define ANALOG_PORT A3
+
+#define DEFAULT_ACTUATION_MODE 0
+#define DEFAULT_MODE_0_ACTUATION_LEVEL 550
+#define DEFAULT_MODE_0_RELEASE_LEVEL 500
+#define DEFAULT_MODE_1_INITIAL_DEADZONE_OFFSET DEFAULT_MODE_0_ACTUATION_LEVEL
+#define DEFAULT_MODE_1_ACTUATION_OFFSET 70
+#define DEFAULT_MODE_1_RELEASE_OFFSET 70
+#define DEFAULT_EXTREMUM 1023
+#define EXPECTED_NOISE_FLOOR 0
+#define NOISE_FLOOR_THRESHOLD 50
+#define BOTTOMING_CALIBRATION_THRESHOLD 50
+#define DEFAULT_NOISE_FLOOR_SAMPLING_COUNT 30
+#define DEFAULT_BOTTOMING_READING 1023
+#define DEFAULT_CALIBRATION_STARTER true
+
+#define DISCHARGE_TIME 10
+
+// #define DEBUG_MATRIX_SCAN_RATE
+
+#define EECONFIG_KB_DATA_SIZE 225
diff --git a/keyboards/cipulot/ec_virgo/halconf.h b/keyboards/cipulot/ec_virgo/halconf.h
new file mode 100644
index 00000000000..835d43b6a0a
--- /dev/null
+++ b/keyboards/cipulot/ec_virgo/halconf.h
@@ -0,0 +1,21 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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_ADC TRUE
+
+#include_next
diff --git a/keyboards/cipulot/ec_virgo/info.json b/keyboards/cipulot/ec_virgo/info.json
new file mode 100644
index 00000000000..6b37880181b
--- /dev/null
+++ b/keyboards/cipulot/ec_virgo/info.json
@@ -0,0 +1,136 @@
+{
+ "manufacturer": "Cipulot",
+ "keyboard_name": "Virgo EC",
+ "maintainer": "Cipulot",
+ "bootloader": "stm32-dfu",
+ "build": {
+ "lto": true
+ },
+ "diode_direction": "COL2ROW",
+ "eeprom": {
+ "wear_leveling": {
+ "backing_size": 4096
+ }
+ },
+ "features": {
+ "bootmagic": false,
+ "console": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true
+ },
+ "processor": "STM32F411",
+ "qmk": {
+ "locking": {
+ "enabled": true,
+ "resync": true
+ }
+ },
+ "usb": {
+ "device_version": "0.0.1",
+ "pid": "0x6BC0",
+ "shared_endpoint": {
+ "keyboard": true
+ },
+ "vid": "0x6369"
+ },
+ "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.5, "y": 0},
+ {"matrix": [0, 7], "x": 9, "y": 0},
+ {"matrix": [0, 8], "x": 10, "y": 0},
+ {"matrix": [0, 9], "x": 11, "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, 15], "x": 17.25, "y": 0},
+ {"matrix": [0, 16], "x": 18.25, "y": 0},
+ {"matrix": [0, 17], "x": 19.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": 9, "y": 1.5},
+ {"matrix": [1, 8], "x": 10, "y": 1.5},
+ {"matrix": [1, 9], "x": 11, "y": 1.5},
+ {"matrix": [1, 10], "x": 12, "y": 1.5},
+ {"matrix": [1, 11], "x": 13, "y": 1.5},
+ {"matrix": [1, 12], "x": 14, "y": 1.5},
+ {"matrix": [1, 13], "x": 15, "y": 1.5},
+ {"matrix": [1, 14], "x": 16, "y": 1.5},
+ {"matrix": [1, 15], "x": 17.25, "y": 1.5},
+ {"matrix": [1, 16], "x": 18.25, "y": 1.5},
+ {"matrix": [1, 17], "x": 19.25, "y": 1.5},
+ {"matrix": [2, 0], "x": 0, "y": 2.5, "w": 1.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": 8.5, "y": 2.5},
+ {"matrix": [2, 7], "x": 9.5, "y": 2.5},
+ {"matrix": [2, 8], "x": 10.5, "y": 2.5},
+ {"matrix": [2, 9], "x": 11.5, "y": 2.5},
+ {"matrix": [2, 10], "x": 12.5, "y": 2.5},
+ {"matrix": [2, 11], "x": 13.5, "y": 2.5},
+ {"matrix": [2, 12], "x": 14.5, "y": 2.5},
+ {"matrix": [2, 13], "x": 15.5, "y": 2.5},
+ {"matrix": [2, 14], "x": 16.5, "y": 2.5, "w": 0.5},
+ {"matrix": [2, 15], "x": 17.25, "y": 2.5},
+ {"matrix": [2, 16], "x": 18.25, "y": 2.5},
+ {"matrix": [2, 17], "x": 19.25, "y": 2.5},
+ {"matrix": [3, 0], "x": 0, "y": 3.5, "w": 1.75},
+ {"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": 8.75, "y": 3.5},
+ {"matrix": [3, 7], "x": 9.75, "y": 3.5},
+ {"matrix": [3, 8], "x": 10.75, "y": 3.5},
+ {"matrix": [3, 9], "x": 11.75, "y": 3.5},
+ {"matrix": [3, 10], "x": 12.75, "y": 3.5},
+ {"matrix": [3, 11], "x": 13.75, "y": 3.5},
+ {"matrix": [3, 12], "x": 14.75, "y": 3.5},
+ {"matrix": [3, 13], "x": 15.75, "y": 3.5, "w": 1.25},
+ {"matrix": [4, 0], "x": 0, "y": 4.5, "w": 1.25},
+ {"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": [5, 6], "x": 8.25, "y": 4.5},
+ {"matrix": [4, 7], "x": 9.25, "y": 4.5},
+ {"matrix": [4, 8], "x": 10.25, "y": 4.5},
+ {"matrix": [4, 9], "x": 11.25, "y": 4.5},
+ {"matrix": [4, 10], "x": 12.25, "y": 4.5},
+ {"matrix": [4, 11], "x": 13.25, "y": 4.5},
+ {"matrix": [4, 13], "x": 14.25, "y": 4.5, "w": 1.75},
+ {"matrix": [4, 14], "x": 16, "y": 4.5},
+ {"matrix": [4, 16], "x": 18.25, "y": 4.5},
+ {"matrix": [5, 0], "x": 0, "y": 5.5, "w": 1.5},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.5, "w": 1.25},
+ {"matrix": [5, 3], "x": 3.75, "y": 5.5, "w": 1.25},
+ {"matrix": [5, 5], "x": 5, "y": 5.5, "w": 2.25},
+ {"matrix": [5, 7], "x": 8.25, "y": 5.5, "w": 2.75},
+ {"matrix": [5, 9], "x": 11, "y": 5.5, "w": 1.25},
+ {"matrix": [5, 10], "x": 12.25, "y": 5.5, "w": 1.25},
+ {"matrix": [5, 13], "x": 14.5, "y": 5.5, "w": 1.5},
+ {"matrix": [5, 15], "x": 17.25, "y": 5.5},
+ {"matrix": [5, 16], "x": 18.25, "y": 5.5},
+ {"matrix": [5, 17], "x": 19.25, "y": 5.5}
+ ]
+ }
+ }
+}
diff --git a/keyboards/cipulot/ec_virgo/keymaps/default/keymap.c b/keyboards/cipulot/ec_virgo/keymaps/default/keymap.c
new file mode 100644
index 00000000000..f176ec71dc0
--- /dev/null
+++ b/keyboards/cipulot/ec_virgo/keymaps/default/keymap.c
@@ -0,0 +1,37 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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] = {
+ // clang-format off
+ [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_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_ENTER, 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_NUHS, KC_ENTER,
+ KC_LSFT, KC_NUBS, 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_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT),
+ [1] = LAYOUT(
+ QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______)
+
+ // clang-format on
+};
diff --git a/keyboards/cipulot/ec_virgo/keymaps/via/keymap.c b/keyboards/cipulot/ec_virgo/keymaps/via/keymap.c
new file mode 100644
index 00000000000..f176ec71dc0
--- /dev/null
+++ b/keyboards/cipulot/ec_virgo/keymaps/via/keymap.c
@@ -0,0 +1,37 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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] = {
+ // clang-format off
+ [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_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_ENTER, 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_NUHS, KC_ENTER,
+ KC_LSFT, KC_NUBS, 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_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT),
+ [1] = LAYOUT(
+ QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______)
+
+ // clang-format on
+};
diff --git a/keyboards/cipulot/ec_virgo/keymaps/via/rules.mk b/keyboards/cipulot/ec_virgo/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/cipulot/ec_virgo/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/cipulot/ec_virgo/mcuconf.h b/keyboards/cipulot/ec_virgo/mcuconf.h
new file mode 100644
index 00000000000..fa3c955e0d8
--- /dev/null
+++ b/keyboards/cipulot/ec_virgo/mcuconf.h
@@ -0,0 +1,22 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 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 STM32_ADC_USE_ADC1
+#define STM32_ADC_USE_ADC1 TRUE
diff --git a/keyboards/cipulot/ec_virgo/post_rules.mk b/keyboards/cipulot/ec_virgo/post_rules.mk
new file mode 100644
index 00000000000..d726a112a8c
--- /dev/null
+++ b/keyboards/cipulot/ec_virgo/post_rules.mk
@@ -0,0 +1,3 @@
+ifeq ($(strip $(VIA_ENABLE)), yes)
+ SRC += keyboards/cipulot/common/via_ec.c
+endif
diff --git a/keyboards/cipulot/ec_virgo/readme.md b/keyboards/cipulot/ec_virgo/readme.md
new file mode 100644
index 00000000000..ddf976ca792
--- /dev/null
+++ b/keyboards/cipulot/ec_virgo/readme.md
@@ -0,0 +1,26 @@
+# Virgo EC
+
+
+
+EC version of the Virgo keyboard.
+
+* Keyboard Maintainer: [cipulot](https://github.com/cipulot)
+* Hardware Supported: Virgo EC PCB
+* Hardware Availability: [Antipode](https://www.antipode.no/)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make cipulot/ec_virgo:default
+
+Flashing example for this keyboard:
+
+ make cipulot/ec_virgo: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:
+
+* **Physical reset**: Long short the exposed pads on the top of the PCB
+* **Keycode in layout**: Press the key mapped to QK_BOOT if it is available
diff --git a/keyboards/cipulot/ec_virgo/rules.mk b/keyboards/cipulot/ec_virgo/rules.mk
new file mode 100644
index 00000000000..ce525670a68
--- /dev/null
+++ b/keyboards/cipulot/ec_virgo/rules.mk
@@ -0,0 +1,5 @@
+CUSTOM_MATRIX = lite
+ANALOG_DRIVER_REQUIRED = yes
+VPATH += keyboards/cipulot/common
+SRC += matrix.c ec_board.c ec_switch_matrix.c
+OPT = 3
diff --git a/keyboards/cipulot/kallos/info.json b/keyboards/cipulot/kallos/info.json
index b2f265c13fd..77330c2a66d 100644
--- a/keyboards/cipulot/kallos/info.json
+++ b/keyboards/cipulot/kallos/info.json
@@ -30,6 +30,12 @@
"cols": ["F5", "F6", "C6", "B6", "B5", "B4", "D7", "D6", "D4", "D5", "D3", "F7", "D2", "D1", "B7"],
"rows": ["B3", "B2", "F0", "C7", "F4", "F1"]
},
+ "qmk": {
+ "locking": {
+ "enabled": true,
+ "resync": true
+ }
+ },
"diode_direction": "COL2ROW",
"processor": "atmega32u4",
"bootloader": "atmel-dfu",
diff --git a/keyboards/cipulot/kawayo/info.json b/keyboards/cipulot/kawayo/info.json
index 85a5f81c2b3..93c362d6649 100644
--- a/keyboards/cipulot/kawayo/info.json
+++ b/keyboards/cipulot/kawayo/info.json
@@ -12,6 +12,12 @@
"cols": ["B10", "A0", "B9", "B8", "B7", "B6", "B5", "B4", "B3", "A15", "A14", "A4", "A3", "A2", "A1"],
"rows": ["B1", "B12", "C13", "A7", "B0"]
},
+ "qmk": {
+ "locking": {
+ "enabled": true,
+ "resync": true
+ }
+ },
"diode_direction": "COL2ROW",
"processor": "STM32F411",
"bootloader": "stm32-dfu",
diff --git a/keyboards/cipulot/rf_r1_8_9xu/config.h b/keyboards/cipulot/rf_r1_8_9xu/config.h
index fbd65f259fd..cd98ff7f3da 100644
--- a/keyboards/cipulot/rf_r1_8_9xu/config.h
+++ b/keyboards/cipulot/rf_r1_8_9xu/config.h
@@ -63,9 +63,3 @@
// #define DEBUG_MATRIX_SCAN_RATE
#define DYNAMIC_KEYMAP_LAYER_COUNT 3
#define EECONFIG_KB_DATA_SIZE 201
-
-/* 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
diff --git a/keyboards/cipulot/rf_r1_8_9xu/info.json b/keyboards/cipulot/rf_r1_8_9xu/info.json
index 6d3ab8b7091..4c1a0e4384c 100644
--- a/keyboards/cipulot/rf_r1_8_9xu/info.json
+++ b/keyboards/cipulot/rf_r1_8_9xu/info.json
@@ -6,6 +6,12 @@
"build": {
"lto": true
},
+ "qmk": {
+ "locking": {
+ "enabled": true,
+ "resync": true
+ }
+ },
"diode_direction": "COL2ROW",
"features": {
"bootmagic": false,
@@ -47,7 +53,6 @@
},
"vid": "0x6369"
},
- "community_layouts": ["tkl_jis", "tkl_iso_tsangan", "tkl_ansi_tsangan"],
"layouts": {
"LAYOUT_all": {
"layout": [
diff --git a/keyboards/cipulot/rf_r1_8_9xu/rules.mk b/keyboards/cipulot/rf_r1_8_9xu/rules.mk
index ab6c37cad43..318e0215ce9 100644
--- a/keyboards/cipulot/rf_r1_8_9xu/rules.mk
+++ b/keyboards/cipulot/rf_r1_8_9xu/rules.mk
@@ -1,4 +1,5 @@
CUSTOM_MATRIX = lite
ANALOG_DRIVER_REQUIRED = yes
-SRC += keyboards/cipulot/common/matrix.c keyboards/cipulot/common/ec_board.c keyboards/cipulot/common/ec_switch_matrix.c
+VPATH += keyboards/cipulot/common
+SRC += matrix.c ec_board.c ec_switch_matrix.c
OPT = 2
diff --git a/keyboards/dcpedit/masonry/info.json b/keyboards/dcpedit/masonry/info.json
new file mode 100644
index 00000000000..2d25f726219
--- /dev/null
+++ b/keyboards/dcpedit/masonry/info.json
@@ -0,0 +1,79 @@
+{
+ "manufacturer": "dcpedit",
+ "keyboard_name": "Masonry",
+ "maintainer": "dcpedit",
+ "bootloader": "stm32-dfu",
+ "diode_direction": "COL2ROW",
+ "dynamic_keymap": {
+ "layer_count": 2
+ },
+ "features": {
+ "bootmagic": true,
+ "extrakey": true,
+ "mousekey": true
+ },
+ "matrix_pins": {
+ "cols": ["A8", "B15", "B14", "B13", "B12", "A2"],
+ "rows": ["A9", "A0", "F0", "C15", "A10", "F1", "A1", "C14"]
+ },
+ "processor": "STM32F072",
+ "url": "https://github.com/dcpedit/masonry",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x177A",
+ "vid": "0xDC9E"
+ },
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label": "0,0", "matrix": [0, 0], "x": 0, "y": 0},
+ {"label": "4,0", "matrix": [4, 0], "x": 1, "y": 0},
+ {"label": "0,1", "matrix": [0, 1], "x": 2, "y": 0},
+ {"label": "4,1", "matrix": [4, 1], "x": 3, "y": 0},
+ {"label": "0,2", "matrix": [0, 2], "x": 4, "y": 0},
+ {"label": "4,2", "matrix": [4, 2], "x": 5, "y": 0},
+ {"label": "0,3", "matrix": [0, 3], "x": 6, "y": 0},
+ {"label": "4,3", "matrix": [4, 3], "x": 7, "y": 0},
+ {"label": "0,4", "matrix": [0, 4], "x": 8, "y": 0},
+ {"label": "4,4", "matrix": [4, 4], "x": 9, "y": 0},
+ {"label": "0,5", "matrix": [0, 5], "x": 10, "y": 0},
+ {"label": "4,5", "matrix": [4, 5], "x": 11, "y": 0},
+
+ {"label": "1,0", "matrix": [1, 0], "x": 0, "y": 1.75},
+ {"label": "5,0", "matrix": [5, 0], "x": 1, "y": 1.5},
+ {"label": "1,1", "matrix": [1, 1], "x": 2, "y": 1.25},
+ {"label": "5,1", "matrix": [5, 1], "x": 3, "y": 1},
+ {"label": "1,2", "matrix": [1, 2], "x": 4, "y": 1.25},
+ {"label": "5,2", "matrix": [5, 2], "x": 5, "y": 1.25},
+ {"label": "1,3", "matrix": [1, 3], "x": 6, "y": 1.25},
+ {"label": "5,3", "matrix": [5, 3], "x": 7, "y": 1.25},
+ {"label": "1,4", "matrix": [1, 4], "x": 8, "y": 1},
+ {"label": "5,4", "matrix": [5, 4], "x": 9, "y": 1.25},
+ {"label": "1,5", "matrix": [1, 5], "x": 10, "y": 1.5},
+ {"label": "5,5", "matrix": [5, 5], "x": 11, "y": 1.75},
+
+ {"label": "2,0", "matrix": [2, 0], "x": 0, "y": 2.75},
+ {"label": "6,0", "matrix": [6, 0], "x": 1, "y": 2.5},
+ {"label": "2,1", "matrix": [2, 1], "x": 2, "y": 2.25},
+ {"label": "6,1", "matrix": [6, 1], "x": 3, "y": 2},
+ {"label": "2,2", "matrix": [2, 2], "x": 4, "y": 2.25},
+ {"label": "6,2", "matrix": [6, 2], "x": 5, "y": 2.25},
+ {"label": "2,3", "matrix": [2, 3], "x": 6, "y": 2.25},
+ {"label": "6,3", "matrix": [6, 3], "x": 7, "y": 2.25},
+ {"label": "2,4", "matrix": [2, 4], "x": 8, "y": 2},
+ {"label": "6,4", "matrix": [6, 4], "x": 9, "y": 2.25},
+ {"label": "2,5", "matrix": [2, 5], "x": 10, "y": 2.5},
+ {"label": "6,5", "matrix": [6, 5], "x": 11, "y": 2.75},
+
+ {"label": "3,1", "matrix": [3, 1], "x": 2, "y": 3.25},
+ {"label": "7,1", "matrix": [7, 1], "x": 3, "y": 3.25},
+ {"label": "3,2", "matrix": [3, 2], "x": 4, "y": 3.25},
+ {"label": "7,2", "matrix": [7, 2], "x": 5, "y": 3.25},
+ {"label": "3,3", "matrix": [3, 3], "x": 6, "y": 3.25},
+ {"label": "7,3", "matrix": [7, 3], "x": 7, "y": 3.25},
+ {"label": "3,4", "matrix": [3, 4], "x": 8, "y": 3.25},
+ {"label": "7,4", "matrix": [7, 4], "x": 9, "y": 3.25}
+ ]
+ }
+ }
+}
diff --git a/keyboards/dcpedit/masonry/keymaps/default/keymap.json b/keyboards/dcpedit/masonry/keymaps/default/keymap.json
new file mode 100644
index 00000000000..6da346bb917
--- /dev/null
+++ b/keyboards/dcpedit/masonry/keymaps/default/keymap.json
@@ -0,0 +1,21 @@
+{
+ "keyboard": "dcpedit/masonry",
+ "keymap": "default",
+ "author": "dcpedit",
+ "version": 1,
+ "layout": "LAYOUT",
+ "layers": [
+ [
+ "KC_ESC", "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", "KC_QUOT",
+ "KC_TAB", "KC_A", "KC_S", "KC_D", "KC_F", "KC_G", "KC_H", "KC_J", "KC_K", "KC_L", "KC_SCLN", "KC_ENT",
+ "KC_LSFT", "KC_Z", "KC_X", "KC_C", "KC_V", "KC_B", "KC_N", "KC_M", "KC_COMM", "KC_DOT", "KC_SLSH", "KC_RSFT",
+ "KC_LCTL", "KC_LGUI", "LT(1,KC_BSPC)", "KC_BSPC", "KC_SPC", "LT(1,KC_SPC)", "KC_RALT", "KC_RGUI"
+ ],
+ [
+ "KC_GRV" , "KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0", "KC_RGUI",
+ "KC_LCTL", "KC_LEFT", "KC_DOWN", "KC_UP", "KC_RGHT", "KC_HOME", "KC_END", "KC_MINS", "KC_EQL", "KC_LBRC", "KC_RBRC", "KC_RALT",
+ "_______", "_______", "_______", "_______", "_______", "_______", "KC_PGDN", "KC_PGUP", "_______", "_______", "KC_BSLS", "_______",
+ "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______"
+ ]
+ ]
+}
\ No newline at end of file
diff --git a/keyboards/dcpedit/masonry/keymaps/via/keymap.json b/keyboards/dcpedit/masonry/keymaps/via/keymap.json
new file mode 100644
index 00000000000..76dfde65659
--- /dev/null
+++ b/keyboards/dcpedit/masonry/keymaps/via/keymap.json
@@ -0,0 +1,26 @@
+{
+ "keyboard": "dcpedit/masonry",
+ "keymap": "default",
+ "author": "dcpedit",
+ "version": 1,
+ "config": {
+ "features": {
+ "via": true
+ }
+ },
+ "layout": "LAYOUT",
+ "layers": [
+ [
+ "KC_ESC", "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", "KC_QUOT",
+ "KC_TAB", "KC_A", "KC_S", "KC_D", "KC_F", "KC_G", "KC_H", "KC_J", "KC_K", "KC_L", "KC_SCLN", "KC_ENT",
+ "KC_LSFT", "KC_Z", "KC_X", "KC_C", "KC_V", "KC_B", "KC_N", "KC_M", "KC_COMM", "KC_DOT", "KC_SLSH", "KC_RSFT",
+ "KC_LCTL", "KC_LGUI", "LT(1,KC_BSPC)", "KC_BSPC", "KC_SPC", "LT(1,KC_SPC)", "KC_RALT", "KC_RGUI"
+ ],
+ [
+ "KC_GRV" , "KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0", "KC_RGUI",
+ "KC_LCTL", "KC_LEFT", "KC_DOWN", "KC_UP", "KC_RGHT", "KC_HOME", "KC_END", "KC_MINS", "KC_EQL", "KC_LBRC", "KC_RBRC", "KC_RALT",
+ "_______", "_______", "_______", "_______", "_______", "_______", "KC_PGDN", "KC_PGUP", "_______", "_______", "KC_BSLS", "_______",
+ "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______"
+ ]
+ ]
+}
\ No newline at end of file
diff --git a/keyboards/dcpedit/masonry/readme.md b/keyboards/dcpedit/masonry/readme.md
new file mode 100644
index 00000000000..9ba7a1597e5
--- /dev/null
+++ b/keyboards/dcpedit/masonry/readme.md
@@ -0,0 +1,27 @@
+# Masonry
+
+
+
+Masonry is a 40% ergoish columnar keyboard projected on a rectangular keyboard shape.
+
+* Keyboard Maintainer: [dcpedit](https://github.com/dcpedit)
+* Hardware Supported: STM32F072
+* Hardware Availability: https://github.com/dcpedit/masonry
+
+Make example for this keyboard (after setting up your build environment):
+
+ make dcpedit/masonry:default
+
+Flashing example for this keyboard:
+
+ make dcpedit/masonry: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/masonry/rules.mk b/keyboards/dcpedit/masonry/rules.mk
new file mode 100644
index 00000000000..cfa2d9632f9
--- /dev/null
+++ b/keyboards/dcpedit/masonry/rules.mk
@@ -0,0 +1 @@
+# Intentionally left blank
\ No newline at end of file
diff --git a/keyboards/druah/dk_saver_redux/info.json b/keyboards/druah/dk_saver_redux/info.json
new file mode 100644
index 00000000000..6c76e107565
--- /dev/null
+++ b/keyboards/druah/dk_saver_redux/info.json
@@ -0,0 +1,323 @@
+{
+ "manufacturer": "KBDMania",
+ "keyboard_name": "DK Saver",
+ "maintainer": "Druah",
+ "backlight": {
+ "breathing": true,
+ "levels": 10,
+ "pin": "B7"
+ },
+ "bootloader": "atmel-dfu",
+ "build": {
+ "lto": true
+ },
+ "diode_direction": "COL2ROW",
+ "features": {
+ "backlight": true,
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true
+ },
+ "indicators": {
+ "caps_lock": "C2",
+ "scroll_lock": "C1"
+ },
+ "matrix_pins": {
+ "cols": ["F5", "F6", "F7", "A1", "A2", "B5", "B4", "B3", "B2", "F2", "F1", "F0", "F4", "B1", "C5", "C6", "C0"],
+ "rows": ["C3", "F3", "B6", "A0", "C7", "C4"]
+ },
+ "processor": "at90usb646",
+ "qmk": {
+ "locking": {
+ "enabled": true,
+ "resync": true
+ }
+ },
+ "url": "https://druah.moe",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x0002",
+ "vid": "0x444E"
+ },
+ "community_layouts": ["tkl_f13_ansi", "tkl_f13_ansi_tsangan"],
+ "layout_aliases": {
+ "LAYOUT_all": "LAYOUT_tkl_f13_ansi"
+ },
+ "layouts": {
+ "LAYOUT_tkl_f13_ansi": {
+ "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.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.75, "y": 0},
+ {"matrix": [0, 10], "x": 10.75, "y": 0},
+ {"matrix": [0, 11], "x": 11.75, "y": 0},
+ {"matrix": [0, 12], "x": 12.75, "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.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, 14], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 15], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 16], "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, 14], "x": 15.25, "y": 2.25},
+ {"matrix": [2, 15], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 16], "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, 13], "x": 12.25, "y": 4.25, "w": 2.75},
+ {"matrix": [4, 15], "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, 7], "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, 14], "x": 15.25, "y": 5.25},
+ {"matrix": [5, 15], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 16], "x": 17.25, "y": 5.25}
+ ]
+ },
+ "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, 5], "x": 5.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.75, "y": 0},
+ {"matrix": [0, 10], "x": 10.75, "y": 0},
+ {"matrix": [0, 11], "x": 11.75, "y": 0},
+ {"matrix": [0, 12], "x": 12.75, "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.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, 14], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 15], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 16], "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, 14], "x": 15.25, "y": 2.25},
+ {"matrix": [2, 15], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 16], "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, 13], "x": 12.25, "y": 4.25, "w": 2.75},
+ {"matrix": [4, 15], "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, 7], "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, 14], "x": 15.25, "y": 5.25},
+ {"matrix": [5, 15], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 16], "x": 17.25, "y": 5.25}
+ ]
+ },
+ "LAYOUT_tkl_f13_ansi_wkl": {
+ "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.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.75, "y": 0},
+ {"matrix": [0, 10], "x": 10.75, "y": 0},
+ {"matrix": [0, 11], "x": 11.75, "y": 0},
+ {"matrix": [0, 12], "x": 12.75, "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.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, 14], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 15], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 16], "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, 14], "x": 15.25, "y": 2.25},
+ {"matrix": [2, 15], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 16], "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, 13], "x": 12.25, "y": 4.25, "w": 2.75},
+ {"matrix": [4, 15], "x": 16.25, "y": 4.25},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 2], "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": 13.5, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 14], "x": 15.25, "y": 5.25},
+ {"matrix": [5, 15], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 16], "x": 17.25, "y": 5.25}
+ ]
+ }
+ }
+}
diff --git a/keyboards/druah/dk_saver_redux/keymaps/default/keymap.c b/keyboards/druah/dk_saver_redux/keymaps/default/keymap.c
new file mode 100644
index 00000000000..cf959d606a8
--- /dev/null
+++ b/keyboards/druah/dk_saver_redux/keymaps/default/keymap.c
@@ -0,0 +1,32 @@
+// Copyright 2024 Druah (@Druah)
+// 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││F13││PSc│Scr│Pse│
+ * └───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘└───┴───┴───┘
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐┌───┬───┬───┐
+ * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Backsp││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 │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ ┌───┐
+ * │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift │ │ ↑ │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤┌───┼───┼───┐
+ * │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_F13, 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, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ )
+};
diff --git a/keyboards/druah/dk_saver_redux/keymaps/via/keymap.c b/keyboards/druah/dk_saver_redux/keymaps/via/keymap.c
new file mode 100644
index 00000000000..cf959d606a8
--- /dev/null
+++ b/keyboards/druah/dk_saver_redux/keymaps/via/keymap.c
@@ -0,0 +1,32 @@
+// Copyright 2024 Druah (@Druah)
+// 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││F13││PSc│Scr│Pse│
+ * └───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘└───┴───┴───┘
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐┌───┬───┬───┐
+ * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Backsp││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 │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ ┌───┐
+ * │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift │ │ ↑ │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤┌───┼───┼───┐
+ * │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_F13, 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, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ )
+};
diff --git a/keyboards/druah/dk_saver_redux/keymaps/via/rules.mk b/keyboards/druah/dk_saver_redux/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/druah/dk_saver_redux/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/druah/dk_saver_redux/readme.md b/keyboards/druah/dk_saver_redux/readme.md
new file mode 100644
index 00000000000..0929182b880
--- /dev/null
+++ b/keyboards/druah/dk_saver_redux/readme.md
@@ -0,0 +1,27 @@
+# DK Saver Redux
+
+
+
+A replacement TKL PCB for the DK Saver keyboard
+
+* Keyboard Maintainer: [Druah](https://github.com/Druah)
+* Hardware Supported: DK Saver Redux
+* Hardware Availability: Private buy
+
+Make example for this keyboard (after setting up your build environment):
+
+ make druah/dk_saver_redux:default
+
+Flashing example for this keyboard:
+
+ make druah/dk_saver_redux: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 (the Escape/top left key) and plug in the keyboard
+* **Physical reset button**: Briefly press the button on the back of the PCB labelled with "RESET"
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
diff --git a/keyboards/druah/dk_saver_redux/rules.mk b/keyboards/druah/dk_saver_redux/rules.mk
new file mode 100644
index 00000000000..6e7633bfe01
--- /dev/null
+++ b/keyboards/druah/dk_saver_redux/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
diff --git a/keyboards/epomaker/tide65/info.json b/keyboards/epomaker/tide65/info.json
index 2715b923f47..60f1b46f708 100644
--- a/keyboards/epomaker/tide65/info.json
+++ b/keyboards/epomaker/tide65/info.json
@@ -184,7 +184,7 @@
{"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": [1, 14], "x": 15, "y": 1.25},
+ {"matrix": [1, 14], "x": 15, "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},
@@ -197,8 +197,8 @@
{"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": 1.75},
- {"matrix": [2, 14], "x": 15, "y": 2.25},
+ {"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
+ {"matrix": [2, 14], "x": 15, "y": 2},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [3, 1], "x": 2.25, "y": 3},
{"matrix": [3, 2], "x": 3.25, "y": 3},
@@ -217,8 +217,8 @@
{"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25},
{"matrix": [4, 3], "x": 3.75, "y": 4, "w": 2.25},
- {"matrix": [4, 5], "x": 6, "y": 3.75, "w": 1.25},
- {"matrix": [4, 4], "x": 6, "y": 4, "w": 1.25},
+ {"matrix": [4, 5], "x": 6, "y": 4, "w": 1.25, "h": 0.5},
+ {"matrix": [4, 4], "x": 6, "y": 4.5, "w": 1.25, "h": 0.5},
{"matrix": [4, 6], "x": 7.25, "y": 4, "w": 2.75},
{"matrix": [4, 9], "x": 10, "y": 4, "w": 1.25},
{"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25},
diff --git a/keyboards/era/linx3/n86/info.json b/keyboards/era/linx3/n86/info.json
index 40e1f78baaa..c0b8b5525a1 100644
--- a/keyboards/era/linx3/n86/info.json
+++ b/keyboards/era/linx3/n86/info.json
@@ -171,100 +171,11 @@
"driver": "vendor",
"pin": "GP4"
},
+ "layout_aliases": {
+ "LAYOUT_all": "LAYOUT_tkl_ansi_tsangan_split_bs_rshift"
+ },
"community_layouts": ["tkl_ansi_tsangan", "tkl_ansi_tsangan_split_bs_rshift"],
"layouts": {
- "LAYOUT_all": {
- "layout": [
- {"matrix": [0, 0], "x": 0, "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.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.75, "y": 0},
- {"matrix": [0, 10], "x": 10.75, "y": 0},
- {"matrix": [0, 11], "x": 11.75, "y": 0},
- {"matrix": [0, 12], "x": 12.75, "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.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": [2, 14], "x": 15.25, "y": 1.25},
- {"matrix": [1, 15], "x": 16.25, "y": 1.25},
- {"matrix": [1, 16], "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": [3, 14], "x": 15.25, "y": 2.25},
- {"matrix": [2, 15], "x": 16.25, "y": 2.25},
- {"matrix": [2, 16], "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": 11.75, "y": 3.25},
- {"matrix": [3, 11], "x": 12.75, "y": 3.25},
- {"matrix": [3, 13], "x": 13.75, "y": 3.25, "w": 1.25},
- {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.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, 15], "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, "w": 1},
- {"matrix": [5, 2], "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, 12], "x": 12.5, "y": 5.25, "w": 1},
- {"matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5},
- {"matrix": [5, 14], "x": 15.25, "y": 5.25},
- {"matrix": [5, 15], "x": 16.25, "y": 5.25},
- {"matrix": [5, 16], "x": 17.25, "y": 5.25}
- ]
- },
"LAYOUT_tkl_ansi_tsangan": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
@@ -346,9 +257,9 @@
{"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, 6], "x": 4, "y": 5.25, "w": 7},
- {"matrix": [5, 10], "x": 11, "y": 5.25, "w": 1.5},
- {"matrix": [5, 11], "x": 12.5, "y": 5.25},
+ {"matrix": [5, 7], "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, 14], "x": 15.25, "y": 5.25},
{"matrix": [5, 15], "x": 16.25, "y": 5.25},
@@ -438,9 +349,9 @@
{"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, 6], "x": 4, "y": 5.25, "w": 7},
- {"matrix": [5, 10], "x": 11, "y": 5.25, "w": 1.5},
- {"matrix": [5, 11], "x": 12.5, "y": 5.25},
+ {"matrix": [5, 7], "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, 14], "x": 15.25, "y": 5.25},
{"matrix": [5, 15], "x": 16.25, "y": 5.25},
@@ -448,4 +359,4 @@
]
}
}
-}
\ No newline at end of file
+}
diff --git a/keyboards/era/linx3/n87/config.h b/keyboards/era/linx3/n87/config.h
new file mode 100644
index 00000000000..8b294dd91b1
--- /dev/null
+++ b/keyboards/era/linx3/n87/config.h
@@ -0,0 +1,8 @@
+// Copyright 2024 Hyojin Bak (@eerraa)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+/* Reset */
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 2000U
\ No newline at end of file
diff --git a/keyboards/era/linx3/n87/info.json b/keyboards/era/linx3/n87/info.json
new file mode 100644
index 00000000000..548a37faddb
--- /dev/null
+++ b/keyboards/era/linx3/n87/info.json
@@ -0,0 +1,455 @@
+{
+ "manufacturer": "eerraa",
+ "keyboard_name": "N87",
+ "maintainer": "eerraa",
+ "bootloader": "rp2040",
+ "build": {
+ "debounce_type": "sym_defer_pk"
+ },
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgb_matrix": true
+ },
+ "matrix_pins": {
+ "cols": ["GP29", "GP28", "GP27", "GP26", "GP25", "GP24", "GP23", "GP22", "GP20", "GP19", "GP18", "GP17", "GP16", "GP21", "GP11", "GP9", "GP5"],
+ "rows": ["GP3", "GP2", "GP1", "GP0", "GP10", "GP8"]
+ },
+ "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, 16], "x": 224, "y": 0, "flags": 4},
+ {"matrix": [0, 15], "x": 211, "y": 0, "flags": 4},
+ {"matrix": [0, 14], "x": 198, "y": 0, "flags": 4},
+ {"matrix": [0, 13], "x": 182, "y": 0, "flags": 4},
+ {"matrix": [0, 12], "x": 169, "y": 0, "flags": 4},
+ {"matrix": [0, 11], "x": 156, "y": 0, "flags": 4},
+ {"matrix": [0, 10], "x": 143, "y": 0, "flags": 4},
+ {"matrix": [0, 9], "x": 123, "y": 0, "flags": 4},
+ {"matrix": [0, 8], "x": 110, "y": 0, "flags": 4},
+ {"matrix": [0, 7], "x": 97, "y": 0, "flags": 4},
+ {"matrix": [0, 6], "x": 84, "y": 0, "flags": 4},
+ {"matrix": [0, 5], "x": 65, "y": 0, "flags": 4},
+ {"matrix": [0, 4], "x": 52, "y": 0, "flags": 4},
+ {"matrix": [0, 3], "x": 39, "y": 0, "flags": 4},
+ {"matrix": [0, 2], "x": 26, "y": 0, "flags": 4},
+ {"matrix": [0, 0], "x": 0, "y": 0, "flags": 1},
+ {"matrix": [1, 0], "x": 0, "y": 15, "flags": 4},
+ {"matrix": [1, 1], "x": 13, "y": 15, "flags": 4},
+ {"matrix": [1, 2], "x": 26, "y": 15, "flags": 4},
+ {"matrix": [1, 3], "x": 39, "y": 15, "flags": 4},
+ {"matrix": [1, 4], "x": 52, "y": 15, "flags": 4},
+ {"matrix": [1, 5], "x": 65, "y": 15, "flags": 4},
+ {"matrix": [1, 6], "x": 78, "y": 15, "flags": 4},
+ {"matrix": [1, 7], "x": 91, "y": 15, "flags": 4},
+ {"matrix": [1, 8], "x": 104, "y": 15, "flags": 4},
+ {"matrix": [1, 9], "x": 117, "y": 15, "flags": 4},
+ {"matrix": [1, 10], "x": 130, "y": 15, "flags": 4},
+ {"matrix": [1, 11], "x": 143, "y": 15, "flags": 4},
+ {"matrix": [1, 12], "x": 156, "y": 15, "flags": 4},
+ {"matrix": [1, 13], "x": 175, "y": 15, "flags": 1},
+ {"matrix": [2, 14], "x": 198, "y": 15, "flags": 4},
+ {"matrix": [1, 15], "x": 211, "y": 15, "flags": 4},
+ {"matrix": [1, 16], "x": 224, "y": 15, "flags": 4},
+ {"matrix": [2, 16], "x": 224, "y": 27, "flags": 4},
+ {"matrix": [2, 15], "x": 211, "y": 27, "flags": 4},
+ {"matrix": [3, 14], "x": 198, "y": 27, "flags": 4},
+ {"matrix": [2, 13], "x": 179, "y": 27, "flags": 4},
+ {"matrix": [2, 12], "x": 162, "y": 27, "flags": 4},
+ {"matrix": [2, 11], "x": 149, "y": 27, "flags": 4},
+ {"matrix": [2, 10], "x": 136, "y": 27, "flags": 4},
+ {"matrix": [2, 9], "x": 123, "y": 27, "flags": 4},
+ {"matrix": [2, 8], "x": 110, "y": 27, "flags": 4},
+ {"matrix": [2, 7], "x": 97, "y": 27, "flags": 4},
+ {"matrix": [2, 6], "x": 84, "y": 27, "flags": 4},
+ {"matrix": [2, 5], "x": 71, "y": 27, "flags": 4},
+ {"matrix": [2, 4], "x": 58, "y": 27, "flags": 4},
+ {"matrix": [2, 3], "x": 45, "y": 27, "flags": 4},
+ {"matrix": [2, 2], "x": 32, "y": 27, "flags": 4},
+ {"matrix": [2, 1], "x": 19, "y": 27, "flags": 4},
+ {"matrix": [2, 0], "x": 3, "y": 27, "flags": 1},
+ {"matrix": [3, 0], "x": 2, "y": 40, "flags": 1},
+ {"matrix": [3, 1], "x": 23, "y": 40, "flags": 4},
+ {"matrix": [3, 2], "x": 36, "y": 40, "flags": 4},
+ {"matrix": [3, 3], "x": 49, "y": 40, "flags": 4},
+ {"matrix": [3, 4], "x": 62, "y": 40, "flags": 4},
+ {"matrix": [3, 5], "x": 75, "y": 40, "flags": 4},
+ {"matrix": [3, 6], "x": 88, "y": 40, "flags": 4},
+ {"matrix": [3, 7], "x": 101, "y": 40, "flags": 4},
+ {"matrix": [3, 8], "x": 114, "y": 40, "flags": 4},
+ {"matrix": [3, 9], "x": 127, "y": 40, "flags": 4},
+ {"matrix": [3, 10], "x": 140, "y": 40, "flags": 4},
+ {"matrix": [3, 11], "x": 153, "y": 40, "flags": 4},
+ {"matrix": [3, 13], "x": 174, "y": 40, "flags": 1},
+ {"matrix": [4, 15], "x": 211, "y": 52, "flags": 1},
+ {"matrix": [4, 13], "x": 182, "y": 52, "flags": 4},
+ {"matrix": [4, 12], "x": 170, "y": 52, "flags": 1},
+ {"matrix": [4, 11], "x": 146, "y": 52, "flags": 4},
+ {"matrix": [4, 10], "x": 133, "y": 52, "flags": 4},
+ {"matrix": [4, 9], "x": 120, "y": 52, "flags": 4},
+ {"matrix": [4, 8], "x": 107, "y": 52, "flags": 4},
+ {"matrix": [4, 7], "x": 94, "y": 52, "flags": 4},
+ {"matrix": [4, 6], "x": 81, "y": 52, "flags": 4},
+ {"matrix": [4, 5], "x": 68, "y": 52, "flags": 4},
+ {"matrix": [4, 4], "x": 55, "y": 52, "flags": 4},
+ {"matrix": [4, 3], "x": 42, "y": 52, "flags": 4},
+ {"matrix": [4, 2], "x": 29, "y": 52, "flags": 4},
+ {"matrix": [4, 0], "x": 8, "y": 52, "flags": 1},
+ {"matrix": [5, 0], "x": 2, "y": 64, "flags": 1},
+ {"matrix": [5, 1], "x": 18, "y": 64, "flags": 1},
+ {"matrix": [5, 2], "x": 34, "y": 64, "flags": 1},
+ {"x": 57, "y": 64, "flags": 4},
+ {"x": 70, "y": 64, "flags": 4},
+ {"matrix": [5, 6], "x": 83, "y": 64, "flags": 4},
+ {"x": 96, "y": 64, "flags": 4},
+ {"x": 109, "y": 64, "flags": 4},
+ {"matrix": [5, 10], "x": 131, "y": 64, "flags": 1},
+ {"matrix": [5, 11], "x": 148, "y": 64, "flags": 1},
+ {"matrix": [5, 12], "x": 164, "y": 64, "flags": 1},
+ {"matrix": [5, 13], "x": 180, "y": 64, "flags": 1},
+ {"matrix": [5, 14], "x": 198, "y": 64, "flags": 1},
+ {"matrix": [5, 15], "x": 211, "y": 64, "flags": 1},
+ {"matrix": [5, 16], "x": 224, "y": 64, "flags": 1}
+ ],
+ "sleep": true
+ },
+ "url": "",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x0009",
+ "vid": "0x4552"
+ },
+ "ws2812": {
+ "driver": "vendor",
+ "pin": "GP4"
+ },
+ "community_layouts": ["tkl_ansi", "tkl_ansi_split_bs_rshift"],
+ "layouts": {
+ "LAYOUT_all": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "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.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.75, "y": 0},
+ {"matrix": [0, 10], "x": 10.75, "y": 0},
+ {"matrix": [0, 11], "x": 11.75, "y": 0},
+ {"matrix": [0, 12], "x": 12.75, "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.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": [2, 14], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 15], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 16], "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": [3, 14], "x": 15.25, "y": 2.25},
+ {"matrix": [2, 15], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 16], "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, 15], "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, 6], "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, 14], "x": 15.25, "y": 5.25},
+ {"matrix": [5, 15], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 16], "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, 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.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": [2, 14], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 15], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 16], "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": [3, 14], "x": 15.25, "y": 2.25},
+ {"matrix": [2, 15], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 16], "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, 15], "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, 6], "x": 3.75, "y": 5.25, "w": 6.25},
+ {"matrix": [5, 9], "x": 10, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 10], "x": 11.25, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 11], "x": 12.5, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 13], "x": 13.75, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 14], "x": 15.25, "y": 5.25},
+ {"matrix": [5, 15], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 16], "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, 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.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": [2, 14], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 15], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 16], "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": [3, 14], "x": 15.25, "y": 2.25},
+ {"matrix": [2, 15], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 16], "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, 15], "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, 6], "x": 3.75, "y": 5.25, "w": 6.25},
+ {"matrix": [5, 9], "x": 10, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 10], "x": 11.25, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 11], "x": 12.5, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 13], "x": 13.75, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 14], "x": 15.25, "y": 5.25},
+ {"matrix": [5, 15], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 16], "x": 17.25, "y": 5.25}
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/keyboards/era/linx3/n87/keymaps/default/keymap.c b/keyboards/era/linx3/n87/keymaps/default/keymap.c
new file mode 100644
index 00000000000..a16e6a21105
--- /dev/null
+++ b/keyboards/era/linx3/n87/keymaps/default/keymap.c
@@ -0,0 +1,24 @@
+// Copyright 2024 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_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, 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_UP ,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC , KC_RALT, KC_RGUI, MO(1) , KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [1] = LAYOUT_all(
+ 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_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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/linx3/n87/keymaps/via/keymap.c b/keyboards/era/linx3/n87/keymaps/via/keymap.c
new file mode 100644
index 00000000000..a16e6a21105
--- /dev/null
+++ b/keyboards/era/linx3/n87/keymaps/via/keymap.c
@@ -0,0 +1,24 @@
+// Copyright 2024 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_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, 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_UP ,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC , KC_RALT, KC_RGUI, MO(1) , KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [1] = LAYOUT_all(
+ 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_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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/linx3/n87/keymaps/via/rules.mk b/keyboards/era/linx3/n87/keymaps/via/rules.mk
new file mode 100644
index 00000000000..036bd6d1c3e
--- /dev/null
+++ b/keyboards/era/linx3/n87/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/era/linx3/n87/readme.md b/keyboards/era/linx3/n87/readme.md
new file mode 100644
index 00000000000..ff5b29d3bd1
--- /dev/null
+++ b/keyboards/era/linx3/n87/readme.md
@@ -0,0 +1,23 @@
+# N87
+
+* Keyboard Maintainer: [ERA](https://github.com/eerraa)
+* Hardware supported: Syryan & Linx3
+* Hardware availability: [Syryan](https://srind.mysoho.com/) & [Linx3](https://allthatkeyboard.com)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make era/linx3/n87:default
+
+Flashing example for this keyboard:
+
+ make era/linx3/n87: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/linx3/n87/rules.mk b/keyboards/era/linx3/n87/rules.mk
new file mode 100644
index 00000000000..7ff128fa692
--- /dev/null
+++ b/keyboards/era/linx3/n87/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
\ No newline at end of file
diff --git a/keyboards/era/sirind/tomak/config.h b/keyboards/era/sirind/tomak/config.h
new file mode 100644
index 00000000000..7bb56107054
--- /dev/null
+++ b/keyboards/era/sirind/tomak/config.h
@@ -0,0 +1,16 @@
+// Copyright 2023 Hyojin Bak (@eerraa)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+/* Split configuration */
+#define SPLIT_HAND_PIN GP21
+#define USB_VBUS_PIN GP29
+#define SERIAL_USART_FULL_DUPLEX
+#define SERIAL_USART_TX_PIN GP0
+#define SERIAL_USART_RX_PIN GP1
+#define SERIAL_USART_PIN_SWAP
+
+/* Reset */
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 2000U
\ No newline at end of file
diff --git a/keyboards/era/sirind/tomak/info.json b/keyboards/era/sirind/tomak/info.json
new file mode 100644
index 00000000000..58025e67a18
--- /dev/null
+++ b/keyboards/era/sirind/tomak/info.json
@@ -0,0 +1,710 @@
+{
+ "manufacturer": "SIRIND",
+ "keyboard_name": "Tomak",
+ "maintainer": "eerraa",
+ "bootloader": "rp2040",
+ "build": {
+ "debounce_type": "sym_defer_pk"
+ },
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgb_matrix": true
+ },
+ "matrix_pins": {
+ "cols": ["GP16", "GP9", "GP8", "GP6", "GP5", "GP4", "GP3", "GP2", null, null, null],
+ "rows": ["GP27", "GP10", "GP11", "GP12", "GP13", "GP14"]
+ },
+ "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, 0], "x": 2, "y": 0, "flags": 1},
+ {"matrix": [0, 2], "x": 19, "y": 0, "flags": 4},
+ {"matrix": [0, 3], "x": 31, "y": 0, "flags": 4},
+ {"matrix": [0, 4], "x": 43, "y": 0, "flags": 4},
+ {"matrix": [0, 5], "x": 55, "y": 0, "flags": 4},
+ {"matrix": [0, 6], "x": 73, "y": 0, "flags": 4},
+ {"matrix": [0, 7], "x": 85, "y": 0, "flags": 4},
+ {"matrix": [1, 7], "x": 87, "y": 13, "flags": 4},
+ {"matrix": [1, 6], "x": 74, "y": 13, "flags": 4},
+ {"matrix": [1, 5], "x": 62, "y": 13, "flags": 4},
+ {"matrix": [1, 4], "x": 50, "y": 13, "flags": 4},
+ {"matrix": [1, 3], "x": 38, "y": 13, "flags": 4},
+ {"matrix": [1, 2], "x": 26, "y": 13, "flags": 4},
+ {"matrix": [1, 1], "x": 14, "y": 13, "flags": 4},
+ {"matrix": [1, 0], "x": 2, "y": 13, "flags": 4},
+ {"matrix": [2, 0], "x": 5, "y": 26, "flags": 1},
+ {"matrix": [2, 1], "x": 20, "y": 26, "flags": 4},
+ {"matrix": [2, 2], "x": 32, "y": 26, "flags": 4},
+ {"matrix": [2, 3], "x": 44, "y": 26, "flags": 4},
+ {"matrix": [2, 4], "x": 56, "y": 26, "flags": 4},
+ {"matrix": [2, 5], "x": 68, "y": 26, "flags": 4},
+ {"matrix": [2, 6], "x": 71, "y": 26, "flags": 4},
+ {"matrix": [3, 6], "x": 84, "y": 38, "flags": 4},
+ {"matrix": [3, 5], "x": 71, "y": 38, "flags": 4},
+ {"matrix": [3, 4], "x": 59, "y": 38, "flags": 4},
+ {"matrix": [3, 3], "x": 47, "y": 38, "flags": 4},
+ {"matrix": [3, 2], "x": 35, "y": 38, "flags": 4},
+ {"matrix": [3, 1], "x": 23, "y": 38, "flags": 4},
+ {"matrix": [3, 0], "x": 0, "y": 38, "flags": 1},
+ {"matrix": [4, 0], "x": 9, "y": 51, "flags": 1},
+ {"matrix": [4, 1], "x": 29, "y": 51, "flags": 4},
+ {"matrix": [4, 2], "x": 41, "y": 51, "flags": 4},
+ {"matrix": [4, 3], "x": 53, "y": 51, "flags": 4},
+ {"matrix": [4, 4], "x": 65, "y": 51, "flags": 4},
+ {"matrix": [4, 5], "x": 77, "y": 51, "flags": 4},
+ {"matrix": [5, 5], "x": 84, "y": 64, "flags": 1},
+ {"matrix": [5, 4], "x": 61, "y": 64, "flags": 4},
+ {"matrix": [5, 2], "x": 35, "y": 64, "flags": 1},
+ {"matrix": [5, 1], "x": 20, "y": 64, "flags": 1},
+ {"matrix": [5, 0], "x": 5, "y": 64, "flags": 1},
+ {"matrix": [6, 10], "x": 224, "y": 0, "flags": 4},
+ {"matrix": [6, 9], "x": 212, "y": 0, "flags": 4},
+ {"matrix": [6, 8], "x": 200, "y": 0, "flags": 4},
+ {"matrix": [6, 7], "x": 184, "y": 0, "flags": 4},
+ {"matrix": [6, 5], "x": 167, "y": 0, "flags": 4},
+ {"matrix": [6, 4], "x": 155, "y": 0, "flags": 4},
+ {"matrix": [6, 3], "x": 143, "y": 0, "flags": 4},
+ {"matrix": [6, 2], "x": 131, "y": 0, "flags": 4},
+ {"matrix": [6, 1], "x": 113, "y": 0, "flags": 4},
+ {"matrix": [6, 0], "x": 101, "y": 0, "flags": 4},
+ {"matrix": [7, 0], "x": 99, "y": 13, "flags": 4},
+ {"matrix": [7, 1], "x": 112, "y": 13, "flags": 4},
+ {"matrix": [7, 2], "x": 124, "y": 13, "flags": 4},
+ {"matrix": [7, 3], "x": 136, "y": 13, "flags": 4},
+ {"matrix": [7, 4], "x": 148, "y": 13, "flags": 4},
+ {"matrix": [7, 5], "x": 160, "y": 13, "flags": 4},
+ {"matrix": [7, 7], "x": 178, "y": 13, "flags": 1},
+ {"matrix": [7, 8], "x": 200, "y": 13, "flags": 4},
+ {"matrix": [7, 9], "x": 212, "y": 13, "flags": 4},
+ {"matrix": [7, 10], "x": 224, "y": 13, "flags": 4},
+ {"matrix": [8, 10], "x": 224, "y": 26, "flags": 4},
+ {"matrix": [8, 9], "x": 212, "y": 26, "flags": 4},
+ {"matrix": [8, 8], "x": 200, "y": 26, "flags": 4},
+ {"matrix": [8, 7], "x": 181, "y": 26, "flags": 4},
+ {"matrix": [8, 6], "x": 166, "y": 26, "flags": 4},
+ {"matrix": [8, 5], "x": 154, "y": 26, "flags": 4},
+ {"matrix": [8, 4], "x": 142, "y": 26, "flags": 4},
+ {"matrix": [8, 3], "x": 130, "y": 26, "flags": 4},
+ {"matrix": [8, 2], "x": 118, "y": 26, "flags": 4},
+ {"matrix": [8, 1], "x": 105, "y": 26, "flags": 4},
+ {"matrix": [8, 0], "x": 93, "y": 26, "flags": 4},
+ {"matrix": [9, 0], "x": 96, "y": 38, "flags": 4},
+ {"matrix": [9, 1], "x": 109, "y": 38, "flags": 4},
+ {"matrix": [9, 2], "x": 121, "y": 38, "flags": 4},
+ {"matrix": [9, 3], "x": 133, "y": 38, "flags": 4},
+ {"matrix": [9, 4], "x": 145, "y": 38, "flags": 4},
+ {"matrix": [9, 5], "x": 157, "y": 38, "flags": 4},
+ {"matrix": [9, 7], "x": 177, "y": 38, "flags": 1},
+ {"matrix": [10, 9], "x": 212, "y": 51, "flags": 4},
+ {"matrix": [10, 7], "x": 184, "y": 45, "flags": 1},
+ {"matrix": [10, 6], "x": 174, "y": 51, "flags": 1},
+ {"matrix": [10, 5], "x": 151, "y": 51, "flags": 4},
+ {"matrix": [10, 4], "x": 139, "y": 51, "flags": 4},
+ {"matrix": [10, 3], "x": 127, "y": 51, "flags": 4},
+ {"matrix": [10, 2], "x": 115, "y": 51, "flags": 4},
+ {"matrix": [10, 1], "x": 102, "y": 51, "flags": 4},
+ {"matrix": [10, 0], "x": 90, "y": 51, "flags": 4},
+ {"matrix": [11, 1], "x": 96, "y": 64, "flags": 1},
+ {"matrix": [11, 2], "x": 110, "y": 64, "flags": 4},
+ {"matrix": [11, 4], "x": 137, "y": 64, "flags": 1},
+ {"matrix": [11, 5], "x": 153, "y": 64, "flags": 1},
+ {"matrix": [11, 6], "x": 168, "y": 64, "flags": 1},
+ {"matrix": [11, 7], "x": 183, "y": 64, "flags": 1},
+ {"matrix": [11, 8], "x": 200, "y": 64, "flags": 1},
+ {"matrix": [11, 9], "x": 212, "y": 64, "flags": 1},
+ {"matrix": [11, 10], "x": 224, "y": 64, "flags": 1},
+ {"x": 224, "y": 40, "flags": 8},
+ {"x": 224, "y": 45, "flags": 8},
+ {"x": 224, "y": 50, "flags": 8}
+ ],
+ "max_brightness": 120,
+ "sleep": true,
+ "split_count": [40, 59]
+ },
+ "split": {
+ "bootmagic": {
+ "matrix": [6, 0]
+ },
+ "enabled": true,
+ "matrix_pins": {
+ "right": {
+ "cols": ["GP2", "GP3", "GP4", "GP5", "GP6", "GP7", "GP8", "GP9", "GP27", "GP17", "GP13"],
+ "rows": ["GP10", "GP11", "GP12", "GP28", "GP19", "GP16"]
+ }
+ },
+ "transport": {
+ "protocol": "serial_usart",
+ "sync": {
+ "indicators": true,
+ "layer_state": true,
+ "matrix_state": true
+ }
+ }
+ },
+ "url": "",
+ "usb": {
+ "device_version": "1.0.2",
+ "pid": "0x0006",
+ "vid": "0x4552"
+ },
+ "ws2812": {
+ "driver": "vendor",
+ "pin": "GP20"
+ },
+ "layout_aliases": {
+ "LAYOUT_all": "LAYOUT_split_tkl_ansi_split_rshift_bs_rspace",
+ "LAYOUT_ansi": "LAYOUT_split_tkl_ansi",
+ "LAYOUT_ansi_split_bs": "LAYOUT_split_tkl_ansi_split_bs",
+ "LAYOUT_ansi_split_rshift": "LAYOUT_split_tkl_ansi_split_rshift",
+ "LAYOUT_ansi_split_rshift_bs": "LAYOUT_split_tkl_ansi_split_rshift_bs"
+ },
+ "layouts": {
+ "LAYOUT_split_tkl_ansi": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 2], "x": 1.5, "y": 0},
+ {"matrix": [0, 3], "x": 2.5, "y": 0},
+ {"matrix": [0, 4], "x": 3.5, "y": 0},
+ {"matrix": [0, 5], "x": 4.5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [6, 0], "x": 9.5, "y": 0},
+ {"matrix": [6, 1], "x": 10.5, "y": 0},
+ {"matrix": [6, 2], "x": 12, "y": 0},
+ {"matrix": [6, 3], "x": 13, "y": 0},
+ {"matrix": [6, 4], "x": 14, "y": 0},
+ {"matrix": [6, 5], "x": 15, "y": 0},
+ {"matrix": [6, 7], "x": 16.5, "y": 0},
+ {"matrix": [6, 8], "x": 17.75, "y": 0},
+ {"matrix": [6, 9], "x": 18.75, "y": 0},
+ {"matrix": [6, 10], "x": 19.75, "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": [7, 0], "x": 9.5, "y": 1.5},
+ {"matrix": [7, 1], "x": 10.5, "y": 1.5},
+ {"matrix": [7, 2], "x": 11.5, "y": 1.5},
+ {"matrix": [7, 3], "x": 12.5, "y": 1.5},
+ {"matrix": [7, 4], "x": 13.5, "y": 1.5},
+ {"matrix": [7, 5], "x": 14.5, "y": 1.5},
+ {"matrix": [7, 7], "x": 15.5, "y": 1.5, "w": 2},
+ {"matrix": [7, 8], "x": 17.75, "y": 1.5},
+ {"matrix": [7, 9], "x": 18.75, "y": 1.5},
+ {"matrix": [7, 10], "x": 19.75, "y": 1.5},
+ {"matrix": [2, 0], "x": 0, "y": 2.5, "w": 1.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": [8, 0], "x": 9, "y": 2.5},
+ {"matrix": [8, 1], "x": 10, "y": 2.5},
+ {"matrix": [8, 2], "x": 11, "y": 2.5},
+ {"matrix": [8, 3], "x": 12, "y": 2.5},
+ {"matrix": [8, 4], "x": 13, "y": 2.5},
+ {"matrix": [8, 5], "x": 14, "y": 2.5},
+ {"matrix": [8, 6], "x": 15, "y": 2.5},
+ {"matrix": [8, 7], "x": 16, "y": 2.5, "w": 1.5},
+ {"matrix": [8, 8], "x": 17.75, "y": 2.5},
+ {"matrix": [8, 9], "x": 18.75, "y": 2.5},
+ {"matrix": [8, 10], "x": 19.75, "y": 2.5},
+ {"matrix": [3, 0], "x": 0, "y": 3.5, "w": 1.75},
+ {"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": [9, 0], "x": 9.25, "y": 3.5},
+ {"matrix": [9, 1], "x": 10.25, "y": 3.5},
+ {"matrix": [9, 2], "x": 11.25, "y": 3.5},
+ {"matrix": [9, 3], "x": 12.25, "y": 3.5},
+ {"matrix": [9, 4], "x": 13.25, "y": 3.5},
+ {"matrix": [9, 5], "x": 14.25, "y": 3.5},
+ {"matrix": [9, 7], "x": 15.25, "y": 3.5, "w": 2.25},
+ {"matrix": [4, 0], "x": 0, "y": 4.5, "w": 2.25},
+ {"matrix": [4, 1], "x": 2.25, "y": 4.5},
+ {"matrix": [4, 2], "x": 3.25, "y": 4.5},
+ {"matrix": [4, 3], "x": 4.25, "y": 4.5},
+ {"matrix": [4, 4], "x": 5.25, "y": 4.5},
+ {"matrix": [4, 5], "x": 6.25, "y": 4.5},
+ {"matrix": [10, 0], "x": 8.75, "y": 4.5},
+ {"matrix": [10, 1], "x": 9.75, "y": 4.5},
+ {"matrix": [10, 2], "x": 10.75, "y": 4.5},
+ {"matrix": [10, 3], "x": 11.75, "y": 4.5},
+ {"matrix": [10, 4], "x": 12.75, "y": 4.5},
+ {"matrix": [10, 5], "x": 13.75, "y": 4.5},
+ {"matrix": [10, 6], "x": 14.75, "y": 4.5, "w": 2.75},
+ {"matrix": [10, 9], "x": 18.75, "y": 4.5},
+ {"matrix": [5, 0], "x": 0, "y": 5.5, "w": 1.5},
+ {"matrix": [5, 1], "x": 1.5, "y": 5.5},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.5, "w": 1.5},
+ {"matrix": [5, 4], "x": 4, "y": 5.5, "w": 2.75},
+ {"matrix": [5, 5], "x": 6.75, "y": 5.5},
+ {"matrix": [11, 2], "x": 9.25, "y": 5.5, "w": 3.25},
+ {"matrix": [11, 4], "x": 12.5, "y": 5.5, "w": 1.25},
+ {"matrix": [11, 5], "x": 13.75, "y": 5.5, "w": 1.25},
+ {"matrix": [11, 6], "x": 15, "y": 5.5, "w": 1.25},
+ {"matrix": [11, 7], "x": 16.25, "y": 5.5, "w": 1.25},
+ {"matrix": [11, 8], "x": 17.75, "y": 5.5},
+ {"matrix": [11, 9], "x": 18.75, "y": 5.5},
+ {"matrix": [11, 10], "x": 19.75, "y": 5.5}
+ ]
+ },
+ "LAYOUT_split_tkl_ansi_split_bs": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 2], "x": 1.5, "y": 0},
+ {"matrix": [0, 3], "x": 2.5, "y": 0},
+ {"matrix": [0, 4], "x": 3.5, "y": 0},
+ {"matrix": [0, 5], "x": 4.5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [6, 0], "x": 9.5, "y": 0},
+ {"matrix": [6, 1], "x": 10.5, "y": 0},
+ {"matrix": [6, 2], "x": 12, "y": 0},
+ {"matrix": [6, 3], "x": 13, "y": 0},
+ {"matrix": [6, 4], "x": 14, "y": 0},
+ {"matrix": [6, 5], "x": 15, "y": 0},
+ {"matrix": [6, 7], "x": 16.5, "y": 0},
+ {"matrix": [6, 8], "x": 17.75, "y": 0},
+ {"matrix": [6, 9], "x": 18.75, "y": 0},
+ {"matrix": [6, 10], "x": 19.75, "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": [7, 0], "x": 9.5, "y": 1.5},
+ {"matrix": [7, 1], "x": 10.5, "y": 1.5},
+ {"matrix": [7, 2], "x": 11.5, "y": 1.5},
+ {"matrix": [7, 3], "x": 12.5, "y": 1.5},
+ {"matrix": [7, 4], "x": 13.5, "y": 1.5},
+ {"matrix": [7, 5], "x": 14.5, "y": 1.5},
+ {"matrix": [7, 6], "x": 15.5, "y": 1.5},
+ {"matrix": [7, 7], "x": 16.5, "y": 1.5},
+ {"matrix": [7, 8], "x": 17.75, "y": 1.5},
+ {"matrix": [7, 9], "x": 18.75, "y": 1.5},
+ {"matrix": [7, 10], "x": 19.75, "y": 1.5},
+ {"matrix": [2, 0], "x": 0, "y": 2.5, "w": 1.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": [8, 0], "x": 9, "y": 2.5},
+ {"matrix": [8, 1], "x": 10, "y": 2.5},
+ {"matrix": [8, 2], "x": 11, "y": 2.5},
+ {"matrix": [8, 3], "x": 12, "y": 2.5},
+ {"matrix": [8, 4], "x": 13, "y": 2.5},
+ {"matrix": [8, 5], "x": 14, "y": 2.5},
+ {"matrix": [8, 6], "x": 15, "y": 2.5},
+ {"matrix": [8, 7], "x": 16, "y": 2.5, "w": 1.5},
+ {"matrix": [8, 8], "x": 17.75, "y": 2.5},
+ {"matrix": [8, 9], "x": 18.75, "y": 2.5},
+ {"matrix": [8, 10], "x": 19.75, "y": 2.5},
+ {"matrix": [3, 0], "x": 0, "y": 3.5, "w": 1.75},
+ {"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": [9, 0], "x": 9.25, "y": 3.5},
+ {"matrix": [9, 1], "x": 10.25, "y": 3.5},
+ {"matrix": [9, 2], "x": 11.25, "y": 3.5},
+ {"matrix": [9, 3], "x": 12.25, "y": 3.5},
+ {"matrix": [9, 4], "x": 13.25, "y": 3.5},
+ {"matrix": [9, 5], "x": 14.25, "y": 3.5},
+ {"matrix": [9, 7], "x": 15.25, "y": 3.5, "w": 2.25},
+ {"matrix": [4, 0], "x": 0, "y": 4.5, "w": 2.25},
+ {"matrix": [4, 1], "x": 2.25, "y": 4.5},
+ {"matrix": [4, 2], "x": 3.25, "y": 4.5},
+ {"matrix": [4, 3], "x": 4.25, "y": 4.5},
+ {"matrix": [4, 4], "x": 5.25, "y": 4.5},
+ {"matrix": [4, 5], "x": 6.25, "y": 4.5},
+ {"matrix": [10, 0], "x": 8.75, "y": 4.5},
+ {"matrix": [10, 1], "x": 9.75, "y": 4.5},
+ {"matrix": [10, 2], "x": 10.75, "y": 4.5},
+ {"matrix": [10, 3], "x": 11.75, "y": 4.5},
+ {"matrix": [10, 4], "x": 12.75, "y": 4.5},
+ {"matrix": [10, 5], "x": 13.75, "y": 4.5},
+ {"matrix": [10, 6], "x": 14.75, "y": 4.5, "w": 2.75},
+ {"matrix": [10, 9], "x": 18.75, "y": 4.5},
+ {"matrix": [5, 0], "x": 0, "y": 5.5, "w": 1.5},
+ {"matrix": [5, 1], "x": 1.5, "y": 5.5},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.5, "w": 1.5},
+ {"matrix": [5, 4], "x": 4, "y": 5.5, "w": 2.75},
+ {"matrix": [5, 5], "x": 6.75, "y": 5.5},
+ {"matrix": [11, 2], "x": 9.25, "y": 5.5, "w": 3.25},
+ {"matrix": [11, 4], "x": 12.5, "y": 5.5, "w": 1.25},
+ {"matrix": [11, 5], "x": 13.75, "y": 5.5, "w": 1.25},
+ {"matrix": [11, 6], "x": 15, "y": 5.5, "w": 1.25},
+ {"matrix": [11, 7], "x": 16.25, "y": 5.5, "w": 1.25},
+ {"matrix": [11, 8], "x": 17.75, "y": 5.5},
+ {"matrix": [11, 9], "x": 18.75, "y": 5.5},
+ {"matrix": [11, 10], "x": 19.75, "y": 5.5}
+ ]
+ },
+ "LAYOUT_split_tkl_ansi_split_rshift": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 2], "x": 1.5, "y": 0},
+ {"matrix": [0, 3], "x": 2.5, "y": 0},
+ {"matrix": [0, 4], "x": 3.5, "y": 0},
+ {"matrix": [0, 5], "x": 4.5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [6, 0], "x": 9.5, "y": 0},
+ {"matrix": [6, 1], "x": 10.5, "y": 0},
+ {"matrix": [6, 2], "x": 12, "y": 0},
+ {"matrix": [6, 3], "x": 13, "y": 0},
+ {"matrix": [6, 4], "x": 14, "y": 0},
+ {"matrix": [6, 5], "x": 15, "y": 0},
+ {"matrix": [6, 7], "x": 16.5, "y": 0},
+ {"matrix": [6, 8], "x": 17.75, "y": 0},
+ {"matrix": [6, 9], "x": 18.75, "y": 0},
+ {"matrix": [6, 10], "x": 19.75, "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": [7, 0], "x": 9.5, "y": 1.5},
+ {"matrix": [7, 1], "x": 10.5, "y": 1.5},
+ {"matrix": [7, 2], "x": 11.5, "y": 1.5},
+ {"matrix": [7, 3], "x": 12.5, "y": 1.5},
+ {"matrix": [7, 4], "x": 13.5, "y": 1.5},
+ {"matrix": [7, 5], "x": 14.5, "y": 1.5},
+ {"matrix": [7, 6], "x": 15.5, "y": 1.5, "w": 2},
+ {"matrix": [7, 8], "x": 17.75, "y": 1.5},
+ {"matrix": [7, 9], "x": 18.75, "y": 1.5},
+ {"matrix": [7, 10], "x": 19.75, "y": 1.5},
+ {"matrix": [2, 0], "x": 0, "y": 2.5, "w": 1.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": [8, 0], "x": 9, "y": 2.5},
+ {"matrix": [8, 1], "x": 10, "y": 2.5},
+ {"matrix": [8, 2], "x": 11, "y": 2.5},
+ {"matrix": [8, 3], "x": 12, "y": 2.5},
+ {"matrix": [8, 4], "x": 13, "y": 2.5},
+ {"matrix": [8, 5], "x": 14, "y": 2.5},
+ {"matrix": [8, 6], "x": 15, "y": 2.5},
+ {"matrix": [8, 7], "x": 16, "y": 2.5, "w": 1.5},
+ {"matrix": [8, 8], "x": 17.75, "y": 2.5},
+ {"matrix": [8, 9], "x": 18.75, "y": 2.5},
+ {"matrix": [8, 10], "x": 19.75, "y": 2.5},
+ {"matrix": [3, 0], "x": 0, "y": 3.5, "w": 1.75},
+ {"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": [9, 0], "x": 9.25, "y": 3.5},
+ {"matrix": [9, 1], "x": 10.25, "y": 3.5},
+ {"matrix": [9, 2], "x": 11.25, "y": 3.5},
+ {"matrix": [9, 3], "x": 12.25, "y": 3.5},
+ {"matrix": [9, 4], "x": 13.25, "y": 3.5},
+ {"matrix": [9, 5], "x": 14.25, "y": 3.5},
+ {"matrix": [9, 7], "x": 15.25, "y": 3.5, "w": 2.25},
+ {"matrix": [4, 0], "x": 0, "y": 4.5, "w": 2.25},
+ {"matrix": [4, 1], "x": 2.25, "y": 4.5},
+ {"matrix": [4, 2], "x": 3.25, "y": 4.5},
+ {"matrix": [4, 3], "x": 4.25, "y": 4.5},
+ {"matrix": [4, 4], "x": 5.25, "y": 4.5},
+ {"matrix": [4, 5], "x": 6.25, "y": 4.5},
+ {"matrix": [10, 0], "x": 8.75, "y": 4.5},
+ {"matrix": [10, 1], "x": 9.75, "y": 4.5},
+ {"matrix": [10, 2], "x": 10.75, "y": 4.5},
+ {"matrix": [10, 3], "x": 11.75, "y": 4.5},
+ {"matrix": [10, 4], "x": 12.75, "y": 4.5},
+ {"matrix": [10, 5], "x": 13.75, "y": 4.5},
+ {"matrix": [10, 6], "x": 14.75, "y": 4.5, "w": 1.75},
+ {"matrix": [10, 7], "x": 16.5, "y": 4.5},
+ {"matrix": [10, 9], "x": 18.75, "y": 4.5},
+ {"matrix": [5, 0], "x": 0, "y": 5.5, "w": 1.5},
+ {"matrix": [5, 1], "x": 1.5, "y": 5.5},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.5, "w": 1.5},
+ {"matrix": [5, 4], "x": 4, "y": 5.5, "w": 2.75},
+ {"matrix": [5, 5], "x": 6.75, "y": 5.5},
+ {"matrix": [11, 2], "x": 9.25, "y": 5.5, "w": 3.25},
+ {"matrix": [11, 4], "x": 12.5, "y": 5.5, "w": 1.25},
+ {"matrix": [11, 5], "x": 13.75, "y": 5.5, "w": 1.25},
+ {"matrix": [11, 6], "x": 15, "y": 5.5, "w": 1.25},
+ {"matrix": [11, 7], "x": 16.25, "y": 5.5, "w": 1.25},
+ {"matrix": [11, 8], "x": 17.75, "y": 5.5},
+ {"matrix": [11, 9], "x": 18.75, "y": 5.5},
+ {"matrix": [11, 10], "x": 19.75, "y": 5.5}
+ ]
+ },
+ "LAYOUT_split_tkl_ansi_split_rshift_bs": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 2], "x": 1.5, "y": 0},
+ {"matrix": [0, 3], "x": 2.5, "y": 0},
+ {"matrix": [0, 4], "x": 3.5, "y": 0},
+ {"matrix": [0, 5], "x": 4.5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [6, 0], "x": 9.5, "y": 0},
+ {"matrix": [6, 1], "x": 10.5, "y": 0},
+ {"matrix": [6, 2], "x": 12, "y": 0},
+ {"matrix": [6, 3], "x": 13, "y": 0},
+ {"matrix": [6, 4], "x": 14, "y": 0},
+ {"matrix": [6, 5], "x": 15, "y": 0},
+ {"matrix": [6, 7], "x": 16.5, "y": 0},
+ {"matrix": [6, 8], "x": 17.75, "y": 0},
+ {"matrix": [6, 9], "x": 18.75, "y": 0},
+ {"matrix": [6, 10], "x": 19.75, "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": [7, 0], "x": 9.5, "y": 1.5},
+ {"matrix": [7, 1], "x": 10.5, "y": 1.5},
+ {"matrix": [7, 2], "x": 11.5, "y": 1.5},
+ {"matrix": [7, 3], "x": 12.5, "y": 1.5},
+ {"matrix": [7, 4], "x": 13.5, "y": 1.5},
+ {"matrix": [7, 5], "x": 14.5, "y": 1.5},
+ {"matrix": [7, 6], "x": 15.5, "y": 1.5},
+ {"matrix": [7, 7], "x": 16.5, "y": 1.5},
+ {"matrix": [7, 8], "x": 17.75, "y": 1.5},
+ {"matrix": [7, 9], "x": 18.75, "y": 1.5},
+ {"matrix": [7, 10], "x": 19.75, "y": 1.5},
+ {"matrix": [2, 0], "x": 0, "y": 2.5, "w": 1.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": [8, 0], "x": 9, "y": 2.5},
+ {"matrix": [8, 1], "x": 10, "y": 2.5},
+ {"matrix": [8, 2], "x": 11, "y": 2.5},
+ {"matrix": [8, 3], "x": 12, "y": 2.5},
+ {"matrix": [8, 4], "x": 13, "y": 2.5},
+ {"matrix": [8, 5], "x": 14, "y": 2.5},
+ {"matrix": [8, 6], "x": 15, "y": 2.5},
+ {"matrix": [8, 7], "x": 16, "y": 2.5, "w": 1.5},
+ {"matrix": [8, 8], "x": 17.75, "y": 2.5},
+ {"matrix": [8, 9], "x": 18.75, "y": 2.5},
+ {"matrix": [8, 10], "x": 19.75, "y": 2.5},
+ {"matrix": [3, 0], "x": 0, "y": 3.5, "w": 1.75},
+ {"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": [9, 0], "x": 9.25, "y": 3.5},
+ {"matrix": [9, 1], "x": 10.25, "y": 3.5},
+ {"matrix": [9, 2], "x": 11.25, "y": 3.5},
+ {"matrix": [9, 3], "x": 12.25, "y": 3.5},
+ {"matrix": [9, 4], "x": 13.25, "y": 3.5},
+ {"matrix": [9, 5], "x": 14.25, "y": 3.5},
+ {"matrix": [9, 7], "x": 15.25, "y": 3.5, "w": 2.25},
+ {"matrix": [4, 0], "x": 0, "y": 4.5, "w": 2.25},
+ {"matrix": [4, 1], "x": 2.25, "y": 4.5},
+ {"matrix": [4, 2], "x": 3.25, "y": 4.5},
+ {"matrix": [4, 3], "x": 4.25, "y": 4.5},
+ {"matrix": [4, 4], "x": 5.25, "y": 4.5},
+ {"matrix": [4, 5], "x": 6.25, "y": 4.5},
+ {"matrix": [10, 0], "x": 8.75, "y": 4.5},
+ {"matrix": [10, 1], "x": 9.75, "y": 4.5},
+ {"matrix": [10, 2], "x": 10.75, "y": 4.5},
+ {"matrix": [10, 3], "x": 11.75, "y": 4.5},
+ {"matrix": [10, 4], "x": 12.75, "y": 4.5},
+ {"matrix": [10, 5], "x": 13.75, "y": 4.5},
+ {"matrix": [10, 6], "x": 14.75, "y": 4.5, "w": 1.75},
+ {"matrix": [10, 7], "x": 16.5, "y": 4.5},
+ {"matrix": [10, 9], "x": 18.75, "y": 4.5},
+ {"matrix": [5, 0], "x": 0, "y": 5.5, "w": 1.5},
+ {"matrix": [5, 1], "x": 1.5, "y": 5.5},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.5, "w": 1.5},
+ {"matrix": [5, 4], "x": 4, "y": 5.5, "w": 2.75},
+ {"matrix": [5, 5], "x": 6.75, "y": 5.5},
+ {"matrix": [11, 2], "x": 9.25, "y": 5.5, "w": 3.25},
+ {"matrix": [11, 4], "x": 12.5, "y": 5.5, "w": 1.25},
+ {"matrix": [11, 5], "x": 13.75, "y": 5.5, "w": 1.25},
+ {"matrix": [11, 6], "x": 15, "y": 5.5, "w": 1.25},
+ {"matrix": [11, 7], "x": 16.25, "y": 5.5, "w": 1.25},
+ {"matrix": [11, 8], "x": 17.75, "y": 5.5},
+ {"matrix": [11, 9], "x": 18.75, "y": 5.5},
+ {"matrix": [11, 10], "x": 19.75, "y": 5.5}
+ ]
+ },
+ "LAYOUT_split_tkl_ansi_split_rshift_bs_rspace": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 2], "x": 1.5, "y": 0},
+ {"matrix": [0, 3], "x": 2.5, "y": 0},
+ {"matrix": [0, 4], "x": 3.5, "y": 0},
+ {"matrix": [0, 5], "x": 4.5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [6, 0], "x": 9.5, "y": 0},
+ {"matrix": [6, 1], "x": 10.5, "y": 0},
+ {"matrix": [6, 2], "x": 12, "y": 0},
+ {"matrix": [6, 3], "x": 13, "y": 0},
+ {"matrix": [6, 4], "x": 14, "y": 0},
+ {"matrix": [6, 5], "x": 15, "y": 0},
+ {"matrix": [6, 7], "x": 16.5, "y": 0},
+ {"matrix": [6, 8], "x": 17.75, "y": 0},
+ {"matrix": [6, 9], "x": 18.75, "y": 0},
+ {"matrix": [6, 10], "x": 19.75, "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": [7, 0], "x": 9.5, "y": 1.5},
+ {"matrix": [7, 1], "x": 10.5, "y": 1.5},
+ {"matrix": [7, 2], "x": 11.5, "y": 1.5},
+ {"matrix": [7, 3], "x": 12.5, "y": 1.5},
+ {"matrix": [7, 4], "x": 13.5, "y": 1.5},
+ {"matrix": [7, 5], "x": 14.5, "y": 1.5},
+ {"matrix": [7, 6], "x": 15.5, "y": 1.5},
+ {"matrix": [7, 7], "x": 16.5, "y": 1.5},
+ {"matrix": [7, 8], "x": 17.75, "y": 1.5},
+ {"matrix": [7, 9], "x": 18.75, "y": 1.5},
+ {"matrix": [7, 10], "x": 19.75, "y": 1.5},
+ {"matrix": [2, 0], "x": 0, "y": 2.5, "w": 1.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": [8, 0], "x": 9, "y": 2.5},
+ {"matrix": [8, 1], "x": 10, "y": 2.5},
+ {"matrix": [8, 2], "x": 11, "y": 2.5},
+ {"matrix": [8, 3], "x": 12, "y": 2.5},
+ {"matrix": [8, 4], "x": 13, "y": 2.5},
+ {"matrix": [8, 5], "x": 14, "y": 2.5},
+ {"matrix": [8, 6], "x": 15, "y": 2.5},
+ {"matrix": [8, 7], "x": 16, "y": 2.5, "w": 1.5},
+ {"matrix": [8, 8], "x": 17.75, "y": 2.5},
+ {"matrix": [8, 9], "x": 18.75, "y": 2.5},
+ {"matrix": [8, 10], "x": 19.75, "y": 2.5},
+ {"matrix": [3, 0], "x": 0, "y": 3.5, "w": 1.75},
+ {"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": [9, 0], "x": 9.25, "y": 3.5},
+ {"matrix": [9, 1], "x": 10.25, "y": 3.5},
+ {"matrix": [9, 2], "x": 11.25, "y": 3.5},
+ {"matrix": [9, 3], "x": 12.25, "y": 3.5},
+ {"matrix": [9, 4], "x": 13.25, "y": 3.5},
+ {"matrix": [9, 5], "x": 14.25, "y": 3.5},
+ {"matrix": [9, 7], "x": 15.25, "y": 3.5, "w": 2.25},
+ {"matrix": [4, 0], "x": 0, "y": 4.5, "w": 2.25},
+ {"matrix": [4, 1], "x": 2.25, "y": 4.5},
+ {"matrix": [4, 2], "x": 3.25, "y": 4.5},
+ {"matrix": [4, 3], "x": 4.25, "y": 4.5},
+ {"matrix": [4, 4], "x": 5.25, "y": 4.5},
+ {"matrix": [4, 5], "x": 6.25, "y": 4.5},
+ {"matrix": [10, 0], "x": 8.75, "y": 4.5},
+ {"matrix": [10, 1], "x": 9.75, "y": 4.5},
+ {"matrix": [10, 2], "x": 10.75, "y": 4.5},
+ {"matrix": [10, 3], "x": 11.75, "y": 4.5},
+ {"matrix": [10, 4], "x": 12.75, "y": 4.5},
+ {"matrix": [10, 5], "x": 13.75, "y": 4.5},
+ {"matrix": [10, 6], "x": 14.75, "y": 4.5, "w": 1.75},
+ {"matrix": [10, 7], "x": 16.5, "y": 4.5},
+ {"matrix": [10, 9], "x": 18.75, "y": 4.5},
+ {"matrix": [5, 0], "x": 0, "y": 5.5, "w": 1.5},
+ {"matrix": [5, 1], "x": 1.5, "y": 5.5},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.5, "w": 1.5},
+ {"matrix": [5, 4], "x": 4, "y": 5.5, "w": 2.75},
+ {"matrix": [5, 5], "x": 6.75, "y": 5.5},
+ {"matrix": [11, 1], "x": 9.25, "y": 5.5},
+ {"matrix": [11, 2], "x": 10.25, "y": 5.5, "w": 2.25},
+ {"matrix": [11, 4], "x": 12.5, "y": 5.5, "w": 1.25},
+ {"matrix": [11, 5], "x": 13.75, "y": 5.5, "w": 1.25},
+ {"matrix": [11, 6], "x": 15, "y": 5.5, "w": 1.25},
+ {"matrix": [11, 7], "x": 16.25, "y": 5.5, "w": 1.25},
+ {"matrix": [11, 8], "x": 17.75, "y": 5.5},
+ {"matrix": [11, 9], "x": 18.75, "y": 5.5},
+ {"matrix": [11, 10], "x": 19.75, "y": 5.5}
+ ]
+ }
+ }
+}
diff --git a/keyboards/era/sirind/tomak/keymaps/default/keymap.c b/keyboards/era/sirind/tomak/keymaps/default/keymap.c
new file mode 100644
index 00000000000..62941ff8b7a
--- /dev/null
+++ b/keyboards/era/sirind/tomak/keymaps/default/keymap.c
@@ -0,0 +1,25 @@
+// Copyright 2023 Hyojin Bak (@eerraa)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#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_F13, KC_PSCR, KC_SCRL, KC_PAUS,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, 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_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_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_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), MO(1), KC_SPC, KC_RALT, KC_RGUI, KC_MENU, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ [1] = LAYOUT_all(
+ QK_BOOT, 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, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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_VAI, RGB_HUI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, RGB_MOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, 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/tomak/keymaps/default_ansi/keymap.c b/keyboards/era/sirind/tomak/keymaps/default_ansi/keymap.c
new file mode 100644
index 00000000000..3823cc69c36
--- /dev/null
+++ b/keyboards/era/sirind/tomak/keymaps/default_ansi/keymap.c
@@ -0,0 +1,25 @@
+// Copyright 2023 Hyojin Bak (@eerraa)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT_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_F13, KC_PSCR, KC_SCRL, KC_PAUS,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, 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_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_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, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_SPC, KC_RALT, KC_RGUI, KC_MENU, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ [1] = LAYOUT_ansi(
+ QK_BOOT, 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, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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_VAI, RGB_HUI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, RGB_MOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, 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/tomak/keymaps/default_ansi_split_bs/keymap.c b/keyboards/era/sirind/tomak/keymaps/default_ansi_split_bs/keymap.c
new file mode 100644
index 00000000000..87f3072a9e1
--- /dev/null
+++ b/keyboards/era/sirind/tomak/keymaps/default_ansi_split_bs/keymap.c
@@ -0,0 +1,25 @@
+// Copyright 2023 Hyojin Bak (@eerraa)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT_ansi_split_bs(
+ 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_F13, KC_PSCR, KC_SCRL, KC_PAUS,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, 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_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_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, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_SPC, KC_RALT, KC_RGUI, KC_MENU, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ [1] = LAYOUT_ansi_split_bs(
+ QK_BOOT, 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, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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_VAI, RGB_HUI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, RGB_MOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, 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/tomak/keymaps/default_ansi_split_rshift/keymap.c b/keyboards/era/sirind/tomak/keymaps/default_ansi_split_rshift/keymap.c
new file mode 100644
index 00000000000..6b8fb56e339
--- /dev/null
+++ b/keyboards/era/sirind/tomak/keymaps/default_ansi_split_rshift/keymap.c
@@ -0,0 +1,25 @@
+// Copyright 2023 Hyojin Bak (@eerraa)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT_ansi_split_rshift(
+ 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_F13, KC_PSCR, KC_SCRL, KC_PAUS,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, 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_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_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_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_SPC, KC_RALT, KC_RGUI, KC_MENU, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ [1] = LAYOUT_ansi_split_rshift(
+ QK_BOOT, 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, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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_VAI, RGB_HUI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, RGB_MOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, 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/tomak/keymaps/default_ansi_split_rshift_bs/keymap.c b/keyboards/era/sirind/tomak/keymaps/default_ansi_split_rshift_bs/keymap.c
new file mode 100644
index 00000000000..380689dd46b
--- /dev/null
+++ b/keyboards/era/sirind/tomak/keymaps/default_ansi_split_rshift_bs/keymap.c
@@ -0,0 +1,25 @@
+// Copyright 2023 Hyojin Bak (@eerraa)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT_ansi_split_rshift_bs(
+ 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_F13, KC_PSCR, KC_SCRL, KC_PAUS,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, 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_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_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_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_SPC, KC_RALT, KC_RGUI, KC_MENU, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ [1] = LAYOUT_ansi_split_rshift_bs(
+ QK_BOOT, 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, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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_VAI, RGB_HUI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, RGB_MOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, 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/tomak/keymaps/via/keymap.c b/keyboards/era/sirind/tomak/keymaps/via/keymap.c
new file mode 100644
index 00000000000..62941ff8b7a
--- /dev/null
+++ b/keyboards/era/sirind/tomak/keymaps/via/keymap.c
@@ -0,0 +1,25 @@
+// Copyright 2023 Hyojin Bak (@eerraa)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#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_F13, KC_PSCR, KC_SCRL, KC_PAUS,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, 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_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_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_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), MO(1), KC_SPC, KC_RALT, KC_RGUI, KC_MENU, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ [1] = LAYOUT_all(
+ QK_BOOT, 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, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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_VAI, RGB_HUI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, RGB_MOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, 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/tomak/keymaps/via/rules.mk b/keyboards/era/sirind/tomak/keymaps/via/rules.mk
new file mode 100644
index 00000000000..036bd6d1c3e
--- /dev/null
+++ b/keyboards/era/sirind/tomak/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/era/sirind/tomak/readme.md b/keyboards/era/sirind/tomak/readme.md
new file mode 100644
index 00000000000..0834dfd6a87
--- /dev/null
+++ b/keyboards/era/sirind/tomak/readme.md
@@ -0,0 +1,27 @@
+# Tomak
+
+
+
+Ergonomics Split Keyboard powered by RP2040.
+
+* Keyboard Maintainer: [ERA](https://github.com/eerraa)
+* Hardware supported: SIRIND Tomak
+* Hardware availability: [Syryan](https://srind.mysoho.com/)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make era/sirind/tomak:default
+
+Flashing example for this keyboard:
+
+ make era/sirind/tomak: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(ESC, F7)' key and plug in the keyboard.
+* **Physical reset**: Short the 'RESET' and 'GND' holes twice within one second, or plug in the keyboard with the 'BOOT' and 'GND' holes shorted.
+* **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/tomak/rules.mk b/keyboards/era/sirind/tomak/rules.mk
new file mode 100644
index 00000000000..743228e94b6
--- /dev/null
+++ b/keyboards/era/sirind/tomak/rules.mk
@@ -0,0 +1 @@
+SERIAL_DRIVER = vendor
\ No newline at end of file
diff --git a/keyboards/era/sirind/tomak/tomak.c b/keyboards/era/sirind/tomak/tomak.c
new file mode 100644
index 00000000000..8533cd4a737
--- /dev/null
+++ b/keyboards/era/sirind/tomak/tomak.c
@@ -0,0 +1,16 @@
+// Copyright 2023 Hyojin Bak (@eerraa)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "quantum.h"
+
+bool rgb_matrix_indicators_kb(void) {
+ if (!rgb_matrix_indicators_user()) {
+ return false;
+ }
+ if (host_keyboard_led_state().caps_lock) {
+ rgb_matrix_set_color(96, 0, 128, 128);
+ rgb_matrix_set_color(97, 0, 128, 128);
+ rgb_matrix_set_color(98, 0, 128, 128);
+ }
+ return true;
+}
\ No newline at end of file
diff --git a/keyboards/fatotesa/info.json b/keyboards/fatotesa/info.json
new file mode 100644
index 00000000000..bdd5e40478d
--- /dev/null
+++ b/keyboards/fatotesa/info.json
@@ -0,0 +1,144 @@
+{
+ "development_board": "promicro",
+ "manufacturer": "fatotesa",
+ "keyboard_name": "fatotesa",
+ "maintainer": "stefangluszek",
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "encoder": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "caps_word": true
+ },
+ "encoder": {
+ "rotary": [
+ { "pin_a": "D1", "pin_b": "D0" , "resolution": 2}
+ ]
+ },
+ "split": {
+ "enabled": true,
+ "soft_serial_pin": "D2",
+ "usb_detect": {
+ "enabled": true,
+ "timeout": 2500
+ },
+ "matrix_pins": {
+ "right": {
+ "cols": ["F4", "F5", "F6", "C6", "F7", "B1", "B3", "B2"],
+ "rows": ["B6", "E6", "D4", "D7", "B4", "B5"]
+ }
+ },
+ "bootmagic": {
+ "matrix": [4, 1]
+ }
+ },
+ "matrix_pins": {
+ "cols": ["F5", "F6", "F7", "B1", "B3", "B2", "B6", null],
+ "rows": ["D4", "C6", "D7", "E6", "B4", "B5"]
+ },
+ "url": "",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x0000",
+ "vid": "0xFEED"
+ },
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"matrix": [0, 0], "label":"esc", "x":0, "y":0},
+ {"matrix": [0, 2], "label":"f1", "x":2, "y":0},
+ {"matrix": [0, 3], "label":"f2", "x":3, "y":0},
+ {"matrix": [0, 4], "label":"f3", "x":4, "y":0},
+ {"matrix": [0, 5], "label":"f4", "x":5, "y":0},
+
+ {"matrix": [6, 4], "label":"end", "x":13.25, "y":0},
+ {"matrix": [6, 5], "label":"ins", "x":14.25, "y":0},
+ {"matrix": [6, 6], "label":"del", "x":15.25, "y":0},
+ {"matrix": [6, 7], "label":"enc", "x":16.5, "y":0, "encoder": 0},
+
+
+ {"matrix": [1, 0], "label":"`", "x":0, "y":1},
+ {"matrix": [1, 1], "label":"1", "x":1, "y":1},
+ {"matrix": [1, 2], "label":"2", "x":2, "y":1},
+ {"matrix": [1, 3], "label":"3", "x":3, "y":1},
+ {"matrix": [1, 4], "label":"4", "x":4, "y":1},
+ {"matrix": [1, 5], "label":"5", "x":5, "y":1},
+ {"matrix": [1, 6], "label":"6", "x":6, "y":1},
+
+ {"matrix": [7, 1], "label":"7", "x":9.5, "y":1},
+ {"matrix": [7, 2], "label":"8", "x":10.5, "y":1},
+ {"matrix": [7, 3], "label":"9", "x":11.5, "y":1},
+ {"matrix": [7, 4], "label":"0", "x":12.5, "y":1},
+ {"matrix": [7, 5], "label":"-", "x":13.5, "y":1},
+ {"matrix": [7, 6], "label":"=", "x":14.5, "y":1},
+ {"matrix": [7, 7], "label":"<", "x":15.5, "y":1, "w":2},
+
+
+ {"matrix": [2, 0], "label":"tab", "x":0, "y":2, "w":1.5},
+ {"matrix": [2, 1], "label":"q", "x":1.5, "y":2},
+ {"matrix": [2, 2], "label":"w", "x":2.5, "y":2},
+ {"matrix": [2, 3], "label":"e", "x":3.5, "y":2},
+ {"matrix": [2, 4], "label":"r", "x":4.5, "y":2},
+ {"matrix": [2, 5], "label":"t", "x":5.5, "y":2},
+
+ {"matrix": [8, 0], "label":"y", "x":9, "y":2},
+ {"matrix": [8, 1], "label":"u", "x":10, "y":2},
+ {"matrix": [8, 2], "label":"i", "x":11, "y":2},
+ {"matrix": [8, 3], "label":"o", "x":12, "y":2},
+ {"matrix": [8, 4], "label":"p", "x":13, "y":2},
+ {"matrix": [8, 5], "label":"[", "x":14, "y":2},
+ {"matrix": [8, 6], "label":"]", "x":15, "y":2},
+ {"matrix": [8, 7], "x":16.25, "y":2, "w":1.25, "h":2},
+
+
+ {"matrix": [3, 0], "label":"caps", "x":0, "y":3, "w":1.75},
+ {"matrix": [3, 1], "label":"a", "x":1.75, "y":3},
+ {"matrix": [3, 2], "label":"s", "x":2.75, "y":3},
+ {"matrix": [3, 3], "label":"d", "x":3.75, "y":3},
+ {"matrix": [3, 4], "label":"f", "x":4.75, "y":3},
+ {"matrix": [3, 5], "label":"g", "x":5.75, "y":3},
+
+ {"matrix": [9, 0], "label":"h", "x":9.25, "y":3},
+ {"matrix": [9, 1], "label":"j", "x":10.25, "y":3},
+ {"matrix": [9, 2], "label":"k", "x":11.25, "y":3},
+ {"matrix": [9, 3], "label":"l", "x":12.25, "y":3},
+ {"matrix": [9, 4], "label":";", "x":13.25, "y":3},
+ {"matrix": [9, 5], "label":"'", "x":14.25, "y":3},
+ {"matrix": [9, 6], "label":"\\", "x":15.25, "y":3},
+
+
+ {"matrix": [4, 0], "label":"shift", "x":0, "y":4, "w":1.25},
+ {"matrix": [4, 1], "label":"<", "x":1.25, "y":4},
+ {"matrix": [4, 2], "label":"z", "x":2.25, "y":4},
+ {"matrix": [4, 3], "label":"x", "x":3.25, "y":4},
+ {"matrix": [4, 4], "label":"c", "x":4.25, "y":4},
+ {"matrix": [4, 5], "label":"v", "x":5.25, "y":4},
+ {"matrix": [4, 6], "label":"b", "x":6.25, "y":4},
+
+ {"matrix": [10, 2], "label":"n", "x":9.75, "y":4},
+ {"matrix": [10, 3], "label":"m", "x":10.75, "y":4},
+ {"matrix": [10, 4], "label":",", "x":11.75, "y":4},
+ {"matrix": [10, 5], "label":".", "x":12.75, "y":4},
+ {"matrix": [10, 6], "label":"/", "x":13.75, "y":4},
+ {"matrix": [10, 7], "x":14.75, "y":4},
+
+
+ {"matrix": [5, 0], "label":"ctrl", "x":0, "y":5, "w":1.25},
+ {"matrix": [5, 1], "label":"win", "x":1.25, "y":5, "w":1.25},
+ {"matrix": [5, 2], "label":"alt", "x":2.5, "y":5, "w":1.25},
+ {"matrix": [5, 3], "label":"space", "x":3.75, "y":5, "w":1.75},
+ {"matrix": [5, 4], "label":"na", "x":5.5, "y":5},
+
+ {"matrix": [11, 3], "label":"space", "x":10.5, "y":5, "w":2},
+ {"matrix": [11, 4], "label":"alt gr", "x":12.5, "y":5, "w":1.25},
+ {"matrix": [11, 5], "label":"ctrl", "x":13.75, "y":5, "w":1.25},
+ {"matrix": [11, 6], "label":"?", "x":15, "y":5, "w":1.25},
+ {"matrix": [11, 7], "label":"?", "x":16.25, "y":5, "w":1.25}
+ ]
+ }
+ }
+}
diff --git a/keyboards/fatotesa/keymaps/default/keymap.c b/keyboards/fatotesa/keymaps/default/keymap.c
new file mode 100644
index 00000000000..1f6aa804889
--- /dev/null
+++ b/keyboards/fatotesa/keymaps/default/keymap.c
@@ -0,0 +1,30 @@
+// Copyright 2023 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+#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_VOLD, KC_VOLU) },
+};
+#endif
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_END, KC_INSERT, KC_DELETE, KC_KB_MUTE,
+ KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQUAL, KC_BACKSPACE,
+ LT(1, KC_TAB), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LEFT_BRACKET, KC_RIGHT_BRACKET, KC_ENTER,
+ KC_LEFT_CTRL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SEMICOLON, KC_QUOTE, KC_BACKSLASH,
+ KC_LEFT_SHIFT, KC_LEFT_ANGLE_BRACKET, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLASH, KC_RIGHT_SHIFT,
+ CW_TOGG, KC_LWIN, KC_LEFT_ALT, KC_BACKSPACE, KC_LEFT_ALT, KC_SPACE, KC_RIGHT_ALT, KC_RIGHT_CTRL, KC_NO, KC_NO
+ ),
+ [1] = LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, KC_DEL, _______, _______, _______, _______, _______, _______
+ )};
diff --git a/keyboards/fatotesa/keymaps/default/rules.mk b/keyboards/fatotesa/keymaps/default/rules.mk
new file mode 100644
index 00000000000..ee325681483
--- /dev/null
+++ b/keyboards/fatotesa/keymaps/default/rules.mk
@@ -0,0 +1 @@
+ENCODER_MAP_ENABLE = yes
diff --git a/keyboards/fatotesa/readme.md b/keyboards/fatotesa/readme.md
new file mode 100644
index 00000000000..a3794cfd667
--- /dev/null
+++ b/keyboards/fatotesa/readme.md
@@ -0,0 +1,25 @@
+# fatotesa
+
+
+
+This is the QMK firmware for the [fat-o-tesa](https://github.com/stefangluszek/fat-o-tesa) keyboard.
+
+* Keyboard Maintainer: [Stefan Gluszek](https://github.com/stefangluszek)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make fatotesa:default
+
+Flashing example for this keyboard:
+
+ make fatotesa: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 (4,1) in the matrix and plug in the keyboard - this is somewhat unusual choice but our split halves are not symmetrical and we can't use (0,0) but instead a key that maps to the same matrix position regardless of which part is being connected to the computer and flashed.
+* **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/fatotesa/rules.mk b/keyboards/fatotesa/rules.mk
new file mode 100644
index 00000000000..6e7633bfe01
--- /dev/null
+++ b/keyboards/fatotesa/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
diff --git a/keyboards/jaykeeb/jk65/info.json b/keyboards/jaykeeb/jk65/info.json
new file mode 100644
index 00000000000..0be07caacdc
--- /dev/null
+++ b/keyboards/jaykeeb/jk65/info.json
@@ -0,0 +1,410 @@
+{
+ "manufacturer": "Jaykeeb Studio",
+ "keyboard_name": "JK65",
+ "maintainer": "Alabahuy",
+ "bootloader": "rp2040",
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true
+ },
+ "matrix_pins": {
+ "cols": ["GP24", "GP14", "GP13", "GP12", "GP11", "GP10", "GP9", "GP8", "GP7", "GP6", "GP5", "GP4", "GP3", "GP2", "GP1"],
+ "rows": ["GP29", "GP0", "GP15", "GP26", "GP27"]
+ },
+ "indicators": {
+ "caps_lock": "GP25",
+ "on_state": 0
+ },
+ "processor": "RP2040",
+ "url": "",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x7765",
+ "vid": "0x414C"
+ },
+ "community_layouts": ["65_ansi_blocker", "65_ansi_blocker_split_bs", "65_ansi_blocker_tsangan", "65_ansi_blocker_tsangan_split_bs"],
+ "layouts": {
+ "LAYOUT_all": {
+ "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": "-", "matrix": [0, 11], "x": 11, "y": 0},
+ {"label": "=", "matrix": [0, 12], "x": 12, "y": 0},
+ {"label": "Backspace", "matrix": [0, 13], "x": 13, "y": 0},
+ {"label": "Delete", "matrix": [1, 13], "x": 14, "y": 0},
+ {"label": "Home", "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": [2, 13], "x": 13.5, "y": 1, "w": 1.5},
+ {"label": "End", "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": "'", "matrix": [2, 11], "x": 11.75, "y": 2},
+ {"label": "Enter", "matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25},
+ {"label": "Page Up", "matrix": [2, 14], "x": 15, "y": 2},
+
+ {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
+ {"label": "\\", "matrix": [3, 1], "x": 1.25, "y": 3},
+ {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3},
+ {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3},
+ {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3},
+ {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3},
+ {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3},
+ {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3},
+ {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3},
+ {"label": ",", "matrix": [3, 9], "x": 9.25, "y": 3},
+ {"label": ".", "matrix": [3, 10], "x": 10.25, "y": 3},
+ {"label": "/", "matrix": [3, 11], "x": 11.25, "y": 3},
+ {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+ {"label": "\u2191", "matrix": [3, 13], "x": 14, "y": 3},
+ {"label": "Page Down", "matrix": [3, 14], "x": 15, "y": 3},
+
+ {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
+ {"label": "GUI", "matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25},
+ {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25},
+ {"label": "Space", "matrix": [4, 6], "x": 3.75, "y": 4, "w": 6.25},
+ {"label": "Alt", "matrix": [4, 10], "x": 10, "y": 4, "w": 1.25},
+ {"label": "Ctrl", "matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25},
+ {"label": "\u2190", "matrix": [4, 12], "x": 13, "y": 4},
+ {"label": "\u2193", "matrix": [4, 13], "x": 14, "y": 4},
+ {"label": "\u2192", "matrix": [4, 14], "x": 15, "y": 4}
+ ]
+ },
+ "LAYOUT_65_ansi_blocker": {
+ "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": "-", "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": "Home", "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": [2, 13], "x": 13.5, "y": 1, "w": 1.5},
+ {"label": "End", "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": "'", "matrix": [2, 11], "x": 11.75, "y": 2},
+ {"label": "Enter", "matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25},
+ {"label": "Page Up", "matrix": [2, 14], "x": 15, "y": 2},
+
+ {"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": "\u2191", "matrix": [3, 13], "x": 14, "y": 3},
+ {"label": "Page Down", "matrix": [3, 14], "x": 15, "y": 3},
+
+ {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
+ {"label": "GUI", "matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25},
+ {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25},
+ {"label": "Space", "matrix": [4, 6], "x": 3.75, "y": 4, "w": 6.25},
+ {"label": "Alt", "matrix": [4, 10], "x": 10, "y": 4, "w": 1.25},
+ {"label": "Ctrl", "matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25},
+ {"label": "\u2190", "matrix": [4, 12], "x": 13, "y": 4},
+ {"label": "\u2193", "matrix": [4, 13], "x": 14, "y": 4},
+ {"label": "\u2192", "matrix": [4, 14], "x": 15, "y": 4}
+ ]
+ },
+ "LAYOUT_65_ansi_blocker_split_bs": {
+ "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": "-", "matrix": [0, 11], "x": 11, "y": 0},
+ {"label": "=", "matrix": [0, 12], "x": 12, "y": 0},
+ {"label": "Backspace", "matrix": [0, 13], "x": 13, "y": 0},
+ {"label": "Delete", "matrix": [1, 13], "x": 14, "y": 0},
+ {"label": "Home", "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": [2, 13], "x": 13.5, "y": 1, "w": 1.5},
+ {"label": "End", "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": "'", "matrix": [2, 11], "x": 11.75, "y": 2},
+ {"label": "Enter", "matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25},
+ {"label": "Page Up", "matrix": [2, 14], "x": 15, "y": 2},
+
+ {"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": "\u2191", "matrix": [3, 13], "x": 14, "y": 3},
+ {"label": "Page Down", "matrix": [3, 14], "x": 15, "y": 3},
+
+ {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
+ {"label": "GUI", "matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25},
+ {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25},
+ {"label": "Space", "matrix": [4, 6], "x": 3.75, "y": 4, "w": 6.25},
+ {"label": "Alt", "matrix": [4, 10], "x": 10, "y": 4, "w": 1.25},
+ {"label": "Ctrl", "matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25},
+ {"label": "\u2190", "matrix": [4, 12], "x": 13, "y": 4},
+ {"label": "\u2193", "matrix": [4, 13], "x": 14, "y": 4},
+ {"label": "\u2192", "matrix": [4, 14], "x": 15, "y": 4}
+ ]
+ },
+ "LAYOUT_65_ansi_blocker_tsangan": {
+ "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": "-", "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": "Home", "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": [2, 13], "x": 13.5, "y": 1, "w": 1.5},
+ {"label": "End", "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": "'", "matrix": [2, 11], "x": 11.75, "y": 2},
+ {"label": "Enter", "matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25},
+ {"label": "Page Up", "matrix": [2, 14], "x": 15, "y": 2},
+
+ {"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": "\u2191", "matrix": [3, 13], "x": 14, "y": 3},
+ {"label": "Page Down", "matrix": [3, 14], "x": 15, "y": 3},
+
+ {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"label": "GUI", "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": "Ctrl", "matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
+ {"label": "\u2190", "matrix": [4, 12], "x": 13, "y": 4},
+ {"label": "\u2193", "matrix": [4, 13], "x": 14, "y": 4},
+ {"label": "\u2192", "matrix": [4, 14], "x": 15, "y": 4}
+ ]
+ },
+ "LAYOUT_65_ansi_blocker_tsangan_split_bs": {
+ "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": "-", "matrix": [0, 11], "x": 11, "y": 0},
+ {"label": "=", "matrix": [0, 12], "x": 12, "y": 0},
+ {"label": "Backspace", "matrix": [0, 13], "x": 13, "y": 0},
+ {"label": "Delete", "matrix": [1, 13], "x": 14, "y": 0},
+ {"label": "Home", "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": [2, 13], "x": 13.5, "y": 1, "w": 1.5},
+ {"label": "End", "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": "'", "matrix": [2, 11], "x": 11.75, "y": 2},
+ {"label": "Enter", "matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25},
+ {"label": "Page Up", "matrix": [2, 14], "x": 15, "y": 2},
+
+ {"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": "\u2191", "matrix": [3, 13], "x": 14, "y": 3},
+ {"label": "Page Down", "matrix": [3, 14], "x": 15, "y": 3},
+
+ {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"label": "GUI", "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": "Ctrl", "matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
+ {"label": "\u2190", "matrix": [4, 12], "x": 13, "y": 4},
+ {"label": "\u2193", "matrix": [4, 13], "x": 14, "y": 4},
+ {"label": "\u2192", "matrix": [4, 14], "x": 15, "y": 4}
+ ]
+ }
+ }
+}
diff --git a/keyboards/jaykeeb/jk65/keymaps/default/keymap.c b/keyboards/jaykeeb/jk65/keymaps/default/keymap.c
new file mode 100644
index 00000000000..de10b49a6cf
--- /dev/null
+++ b/keyboards/jaykeeb/jk65/keymaps/default/keymap.c
@@ -0,0 +1,22 @@
+// Copyright 2024 Alabahuy
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#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_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_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, 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_DEL, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUS, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, _______,
+ _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______
+ )
+};
diff --git a/keyboards/jaykeeb/jk65/keymaps/via/keymap.c b/keyboards/jaykeeb/jk65/keymaps/via/keymap.c
new file mode 100644
index 00000000000..bc93e7ea2be
--- /dev/null
+++ b/keyboards/jaykeeb/jk65/keymaps/via/keymap.c
@@ -0,0 +1,21 @@
+// Copyright 2024 Alabahuy
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#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_BSPC, KC_DEL, 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_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, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [1] = 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_PSCR, KC_SCRL, KC_PAUS, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, _______,
+ _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______
+ )
+};
diff --git a/keyboards/jaykeeb/jk65/keymaps/via/rules.mk b/keyboards/jaykeeb/jk65/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/jaykeeb/jk65/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/jaykeeb/jk65/matrix_diagram.md b/keyboards/jaykeeb/jk65/matrix_diagram.md
new file mode 100644
index 00000000000..7a36c0ae662
--- /dev/null
+++ b/keyboards/jaykeeb/jk65/matrix_diagram.md
@@ -0,0 +1,24 @@
+# Matrix Diagram for Jaykeeb JK65
+
+```
+ ┌───────┐
+ 2u Backspace │0D │
+ └───────┘
+┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
+│00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0A │0B │0C │0D │1D │0E │
+├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤
+│10 │11 │12 │13 │14 │15 │16 │17 │18 │19 │1A │1B │1C │2D │1E │
+├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤
+│20 │21 │22 │23 │24 │25 │26 │27 │28 │29 │2A │2B │2C │2E │
+├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤
+│30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3A │3B │3C │3D │3E │
+├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤
+│40 │41 │42 │46 │4A │4B │ │4C │4D │4E │
+└────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘
+┌────────┐
+│30 │ 2.25u LShift
+└────────┘
+┌─────┬───┬─────┬───────────────────────────┬─────┐
+│40 │41 │42 │46 │4B │ Blocker Tsangan
+└─────┴───┴─────┴───────────────────────────┴─────┘
+```
diff --git a/keyboards/jaykeeb/jk65/readme.md b/keyboards/jaykeeb/jk65/readme.md
new file mode 100644
index 00000000000..e0dbe05c581
--- /dev/null
+++ b/keyboards/jaykeeb/jk65/readme.md
@@ -0,0 +1,27 @@
+# JK65
+
+
+
+Layout 65% support multi layout and keyboard case exiting
+
+* Keyboard Maintainer: [Alabahuy](https://github.com/Alabahuy)
+* Hardware Supported: JK65 PCB, RP2040
+* Hardware Availability: Private GB
+
+Make example for this keyboard (after setting up your build environment):
+
+ make jaykeeb/jk65:default
+
+Flashing example for this keyboard:
+
+ make jaykeeb/jk65: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/jaykeeb/jk65/rules.mk b/keyboards/jaykeeb/jk65/rules.mk
new file mode 100644
index 00000000000..6e7633bfe01
--- /dev/null
+++ b/keyboards/jaykeeb/jk65/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
diff --git a/keyboards/jlw/bruce_le_clavier/info.json b/keyboards/jlw/bruce_le_clavier/info.json
new file mode 100644
index 00000000000..998140599dd
--- /dev/null
+++ b/keyboards/jlw/bruce_le_clavier/info.json
@@ -0,0 +1,82 @@
+{
+ "keyboard_name": "Bruce the Keyboard",
+ "manufacturer": "jlw",
+ "url": "https://github.com/josh-l-wang/Bruce-the-Keyboard-the-Resources",
+ "maintainer": "jlw",
+ "usb": {
+ "vid": "0x1209",
+ "pid": "0xA460",
+ "device_version": "0.0.1"
+ },
+ "processor": "STM32F072",
+ "bootloader": "stm32-dfu",
+ "diode_direction": "COL2ROW",
+ "matrix_pins": {
+ "cols": ["B1", "B0", "A7", "A4", "A3", "B7", "B6", "B5", "B4", "B3", "B14"],
+ "rows": ["B11", "B9", "A5", "A6", "B15"]
+ },
+ "features": {
+ "bootmagic": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "encoder": true
+ },
+ "bootmagic": {
+ "matrix": [4, 10]
+ },
+ "encoder": {
+ "rotary": [
+ {"pin_a": "B12", "pin_b": "B13"}
+ ]
+ },
+ "ws2812": {
+ "pin": "B8"
+ },
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0, "h":1.75},
+ {"matrix": [0, 1], "x": 1, "y": 0, "h":1.5},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0, "h":1.25},
+ {"matrix": [0, 4], "x": 4, "y": 0, "h":1.25},
+
+ {"matrix": [4, 10], "x": 5.25, "y": 0},
+
+ {"matrix": [0, 5], "x": 6.5, "y": 0, "h":1.25},
+ {"matrix": [0, 6], "x": 7.5, "y": 0, "h":1.25},
+ {"matrix": [0, 7], "x": 8.5, "y": 0},
+ {"matrix": [0, 8], "x": 9.5, "y": 0, "h":1.5},
+ {"matrix": [0, 9], "x": 10.5, "y": 0, "h":1.75},
+
+ {"matrix": [1, 0], "x": 0, "y": 1.75},
+ {"matrix": [1, 1], "x": 1, "y": 1.5},
+ {"matrix": [1, 2], "x": 2, "y": 1},
+ {"matrix": [1, 3], "x": 3, "y": 1.25},
+ {"matrix": [1, 4], "x": 4, "y": 1.25},
+ {"matrix": [1, 5], "x": 6.5, "y": 1.25},
+ {"matrix": [1, 6], "x": 7.5, "y": 1.25},
+ {"matrix": [1, 7], "x": 8.5, "y": 1},
+ {"matrix": [1, 8], "x": 9.5, "y": 1.5},
+ {"matrix": [1, 9], "x": 10.5,"y": 1.75},
+
+ {"matrix": [2, 0], "x": 0, "y": 2.75, "h":1.5},
+ {"matrix": [2, 1], "x": 1, "y": 2.5, "h":1.75},
+ {"matrix": [2, 2], "x": 2, "y": 2, "h":1.25},
+ {"matrix": [2, 3], "x": 3, "y": 2.25},
+ {"matrix": [2, 4], "x": 4, "y": 2.25},
+ {"matrix": [2, 5], "x": 6.5, "y": 2.25},
+ {"matrix": [2, 6], "x": 7.5, "y": 2.25},
+ {"matrix": [2, 7], "x": 8.5, "y": 2, "h":1.25},
+ {"matrix": [2, 8], "x": 9.5, "y": 2.5, "h":1.75},
+ {"matrix": [2, 9], "x": 10.5,"y": 2.75, "h":1.5},
+
+ {"matrix": [3, 2], "x": 2, "y": 3.25},
+ {"matrix": [3, 3], "x": 3, "y": 3.25, "w": 2},
+ {"matrix": [3, 5], "x": 6.5, "y": 3.25, "w": 2},
+ {"matrix": [3, 7], "x": 8.5, "y": 3.25}
+ ]
+ }
+ }
+}
diff --git a/keyboards/jlw/bruce_le_clavier/keymaps/default/keymap.c b/keyboards/jlw/bruce_le_clavier/keymaps/default/keymap.c
new file mode 100644
index 00000000000..51a8f0939d4
--- /dev/null
+++ b/keyboards/jlw/bruce_le_clavier/keymaps/default/keymap.c
@@ -0,0 +1,43 @@
+// Copyright 2023 jlw
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+ KC_Q, KC_W, KC_F, KC_P, KC_B, QK_BOOT, KC_J, KC_L, KC_U, KC_Y, KC_QUOT,
+ LGUI_T(KC_A), LALT_T(KC_R), LCTL_T(KC_S), KC_T, KC_G, KC_M, KC_N, RCTL_T(KC_E), LALT_T(KC_I), LGUI_T(KC_O),
+ KC_Z, KC_X, KC_C, KC_D, KC_V, KC_K, KC_H, KC_COMM, KC_DOT, KC_SLSH,
+ LT(3, KC_TAB), SFT_T(KC_BSPC), LT(1, KC_SPC), LT(2,KC_ENT)
+ ),
+
+ [1] = LAYOUT(
+ KC_GRAVE, KC_F2, XXXXXXX, KC_F4, KC_F5, XXXXXXX, KC_BSLS, KC_MINUS, KC_EQUAL, KC_LBRC, KC_RBRC,
+ KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,
+ DF(0), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DF(1), XXXXXXX, _______, _______, KC_SCLN,
+ _______, _______, _______, _______
+ ),
+
+ [2] = LAYOUT(
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_F11, KC_F12, XXXXXXX, XXXXXXX,
+ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10,
+ DF(0), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DF(2), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ _______, _______, _______, _______
+ ),
+ [3] = LAYOUT(
+ XXXXXXX, XXXXXXX, LSG(KC_4),LSG(KC_S),XXXXXXX, XXXXXXX, KC_HOME, XXXXXXX, KC_UP, XXXXXXX, KC_PGUP,
+ KC_LGUI, KC_LALT, KC_LCTL, KC_LGUI, XXXXXXX, KC_END, KC_LEFT, KC_DOWN, KC_RIGHT, KC_PGDN,
+ DF(0), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DF(2), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ _______, _______, _______, _______
+ )
+};
+
+// Encoder Map
+#ifdef ENCODER_MAP_ENABLE
+ const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
+ [0] = { ENCODER_CCW_CW(S(KC_F2), KC_F2) },
+ [1] = { ENCODER_CCW_CW(KC_VOLU, KC_VOLD) },
+ [2] = { ENCODER_CCW_CW(_______, _______) },
+ [3] = { ENCODER_CCW_CW(_______, _______) }
+ };
+#endif
diff --git a/keyboards/jlw/bruce_le_clavier/readme.md b/keyboards/jlw/bruce_le_clavier/readme.md
new file mode 100644
index 00000000000..7bef2d5eef7
--- /dev/null
+++ b/keyboards/jlw/bruce_le_clavier/readme.md
@@ -0,0 +1,53 @@
+# Bruce le Clavier
+
+Please note that Bruce le Clavier is a keyboard, not a human, and is also not Bruce the Keyboard.
+
+Bruce the Keyboard is a column staggered unibody split 35-key board created by [jlw](github.com/josh-l-wang), with the option to replace the middle key for an EC11 rotary encoder (with or without switch function).
+
+This keyboard has RGB, 3.3V, and GND pins broken out if you wish to add an LED strip.
+
+
+
+* Keyboard Maintainer: [jlw](https://github.com/josh-l-wang)
+* Hardware Supported: [Bruce le Clavier and Cases](https://github.com/josh-l-wang/Bruce-the-Keyboard-the-Resources)
+* Hardware Availability: [jlw-kb.com](https://jlw-kb.com)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make jlw/bruce_le_clavier:default
+
+Flashing example for this keyboard:
+
+ make jlw/bruce_le_clavier: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 (the top left key) and plug in the keyboard
+* **Physical reset button**: Hold button on the back of the PCB while plugging in the PCB
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
+
+
+
+
+# Ceci est le micrologiciel pour Bruce le clavier
+
+Notez bien que Bruce le clavier n'est pas un humain.
+
+Bruce le clavier est un clavier de 35 touches colonnaire créé par [jlw](github.com/josh-l-wang). Il y a une option d'utiliser un encodeur rotatif au centre.
+
+* Maintaineur de clavier: [jlw](https://github.com/josh-l-wang)
+* Matériel supporté: [Bruce le Clavier and Cases](https://github.com/josh-l-wang/Bruce-the-Keyboard-the-Resources)
+* Matériel disponibilité: [jlw-kb.com](https://jlw-kb.com)
+
+Exemple de « make » (après avoir installé votre environnement de développement):
+
+ make jlw/bruce_le_clavier:default
+
+Exemple de flash pour ce clavier:
+
+ make jlw/bruce_le_clavier:flash
+
\ No newline at end of file
diff --git a/keyboards/jlw/bruce_le_clavier/rules.mk b/keyboards/jlw/bruce_le_clavier/rules.mk
new file mode 100644
index 00000000000..d4f87a82781
--- /dev/null
+++ b/keyboards/jlw/bruce_le_clavier/rules.mk
@@ -0,0 +1 @@
+#This file intentionally left blank
diff --git a/keyboards/jlw/bruce_the_keyboard/info.json b/keyboards/jlw/bruce_the_keyboard/info.json
new file mode 100644
index 00000000000..0405869d408
--- /dev/null
+++ b/keyboards/jlw/bruce_the_keyboard/info.json
@@ -0,0 +1,68 @@
+{
+ "keyboard_name": "Bruce the Keyboard",
+ "manufacturer": "jlw",
+ "url": "https://github.com/josh-l-wang/Bruce-the-Keyboard-the-Resources",
+ "maintainer": "jlw",
+ "usb": {
+ "vid": "0x1209",
+ "pid": "0xA459",
+ "device_version": "3.0.0"
+ },
+ "processor": "STM32F072",
+ "bootloader": "stm32-dfu",
+ "diode_direction": "COL2ROW",
+ "matrix_pins": {
+ "cols": ["B1", "B0", "A7", "A4", "A3", "B7", "B6", "B5", "B4", "B3"],
+ "rows": ["B11", "B9", "A5", "A6"]
+ },
+ "features": {
+ "bootmagic": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true
+ },
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0, "h":1.75},
+ {"matrix": [0, 1], "x": 1, "y": 0, "h":1.5},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0, "h":1.25},
+ {"matrix": [0, 4], "x": 4, "y": 0, "h":1.25},
+ {"matrix": [0, 5], "x": 5, "y": 0, "h":1.25},
+ {"matrix": [0, 6], "x": 6, "y": 0, "h":1.25},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0, "h":1.5},
+ {"matrix": [0, 9], "x": 9, "y": 0, "h":1.75},
+
+ {"matrix": [1, 0], "x": 0, "y": 1.75},
+ {"matrix": [1, 1], "x": 1, "y": 1.5},
+ {"matrix": [1, 2], "x": 2, "y": 1},
+ {"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},
+ {"matrix": [1, 8], "x": 8, "y": 1.5},
+ {"matrix": [1, 9], "x": 9, "y": 1.75},
+
+ {"matrix": [2, 0], "x": 0, "y": 2.75, "h":1.5},
+ {"matrix": [2, 1], "x": 1, "y": 2.5, "h":1.75},
+ {"matrix": [2, 2], "x": 2, "y": 2, "h":1.25},
+ {"matrix": [2, 3], "x": 3, "y": 2.25},
+ {"matrix": [2, 4], "x": 4, "y": 2.25},
+ {"matrix": [2, 5], "x": 5, "y": 2.25},
+ {"matrix": [2, 6], "x": 6, "y": 2.25},
+ {"matrix": [2, 7], "x": 7, "y": 2, "h":1.25},
+ {"matrix": [2, 8], "x": 8, "y": 2.5, "h":1.75},
+ {"matrix": [2, 9], "x": 9, "y": 2.75, "h":1.5},
+
+ {"matrix": [3, 2], "x": 2, "y": 3.25},
+ {"matrix": [3, 3], "x": 3, "y": 3.25, "w": 2},
+ {"matrix": [3, 5], "x": 5, "y": 3.25, "w": 2},
+ {"matrix": [3, 7], "x": 7, "y": 3.25},
+ ]
+ }
+
+ }
+}
diff --git a/keyboards/jlw/bruce_the_keyboard/keymaps/default/keymap.c b/keyboards/jlw/bruce_the_keyboard/keymaps/default/keymap.c
new file mode 100644
index 00000000000..73ef2e0213c
--- /dev/null
+++ b/keyboards/jlw/bruce_the_keyboard/keymaps/default/keymap.c
@@ -0,0 +1,35 @@
+// Copyright 2024 jlw
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+ KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_QUOT,
+ LGUI_T(KC_A), LALT_T(KC_R), LCTL_T(KC_S), KC_T, KC_G, KC_M, KC_N, RCTL_T(KC_E), LALT_T(KC_I), LGUI_T(KC_O),
+ KC_Z, KC_X, KC_C, KC_D, KC_V, KC_K, KC_H, KC_COMM, KC_DOT, KC_SLSH,
+ LT(3, KC_TAB), SFT_T(KC_BSPC), LT(1, KC_SPC), LT(2,KC_ENT)
+ ),
+
+ [1] = LAYOUT(
+ KC_GRAVE, KC_F2, XXXXXXX, KC_F4, KC_F5, KC_BSLS, KC_MINUS, KC_EQUAL, KC_LBRC, KC_RBRC,
+ KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,
+ DF(0), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DF(1), XXXXXXX, _______, _______, KC_SCLN,
+ _______, _______, _______, _______
+ ),
+
+ [2] = LAYOUT(
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_F11, KC_F12, XXXXXXX, XXXXXXX,
+ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10,
+ DF(0), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DF(2), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ _______, _______, _______, _______
+ ),
+ [3] = LAYOUT(
+ XXXXXXX, XXXXXXX, LSG(KC_4),LSG(KC_S),XXXXXXX, KC_HOME, XXXXXXX, KC_UP, XXXXXXX, KC_PGUP,
+ KC_LGUI, KC_LALT, KC_LCTL, KC_LGUI, XXXXXXX, KC_END, KC_LEFT, KC_DOWN, KC_RIGHT, KC_PGDN,
+ DF(0), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DF(2), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ _______, _______, _______, _______
+ )
+};
\ No newline at end of file
diff --git a/keyboards/jlw/bruce_the_keyboard/readme.md b/keyboards/jlw/bruce_the_keyboard/readme.md
new file mode 100644
index 00000000000..a12624c3705
--- /dev/null
+++ b/keyboards/jlw/bruce_the_keyboard/readme.md
@@ -0,0 +1,29 @@
+# Bruce the Keyboard
+
+Please note that Bruce is a keyboard, not a human.
+
+Bruce the Keyboard is a column staggered 34-key board created by [jlw](github.com/josh-l-wang) and whydobearsxplod with a single layout.
+
+
+
+* Keyboard Maintainer: [jlw](https://github.com/josh-l-wang)
+* Hardware Supported: [Bruce the Keyboard the PCB and the Cases](https://github.com/josh-l-wang/Bruce-the-Keyboard-the-Resources)
+* Hardware Availability: [jlw-kb.com](https://jlw-kb.com)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make jlw/bruce_the_keyboard:default
+
+Flashing example for this keyboard:
+
+ make jlw/bruce_the_keyboard: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 (the top left key) and plug in the keyboard
+* **Physical reset button**: Hold button on the back of the PCB while plugging in the PCB
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
diff --git a/keyboards/jlw/bruce_the_keyboard/rules.mk b/keyboards/jlw/bruce_the_keyboard/rules.mk
new file mode 100644
index 00000000000..218d8921e51
--- /dev/null
+++ b/keyboards/jlw/bruce_the_keyboard/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank.
diff --git a/keyboards/jlw/vault35_wkl_universal/config.h b/keyboards/jlw/vault35_wkl_universal/config.h
new file mode 100644
index 00000000000..7edfb1b7c6b
--- /dev/null
+++ b/keyboards/jlw/vault35_wkl_universal/config.h
@@ -0,0 +1,11 @@
+// Copyright 2024 jlw
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define WS2812_PWM_DRIVER PWMD17
+#define WS2812_PWM_CHANNEL 1
+#define WS2812_PWM_PAL_MODE 2
+#define WS2812_PWM_COMPLEMENTARY_OUTPUT
+#define WS2812_DMA_STREAM STM32_DMA1_STREAM1
+#define WS2812_DMA_CHANNEL 1
diff --git a/keyboards/jlw/vault35_wkl_universal/halconf.h b/keyboards/jlw/vault35_wkl_universal/halconf.h
new file mode 100644
index 00000000000..e5c3093515a
--- /dev/null
+++ b/keyboards/jlw/vault35_wkl_universal/halconf.h
@@ -0,0 +1,8 @@
+// Copyright 2024 jlw
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define HAL_USE_PWM TRUE
+
+#include_next
diff --git a/keyboards/jlw/vault35_wkl_universal/info.json b/keyboards/jlw/vault35_wkl_universal/info.json
new file mode 100644
index 00000000000..3274b717731
--- /dev/null
+++ b/keyboards/jlw/vault35_wkl_universal/info.json
@@ -0,0 +1,765 @@
+{
+ "manufacturer": "jlw",
+ "keyboard_name": "vault 35 WKL universal",
+ "maintainer": "jlw",
+ "bootloader": "stm32-dfu",
+ "diode_direction": "COL2ROW",
+ "encoder": {
+ "rotary": [
+ {"pin_a": "B0", "pin_b": "A7"},
+ {"pin_a": "B2", "pin_b": "B1"},
+ {"pin_a": "B3", "pin_b": "A15"},
+ {"pin_a": "B5", "pin_b": "B4"},
+ {"pin_a": "A1", "pin_b": "A2"}
+ ]
+ },
+ "features": {
+ "bootmagic": true,
+ "encoder": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgb_matrix": true
+ },
+ "matrix_pins": {
+ "cols": ["B6", "B8", "A13", "B13", "B14", "A14", "A0", "A3", "A4", "A5", "A6"],
+ "rows": ["B9", "B12", "B15", "A8"]
+ },
+ "processor": "STM32F072",
+ "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",
+ "hue_steps": 4,
+ "layout": [
+ {"matrix": [1, 0], "x": 1, "y": 22, "flags": 4},
+ {"matrix": [0, 0], "x": 1, "y": 11, "flags": 4},
+ {"matrix": [0, 0], "x": 3, "y": 2, "flags": 4},
+ {"matrix": [0, 0], "x": 12, "y": 2, "flags": 4},
+ {"matrix": [0, 1], "x": 23, "y": 2, "flags": 4},
+ {"matrix": [1, 1], "x": 30, "y": 2, "flags": 4},
+ {"matrix": [0, 1], "x": 42, "y": 2, "flags": 4},
+ {"matrix": [0, 2], "x": 51, "y": 2, "flags": 4},
+ {"matrix": [1, 2], "x": 60, "y": 2, "flags": 4},
+ {"matrix": [0, 3], "x": 70, "y": 2, "flags": 4},
+ {"matrix": [1, 3], "x": 79, "y": 2, "flags": 4},
+ {"matrix": [0, 4], "x": 88, "y": 2, "flags": 4},
+ {"matrix": [0, 5], "x": 98, "y": 2, "flags": 4},
+ {"matrix": [0, 6], "x": 107, "y": 2, "flags": 4},
+ {"matrix": [0, 7], "x": 116, "y": 2, "flags": 4},
+ {"matrix": [1, 7], "x": 126, "y": 2, "flags": 4},
+ {"matrix": [0, 7], "x": 135, "y": 2, "flags": 4},
+ {"matrix": [0, 8], "x": 144, "y": 2, "flags": 4},
+ {"matrix": [1, 8], "x": 154, "y": 2, "flags": 4},
+ {"matrix": [0, 9], "x": 163, "y": 2, "flags": 4},
+ {"matrix": [1, 9], "x": 173, "y": 2, "flags": 4},
+ {"matrix": [0, 10], "x": 183, "y": 2, "flags": 4},
+ {"matrix": [0, 10], "x": 192, "y": 2, "flags": 4},
+ {"matrix": [0, 10], "x": 195, "y": 13, "flags": 4},
+ {"matrix": [1, 10], "x": 195, "y": 23, "flags": 4},
+ {"matrix": [1, 10], "x": 195, "y": 32, "flags": 4},
+ {"matrix": [1, 10], "x": 195, "y": 43, "flags": 4},
+ {"matrix": [2, 10], "x": 195, "y": 55, "flags": 4},
+ {"matrix": [2, 10], "x": 195, "y": 67, "flags": 4},
+ {"matrix": [3, 10], "x": 190, "y": 79, "flags": 4},
+ {"matrix": [3, 10], "x": 195, "y": 87, "flags": 4},
+ {"matrix": [3, 10], "x": 185, "y": 88, "flags": 4},
+ {"matrix": [3, 9], "x": 176, "y": 88, "flags": 4},
+ {"matrix": [3, 9], "x": 171, "y": 82, "flags": 4},
+ {"matrix": [2, 9], "x": 171, "y": 73, "flags": 4},
+ {"matrix": [2, 9], "x": 170, "y": 67, "flags": 4},
+ {"matrix": [2, 9], "x": 164, "y": 67, "flags": 4},
+ {"matrix": [2, 8], "x": 157, "y": 67, "flags": 4},
+ {"matrix": [2, 8], "x": 151, "y": 67, "flags": 4},
+ {"matrix": [3, 8], "x": 150, "y": 74, "flags": 4},
+ {"matrix": [2, 8], "x": 150, "y": 81, "flags": 4},
+ {"matrix": [3, 8], "x": 147, "y": 88, "flags": 4},
+ {"matrix": [3, 7], "x": 139, "y": 88, "flags": 4},
+ {"matrix": [2, 7], "x": 130, "y": 88, "flags": 4},
+ {"matrix": [3, 7], "x": 122, "y": 88, "flags": 4},
+ {"matrix": [3, 6], "x": 113, "y": 88, "flags": 4},
+ {"matrix": [2, 5], "x": 102, "y": 85, "flags": 4},
+ {"matrix": [3, 5], "x": 94, "y": 85, "flags": 4},
+ {"matrix": [3, 4], "x": 85, "y": 88, "flags": 4},
+ {"matrix": [2, 3], "x": 75, "y": 88, "flags": 4},
+ {"matrix": [3, 3], "x": 66, "y": 88, "flags": 4},
+ {"matrix": [2, 2], "x": 57, "y": 88, "flags": 4},
+ {"matrix": [3, 2], "x": 49, "y": 88, "flags": 4},
+ {"matrix": [3, 2], "x": 46, "y": 83, "flags": 4},
+ {"matrix": [3, 2], "x": 46, "y": 75, "flags": 4},
+ {"matrix": [2, 1], "x": 45, "y": 67, "flags": 4},
+ {"matrix": [2, 1], "x": 39, "y": 67, "flags": 4},
+ {"matrix": [2, 1], "x": 33, "y": 67, "flags": 4},
+ {"matrix": [2, 1], "x": 26, "y": 67, "flags": 4},
+ {"matrix": [3, 0], "x": 25, "y": 73, "flags": 4},
+ {"matrix": [3, 0], "x": 25, "y": 82, "flags": 4},
+ {"matrix": [3, 0], "x": 21, "y": 88, "flags": 4},
+ {"matrix": [3, 0], "x": 12, "y": 88, "flags": 4},
+ {"matrix": [3, 0], "x": 1, "y": 88, "flags": 4},
+ {"matrix": [3, 0], "x": 6, "y": 80, "flags": 4},
+ {"matrix": [3, 0], "x": 1, "y": 70, "flags": 4},
+ {"matrix": [2, 0], "x": 1, "y": 58, "flags": 4},
+ {"matrix": [2, 0], "x": 1, "y": 46, "flags": 4},
+ {"matrix": [1, 0], "x": 1, "y": 34, "flags": 4}
+ ],
+ "sat_steps": 4,
+ "val_steps": 4
+ },
+ "url": "https://jlw-kb.com",
+ "usb": {
+ "device_version": "0.0.1",
+ "pid": "0xA457",
+ "vid": "0x1209"
+ },
+ "ws2812": {
+ "driver": "pwm",
+ "pin": "B7"
+ },
+ "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": [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": [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": [3, 0], "x": 0, "y": 3, "w": 1.5},
+ {"matrix": [3, 2], "x": 2.5, "y": 3},
+ {"matrix": [3, 3], "x": 3.5, "y": 3},
+ {"matrix": [3, 4], "x": 4.5, "y": 3},
+ {"matrix": [3, 5], "x": 5.5, "y": 3},
+ {"matrix": [3, 6], "x": 6.5, "y": 3},
+ {"matrix": [3, 7], "x": 7.5, "y": 3},
+ {"matrix": [3, 10], "x": 9.5, "y": 3, "w": 1.5}
+ ]
+ },
+ "LAYOUT_alpha": {
+ "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": [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": [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, 6], "x": 5.5, "y": 2},
+ {"matrix": [2, 7], "x": 6.5, "y": 2},
+ {"matrix": [2, 8], "x": 7.5, "y": 2},
+ {"matrix": [2, 9], "x": 8.5, "y": 2},
+ {"matrix": [2, 10], "x": 9.5, "y": 2, "w": 1.5},
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.5},
+ {"matrix": [3, 2], "x": 2.5, "y": 3},
+ {"matrix": [3, 3], "x": 3.5, "y": 3},
+ {"matrix": [3, 4], "x": 4.5, "y": 3},
+ {"matrix": [3, 5], "x": 5.5, "y": 3},
+ {"matrix": [3, 6], "x": 6.5, "y": 3},
+ {"matrix": [3, 7], "x": 7.5, "y": 3},
+ {"matrix": [3, 10], "x": 9.5, "y": 3, "w": 1.5}
+ ]
+ },
+ "LAYOUT_katana": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0, "w": 1.5},
+ {"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, 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.5, "y": 0, "w": 1.25, "h": 2},
+ {"matrix": [1, 0], "x": 0.25, "y": 1},
+ {"matrix": [1, 1], "x": 1.25, "y": 1},
+ {"matrix": [1, 2], "x": 2.25, "y": 1},
+ {"matrix": [1, 3], "x": 3.25, "y": 1},
+ {"matrix": [1, 4], "x": 4.25, "y": 1},
+ {"matrix": [1, 6], "x": 5.75, "y": 1},
+ {"matrix": [1, 7], "x": 6.75, "y": 1},
+ {"matrix": [1, 8], "x": 7.75, "y": 1},
+ {"matrix": [1, 9], "x": 8.75, "y": 1},
+ {"matrix": [1, 10], "x": 9.75, "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": [3, 0], "x": 0, "y": 3, "w": 1.5},
+ {"matrix": [3, 2], "x": 2.5, "y": 3},
+ {"matrix": [3, 3], "x": 3.5, "y": 3},
+ {"matrix": [3, 4], "x": 4.5, "y": 3},
+ {"matrix": [3, 5], "x": 5.5, "y": 3},
+ {"matrix": [3, 6], "x": 6.5, "y": 3},
+ {"matrix": [3, 7], "x": 7.5, "y": 3},
+ {"matrix": [3, 10], "x": 9.5, "y": 3, "w": 1.5}
+ ]
+ },
+ "LAYOUT_katana_iso": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0, "w": 1.5},
+ {"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, 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.5, "y": 0, "w": 1.25, "h": 2},
+ {"matrix": [1, 0], "x": 0.25, "y": 1},
+ {"matrix": [1, 1], "x": 1.25, "y": 1},
+ {"matrix": [1, 2], "x": 2.25, "y": 1},
+ {"matrix": [1, 3], "x": 3.25, "y": 1},
+ {"matrix": [1, 4], "x": 4.25, "y": 1},
+ {"matrix": [1, 6], "x": 5.75, "y": 1},
+ {"matrix": [1, 7], "x": 6.75, "y": 1},
+ {"matrix": [1, 8], "x": 7.75, "y": 1},
+ {"matrix": [1, 9], "x": 8.75, "y": 1},
+ {"matrix": [1, 10], "x": 9.75, "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": [3, 0], "x": 0, "y": 3, "w": 1.5},
+ {"matrix": [3, 2], "x": 2.5, "y": 3},
+ {"matrix": [3, 3], "x": 3.5, "y": 3},
+ {"matrix": [3, 4], "x": 4.5, "y": 3},
+ {"matrix": [3, 5], "x": 5.5, "y": 3},
+ {"matrix": [3, 6], "x": 6.5, "y": 3},
+ {"matrix": [3, 7], "x": 7.5, "y": 3},
+ {"matrix": [3, 10], "x": 9.5, "y": 3, "w": 1.5}
+ ]
+ },
+ "LAYOUT_ortho_125_center1u": {
+ "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": [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": [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": [3, 0], "x": 0, "y": 3, "w": 1.5},
+ {"matrix": [3, 2], "x": 2.5, "y": 3, "w": 1.25},
+ {"matrix": [3, 3], "x": 3.75, "y": 3, "w": 1.25},
+ {"matrix": [3, 4], "x": 5, "y": 3},
+ {"matrix": [3, 6], "x": 6, "y": 3, "w": 1.25},
+ {"matrix": [3, 7], "x": 7.25, "y": 3, "w": 1.25},
+ {"matrix": [3, 10], "x": 9.5, "y": 3, "w": 1.5}
+ ]
+ },
+ "LAYOUT_ortho_150_center1u": {
+ "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": [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": [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": [3, 0], "x": 0, "y": 3, "w": 1.5},
+ {"matrix": [3, 2], "x": 2.5, "y": 3},
+ {"matrix": [3, 3], "x": 3.5, "y": 3, "w": 1.5},
+ {"matrix": [3, 4], "x": 5, "y": 3},
+ {"matrix": [3, 6], "x": 6, "y": 3, "w": 1.5},
+ {"matrix": [3, 7], "x": 7.5, "y": 3},
+ {"matrix": [3, 10], "x": 9.5, "y": 3, "w": 1.5}
+ ]
+ },
+ "LAYOUT_ortho_2u_bars": {
+ "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": [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": [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": [3, 0], "x": 0, "y": 3, "w": 1.5},
+ {"matrix": [3, 2], "x": 2.5, "y": 3},
+ {"matrix": [3, 3], "x": 3.5, "y": 3, "w": 2},
+ {"matrix": [3, 6], "x": 5.5, "y": 3, "w": 2},
+ {"matrix": [3, 7], "x": 7.5, "y": 3},
+ {"matrix": [3, 10], "x": 9.5, "y": 3, "w": 1.5}
+ ]
+ },
+ "LAYOUT_ortho_3u_bars": {
+ "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": [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": [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": [3, 0], "x": 0, "y": 3, "w": 1.5},
+ {"matrix": [3, 3], "x": 2.5, "y": 3, "w": 3},
+ {"matrix": [3, 6], "x": 5.5, "y": 3, "w": 3},
+ {"matrix": [3, 10], "x": 9.5, "y": 3, "w": 1.5}
+ ]
+ },
+ "LAYOUT_ortho_6u_bar": {
+ "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": [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": [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": [3, 0], "x": 0, "y": 3, "w": 1.5},
+ {"matrix": [3, 4], "x": 2.5, "y": 3, "w": 6},
+ {"matrix": [3, 10], "x": 9.5, "y": 3, "w": 1.5}
+ ]
+ },
+ "LAYOUT_ortho_cain_bars": {
+ "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": [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": [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": [3, 0], "x": 0, "y": 3, "w": 1.5},
+ {"matrix": [3, 2], "x": 2.5, "y": 3, "w": 1.25},
+ {"matrix": [3, 3], "x": 3.75, "y": 3, "w": 1.75},
+ {"matrix": [3, 6], "x": 5.5, "y": 3, "w": 1.75},
+ {"matrix": [3, 7], "x": 7.25, "y": 3, "w": 1.25},
+ {"matrix": [3, 10], "x": 9.5, "y": 3, "w": 1.5}
+ ]
+ },
+ "LAYOUT_ortho_centered_3u": {
+ "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": [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": [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": [3, 0], "x": 0, "y": 3, "w": 1.5},
+ {"matrix": [3, 2], "x": 2.5, "y": 3, "w": 1.5},
+ {"matrix": [3, 4], "x": 4, "y": 3, "w": 3},
+ {"matrix": [3, 7], "x": 7, "y": 3, "w": 1.5},
+ {"matrix": [3, 10], "x": 9.5, "y": 3, "w": 1.5}
+ ]
+ },
+ "LAYOUT_row": {
+ "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": [1, 0], "x": 0, "y": 1, "w": 1.25},
+ {"matrix": [1, 1], "x": 1.25, "y": 1},
+ {"matrix": [1, 2], "x": 2.25, "y": 1},
+ {"matrix": [1, 3], "x": 3.25, "y": 1},
+ {"matrix": [1, 4], "x": 4.25, "y": 1},
+ {"matrix": [1, 6], "x": 5.25, "y": 1},
+ {"matrix": [1, 7], "x": 6.25, "y": 1},
+ {"matrix": [1, 8], "x": 7.25, "y": 1},
+ {"matrix": [1, 9], "x": 8.25, "y": 1},
+ {"matrix": [1, 10], "x": 9.25, "y": 1, "w": 1.75},
+ {"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, 6], "x": 5.75, "y": 2},
+ {"matrix": [2, 7], "x": 6.75, "y": 2},
+ {"matrix": [2, 8], "x": 7.75, "y": 2},
+ {"matrix": [2, 9], "x": 8.75, "y": 2},
+ {"matrix": [2, 10], "x": 9.75, "y": 2, "w": 1.25},
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.5},
+ {"matrix": [3, 2], "x": 2.5, "y": 3},
+ {"matrix": [3, 3], "x": 3.5, "y": 3},
+ {"matrix": [3, 4], "x": 4.5, "y": 3},
+ {"matrix": [3, 5], "x": 5.5, "y": 3},
+ {"matrix": [3, 6], "x": 6.5, "y": 3},
+ {"matrix": [3, 7], "x": 7.5, "y": 3},
+ {"matrix": [3, 10], "x": 9.5, "y": 3, "w": 1.5}
+ ]
+ },
+ "LAYOUT_treadstone": {
+ "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": [1, 0], "x": 0.25, "y": 1},
+ {"matrix": [1, 1], "x": 1.25, "y": 1},
+ {"matrix": [1, 2], "x": 2.25, "y": 1},
+ {"matrix": [1, 3], "x": 3.25, "y": 1},
+ {"matrix": [1, 4], "x": 4.25, "y": 1},
+ {"matrix": [1, 6], "x": 5.75, "y": 1},
+ {"matrix": [1, 7], "x": 6.75, "y": 1},
+ {"matrix": [1, 8], "x": 7.75, "y": 1},
+ {"matrix": [1, 9], "x": 8.75, "y": 1},
+ {"matrix": [1, 10], "x": 9.75, "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": [3, 0], "x": 0, "y": 3, "w": 1.5},
+ {"matrix": [3, 2], "x": 2.5, "y": 3},
+ {"matrix": [3, 3], "x": 3.5, "y": 3},
+ {"matrix": [3, 4], "x": 4.5, "y": 3},
+ {"matrix": [3, 5], "x": 5.5, "y": 3},
+ {"matrix": [3, 6], "x": 6.5, "y": 3},
+ {"matrix": [3, 7], "x": 7.5, "y": 3},
+ {"matrix": [3, 10], "x": 9.5, "y": 3, "w": 1.5}
+ ]
+ },
+ "LAYOUT_uniform": {
+ "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": [1, 0], "x": 0, "y": 1, "w": 1.25},
+ {"matrix": [1, 1], "x": 1.25, "y": 1},
+ {"matrix": [1, 2], "x": 2.25, "y": 1},
+ {"matrix": [1, 3], "x": 3.25, "y": 1},
+ {"matrix": [1, 4], "x": 4.25, "y": 1},
+ {"matrix": [1, 6], "x": 5.25, "y": 1},
+ {"matrix": [1, 7], "x": 6.25, "y": 1},
+ {"matrix": [1, 8], "x": 7.25, "y": 1},
+ {"matrix": [1, 9], "x": 8.25, "y": 1},
+ {"matrix": [1, 10], "x": 9.25, "y": 1, "w": 1.75},
+ {"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, 6], "x": 5.5, "y": 2},
+ {"matrix": [2, 7], "x": 6.5, "y": 2},
+ {"matrix": [2, 8], "x": 7.5, "y": 2},
+ {"matrix": [2, 9], "x": 8.5, "y": 2},
+ {"matrix": [2, 10], "x": 9.5, "y": 2, "w": 1.5},
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.5},
+ {"matrix": [3, 2], "x": 2.5, "y": 3},
+ {"matrix": [3, 3], "x": 3.5, "y": 3},
+ {"matrix": [3, 4], "x": 4.5, "y": 3},
+ {"matrix": [3, 5], "x": 5.5, "y": 3},
+ {"matrix": [3, 6], "x": 6.5, "y": 3},
+ {"matrix": [3, 7], "x": 7.5, "y": 3},
+ {"matrix": [3, 10], "x": 9.5, "y": 3, "w": 1.5}
+ ]
+ }
+ }
+}
diff --git a/keyboards/jlw/vault35_wkl_universal/keymaps/default/keymap.c b/keyboards/jlw/vault35_wkl_universal/keymaps/default/keymap.c
new file mode 100644
index 00000000000..ae5f304eed6
--- /dev/null
+++ b/keyboards/jlw/vault35_wkl_universal/keymaps/default/keymap.c
@@ -0,0 +1,36 @@
+// Copyright 2024 jlw
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_all(
+ KC_Q, KC_W, KC_E, KC_R, KC_T, KC_VOLU, KC_Y, KC_U, KC_I, KC_O, KC_P,
+ KC_A, KC_S, KC_D, KC_F, KC_G, KC_VOLD, KC_H, KC_J, KC_K, KC_L, KC_QUOT,
+ KC_Z, KC_X, KC_C, KC_V, KC_B, RGB_TOG, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH,
+ KC_ESC, MO(1), KC_ENT, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_BSPC
+ ),
+
+ [1] = LAYOUT_all(
+ _______, _______, _______, _______, _______, _______, _______, KC_7, KC_8, KC_9, KC_0,
+ _______, _______, _______, _______, _______, _______, _______, KC_4, KC_5, KC_6, _______,
+ _______, _______, _______, _______, _______, QK_BOOT, _______, KC_1, KC_2, KC_3, _______,
+ _______, _______, _______, _______, _______, _______, MO(2), _______
+ ),
+
+ [2] = LAYOUT_all(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_LEFT, _______,
+ _______, _______, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______
+ )
+};
+
+#ifdef 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(RGB_HUD, RGB_HUI) },
+ [2] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI) }
+};
+#endif
+
diff --git a/keyboards/jlw/vault35_wkl_universal/keymaps/default/rules.mk b/keyboards/jlw/vault35_wkl_universal/keymaps/default/rules.mk
new file mode 100644
index 00000000000..a40474b4d5c
--- /dev/null
+++ b/keyboards/jlw/vault35_wkl_universal/keymaps/default/rules.mk
@@ -0,0 +1 @@
+ENCODER_MAP_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/jlw/vault35_wkl_universal/mcuconf.h b/keyboards/jlw/vault35_wkl_universal/mcuconf.h
new file mode 100644
index 00000000000..3f3e8009459
--- /dev/null
+++ b/keyboards/jlw/vault35_wkl_universal/mcuconf.h
@@ -0,0 +1,11 @@
+// Copyright 2024 jlw
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include_next
+
+#undef STM32_PWM_USE_TIM17
+#define STM32_PWM_USE_TIM17 TRUE
+#define STM32_TIM17_SUPPRESS_ISR
+
diff --git a/keyboards/jlw/vault35_wkl_universal/readme.md b/keyboards/jlw/vault35_wkl_universal/readme.md
new file mode 100644
index 00000000000..d06ee1a998b
--- /dev/null
+++ b/keyboards/jlw/vault35_wkl_universal/readme.md
@@ -0,0 +1,27 @@
+# Vault 35 WKL Universal
+
+
+
+A drop in replacement PCB for the Vault 35 WKL case, originally designed by ProjectCain Mechvault.
+
+* Keyboard Maintainer: [jlw](https://github.com/josh-l-wang)
+* Hardware Supported: Vault 35 WKL Universal PCB
+* Hardware Availability: [jlw-kb.com](https://jlw-kb.com)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make jlw/vault35_wkl_universal:default
+
+Flashing example for this keyboard:
+
+ make jlw/vault35_wkl_universal: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 (the top left key) and plug in the keyboard
+* **Physical reset button**: Hold button on the back of the PCB while plugging in the PCB
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
diff --git a/keyboards/jlw/vault35_wkl_universal/rules.mk b/keyboards/jlw/vault35_wkl_universal/rules.mk
new file mode 100644
index 00000000000..6e7633bfe01
--- /dev/null
+++ b/keyboards/jlw/vault35_wkl_universal/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
diff --git a/keyboards/keyten/imi60/info.json b/keyboards/keyten/imi60/info.json
new file mode 100644
index 00000000000..2ccf8314116
--- /dev/null
+++ b/keyboards/keyten/imi60/info.json
@@ -0,0 +1,92 @@
+{
+ "manufacturer": "keyten",
+ "keyboard_name": "imi60",
+ "maintainer": "key10iq",
+ "bootloader": "stm32-dfu",
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true
+ },
+ "matrix_pins": {
+ "cols": ["A15", "A5", "F1", "A6", "F0", "A7", "C15", "B0", "C14", "B1", "C13", "B11", "B4", "B3"],
+ "rows": ["B10", "B2", "B7", "B6", "B5"]
+ },
+ "processor": "STM32F072",
+ "usb": {
+ "device_version": "0.0.1",
+ "pid": "0x6005",
+ "vid": "0xEB69"
+ },
+ "community_layouts": ["60_tsangan_hhkb"],
+ "layouts": {
+ "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": [2, 13], "x": 14, "y": 0},
+ {"matrix": [1, 0], "w": 1.5, "x": 0, "y": 1},
+ {"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], "w": 1.5, "x": 13.5, "y": 1},
+ {"matrix": [2, 0], "w": 1.75, "x": 0, "y": 2},
+ {"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], "w": 2.25, "x": 12.75, "y": 2},
+ {"matrix": [3, 0], "w": 2.25, "x": 0, "y": 3},
+ {"matrix": [3, 1], "x": 2.25, "y": 3},
+ {"matrix": [3, 2], "x": 3.25, "y": 3},
+ {"matrix": [3, 3], "x": 4.25, "y": 3},
+ {"matrix": [3, 4], "x": 5.25, "y": 3},
+ {"matrix": [3, 5], "x": 6.25, "y": 3},
+ {"matrix": [3, 6], "x": 7.25, "y": 3},
+ {"matrix": [3, 7], "x": 8.25, "y": 3},
+ {"matrix": [3, 8], "x": 9.25, "y": 3},
+ {"matrix": [3, 9], "x": 10.25, "y": 3},
+ {"matrix": [3, 10], "x": 11.25, "y": 3},
+ {"matrix": [4, 12], "w": 1.75, "x": 12.25, "y": 3},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+ {"matrix": [4, 0], "w": 1.5, "x": 0, "y": 4},
+ {"matrix": [4, 1], "x": 1.5, "y": 4},
+ {"matrix": [4, 2], "w": 1.5, "x": 2.5, "y": 4},
+ {"matrix": [4, 6], "w": 7, "x": 4, "y": 4},
+ {"matrix": [4, 10], "w": 1.5, "x": 11, "y": 4},
+ {"matrix": [4, 11], "x": 12.5, "y": 4},
+ {"matrix": [4, 13], "w": 1.5, "x": 13.5, "y": 4}
+ ]
+ }
+ }
+}
diff --git a/keyboards/keyten/imi60/keymaps/default/keymap.c b/keyboards/keyten/imi60/keymaps/default/keymap.c
new file mode 100644
index 00000000000..36859fad550
--- /dev/null
+++ b/keyboards/keyten/imi60/keymaps/default/keymap.c
@@ -0,0 +1,22 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT_60_tsangan_hhkb(
+ 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_GRV,
+ 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_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL
+ ),
+
+ [1] = LAYOUT_60_tsangan_hhkb(
+ 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_INS, KC_DEL,
+ KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, KC_UP, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_TRNS,
+ KC_TRNS, KC_MPRV, KC_MNXT, KC_MPLY, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ )
+};
diff --git a/keyboards/keyten/imi60/keymaps/via/keymap.c b/keyboards/keyten/imi60/keymaps/via/keymap.c
new file mode 100644
index 00000000000..36859fad550
--- /dev/null
+++ b/keyboards/keyten/imi60/keymaps/via/keymap.c
@@ -0,0 +1,22 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT_60_tsangan_hhkb(
+ 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_GRV,
+ 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_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL
+ ),
+
+ [1] = LAYOUT_60_tsangan_hhkb(
+ 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_INS, KC_DEL,
+ KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, KC_UP, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_TRNS,
+ KC_TRNS, KC_MPRV, KC_MNXT, KC_MPLY, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ )
+};
diff --git a/keyboards/keyten/imi60/keymaps/via/rules.mk b/keyboards/keyten/imi60/keymaps/via/rules.mk
new file mode 100644
index 00000000000..036bd6d1c3e
--- /dev/null
+++ b/keyboards/keyten/imi60/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/keyten/imi60/readme.md b/keyboards/keyten/imi60/readme.md
new file mode 100644
index 00000000000..0d4db774e09
--- /dev/null
+++ b/keyboards/keyten/imi60/readme.md
@@ -0,0 +1,27 @@
+# keyten imi60
+
+imi60 - 60% PCB compatible with keyboards by La-Versa: Animi, Mirimi and Otsukimi
+
+
+
+* Keyboard Maintainer: [keyten](https://github.com/key10iq)
+* Hardware Supported: keyten imi60
+* Hardware Availability: private GB
+
+Make example for this keyboard (after setting up your build environment):
+
+ make keyten/imi60:default
+
+Flashing example for this keyboard:
+
+ make keyten/imi60: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
+* Keycode in layout: Press the key mapped to `QK_BOOT` if it is available
+* Physical reset button: Hold the button on the back of the PCB
diff --git a/keyboards/keyten/imi60/rules.mk b/keyboards/keyten/imi60/rules.mk
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/keyboards/mechwild/bb65/config.h b/keyboards/mechwild/bb65/config.h
new file mode 100644
index 00000000000..0792ca7f590
--- /dev/null
+++ b/keyboards/mechwild/bb65/config.h
@@ -0,0 +1,10 @@
+// Copyright 2023 Kyle McCreery (@kylemccreery)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define WS2812_PWM_DRIVER PWMD5
+#define WS2812_PWM_CHANNEL 2
+#define WS2812_PWM_PAL_MODE 2
+#define WS2812_DMA_STREAM STM32_DMA1_STREAM6
+#define WS2812_DMA_CHANNEL 6
diff --git a/keyboards/mechwild/bb65/f401/info.json b/keyboards/mechwild/bb65/f401/info.json
new file mode 100644
index 00000000000..797e9900595
--- /dev/null
+++ b/keyboards/mechwild/bb65/f401/info.json
@@ -0,0 +1,3 @@
+{
+ "development_board": "blackpill_f401"
+}
diff --git a/keyboards/mechwild/bb65/f401/rules.mk b/keyboards/mechwild/bb65/f401/rules.mk
new file mode 100644
index 00000000000..6e7633bfe01
--- /dev/null
+++ b/keyboards/mechwild/bb65/f401/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
diff --git a/keyboards/mechwild/bb65/f411/info.json b/keyboards/mechwild/bb65/f411/info.json
new file mode 100644
index 00000000000..a41c5f4dd14
--- /dev/null
+++ b/keyboards/mechwild/bb65/f411/info.json
@@ -0,0 +1,3 @@
+{
+ "development_board": "blackpill_f411"
+}
diff --git a/keyboards/mechwild/bb65/f411/rules.mk b/keyboards/mechwild/bb65/f411/rules.mk
new file mode 100644
index 00000000000..6e7633bfe01
--- /dev/null
+++ b/keyboards/mechwild/bb65/f411/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
diff --git a/keyboards/mechwild/bb65/halconf.h b/keyboards/mechwild/bb65/halconf.h
new file mode 100644
index 00000000000..d9ca9492565
--- /dev/null
+++ b/keyboards/mechwild/bb65/halconf.h
@@ -0,0 +1,8 @@
+// Copyright 2023 Kyle McCreery (@kylemccreery)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define HAL_USE_PWM TRUE
+
+#include_next
diff --git a/keyboards/mechwild/bb65/info.json b/keyboards/mechwild/bb65/info.json
new file mode 100644
index 00000000000..a9d812d827f
--- /dev/null
+++ b/keyboards/mechwild/bb65/info.json
@@ -0,0 +1,192 @@
+{
+ "manufacturer": "MechWild",
+ "keyboard_name": "BB65",
+ "bootloader_instructions": "Hold down the BOOT button, then tap the NRST button on the BlackPill. Avoid touching the A11 and A12 pins.",
+ "diode_direction": "COL2ROW",
+ "encoder": {
+ "rotary": [
+ {"pin_a": "A3", "pin_b": "A2"}
+ ]
+ },
+ "features": {
+ "bootmagic": true,
+ "encoder": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgblight": true
+ },
+ "matrix_pins": {
+ "cols": ["B14", "B15", "A8", "A15", "B4", "B5", "B8", "B9", "B0"],
+ "rows": ["B13", "B3", "B10", "A7", "A6", "B12", "B1", "A5"]
+ },
+ "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
+ },
+ "brightness_steps": 8,
+ "led_count": 10,
+ "saturation_steps": 8
+ },
+ "url": "https://mechwild.com/product/bb65/",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x1712",
+ "vid": "0x6D77"
+ },
+ "ws2812": {
+ "driver": "pwm",
+ "pin": "A1"
+ },
+ "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": [5, 8], "x": 9, "y": 0},
+ {"matrix": [5, 7], "x": 10, "y": 0},
+ {"matrix": [5, 6], "x": 11, "y": 0},
+ {"matrix": [5, 5], "x": 12, "y": 0},
+ {"matrix": [5, 4], "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": [6, 8], "x": 9.5, "y": 1},
+ {"matrix": [6, 7], "x": 10.5, "y": 1},
+ {"matrix": [6, 6], "x": 11.5, "y": 1},
+ {"matrix": [6, 5], "x": 12.5, "y": 1},
+ {"matrix": [6, 4], "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": [7, 0], "x": 9.75, "y": 2},
+ {"matrix": [6, 0], "x": 10.75, "y": 2},
+ {"matrix": [6, 1], "x": 11.75, "y": 2},
+ {"matrix": [6, 2], "x": 12.75, "y": 2},
+ {"matrix": [6, 3], "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": [7, 8], "x": 9.25, "y": 3},
+ {"matrix": [7, 7], "x": 10.25, "y": 3},
+ {"matrix": [7, 6], "x": 11.25, "y": 3},
+ {"matrix": [7, 5], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [7, 4], "x": 15.5, "y": 3},
+ {"matrix": [7, 3], "x": 14.25, "y": 3.25},
+ {"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, 5], "x": 3.75, "y": 4, "w": 6.25},
+ {"matrix": [4, 3], "x": 10, "y": 4},
+ {"matrix": [4, 4], "x": 11, "y": 4},
+ {"matrix": [4, 6], "x": 12, "y": 4},
+ {"matrix": [4, 7], "x": 13.25, "y": 4.25},
+ {"matrix": [4, 8], "x": 14.25, "y": 4.25},
+ {"matrix": [7, 2], "x": 15.25, "y": 4.25}
+ ]
+ },
+ "LAYOUT_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": [5, 8], "x": 9, "y": 0},
+ {"matrix": [5, 7], "x": 10, "y": 0},
+ {"matrix": [5, 6], "x": 11, "y": 0},
+ {"matrix": [5, 5], "x": 12, "y": 0},
+ {"matrix": [5, 4], "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": [6, 8], "x": 9.5, "y": 1},
+ {"matrix": [6, 7], "x": 10.5, "y": 1},
+ {"matrix": [6, 6], "x": 11.5, "y": 1},
+ {"matrix": [6, 5], "x": 12.5, "y": 1},
+ {"matrix": [6, 4], "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": [7, 0], "x": 9.75, "y": 2},
+ {"matrix": [6, 0], "x": 10.75, "y": 2},
+ {"matrix": [6, 1], "x": 11.75, "y": 2},
+ {"matrix": [6, 3], "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": [7, 8], "x": 9.25, "y": 3},
+ {"matrix": [7, 7], "x": 10.25, "y": 3},
+ {"matrix": [7, 6], "x": 11.25, "y": 3},
+ {"matrix": [7, 5], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [7, 4], "x": 15.5, "y": 3},
+ {"matrix": [7, 3], "x": 14.25, "y": 3.25},
+ {"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, 5], "x": 3.75, "y": 4, "w": 6.25},
+ {"matrix": [4, 3], "x": 10, "y": 4},
+ {"matrix": [4, 4], "x": 11, "y": 4},
+ {"matrix": [4, 6], "x": 12, "y": 4},
+ {"matrix": [4, 7], "x": 13.25, "y": 4.25},
+ {"matrix": [4, 8], "x": 14.25, "y": 4.25},
+ {"matrix": [7, 2], "x": 15.25, "y": 4.25}
+ ]
+ }
+ }
+}
diff --git a/keyboards/mechwild/bb65/keymaps/default/keymap.json b/keyboards/mechwild/bb65/keymaps/default/keymap.json
new file mode 100644
index 00000000000..31d55e5f95a
--- /dev/null
+++ b/keyboards/mechwild/bb65/keymaps/default/keymap.json
@@ -0,0 +1,31 @@
+{
+ "keyboard": "mechwild/bb65/f401",
+ "keymap": "default",
+ "version": 1,
+ "layout": "LAYOUT_all",
+ "layers": [
+ [
+ "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_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",
+ "MO(1)", "KC_A", "KC_S", "KC_D", "KC_F", "KC_G", "KC_H", "KC_J", "KC_K", "KC_L", "KC_SCLN", "KC_QUOT", "KC_TRNS", "KC_ENT",
+ "KC_LSFT", "KC_TRNS", "KC_Z", "KC_X", "KC_C", "KC_V", "KC_B", "KC_N", "KC_M", "KC_COMM", "KC_DOT", "KC_SLSH", "KC_RSFT", "KC_UP", "RGB_TOG",
+ "RGB_RMOD", "KC_LGUI", "RGB_MOD", "KC_SPC", "KC_RALT", "KC_RGUI", "KC_RCTL", "KC_LEFT", "KC_DOWN", "KC_RGHT"
+ ],
+ [
+ "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_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_PGUP", "KC_TRNS",
+ "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_HOME", "KC_PGDN", "KC_END"
+ ]
+ ],
+ "config": {
+ "features": {
+ "encoder_map": true
+ }
+ },
+ "encoders": [
+ [{"ccw": "KC_VOLD", "cw": "KC_VOLU"}],
+ [{"ccw": "KC_TRNS", "cw": "KC_TRNS"}]
+ ]
+}
diff --git a/keyboards/mechwild/bb65/keymaps/via/keymap.json b/keyboards/mechwild/bb65/keymaps/via/keymap.json
new file mode 100644
index 00000000000..1e6ebcb717c
--- /dev/null
+++ b/keyboards/mechwild/bb65/keymaps/via/keymap.json
@@ -0,0 +1,32 @@
+{
+ "keyboard": "mechwild/bb65/f401",
+ "keymap": "via",
+ "version": 1,
+ "layout": "LAYOUT_all",
+ "layers": [
+ [
+ "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_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",
+ "MO(1)", "KC_A", "KC_S", "KC_D", "KC_F", "KC_G", "KC_H", "KC_J", "KC_K", "KC_L", "KC_SCLN", "KC_QUOT", "KC_TRNS", "KC_ENT",
+ "KC_LSFT", "KC_TRNS", "KC_Z", "KC_X", "KC_C", "KC_V", "KC_B", "KC_N", "KC_M", "KC_COMM", "KC_DOT", "KC_SLSH", "KC_RSFT", "KC_UP", "RGB_TOG",
+ "RGB_RMOD", "KC_LGUI", "RGB_MOD", "KC_SPC", "KC_RALT", "KC_RGUI", "KC_RCTL", "KC_LEFT", "KC_DOWN", "KC_RGHT"
+ ],
+ [
+ "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_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_PGUP", "KC_TRNS",
+ "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_HOME", "KC_PGDN", "KC_END"
+ ]
+ ],
+ "config": {
+ "features": {
+ "encoder_map": true,
+ "via": true
+ }
+ },
+ "encoders": [
+ [{"ccw": "KC_VOLD", "cw": "KC_VOLU"}],
+ [{"ccw": "KC_TRNS", "cw": "KC_TRNS"}]
+ ]
+}
diff --git a/keyboards/mechwild/bb65/mcuconf.h b/keyboards/mechwild/bb65/mcuconf.h
new file mode 100644
index 00000000000..f9e61e737de
--- /dev/null
+++ b/keyboards/mechwild/bb65/mcuconf.h
@@ -0,0 +1,9 @@
+// Copyright 2023 Kyle McCreery (@kylemccreery)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include_next
+
+#undef STM32_PWM_USE_TIM5
+#define STM32_PWM_USE_TIM5 TRUE
diff --git a/keyboards/mechwild/bb65/readme.md b/keyboards/mechwild/bb65/readme.md
new file mode 100644
index 00000000000..43416f90c1b
--- /dev/null
+++ b/keyboards/mechwild/bb65/readme.md
@@ -0,0 +1,23 @@
+# BB65
+
+
+
+BB65 is a completely normal BlackPill-powered 65% DIY kit. It’s got all the letters, a number row, and arrow keys. Basic as it can be.
+
+The `f401` version is the standard for this kit, using an STM32F401 BlackPill. The `f411` version will not run on an STM32F401 BlackPill; if in doubt, use `f401`.
+
+* Keyboard Maintainer: [Kyle McCreery](https://github.com/kylemccreery)
+* Hardware Supported: BB65 v1.0
+* Hardware Availability: [BB65 on MechWild](https://mechwild.com/product/bb65/)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make mechwild/bb65/f401:default
+ make mechwild/bb65/f411:default
+
+Flashing example for this keyboard:
+
+ make mechwild/bb65/f401:default:flash
+ make mechwild/bb65/f411: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/novelkeys/nk_classic_tkl/config.h b/keyboards/novelkeys/nk_classic_tkl/config.h
new file mode 100644
index 00000000000..62744a2589b
--- /dev/null
+++ b/keyboards/novelkeys/nk_classic_tkl/config.h
@@ -0,0 +1,25 @@
+/* Copyright 2024 Yiancar-Designs
+ *
+ * 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
+
+/* RGB options */
+
+#define WS2812_PWM_DRIVER PWMD3
+#define WS2812_PWM_CHANNEL 3
+#define WS2812_PWM_PAL_MODE 1
+#define WS2812_DMA_STREAM STM32_DMA1_STREAM3
+#define WS2812_DMA_CHANNEL 3
diff --git a/keyboards/novelkeys/nk_classic_tkl/halconf.h b/keyboards/novelkeys/nk_classic_tkl/halconf.h
new file mode 100644
index 00000000000..c7f5bab5c85
--- /dev/null
+++ b/keyboards/novelkeys/nk_classic_tkl/halconf.h
@@ -0,0 +1,21 @@
+/* Copyright 2024 Yiancar-Designs
+ *
+ * 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
diff --git a/keyboards/novelkeys/nk_classic_tkl/info.json b/keyboards/novelkeys/nk_classic_tkl/info.json
new file mode 100755
index 00000000000..53d10ce32ae
--- /dev/null
+++ b/keyboards/novelkeys/nk_classic_tkl/info.json
@@ -0,0 +1,270 @@
+{
+ "manufacturer": "Yiancar-Designs",
+ "keyboard_name": "NK_ Classic TKL",
+ "maintainer": "Yiancar",
+ "bootloader": "stm32-dfu",
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgb_matrix": true
+ },
+ "matrix_pins": {
+ "cols": ["B12", "B13", "B14", "B15", "A8", "A10", "A14", "A15", "B3", "B4", "B5", "B6", "B7", "B8", "B9", "A0", "A1"],
+ "rows": ["B11", "B10", "B2", "B1", "A9", "A5"]
+ },
+ "processor": "STM32F072",
+ "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, 0], "x": 0, "y": 0, "flags": 1},
+ {"matrix": [0, 1], "x": 26, "y": 0, "flags": 4},
+ {"matrix": [0, 2], "x": 38, "y": 0, "flags": 4},
+ {"matrix": [0, 3], "x": 51, "y": 0, "flags": 4},
+ {"matrix": [0, 4], "x": 64, "y": 0, "flags": 4},
+ {"matrix": [0, 5], "x": 83, "y": 0, "flags": 1},
+ {"matrix": [0, 6], "x": 96, "y": 0, "flags": 1},
+ {"matrix": [0, 7], "x": 109, "y": 0, "flags": 1},
+ {"matrix": [0, 8], "x": 122, "y": 0, "flags": 1},
+ {"matrix": [0, 9], "x": 141, "y": 0, "flags": 4},
+ {"matrix": [0, 10], "x": 154, "y": 0, "flags": 4},
+ {"matrix": [0, 11], "x": 166, "y": 0, "flags": 4},
+ {"matrix": [0, 12], "x": 179, "y": 0, "flags": 4},
+ {"matrix": [0, 14], "x": 195, "y": 0, "flags": 1},
+ {"matrix": [0, 15], "x": 208, "y": 0, "flags": 1},
+ {"matrix": [0, 16], "x": 221, "y": 0, "flags": 1},
+ {"matrix": [1, 16], "x": 221, "y": 15, "flags": 1},
+ {"matrix": [1, 15], "x": 208, "y": 15, "flags": 1},
+ {"matrix": [1, 14], "x": 195, "y": 15, "flags": 1},
+ {"matrix": [1, 13], "x": 173, "y": 15, "flags": 1},
+ {"matrix": [1, 12], "x": 154, "y": 15, "flags": 4},
+ {"matrix": [1, 11], "x": 141, "y": 15, "flags": 4},
+ {"matrix": [1, 10], "x": 128, "y": 15, "flags": 4},
+ {"matrix": [1, 9], "x": 115, "y": 15, "flags": 4},
+ {"matrix": [1, 8], "x": 102, "y": 15, "flags": 4},
+ {"matrix": [1, 7], "x": 90, "y": 15, "flags": 4},
+ {"matrix": [1, 6], "x": 77, "y": 15, "flags": 4},
+ {"matrix": [1, 5], "x": 64, "y": 15, "flags": 4},
+ {"matrix": [1, 4], "x": 51, "y": 15, "flags": 4},
+ {"matrix": [1, 3], "x": 38, "y": 15, "flags": 4},
+ {"matrix": [1, 2], "x": 26, "y": 15, "flags": 4},
+ {"matrix": [1, 1], "x": 13, "y": 15, "flags": 4},
+ {"matrix": [1, 0], "x": 0, "y": 15, "flags": 4},
+ {"matrix": [2, 0], "x": 3, "y": 27, "flags": 1},
+ {"matrix": [2, 1], "x": 19, "y": 27, "flags": 4},
+ {"matrix": [2, 2], "x": 32, "y": 27, "flags": 4},
+ {"matrix": [2, 3], "x": 45, "y": 27, "flags": 4},
+ {"matrix": [2, 4], "x": 58, "y": 27, "flags": 4},
+ {"matrix": [2, 5], "x": 70, "y": 27, "flags": 4},
+ {"matrix": [2, 6], "x": 83, "y": 27, "flags": 4},
+ {"matrix": [2, 7], "x": 96, "y": 27, "flags": 4},
+ {"matrix": [2, 8], "x": 109, "y": 27, "flags": 4},
+ {"matrix": [2, 9], "x": 122, "y": 27, "flags": 4},
+ {"matrix": [2, 10], "x": 134, "y": 27, "flags": 4},
+ {"matrix": [2, 11], "x": 147, "y": 27, "flags": 4},
+ {"matrix": [2, 12], "x": 160, "y": 27, "flags": 4},
+ {"matrix": [3, 12], "x": 176, "y": 27, "flags": 4},
+ {"matrix": [2, 14], "x": 195, "y": 27, "flags": 1},
+ {"matrix": [2, 15], "x": 208, "y": 27, "flags": 1},
+ {"matrix": [2, 16], "x": 221, "y": 27, "flags": 1},
+ {"x": 224, "y": 34, "flags": 9},
+ {"x": 218, "y": 34, "flags": 9},
+ {"x": 211, "y": 34, "flags": 9},
+ {"x": 205, "y": 34, "flags": 9},
+ {"x": 198, "y": 34, "flags": 9},
+ {"x": 192, "y": 34, "flags": 9},
+ {"matrix": [3, 13], "x": 171, "y": 40, "flags": 1},
+ {"matrix": [3, 11], "x": 150, "y": 40, "flags": 4},
+ {"matrix": [3, 10], "x": 138, "y": 40, "flags": 4},
+ {"matrix": [3, 9], "x": 125, "y": 40, "flags": 4},
+ {"matrix": [3, 8], "x": 112, "y": 40, "flags": 4},
+ {"matrix": [3, 7], "x": 99, "y": 40, "flags": 4},
+ {"matrix": [3, 6], "x": 86, "y": 40, "flags": 4},
+ {"matrix": [3, 5], "x": 74, "y": 40, "flags": 4},
+ {"matrix": [3, 4], "x": 61, "y": 40, "flags": 4},
+ {"matrix": [3, 3], "x": 48, "y": 40, "flags": 4},
+ {"matrix": [3, 2], "x": 35, "y": 40, "flags": 4},
+ {"matrix": [3, 1], "x": 22, "y": 40, "flags": 4},
+ {"matrix": [3, 0], "x": 5, "y": 40, "flags": 1},
+ {"matrix": [4, 0], "x": 8, "y": 52, "flags": 1},
+ {"matrix": [4, 2], "x": 29, "y": 52, "flags": 4},
+ {"matrix": [4, 3], "x": 42, "y": 52, "flags": 4},
+ {"matrix": [4, 4], "x": 54, "y": 52, "flags": 4},
+ {"matrix": [4, 5], "x": 67, "y": 52, "flags": 4},
+ {"matrix": [4, 6], "x": 80, "y": 52, "flags": 4},
+ {"matrix": [4, 7], "x": 93, "y": 52, "flags": 4},
+ {"matrix": [4, 8], "x": 106, "y": 52, "flags": 4},
+ {"matrix": [4, 9], "x": 118, "y": 52, "flags": 4},
+ {"matrix": [4, 10], "x": 131, "y": 52, "flags": 4},
+ {"matrix": [4, 11], "x": 144, "y": 52, "flags": 4},
+ {"matrix": [4, 12], "x": 168, "y": 52, "flags": 1},
+ {"matrix": [4, 15], "x": 208, "y": 52, "flags": 1},
+ {"matrix": [5, 16], "x": 221, "y": 64, "flags": 1},
+ {"matrix": [5, 15], "x": 208, "y": 64, "flags": 1},
+ {"matrix": [5, 14], "x": 195, "y": 64, "flags": 1},
+ {"matrix": [5, 13], "x": 176, "y": 64, "flags": 1},
+ {"matrix": [5, 12], "x": 160, "y": 64, "flags": 1},
+ {"matrix": [5, 11], "x": 144, "y": 64, "flags": 1},
+ {"matrix": [5, 6], "x": 90, "y": 64, "flags": 4},
+ {"matrix": [5, 2], "x": 35, "y": 64, "flags": 1},
+ {"matrix": [5, 1], "x": 19, "y": 64, "flags": 1},
+ {"matrix": [5, 0], "x": 3, "y": 64, "flags": 1}
+ ],
+ "max_brightness": 120,
+ "sleep": true
+ },
+ "url": "www.yiancar-designs.com",
+ "usb": {
+ "device_version": "0.0.1",
+ "pid": "0x4E54",
+ "vid": "0x8968"
+ },
+ "ws2812": {
+ "driver": "pwm",
+ "pin": "B0"
+ },
+ "layout_aliases": {
+ "LAYOUT": "LAYOUT_tkl_ansi_tsangan"
+ },
+ "layouts": {
+ "LAYOUT_tkl_ansi_tsangan": {
+ "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, 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.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, 14], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 15], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 16], "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": [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.25, "y": 2.25},
+ {"matrix": [2, 16], "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, 15], "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, 6], "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, 14], "x": 15.25, "y": 5.25},
+ {"matrix": [5, 15], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 16], "x": 17.25, "y": 5.25}
+ ]
+ }
+ }
+}
diff --git a/keyboards/novelkeys/nk_classic_tkl/keymaps/default/keymap.c b/keyboards/novelkeys/nk_classic_tkl/keymaps/default/keymap.c
new file mode 100644
index 00000000000..a99350ef7fc
--- /dev/null
+++ b/keyboards/novelkeys/nk_classic_tkl/keymaps/default/keymap.c
@@ -0,0 +1,69 @@
+/* Copyright 2024 Yiancar-Designs
+ *
+ * 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 my_keycodes {
+ RETRO_RGB = QK_USER_0
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = LAYOUT_tkl_ansi_tsangan( /* 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, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
+
+[1] = LAYOUT_tkl_ansi_tsangan( /* FN */
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLU, KC_VOLD, KC_MUTE,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, RGB_SPD, RGB_SPI, _______, _______,
+ _______, _______, _______, RETRO_RGB, _______, _______, _______, _______, _______, _______),
+
+};
+
+bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
+ if (host_keyboard_led_state().caps_lock) {
+ for (uint8_t i = 50; i <= 55; i++) {
+ rgb_matrix_set_color(i, 255, 86, 0);
+ }
+ }
+ return false;
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case RETRO_RGB:
+ if (record->event.pressed) {
+ switch (rgb_matrix_get_flags()) {
+ case LED_FLAG_ALL: {
+ rgb_matrix_set_flags(LED_FLAG_INDICATOR);
+ }
+ break;
+ default: {
+ rgb_matrix_set_flags(LED_FLAG_ALL);
+ }
+ break;
+ }
+ }
+ return false; // Skip all further processing of this key
+ default:
+ return true; // Process all other keycodes normally
+ }
+}
diff --git a/keyboards/novelkeys/nk_classic_tkl/keymaps/via/keymap.c b/keyboards/novelkeys/nk_classic_tkl/keymaps/via/keymap.c
new file mode 100644
index 00000000000..cc3ed86d2f2
--- /dev/null
+++ b/keyboards/novelkeys/nk_classic_tkl/keymaps/via/keymap.c
@@ -0,0 +1,69 @@
+/* Copyright 2024 Yiancar-Designs
+ *
+ * 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 my_keycodes {
+ RETRO_RGB = QK_KB_0
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = LAYOUT_tkl_ansi_tsangan( /* 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, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
+
+[1] = LAYOUT_tkl_ansi_tsangan( /* FN */
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLU, KC_VOLD, KC_MUTE,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, RGB_SPD, RGB_SPI, _______, _______,
+ _______, _______, _______, RETRO_RGB, _______, _______, _______, _______, _______, _______),
+
+};
+
+bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
+ if (host_keyboard_led_state().caps_lock) {
+ for (uint8_t i = 50; i <= 55; i++) {
+ rgb_matrix_set_color(i, 255, 86, 0);
+ }
+ }
+ return false;
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case RETRO_RGB:
+ if (record->event.pressed) {
+ switch (rgb_matrix_get_flags()) {
+ case LED_FLAG_ALL: {
+ rgb_matrix_set_flags(LED_FLAG_INDICATOR);
+ }
+ break;
+ default: {
+ rgb_matrix_set_flags(LED_FLAG_ALL);
+ }
+ break;
+ }
+ }
+ return false; // Skip all further processing of this key
+ default:
+ return true; // Process all other keycodes normally
+ }
+}
diff --git a/keyboards/novelkeys/nk_classic_tkl/keymaps/via/rules.mk b/keyboards/novelkeys/nk_classic_tkl/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/novelkeys/nk_classic_tkl/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/novelkeys/nk_classic_tkl/mcuconf.h b/keyboards/novelkeys/nk_classic_tkl/mcuconf.h
new file mode 100644
index 00000000000..ec984442ed0
--- /dev/null
+++ b/keyboards/novelkeys/nk_classic_tkl/mcuconf.h
@@ -0,0 +1,22 @@
+/* Copyright 2024 Yiancar-Designs
+ *
+ * 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 STM32_PWM_USE_TIM3
+#define STM32_PWM_USE_TIM3 TRUE
diff --git a/keyboards/novelkeys/nk_classic_tkl/readme.md b/keyboards/novelkeys/nk_classic_tkl/readme.md
new file mode 100644
index 00000000000..61f4f0cd9e5
--- /dev/null
+++ b/keyboards/novelkeys/nk_classic_tkl/readme.md
@@ -0,0 +1,32 @@
+# NK Classic TKL
+
+This is a TKL PCB. It supports VIA and full per-key RGB.
+
+* Keyboard Maintainer: [Yiancar](https://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar)
+* Hardware Supported: A TKL keyboard with STM32F072CB or APM compatible
+* Hardware Availability: https://novelkeys.com/
+
+## Instructions
+
+### Build
+
+Make example for this keyboard (after setting up your build environment):
+
+ make novelkeys/nk_classic_tkl: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).
+
+### Reset
+
+- Unplug
+- Hold Escape
+- Plug In
+- Unplug
+- Release Escape
+
+### Flash
+
+- Unplug
+- Hold Escape
+- Plug In
+- Flash using QMK Toolbox or dfu-util (`make novelkeys/nk_classic_tkl::dfu-util`)
diff --git a/keyboards/novelkeys/nk_classic_tkl/rules.mk b/keyboards/novelkeys/nk_classic_tkl/rules.mk
new file mode 100644
index 00000000000..0ab54aaaf71
--- /dev/null
+++ b/keyboards/novelkeys/nk_classic_tkl/rules.mk
@@ -0,0 +1,2 @@
+# Wildcard to allow APM32 MCU
+DFU_SUFFIX_ARGS = -v FFFF -p FFFF
diff --git a/keyboards/rarepotato8de/3x3macropad/3x3macropad.c b/keyboards/rarepotato8de/3x3macropad/3x3macropad.c
new file mode 100644
index 00000000000..ad7ad642158
--- /dev/null
+++ b/keyboards/rarepotato8de/3x3macropad/3x3macropad.c
@@ -0,0 +1,54 @@
+/* Copyright 2024 RarePotato8DE
+ *
+ * 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 OLED_ENABLE
+static void render_bongo1(void) {
+ static const char PROGMEM data[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xc0, 0xc0, 0x40, 0x60, 0x20, 0x30, 0x30, 0x18, 0x1c, 0x0e, 0x03, 0x01, 0x03, 0x07, 0x1c, 0x38, 0x30, 0x60, 0x60, 0x60, 0xc0, 0xc0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xe0, 0x30, 0x18, 0x18, 0x08, 0x18, 0x98, 0x30, 0x70, 0xf0, 0xb0, 0x18, 0x0c, 0x06, 0x07, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x06, 0x06, 0x0c, 0x0c, 0x18, 0x18, 0x30, 0x60, 0x60, 0x60, 0xc0, 0x60, 0x60, 0x30, 0x30, 0x30, 0xf8, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x18, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x20, 0x40, 0x40, 0x40, 0x40, 0xc0, 0x80, 0x80, 0xff, 0xff, 0xc0, 0x80, 0x80, 0x8e, 0x06, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x1e, 0x1e, 0x0e, 0x00, 0x10, 0x38, 0x70, 0x70, 0x70, 0x70, 0xe0, 0xe0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf8, 0x3f, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x06, 0x06, 0x06, 0x06, 0x0c, 0x0c, 0x0c, 0x1c, 0x18, 0x18, 0x18, 0x38, 0x30, 0x30, 0x30, 0x30, 0x60, 0x60, 0x60, 0x60, 0xe0, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x80, 0x00, 0x87, 0xc7, 0xc7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0f, 0x3c, 0xf0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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(data, sizeof(data));
+}
+
+static void render_bongo2(void) {
+ static const char PROGMEM data[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xc0, 0x40, 0x60, 0x20, 0x20, 0x30, 0x10, 0x18, 0x0e, 0x07, 0x03, 0x01, 0x07, 0x0e, 0x1c, 0x30, 0x20, 0x60, 0x60, 0x40, 0xc0, 0xc0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xc0, 0x60, 0x70, 0x30, 0x18, 0x0c, 0x06, 0x06, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x03, 0x06, 0x06, 0x06, 0x0c, 0x08, 0x18, 0x30, 0x30, 0x60, 0x60, 0xc0, 0x60, 0x60, 0x20, 0x30, 0x30, 0x18, 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,
+ 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x18, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x20, 0x40, 0x40, 0x40, 0x40, 0xc0, 0x80, 0x80, 0xc0, 0xe0, 0x38, 0x1c, 0x06, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x1f, 0x0e, 0x04, 0x00, 0x38, 0x30, 0x70, 0x30, 0x70, 0xe0, 0xe0, 0xc0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0xc0, 0xe0, 0x60, 0x60, 0x70, 0x60, 0x60, 0xe0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xfc, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x30, 0x90, 0x00, 0x1f, 0x31, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x20, 0x30, 0x30, 0x10, 0x18, 0x18, 0x08, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x18, 0x18, 0x18, 0x38, 0x30, 0x30, 0x30, 0x30, 0x60, 0x60, 0x60, 0x60, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x80, 0x03, 0x07, 0x07, 0x00, 0xff, 0xff, 0x00, 0x08, 0x01, 0x38, 0x38, 0x02, 0x00, 0x01, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x1c, 0x78, 0xe0, 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};
+ oled_write_raw_P(data, sizeof(data));
+}
+
+/* This code switches the shown image on the oled on every 350th call of this function */
+bool showBongo1 = true;
+int calls = 0;
+bool oled_task_kb(void) {
+ if (!oled_task_user()) {
+ return false;
+ }
+ if (calls++ > 350) {
+ showBongo1 = !showBongo1;
+ calls = 0;
+ }
+ if (showBongo1) {
+ render_bongo1();
+ } else {
+ render_bongo2();
+ }
+ return false;
+}
+#endif
diff --git a/keyboards/rarepotato8de/3x3macropad/info.json b/keyboards/rarepotato8de/3x3macropad/info.json
new file mode 100644
index 00000000000..607c6509966
--- /dev/null
+++ b/keyboards/rarepotato8de/3x3macropad/info.json
@@ -0,0 +1,63 @@
+{
+ "manufacturer": "RarePotato8DE",
+ "keyboard_name": "3x3macropad",
+ "maintainer": "RarePotato8DE",
+ "development_board": "promicro",
+ "build": {
+ "lto": true
+ },
+ "diode_direction": "COL2ROW",
+ "encoder": {
+ "rotary": [
+ {"pin_a": "F4", "pin_b": "B1"}
+ ]
+ },
+ "features": {
+ "bootmagic": true,
+ "encoder": true,
+ "extrakey": true,
+ "nkro": true,
+ "oled": true,
+ "rgblight": true
+ },
+ "matrix_pins": {
+ "cols": ["D7", "B3", "B2"],
+ "rows": ["F7", "B5", "B6"]
+ },
+ "rgblight": {
+ "animations": {
+ "alternating": true,
+ "breathing": true,
+ "rainbow_mood": true,
+ "rainbow_swirl": true,
+ "snake": true,
+ "static_gradient": true
+ },
+ "led_count": 6
+ },
+ "url": "https://github.com/rarepotato8de/3x3macropad",
+ "usb": {
+ "device_version": "0.0.1",
+ "pid": "0x0001",
+ "vid": "0x5353"
+ },
+ "ws2812": {
+ "pin": "E6"
+ },
+ "community_layouts": ["ortho_3x3"],
+ "layouts": {
+ "LAYOUT_ortho_3x3": {
+ "layout": [
+ {"label": "k00", "matrix": [0, 0], "x": 0, "y": 0},
+ {"label": "k01", "matrix": [0, 1], "x": 1, "y": 0},
+ {"label": "k02", "matrix": [0, 2], "x": 2, "y": 0},
+ {"label": "k10", "matrix": [1, 0], "x": 0, "y": 1},
+ {"label": "k11", "matrix": [1, 1], "x": 1, "y": 1},
+ {"label": "k12", "matrix": [1, 2], "x": 2, "y": 1},
+ {"label": "k20", "matrix": [2, 0], "x": 0, "y": 2},
+ {"label": "k21", "matrix": [2, 1], "x": 1, "y": 2},
+ {"label": "k22", "matrix": [2, 2], "x": 2, "y": 2}
+ ]
+ }
+ }
+}
diff --git a/keyboards/rarepotato8de/3x3macropad/keymaps/default/keymap.c b/keyboards/rarepotato8de/3x3macropad/keymaps/default/keymap.c
new file mode 100644
index 00000000000..7f68e145e73
--- /dev/null
+++ b/keyboards/rarepotato8de/3x3macropad/keymaps/default/keymap.c
@@ -0,0 +1,25 @@
+/* Copyright 2024 RarePotato8DE
+ *
+ * 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_3x3(
+ KC_1, KC_2, KC_3,
+ KC_4, KC_5, KC_6,
+ KC_7, KC_8, KC_9
+ )
+};
diff --git a/keyboards/rarepotato8de/3x3macropad/readme.md b/keyboards/rarepotato8de/3x3macropad/readme.md
new file mode 100644
index 00000000000..60a5caa2220
--- /dev/null
+++ b/keyboards/rarepotato8de/3x3macropad/readme.md
@@ -0,0 +1,28 @@
+# 3x3macropad
+
+
+
+The 3x3macropad is a small macropad with a cool OLED screen and rotary encoder.
+It was inspired by stacked FR4 keyboards like the Discipline65.
+
+* Keyboard Maintainer: [RarePotato8DE](https://github.com/rarepotato8de)
+* Hardware Supported: 3x3macropad
+* Hardware Availability: [Open source!](https://github.com/rarepotato8de/3x3macropad)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make rarepotato8de/3x3macropad:default
+
+Flashing example for this keyboard:
+
+ make rarepotato8de/3x3macropad: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,1) in the matrix (the top left one below the OLED) and plug in the keyboard
+* **Physical reset button**: Short the two through hole pins on the back of the PCB (positioned at the rotary encoder)
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
\ No newline at end of file
diff --git a/keyboards/rarepotato8de/3x3macropad/rules.mk b/keyboards/rarepotato8de/3x3macropad/rules.mk
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/keyboards/scottokeebs/scottowing/info.json b/keyboards/scottokeebs/scottowing/info.json
new file mode 100644
index 00000000000..770e2fd18ec
--- /dev/null
+++ b/keyboards/scottokeebs/scottowing/info.json
@@ -0,0 +1,75 @@
+{
+ "manufacturer": "ScottoKeebs",
+ "keyboard_name": "ScottoWing (PCB Edition)",
+ "maintainer": "joe-scotto",
+ "bootloader": "rp2040",
+ "bootmagic": {
+ "matrix": [0, 1]
+ },
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true
+ },
+ "matrix_pins": {
+ "cols": ["GP2", "GP3", "GP4", "GP5", "GP6", "GP7", "GP20", "GP22", "GP26", "GP27", "GP28", "GP29"],
+ "rows": ["GP8", "GP9", "GP23", "GP21"]
+ },
+ "processor": "RP2040",
+ "url": "https://scottokeebs.com",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x1026",
+ "vid": "0x534B"
+ },
+ "layouts": {
+ "LAYOUT_split_3x6_2": {
+ "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, 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}
+ ]
+ }
+ }
+}
diff --git a/keyboards/cipulot/kallos/config.h b/keyboards/scottokeebs/scottowing/keymaps/default/config.h
similarity index 68%
rename from keyboards/cipulot/kallos/config.h
rename to keyboards/scottokeebs/scottowing/keymaps/default/config.h
index dfe6b13b066..eb03070d83a 100644
--- a/keyboards/cipulot/kallos/config.h
+++ b/keyboards/scottokeebs/scottowing/keymaps/default/config.h
@@ -1,5 +1,5 @@
/*
-Copyright 2022 Cipulot
+Copyright 2024 Joe Scotto
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
@@ -8,7 +8,7 @@ the Free Software Foundation, either version 2 of the License, or
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
+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
@@ -17,7 +17,7 @@ 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 options
+#define TAPPING_TERM 135
+#define PERMISSIVE_HOLD
+#define TAPPING_TERM_PER_KEY
diff --git a/keyboards/scottokeebs/scottowing/keymaps/default/keymap.c b/keyboards/scottokeebs/scottowing/keymaps/default/keymap.c
new file mode 100644
index 00000000000..9a1c7daef30
--- /dev/null
+++ b/keyboards/scottokeebs/scottowing/keymaps/default/keymap.c
@@ -0,0 +1,45 @@
+/*
+Copyright 2024 Joe Scotto
+
+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_split_3x6_2(
+ 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_ENT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_BSPC, KC_QUOT,
+ KC_LSFT, LSFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, RSFT_T(KC_SLSH), KC_RSFT,
+ KC_LALT, LGUI_T(KC_SPC), LT(1, KC_TAB), LT(2, KC_ENT)
+ ),
+ [1] = LAYOUT_split_3x6_2(
+ KC_TRNS, KC_UNDS, KC_MINS, KC_PLUS, KC_EQL, KC_COLN, KC_GRV, KC_MRWD, KC_MPLY, KC_MFFD, KC_DEL, KC_TRNS,
+ KC_TRNS, KC_LCBR, KC_LPRN, KC_RPRN, KC_RCBR, KC_PIPE, KC_ESC, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT, KC_TRNS,
+ KC_TRNS, LSFT_T(KC_LBRC), KC_QUOT, KC_DQUO, KC_RBRC, KC_SCLN, KC_TILDE, KC_VOLD, KC_MUTE, KC_VOLU, RSFT_T(KC_BSLS), KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+ [2] = LAYOUT_split_3x6_2(
+ KC_TRNS, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_CAPS, KC_BSPC, KC_TRNS,
+ KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS,
+ KC_TRNS, KC_LSFT, KC_NO, KC_NO, KC_NO, MO(3), KC_NO, KC_NO, KC_COMM, KC_DOT, RSFT_T(KC_SLSH), KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+ [3] = LAYOUT_split_3x6_2(
+ KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, 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_TRNS,
+ KC_TRNS, KC_F11, KC_NO, KC_NO, QK_BOOT, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_F12, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ )
+};
\ No newline at end of file
diff --git a/keyboards/scottokeebs/scottowing/readme.md b/keyboards/scottokeebs/scottowing/readme.md
new file mode 100644
index 00000000000..bf20164e666
--- /dev/null
+++ b/keyboards/scottokeebs/scottowing/readme.md
@@ -0,0 +1,29 @@
+# ScottoWing (PCB Edition)
+
+
+
+The ScottoWing (PCB Edition) is a 3x5 (34-keys) or 3x6 (40-keys) split monoblock ergonomic column-staggered keyboard.
+
+* Keyboard Maintainer: [Joe Scotto](https://github.com/joe-scotto)
+* Hardware Supported: RP2040 Pro Micro, nice!nano
+* Hardware Availability: [ScottoKeebs](https://scottokeebs.com), [Amazon](https://amazon.com), [AliExpress](https://aliexpress.com)
+
+# Compiling
+
+Make example for this keyboard (after setting up your build environment):
+
+ make scottokeebs/scottowing:default
+
+Flashing example for this keyboard:
+
+ make scottokeebs/scottowing: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,1) 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/scottokeebs/scottowing/rules.mk b/keyboards/scottokeebs/scottowing/rules.mk
new file mode 100644
index 00000000000..6e7633bfe01
--- /dev/null
+++ b/keyboards/scottokeebs/scottowing/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
diff --git a/keyboards/sharkoon/skiller_sgk50_s4/config.h b/keyboards/sharkoon/skiller_sgk50_s4/config.h
new file mode 100644
index 00000000000..1d0f8f9a901
--- /dev/null
+++ b/keyboards/sharkoon/skiller_sgk50_s4/config.h
@@ -0,0 +1,13 @@
+// Copyright 2024 JoyLee (@itarze)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+/* 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
diff --git a/keyboards/sharkoon/skiller_sgk50_s4/halconf.h b/keyboards/sharkoon/skiller_sgk50_s4/halconf.h
new file mode 100644
index 00000000000..9d456a5106f
--- /dev/null
+++ b/keyboards/sharkoon/skiller_sgk50_s4/halconf.h
@@ -0,0 +1,10 @@
+// Copyright 2024 JoyLee (@itarze)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#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/sharkoon/skiller_sgk50_s4/info.json b/keyboards/sharkoon/skiller_sgk50_s4/info.json
new file mode 100644
index 00000000000..7d36616e52b
--- /dev/null
+++ b/keyboards/sharkoon/skiller_sgk50_s4/info.json
@@ -0,0 +1,356 @@
+{
+ "manufacturer": "Sharkoon Technologies GmbH",
+ "keyboard_name": "SKILLER SGK50 S4",
+ "maintainer": "JoyLee",
+ "bootloader": "wb32-dfu",
+ "diode_direction": "ROW2COL",
+ "eeprom": {
+ "driver": "wear_leveling",
+ "wear_leveling": {
+ "backing_size": 4096,
+ "driver": "spi_flash"
+ }
+ },
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgb_matrix": true
+ },
+ "matrix_pins": {
+ "cols": ["C0", "C1", "C2", "C3", "A6", "B1", "B10", "B11", "B12", "B13", "B14", "B15", "C6", "C7"],
+ "rows": ["A0", "A1", "A2", "A3", "C13"]
+ },
+ "processor": "WB32FQ95",
+ "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
+ },
+ "default": {
+ "val": 80
+ },
+ "driver": "ws2812",
+ "layout": [
+ {"matrix": [4, 6], "x": 103, "y": 64, "flags": 4},
+ {"matrix": [4, 10], "x": 172, "y": 64, "flags": 4},
+ {"matrix": [4, 11], "x": 190, "y": 64, "flags": 4},
+ {"matrix": [4, 12], "x": 207, "y": 64, "flags": 4},
+ {"matrix": [4, 13], "x": 224, "y": 64, "flags": 4},
+ {"matrix": [3, 13], "x": 224, "y": 48, "flags": 4},
+ {"matrix": [3, 11], "x": 190, "y": 48, "flags": 4},
+ {"matrix": [3, 10], "x": 172, "y": 48, "flags": 4},
+ {"matrix": [3, 9], "x": 155, "y": 48, "flags": 4},
+ {"matrix": [3, 8], "x": 138, "y": 48, "flags": 4},
+ {"matrix": [3, 7], "x": 121, "y": 48, "flags": 4},
+ {"matrix": [3, 6], "x": 103, "y": 48, "flags": 4},
+ {"matrix": [3, 5], "x": 86, "y": 48, "flags": 4},
+ {"matrix": [3, 4], "x": 69, "y": 48, "flags": 4},
+ {"matrix": [3, 3], "x": 52, "y": 48, "flags": 4},
+ {"matrix": [3, 2], "x": 34, "y": 48, "flags": 4},
+ {"matrix": [3, 1], "x": 17, "y": 48, "flags": 4},
+ {"matrix": [4, 2], "x": 34, "y": 64, "flags": 4},
+ {"matrix": [4, 1], "x": 17, "y": 64, "flags": 4},
+ {"matrix": [4, 0], "x": 0, "y": 64, "flags": 4},
+ {"matrix": [3, 0], "x": 0, "y": 48, "flags": 4},
+ {"matrix": [2, 0], "x": 0, "y": 32, "flags": 4},
+ {"matrix": [2, 1], "x": 17, "y": 32, "flags": 4},
+ {"matrix": [2, 2], "x": 34, "y": 32, "flags": 4},
+ {"matrix": [2, 3], "x": 52, "y": 32, "flags": 4},
+ {"matrix": [2, 4], "x": 69, "y": 32, "flags": 4},
+ {"matrix": [2, 5], "x": 86, "y": 32, "flags": 4},
+ {"matrix": [2, 6], "x": 103, "y": 32, "flags": 4},
+ {"matrix": [2, 7], "x": 121, "y": 32, "flags": 4},
+ {"matrix": [2, 8], "x": 138, "y": 32, "flags": 4},
+ {"matrix": [2, 9], "x": 155, "y": 32, "flags": 4},
+ {"matrix": [2, 10], "x": 172, "y": 32, "flags": 4},
+ {"matrix": [2, 11], "x": 190, "y": 32, "flags": 4},
+ {"matrix": [2, 13], "x": 207, "y": 32, "flags": 4},
+ {"matrix": [2, 12], "x": 224, "y": 16, "flags": 4},
+ {"matrix": [1, 12], "x": 207, "y": 16, "flags": 4},
+ {"matrix": [1, 11], "x": 190, "y": 16, "flags": 4},
+ {"matrix": [1, 10], "x": 172, "y": 16, "flags": 4},
+ {"matrix": [1, 9], "x": 155, "y": 16, "flags": 4},
+ {"matrix": [1, 8], "x": 138, "y": 16, "flags": 4},
+ {"matrix": [1, 7], "x": 121, "y": 16, "flags": 4},
+ {"matrix": [1, 6], "x": 103, "y": 16, "flags": 4},
+ {"matrix": [1, 5], "x": 86, "y": 16, "flags": 4},
+ {"matrix": [1, 4], "x": 69, "y": 16, "flags": 4},
+ {"matrix": [1, 3], "x": 52, "y": 16, "flags": 4},
+ {"matrix": [1, 2], "x": 34, "y": 16, "flags": 4},
+ {"matrix": [1, 1], "x": 17, "y": 16, "flags": 4},
+ {"matrix": [1, 0], "x": 0, "y": 16, "flags": 4},
+ {"matrix": [0, 0], "x": 0, "y": 0, "flags": 4},
+ {"matrix": [0, 1], "x": 17, "y": 0, "flags": 4},
+ {"matrix": [0, 2], "x": 34, "y": 0, "flags": 4},
+ {"matrix": [0, 3], "x": 52, "y": 0, "flags": 4},
+ {"matrix": [0, 4], "x": 69, "y": 0, "flags": 4},
+ {"matrix": [0, 5], "x": 86, "y": 0, "flags": 4},
+ {"matrix": [0, 6], "x": 103, "y": 0, "flags": 4},
+ {"matrix": [0, 7], "x": 121, "y": 0, "flags": 4},
+ {"matrix": [0, 8], "x": 138, "y": 0, "flags": 4},
+ {"matrix": [0, 9], "x": 155, "y": 0, "flags": 4},
+ {"matrix": [0, 10], "x": 172, "y": 0, "flags": 4},
+ {"matrix": [0, 11], "x": 190, "y": 0, "flags": 4},
+ {"matrix": [0, 12], "x": 207, "y": 0, "flags": 4},
+ {"matrix": [0, 13], "x": 224, "y": 0, "flags": 4}
+ ],
+ "max_brightness": 110,
+ "sleep": true,
+ "val_steps": 28
+ },
+ "url": "",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x1020",
+ "suspend_wakeup_delay": 1000,
+ "vid": "0x6332"
+ },
+ "ws2812": {
+ "pin": "A8"
+ },
+ "community_layouts": ["60_ansi", "60_iso"],
+ "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, "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, 12], "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": 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, 13], "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": {
+ "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": [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": [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, 13], "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": {
+ "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": [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, 13], "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}
+ ]
+ }
+ }
+}
diff --git a/keyboards/sharkoon/skiller_sgk50_s4/keymaps/default/keymap.c b/keyboards/sharkoon/skiller_sgk50_s4/keymaps/default/keymap.c
new file mode 100644
index 00000000000..84e72510d79
--- /dev/null
+++ b/keyboards/sharkoon/skiller_sgk50_s4/keymaps/default/keymap.c
@@ -0,0 +1,22 @@
+// Copyright 2024 JoyLee (@itarze)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#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_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_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_APP, KC_RCTL
+ ),
+
+ [1] = 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_INS, _______, KC_UP, KC_PAUS, KC_PGUP, KC_HOME, KC_PSCR, RGB_VAI,
+ _______, _______, _______, _______, _______, _______, KC_SCRL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_END, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, RGB_VAD, _______,
+ _______, GU_TOGG, _______, _______, _______, _______, RGB_HUI, RGB_MOD
+ )
+};
diff --git a/keyboards/sharkoon/skiller_sgk50_s4/keymaps/via/keymap.c b/keyboards/sharkoon/skiller_sgk50_s4/keymaps/via/keymap.c
new file mode 100644
index 00000000000..84e72510d79
--- /dev/null
+++ b/keyboards/sharkoon/skiller_sgk50_s4/keymaps/via/keymap.c
@@ -0,0 +1,22 @@
+// Copyright 2024 JoyLee (@itarze)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#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_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_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_APP, KC_RCTL
+ ),
+
+ [1] = 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_INS, _______, KC_UP, KC_PAUS, KC_PGUP, KC_HOME, KC_PSCR, RGB_VAI,
+ _______, _______, _______, _______, _______, _______, KC_SCRL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_END, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, RGB_VAD, _______,
+ _______, GU_TOGG, _______, _______, _______, _______, RGB_HUI, RGB_MOD
+ )
+};
diff --git a/keyboards/sharkoon/skiller_sgk50_s4/keymaps/via/rules.mk b/keyboards/sharkoon/skiller_sgk50_s4/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/sharkoon/skiller_sgk50_s4/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/sharkoon/skiller_sgk50_s4/mcuconf.h b/keyboards/sharkoon/skiller_sgk50_s4/mcuconf.h
new file mode 100644
index 00000000000..ae7ee58001a
--- /dev/null
+++ b/keyboards/sharkoon/skiller_sgk50_s4/mcuconf.h
@@ -0,0 +1,9 @@
+// Copyright 2024 JoyLee (@itarze)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include_next
+
+#undef WB32_SPI_USE_QSPI
+#define WB32_SPI_USE_QSPI TRUE
diff --git a/keyboards/sharkoon/skiller_sgk50_s4/readme.md b/keyboards/sharkoon/skiller_sgk50_s4/readme.md
new file mode 100644
index 00000000000..db6650546ed
--- /dev/null
+++ b/keyboards/sharkoon/skiller_sgk50_s4/readme.md
@@ -0,0 +1,24 @@
+# SHARKOON SKILLER SGK50 S4
+
+
+
+* Keyboard Maintainer: [JoyLee](https://github.com/itarze)
+* Hardware Supported: [SHARKOON SKILLER SGK50 S4 PCB](http://www.sharkoon.com/)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make sharkoon/skiller_sgk50_s4:default
+
+Flashing example for this keyboard:
+
+ make sharkoon/skiller_sgk50_s4: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/sharkoon/skiller_sgk50_s4/rules.mk b/keyboards/sharkoon/skiller_sgk50_s4/rules.mk
new file mode 100644
index 00000000000..6e7633bfe01
--- /dev/null
+++ b/keyboards/sharkoon/skiller_sgk50_s4/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
diff --git a/keyboards/ymdk/ymd62/config.h b/keyboards/ymdk/ymd62/config.h
new file mode 100644
index 00000000000..5f1f3f3a2a5
--- /dev/null
+++ b/keyboards/ymdk/ymd62/config.h
@@ -0,0 +1,11 @@
+// Copyright 2021 Mike Tsao
+// Copyright 2024 Richard Dawe (@richdawe)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define WS2812_PWM_DRIVER PWMD4
+#define WS2812_PWM_CHANNEL 4
+#define WS2812_PWM_PAL_MODE 2
+#define WS2812_DMA_STREAM STM32_DMA1_STREAM7
+#define WS2812_DMA_CHANNEL 7
\ No newline at end of file
diff --git a/keyboards/ymdk/ymd62/halconf.h b/keyboards/ymdk/ymd62/halconf.h
new file mode 100644
index 00000000000..89073b2f3c1
--- /dev/null
+++ b/keyboards/ymdk/ymd62/halconf.h
@@ -0,0 +1,8 @@
+// Copyright 2024 Richard Dawe (@richdawe)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define HAL_USE_PWM TRUE
+
+#include_next
diff --git a/keyboards/ymdk/ymd62/info.json b/keyboards/ymdk/ymd62/info.json
new file mode 100644
index 00000000000..92ed13d2606
--- /dev/null
+++ b/keyboards/ymdk/ymd62/info.json
@@ -0,0 +1,217 @@
+{
+ "manufacturer": "YMDK",
+ "keyboard_name": "YMD62 ISO QMK",
+ "maintainer": "richdawe",
+ "bootloader": "uf2boot",
+ "diode_direction": "ROW2COL",
+ "features": {
+ "bootmagic": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgb_matrix": true
+ },
+ "matrix_pins": {
+ "cols": ["A7", "B0", "B1", "B2", "B10", "B11", "A5", "A15", "B3", "B12", "B13", "B14", "B15", "A8"],
+ "rows": ["A4", "A3", "A2", "A1", "A0"]
+ },
+ "processor": "STM32F103",
+ "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,
+ "dual_beacon": true,
+ "flower_blooming": true,
+ "gradient_left_right": true,
+ "gradient_up_down": true,
+ "hue_breathing": true,
+ "hue_pendulum": true,
+ "hue_wave": true,
+ "jellybean_raindrops": true,
+ "pixel_flow": true,
+ "pixel_fractal": true,
+ "pixel_rain": true,
+ "rainbow_beacon": true,
+ "rainbow_moving_chevron": true,
+ "rainbow_pinwheels": true,
+ "raindrops": true,
+ "riverflow": true,
+ "starlight": true,
+ "starlight_dual_hue": true,
+ "starlight_dual_sat": true
+ },
+ "default": {
+ "animation": "rainbow_moving_chevron"
+ },
+ "driver": "ws2812",
+ "layout": [
+ {"matrix": [0, 0], "x": 1, "y": 1, "flags": 4},
+ {"matrix": [0, 1], "x": 14, "y": 1, "flags": 4},
+ {"matrix": [0, 2], "x": 28, "y": 1, "flags": 4},
+ {"matrix": [0, 3], "x": 44, "y": 1, "flags": 4},
+ {"matrix": [0, 4], "x": 58, "y": 1, "flags": 4},
+ {"matrix": [0, 5], "x": 75, "y": 1, "flags": 4},
+ {"matrix": [0, 6], "x": 89, "y": 1, "flags": 4},
+ {"matrix": [0, 7], "x": 103, "y": 1, "flags": 4},
+ {"matrix": [0, 8], "x": 117, "y": 1, "flags": 4},
+ {"matrix": [0, 9], "x": 129, "y": 1, "flags": 4},
+ {"matrix": [0, 10], "x": 147, "y": 1, "flags": 4},
+ {"matrix": [0, 11], "x": 167, "y": 1, "flags": 4},
+ {"matrix": [0, 12], "x": 183, "y": 1, "flags": 4},
+ {"matrix": [0, 13], "x": 200, "y": 1, "flags": 4},
+ {"matrix": [1, 0], "x": 3, "y": 16, "flags": 4},
+ {"matrix": [1, 1], "x": 16, "y": 16, "flags": 4},
+ {"matrix": [1, 2], "x": 33, "y": 16, "flags": 4},
+ {"matrix": [1, 3], "x": 47, "y": 16, "flags": 4},
+ {"matrix": [1, 4], "x": 60, "y": 16, "flags": 4},
+ {"matrix": [1, 5], "x": 77, "y": 16, "flags": 4},
+ {"matrix": [1, 6], "x": 91, "y": 16, "flags": 4},
+ {"matrix": [1, 7], "x": 106, "y": 16, "flags": 4},
+ {"matrix": [1, 8], "x": 120, "y": 16, "flags": 4},
+ {"matrix": [1, 9], "x": 131, "y": 16, "flags": 4},
+ {"matrix": [1, 10], "x": 149, "y": 16, "flags": 4},
+ {"matrix": [1, 11], "x": 169, "y": 16, "flags": 4},
+ {"matrix": [1, 12], "x": 185, "y": 16, "flags": 4},
+ {"matrix": [1, 13], "x": 205, "y": 26, "flags": 4},
+ {"matrix": [2, 0], "x": 5, "y": 32, "flags": 4},
+ {"matrix": [2, 1], "x": 20, "y": 32, "flags": 4},
+ {"matrix": [2, 2], "x": 35, "y": 32, "flags": 4},
+ {"matrix": [2, 3], "x": 49, "y": 32, "flags": 4},
+ {"matrix": [2, 4], "x": 62, "y": 32, "flags": 4},
+ {"matrix": [2, 5], "x": 79, "y": 32, "flags": 4},
+ {"matrix": [2, 6], "x": 93, "y": 32, "flags": 4},
+ {"matrix": [2, 7], "x": 108, "y": 32, "flags": 4},
+ {"matrix": [2, 8], "x": 122, "y": 32, "flags": 4},
+ {"matrix": [2, 9], "x": 133, "y": 32, "flags": 4},
+ {"matrix": [2, 10], "x": 151, "y": 32, "flags": 4},
+ {"matrix": [2, 11], "x": 171, "y": 32, "flags": 4},
+ {"matrix": [2, 13], "x": 199, "y": 32, "flags": 4},
+ {"matrix": [3, 0], "x": 8, "y": 49, "flags": 4},
+ {"matrix": [3, 1], "x": 23, "y": 49, "flags": 4},
+ {"matrix": [3, 2], "x": 38, "y": 49, "flags": 4},
+ {"matrix": [3, 3], "x": 51, "y": 49, "flags": 4},
+ {"matrix": [3, 4], "x": 64, "y": 49, "flags": 4},
+ {"matrix": [3, 5], "x": 81, "y": 49, "flags": 4},
+ {"matrix": [3, 6], "x": 95, "y": 49, "flags": 4},
+ {"matrix": [3, 7], "x": 110, "y": 49, "flags": 4},
+ {"matrix": [3, 8], "x": 124, "y": 49, "flags": 4},
+ {"matrix": [3, 9], "x": 135, "y": 49, "flags": 4},
+ {"matrix": [3, 10], "x": 153, "y": 49, "flags": 4},
+ {"matrix": [3, 11], "x": 189, "y": 49, "flags": 4},
+ {"matrix": [3, 13], "x": 212, "y": 49, "flags": 4},
+ {"matrix": [4, 0], "x": 2, "y": 63, "flags": 4},
+ {"matrix": [4, 1], "x": 15, "y": 63, "flags": 4},
+ {"matrix": [4, 2], "x": 33, "y": 63, "flags": 4},
+ {"matrix": [4, 6], "x": 92, "y": 63, "flags": 4},
+ {"matrix": [4, 9], "x": 149, "y": 63, "flags": 4},
+ {"matrix": [4, 10], "x": 170, "y": 63, "flags": 4},
+ {"matrix": [4, 11], "x": 188, "y": 63, "flags": 4},
+ {"matrix": [4, 13], "x": 200, "y": 63, "flags": 4},
+ {"x": 60, "y": 5, "flags": 2},
+ {"x": 90, "y": 5, "flags": 2},
+ {"x": 120, "y": 5, "flags": 2},
+ {"x": 150, "y": 5, "flags": 2},
+ {"x": 180, "y": 5, "flags": 2},
+ {"x": 210, "y": 5, "flags": 2},
+ {"x": 210, "y": 60, "flags": 2},
+ {"x": 180, "y": 60, "flags": 2},
+ {"x": 150, "y": 60, "flags": 2},
+ {"x": 120, "y": 60, "flags": 2},
+ {"x": 90, "y": 60, "flags": 2},
+ {"x": 60, "y": 60, "flags": 2}
+ ],
+ "max_brightness": 128
+ },
+ "url": "https://ymdkey.com/products/ymd62-iso-rgb-hot-swap-pcb-fully-programmable-support-via-vial",
+ "usb": {
+ "device_version": "0.0.4",
+ "pid": "0x0062",
+ "vid": "0x45D4"
+ },
+ "ws2812": {
+ "driver": "pwm",
+ "pin": "B9"
+ },
+ "community_layouts": ["60_iso"],
+ "layouts": {
+ "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, 13], "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, 13], "x": 12.75, "y": 2},
+ {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5, "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, 13], "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, 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, 13], "x": 13.75, "y": 4, "w": 1.25}
+ ]
+ }
+ }
+}
diff --git a/keyboards/ymdk/ymd62/keymaps/default/keymap.c b/keyboards/ymdk/ymd62/keymaps/default/keymap.c
new file mode 100644
index 00000000000..79c128295ef
--- /dev/null
+++ b/keyboards/ymdk/ymd62/keymaps/default/keymap.c
@@ -0,0 +1,19 @@
+// Copyright 2024 Richard Dawe (@richdawe)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = LAYOUT_60_iso( /* Base */
+ 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_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_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,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1) , KC_APP, KC_RCTL),
+
+[1] = LAYOUT_60_iso( /* FN */
+ 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_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT ,
+ KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, 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_VAI, RGB_VAD, RGB_M_P, KC_TRNS, KC_TRNS,
+ KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS)
+};
\ No newline at end of file
diff --git a/keyboards/ymdk/ymd62/mcuconf.h b/keyboards/ymdk/ymd62/mcuconf.h
new file mode 100644
index 00000000000..3c076403711
--- /dev/null
+++ b/keyboards/ymdk/ymd62/mcuconf.h
@@ -0,0 +1,9 @@
+// Copyright 2024 Richard Dawe (@richdawe)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include_next
+
+#undef STM32_PWM_USE_TIM4
+#define STM32_PWM_USE_TIM4 TRUE
\ No newline at end of file
diff --git a/keyboards/ymdk/ymd62/readme.md b/keyboards/ymdk/ymd62/readme.md
new file mode 100644
index 00000000000..73eeed3dbb9
--- /dev/null
+++ b/keyboards/ymdk/ymd62/readme.md
@@ -0,0 +1,28 @@
+# YMDK YMD62 ISO
+
+A 60% PCB supporting the ISO layout, with hotswap sockets, backlit keys and underglow.
+
+* Keyboard Maintainer: [Richard Dawe](https://github.com/richdawe)
+* Hardware Supported: YMD62 PCB
+* Hardware Availability: [YMDK](https://ymdkey.com/products/ymd62-iso-rgb-hot-swap-pcb-fully-programmable-support-via-vial)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make ymdk/ymd62:default
+
+Flashing example for this keyboard:
+
+ make ymdk/ymd62: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**: Double-tap the reset button on the back of the PCB
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
+
+Note: The device does not reconnect automatically after the QMK firmware has been flashed.
+Wait for the USB device to disappear after writing firmware, then unplug and re-plug it.
\ No newline at end of file
diff --git a/keyboards/ymdk/ymd62/rules.mk b/keyboards/ymdk/ymd62/rules.mk
new file mode 100644
index 00000000000..ef4364b06ac
--- /dev/null
+++ b/keyboards/ymdk/ymd62/rules.mk
@@ -0,0 +1,2 @@
+# Configure for 128K flash
+MCU_LDSCRIPT = STM32F103xB
\ No newline at end of file
diff --git a/keyboards/zsa/voyager/info.json b/keyboards/zsa/voyager/info.json
index 14e7584f5cc..3a7e7865ea9 100644
--- a/keyboards/zsa/voyager/info.json
+++ b/keyboards/zsa/voyager/info.json
@@ -161,52 +161,52 @@
"layouts": {
"LAYOUT": {
"layout": [
- {"label": "k00", "matrix": [0, 1], "x": 3, "y": 0},
- {"label": "k01", "matrix": [0, 2], "x": 12, "y": 0},
+ {"label": "k00", "matrix": [0, 1], "x": 0, "y": 0.5},
+ {"label": "k01", "matrix": [0, 2], "x": 1, "y": 0.5},
{"label": "k02", "matrix": [0, 3], "x": 2, "y": 0.25},
- {"label": "k03", "matrix": [0, 4], "x": 4, "y": 0.25},
- {"label": "k04", "matrix": [0, 5], "x": 11, "y": 0.25},
- {"label": "k05", "matrix": [0, 6], "x": 13, "y": 0.25},
- {"label": "k26", "matrix": [6, 0], "x": 0, "y": 0.5},
- {"label": "k27", "matrix": [6, 1], "x": 1, "y": 0.5},
- {"label": "k28", "matrix": [6, 2], "x": 5, "y": 0.5},
- {"label": "k29", "matrix": [6, 3], "x": 10, "y": 0.5},
+ {"label": "k03", "matrix": [0, 4], "x": 3, "y": 0},
+ {"label": "k04", "matrix": [0, 5], "x": 4, "y": 0.25},
+ {"label": "k05", "matrix": [0, 6], "x": 5, "y": 0.5},
+ {"label": "k26", "matrix": [6, 0], "x": 10, "y": 0.5},
+ {"label": "k27", "matrix": [6, 1], "x": 11, "y": 0.25},
+ {"label": "k28", "matrix": [6, 2], "x": 12, "y": 0},
+ {"label": "k29", "matrix": [6, 3], "x": 13, "y": 0.25},
{"label": "k30", "matrix": [6, 4], "x": 14, "y": 0.5},
{"label": "k31", "matrix": [6, 5], "x": 15, "y": 0.5},
- {"label": "k06", "matrix": [1, 1], "x": 3, "y": 1},
- {"label": "k07", "matrix": [1, 2], "x": 12, "y": 1},
+ {"label": "k06", "matrix": [1, 1], "x": 0, "y": 1.5},
+ {"label": "k07", "matrix": [1, 2], "x": 1, "y": 1.5},
{"label": "k08", "matrix": [1, 3], "x": 2, "y": 1.25},
- {"label": "k09", "matrix": [1, 4], "x": 4, "y": 1.25},
- {"label": "k10", "matrix": [1, 5], "x": 11, "y": 1.25},
- {"label": "k11", "matrix": [1, 6], "x": 13, "y": 1.25},
- {"label": "k32", "matrix": [7, 0], "x": 0, "y": 1.5},
- {"label": "k33", "matrix": [7, 1], "x": 1, "y": 1.5},
- {"label": "k34", "matrix": [7, 2], "x": 5, "y": 1.5},
- {"label": "k35", "matrix": [7, 3], "x": 10, "y": 1.5},
+ {"label": "k09", "matrix": [1, 4], "x": 3, "y": 1},
+ {"label": "k10", "matrix": [1, 5], "x": 4, "y": 1.25},
+ {"label": "k11", "matrix": [1, 6], "x": 5, "y": 1.5},
+ {"label": "k32", "matrix": [7, 0], "x": 10, "y": 1.5},
+ {"label": "k33", "matrix": [7, 1], "x": 11, "y": 1.25},
+ {"label": "k34", "matrix": [7, 2], "x": 12, "y": 1},
+ {"label": "k35", "matrix": [7, 3], "x": 13, "y": 1.25},
{"label": "k36", "matrix": [7, 4], "x": 14, "y": 1.5},
{"label": "k37", "matrix": [7, 5], "x": 15, "y": 1.5},
- {"label": "k12", "matrix": [2, 1], "x": 3, "y": 2},
- {"label": "k13", "matrix": [2, 2], "x": 12, "y": 2},
+ {"label": "k12", "matrix": [2, 1], "x": 0, "y": 2.5},
+ {"label": "k13", "matrix": [2, 2], "x": 1, "y": 2.5},
{"label": "k14", "matrix": [2, 3], "x": 2, "y": 2.25},
- {"label": "k15", "matrix": [2, 4], "x": 4, "y": 2.25},
- {"label": "k16", "matrix": [2, 5], "x": 11, "y": 2.25},
- {"label": "k17", "matrix": [2, 6], "x": 13, "y": 2.25},
- {"label": "k38", "matrix": [8, 0], "x": 0, "y": 2.5},
- {"label": "k39", "matrix": [8, 1], "x": 1, "y": 2.5},
- {"label": "k40", "matrix": [8, 2], "x": 5, "y": 2.5},
- {"label": "k41", "matrix": [8, 3], "x": 10, "y": 2.5},
+ {"label": "k15", "matrix": [2, 4], "x": 3, "y": 2},
+ {"label": "k16", "matrix": [2, 5], "x": 4, "y": 2.25},
+ {"label": "k17", "matrix": [2, 6], "x": 5, "y": 2.5},
+ {"label": "k38", "matrix": [8, 0], "x": 10, "y": 2.5},
+ {"label": "k39", "matrix": [8, 1], "x": 11, "y": 2.25},
+ {"label": "k40", "matrix": [8, 2], "x": 12, "y": 2},
+ {"label": "k41", "matrix": [8, 3], "x": 13, "y": 2.25},
{"label": "k42", "matrix": [8, 4], "x": 14, "y": 2.5},
{"label": "k43", "matrix": [8, 5], "x": 15, "y": 2.5},
- {"label": "k18", "matrix": [3, 1], "x": 3, "y": 3},
- {"label": "k19", "matrix": [3, 2], "x": 12, "y": 3},
+ {"label": "k18", "matrix": [3, 1], "x": 0, "y": 3.5},
+ {"label": "k19", "matrix": [3, 2], "x": 1, "y": 3.5},
{"label": "k20", "matrix": [3, 3], "x": 2, "y": 3.25},
- {"label": "k21", "matrix": [3, 4], "x": 4, "y": 3.25},
- {"label": "k22", "matrix": [3, 5], "x": 11, "y": 3.25},
- {"label": "k23", "matrix": [4, 4], "x": 13, "y": 3.25},
- {"label": "k44", "matrix": [10, 2], "x": 0, "y": 3.5},
- {"label": "k45", "matrix": [9, 1], "x": 1, "y": 3.5},
- {"label": "k46", "matrix": [9, 2], "x": 5, "y": 3.5},
- {"label": "k47", "matrix": [9, 3], "x": 10, "y": 3.5},
+ {"label": "k21", "matrix": [3, 4], "x": 3, "y": 3},
+ {"label": "k22", "matrix": [3, 5], "x": 4, "y": 3.25},
+ {"label": "k23", "matrix": [4, 4], "x": 5, "y": 3.5},
+ {"label": "k44", "matrix": [10, 2], "x": 10, "y": 3.5},
+ {"label": "k45", "matrix": [9, 1], "x": 11, "y": 3.25},
+ {"label": "k46", "matrix": [9, 2], "x": 12, "y": 3},
+ {"label": "k47", "matrix": [9, 3], "x": 13, "y": 3.25},
{"label": "k48", "matrix": [9, 4], "x": 14, "y": 3.5},
{"label": "k49", "matrix": [9, 5], "x": 15, "y": 3.5},
{"label": "k24", "matrix": [5, 0], "x": 5, "y": 4.5},
diff --git a/layouts/community/60_ansi_arrow_split_bs/readme.md b/layouts/community/60_ansi_arrow_split_bs/readme.md
new file mode 100644
index 00000000000..c008b4a6dec
--- /dev/null
+++ b/layouts/community/60_ansi_arrow_split_bs/readme.md
@@ -0,0 +1,3 @@
+# 60_ansi_arrow_split_bs
+
+ LAYOUT_60_ansi_arrow_split_bs
diff --git a/layouts/community/60_iso_arrow/readme.md b/layouts/community/60_iso_arrow/readme.md
new file mode 100644
index 00000000000..73015ab248e
--- /dev/null
+++ b/layouts/community/60_iso_arrow/readme.md
@@ -0,0 +1,3 @@
+# 60_iso_arrow
+
+ LAYOUT_60_iso_arrow
diff --git a/layouts/community/60_iso_arrow_split_bs/readme.md b/layouts/community/60_iso_arrow_split_bs/readme.md
new file mode 100644
index 00000000000..8f47644fe23
--- /dev/null
+++ b/layouts/community/60_iso_arrow_split_bs/readme.md
@@ -0,0 +1,3 @@
+# 60_iso_arrow_split_bs
+
+ LAYOUT_60_iso_arrow_split_bs
diff --git a/layouts/community/tkl_ansi_wkl/readme.md b/layouts/community/tkl_ansi_wkl/readme.md
new file mode 100644
index 00000000000..6541a0f23ab
--- /dev/null
+++ b/layouts/community/tkl_ansi_wkl/readme.md
@@ -0,0 +1,3 @@
+# tkl_ansi_wkl
+
+ LAYOUT_tkl_ansi_wkl
diff --git a/layouts/community/tkl_ansi_wkl_split_bs_rshift/readme.md b/layouts/community/tkl_ansi_wkl_split_bs_rshift/readme.md
new file mode 100644
index 00000000000..35235603728
--- /dev/null
+++ b/layouts/community/tkl_ansi_wkl_split_bs_rshift/readme.md
@@ -0,0 +1,3 @@
+# tkl_ansi_wkl_split_bs_rshift
+
+ LAYOUT_tkl_ansi_wkl_split_bs_rshift
diff --git a/layouts/community/tkl_f13_ansi_wkl/readme.md b/layouts/community/tkl_f13_ansi_wkl/readme.md
new file mode 100644
index 00000000000..607692c2392
--- /dev/null
+++ b/layouts/community/tkl_f13_ansi_wkl/readme.md
@@ -0,0 +1,3 @@
+# tkl_f13_ansi_wkl
+
+ LAYOUT_tkl_f13_ansi_wkl
diff --git a/layouts/community/tkl_f13_ansi_wkl_split_bs_rshift/readme.md b/layouts/community/tkl_f13_ansi_wkl_split_bs_rshift/readme.md
new file mode 100644
index 00000000000..614c0913f62
--- /dev/null
+++ b/layouts/community/tkl_f13_ansi_wkl_split_bs_rshift/readme.md
@@ -0,0 +1,3 @@
+# tkl_f13_ansi_wkl_split_bs_rshift
+
+ LAYOUT_tkl_f13_ansi_wkl_split_bs_rshift
diff --git a/layouts/community/tkl_f13_iso_wkl/readme.md b/layouts/community/tkl_f13_iso_wkl/readme.md
new file mode 100644
index 00000000000..46c44195923
--- /dev/null
+++ b/layouts/community/tkl_f13_iso_wkl/readme.md
@@ -0,0 +1,3 @@
+# tkl_f13_iso_wkl
+
+ LAYOUT_tkl_f13_iso_wkl
diff --git a/layouts/community/tkl_f13_iso_wkl_split_bs_rshift/readme.md b/layouts/community/tkl_f13_iso_wkl_split_bs_rshift/readme.md
new file mode 100644
index 00000000000..a9059abfba2
--- /dev/null
+++ b/layouts/community/tkl_f13_iso_wkl_split_bs_rshift/readme.md
@@ -0,0 +1,3 @@
+# tkl_f13_iso_wkl_split_bs_rshift
+
+ LAYOUT_tkl_f13_iso_wkl_split_bs_rshift
diff --git a/layouts/community/tkl_iso_wkl/readme.md b/layouts/community/tkl_iso_wkl/readme.md
new file mode 100644
index 00000000000..56fe1e91473
--- /dev/null
+++ b/layouts/community/tkl_iso_wkl/readme.md
@@ -0,0 +1,3 @@
+# tkl_iso_wkl
+
+ LAYOUT_tkl_iso_wkl
diff --git a/layouts/community/tkl_iso_wkl_split_bs_rshift/readme.md b/layouts/community/tkl_iso_wkl_split_bs_rshift/readme.md
new file mode 100644
index 00000000000..ec820424a5b
--- /dev/null
+++ b/layouts/community/tkl_iso_wkl_split_bs_rshift/readme.md
@@ -0,0 +1,3 @@
+# tkl_iso_wkl_split_bs_rshift
+
+ LAYOUT_tkl_iso_split_bs_rshift
diff --git a/layouts/default/60_ansi_arrow/default_60_ansi_arrow/keymap.c b/layouts/default/60_ansi_arrow/default_60_ansi_arrow/keymap.c
index c0baf9f47a7..5ad94501d06 100644
--- a/layouts/default/60_ansi_arrow/default_60_ansi_arrow/keymap.c
+++ b/layouts/default/60_ansi_arrow/default_60_ansi_arrow/keymap.c
@@ -6,15 +6,15 @@
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/*
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
- * │Esc│1 │2 │3 │4 │5 │6 │7 │8 │9 │0 │- │+ │Bspc │
+ * │Esc│ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Backsp│
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
- * │Tab │Q │W │E │R │T │Y │U │I │O │P │[ │] │\ │
+ * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
- * │Caps │A │S │D │F │G │H │J │K │L │; │' │Enter │
+ * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │
* ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴┬───┬───┤
- * │Shift │Z │X │C │V │B │N │M │, │. │Shift │↑ │/ │
+ * │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ Shift│ ↑ │ / │
* ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴──┬┴──┬───┼───┼───┤
- * │Ctrl│GUI │Alt │Space │Alt│GUI│← │↓ │→ │
+ * │Ctrl│GUI │Alt │Space │Alt│GUI│ ← │ ↓ │ → │
* └────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┘
*/
[0] = LAYOUT_60_ansi_arrow(
diff --git a/layouts/default/60_ansi_arrow_split_bs/default_60_ansi_arrow_split_bs/keymap.c b/layouts/default/60_ansi_arrow_split_bs/default_60_ansi_arrow_split_bs/keymap.c
new file mode 100644
index 00000000000..e95baa6f4db
--- /dev/null
+++ b/layouts/default/60_ansi_arrow_split_bs/default_60_ansi_arrow_split_bs/keymap.c
@@ -0,0 +1,27 @@
+// Copyright 2023 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later/
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
+ * │Esc│ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ + │ \ │ ` │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤
+ * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ Bspc│
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
+ * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴┬───┬───┤
+ * │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ Shift│ ↑ │ / │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴──┬┴──┬───┼───┼───┤
+ * │Ctrl│GUI │Alt │ │Alt│GUI│ ← │ ↓ │ → │
+ * └────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┘
+ */
+ [0] = LAYOUT_60_ansi_arrow_split_bs(
+ 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_GRV,
+ 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_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_RSFT, KC_UP, KC_SLSH,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_LEFT, KC_DOWN, KC_RGHT
+ )
+};
diff --git a/layouts/default/60_ansi_arrow_split_bs/info.json b/layouts/default/60_ansi_arrow_split_bs/info.json
new file mode 100644
index 00000000000..23e4b6937d4
--- /dev/null
+++ b/layouts/default/60_ansi_arrow_split_bs/info.json
@@ -0,0 +1,79 @@
+{
+ "keyboard_name": "60% ANSI Arrow Layout with Split Backspace",
+ "url": "",
+ "maintainer": "qmk",
+ "layouts": {
+ "LAYOUT_60_ansi_arrow_split_bs": {
+ "layout": [
+ {"x": 0, "y": 0},
+ {"x": 1, "y": 0},
+ {"x": 2, "y": 0},
+ {"x": 3, "y": 0},
+ {"x": 4, "y": 0},
+ {"x": 5, "y": 0},
+ {"x": 6, "y": 0},
+ {"x": 7, "y": 0},
+ {"x": 8, "y": 0},
+ {"x": 9, "y": 0},
+ {"x": 10, "y": 0},
+ {"x": 11, "y": 0},
+ {"x": 12, "y": 0},
+ {"x": 13, "y": 0},
+ {"x": 14, "y": 0},
+
+ {"x": 0, "y": 1, "w": 1.5},
+ {"x": 1.5, "y": 1},
+ {"x": 2.5, "y": 1},
+ {"x": 3.5, "y": 1},
+ {"x": 4.5, "y": 1},
+ {"x": 5.5, "y": 1},
+ {"x": 6.5, "y": 1},
+ {"x": 7.5, "y": 1},
+ {"x": 8.5, "y": 1},
+ {"x": 9.5, "y": 1},
+ {"x": 10.5, "y": 1},
+ {"x": 11.5, "y": 1},
+ {"x": 12.5, "y": 1},
+ {"x": 13.5, "y": 1, "w": 1.5},
+
+ {"x": 0, "y": 2, "w": 1.75},
+ {"x": 1.75, "y": 2},
+ {"x": 2.75, "y": 2},
+ {"x": 3.75, "y": 2},
+ {"x": 4.75, "y": 2},
+ {"x": 5.75, "y": 2},
+ {"x": 6.75, "y": 2},
+ {"x": 7.75, "y": 2},
+ {"x": 8.75, "y": 2},
+ {"x": 9.75, "y": 2},
+ {"x": 10.75, "y": 2},
+ {"x": 11.75, "y": 2},
+ {"x": 12.75, "y": 2, "w": 2.25},
+
+ {"x": 0, "y": 3, "w": 2.25},
+ {"x": 2.25, "y": 3},
+ {"x": 3.25, "y": 3},
+ {"x": 4.25, "y": 3},
+ {"x": 5.25, "y": 3},
+ {"x": 6.25, "y": 3},
+ {"x": 7.25, "y": 3},
+ {"x": 8.25, "y": 3},
+ {"x": 9.25, "y": 3},
+ {"x": 10.25, "y": 3},
+ {"x": 11.25, "y": 3, "w": 1.75},
+ {"x": 13, "y": 3},
+ {"x": 14, "y": 3},
+
+ {"x": 0, "y": 4, "w": 1.25},
+ {"x": 1.25, "y": 4, "w": 1.25},
+ {"x": 2.5, "y": 4, "w": 1.25},
+ {"x": 3.75, "y": 4, "w": 6.25},
+ {"x": 10, "y": 4},
+ {"x": 11, "y": 4},
+ {"x": 12, "y": 4},
+ {"x": 13, "y": 4},
+ {"x": 14, "y": 4}
+ ]
+ }
+ }
+}
diff --git a/layouts/default/60_ansi_arrow_split_bs/layout.json b/layouts/default/60_ansi_arrow_split_bs/layout.json
new file mode 100644
index 00000000000..595b88bb558
--- /dev/null
+++ b/layouts/default/60_ansi_arrow_split_bs/layout.json
@@ -0,0 +1,5 @@
+[{a:7},"","","","","","","","","","","","","","",""],
+[{w:1.5},"","","","","","","","","","","","","",{w:1.5},""],
+[{w:1.75},"","","","","","","","","","","","",{w:2.25},""],
+[{w:2.25},"","","","","","","","","","",{w:1.75},"","",""],
+[{w:1.25},"",{w:1.25},"",{w:1.25},"",{w:6.25},"","","","","",""]
diff --git a/layouts/default/60_ansi_arrow_split_bs/readme.md b/layouts/default/60_ansi_arrow_split_bs/readme.md
new file mode 100644
index 00000000000..c008b4a6dec
--- /dev/null
+++ b/layouts/default/60_ansi_arrow_split_bs/readme.md
@@ -0,0 +1,3 @@
+# 60_ansi_arrow_split_bs
+
+ LAYOUT_60_ansi_arrow_split_bs
diff --git a/layouts/default/60_iso_arrow/default_60_iso_arrow/keymap.c b/layouts/default/60_iso_arrow/default_60_iso_arrow/keymap.c
new file mode 100644
index 00000000000..d3eaa478685
--- /dev/null
+++ b/layouts/default/60_iso_arrow/default_60_iso_arrow/keymap.c
@@ -0,0 +1,27 @@
+// Copyright 2023 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later/
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │Esc│ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ + │ Backsp│
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ Ent│
+ * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ # │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴┬──┴┬───┤
+ * │Shft│ \ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ Shift│ ↑ │ / │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴──┬┴──┬───┼───┼───┤
+ * │Ctrl│GUI │Alt │ │Alt│GUI│ ← │ ↓ │ → │
+ * └────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┘
+ */
+ [0] = LAYOUT_60_iso_arrow(
+ 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_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_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_RSFT, KC_UP, KC_SLSH,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_LEFT, KC_DOWN, KC_RGHT
+ )
+};
diff --git a/layouts/default/60_iso_arrow/info.json b/layouts/default/60_iso_arrow/info.json
new file mode 100644
index 00000000000..a14008b14f7
--- /dev/null
+++ b/layouts/default/60_iso_arrow/info.json
@@ -0,0 +1,79 @@
+{
+ "keyboard_name": "60% ISO Arrow Layout",
+ "url": "",
+ "maintainer": "qmk",
+ "layouts": {
+ "LAYOUT_60_iso_arrow": {
+ "layout": [
+ {"x": 0, "y": 0},
+ {"x": 1, "y": 0},
+ {"x": 2, "y": 0},
+ {"x": 3, "y": 0},
+ {"x": 4, "y": 0},
+ {"x": 5, "y": 0},
+ {"x": 6, "y": 0},
+ {"x": 7, "y": 0},
+ {"x": 8, "y": 0},
+ {"x": 9, "y": 0},
+ {"x": 10, "y": 0},
+ {"x": 11, "y": 0},
+ {"x": 12, "y": 0},
+ {"x": 13, "y": 0, "w": 2},
+
+ {"x": 0, "y": 1, "w": 1.5},
+ {"x": 1.5, "y": 1},
+ {"x": 2.5, "y": 1},
+ {"x": 3.5, "y": 1},
+ {"x": 4.5, "y": 1},
+ {"x": 5.5, "y": 1},
+ {"x": 6.5, "y": 1},
+ {"x": 7.5, "y": 1},
+ {"x": 8.5, "y": 1},
+ {"x": 9.5, "y": 1},
+ {"x": 10.5, "y": 1},
+ {"x": 11.5, "y": 1},
+ {"x": 12.5, "y": 1},
+
+ {"x": 0, "y": 2, "w": 1.75},
+ {"x": 1.75, "y": 2},
+ {"x": 2.75, "y": 2},
+ {"x": 3.75, "y": 2},
+ {"x": 4.75, "y": 2},
+ {"x": 5.75, "y": 2},
+ {"x": 6.75, "y": 2},
+ {"x": 7.75, "y": 2},
+ {"x": 8.75, "y": 2},
+ {"x": 9.75, "y": 2},
+ {"x": 10.75, "y": 2},
+ {"x": 11.75, "y": 2},
+ {"x": 12.75, "y": 2},
+ {"x": 13.75, "y": 1, "w": 1.25, "h": 2},
+
+ {"x": 0, "y": 3, "w": 1.25},
+ {"x": 1.25, "y": 3},
+ {"x": 2.25, "y": 3},
+ {"x": 3.25, "y": 3},
+ {"x": 4.25, "y": 3},
+ {"x": 5.25, "y": 3},
+ {"x": 6.25, "y": 3},
+ {"x": 7.25, "y": 3},
+ {"x": 8.25, "y": 3},
+ {"x": 9.25, "y": 3},
+ {"x": 10.25, "y": 3},
+ {"x": 11.25, "y": 3, "w": 1.75},
+ {"x": 13, "y": 3},
+ {"x": 14, "y": 3},
+
+ {"x": 0, "y": 4, "w": 1.25},
+ {"x": 1.25, "y": 4, "w": 1.25},
+ {"x": 2.5, "y": 4, "w": 1.25},
+ {"x": 3.75, "y": 4, "w": 6.25},
+ {"x": 10, "y": 4},
+ {"x": 11, "y": 4},
+ {"x": 12, "y": 4},
+ {"x": 13, "y": 4},
+ {"x": 14, "y": 4}
+ ]
+ }
+ }
+}
diff --git a/layouts/default/60_iso_arrow/layout.json b/layouts/default/60_iso_arrow/layout.json
new file mode 100644
index 00000000000..90f25c3ca8c
--- /dev/null
+++ b/layouts/default/60_iso_arrow/layout.json
@@ -0,0 +1,5 @@
+[{a:7},"","","","","","","","","","","","","",{w:2},""],
+[{w:1.5},"","","","","","","","","","","","","",{x:0.25,w:1.25,h:2,w2:1.5,h2:1,x2:-0.25},""],
+[{w:1.75},"","","","","","","","","","","","",""],
+[{w:1.25},"","","","","","","","","","","",{w:1.75},"","",""],
+[{w:1.25},"",{w:1.25},"",{w:1.25},"",{w:6.25},"","","","","",""]
diff --git a/layouts/default/60_iso_arrow/readme.md b/layouts/default/60_iso_arrow/readme.md
new file mode 100644
index 00000000000..73015ab248e
--- /dev/null
+++ b/layouts/default/60_iso_arrow/readme.md
@@ -0,0 +1,3 @@
+# 60_iso_arrow
+
+ LAYOUT_60_iso_arrow
diff --git a/layouts/default/60_iso_arrow_split_bs/default_60_iso_arrow_split_bs/keymap.c b/layouts/default/60_iso_arrow_split_bs/default_60_iso_arrow_split_bs/keymap.c
new file mode 100644
index 00000000000..651c97366c2
--- /dev/null
+++ b/layouts/default/60_iso_arrow_split_bs/default_60_iso_arrow_split_bs/keymap.c
@@ -0,0 +1,27 @@
+// Copyright 2023 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later/
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
+ * │Esc│ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ + │Bsp│Del│
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤
+ * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ Ent│
+ * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ # │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴┬──┴┬───┤
+ * │Shft│ \ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ Shift│ ↑ │ / │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴──┬┴──┬───┼───┼───┤
+ * │Ctrl│GUI │Alt │ │Alt│GUI│ ← │ ↓ │ → │
+ * └────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┘
+ */
+ [0] = LAYOUT_60_iso_arrow_split_bs(
+ 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_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_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_RSFT, KC_UP, KC_SLSH,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_LEFT, KC_DOWN, KC_RGHT
+ )
+};
diff --git a/layouts/default/60_iso_arrow_split_bs/info.json b/layouts/default/60_iso_arrow_split_bs/info.json
new file mode 100644
index 00000000000..5a7b78e40d5
--- /dev/null
+++ b/layouts/default/60_iso_arrow_split_bs/info.json
@@ -0,0 +1,80 @@
+{
+ "keyboard_name": "60% ISO Arrow Layout with Split Backspace",
+ "url": "",
+ "maintainer": "qmk",
+ "layouts": {
+ "LAYOUT_60_iso_arrow_split_bs": {
+ "layout": [
+ {"x": 0, "y": 0},
+ {"x": 1, "y": 0},
+ {"x": 2, "y": 0},
+ {"x": 3, "y": 0},
+ {"x": 4, "y": 0},
+ {"x": 5, "y": 0},
+ {"x": 6, "y": 0},
+ {"x": 7, "y": 0},
+ {"x": 8, "y": 0},
+ {"x": 9, "y": 0},
+ {"x": 10, "y": 0},
+ {"x": 11, "y": 0},
+ {"x": 12, "y": 0},
+ {"x": 13, "y": 0},
+ {"x": 14, "y": 0},
+
+ {"x": 0, "y": 1, "w": 1.5},
+ {"x": 1.5, "y": 1},
+ {"x": 2.5, "y": 1},
+ {"x": 3.5, "y": 1},
+ {"x": 4.5, "y": 1},
+ {"x": 5.5, "y": 1},
+ {"x": 6.5, "y": 1},
+ {"x": 7.5, "y": 1},
+ {"x": 8.5, "y": 1},
+ {"x": 9.5, "y": 1},
+ {"x": 10.5, "y": 1},
+ {"x": 11.5, "y": 1},
+ {"x": 12.5, "y": 1},
+
+ {"x": 0, "y": 2, "w": 1.75},
+ {"x": 1.75, "y": 2},
+ {"x": 2.75, "y": 2},
+ {"x": 3.75, "y": 2},
+ {"x": 4.75, "y": 2},
+ {"x": 5.75, "y": 2},
+ {"x": 6.75, "y": 2},
+ {"x": 7.75, "y": 2},
+ {"x": 8.75, "y": 2},
+ {"x": 9.75, "y": 2},
+ {"x": 10.75, "y": 2},
+ {"x": 11.75, "y": 2},
+ {"x": 12.75, "y": 2},
+ {"x": 13.75, "y": 1, "w": 1.25, "h": 2},
+
+ {"x": 0, "y": 3, "w": 1.25},
+ {"x": 1.25, "y": 3},
+ {"x": 2.25, "y": 3},
+ {"x": 3.25, "y": 3},
+ {"x": 4.25, "y": 3},
+ {"x": 5.25, "y": 3},
+ {"x": 6.25, "y": 3},
+ {"x": 7.25, "y": 3},
+ {"x": 8.25, "y": 3},
+ {"x": 9.25, "y": 3},
+ {"x": 10.25, "y": 3},
+ {"x": 11.25, "y": 3, "w": 1.75},
+ {"x": 13, "y": 3},
+ {"x": 14, "y": 3},
+
+ {"x": 0, "y": 4, "w": 1.25},
+ {"x": 1.25, "y": 4, "w": 1.25},
+ {"x": 2.5, "y": 4, "w": 1.25},
+ {"x": 3.75, "y": 4, "w": 6.25},
+ {"x": 10, "y": 4},
+ {"x": 11, "y": 4},
+ {"x": 12, "y": 4},
+ {"x": 13, "y": 4},
+ {"x": 14, "y": 4}
+ ]
+ }
+ }
+}
diff --git a/layouts/default/60_iso_arrow_split_bs/layout.json b/layouts/default/60_iso_arrow_split_bs/layout.json
new file mode 100644
index 00000000000..bf494ab25f1
--- /dev/null
+++ b/layouts/default/60_iso_arrow_split_bs/layout.json
@@ -0,0 +1,5 @@
+[{a:7},"","","","","","","","","","","","","","",""],
+[{w:1.5},"","","","","","","","","","","","","",{x:0.25,w:1.25,h:2,w2:1.5,h2:1,x2:-0.25},""],
+[{w:1.75},"","","","","","","","","","","","",""],
+[{w:1.25},"","","","","","","","","","","",{w:1.75},"","",""],
+[{w:1.25},"",{w:1.25},"",{w:1.25},"",{w:6.25},"","","","","",""]
diff --git a/layouts/default/60_iso_arrow_split_bs/readme.md b/layouts/default/60_iso_arrow_split_bs/readme.md
new file mode 100644
index 00000000000..8f47644fe23
--- /dev/null
+++ b/layouts/default/60_iso_arrow_split_bs/readme.md
@@ -0,0 +1,3 @@
+# 60_iso_arrow_split_bs
+
+ LAYOUT_60_iso_arrow_split_bs
diff --git a/layouts/default/60_jis/info.json b/layouts/default/60_jis/info.json
index 56972148bda..039ced42f4a 100644
--- a/layouts/default/60_jis/info.json
+++ b/layouts/default/60_jis/info.json
@@ -34,7 +34,6 @@
{"x": 10.5, "y": 1},
{"x": 11.5, "y": 1},
{"x": 12.5, "y": 1},
- {"x": 13.75, "y": 1, "w": 1.25, "h": 2},
{"x": 0, "y": 2, "w": 1.75},
{"x": 1.75, "y": 2},
@@ -49,6 +48,7 @@
{"x": 10.75, "y": 2},
{"x": 11.75, "y": 2},
{"x": 12.75, "y": 2},
+ {"x": 13.75, "y": 1, "w": 1.25, "h": 2},
{"x": 0, "y": 3, "w": 2.25},
{"x": 2.25, "y": 3},
diff --git a/layouts/default/readme.md b/layouts/default/readme.md
index 892dbf1e034..2460f64701f 100644
--- a/layouts/default/readme.md
+++ b/layouts/default/readme.md
@@ -49,6 +49,21 @@ LAYOUT_60_ansi_arrow
└────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┘
```
+```
+LAYOUT_60_ansi_arrow_split_bs
+┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
+│ │ │ │ │ │ │ │ │ │ │ │ │ │
+├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴┬───┬───┤
+│ │ │ │ │ │ │ │ │ │ │ │ │ │
+├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴──┬┴──┬───┼───┼───┤
+│ │ │ │ │ │ │ │ │ │
+└────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┘
+```
+
```
LAYOUT_60_ansi_arrow_split_bs_7u_spc
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
@@ -154,6 +169,36 @@ LAYOUT_60_iso
└────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
```
+```
+LAYOUT_60_iso_arrow
+┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴┬──┴┬───┤
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴──┬┴──┬───┼───┼───┤
+│ │ │ │ │ │ │ │ │ │
+└────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┘
+```
+
+```
+LAYOUT_60_iso_arrow_split_bs
+┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴┬──┴┬───┤
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴──┬┴──┬───┼───┼───┤
+│ │ │ │ │ │ │ │ │ │
+└────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┘
+```
+
```
LAYOUT_60_iso_split_bs_rshift
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
@@ -641,6 +686,42 @@ LAYOUT_tkl_ansi_tsangan_split_bs_rshift
└─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ └───┴───┴───┘
```
+```
+LAYOUT_tkl_ansi_wkl
+┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+└───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘
+┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘
+│ │ │ │ │ │ │ │ │ │ │ │ │ │
+├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ ┌───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─────┤ ┌───┼───┼───┐
+│ │ │ │ │ │ │ │ │ │ │ │
+└─────┘ └─────┴───────────────────────────┴─────┘ └─────┘ └───┴───┴───┘
+```
+
+```
+LAYOUT_tkl_ansi_wkl_split_bs_rshift
+┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+└───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘
+┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ ├───┼───┼───┤
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘
+│ │ │ │ │ │ │ │ │ │ │ │ │ │
+├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ ┌───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─┴───┤ ┌───┼───┼───┐
+│ │ │ │ │ │ │ │ │ │ │ │
+└─────┘ └─────┴───────────────────────────┴─────┘ └─────┘ └───┴───┴───┘
+```
+
```
LAYOUT_tkl_iso
┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
@@ -713,6 +794,42 @@ LAYOUT_tkl_iso_tsangan_split_bs_rshift
└─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ └───┴───┴───┘
```
+```
+LAYOUT_tkl_iso_wkl
+┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+└───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘
+┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │ └───┴───┴───┘
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ ┌───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├────┴┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─────┤ ┌───┼───┼───┐
+│ │ │ │ │ │ │ │ │ │ │ │
+└─────┘ └─────┴───────────────────────────┴─────┘ └─────┘ └───┴───┴───┘
+```
+
+```
+LAYOUT_tkl_iso_wkl_split_bs_rshift
+┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+└───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘
+┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ ├───┼───┼───┤
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │ └───┴───┴───┘
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴┬───┤ ┌───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├────┴┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─┴───┤ ┌───┼───┼───┐
+│ │ │ │ │ │ │ │ │ │ │ │
+└─────┘ └─────┴───────────────────────────┴─────┘ └─────┘ └───┴───┴───┘
+```
+
```
LAYOUT_tkl_jis
┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
@@ -787,20 +904,56 @@ LAYOUT_tkl_f13_ansi_tsangan
```
LAYOUT_tkl_f13_ansi_tsangan_split_bs_rshift
-┌───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┐┌───┬───┬───┐
-│ ││ │ │ │ ││ │ │ │ ││ │ │ │ ││ ││ │ │ │
-└───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘└───┴───┴───┘
-┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐┌───┬───┬───┐
-│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ││ │ │ │
-├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤├───┼───┼───┤
-│ │ │ │ │ │ │ │ │ │ │ │ │ │ ││ │ │ │
-├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤└───┴───┴───┘
+┌───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┐ ┌───┬───┬───┐
+│ ││ │ │ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ │ │
+└───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘ └───┴───┴───┘
+┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ ├───┼───┼───┤
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘
│ │ │ │ │ │ │ │ │ │ │ │ │ │
-├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ ┌───┐
-│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
-├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─┴───┤┌───┼───┼───┐
-│ │ │ │ │ │ │ ││ │ │ │
-└─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘└───┴───┴───┘
+├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ ┌───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─┴───┤ ┌───┼───┼───┐
+│ │ │ │ │ │ │ │ │ │ │ │
+└─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ └───┴───┴───┘
+```
+
+```
+LAYOUT_tkl_f13_ansi_wkl
+┌───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┐ ┌───┬───┬───┐
+│ ││ │ │ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ │ │
+└───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘ └───┴───┴───┘
+┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘
+│ │ │ │ │ │ │ │ │ │ │ │ │ │
+├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ ┌───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─────┤ ┌───┼───┼───┐
+│ │ │ │ │ │ │ │ │ │ │ │
+└─────┘ └─────┴───────────────────────────┴─────┘ └─────┘ └───┴───┴───┘
+```
+
+```
+LAYOUT_tkl_f13_ansi_wkl_split_bs_rshift
+┌───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┐ ┌───┬───┬───┐
+│ ││ │ │ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ │ │
+└───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘ └───┴───┴───┘
+┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ ├───┼───┼───┤
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘
+│ │ │ │ │ │ │ │ │ │ │ │ │ │
+├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ ┌───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─┴───┤ ┌───┼───┼───┐
+│ │ │ │ │ │ │ │ │ │ │ │
+└─────┘ └─────┴───────────────────────────┴─────┘ └─────┘ └───┴───┴───┘
```
```
@@ -823,20 +976,20 @@ LAYOUT_tkl_f13_iso
```
LAYOUT_tkl_f13_iso_split_bs_rshift
-┌───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┐┌───┬───┬───┐
-│ ││ │ │ │ ││ │ │ │ ││ │ │ │ ││ ││ │ │ │
-└───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘└───┴───┴───┘
-┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐┌───┬───┬───┐
-│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ││ │ │ │
-├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤├───┼───┼───┤
-│ │ │ │ │ │ │ │ │ │ │ │ │ │ ││ │ │ │
-├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │└───┴───┴───┘
+┌───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┐ ┌───┬───┬───┐
+│ ││ │ │ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ │ │
+└───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘ └───┴───┴───┘
+┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ ├───┼───┼───┤
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │ └───┴───┴───┘
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
-├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴┬───┤ ┌───┐
-│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
-├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬┴───┤┌───┼───┼───┐
-│ │ │ │ │ │ │ │ ││ │ │ │
-└────┴────┴────┴────────────────────────┴────┴────┴────┴────┘└───┴───┴───┘
+├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴┬───┤ ┌───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬┴───┤ ┌───┼───┼───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │
+└────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘
```
```
@@ -859,39 +1012,74 @@ LAYOUT_tkl_f13_iso_tsangan
```
LAYOUT_tkl_f13_iso_tsangan_split_bs_rshift
-┌───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┐┌───┬───┬───┐
-│ ││ │ │ │ ││ │ │ │ ││ │ │ │ ││ ││ │ │ │
-└───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘└───┴───┴───┘
-┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐┌───┬───┬───┐
-│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ││ │ │ │
-├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤├───┼───┼───┤
-│ │ │ │ │ │ │ │ │ │ │ │ │ │ ││ │ │ │
-├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │└───┴───┴───┘
+┌───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┐ ┌───┬───┬───┐
+│ ││ │ │ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ │ │
+└───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘ └───┴───┴───┘
+┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ ├───┼───┼───┤
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │ └───┴───┴───┘
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
-├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴┬───┤ ┌───┐
-│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
-├────┴┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─┴───┤┌───┼───┼───┐
-│ │ │ │ │ │ │ ││ │ │ │
-└─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘└───┴───┴───┘
+├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴┬───┤ ┌───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├────┴┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─┴───┤ ┌───┼───┼───┐
+│ │ │ │ │ │ │ │ │ │ │ │
+└─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ └───┴───┴───┘
+```
+
+```
+LAYOUT_tkl_f13_iso_wkl
+┌───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┐ ┌───┬───┬───┐
+│ ││ │ │ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ │ │
+└───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘ └───┴───┴───┘
+┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │ └───┴───┴───┘
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ ┌───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├────┴┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─────┤ ┌───┼───┼───┐
+│ │ │ │ │ │ │ │ │ │ │ │
+└─────┘ └─────┴───────────────────────────┴─────┘ └─────┘ └───┴───┴───┘
+```
+
+```
+LAYOUT_tkl_f13_iso_wkl_split_bs_rshift
+┌───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┐ ┌───┬───┬───┐
+│ ││ │ │ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ │ │
+└───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘ └───┴───┴───┘
+┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ ├───┼───┼───┤
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │ └───┴───┴───┘
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴┬───┤ ┌───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├────┴┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─┴───┤ ┌───┼───┼───┐
+│ │ │ │ │ │ │ │ │ │ │ │
+└─────┘ └─────┴───────────────────────────┴─────┘ └─────┘ └───┴───┴───┘
```
```
LAYOUT_tkl_f13_jis
-┌───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┐┌───┬───┬───┐
-│ ││ │ │ │ ││ │ │ │ ││ │ │ │ ││ ││ │ │ │
-└───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘└───┴───┴───┘
-┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐┌───┬───┬───┐
-│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ││ │ │ │
-├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤├───┼───┼───┤
-│ │ │ │ │ │ │ │ │ │ │ │ │ │ ││ │ │ │
-├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │└───┴───┴───┘
+┌───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┐ ┌───┬───┬───┐
+│ ││ │ │ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ │ │
+└───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘ └───┴───┴───┘
+┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ ├───┼───┼───┤
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │ └───┴───┴───┘
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
-├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┤ ┌───┐
-│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
-├────┬───┴┬──┴─┬─┴──┬┴───┴───┴───┴─┬─┴──┬┴───┼───┴┬──┴─┬────┤┌───┼───┼───┐
-│ │ │ │ │ │ │ │ │ │ ││ │ │ │
-└────┴────┴────┴────┴──────────────┴────┴────┴────┴────┴────┘└───┴───┴───┘
-
+├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┤ ┌───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+├────┬───┴┬──┴─┬─┴──┬┴───┴───┴───┴─┬─┴──┬┴───┼───┴┬──┴─┬────┤ ┌───┼───┼───┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+└────┴────┴────┴────┴──────────────┴────┴────┴────┴────┴────┘ └───┴───┴───┘
```
```
diff --git a/layouts/default/tkl_ansi_wkl/default_tkl_ansi_wkl/keymap.c b/layouts/default/tkl_ansi_wkl/default_tkl_ansi_wkl/keymap.c
new file mode 100644
index 00000000000..3d8cef64fc2
--- /dev/null
+++ b/layouts/default/tkl_ansi_wkl/default_tkl_ansi_wkl/keymap.c
@@ -0,0 +1,32 @@
+// Copyright 2022 QMK
+// 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 │ - │ = │ Backsp│ │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 │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ ┌───┐
+ * │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift │ │ ↑ │
+ * ├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─────┤ ┌───┼───┼───┐
+ * │Ctrl │ │Alt │ │ Alt│ │ Ctrl│ │ ← │ ↓ │ → │
+ * └─────┘ └─────┴───────────────────────────┴─────┘ └─────┘ └───┴───┴───┘
+ */
+ [0] = LAYOUT_tkl_ansi_wkl(
+ 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_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ )
+};
diff --git a/layouts/default/tkl_ansi_wkl/info.json b/layouts/default/tkl_ansi_wkl/info.json
new file mode 100644
index 00000000000..eb08eacd370
--- /dev/null
+++ b/layouts/default/tkl_ansi_wkl/info.json
@@ -0,0 +1,105 @@
+{
+ "keyboard_name": "Tenkeyless ANSI Windows keyless layout",
+ "url": "",
+ "maintainer": "qmk",
+ "layouts": {
+ "LAYOUT_tkl_ansi_wkl": {
+ "layout": [
+ {"x":0, "y":0},
+ {"x":2, "y":0},
+ {"x":3, "y":0},
+ {"x":4, "y":0},
+ {"x":5, "y":0},
+ {"x":6.5, "y":0},
+ {"x":7.5, "y":0},
+ {"x":8.5, "y":0},
+ {"x":9.5, "y":0},
+ {"x":11, "y":0},
+ {"x":12, "y":0},
+ {"x":13, "y":0},
+ {"x":14, "y":0},
+
+ {"x":15.25, "y":0},
+ {"x":16.25, "y":0},
+ {"x":17.25, "y":0},
+
+ {"x":0, "y":1.25},
+ {"x":1, "y":1.25},
+ {"x":2, "y":1.25},
+ {"x":3, "y":1.25},
+ {"x":4, "y":1.25},
+ {"x":5, "y":1.25},
+ {"x":6, "y":1.25},
+ {"x":7, "y":1.25},
+ {"x":8, "y":1.25},
+ {"x":9, "y":1.25},
+ {"x":10, "y":1.25},
+ {"x":11, "y":1.25},
+ {"x":12, "y":1.25},
+ {"x":13, "y":1.25, "w":2},
+
+ {"x":15.25, "y":1.25},
+ {"x":16.25, "y":1.25},
+ {"x":17.25, "y":1.25},
+
+ {"x":0, "y":2.25, "w":1.5},
+ {"x":1.5, "y":2.25},
+ {"x":2.5, "y":2.25},
+ {"x":3.5, "y":2.25},
+ {"x":4.5, "y":2.25},
+ {"x":5.5, "y":2.25},
+ {"x":6.5, "y":2.25},
+ {"x":7.5, "y":2.25},
+ {"x":8.5, "y":2.25},
+ {"x":9.5, "y":2.25},
+ {"x":10.5, "y":2.25},
+ {"x":11.5, "y":2.25},
+ {"x":12.5, "y":2.25},
+ {"x":13.5, "y":2.25, "w":1.5},
+
+ {"x":15.25, "y":2.25},
+ {"x":16.25, "y":2.25},
+ {"x":17.25, "y":2.25},
+
+ {"x":0, "y":3.25, "w":1.75},
+ {"x":1.75, "y":3.25},
+ {"x":2.75, "y":3.25},
+ {"x":3.75, "y":3.25},
+ {"x":4.75, "y":3.25},
+ {"x":5.75, "y":3.25},
+ {"x":6.75, "y":3.25},
+ {"x":7.75, "y":3.25},
+ {"x":8.75, "y":3.25},
+ {"x":9.75, "y":3.25},
+ {"x":10.75, "y":3.25},
+ {"x":11.75, "y":3.25},
+ {"x":12.75, "y":3.25, "w":2.25},
+
+ {"x":0, "y":4.25, "w":2.25},
+ {"x":2.25, "y":4.25},
+ {"x":3.25, "y":4.25},
+ {"x":4.25, "y":4.25},
+ {"x":5.25, "y":4.25},
+ {"x":6.25, "y":4.25},
+ {"x":7.25, "y":4.25},
+ {"x":8.25, "y":4.25},
+ {"x":9.25, "y":4.25},
+ {"x":10.25, "y":4.25},
+ {"x":11.25, "y":4.25},
+ {"x":12.25, "y":4.25, "w":2.75},
+
+ {"x":16.25, "y":4.25},
+
+ {"x":0, "y":5.25, "w":1.5},
+ {"x":2.5, "y":5.25, "w":1.5},
+ {"x":4, "y":5.25, "w":7},
+ {"x":11, "y":5.25, "w":1.5},
+ {"x":13.5, "y":5.25, "w":1.5},
+
+ {"x":15.25, "y":5.25},
+ {"x":16.25, "y":5.25},
+ {"x":17.25, "y":5.25}
+ ]
+ }
+ }
+}
diff --git a/layouts/default/tkl_ansi_wkl/layout.json b/layouts/default/tkl_ansi_wkl/layout.json
new file mode 100644
index 00000000000..b6d3505b159
--- /dev/null
+++ b/layouts/default/tkl_ansi_wkl/layout.json
@@ -0,0 +1,6 @@
+[{a:7},"",{x:1},"","","","",{x:0.5},"","","","",{x:0.5},"","","","",{x:0.25},"","",""],
+[{y:0.25},"","","","","","","","","","","","","",{w:2},"",{x:0.25},"","",""],
+[{w:1.5},"","","","","","","","","","","","","",{w:1.5},"",{x:0.25},"","",""],
+[{w:1.75},"","","","","","","","","","","","",{w:2.25},""],
+[{w:2.25},"","","","","","","","","","","",{w:2.75},"",{x:1.25},""],
+[{w:1.5},"",{x:1,w:1.5},"",{w:7},"",{w:1.5},"",{x:1,w:1.5},"",{x:0.25},"","",""]
diff --git a/layouts/default/tkl_ansi_wkl/readme.md b/layouts/default/tkl_ansi_wkl/readme.md
new file mode 100644
index 00000000000..6541a0f23ab
--- /dev/null
+++ b/layouts/default/tkl_ansi_wkl/readme.md
@@ -0,0 +1,3 @@
+# tkl_ansi_wkl
+
+ LAYOUT_tkl_ansi_wkl
diff --git a/layouts/default/tkl_ansi_wkl_split_bs_rshift/default_tkl_ansi_wkl_split_bs_rshift/keymap.c b/layouts/default/tkl_ansi_wkl_split_bs_rshift/default_tkl_ansi_wkl_split_bs_rshift/keymap.c
new file mode 100644
index 00000000000..a5b27ee42bb
--- /dev/null
+++ b/layouts/default/tkl_ansi_wkl_split_bs_rshift/default_tkl_ansi_wkl_split_bs_rshift/keymap.c
@@ -0,0 +1,32 @@
+// Copyright 2023 QMK
+// 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 │ - │ = │Bsp│Bsp│ │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 │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ ┌───┐
+ * │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift│Sft│ │ ↑ │
+ * ├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─┴───┤ ┌───┼───┼───┐
+ * │Ctrl │ │Alt │ │ Alt│ │ Ctrl│ │ ← │ ↓ │ → │
+ * └─────┘ └─────┴───────────────────────────┴─────┘ └─────┘ └───┴───┴───┘
+ */
+ [0] = LAYOUT_tkl_ansi_wkl_split_bs_rshift(
+ 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, 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_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ )
+};
diff --git a/layouts/default/tkl_ansi_wkl_split_bs_rshift/info.json b/layouts/default/tkl_ansi_wkl_split_bs_rshift/info.json
new file mode 100644
index 00000000000..62b48e3bc84
--- /dev/null
+++ b/layouts/default/tkl_ansi_wkl_split_bs_rshift/info.json
@@ -0,0 +1,107 @@
+{
+ "keyboard_name": "Tenkeyless ANSI Windows keyless layout with split Backspace and split Right Shift",
+ "url": "",
+ "maintainer": "qmk",
+ "layouts": {
+ "LAYOUT_tkl_ansi_wkl_split_bs_rshift": {
+ "layout": [
+ {"x":0, "y":0},
+ {"x":2, "y":0},
+ {"x":3, "y":0},
+ {"x":4, "y":0},
+ {"x":5, "y":0},
+ {"x":6.5, "y":0},
+ {"x":7.5, "y":0},
+ {"x":8.5, "y":0},
+ {"x":9.5, "y":0},
+ {"x":11, "y":0},
+ {"x":12, "y":0},
+ {"x":13, "y":0},
+ {"x":14, "y":0},
+
+ {"x":15.25, "y":0},
+ {"x":16.25, "y":0},
+ {"x":17.25, "y":0},
+
+ {"x":0, "y":1.25},
+ {"x":1, "y":1.25},
+ {"x":2, "y":1.25},
+ {"x":3, "y":1.25},
+ {"x":4, "y":1.25},
+ {"x":5, "y":1.25},
+ {"x":6, "y":1.25},
+ {"x":7, "y":1.25},
+ {"x":8, "y":1.25},
+ {"x":9, "y":1.25},
+ {"x":10, "y":1.25},
+ {"x":11, "y":1.25},
+ {"x":12, "y":1.25},
+ {"x":13, "y":1.25},
+ {"x":14, "y":1.25},
+
+ {"x":15.25, "y":1.25},
+ {"x":16.25, "y":1.25},
+ {"x":17.25, "y":1.25},
+
+ {"x":0, "y":2.25, "w":1.5},
+ {"x":1.5, "y":2.25},
+ {"x":2.5, "y":2.25},
+ {"x":3.5, "y":2.25},
+ {"x":4.5, "y":2.25},
+ {"x":5.5, "y":2.25},
+ {"x":6.5, "y":2.25},
+ {"x":7.5, "y":2.25},
+ {"x":8.5, "y":2.25},
+ {"x":9.5, "y":2.25},
+ {"x":10.5, "y":2.25},
+ {"x":11.5, "y":2.25},
+ {"x":12.5, "y":2.25},
+ {"x":13.5, "y":2.25, "w":1.5},
+
+ {"x":15.25, "y":2.25},
+ {"x":16.25, "y":2.25},
+ {"x":17.25, "y":2.25},
+
+ {"x":0, "y":3.25, "w":1.75},
+ {"x":1.75, "y":3.25},
+ {"x":2.75, "y":3.25},
+ {"x":3.75, "y":3.25},
+ {"x":4.75, "y":3.25},
+ {"x":5.75, "y":3.25},
+ {"x":6.75, "y":3.25},
+ {"x":7.75, "y":3.25},
+ {"x":8.75, "y":3.25},
+ {"x":9.75, "y":3.25},
+ {"x":10.75, "y":3.25},
+ {"x":11.75, "y":3.25},
+ {"x":12.75, "y":3.25, "w":2.25},
+
+ {"x":0, "y":4.25, "w":2.25},
+ {"x":2.25, "y":4.25},
+ {"x":3.25, "y":4.25},
+ {"x":4.25, "y":4.25},
+ {"x":5.25, "y":4.25},
+ {"x":6.25, "y":4.25},
+ {"x":7.25, "y":4.25},
+ {"x":8.25, "y":4.25},
+ {"x":9.25, "y":4.25},
+ {"x":10.25, "y":4.25},
+ {"x":11.25, "y":4.25},
+ {"x":12.25, "y":4.25, "w":1.75},
+ {"x":14, "y":4.25},
+
+ {"x":16.25, "y":4.25},
+
+ {"x":0, "y":5.25, "w":1.5},
+ {"x":2.5, "y":5.25, "w":1.5},
+ {"x":4, "y":5.25, "w":7},
+ {"x":11, "y":5.25, "w":1.5},
+ {"x":13.5, "y":5.25, "w":1.5},
+
+ {"x":15.25, "y":5.25},
+ {"x":16.25, "y":5.25},
+ {"x":17.25, "y":5.25}
+ ]
+ }
+ }
+}
diff --git a/layouts/default/tkl_ansi_wkl_split_bs_rshift/layout.json b/layouts/default/tkl_ansi_wkl_split_bs_rshift/layout.json
new file mode 100644
index 00000000000..0fba13348bb
--- /dev/null
+++ b/layouts/default/tkl_ansi_wkl_split_bs_rshift/layout.json
@@ -0,0 +1,6 @@
+[{a:7},"",{x:1},"","","","",{x:0.5},"","","","",{x:0.5},"","","","",{x:0.25},"","",""],
+[{y:0.25},"","","","","","","","","","","","","","","",{x:0.25},"","",""],
+[{w:1.5},"","","","","","","","","","","","","",{w:1.5},"",{x:0.25},"","",""],
+[{w:1.75},"","","","","","","","","","","","",{w:2.25},""],
+[{w:2.25},"","","","","","","","","","","",{w:1.75},"","",{x:1.25},""],
+[{w:1.5},"",{x:1,w:1.5},"",{w:7},"",{w:1.5},"",{x:1,w:1.5},"",{x:0.25},"","",""]
diff --git a/layouts/default/tkl_ansi_wkl_split_bs_rshift/readme.md b/layouts/default/tkl_ansi_wkl_split_bs_rshift/readme.md
new file mode 100644
index 00000000000..35235603728
--- /dev/null
+++ b/layouts/default/tkl_ansi_wkl_split_bs_rshift/readme.md
@@ -0,0 +1,3 @@
+# tkl_ansi_wkl_split_bs_rshift
+
+ LAYOUT_tkl_ansi_wkl_split_bs_rshift
diff --git a/layouts/default/tkl_f13_ansi_wkl/default_tkl_f13_ansi_wkl/keymap.c b/layouts/default/tkl_f13_ansi_wkl/default_tkl_f13_ansi_wkl/keymap.c
new file mode 100644
index 00000000000..709988ac76d
--- /dev/null
+++ b/layouts/default/tkl_f13_ansi_wkl/default_tkl_f13_ansi_wkl/keymap.c
@@ -0,0 +1,32 @@
+// Copyright 2023 QMK
+// 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││F13│ │PSc│Scr│Pse│
+ * └───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘ └───┴───┴───┘
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐
+ * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Backsp│ │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 │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ ┌───┐
+ * │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift │ │ ↑ │
+ * ├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─────┤ ┌───┼───┼───┐
+ * │Ctrl │ │Alt │ │ Alt│ │ Ctrl│ │ ← │ ↓ │ → │
+ * └─────┘ └─────┴───────────────────────────┴─────┘ └─────┘ └───┴───┴───┘
+ */
+ [0] = LAYOUT_tkl_f13_ansi_wkl(
+ 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_F13, 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_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ )
+};
diff --git a/layouts/default/tkl_f13_ansi_wkl/info.json b/layouts/default/tkl_f13_ansi_wkl/info.json
new file mode 100644
index 00000000000..ca03585d00a
--- /dev/null
+++ b/layouts/default/tkl_f13_ansi_wkl/info.json
@@ -0,0 +1,106 @@
+{
+ "keyboard_name": "Tenkeyless ANSI Windows keyless layout with F13 key",
+ "url": "",
+ "maintainer": "qmk",
+ "layouts": {
+ "LAYOUT_tkl_f13_ansi_wkl": {
+ "layout": [
+ {"x":0, "y":0},
+ {"x":1.25, "y":0},
+ {"x":2.25, "y":0},
+ {"x":3.25, "y":0},
+ {"x":4.25, "y":0},
+ {"x":5.5, "y":0},
+ {"x":6.5, "y":0},
+ {"x":7.5, "y":0},
+ {"x":8.5, "y":0},
+ {"x":9.75, "y":0},
+ {"x":10.75, "y":0},
+ {"x":11.75, "y":0},
+ {"x":12.75, "y":0},
+ {"x":14, "y":0},
+
+ {"x":15.25, "y":0},
+ {"x":16.25, "y":0},
+ {"x":17.25, "y":0},
+
+ {"x":0, "y":1.25},
+ {"x":1, "y":1.25},
+ {"x":2, "y":1.25},
+ {"x":3, "y":1.25},
+ {"x":4, "y":1.25},
+ {"x":5, "y":1.25},
+ {"x":6, "y":1.25},
+ {"x":7, "y":1.25},
+ {"x":8, "y":1.25},
+ {"x":9, "y":1.25},
+ {"x":10, "y":1.25},
+ {"x":11, "y":1.25},
+ {"x":12, "y":1.25},
+ {"x":13, "y":1.25, "w":2},
+
+ {"x":15.25, "y":1.25},
+ {"x":16.25, "y":1.25},
+ {"x":17.25, "y":1.25},
+
+ {"x":0, "y":2.25, "w":1.5},
+ {"x":1.5, "y":2.25},
+ {"x":2.5, "y":2.25},
+ {"x":3.5, "y":2.25},
+ {"x":4.5, "y":2.25},
+ {"x":5.5, "y":2.25},
+ {"x":6.5, "y":2.25},
+ {"x":7.5, "y":2.25},
+ {"x":8.5, "y":2.25},
+ {"x":9.5, "y":2.25},
+ {"x":10.5, "y":2.25},
+ {"x":11.5, "y":2.25},
+ {"x":12.5, "y":2.25},
+ {"x":13.5, "y":2.25, "w":1.5},
+
+ {"x":15.25, "y":2.25},
+ {"x":16.25, "y":2.25},
+ {"x":17.25, "y":2.25},
+
+ {"x":0, "y":3.25, "w":1.75},
+ {"x":1.75, "y":3.25},
+ {"x":2.75, "y":3.25},
+ {"x":3.75, "y":3.25},
+ {"x":4.75, "y":3.25},
+ {"x":5.75, "y":3.25},
+ {"x":6.75, "y":3.25},
+ {"x":7.75, "y":3.25},
+ {"x":8.75, "y":3.25},
+ {"x":9.75, "y":3.25},
+ {"x":10.75, "y":3.25},
+ {"x":11.75, "y":3.25},
+ {"x":12.75, "y":3.25, "w":2.25},
+
+ {"x":0, "y":4.25, "w":2.25},
+ {"x":2.25, "y":4.25},
+ {"x":3.25, "y":4.25},
+ {"x":4.25, "y":4.25},
+ {"x":5.25, "y":4.25},
+ {"x":6.25, "y":4.25},
+ {"x":7.25, "y":4.25},
+ {"x":8.25, "y":4.25},
+ {"x":9.25, "y":4.25},
+ {"x":10.25, "y":4.25},
+ {"x":11.25, "y":4.25},
+ {"x":12.25, "y":4.25, "w":2.75},
+
+ {"x":16.25, "y":4.25},
+
+ {"x":0, "y":5.25, "w":1.5},
+ {"x":2.5, "y":5.25, "w":1.5},
+ {"x":4, "y":5.25, "w":7},
+ {"x":11, "y":5.25, "w":1.5},
+ {"x":13.5, "y":5.25, "w":1.5},
+
+ {"x":15.25, "y":5.25},
+ {"x":16.25, "y":5.25},
+ {"x":17.25, "y":5.25}
+ ]
+ }
+ }
+}
diff --git a/layouts/default/tkl_f13_ansi_wkl/layout.json b/layouts/default/tkl_f13_ansi_wkl/layout.json
new file mode 100644
index 00000000000..850ffc9bdc9
--- /dev/null
+++ b/layouts/default/tkl_f13_ansi_wkl/layout.json
@@ -0,0 +1,6 @@
+[{a:7},"",{x:0.25},"","","","",{x:0.25},"","","","",{x:0.25},"","","","",{x:0.25},"",{x:0.25},"","",""],
+[{y:0.25},"","","","","","","","","","","","","",{w:2},"",{x:0.25},"","",""],
+[{w:1.5},"","","","","","","","","","","","","",{w:1.5},"",{x:0.25},"","",""],
+[{w:1.75},"","","","","","","","","","","","",{w:2.25},""],
+[{w:2.25},"","","","","","","","","","","",{w:2.75},"",{x:1.25},""],
+[{w:1.5},"",{x:1,w:1.5},"",{w:7},"",{w:1.5},"",{x:1,w:1.5},"",{x:0.25},"","",""]
diff --git a/layouts/default/tkl_f13_ansi_wkl/readme.md b/layouts/default/tkl_f13_ansi_wkl/readme.md
new file mode 100644
index 00000000000..607692c2392
--- /dev/null
+++ b/layouts/default/tkl_f13_ansi_wkl/readme.md
@@ -0,0 +1,3 @@
+# tkl_f13_ansi_wkl
+
+ LAYOUT_tkl_f13_ansi_wkl
diff --git a/layouts/default/tkl_f13_ansi_wkl_split_bs_rshift/default_tkl_f13_ansi_wkl_split_bs_rshift/keymap.c b/layouts/default/tkl_f13_ansi_wkl_split_bs_rshift/default_tkl_f13_ansi_wkl_split_bs_rshift/keymap.c
new file mode 100644
index 00000000000..6089b7681f9
--- /dev/null
+++ b/layouts/default/tkl_f13_ansi_wkl_split_bs_rshift/default_tkl_f13_ansi_wkl_split_bs_rshift/keymap.c
@@ -0,0 +1,32 @@
+// Copyright 2023 QMK
+// 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││F13│ │PSc│Scr│Pse│
+ * └───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘ └───┴───┴───┘
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┐
+ * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │Bsp│Bsp│ │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 │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ ┌───┐
+ * │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │Shift │Sft│ │ ↑ │
+ * ├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─┴───┤ ┌───┼───┼───┐
+ * │Ctrl │ │Alt │ │ Alt│ │ Ctrl│ │ ← │ ↓ │ → │
+ * └─────┘ └─────┴───────────────────────────┴─────┘ └─────┘ └───┴───┴───┘
+ */
+ [0] = LAYOUT_tkl_f13_ansi_wkl_split_bs_rshift(
+ 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_F13, 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, 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_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ )
+};
diff --git a/layouts/default/tkl_f13_ansi_wkl_split_bs_rshift/info.json b/layouts/default/tkl_f13_ansi_wkl_split_bs_rshift/info.json
new file mode 100644
index 00000000000..755e7a80d78
--- /dev/null
+++ b/layouts/default/tkl_f13_ansi_wkl_split_bs_rshift/info.json
@@ -0,0 +1,108 @@
+{
+ "keyboard_name": "Tenkeyless ANSI Windows keyless layout with F13 key, split Backspace, and split Right Shift",
+ "url": "",
+ "maintainer": "qmk",
+ "layouts": {
+ "LAYOUT_tkl_f13_ansi_wkl_split_bs_rshift": {
+ "layout": [
+ {"x":0, "y":0},
+ {"x":1.25, "y":0},
+ {"x":2.25, "y":0},
+ {"x":3.25, "y":0},
+ {"x":4.25, "y":0},
+ {"x":5.5, "y":0},
+ {"x":6.5, "y":0},
+ {"x":7.5, "y":0},
+ {"x":8.5, "y":0},
+ {"x":9.75, "y":0},
+ {"x":10.75, "y":0},
+ {"x":11.75, "y":0},
+ {"x":12.75, "y":0},
+ {"x":14, "y":0},
+
+ {"x":15.25, "y":0},
+ {"x":16.25, "y":0},
+ {"x":17.25, "y":0},
+
+ {"x":0, "y":1.25},
+ {"x":1, "y":1.25},
+ {"x":2, "y":1.25},
+ {"x":3, "y":1.25},
+ {"x":4, "y":1.25},
+ {"x":5, "y":1.25},
+ {"x":6, "y":1.25},
+ {"x":7, "y":1.25},
+ {"x":8, "y":1.25},
+ {"x":9, "y":1.25},
+ {"x":10, "y":1.25},
+ {"x":11, "y":1.25},
+ {"x":12, "y":1.25},
+ {"x":13, "y":1.25},
+ {"x":14, "y":1.25},
+
+ {"x":15.25, "y":1.25},
+ {"x":16.25, "y":1.25},
+ {"x":17.25, "y":1.25},
+
+ {"x":0, "y":2.25, "w":1.5},
+ {"x":1.5, "y":2.25},
+ {"x":2.5, "y":2.25},
+ {"x":3.5, "y":2.25},
+ {"x":4.5, "y":2.25},
+ {"x":5.5, "y":2.25},
+ {"x":6.5, "y":2.25},
+ {"x":7.5, "y":2.25},
+ {"x":8.5, "y":2.25},
+ {"x":9.5, "y":2.25},
+ {"x":10.5, "y":2.25},
+ {"x":11.5, "y":2.25},
+ {"x":12.5, "y":2.25},
+ {"x":13.5, "y":2.25, "w":1.5},
+
+ {"x":15.25, "y":2.25},
+ {"x":16.25, "y":2.25},
+ {"x":17.25, "y":2.25},
+
+ {"x":0, "y":3.25, "w":1.75},
+ {"x":1.75, "y":3.25},
+ {"x":2.75, "y":3.25},
+ {"x":3.75, "y":3.25},
+ {"x":4.75, "y":3.25},
+ {"x":5.75, "y":3.25},
+ {"x":6.75, "y":3.25},
+ {"x":7.75, "y":3.25},
+ {"x":8.75, "y":3.25},
+ {"x":9.75, "y":3.25},
+ {"x":10.75, "y":3.25},
+ {"x":11.75, "y":3.25},
+ {"x":12.75, "y":3.25, "w":2.25},
+
+ {"x":0, "y":4.25, "w":2.25},
+ {"x":2.25, "y":4.25},
+ {"x":3.25, "y":4.25},
+ {"x":4.25, "y":4.25},
+ {"x":5.25, "y":4.25},
+ {"x":6.25, "y":4.25},
+ {"x":7.25, "y":4.25},
+ {"x":8.25, "y":4.25},
+ {"x":9.25, "y":4.25},
+ {"x":10.25, "y":4.25},
+ {"x":11.25, "y":4.25},
+ {"x":12.25, "y":4.25, "w":1.75},
+ {"x":14, "y":4.25},
+
+ {"x":16.25, "y":4.25},
+
+ {"x":0, "y":5.25, "w":1.5},
+ {"x":2.5, "y":5.25, "w":1.5},
+ {"x":4, "y":5.25, "w":7},
+ {"x":11, "y":5.25, "w":1.5},
+ {"x":13.5, "y":5.25, "w":1.5},
+
+ {"x":15.25, "y":5.25},
+ {"x":16.25, "y":5.25},
+ {"x":17.25, "y":5.25}
+ ]
+ }
+ }
+}
diff --git a/layouts/default/tkl_f13_ansi_wkl_split_bs_rshift/layout.json b/layouts/default/tkl_f13_ansi_wkl_split_bs_rshift/layout.json
new file mode 100644
index 00000000000..6992dff912b
--- /dev/null
+++ b/layouts/default/tkl_f13_ansi_wkl_split_bs_rshift/layout.json
@@ -0,0 +1,6 @@
+[{a:7},"",{x:0.25},"","","","",{x:0.25},"","","","",{x:0.25},"","","","",{x:0.25},"",{x:0.25},"","",""],
+[{y:0.25},"","","","","","","","","","","","","","","",{x:0.25},"","",""],
+[{w:1.5},"","","","","","","","","","","","","",{w:1.5},"",{x:0.25},"","",""],
+[{w:1.75},"","","","","","","","","","","","",{w:2.25},""],
+[{w:2.25},"","","","","","","","","","","",{w:1.75},"","",{x:1.25},""],
+[{w:1.5},"",{x:1,w:1.5},"",{w:7},"",{w:1.5},"",{x:1,w:1.5},"",{x:0.25},"","",""]
diff --git a/layouts/default/tkl_f13_ansi_wkl_split_bs_rshift/readme.md b/layouts/default/tkl_f13_ansi_wkl_split_bs_rshift/readme.md
new file mode 100644
index 00000000000..614c0913f62
--- /dev/null
+++ b/layouts/default/tkl_f13_ansi_wkl_split_bs_rshift/readme.md
@@ -0,0 +1,3 @@
+# tkl_f13_ansi_wkl_split_bs_rshift
+
+ LAYOUT_tkl_f13_ansi_wkl_split_bs_rshift
diff --git a/layouts/default/tkl_f13_iso_wkl/default_tkl_f13_iso_wkl/keymap.c b/layouts/default/tkl_f13_iso_wkl/default_tkl_f13_iso_wkl/keymap.c
new file mode 100644
index 00000000000..5a32e674e8d
--- /dev/null
+++ b/layouts/default/tkl_f13_iso_wkl/default_tkl_f13_iso_wkl/keymap.c
@@ -0,0 +1,32 @@
+// Copyright 2023 QMK
+// 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││F13│ │PSc│Scr│Pse│
+ * └───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘ └───┴───┴───┘
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐
+ * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Backsp│ │Ins│Hom│PgU│
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤
+ * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ │ │Del│End│PgD│
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ Ent│ └───┴───┴───┘
+ * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ # │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ ┌───┐
+ * │Shft│ \ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift │ │ ↑ │
+ * ├────┴┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─────┤ ┌───┼───┼───┐
+ * │Ctrl │ │Alt │ │ Alt│ │ Ctrl│ │ ← │ ↓ │ → │
+ * └─────┘ └─────┴───────────────────────────┴─────┘ └─────┘ └───┴───┴───┘
+ */
+ [0] = LAYOUT_tkl_f13_iso_wkl(
+ 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_F13, 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_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_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, KC_UP,
+ KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ )
+};
diff --git a/layouts/default/tkl_f13_iso_wkl/info.json b/layouts/default/tkl_f13_iso_wkl/info.json
new file mode 100644
index 00000000000..e597716b5dc
--- /dev/null
+++ b/layouts/default/tkl_f13_iso_wkl/info.json
@@ -0,0 +1,107 @@
+{
+ "keyboard_name": "Tenkeyless ISO Windows keyless layout",
+ "url": "",
+ "maintainer": "qmk",
+ "layouts": {
+ "LAYOUT_tkl_f13_iso_wkl": {
+ "layout": [
+ {"x":0, "y":0},
+ {"x":1.25, "y":0},
+ {"x":2.25, "y":0},
+ {"x":3.25, "y":0},
+ {"x":4.25, "y":0},
+ {"x":5.5, "y":0},
+ {"x":6.5, "y":0},
+ {"x":7.5, "y":0},
+ {"x":8.5, "y":0},
+ {"x":9.75, "y":0},
+ {"x":10.75, "y":0},
+ {"x":11.75, "y":0},
+ {"x":12.75, "y":0},
+ {"x":14, "y":0},
+
+ {"x":15.25, "y":0},
+ {"x":16.25, "y":0},
+ {"x":17.25, "y":0},
+
+ {"x":0, "y":1.25},
+ {"x":1, "y":1.25},
+ {"x":2, "y":1.25},
+ {"x":3, "y":1.25},
+ {"x":4, "y":1.25},
+ {"x":5, "y":1.25},
+ {"x":6, "y":1.25},
+ {"x":7, "y":1.25},
+ {"x":8, "y":1.25},
+ {"x":9, "y":1.25},
+ {"x":10, "y":1.25},
+ {"x":11, "y":1.25},
+ {"x":12, "y":1.25},
+ {"x":13, "y":1.25, "w":2},
+
+ {"x":15.25, "y":1.25},
+ {"x":16.25, "y":1.25},
+ {"x":17.25, "y":1.25},
+
+ {"x":0, "y":2.25, "w":1.5},
+ {"x":1.5, "y":2.25},
+ {"x":2.5, "y":2.25},
+ {"x":3.5, "y":2.25},
+ {"x":4.5, "y":2.25},
+ {"x":5.5, "y":2.25},
+ {"x":6.5, "y":2.25},
+ {"x":7.5, "y":2.25},
+ {"x":8.5, "y":2.25},
+ {"x":9.5, "y":2.25},
+ {"x":10.5, "y":2.25},
+ {"x":11.5, "y":2.25},
+ {"x":12.5, "y":2.25},
+
+ {"x":15.25, "y":2.25},
+ {"x":16.25, "y":2.25},
+ {"x":17.25, "y":2.25},
+
+ {"x":0, "y":3.25, "w":1.75},
+ {"x":1.75, "y":3.25},
+ {"x":2.75, "y":3.25},
+ {"x":3.75, "y":3.25},
+ {"x":4.75, "y":3.25},
+ {"x":5.75, "y":3.25},
+ {"x":6.75, "y":3.25},
+ {"x":7.75, "y":3.25},
+ {"x":8.75, "y":3.25},
+ {"x":9.75, "y":3.25},
+ {"x":10.75, "y":3.25},
+ {"x":11.75, "y":3.25},
+ {"x":12.75, "y":3.25},
+ {"x":13.75, "y":2.25, "w":1.25, "h":2},
+
+ {"x":0, "y":4.25, "w":1.25},
+ {"x":1.25, "y":4.25},
+ {"x":2.25, "y":4.25},
+ {"x":3.25, "y":4.25},
+ {"x":4.25, "y":4.25},
+ {"x":5.25, "y":4.25},
+ {"x":6.25, "y":4.25},
+ {"x":7.25, "y":4.25},
+ {"x":8.25, "y":4.25},
+ {"x":9.25, "y":4.25},
+ {"x":10.25, "y":4.25},
+ {"x":11.25, "y":4.25},
+ {"x":12.25, "y":4.25, "w":2.75},
+
+ {"x":16.25, "y":4.25},
+
+ {"x":0, "y":5.25, "w":1.5},
+ {"x":2.5, "y":5.25, "w":1.5},
+ {"x":4, "y":5.25, "w":7},
+ {"x":11, "y":5.25, "w":1.5},
+ {"x":13.5, "y":5.25, "w":1.5},
+
+ {"x":15.25, "y":5.25},
+ {"x":16.25, "y":5.25},
+ {"x":17.25, "y":5.25}
+ ]
+ }
+ }
+}
diff --git a/layouts/default/tkl_f13_iso_wkl/layout.json b/layouts/default/tkl_f13_iso_wkl/layout.json
new file mode 100644
index 00000000000..0c6f178b452
--- /dev/null
+++ b/layouts/default/tkl_f13_iso_wkl/layout.json
@@ -0,0 +1,6 @@
+[{a:7},"",{x:0.25},"","","","",{x:0.25},"","","","",{x:0.25},"","","","",{x:0.25},"",{x:0.25},"","",""],
+[{y:0.25},"","","","","","","","","","","","","",{w:2},"",{x:0.25},"","",""],
+[{w:1.5},"","","","","","","","","","","","","",{x:0.25,w:1.25,h:2,w2:1.5,h2:1,x2:-0.25},"",{x:0.25},"","",""],
+[{w:1.75},"","","","","","","","","","","","",""],
+[{w:1.25},"","","","","","","","","","","","",{w:2.75},"",{x:1.25},""],
+[{w:1.5},"",{x:1,w:1.5},"",{w:7},"",{w:1.5},"",{x:1,w:1.5},"",{x:0.25},"","",""]
diff --git a/layouts/default/tkl_f13_iso_wkl/readme.md b/layouts/default/tkl_f13_iso_wkl/readme.md
new file mode 100644
index 00000000000..46c44195923
--- /dev/null
+++ b/layouts/default/tkl_f13_iso_wkl/readme.md
@@ -0,0 +1,3 @@
+# tkl_f13_iso_wkl
+
+ LAYOUT_tkl_f13_iso_wkl
diff --git a/layouts/default/tkl_f13_iso_wkl_split_bs_rshift/default_tkl_f13_iso_wkl_split_bs_rshift/keymap.c b/layouts/default/tkl_f13_iso_wkl_split_bs_rshift/default_tkl_f13_iso_wkl_split_bs_rshift/keymap.c
new file mode 100644
index 00000000000..7642de46e2f
--- /dev/null
+++ b/layouts/default/tkl_f13_iso_wkl_split_bs_rshift/default_tkl_f13_iso_wkl_split_bs_rshift/keymap.c
@@ -0,0 +1,32 @@
+// Copyright 2023 QMK
+// 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││F13│ │PSc│Scr│Pse│
+ * └───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘ └───┴───┴───┘
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┐
+ * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │Bsp│Bsp│ │Ins│Hom│PgU│
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ ├───┼───┼───┤
+ * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ │ │Del│End│PgD│
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ Ent│ └───┴───┴───┘
+ * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ # │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴┬───┤ ┌───┐
+ * │Shft│ \ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift│Sft│ │ ↑ │
+ * ├────┴┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─┴───┤ ┌───┼───┼───┐
+ * │Ctrl │ │Alt │ │ Alt│ │ Ctrl│ │ ← │ ↓ │ → │
+ * └─────┘ └─────┴───────────────────────────┴─────┘ └─────┘ └───┴───┴───┘
+ */
+ [0] = LAYOUT_tkl_f13_iso_wkl_split_bs_rshift(
+ 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_F13, 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_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_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, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ )
+};
diff --git a/layouts/default/tkl_f13_iso_wkl_split_bs_rshift/info.json b/layouts/default/tkl_f13_iso_wkl_split_bs_rshift/info.json
new file mode 100644
index 00000000000..4ccde283690
--- /dev/null
+++ b/layouts/default/tkl_f13_iso_wkl_split_bs_rshift/info.json
@@ -0,0 +1,109 @@
+{
+ "keyboard_name": "Tenkeyless ISO Windows keyless layout with F13 key, split Backspace, and split Right Shift",
+ "url": "",
+ "maintainer": "qmk",
+ "layouts": {
+ "LAYOUT_tkl_f13_iso_wkl_split_bs_rshift": {
+ "layout": [
+ {"x":0, "y":0},
+ {"x":1.25, "y":0},
+ {"x":2.25, "y":0},
+ {"x":3.25, "y":0},
+ {"x":4.25, "y":0},
+ {"x":5.5, "y":0},
+ {"x":6.5, "y":0},
+ {"x":7.5, "y":0},
+ {"x":8.5, "y":0},
+ {"x":9.75, "y":0},
+ {"x":10.75, "y":0},
+ {"x":11.75, "y":0},
+ {"x":12.75, "y":0},
+ {"x":14, "y":0},
+
+ {"x":15.25, "y":0},
+ {"x":16.25, "y":0},
+ {"x":17.25, "y":0},
+
+ {"x":0, "y":1.25},
+ {"x":1, "y":1.25},
+ {"x":2, "y":1.25},
+ {"x":3, "y":1.25},
+ {"x":4, "y":1.25},
+ {"x":5, "y":1.25},
+ {"x":6, "y":1.25},
+ {"x":7, "y":1.25},
+ {"x":8, "y":1.25},
+ {"x":9, "y":1.25},
+ {"x":10, "y":1.25},
+ {"x":11, "y":1.25},
+ {"x":12, "y":1.25},
+ {"x":13, "y":1.25},
+ {"x":14, "y":1.25},
+
+ {"x":15.25, "y":1.25},
+ {"x":16.25, "y":1.25},
+ {"x":17.25, "y":1.25},
+
+ {"x":0, "y":2.25, "w":1.5},
+ {"x":1.5, "y":2.25},
+ {"x":2.5, "y":2.25},
+ {"x":3.5, "y":2.25},
+ {"x":4.5, "y":2.25},
+ {"x":5.5, "y":2.25},
+ {"x":6.5, "y":2.25},
+ {"x":7.5, "y":2.25},
+ {"x":8.5, "y":2.25},
+ {"x":9.5, "y":2.25},
+ {"x":10.5, "y":2.25},
+ {"x":11.5, "y":2.25},
+ {"x":12.5, "y":2.25},
+
+ {"x":15.25, "y":2.25},
+ {"x":16.25, "y":2.25},
+ {"x":17.25, "y":2.25},
+
+ {"x":0, "y":3.25, "w":1.75},
+ {"x":1.75, "y":3.25},
+ {"x":2.75, "y":3.25},
+ {"x":3.75, "y":3.25},
+ {"x":4.75, "y":3.25},
+ {"x":5.75, "y":3.25},
+ {"x":6.75, "y":3.25},
+ {"x":7.75, "y":3.25},
+ {"x":8.75, "y":3.25},
+ {"x":9.75, "y":3.25},
+ {"x":10.75, "y":3.25},
+ {"x":11.75, "y":3.25},
+ {"x":12.75, "y":3.25},
+ {"x":13.75, "y":2.25, "w":1.25, "h":2},
+
+ {"x":0, "y":4.25, "w":1.25},
+ {"x":1.25, "y":4.25},
+ {"x":2.25, "y":4.25},
+ {"x":3.25, "y":4.25},
+ {"x":4.25, "y":4.25},
+ {"x":5.25, "y":4.25},
+ {"x":6.25, "y":4.25},
+ {"x":7.25, "y":4.25},
+ {"x":8.25, "y":4.25},
+ {"x":9.25, "y":4.25},
+ {"x":10.25, "y":4.25},
+ {"x":11.25, "y":4.25},
+ {"x":12.25, "y":4.25, "w":1.75},
+ {"x":14, "y":4.25},
+
+ {"x":16.25, "y":4.25},
+
+ {"x":0, "y":5.25, "w":1.5},
+ {"x":2.5, "y":5.25, "w":1.5},
+ {"x":4, "y":5.25, "w":7},
+ {"x":11, "y":5.25, "w":1.5},
+ {"x":13.5, "y":5.25, "w":1.5},
+
+ {"x":15.25, "y":5.25},
+ {"x":16.25, "y":5.25},
+ {"x":17.25, "y":5.25}
+ ]
+ }
+ }
+}
diff --git a/layouts/default/tkl_f13_iso_wkl_split_bs_rshift/layout.json b/layouts/default/tkl_f13_iso_wkl_split_bs_rshift/layout.json
new file mode 100644
index 00000000000..a07a1307e77
--- /dev/null
+++ b/layouts/default/tkl_f13_iso_wkl_split_bs_rshift/layout.json
@@ -0,0 +1,6 @@
+[{a:7},"",{x:0.25},"","","","",{x:0.25},"","","","",{x:0.25},"","","","",{x:0.25},"",{x:0.25},"","",""],
+[{y:0.25},"","","","","","","","","","","","","","","",{x:0.25},"","",""],
+[{w:1.5},"","","","","","","","","","","","","",{x:0.25,w:1.25,h:2,w2:1.5,h2:1,x2:-0.25},"",{x:0.25},"","",""],
+[{w:1.75},"","","","","","","","","","","","",""],
+[{w:1.25},"","","","","","","","","","","","",{w:1.75},"","",{x:1.25},""],
+[{w:1.5},"",{x:1,w:1.5},"",{w:7},"",{w:1.5},"",{x:1,w:1.5},"",{x:0.25},"","",""]
diff --git a/layouts/default/tkl_f13_iso_wkl_split_bs_rshift/readme.md b/layouts/default/tkl_f13_iso_wkl_split_bs_rshift/readme.md
new file mode 100644
index 00000000000..a9059abfba2
--- /dev/null
+++ b/layouts/default/tkl_f13_iso_wkl_split_bs_rshift/readme.md
@@ -0,0 +1,3 @@
+# tkl_f13_iso_wkl_split_bs_rshift
+
+ LAYOUT_tkl_f13_iso_wkl_split_bs_rshift
diff --git a/layouts/default/tkl_f13_jis/info.json b/layouts/default/tkl_f13_jis/info.json
index 97f5bd3880e..20ff38f6117 100644
--- a/layouts/default/tkl_f13_jis/info.json
+++ b/layouts/default/tkl_f13_jis/info.json
@@ -55,7 +55,6 @@
{"x": 10.5, "y": 2.25},
{"x": 11.5, "y": 2.25},
{"x": 12.5, "y": 2.25},
- {"x": 13.75, "y": 2.25, "w": 1.25, "h": 2},
{"x": 15.25, "y": 2.25},
{"x": 16.25, "y": 2.25},
{"x": 17.25, "y": 2.25},
@@ -73,6 +72,7 @@
{"x": 10.75, "y": 3.25},
{"x": 11.75, "y": 3.25},
{"x": 12.75, "y": 3.25},
+ {"x": 13.75, "y": 2.25, "w": 1.25, "h": 2},
{"x": 0, "y": 4.25, "w": 2.25},
{"x": 2.25, "y": 4.25},
diff --git a/layouts/default/tkl_iso_wkl/default_tkl_iso_wkl/keymap.c b/layouts/default/tkl_iso_wkl/default_tkl_iso_wkl/keymap.c
new file mode 100644
index 00000000000..940c968917b
--- /dev/null
+++ b/layouts/default/tkl_iso_wkl/default_tkl_iso_wkl/keymap.c
@@ -0,0 +1,32 @@
+// Copyright 2023 QMK
+// 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 │ - │ = │ Backsp│ │Ins│Hom│PgU│
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤
+ * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ │ │Del│End│PgD│
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ Ent│ └───┴───┴───┘
+ * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ # │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ ┌───┐
+ * │Shft│ \ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift │ │ ↑ │
+ * ├────┴┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─────┤ ┌───┼───┼───┐
+ * │Ctrl │ │Alt │ │ Alt│ │ Ctrl│ │ ← │ ↓ │ → │
+ * └─────┘ └─────┴───────────────────────────┴─────┘ └─────┘ └───┴───┴───┘
+ */
+ [0] = LAYOUT_tkl_iso_wkl(
+ 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_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_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, KC_UP,
+ KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ )
+};
diff --git a/layouts/default/tkl_iso_wkl/info.json b/layouts/default/tkl_iso_wkl/info.json
new file mode 100644
index 00000000000..07f3311296d
--- /dev/null
+++ b/layouts/default/tkl_iso_wkl/info.json
@@ -0,0 +1,106 @@
+{
+ "keyboard_name": "Tenkeyless ISO Windows keyless layout",
+ "url": "",
+ "maintainer": "qmk",
+ "layouts": {
+ "LAYOUT_tkl_iso_wkl": {
+ "layout": [
+ {"x":0, "y":0},
+ {"x":2, "y":0},
+ {"x":3, "y":0},
+ {"x":4, "y":0},
+ {"x":5, "y":0},
+ {"x":6.5, "y":0},
+ {"x":7.5, "y":0},
+ {"x":8.5, "y":0},
+ {"x":9.5, "y":0},
+ {"x":11, "y":0},
+ {"x":12, "y":0},
+ {"x":13, "y":0},
+ {"x":14, "y":0},
+
+ {"x":15.25, "y":0},
+ {"x":16.25, "y":0},
+ {"x":17.25, "y":0},
+
+ {"x":0, "y":1.25},
+ {"x":1, "y":1.25},
+ {"x":2, "y":1.25},
+ {"x":3, "y":1.25},
+ {"x":4, "y":1.25},
+ {"x":5, "y":1.25},
+ {"x":6, "y":1.25},
+ {"x":7, "y":1.25},
+ {"x":8, "y":1.25},
+ {"x":9, "y":1.25},
+ {"x":10, "y":1.25},
+ {"x":11, "y":1.25},
+ {"x":12, "y":1.25},
+ {"x":13, "y":1.25, "w":2},
+
+ {"x":15.25, "y":1.25},
+ {"x":16.25, "y":1.25},
+ {"x":17.25, "y":1.25},
+
+ {"x":0, "y":2.25, "w":1.5},
+ {"x":1.5, "y":2.25},
+ {"x":2.5, "y":2.25},
+ {"x":3.5, "y":2.25},
+ {"x":4.5, "y":2.25},
+ {"x":5.5, "y":2.25},
+ {"x":6.5, "y":2.25},
+ {"x":7.5, "y":2.25},
+ {"x":8.5, "y":2.25},
+ {"x":9.5, "y":2.25},
+ {"x":10.5, "y":2.25},
+ {"x":11.5, "y":2.25},
+ {"x":12.5, "y":2.25},
+
+ {"x":15.25, "y":2.25},
+ {"x":16.25, "y":2.25},
+ {"x":17.25, "y":2.25},
+
+ {"x":0, "y":3.25, "w":1.75},
+ {"x":1.75, "y":3.25},
+ {"x":2.75, "y":3.25},
+ {"x":3.75, "y":3.25},
+ {"x":4.75, "y":3.25},
+ {"x":5.75, "y":3.25},
+ {"x":6.75, "y":3.25},
+ {"x":7.75, "y":3.25},
+ {"x":8.75, "y":3.25},
+ {"x":9.75, "y":3.25},
+ {"x":10.75, "y":3.25},
+ {"x":11.75, "y":3.25},
+ {"x":12.75, "y":3.25},
+ {"x":13.75, "y":2.25, "w":1.25, "h":2},
+
+ {"x":0, "y":4.25, "w":1.25},
+ {"x":1.25, "y":4.25},
+ {"x":2.25, "y":4.25},
+ {"x":3.25, "y":4.25},
+ {"x":4.25, "y":4.25},
+ {"x":5.25, "y":4.25},
+ {"x":6.25, "y":4.25},
+ {"x":7.25, "y":4.25},
+ {"x":8.25, "y":4.25},
+ {"x":9.25, "y":4.25},
+ {"x":10.25, "y":4.25},
+ {"x":11.25, "y":4.25},
+ {"x":12.25, "y":4.25, "w":2.75},
+
+ {"x":16.25, "y":4.25},
+
+ {"x":0, "y":5.25, "w":1.5},
+ {"x":2.5, "y":5.25, "w":1.5},
+ {"x":4, "y":5.25, "w":7},
+ {"x":11, "y":5.25, "w":1.5},
+ {"x":13.5, "y":5.25, "w":1.5},
+
+ {"x":15.25, "y":5.25},
+ {"x":16.25, "y":5.25},
+ {"x":17.25, "y":5.25}
+ ]
+ }
+ }
+}
diff --git a/layouts/default/tkl_iso_wkl/layout.json b/layouts/default/tkl_iso_wkl/layout.json
new file mode 100644
index 00000000000..8d51a4064da
--- /dev/null
+++ b/layouts/default/tkl_iso_wkl/layout.json
@@ -0,0 +1,6 @@
+[{a:7},"",{x:1},"","","","",{x:0.5},"","","","",{x:0.5},"","","","",{x:0.25},"","",""],
+[{y:0.25},"","","","","","","","","","","","","",{w:2},"",{x:0.25},"","",""],
+[{w:1.5},"","","","","","","","","","","","","",{x:0.25,w:1.25,h:2,w2:1.5,h2:1,x2:-0.25},"",{x:0.25},"","",""],
+[{w:1.75},"","","","","","","","","","","","",""],
+[{w:1.25},"","","","","","","","","","","","",{w:2.75},"",{x:1.25},""],
+[{w:1.5},"",{x:1,w:1.5},"",{w:7},"",{w:1.5},"",{x:1,w:1.5},"",{x:0.25},"","",""]
diff --git a/layouts/default/tkl_iso_wkl/readme.md b/layouts/default/tkl_iso_wkl/readme.md
new file mode 100644
index 00000000000..56fe1e91473
--- /dev/null
+++ b/layouts/default/tkl_iso_wkl/readme.md
@@ -0,0 +1,3 @@
+# tkl_iso_wkl
+
+ LAYOUT_tkl_iso_wkl
diff --git a/layouts/default/tkl_iso_wkl_split_bs_rshift/default_tkl_iso_wkl_split_bs_rshift/keymap.c b/layouts/default/tkl_iso_wkl_split_bs_rshift/default_tkl_iso_wkl_split_bs_rshift/keymap.c
new file mode 100644
index 00000000000..5b9474863bc
--- /dev/null
+++ b/layouts/default/tkl_iso_wkl_split_bs_rshift/default_tkl_iso_wkl_split_bs_rshift/keymap.c
@@ -0,0 +1,32 @@
+// Copyright 2023 QMK
+// 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 │ - │ = │Bsp│Bsp│ │Ins│Hom│PgU│
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ ├───┼───┼───┤
+ * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ │ │Del│End│PgD│
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ Ent│ └───┴───┴───┘
+ * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ # │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴┬───┤ ┌───┐
+ * │Shft│ \ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift│Sft│ │ ↑ │
+ * ├────┴┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─┴───┤ ┌───┼───┼───┐
+ * │Ctrl │ │Alt │ │ Alt│ │ Ctrl│ │ ← │ ↓ │ → │
+ * └─────┘ └─────┴───────────────────────────┴─────┘ └─────┘ └───┴───┴───┘
+ */
+ [0] = LAYOUT_tkl_iso_wkl_split_bs_rshift(
+ 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_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_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, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ )
+};
diff --git a/layouts/default/tkl_iso_wkl_split_bs_rshift/info.json b/layouts/default/tkl_iso_wkl_split_bs_rshift/info.json
new file mode 100644
index 00000000000..aa0ebce31ed
--- /dev/null
+++ b/layouts/default/tkl_iso_wkl_split_bs_rshift/info.json
@@ -0,0 +1,108 @@
+{
+ "keyboard_name": "Tenkeyless ISO Windows keyless layout with split Backspace and split Right Shift",
+ "url": "",
+ "maintainer": "qmk",
+ "layouts": {
+ "LAYOUT_tkl_iso_wkl_split_bs_rshift": {
+ "layout": [
+ {"x":0, "y":0},
+ {"x":2, "y":0},
+ {"x":3, "y":0},
+ {"x":4, "y":0},
+ {"x":5, "y":0},
+ {"x":6.5, "y":0},
+ {"x":7.5, "y":0},
+ {"x":8.5, "y":0},
+ {"x":9.5, "y":0},
+ {"x":11, "y":0},
+ {"x":12, "y":0},
+ {"x":13, "y":0},
+ {"x":14, "y":0},
+
+ {"x":15.25, "y":0},
+ {"x":16.25, "y":0},
+ {"x":17.25, "y":0},
+
+ {"x":0, "y":1.25},
+ {"x":1, "y":1.25},
+ {"x":2, "y":1.25},
+ {"x":3, "y":1.25},
+ {"x":4, "y":1.25},
+ {"x":5, "y":1.25},
+ {"x":6, "y":1.25},
+ {"x":7, "y":1.25},
+ {"x":8, "y":1.25},
+ {"x":9, "y":1.25},
+ {"x":10, "y":1.25},
+ {"x":11, "y":1.25},
+ {"x":12, "y":1.25},
+ {"x":13, "y":1.25},
+ {"x":14, "y":1.25},
+
+ {"x":15.25, "y":1.25},
+ {"x":16.25, "y":1.25},
+ {"x":17.25, "y":1.25},
+
+ {"x":0, "y":2.25, "w":1.5},
+ {"x":1.5, "y":2.25},
+ {"x":2.5, "y":2.25},
+ {"x":3.5, "y":2.25},
+ {"x":4.5, "y":2.25},
+ {"x":5.5, "y":2.25},
+ {"x":6.5, "y":2.25},
+ {"x":7.5, "y":2.25},
+ {"x":8.5, "y":2.25},
+ {"x":9.5, "y":2.25},
+ {"x":10.5, "y":2.25},
+ {"x":11.5, "y":2.25},
+ {"x":12.5, "y":2.25},
+
+ {"x":15.25, "y":2.25},
+ {"x":16.25, "y":2.25},
+ {"x":17.25, "y":2.25},
+
+ {"x":0, "y":3.25, "w":1.75},
+ {"x":1.75, "y":3.25},
+ {"x":2.75, "y":3.25},
+ {"x":3.75, "y":3.25},
+ {"x":4.75, "y":3.25},
+ {"x":5.75, "y":3.25},
+ {"x":6.75, "y":3.25},
+ {"x":7.75, "y":3.25},
+ {"x":8.75, "y":3.25},
+ {"x":9.75, "y":3.25},
+ {"x":10.75, "y":3.25},
+ {"x":11.75, "y":3.25},
+ {"x":12.75, "y":3.25},
+ {"x":13.75, "y":2.25, "w":1.25, "h":2},
+
+ {"x":0, "y":4.25, "w":1.25},
+ {"x":1.25, "y":4.25},
+ {"x":2.25, "y":4.25},
+ {"x":3.25, "y":4.25},
+ {"x":4.25, "y":4.25},
+ {"x":5.25, "y":4.25},
+ {"x":6.25, "y":4.25},
+ {"x":7.25, "y":4.25},
+ {"x":8.25, "y":4.25},
+ {"x":9.25, "y":4.25},
+ {"x":10.25, "y":4.25},
+ {"x":11.25, "y":4.25},
+ {"x":12.25, "y":4.25, "w":1.75},
+ {"x":14, "y":4.25},
+
+ {"x":16.25, "y":4.25},
+
+ {"x":0, "y":5.25, "w":1.5},
+ {"x":2.5, "y":5.25, "w":1.5},
+ {"x":4, "y":5.25, "w":7},
+ {"x":11, "y":5.25, "w":1.5},
+ {"x":13.5, "y":5.25, "w":1.5},
+
+ {"x":15.25, "y":5.25},
+ {"x":16.25, "y":5.25},
+ {"x":17.25, "y":5.25}
+ ]
+ }
+ }
+}
diff --git a/layouts/default/tkl_iso_wkl_split_bs_rshift/layout.json b/layouts/default/tkl_iso_wkl_split_bs_rshift/layout.json
new file mode 100644
index 00000000000..09c79e0f4a4
--- /dev/null
+++ b/layouts/default/tkl_iso_wkl_split_bs_rshift/layout.json
@@ -0,0 +1,6 @@
+[{a:7},"",{x:1},"","","","",{x:0.5},"","","","",{x:0.5},"","","","",{x:0.25},"","",""],
+[{y:0.25},"","","","","","","","","","","","","","","",{x:0.25},"","",""],
+[{w:1.5},"","","","","","","","","","","","","",{x:0.25,w:1.25,h:2,w2:1.5,h2:1,x2:-0.25},"",{x:0.25},"","",""],
+[{w:1.75},"","","","","","","","","","","","",""],
+[{w:1.25},"","","","","","","","","","","","",{w:1.75},"","",{x:1.25},""],
+[{w:1.5},"",{x:1,w:1.5},"",{w:7},"",{w:1.5},"",{x:1,w:1.5},"",{x:0.25},"","",""]
diff --git a/layouts/default/tkl_iso_wkl_split_bs_rshift/readme.md b/layouts/default/tkl_iso_wkl_split_bs_rshift/readme.md
new file mode 100644
index 00000000000..ec820424a5b
--- /dev/null
+++ b/layouts/default/tkl_iso_wkl_split_bs_rshift/readme.md
@@ -0,0 +1,3 @@
+# tkl_iso_wkl_split_bs_rshift
+
+ LAYOUT_tkl_iso_split_bs_rshift
diff --git a/layouts/default/tkl_jis/info.json b/layouts/default/tkl_jis/info.json
index 513852193a5..e1d16e2beb7 100644
--- a/layouts/default/tkl_jis/info.json
+++ b/layouts/default/tkl_jis/info.json
@@ -54,7 +54,6 @@
{"x": 10.5, "y": 2.25},
{"x": 11.5, "y": 2.25},
{"x": 12.5, "y": 2.25},
- {"x": 13.75, "y": 2.25, "w": 1.25, "h": 2},
{"x": 15.25, "y": 2.25},
{"x": 16.25, "y": 2.25},
{"x": 17.25, "y": 2.25},
@@ -72,6 +71,7 @@
{"x": 10.75, "y": 3.25},
{"x": 11.75, "y": 3.25},
{"x": 12.75, "y": 3.25},
+ {"x": 13.75, "y": 2.25, "w": 1.25, "h": 2},
{"x": 0, "y": 4.25, "w": 2.25},
{"x": 2.25, "y": 4.25},
diff --git a/lib/python/qmk/cli/generate/compilation_database.py b/lib/python/qmk/cli/generate/compilation_database.py
index a2190fee66c..b9c716bf0c5 100755
--- a/lib/python/qmk/cli/generate/compilation_database.py
+++ b/lib/python/qmk/cli/generate/compilation_database.py
@@ -25,7 +25,6 @@ def system_libs(binary: str) -> List[Path]:
"""Find the system include directory that the given build tool uses.
"""
cli.log.debug("searching for system library directory for binary: %s", binary)
- bin_path = shutil.which(binary)
# Actually query xxxxxx-gcc to find its include paths.
if binary.endswith("gcc") or binary.endswith("g++"):
@@ -37,7 +36,31 @@ def system_libs(binary: str) -> List[Path]:
paths.append(Path(line.strip()).resolve())
return paths
- return list(Path(bin_path).resolve().parent.parent.glob("*/include")) if bin_path else []
+ return list(Path(binary).resolve().parent.parent.glob("*/include")) if binary else []
+
+
+@lru_cache(maxsize=10)
+def cpu_defines(binary: str, compiler_args: str) -> List[str]:
+ cli.log.debug("gathering definitions for compilation: %s %s", binary, compiler_args)
+ if binary.endswith("gcc") or binary.endswith("g++"):
+ invocation = [binary, '-dM', '-E']
+ if binary.endswith("gcc"):
+ invocation.extend(['-x', 'c'])
+ elif binary.endswith("g++"):
+ invocation.extend(['-x', 'c++'])
+ compiler_args = shlex.split(compiler_args)
+ invocation.extend(compiler_args)
+ invocation.append('-')
+ result = cli.run(invocation, capture_output=True, check=True, stdin=None, input='\n')
+ define_args = []
+ for line in result.stdout.splitlines():
+ line_args = line.split(' ', 2)
+ if len(line_args) == 3 and line_args[0] == '#define':
+ define_args.append(f'-D{line_args[1]}={line_args[2]}')
+ elif len(line_args) == 2 and line_args[0] == '#define':
+ define_args.append(f'-D{line_args[1]}')
+ return list(sorted(set(define_args)))
+ return []
file_re = re.compile(r'printf "Compiling: ([^"]+)')
@@ -68,9 +91,12 @@ def parse_make_n(f: Iterator[str]) -> List[Dict[str, str]]:
# we have a hit!
this_cmd = m.group(1)
args = shlex.split(this_cmd)
- for s in system_libs(args[0]):
+ binary = shutil.which(args[0])
+ compiler_args = set(filter(lambda x: x.startswith('-m') or x.startswith('-f'), args))
+ for s in system_libs(binary):
args += ['-isystem', '%s' % s]
- new_cmd = ' '.join(shlex.quote(s) for s in args if s != '-mno-thumb-interwork')
+ args.extend(cpu_defines(binary, ' '.join(shlex.quote(s) for s in compiler_args)))
+ new_cmd = ' '.join(shlex.quote(s) for s in args)
records.append({"directory": str(QMK_FIRMWARE.resolve()), "command": new_cmd, "file": this_file})
state = 'start'
diff --git a/quantum/encoder.c b/quantum/encoder.c
index 0a48ac9a07b..2ddbf3ee1e0 100644
--- a/quantum/encoder.c
+++ b/quantum/encoder.c
@@ -83,7 +83,7 @@ bool encoder_task(void) {
}
bool encoder_queue_full_advanced(encoder_events_t *events) {
- return events->head == (events->tail - 1) % MAX_QUEUED_ENCODER_EVENTS;
+ return events->tail == (events->head + 1) % MAX_QUEUED_ENCODER_EVENTS;
}
bool encoder_queue_full(void) {