diff --git a/data/constants/keycodes/keycodes_0.0.1_basic.hjson b/data/constants/keycodes/keycodes_0.0.1_basic.hjson
index 430211eccae6..66aba7b1fc10 100644
--- a/data/constants/keycodes/keycodes_0.0.1_basic.hjson
+++ b/data/constants/keycodes/keycodes_0.0.1_basic.hjson
@@ -1140,7 +1140,7 @@
"0x00AE": {
"group": "media",
"key": "KC_MEDIA_PLAY_PAUSE",
- "label": "Mute",
+ "label": "Play/Pause Track",
"aliases": [
"KC_MPLY"
]
diff --git a/docs/_sidebar.json b/docs/_sidebar.json
index a68516b5de45..95601be7ded1 100644
--- a/docs/_sidebar.json
+++ b/docs/_sidebar.json
@@ -21,7 +21,8 @@
{ "text": "Debugging QMK", "link": "/faq_debug" },
{ "text": "Keymap FAQ", "link": "/faq_keymap" },
{ "text": "Squeezing Space from AVR", "link": "/squeezing_avr" },
- { "text": "Glossary", "link": "/reference_glossary" }
+ { "text": "Glossary", "link": "/reference_glossary" },
+ { "text": "License Violations", "link": "/license_violations" }
]
},
{
diff --git a/docs/license_violations.md b/docs/license_violations.md
new file mode 100644
index 000000000000..b21bb286ac53
--- /dev/null
+++ b/docs/license_violations.md
@@ -0,0 +1,96 @@
+# License Violations
+
+QMK Firmware has seen its fair share of license violations, which hurts the community and frustrates the QMK maintainers.
+
+Typical non-compliance includes:
+
+* Not providing any source code
+* Providing "crippled" source code, such as a wired-only firmware for a wireless-capable board
+
+Boards from vendors who don't provide source code are proving to be a significant time sink as the QMK team and other support helpers volunteer their time trying to determine which board someone has before they can help -- and in these cases they can't help. Occasionally this is followed by abuse; something that QMK and its volunteers should not be subjected to, rather redirected to the vendor in question.
+
+The QMK team now actively directs support requests back to each vendor - vendors must provide their own product support for their boards. The QMK team are volunteers, the vendor must not expect the team to act as their support staff.
+
+## Offending Vendors
+
+The QMK team cannot tell you which boards you should or should not purchase, but please consider the lack of license compliance from the following vendors before making your decision. If you wish to look at the boards upstream QMK Firmware currently supports, you can search [here](https://browse.qmk.fm/).
+
+If you own a board from one of the following vendors already, consider asking them for the equivalent QMK source code if it's not already available. With enough customers demanding corresponding source code, vendors may start to change their policies.
+
+| Vendor | Reason |
+|------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| BBB Keyboard | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. |
+| Chillkey | |
+| CIDOO | Selling wired boards based on QMK without sources, just `via.json` provided. |
+| Darmoshark | Selling wired boards based on QMK without sources, just `via.json` provided. |
+| Epomaker | Lots of historical keyboards with `via.json` but no corresponding sources. Wireless code for a small handful provided, pending core cleanup for QMK upstreaming. Most other boards have source nowhere to be seen. |
+| Ergokbd (IFKB) | At least their crkbd clone ships with QMK+Vial, seemingly refuses to disclose sources despite multiple customers requesting them. |
+| iLovBee | Official 30-day copyright source code request issued Sep 11 2024 due to deception on PR, no response received. Ambiguity on PRs -- marketing says wireless, PR author said wired-only, then included wireless code anyway. Seemingly intentionally deceptive. |
+| KiiBOOM | Seems to use the same OEM as Epomaker, same problems. |
+| Luminkey | Selling tri-mode boards based on QMK without sources, just `via.json` provided. |
+| Meletrix | Selling tri-mode boards based on QMK without sources, just `via.json` provided. |
+| mmd / Smartmmd / i-game.tech | Ambiguity on PRs -- marketing says wireless, PR author said wired-only, then included wireless code anyway. Seemingly intentionally deceptive. |
+| MyKeyClub | Community-supported JRIS75, vendor was contacted by community members and refused to cooperate. |
+| owlab | Selling wired based on QMK without sources, just `via.json` provided. Ambiguous as to whether or not wireless firmware is based on QMK, given that their configuration tool looks very similar to VIA. |
+| qwertykeys | Selling wired and tri-mode boards based on QMK without sources, just `via.json` provided. |
+| Redragon | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. |
+| Royal Kludge | PRs for fake boards in order to attain VIA compatibility identified. Lots of other keyboards with `via.json` but no corresponding sources, attempted upstreaming crippled firmware without wireless. Wireless code for some provided, pending core cleanup for QMK upstreaming. PRs including different manufacturer names as well. |
+| Shenzhen Hangsheng | PR submissions with crippled firmware, debating with maintainers about wireless despite marketing material clearly stating tri-mode. |
+| Shortcut Studio | Selling tri-mode boards based on QMK without sources, just `via.json` provided. |
+| Tacworks | Selling tri-mode boards based on QMK, crippled firmware already merged into QMK without wireless without QMK team realising. |
+| TKD / Vertex | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. |
+| WOBKEY | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. |
+| Weikav | Selling tri-mode boards based on QMK without sources, just `via.json` provided. |
+| Womier | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. |
+| Wuque Studio | Selling wired and tri-mode boards based on QMK without sources, just `via.json` provided. |
+| Zuoya | Selling tri-mode boards based on QMK without sources, just `via.json` provided. |
+
+::: danger Violations
+Links are not provided above as the QMK team does not wish to inadvertently promote purchases of boards in violation of QMK's license.
+:::
+
+## Licensing
+
+QMK Firmware's license requires full disclosure of source code for any firmware which is based on QMK. This includes any of the following scenarios:
+
+* Use of public QMK Firmware, but with "closed source" privately-held board definitions
+* Vendor-customised QMK Firmware, which the vendor keeps private for building their own boards
+* Any other non-QMK firmware which includes portions of QMK Firmware, such as adaptation of `via.c` into any other non-QMK firmware, even if used as a reference when translated to another programming language.
+
+As per the GPL license requirements, vendors must provide entire source code for the as-shipped firmware.
+
+QMK has traditionally been lenient with this clause -- providing source code to the QMK community is necessary but reproducing the exact build may not be possible. QMK has required functionally-equivalent source code to be made available. In rare cases exact code may be requested; vendors must keep copies regardless.
+
+At minimum, vendors must provide the source code through some distribution mechanism. This could potentially be an clearly available downloadable copy of the code online, a fork of QMK Firmware, or even a DVD accompanying the product in the box.
+
+If sources are unable to be provided in a timely fashion, QMK may revoke the vendor's license, effectively rendering them unable to leverage QMK.
+
+Vendors choosing to keep things closed-source because of a desire to have a "competitive edge" compared to other vendors is unacceptable to both QMK and the community, and is a breach of the QMK license. There's no reason to do so; any new or interesting vendor-specific feature will be quickly replicated by other vendors or the community anyway.
+
+## QMK PR Considerations
+
+Vendors who submit PRs to QMK Firmware whilst not providing full sources for all of their license-violating boards will be put on hold until source code for all violating boards is provided. Intentional deception may result in boards being removed from QMK and all future PRs for that manufacturer being denied outright.
+
+Submitting crippled source code in order to attain a merge into QMK Firmware to pave the way for VIA support is unacceptable. This includes submitting a wired-only firmware for a wireless-capable board, or any other PR which does not include key features as-advertised.
+
+Reusing the `VID` and `PID` for multiple boards (such as for two variants, wired and wireless) is an unacceptable scenario as this creates confusion for support. Many customers have flashed boards with the wrong firmware, which could have been avoided if vendors were obvious about their board identification mechanisms.
+
+If there is sufficient ambiguity about a board, supporting evidence will need to be presented to the QMK team. This may include impartial third parties who can demonstrate a board's existence and can confirm its feature set, such as well-known content producers; popular review sites or notable video creators may be leveraged. If such evidence is unavailable, as a last resort the vendor may be required to ship a fully functional board in full retail packaging to QMK maintainers for verification. Engineering samples will not be accepted, as one-off boards have been deceptively used in the past.
+
+PRs submitted to upstream QMK should not expect an instant merge just because source code has been provided -- code from OEMs has historically been of a quality lower than QMK standards, so as per the [PR checklist](https://docs.qmk.fm/pr_checklist) submitters should make the changes as small as possible and be prepared to change their implementation.
+
+## Detection
+
+If the QMK team identifies or is informed of a license violation from a vendor:
+
+* Any current and future PRs for that vendor will be indefinitely put on hold, preventing merge into QMK Firmware, thus preventing any out-of-the-box VIA support
+* Any existing keyboards from the vendor may be removed from QMK Firmware
+* Vendors will be added to the _offending vendors_ list above
+
+Repeated violations may result in that vendor being disallowed from contributing the QMK in its entirety. In the worst case, the QMK team may choose to revoke a vendor's license to use QMK Firmware outright.
+
+## Remediation
+
+Vendors must provide fully-featured source code for each of their identified violations, matching the feature capabilities of their as-shipped products. This will usually be in their own fork of QMK Firmware while awaiting a merge into upstream.
+
+Once all identified violations have been remediated, current and future PRs will no longer be on hold and the vendor will be removed from the offending vendors list above.
diff --git a/keyboards/cipulot/ec_65x/config.h b/keyboards/cipulot/ec_65x/config.h
new file mode 100644
index 000000000000..142f7a140ec2
--- /dev/null
+++ b/keyboards/cipulot/ec_65x/config.h
@@ -0,0 +1,69 @@
+/* Copyright 2024 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 16
+
+#define MATRIX_ROW_PINS \
+ { A8, A15, B13, B8, B9}
+
+#define AMUX_COUNT 1
+#define AMUX_MAX_COLS_COUNT 16
+
+#define AMUX_EN_PINS \
+ { B5 }
+
+#define AMUX_SEL_PINS \
+ { B6, B7, B4, B3 }
+
+#define AMUX_COL_CHANNELS_SIZES \
+ { 16 }
+
+#define AMUX_0_COL_CHANNELS \
+ { 7, 6, 5, 4, 3, 2, 1, 0, 8, 15, 14, 12, 11, 13, 9, 10}
+
+#define AMUX_COL_CHANNELS AMUX_0_COL_CHANNELS
+
+#define DISCHARGE_PIN A2
+#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 EECONFIG_KB_DATA_SIZE 169
+
+// 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
diff --git a/keyboards/cipulot/ec_65x/halconf.h b/keyboards/cipulot/ec_65x/halconf.h
new file mode 100644
index 000000000000..fb0f77d82f93
--- /dev/null
+++ b/keyboards/cipulot/ec_65x/halconf.h
@@ -0,0 +1,23 @@
+/* Copyright 2024 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_65x/keyboard.json b/keyboards/cipulot/ec_65x/keyboard.json
new file mode 100644
index 000000000000..2baf3ea5f017
--- /dev/null
+++ b/keyboards/cipulot/ec_65x/keyboard.json
@@ -0,0 +1,420 @@
+{
+ "manufacturer": "Cipulot",
+ "keyboard_name": "EC 65X",
+ "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": 19
+ },
+ "usb": {
+ "device_version": "0.0.1",
+ "pid": "0x6BD1",
+ "shared_endpoint": {
+ "keyboard": true
+ },
+ "vid": "0x6369"
+ },
+ "ws2812": {
+ "driver": "pwm",
+ "pin": "B15"
+ },
+ "layouts": {
+ "LAYOUT_65_ansi_blocker": {
+ "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, 15], "x": 15, "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, 15], "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},
+ {"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, 15], "x": 15, "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, 14], "x": 14, "y": 3},
+ {"matrix": [3, 15], "x": 15, "y": 3},
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4, "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": 13, "y": 4},
+ {"matrix": [4, 14], "x": 14, "y": 4},
+ {"matrix": [4, 15], "x": 15, "y": 4}
+ ]
+ },
+ "LAYOUT_65_ansi_blocker_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, 13], "x": 13, "y": 0, "w": 2},
+ {"matrix": [0, 15], "x": 15, "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, 15], "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},
+ {"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, 15], "x": 15, "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, 14], "x": 14, "y": 3},
+ {"matrix": [3, 15], "x": 15, "y": 3},
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"matrix": [4, 1], "x": 1.5, "y": 4},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
+ {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
+ {"matrix": [4, 12], "x": 13, "y": 4},
+ {"matrix": [4, 14], "x": 14, "y": 4},
+ {"matrix": [4, 15], "x": 15, "y": 4}
+ ]
+ },
+ "LAYOUT_65_iso_blocker": {
+ "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, 15], "x": 15, "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, 14], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
+ {"matrix": [1, 15], "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},
+ {"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, 15], "x": 15, "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, 14], "x": 14, "y": 3},
+ {"matrix": [3, 15], "x": 15, "y": 3},
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4, "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": 13, "y": 4},
+ {"matrix": [4, 14], "x": 14, "y": 4},
+ {"matrix": [4, 15], "x": 15, "y": 4}
+ ]
+ },
+ "LAYOUT_65_iso_blocker_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, 13], "x": 13, "y": 0, "w": 2},
+ {"matrix": [0, 15], "x": 15, "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, 14], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
+ {"matrix": [1, 15], "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},
+ {"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, 15], "x": 15, "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, 14], "x": 14, "y": 3},
+ {"matrix": [3, 15], "x": 15, "y": 3},
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"matrix": [4, 1], "x": 1.5, "y": 4},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
+ {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
+ {"matrix": [4, 12], "x": 13, "y": 4},
+ {"matrix": [4, 14], "x": 14, "y": 4},
+ {"matrix": [4, 15], "x": 15, "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": [0, 15], "x": 15, "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": [1, 15], "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},
+ {"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": [2, 15], "x": 15, "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, 14], "x": 14, "y": 3},
+ {"matrix": [3, 15], "x": 15, "y": 3},
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25},
+ {"matrix": [4, 4], "x": 3.75, "y": 4, "w": 2.25},
+ {"matrix": [4, 6], "x": 6, "y": 4, "w": 1.25},
+ {"matrix": [4, 8], "x": 7.25, "y": 4, "w": 2.75},
+ {"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": 13, "y": 4},
+ {"matrix": [4, 14], "x": 14, "y": 4},
+ {"matrix": [4, 15], "x": 15, "y": 4}
+ ]
+ }
+ }
+}
diff --git a/keyboards/cipulot/ec_65x/keymaps/65_ansi_blocker/keymap.c b/keyboards/cipulot/ec_65x/keymaps/65_ansi_blocker/keymap.c
new file mode 100644
index 000000000000..9af029b2e33b
--- /dev/null
+++ b/keyboards/cipulot/ec_65x/keymaps/65_ansi_blocker/keymap.c
@@ -0,0 +1,42 @@
+/* Copyright 2024 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_65_ansi_blocker(
+ 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_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_ENTER, KC_PGDN,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, MO(1),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT),
+
+ [1] = LAYOUT_65_ansi_blocker(
+ _______, 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_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, MO(2), _______, _______, _______),
+
+ [2] = LAYOUT_65_ansi_blocker(
+ QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______)
+ // clang-format on
+};
diff --git a/keyboards/cipulot/ec_65x/keymaps/65_ansi_blocker_tsangan/keymap.c b/keyboards/cipulot/ec_65x/keymaps/65_ansi_blocker_tsangan/keymap.c
new file mode 100644
index 000000000000..69f17a0ae47c
--- /dev/null
+++ b/keyboards/cipulot/ec_65x/keymaps/65_ansi_blocker_tsangan/keymap.c
@@ -0,0 +1,42 @@
+/* Copyright 2024 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_65_ansi_blocker_tsangan(
+ 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_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_ENTER, KC_PGDN,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, MO(1),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT),
+
+ [1] = LAYOUT_65_ansi_blocker_tsangan(
+ _______, 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_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, MO(2), _______, _______, _______),
+
+ [2] = LAYOUT_65_ansi_blocker_tsangan(
+ QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______)
+ // clang-format on
+};
diff --git a/keyboards/cipulot/ec_65x/keymaps/65_iso_blocker/keymap.c b/keyboards/cipulot/ec_65x/keymaps/65_iso_blocker/keymap.c
new file mode 100644
index 000000000000..0d695c2978c4
--- /dev/null
+++ b/keyboards/cipulot/ec_65x/keymaps/65_iso_blocker/keymap.c
@@ -0,0 +1,42 @@
+/* Copyright 2024 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_65_iso_blocker(
+ 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_ENTER, KC_PGUP,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_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, MO(1),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT),
+
+ [1] = LAYOUT_65_iso_blocker(
+ _______, 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_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, MO(2), _______, _______, _______),
+
+ [2] = LAYOUT_65_iso_blocker(
+ QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______)
+ // clang-format on
+};
diff --git a/keyboards/cipulot/ec_65x/keymaps/65_iso_blocker_tsangan/keymap.c b/keyboards/cipulot/ec_65x/keymaps/65_iso_blocker_tsangan/keymap.c
new file mode 100644
index 000000000000..867167cdea6c
--- /dev/null
+++ b/keyboards/cipulot/ec_65x/keymaps/65_iso_blocker_tsangan/keymap.c
@@ -0,0 +1,42 @@
+/* Copyright 2024 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_65_iso_blocker_tsangan(
+ 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_ENTER, KC_PGUP,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_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, MO(1),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT),
+
+ [1] = LAYOUT_65_iso_blocker_tsangan(
+ _______, 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_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, MO(2), _______, _______, _______),
+
+ [2] = LAYOUT_65_iso_blocker_tsangan(
+ QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______)
+ // clang-format on
+};
diff --git a/keyboards/cipulot/ec_65x/keymaps/default/keymap.c b/keyboards/cipulot/ec_65x/keymaps/default/keymap.c
new file mode 100644
index 000000000000..e7fb368b0c7d
--- /dev/null
+++ b/keyboards/cipulot/ec_65x/keymaps/default/keymap.c
@@ -0,0 +1,42 @@
+/* Copyright 2024 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(
+ QK_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_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_BSLS, KC_ENTER, KC_PGUP,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENTER, 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, MO(1),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT),
+
+ [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_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, MO(2), _______, _______, _______),
+
+ [2] = LAYOUT_all(
+ QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______)
+ // clang-format on
+};
diff --git a/keyboards/cipulot/ec_65x/mcuconf.h b/keyboards/cipulot/ec_65x/mcuconf.h
new file mode 100644
index 000000000000..88185d8e9dac
--- /dev/null
+++ b/keyboards/cipulot/ec_65x/mcuconf.h
@@ -0,0 +1,25 @@
+/* Copyright 2024 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_TIM1
+#define STM32_PWM_USE_TIM1 TRUE
diff --git a/keyboards/cipulot/ec_65x/post_rules.mk b/keyboards/cipulot/ec_65x/post_rules.mk
new file mode 100644
index 000000000000..5dba48cc5fd6
--- /dev/null
+++ b/keyboards/cipulot/ec_65x/post_rules.mk
@@ -0,0 +1 @@
+include keyboards/cipulot/common/common_cipulot.mk
diff --git a/keyboards/cipulot/ec_65x/readme.md b/keyboards/cipulot/ec_65x/readme.md
new file mode 100644
index 000000000000..786d2b450424
--- /dev/null
+++ b/keyboards/cipulot/ec_65x/readme.md
@@ -0,0 +1,26 @@
+# EC 65X
+
+![EC 65X PCB](https://i.imgur.com/8B86zsO.png)
+
+Universal 65% Electrostatic Capacitive PCB, with multi-layout support.
+
+* Keyboard Maintainer: [cipulot](https://github.com/cipulot)
+* Hardware Supported: EC 65X
+* Hardware Availability: TBD
+
+Make example for this keyboard (after setting up your build environment):
+
+ make cipulot/ec_66x:default
+
+Flashing example for this keyboard:
+
+ make cipulot/ec_66x: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 button**: Long press the button on the back of the PCB
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
diff --git a/keyboards/cipulot/ec_65x/rules.mk b/keyboards/cipulot/ec_65x/rules.mk
new file mode 100644
index 000000000000..3aa0e2bf0615
--- /dev/null
+++ b/keyboards/cipulot/ec_65x/rules.mk
@@ -0,0 +1 @@
+OPT = 2
diff --git a/keyboards/cipulot/ec_tkl_x/config.h b/keyboards/cipulot/ec_tkl_x/config.h
new file mode 100644
index 000000000000..04d19a5f54ef
--- /dev/null
+++ b/keyboards/cipulot/ec_tkl_x/config.h
@@ -0,0 +1,68 @@
+/* Copyright 2024 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 UNUSED_POSITIONS_LIST { {0, 13}, {3, 14}, {3, 15}, {3, 16}, {3, 17}, {4, 15}, {4, 17}, {5, 3}, {5, 5}, {5, 7}, {5, 10}, {5, 15} }
+
+#define MATRIX_ROW_PINS {A15, B5, B12, B10, B6, B7}
+
+#define AMUX_COUNT 2
+#define AMUX_MAX_COLS_COUNT 15
+
+#define AMUX_EN_PINS {B13, A10}
+
+#define AMUX_SEL_PINS {A8, A9, B14, B15}
+
+#define AMUX_COL_CHANNELS_SIZES {15, 3}
+
+#define AMUX_0_COL_CHANNELS {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}
+
+#define AMUX_1_COL_CHANNELS {3, 0, 1}
+
+#define AMUX_COL_CHANNELS AMUX_0_COL_CHANNELS, AMUX_1_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 225
+
+// 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_x/halconf.h b/keyboards/cipulot/ec_tkl_x/halconf.h
new file mode 100644
index 000000000000..fb0f77d82f93
--- /dev/null
+++ b/keyboards/cipulot/ec_tkl_x/halconf.h
@@ -0,0 +1,23 @@
+/* Copyright 2024 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_x/keyboard.json b/keyboards/cipulot/ec_tkl_x/keyboard.json
new file mode 100644
index 000000000000..9149fb1d3bce
--- /dev/null
+++ b/keyboards/cipulot/ec_tkl_x/keyboard.json
@@ -0,0 +1,714 @@
+{
+ "manufacturer": "Cipulot",
+ "keyboard_name": "EC TKL X",
+ "maintainer": "Cipulot",
+ "bootloader": "stm32-dfu",
+ "build": {
+ "lto": true
+ },
+ "diode_direction": "COL2ROW",
+ "eeprom": {
+ "wear_leveling": {
+ "backing_size": 8192
+ }
+ },
+ "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": "0x6BC8",
+ "shared_endpoint": {
+ "keyboard": true
+ },
+ "vid": "0x6369"
+ },
+ "ws2812": {
+ "driver": "pwm",
+ "pin": "B4"
+ },
+ "layouts": {
+ "LAYOUT_all": {
+ "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, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15.25, "y": 0},
+ {"matrix": [0, 16], "x": 16.25, "y": 0},
+ {"matrix": [0, 17], "x": 17.25, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.25},
+ {"matrix": [1, 3], "x": 3, "y": 1.25},
+ {"matrix": [1, 4], "x": 4, "y": 1.25},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [1, 6], "x": 6, "y": 1.25},
+ {"matrix": [1, 7], "x": 7, "y": 1.25},
+ {"matrix": [1, 8], "x": 8, "y": 1.25},
+ {"matrix": [1, 9], "x": 9, "y": 1.25},
+ {"matrix": [1, 10], "x": 10, "y": 1.25},
+ {"matrix": [1, 11], "x": 11, "y": 1.25},
+ {"matrix": [1, 12], "x": 12, "y": 1.25},
+ {"matrix": [1, 13], "x": 13, "y": 1.25},
+ {"matrix": [1, 14], "x": 14, "y": 1.25},
+ {"matrix": [1, 15], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 16], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 17], "x": 17.25, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2.25},
+ {"matrix": [2, 2], "x": 2.5, "y": 2.25},
+ {"matrix": [2, 3], "x": 3.5, "y": 2.25},
+ {"matrix": [2, 4], "x": 4.5, "y": 2.25},
+ {"matrix": [2, 5], "x": 5.5, "y": 2.25},
+ {"matrix": [2, 6], "x": 6.5, "y": 2.25},
+ {"matrix": [2, 7], "x": 7.5, "y": 2.25},
+ {"matrix": [2, 8], "x": 8.5, "y": 2.25},
+ {"matrix": [2, 9], "x": 9.5, "y": 2.25},
+ {"matrix": [2, 10], "x": 10.5, "y": 2.25},
+ {"matrix": [2, 11], "x": 11.5, "y": 2.25},
+ {"matrix": [2, 12], "x": 12.5, "y": 2.25},
+ {"matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 0.75},
+ {"matrix": [2, 14], "x": 14.25, "y": 2.25, "w": 0.75},
+ {"matrix": [2, 15], "x": 15.25, "y": 2.25},
+ {"matrix": [2, 16], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 17], "x": 17.25, "y": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3.25},
+ {"matrix": [3, 2], "x": 2.75, "y": 3.25},
+ {"matrix": [3, 3], "x": 3.75, "y": 3.25},
+ {"matrix": [3, 4], "x": 4.75, "y": 3.25},
+ {"matrix": [3, 5], "x": 5.75, "y": 3.25},
+ {"matrix": [3, 6], "x": 6.75, "y": 3.25},
+ {"matrix": [3, 7], "x": 7.75, "y": 3.25},
+ {"matrix": [3, 8], "x": 8.75, "y": 3.25},
+ {"matrix": [3, 9], "x": 9.75, "y": 3.25},
+ {"matrix": [3, 10], "x": 10.75, "y": 3.25},
+ {"matrix": [3, 11], "x": 11.75, "y": 3.25},
+ {"matrix": [3, 12], "x": 12.75, "y": 3.25},
+ {"matrix": [3, 13], "x": 13.75, "y": 3.25, "w": 1.25},
+ {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"matrix": [4, 7], "x": 7.25, "y": 4.25},
+ {"matrix": [4, 8], "x": 8.25, "y": 4.25},
+ {"matrix": [4, 9], "x": 9.25, "y": 4.25},
+ {"matrix": [4, 10], "x": 10.25, "y": 4.25},
+ {"matrix": [4, 11], "x": 11.25, "y": 4.25},
+ {"matrix": [4, 12], "x": 12.25, "y": 4.25},
+ {"matrix": [4, 13], "x": 13.25, "y": 4.25, "w": 0.75},
+ {"matrix": [4, 14], "x": 14, "y": 4.25},
+ {"matrix": [4, 16], "x": 16.25, "y": 4.25},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 1], "x": 1.5, "y": 5.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 4], "x": 4, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 6], "x": 5.5, "y": 5.25, "w": 2.5},
+ {"matrix": [5, 8], "x": 8, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 9], "x": 9.5, "y": 5.25, "w": 1.5},
+ {"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, 16], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 17], "x": 17.25, "y": 5.25}
+ ]
+ },
+ "LAYOUT_tkl_ansi_tsangan": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6.5, "y": 0},
+ {"matrix": [0, 7], "x": 7.5, "y": 0},
+ {"matrix": [0, 8], "x": 8.5, "y": 0},
+ {"matrix": [0, 9], "x": 9.5, "y": 0},
+ {"matrix": [0, 10], "x": 11, "y": 0},
+ {"matrix": [0, 11], "x": 12, "y": 0},
+ {"matrix": [0, 12], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15.25, "y": 0},
+ {"matrix": [0, 16], "x": 16.25, "y": 0},
+ {"matrix": [0, 17], "x": 17.25, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.25},
+ {"matrix": [1, 3], "x": 3, "y": 1.25},
+ {"matrix": [1, 4], "x": 4, "y": 1.25},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [1, 6], "x": 6, "y": 1.25},
+ {"matrix": [1, 7], "x": 7, "y": 1.25},
+ {"matrix": [1, 8], "x": 8, "y": 1.25},
+ {"matrix": [1, 9], "x": 9, "y": 1.25},
+ {"matrix": [1, 10], "x": 10, "y": 1.25},
+ {"matrix": [1, 11], "x": 11, "y": 1.25},
+ {"matrix": [1, 12], "x": 12, "y": 1.25},
+ {"matrix": [1, 14], "x": 13, "y": 1.25, "w": 2},
+ {"matrix": [1, 15], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 16], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 17], "x": 17.25, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2.25},
+ {"matrix": [2, 2], "x": 2.5, "y": 2.25},
+ {"matrix": [2, 3], "x": 3.5, "y": 2.25},
+ {"matrix": [2, 4], "x": 4.5, "y": 2.25},
+ {"matrix": [2, 5], "x": 5.5, "y": 2.25},
+ {"matrix": [2, 6], "x": 6.5, "y": 2.25},
+ {"matrix": [2, 7], "x": 7.5, "y": 2.25},
+ {"matrix": [2, 8], "x": 8.5, "y": 2.25},
+ {"matrix": [2, 9], "x": 9.5, "y": 2.25},
+ {"matrix": [2, 10], "x": 10.5, "y": 2.25},
+ {"matrix": [2, 11], "x": 11.5, "y": 2.25},
+ {"matrix": [2, 12], "x": 12.5, "y": 2.25},
+ {"matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 15], "x": 15.25, "y": 2.25},
+ {"matrix": [2, 16], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 17], "x": 17.25, "y": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3.25},
+ {"matrix": [3, 2], "x": 2.75, "y": 3.25},
+ {"matrix": [3, 3], "x": 3.75, "y": 3.25},
+ {"matrix": [3, 4], "x": 4.75, "y": 3.25},
+ {"matrix": [3, 5], "x": 5.75, "y": 3.25},
+ {"matrix": [3, 6], "x": 6.75, "y": 3.25},
+ {"matrix": [3, 7], "x": 7.75, "y": 3.25},
+ {"matrix": [3, 8], "x": 8.75, "y": 3.25},
+ {"matrix": [3, 9], "x": 9.75, "y": 3.25},
+ {"matrix": [3, 10], "x": 10.75, "y": 3.25},
+ {"matrix": [3, 11], "x": 11.75, "y": 3.25},
+ {"matrix": [3, 13], "x": 12.75, "y": 3.25, "w": 2.25},
+ {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"matrix": [4, 7], "x": 7.25, "y": 4.25},
+ {"matrix": [4, 8], "x": 8.25, "y": 4.25},
+ {"matrix": [4, 9], "x": 9.25, "y": 4.25},
+ {"matrix": [4, 10], "x": 10.25, "y": 4.25},
+ {"matrix": [4, 11], "x": 11.25, "y": 4.25},
+ {"matrix": [4, 13], "x": 12.25, "y": 4.25, "w": 2.75},
+ {"matrix": [4, 16], "x": 16.25, "y": 4.25},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 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, 16], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 17], "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, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15.25, "y": 0},
+ {"matrix": [0, 16], "x": 16.25, "y": 0},
+ {"matrix": [0, 17], "x": 17.25, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.25},
+ {"matrix": [1, 3], "x": 3, "y": 1.25},
+ {"matrix": [1, 4], "x": 4, "y": 1.25},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [1, 6], "x": 6, "y": 1.25},
+ {"matrix": [1, 7], "x": 7, "y": 1.25},
+ {"matrix": [1, 8], "x": 8, "y": 1.25},
+ {"matrix": [1, 9], "x": 9, "y": 1.25},
+ {"matrix": [1, 10], "x": 10, "y": 1.25},
+ {"matrix": [1, 11], "x": 11, "y": 1.25},
+ {"matrix": [1, 12], "x": 12, "y": 1.25},
+ {"matrix": [1, 14], "x": 13, "y": 1.25, "w": 2},
+ {"matrix": [1, 15], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 16], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 17], "x": 17.25, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2.25},
+ {"matrix": [2, 2], "x": 2.5, "y": 2.25},
+ {"matrix": [2, 3], "x": 3.5, "y": 2.25},
+ {"matrix": [2, 4], "x": 4.5, "y": 2.25},
+ {"matrix": [2, 5], "x": 5.5, "y": 2.25},
+ {"matrix": [2, 6], "x": 6.5, "y": 2.25},
+ {"matrix": [2, 7], "x": 7.5, "y": 2.25},
+ {"matrix": [2, 8], "x": 8.5, "y": 2.25},
+ {"matrix": [2, 9], "x": 9.5, "y": 2.25},
+ {"matrix": [2, 10], "x": 10.5, "y": 2.25},
+ {"matrix": [2, 11], "x": 11.5, "y": 2.25},
+ {"matrix": [2, 12], "x": 12.5, "y": 2.25},
+ {"matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 15], "x": 15.25, "y": 2.25},
+ {"matrix": [2, 16], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 17], "x": 17.25, "y": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3.25},
+ {"matrix": [3, 2], "x": 2.75, "y": 3.25},
+ {"matrix": [3, 3], "x": 3.75, "y": 3.25},
+ {"matrix": [3, 4], "x": 4.75, "y": 3.25},
+ {"matrix": [3, 5], "x": 5.75, "y": 3.25},
+ {"matrix": [3, 6], "x": 6.75, "y": 3.25},
+ {"matrix": [3, 7], "x": 7.75, "y": 3.25},
+ {"matrix": [3, 8], "x": 8.75, "y": 3.25},
+ {"matrix": [3, 9], "x": 9.75, "y": 3.25},
+ {"matrix": [3, 10], "x": 10.75, "y": 3.25},
+ {"matrix": [3, 11], "x": 11.75, "y": 3.25},
+ {"matrix": [3, 13], "x": 12.75, "y": 3.25, "w": 2.25},
+ {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"matrix": [4, 7], "x": 7.25, "y": 4.25},
+ {"matrix": [4, 8], "x": 8.25, "y": 4.25},
+ {"matrix": [4, 9], "x": 9.25, "y": 4.25},
+ {"matrix": [4, 10], "x": 10.25, "y": 4.25},
+ {"matrix": [4, 11], "x": 11.25, "y": 4.25},
+ {"matrix": [4, 13], "x": 12.25, "y": 4.25, "w": 2.75},
+ {"matrix": [4, 16], "x": 16.25, "y": 4.25},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 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, 16], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 17], "x": 17.25, "y": 5.25}
+ ]
+ },
+ "LAYOUT_tkl_f13_iso_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, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15.25, "y": 0},
+ {"matrix": [0, 16], "x": 16.25, "y": 0},
+ {"matrix": [0, 17], "x": 17.25, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.25},
+ {"matrix": [1, 3], "x": 3, "y": 1.25},
+ {"matrix": [1, 4], "x": 4, "y": 1.25},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [1, 6], "x": 6, "y": 1.25},
+ {"matrix": [1, 7], "x": 7, "y": 1.25},
+ {"matrix": [1, 8], "x": 8, "y": 1.25},
+ {"matrix": [1, 9], "x": 9, "y": 1.25},
+ {"matrix": [1, 10], "x": 10, "y": 1.25},
+ {"matrix": [1, 11], "x": 11, "y": 1.25},
+ {"matrix": [1, 12], "x": 12, "y": 1.25},
+ {"matrix": [1, 14], "x": 13, "y": 1.25, "w": 2},
+ {"matrix": [1, 15], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 16], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 17], "x": 17.25, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 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, 14], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2},
+ {"matrix": [2, 15], "x": 15.25, "y": 2.25},
+ {"matrix": [2, 16], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 17], "x": 17.25, "y": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3.25},
+ {"matrix": [3, 2], "x": 2.75, "y": 3.25},
+ {"matrix": [3, 3], "x": 3.75, "y": 3.25},
+ {"matrix": [3, 4], "x": 4.75, "y": 3.25},
+ {"matrix": [3, 5], "x": 5.75, "y": 3.25},
+ {"matrix": [3, 6], "x": 6.75, "y": 3.25},
+ {"matrix": [3, 7], "x": 7.75, "y": 3.25},
+ {"matrix": [3, 8], "x": 8.75, "y": 3.25},
+ {"matrix": [3, 9], "x": 9.75, "y": 3.25},
+ {"matrix": [3, 10], "x": 10.75, "y": 3.25},
+ {"matrix": [3, 11], "x": 11.75, "y": 3.25},
+ {"matrix": [3, 12], "x": 12.75, "y": 3.25},
+ {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"matrix": [4, 7], "x": 7.25, "y": 4.25},
+ {"matrix": [4, 8], "x": 8.25, "y": 4.25},
+ {"matrix": [4, 9], "x": 9.25, "y": 4.25},
+ {"matrix": [4, 10], "x": 10.25, "y": 4.25},
+ {"matrix": [4, 11], "x": 11.25, "y": 4.25},
+ {"matrix": [4, 13], "x": 12.25, "y": 4.25, "w": 2.75},
+ {"matrix": [4, 16], "x": 16.25, "y": 4.25},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 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, 16], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 17], "x": 17.25, "y": 5.25}
+ ]
+ },
+ "LAYOUT_tkl_f13_jis": {
+ "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, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15.25, "y": 0},
+ {"matrix": [0, 16], "x": 16.25, "y": 0},
+ {"matrix": [0, 17], "x": 17.25, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.25},
+ {"matrix": [1, 3], "x": 3, "y": 1.25},
+ {"matrix": [1, 4], "x": 4, "y": 1.25},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [1, 6], "x": 6, "y": 1.25},
+ {"matrix": [1, 7], "x": 7, "y": 1.25},
+ {"matrix": [1, 8], "x": 8, "y": 1.25},
+ {"matrix": [1, 9], "x": 9, "y": 1.25},
+ {"matrix": [1, 10], "x": 10, "y": 1.25},
+ {"matrix": [1, 11], "x": 11, "y": 1.25},
+ {"matrix": [1, 12], "x": 12, "y": 1.25},
+ {"matrix": [1, 13], "x": 13, "y": 1.25},
+ {"matrix": [1, 14], "x": 14, "y": 1.25},
+ {"matrix": [1, 15], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 16], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 17], "x": 17.25, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2.25},
+ {"matrix": [2, 2], "x": 2.5, "y": 2.25},
+ {"matrix": [2, 3], "x": 3.5, "y": 2.25},
+ {"matrix": [2, 4], "x": 4.5, "y": 2.25},
+ {"matrix": [2, 5], "x": 5.5, "y": 2.25},
+ {"matrix": [2, 6], "x": 6.5, "y": 2.25},
+ {"matrix": [2, 7], "x": 7.5, "y": 2.25},
+ {"matrix": [2, 8], "x": 8.5, "y": 2.25},
+ {"matrix": [2, 9], "x": 9.5, "y": 2.25},
+ {"matrix": [2, 10], "x": 10.5, "y": 2.25},
+ {"matrix": [2, 11], "x": 11.5, "y": 2.25},
+ {"matrix": [2, 12], "x": 12.5, "y": 2.25},
+ {"matrix": [2, 14], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2},
+ {"matrix": [2, 15], "x": 15.25, "y": 2.25},
+ {"matrix": [2, 16], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 17], "x": 17.25, "y": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3.25},
+ {"matrix": [3, 2], "x": 2.75, "y": 3.25},
+ {"matrix": [3, 3], "x": 3.75, "y": 3.25},
+ {"matrix": [3, 4], "x": 4.75, "y": 3.25},
+ {"matrix": [3, 5], "x": 5.75, "y": 3.25},
+ {"matrix": [3, 6], "x": 6.75, "y": 3.25},
+ {"matrix": [3, 7], "x": 7.75, "y": 3.25},
+ {"matrix": [3, 8], "x": 8.75, "y": 3.25},
+ {"matrix": [3, 9], "x": 9.75, "y": 3.25},
+ {"matrix": [3, 10], "x": 10.75, "y": 3.25},
+ {"matrix": [3, 11], "x": 11.75, "y": 3.25},
+ {"matrix": [3, 12], "x": 12.75, "y": 3.25},
+ {"matrix": [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},
+ {"matrix": [4, 13], "x": 13.25, "y": 4.25, "w": 1.75},
+ {"matrix": [4, 16], "x": 16.25, "y": 4.25},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 1], "x": 1.5, "y": 5.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 4], "x": 4, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 6], "x": 5.5, "y": 5.25, "w": 2.5},
+ {"matrix": [5, 8], "x": 8, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 9], "x": 9.5, "y": 5.25, "w": 1.5},
+ {"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, 16], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 17], "x": 17.25, "y": 5.25}
+ ]
+ },
+ "LAYOUT_tkl_iso_tsangan": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6.5, "y": 0},
+ {"matrix": [0, 7], "x": 7.5, "y": 0},
+ {"matrix": [0, 8], "x": 8.5, "y": 0},
+ {"matrix": [0, 9], "x": 9.5, "y": 0},
+ {"matrix": [0, 10], "x": 11, "y": 0},
+ {"matrix": [0, 11], "x": 12, "y": 0},
+ {"matrix": [0, 12], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15.25, "y": 0},
+ {"matrix": [0, 16], "x": 16.25, "y": 0},
+ {"matrix": [0, 17], "x": 17.25, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.25},
+ {"matrix": [1, 3], "x": 3, "y": 1.25},
+ {"matrix": [1, 4], "x": 4, "y": 1.25},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [1, 6], "x": 6, "y": 1.25},
+ {"matrix": [1, 7], "x": 7, "y": 1.25},
+ {"matrix": [1, 8], "x": 8, "y": 1.25},
+ {"matrix": [1, 9], "x": 9, "y": 1.25},
+ {"matrix": [1, 10], "x": 10, "y": 1.25},
+ {"matrix": [1, 11], "x": 11, "y": 1.25},
+ {"matrix": [1, 12], "x": 12, "y": 1.25},
+ {"matrix": [1, 14], "x": 13, "y": 1.25, "w": 2},
+ {"matrix": [1, 15], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 16], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 17], "x": 17.25, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 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, 14], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2},
+ {"matrix": [2, 15], "x": 15.25, "y": 2.25},
+ {"matrix": [2, 16], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 17], "x": 17.25, "y": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3.25},
+ {"matrix": [3, 2], "x": 2.75, "y": 3.25},
+ {"matrix": [3, 3], "x": 3.75, "y": 3.25},
+ {"matrix": [3, 4], "x": 4.75, "y": 3.25},
+ {"matrix": [3, 5], "x": 5.75, "y": 3.25},
+ {"matrix": [3, 6], "x": 6.75, "y": 3.25},
+ {"matrix": [3, 7], "x": 7.75, "y": 3.25},
+ {"matrix": [3, 8], "x": 8.75, "y": 3.25},
+ {"matrix": [3, 9], "x": 9.75, "y": 3.25},
+ {"matrix": [3, 10], "x": 10.75, "y": 3.25},
+ {"matrix": [3, 11], "x": 11.75, "y": 3.25},
+ {"matrix": [3, 12], "x": 12.75, "y": 3.25},
+ {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"matrix": [4, 7], "x": 7.25, "y": 4.25},
+ {"matrix": [4, 8], "x": 8.25, "y": 4.25},
+ {"matrix": [4, 9], "x": 9.25, "y": 4.25},
+ {"matrix": [4, 10], "x": 10.25, "y": 4.25},
+ {"matrix": [4, 11], "x": 11.25, "y": 4.25},
+ {"matrix": [4, 13], "x": 12.25, "y": 4.25, "w": 2.75},
+ {"matrix": [4, 16], "x": 16.25, "y": 4.25},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 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, 16], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 17], "x": 17.25, "y": 5.25}
+ ]
+ },
+ "LAYOUT_tkl_jis": {
+ "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, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15.25, "y": 0},
+ {"matrix": [0, 16], "x": 16.25, "y": 0},
+ {"matrix": [0, 17], "x": 17.25, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.25},
+ {"matrix": [1, 3], "x": 3, "y": 1.25},
+ {"matrix": [1, 4], "x": 4, "y": 1.25},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [1, 6], "x": 6, "y": 1.25},
+ {"matrix": [1, 7], "x": 7, "y": 1.25},
+ {"matrix": [1, 8], "x": 8, "y": 1.25},
+ {"matrix": [1, 9], "x": 9, "y": 1.25},
+ {"matrix": [1, 10], "x": 10, "y": 1.25},
+ {"matrix": [1, 11], "x": 11, "y": 1.25},
+ {"matrix": [1, 12], "x": 12, "y": 1.25},
+ {"matrix": [1, 13], "x": 13, "y": 1.25},
+ {"matrix": [1, 14], "x": 14, "y": 1.25},
+ {"matrix": [1, 15], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 16], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 17], "x": 17.25, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2.25},
+ {"matrix": [2, 2], "x": 2.5, "y": 2.25},
+ {"matrix": [2, 3], "x": 3.5, "y": 2.25},
+ {"matrix": [2, 4], "x": 4.5, "y": 2.25},
+ {"matrix": [2, 5], "x": 5.5, "y": 2.25},
+ {"matrix": [2, 6], "x": 6.5, "y": 2.25},
+ {"matrix": [2, 7], "x": 7.5, "y": 2.25},
+ {"matrix": [2, 8], "x": 8.5, "y": 2.25},
+ {"matrix": [2, 9], "x": 9.5, "y": 2.25},
+ {"matrix": [2, 10], "x": 10.5, "y": 2.25},
+ {"matrix": [2, 11], "x": 11.5, "y": 2.25},
+ {"matrix": [2, 12], "x": 12.5, "y": 2.25},
+ {"matrix": [2, 14], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2},
+ {"matrix": [2, 15], "x": 15.25, "y": 2.25},
+ {"matrix": [2, 16], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 17], "x": 17.25, "y": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3.25},
+ {"matrix": [3, 2], "x": 2.75, "y": 3.25},
+ {"matrix": [3, 3], "x": 3.75, "y": 3.25},
+ {"matrix": [3, 4], "x": 4.75, "y": 3.25},
+ {"matrix": [3, 5], "x": 5.75, "y": 3.25},
+ {"matrix": [3, 6], "x": 6.75, "y": 3.25},
+ {"matrix": [3, 7], "x": 7.75, "y": 3.25},
+ {"matrix": [3, 8], "x": 8.75, "y": 3.25},
+ {"matrix": [3, 9], "x": 9.75, "y": 3.25},
+ {"matrix": [3, 10], "x": 10.75, "y": 3.25},
+ {"matrix": [3, 11], "x": 11.75, "y": 3.25},
+ {"matrix": [3, 12], "x": 12.75, "y": 3.25},
+ {"matrix": [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},
+ {"matrix": [4, 13], "x": 13.25, "y": 4.25, "w": 1.75},
+ {"matrix": [4, 16], "x": 16.25, "y": 4.25},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 1], "x": 1.5, "y": 5.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 4], "x": 4, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 6], "x": 5.5, "y": 5.25, "w": 2.5},
+ {"matrix": [5, 8], "x": 8, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 9], "x": 9.5, "y": 5.25, "w": 1.5},
+ {"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, 16], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 17], "x": 17.25, "y": 5.25}
+ ]
+ }
+ }
+}
diff --git a/keyboards/cipulot/ec_tkl_x/keymaps/default/keymap.c b/keyboards/cipulot/ec_tkl_x/keymaps/default/keymap.c
new file mode 100644
index 000000000000..9a357e2cf3f6
--- /dev/null
+++ b/keyboards/cipulot/ec_tkl_x/keymaps/default/keymap.c
@@ -0,0 +1,45 @@
+/* Copyright 2024 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_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_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, KC_RSFT, KC_RSFT, MO(1), KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT),
+
+ [1] = LAYOUT_all(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, MO(2), _______, _______, _______, _______, _______),
+
+ [2] = LAYOUT_all(
+ QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______)
+ // clang-format on
+};
diff --git a/keyboards/cipulot/ec_tkl_x/keymaps/tkl_ansi_tsangan/keymap.c b/keyboards/cipulot/ec_tkl_x/keymaps/tkl_ansi_tsangan/keymap.c
new file mode 100644
index 000000000000..86b06999864e
--- /dev/null
+++ b/keyboards/cipulot/ec_tkl_x/keymaps/tkl_ansi_tsangan/keymap.c
@@ -0,0 +1,45 @@
+/* Copyright 2024 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(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, MO(2), _______, _______, _______, _______, _______),
+
+ [2] = LAYOUT_tkl_ansi_tsangan(
+ QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______)
+ // clang-format on
+};
diff --git a/keyboards/cipulot/ec_tkl_x/keymaps/tkl_f13_ansi_tsangan/keymap.c b/keyboards/cipulot/ec_tkl_x/keymaps/tkl_f13_ansi_tsangan/keymap.c
new file mode 100644
index 000000000000..eece893fe4c2
--- /dev/null
+++ b/keyboards/cipulot/ec_tkl_x/keymaps/tkl_f13_ansi_tsangan/keymap.c
@@ -0,0 +1,45 @@
+/* Copyright 2024 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_f13_ansi_tsangan(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_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_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_f13_ansi_tsangan(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, MO(2), _______, _______, _______, _______, _______),
+
+ [2] = LAYOUT_tkl_f13_ansi_tsangan(
+ QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______)
+ // clang-format on
+};
diff --git a/keyboards/cipulot/ec_tkl_x/keymaps/tkl_f13_iso_tsangan/keymap.c b/keyboards/cipulot/ec_tkl_x/keymaps/tkl_f13_iso_tsangan/keymap.c
new file mode 100644
index 000000000000..9af7db900855
--- /dev/null
+++ b/keyboards/cipulot/ec_tkl_x/keymaps/tkl_f13_iso_tsangan/keymap.c
@@ -0,0 +1,45 @@
+/* Copyright 2024 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_f13_ansi_tsangan(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_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_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_f13_ansi_tsangan(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, MO(2), _______, _______, _______, _______, _______),
+
+ [2] = LAYOUT_tkl_f13_ansi_tsangan(
+ QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______)
+ // clang-format on
+};
diff --git a/keyboards/cipulot/ec_tkl_x/keymaps/tkl_f13_jis/keymap.c b/keyboards/cipulot/ec_tkl_x/keymaps/tkl_f13_jis/keymap.c
new file mode 100644
index 000000000000..8e0fd18d0b9b
--- /dev/null
+++ b/keyboards/cipulot/ec_tkl_x/keymaps/tkl_f13_jis/keymap.c
@@ -0,0 +1,47 @@
+/* Copyright 2024 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_f13_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_F13, 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_f13_jis(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, MO(2), _______, _______, _______, _______, _______),
+
+ [2] = LAYOUT_tkl_f13_jis(
+ QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______)
+ // clang-format on
+};
diff --git a/keyboards/cipulot/ec_tkl_x/keymaps/tkl_iso_tsangan/keymap.c b/keyboards/cipulot/ec_tkl_x/keymaps/tkl_iso_tsangan/keymap.c
new file mode 100644
index 000000000000..bae33d072dc1
--- /dev/null
+++ b/keyboards/cipulot/ec_tkl_x/keymaps/tkl_iso_tsangan/keymap.c
@@ -0,0 +1,45 @@
+/* Copyright 2024 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(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, MO(2), _______, _______, _______, _______, _______),
+
+ [2] = LAYOUT_tkl_ansi_tsangan(
+ QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______)
+ // clang-format on
+};
diff --git a/keyboards/cipulot/ec_tkl_x/keymaps/tkl_jis/keymap.c b/keyboards/cipulot/ec_tkl_x/keymaps/tkl_jis/keymap.c
new file mode 100644
index 000000000000..f445d71d6ea3
--- /dev/null
+++ b/keyboards/cipulot/ec_tkl_x/keymaps/tkl_jis/keymap.c
@@ -0,0 +1,47 @@
+/* Copyright 2024 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(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, MO(2), _______, _______, _______, _______, _______),
+
+ [2] = LAYOUT_tkl_jis(
+ QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______)
+ // clang-format on
+};
diff --git a/keyboards/cipulot/ec_tkl_x/mcuconf.h b/keyboards/cipulot/ec_tkl_x/mcuconf.h
new file mode 100644
index 000000000000..99b613c493a3
--- /dev/null
+++ b/keyboards/cipulot/ec_tkl_x/mcuconf.h
@@ -0,0 +1,25 @@
+/* Copyright 2024 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_x/post_rules.mk b/keyboards/cipulot/ec_tkl_x/post_rules.mk
new file mode 100644
index 000000000000..5dba48cc5fd6
--- /dev/null
+++ b/keyboards/cipulot/ec_tkl_x/post_rules.mk
@@ -0,0 +1 @@
+include keyboards/cipulot/common/common_cipulot.mk
diff --git a/keyboards/cipulot/ec_tkl_x/readme.md b/keyboards/cipulot/ec_tkl_x/readme.md
new file mode 100644
index 000000000000..0e37c237626b
--- /dev/null
+++ b/keyboards/cipulot/ec_tkl_x/readme.md
@@ -0,0 +1,26 @@
+# EC TKL X
+
+![EC TKL X PCB](https://i.imgur.com/pdkT14y.png)
+
+Universal TKL Electrostatic Capacitive PCB, with multi-layout support (F12/F13 version).
+
+* Keyboard Maintainer: [cipulot](https://github.com/cipulot)
+* Hardware Supported: EC TKL X PCB
+* Hardware Availability: TBD
+
+Make example for this keyboard (after setting up your build environment):
+
+ make cipulot/ec_tkl_x:default
+
+Flashing example for this keyboard:
+
+ make cipulot/ec_tkl_x: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 press the button on the bottom on the PCB
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
diff --git a/keyboards/cipulot/ec_tkl_x/rules.mk b/keyboards/cipulot/ec_tkl_x/rules.mk
new file mode 100644
index 000000000000..3aa0e2bf0615
--- /dev/null
+++ b/keyboards/cipulot/ec_tkl_x/rules.mk
@@ -0,0 +1 @@
+OPT = 2
diff --git a/keyboards/era/sirind/tomak79s/config.h b/keyboards/era/sirind/tomak79s/config.h
new file mode 100644
index 000000000000..f04429bcd895
--- /dev/null
+++ b/keyboards/era/sirind/tomak79s/config.h
@@ -0,0 +1,15 @@
+// Copyright 2024 Hyojin Bak (@eerraa)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+/* Split configuration */
+#define USB_VBUS_PIN GP19
+#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 1000U
\ No newline at end of file
diff --git a/keyboards/era/sirind/tomak79s/keyboard.json b/keyboards/era/sirind/tomak79s/keyboard.json
new file mode 100644
index 000000000000..9011a359ad54
--- /dev/null
+++ b/keyboards/era/sirind/tomak79s/keyboard.json
@@ -0,0 +1,675 @@
+{
+ "manufacturer": "SIRIND",
+ "keyboard_name": "Tomak79S",
+ "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", "GP22", "GP5", "GP6", "GP7", "GP4", "GP3", "GP2", null],
+ "rows": ["GP28", "GP23", "GP24", "GP25", "GP26", "GP27"]
+ },
+ "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,
+ "flower_blooming": 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,
+ "riverflow": 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,
+ "starlight": true,
+ "starlight_dual_hue": true,
+ "starlight_dual_sat": true,
+ "typing_heatmap": true
+ },
+ "driver": "ws2812",
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0, "flags": 1},
+ {"matrix": [0, 2], "x": 20, "y": 0, "flags": 4},
+ {"matrix": [0, 3], "x": 33, "y": 0, "flags": 4},
+ {"matrix": [0, 4], "x": 47, "y": 0, "flags": 4},
+ {"matrix": [0, 5], "x": 60, "y": 0, "flags": 4},
+ {"matrix": [0, 6], "x": 80, "y": 0, "flags": 4},
+ {"matrix": [0, 7], "x": 93, "y": 0, "flags": 4},
+ {"matrix": [1, 7], "x": 95, "y": 15, "flags": 4},
+ {"matrix": [1, 6], "x": 81, "y": 15, "flags": 4},
+ {"matrix": [1, 5], "x": 68, "y": 15, "flags": 4},
+ {"matrix": [1, 4], "x": 54, "y": 15, "flags": 4},
+ {"matrix": [1, 3], "x": 41, "y": 15, "flags": 4},
+ {"matrix": [1, 2], "x": 27, "y": 15, "flags": 4},
+ {"matrix": [1, 1], "x": 14, "y": 15, "flags": 4},
+ {"matrix": [1, 0], "x": 0, "y": 15, "flags": 4},
+ {"matrix": [2, 0], "x": 3, "y": 26, "flags": 1},
+ {"matrix": [2, 1], "x": 20, "y": 26, "flags": 4},
+ {"matrix": [2, 2], "x": 34, "y": 26, "flags": 4},
+ {"matrix": [2, 3], "x": 47, "y": 26, "flags": 4},
+ {"matrix": [2, 4], "x": 61, "y": 26, "flags": 4},
+ {"matrix": [2, 5], "x": 75, "y": 26, "flags": 4},
+ {"matrix": [2, 6], "x": 88, "y": 26, "flags": 4},
+ {"matrix": [3, 6], "x": 92, "y": 38, "flags": 4},
+ {"matrix": [3, 5], "x": 78, "y": 38, "flags": 4},
+ {"matrix": [3, 4], "x": 64, "y": 38, "flags": 4},
+ {"matrix": [3, 3], "x": 51, "y": 38, "flags": 4},
+ {"matrix": [3, 2], "x": 37, "y": 38, "flags": 4},
+ {"matrix": [3, 1], "x": 24, "y": 38, "flags": 4},
+ {"matrix": [3, 0], "x": 5, "y": 38, "flags": 1},
+ {"matrix": [3, 0], "x": 2, "y": 38, "flags": 1},
+ {"matrix": [4, 0], "x": 2, "y": 49, "flags": 1},
+ {"matrix": [4, 0], "x": 8, "y": 49, "flags": 1},
+ {"matrix": [4, 1], "x": 17, "y": 49, "flags": 4},
+ {"matrix": [4, 2], "x": 31, "y": 49, "flags": 4},
+ {"matrix": [4, 3], "x": 44, "y": 49, "flags": 4},
+ {"matrix": [4, 4], "x": 58, "y": 49, "flags": 4},
+ {"matrix": [4, 5], "x": 71, "y": 49, "flags": 4},
+ {"matrix": [4, 6], "x": 85, "y": 49, "flags": 4},
+ {"matrix": [5, 6], "x": 93, "y": 64, "flags": 1},
+ {"matrix": [5, 5], "x": 71, "y": 64, "flags": 4},
+ {"matrix": [5, 2], "x": 37, "y": 61, "flags": 1},
+ {"matrix": [5, 1], "x": 20, "y": 61, "flags": 1},
+ {"matrix": [5, 0], "x": 3, "y": 61, "flags": 1},
+ {"matrix": [6, 8], "x": 221, "y": 0, "flags": 4},
+ {"matrix": [6, 7], "x": 205, "y": 0, "flags": 4},
+ {"matrix": [6, 5], "x": 185, "y": 0, "flags": 4},
+ {"matrix": [6, 4], "x": 171, "y": 0, "flags": 4},
+ {"matrix": [6, 3], "x": 158, "y": 0, "flags": 4},
+ {"matrix": [6, 2], "x": 144, "y": 0, "flags": 4},
+ {"matrix": [6, 1], "x": 124, "y": 0, "flags": 4},
+ {"matrix": [6, 0], "x": 111, "y": 0, "flags": 4},
+ {"matrix": [7, 0], "x": 109, "y": 15, "flags": 4},
+ {"matrix": [7, 1], "x": 123, "y": 15, "flags": 4},
+ {"matrix": [7, 2], "x": 136, "y": 15, "flags": 4},
+ {"matrix": [7, 3], "x": 150, "y": 15, "flags": 4},
+ {"matrix": [7, 4], "x": 163, "y": 15, "flags": 4},
+ {"matrix": [7, 5], "x": 177, "y": 15, "flags": 4},
+ {"matrix": [7, 6], "x": 191, "y": 15, "flags": 1},
+ {"matrix": [7, 7], "x": 197, "y": 15, "flags": 1},
+ {"matrix": [7, 7], "x": 204, "y": 15, "flags": 1},
+ {"matrix": [7, 8], "x": 221, "y": 15, "flags": 1},
+ {"matrix": [8, 8], "x": 221, "y": 26, "flags": 4},
+ {"matrix": [8, 7], "x": 200, "y": 26, "flags": 4},
+ {"matrix": [8, 6], "x": 184, "y": 26, "flags": 4},
+ {"matrix": [8, 5], "x": 170, "y": 26, "flags": 4},
+ {"matrix": [8, 4], "x": 157, "y": 26, "flags": 4},
+ {"matrix": [8, 3], "x": 143, "y": 26, "flags": 4},
+ {"matrix": [8, 2], "x": 130, "y": 26, "flags": 4},
+ {"matrix": [8, 1], "x": 116, "y": 26, "flags": 4},
+ {"matrix": [8, 0], "x": 102, "y": 26, "flags": 4},
+ {"matrix": [9, 0], "x": 106, "y": 38, "flags": 4},
+ {"matrix": [9, 1], "x": 119, "y": 38, "flags": 4},
+ {"matrix": [9, 2], "x": 133, "y": 38, "flags": 4},
+ {"matrix": [9, 3], "x": 147, "y": 38, "flags": 4},
+ {"matrix": [9, 4], "x": 160, "y": 38, "flags": 4},
+ {"matrix": [9, 5], "x": 174, "y": 38, "flags": 4},
+ {"matrix": [9, 6], "x": 187, "y": 38, "flags": 4},
+ {"matrix": [9, 7], "x": 200, "y": 38, "flags": 1},
+ {"matrix": [9, 7], "x": 202, "y": 34, "flags": 1},
+ {"matrix": [10, 7], "x": 208, "y": 52, "flags": 4},
+ {"matrix": [10, 6], "x": 186, "y": 49, "flags": 1},
+ {"matrix": [10, 5], "x": 167, "y": 49, "flags": 4},
+ {"matrix": [10, 4], "x": 153, "y": 49, "flags": 4},
+ {"matrix": [10, 3], "x": 140, "y": 49, "flags": 4},
+ {"matrix": [10, 2], "x": 126, "y": 49, "flags": 4},
+ {"matrix": [10, 1], "x": 113, "y": 49, "flags": 4},
+ {"matrix": [10, 0], "x": 99, "y": 49, "flags": 4},
+ {"matrix": [11, 2], "x": 123, "y": 64, "flags": 4},
+ {"matrix": [11, 4], "x": 160, "y": 61, "flags": 1},
+ {"matrix": [11, 5], "x": 177, "y": 61, "flags": 1},
+ {"matrix": [11, 6], "x": 194, "y": 64, "flags": 4},
+ {"matrix": [11, 7], "x": 208, "y": 64, "flags": 4},
+ {"matrix": [11, 8], "x": 221, "y": 64, "flags": 4},
+ {"x": 224, "y": 53, "flags": 2},
+ {"x": 224, "y": 51, "flags": 2},
+ {"x": 224, "y": 49, "flags": 2},
+ {"x": 224, "y": 48, "flags": 2},
+ {"x": 224, "y": 46, "flags": 2},
+ {"x": 224, "y": 44, "flags": 2},
+ {"x": 224, "y": 43, "flags": 2},
+ {"x": 224, "y": 41, "flags": 2},
+ {"x": 224, "y": 39, "flags": 2}
+ ],
+ "sleep": true,
+ "split_count": [43, 59]
+ },
+ "split": {
+ "bootmagic": {
+ "matrix": [6, 0]
+ },
+ "enabled": true,
+ "handedness": {
+ "pin": "GP20"
+ },
+ "matrix_pins": {
+ "right": {
+ "cols": ["GP25", "GP24", "GP23", "GP22", "GP7", "GP6", "GP5", "GP4", "GP2"],
+ "rows": ["GP29", "GP28", "GP27", "GP26", "GP11", "GP3"]
+ }
+ },
+ "serial": {
+ "driver": "vendor"
+ },
+ "transport": {
+ "sync": {
+ "indicators": true,
+ "layer_state": true,
+ "matrix_state": true
+ }
+ }
+ },
+ "url": "",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x0013",
+ "vid": "0x4552"
+ },
+ "ws2812": {
+ "driver": "vendor",
+ "pin": "GP17"
+ },
+ "layouts": {
+ "LAYOUT_all": {
+ "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": [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": [7, 0], "x": 9.5, "y": 1.25},
+ {"matrix": [7, 1], "x": 10.5, "y": 1.25},
+ {"matrix": [7, 2], "x": 11.5, "y": 1.25},
+ {"matrix": [7, 3], "x": 12.5, "y": 1.25},
+ {"matrix": [7, 4], "x": 13.5, "y": 1.25},
+ {"matrix": [7, 5], "x": 14.5, "y": 1.25},
+ {"matrix": [7, 6], "x": 15.5, "y": 1.25},
+ {"matrix": [7, 7], "x": 16.5, "y": 1.25},
+ {"matrix": [7, 8], "x": 17.75, "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": [8, 0], "x": 9, "y": 2.25},
+ {"matrix": [8, 1], "x": 10, "y": 2.25},
+ {"matrix": [8, 2], "x": 11, "y": 2.25},
+ {"matrix": [8, 3], "x": 12, "y": 2.25},
+ {"matrix": [8, 4], "x": 13, "y": 2.25},
+ {"matrix": [8, 5], "x": 14, "y": 2.25},
+ {"matrix": [8, 6], "x": 15, "y": 2.25},
+ {"matrix": [8, 7], "x": 16, "y": 2.25, "w": 1.5},
+ {"matrix": [8, 8], "x": 17.75, "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": [9, 0], "x": 9.25, "y": 3.25},
+ {"matrix": [9, 1], "x": 10.25, "y": 3.25},
+ {"matrix": [9, 2], "x": 11.25, "y": 3.25},
+ {"matrix": [9, 3], "x": 12.25, "y": 3.25},
+ {"matrix": [9, 4], "x": 13.25, "y": 3.25},
+ {"matrix": [9, 5], "x": 14.25, "y": 3.25},
+ {"matrix": [9, 6], "x": 15.25, "y": 3.25},
+ {"matrix": [9, 7], "x": 16.25, "y": 3.25, "w": 1.25},
+ {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"matrix": [10, 0], "x": 8.75, "y": 4.25},
+ {"matrix": [10, 1], "x": 9.75, "y": 4.25},
+ {"matrix": [10, 2], "x": 10.75, "y": 4.25},
+ {"matrix": [10, 3], "x": 11.75, "y": 4.25},
+ {"matrix": [10, 4], "x": 12.75, "y": 4.25},
+ {"matrix": [10, 5], "x": 13.75, "y": 4.25},
+ {"matrix": [10, 6], "x": 14.75, "y": 4.25, "w": 1.75},
+ {"matrix": [10, 7], "x": 16.75, "y": 4.5},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 1], "x": 1.5, "y": 5.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 5], "x": 4.75, "y": 5.5, "w": 2.25},
+ {"matrix": [5, 6], "x": 7, "y": 5.5},
+ {"matrix": [11, 2], "x": 9.5, "y": 5.5, "w": 2.75},
+ {"matrix": [11, 4], "x": 13, "y": 5.25, "w": 1.5},
+ {"matrix": [11, 5], "x": 14.5, "y": 5.25},
+ {"matrix": [11, 6], "x": 15.75, "y": 5.5},
+ {"matrix": [11, 7], "x": 16.75, "y": 5.5},
+ {"matrix": [11, 8], "x": 17.75, "y": 5.5}
+ ]
+ },
+ "LAYOUT_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": [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": [7, 0], "x": 9.5, "y": 1.25},
+ {"matrix": [7, 1], "x": 10.5, "y": 1.25},
+ {"matrix": [7, 2], "x": 11.5, "y": 1.25},
+ {"matrix": [7, 3], "x": 12.5, "y": 1.25},
+ {"matrix": [7, 4], "x": 13.5, "y": 1.25},
+ {"matrix": [7, 5], "x": 14.5, "y": 1.25},
+ {"matrix": [7, 7], "x": 15.5, "y": 1.25, "w": 2},
+ {"matrix": [7, 8], "x": 17.75, "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": [8, 0], "x": 9, "y": 2.25},
+ {"matrix": [8, 1], "x": 10, "y": 2.25},
+ {"matrix": [8, 2], "x": 11, "y": 2.25},
+ {"matrix": [8, 3], "x": 12, "y": 2.25},
+ {"matrix": [8, 4], "x": 13, "y": 2.25},
+ {"matrix": [8, 5], "x": 14, "y": 2.25},
+ {"matrix": [8, 6], "x": 15, "y": 2.25},
+ {"matrix": [8, 7], "x": 16, "y": 2.25, "w": 1.5},
+ {"matrix": [8, 8], "x": 17.75, "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": [9, 0], "x": 9.25, "y": 3.25},
+ {"matrix": [9, 1], "x": 10.25, "y": 3.25},
+ {"matrix": [9, 2], "x": 11.25, "y": 3.25},
+ {"matrix": [9, 3], "x": 12.25, "y": 3.25},
+ {"matrix": [9, 4], "x": 13.25, "y": 3.25},
+ {"matrix": [9, 5], "x": 14.25, "y": 3.25},
+ {"matrix": [9, 7], "x": 15.25, "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": [10, 0], "x": 8.75, "y": 4.25},
+ {"matrix": [10, 1], "x": 9.75, "y": 4.25},
+ {"matrix": [10, 2], "x": 10.75, "y": 4.25},
+ {"matrix": [10, 3], "x": 11.75, "y": 4.25},
+ {"matrix": [10, 4], "x": 12.75, "y": 4.25},
+ {"matrix": [10, 5], "x": 13.75, "y": 4.25},
+ {"matrix": [10, 6], "x": 14.75, "y": 4.25, "w": 1.75},
+ {"matrix": [10, 7], "x": 16.75, "y": 4.5},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 1], "x": 1.5, "y": 5.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 5], "x": 4.75, "y": 5.5, "w": 2.25},
+ {"matrix": [5, 6], "x": 7, "y": 5.5},
+ {"matrix": [11, 2], "x": 9.5, "y": 5.5, "w": 2.75},
+ {"matrix": [11, 4], "x": 13, "y": 5.25, "w": 1.5},
+ {"matrix": [11, 5], "x": 14.5, "y": 5.25},
+ {"matrix": [11, 6], "x": 15.75, "y": 5.5},
+ {"matrix": [11, 7], "x": 16.75, "y": 5.5},
+ {"matrix": [11, 8], "x": 17.75, "y": 5.5}
+ ]
+ },
+ "LAYOUT_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": [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": [7, 0], "x": 9.5, "y": 1.25},
+ {"matrix": [7, 1], "x": 10.5, "y": 1.25},
+ {"matrix": [7, 2], "x": 11.5, "y": 1.25},
+ {"matrix": [7, 3], "x": 12.5, "y": 1.25},
+ {"matrix": [7, 4], "x": 13.5, "y": 1.25},
+ {"matrix": [7, 5], "x": 14.5, "y": 1.25},
+ {"matrix": [7, 6], "x": 15.5, "y": 1.25},
+ {"matrix": [7, 7], "x": 16.5, "y": 1.25},
+ {"matrix": [7, 8], "x": 17.75, "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": [8, 0], "x": 9, "y": 2.25},
+ {"matrix": [8, 1], "x": 10, "y": 2.25},
+ {"matrix": [8, 2], "x": 11, "y": 2.25},
+ {"matrix": [8, 3], "x": 12, "y": 2.25},
+ {"matrix": [8, 4], "x": 13, "y": 2.25},
+ {"matrix": [8, 5], "x": 14, "y": 2.25},
+ {"matrix": [8, 6], "x": 15, "y": 2.25},
+ {"matrix": [8, 7], "x": 16, "y": 2.25, "w": 1.5},
+ {"matrix": [8, 8], "x": 17.75, "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": [9, 0], "x": 9.25, "y": 3.25},
+ {"matrix": [9, 1], "x": 10.25, "y": 3.25},
+ {"matrix": [9, 2], "x": 11.25, "y": 3.25},
+ {"matrix": [9, 3], "x": 12.25, "y": 3.25},
+ {"matrix": [9, 4], "x": 13.25, "y": 3.25},
+ {"matrix": [9, 5], "x": 14.25, "y": 3.25},
+ {"matrix": [9, 7], "x": 15.25, "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": [10, 0], "x": 8.75, "y": 4.25},
+ {"matrix": [10, 1], "x": 9.75, "y": 4.25},
+ {"matrix": [10, 2], "x": 10.75, "y": 4.25},
+ {"matrix": [10, 3], "x": 11.75, "y": 4.25},
+ {"matrix": [10, 4], "x": 12.75, "y": 4.25},
+ {"matrix": [10, 5], "x": 13.75, "y": 4.25},
+ {"matrix": [10, 6], "x": 14.75, "y": 4.25, "w": 1.75},
+ {"matrix": [10, 7], "x": 16.75, "y": 4.5},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 1], "x": 1.5, "y": 5.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 5], "x": 4.75, "y": 5.5, "w": 2.25},
+ {"matrix": [5, 6], "x": 7, "y": 5.5},
+ {"matrix": [11, 2], "x": 9.5, "y": 5.5, "w": 2.75},
+ {"matrix": [11, 4], "x": 13, "y": 5.25, "w": 1.5},
+ {"matrix": [11, 5], "x": 14.5, "y": 5.25},
+ {"matrix": [11, 6], "x": 15.75, "y": 5.5},
+ {"matrix": [11, 7], "x": 16.75, "y": 5.5},
+ {"matrix": [11, 8], "x": 17.75, "y": 5.5}
+ ]
+ },
+ "LAYOUT_iso": {
+ "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": [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": [7, 0], "x": 9.5, "y": 1.25},
+ {"matrix": [7, 1], "x": 10.5, "y": 1.25},
+ {"matrix": [7, 2], "x": 11.5, "y": 1.25},
+ {"matrix": [7, 3], "x": 12.5, "y": 1.25},
+ {"matrix": [7, 4], "x": 13.5, "y": 1.25},
+ {"matrix": [7, 5], "x": 14.5, "y": 1.25},
+ {"matrix": [7, 7], "x": 15.5, "y": 1.25, "w": 2},
+ {"matrix": [7, 8], "x": 17.75, "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": [8, 0], "x": 9, "y": 2.25},
+ {"matrix": [8, 1], "x": 10, "y": 2.25},
+ {"matrix": [8, 2], "x": 11, "y": 2.25},
+ {"matrix": [8, 3], "x": 12, "y": 2.25},
+ {"matrix": [8, 4], "x": 13, "y": 2.25},
+ {"matrix": [8, 5], "x": 14, "y": 2.25},
+ {"matrix": [8, 6], "x": 15, "y": 2.25},
+ {"matrix": [8, 8], "x": 17.75, "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": [9, 0], "x": 9.25, "y": 3.25},
+ {"matrix": [9, 1], "x": 10.25, "y": 3.25},
+ {"matrix": [9, 2], "x": 11.25, "y": 3.25},
+ {"matrix": [9, 3], "x": 12.25, "y": 3.25},
+ {"matrix": [9, 4], "x": 13.25, "y": 3.25},
+ {"matrix": [9, 5], "x": 14.25, "y": 3.25},
+ {"matrix": [9, 6], "x": 15.25, "y": 3.25},
+ {"matrix": [9, 7], "x": 16.25, "y": 3.25, "w": 1.25, "h": 2},
+ {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"matrix": [10, 0], "x": 8.75, "y": 4.25},
+ {"matrix": [10, 1], "x": 9.75, "y": 4.25},
+ {"matrix": [10, 2], "x": 10.75, "y": 4.25},
+ {"matrix": [10, 3], "x": 11.75, "y": 4.25},
+ {"matrix": [10, 4], "x": 12.75, "y": 4.25},
+ {"matrix": [10, 5], "x": 13.75, "y": 4.25},
+ {"matrix": [10, 6], "x": 14.75, "y": 4.25, "w": 1.75},
+ {"matrix": [10, 7], "x": 16.75, "y": 4.5},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 1], "x": 1.5, "y": 5.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 5], "x": 4.75, "y": 5.5, "w": 2.25},
+ {"matrix": [5, 6], "x": 7, "y": 5.5},
+ {"matrix": [11, 2], "x": 9.5, "y": 5.5, "w": 2.75},
+ {"matrix": [11, 4], "x": 13, "y": 5.25, "w": 1.5},
+ {"matrix": [11, 5], "x": 14.5, "y": 5.25},
+ {"matrix": [11, 6], "x": 15.75, "y": 5.5},
+ {"matrix": [11, 7], "x": 16.75, "y": 5.5},
+ {"matrix": [11, 8], "x": 17.75, "y": 5.5}
+ ]
+ },
+ "LAYOUT_iso_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": [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": [7, 0], "x": 9.5, "y": 1.25},
+ {"matrix": [7, 1], "x": 10.5, "y": 1.25},
+ {"matrix": [7, 2], "x": 11.5, "y": 1.25},
+ {"matrix": [7, 3], "x": 12.5, "y": 1.25},
+ {"matrix": [7, 4], "x": 13.5, "y": 1.25},
+ {"matrix": [7, 5], "x": 14.5, "y": 1.25},
+ {"matrix": [7, 6], "x": 15.5, "y": 1.25},
+ {"matrix": [7, 7], "x": 16.5, "y": 1.25},
+ {"matrix": [7, 8], "x": 17.75, "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": [8, 0], "x": 9, "y": 2.25},
+ {"matrix": [8, 1], "x": 10, "y": 2.25},
+ {"matrix": [8, 2], "x": 11, "y": 2.25},
+ {"matrix": [8, 3], "x": 12, "y": 2.25},
+ {"matrix": [8, 4], "x": 13, "y": 2.25},
+ {"matrix": [8, 5], "x": 14, "y": 2.25},
+ {"matrix": [8, 6], "x": 15, "y": 2.25},
+ {"matrix": [8, 8], "x": 17.75, "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": [9, 0], "x": 9.25, "y": 3.25},
+ {"matrix": [9, 1], "x": 10.25, "y": 3.25},
+ {"matrix": [9, 2], "x": 11.25, "y": 3.25},
+ {"matrix": [9, 3], "x": 12.25, "y": 3.25},
+ {"matrix": [9, 4], "x": 13.25, "y": 3.25},
+ {"matrix": [9, 5], "x": 14.25, "y": 3.25},
+ {"matrix": [9, 6], "x": 15.25, "y": 3.25},
+ {"matrix": [9, 7], "x": 16.25, "y": 3.25, "w": 1.25, "h": 2},
+ {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"matrix": [10, 0], "x": 8.75, "y": 4.25},
+ {"matrix": [10, 1], "x": 9.75, "y": 4.25},
+ {"matrix": [10, 2], "x": 10.75, "y": 4.25},
+ {"matrix": [10, 3], "x": 11.75, "y": 4.25},
+ {"matrix": [10, 4], "x": 12.75, "y": 4.25},
+ {"matrix": [10, 5], "x": 13.75, "y": 4.25},
+ {"matrix": [10, 6], "x": 14.75, "y": 4.25, "w": 1.75},
+ {"matrix": [10, 7], "x": 16.75, "y": 4.5},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 1], "x": 1.5, "y": 5.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5},
+ {"matrix": [5, 5], "x": 4.75, "y": 5.5, "w": 2.25},
+ {"matrix": [5, 6], "x": 7, "y": 5.5},
+ {"matrix": [11, 2], "x": 9.5, "y": 5.5, "w": 2.75},
+ {"matrix": [11, 4], "x": 13, "y": 5.25, "w": 1.5},
+ {"matrix": [11, 5], "x": 14.5, "y": 5.25},
+ {"matrix": [11, 6], "x": 15.75, "y": 5.5},
+ {"matrix": [11, 7], "x": 16.75, "y": 5.5},
+ {"matrix": [11, 8], "x": 17.75, "y": 5.5}
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/keyboards/era/sirind/tomak79s/keymaps/default/keymap.c b/keyboards/era/sirind/tomak79s/keymaps/default/keymap.c
new file mode 100644
index 000000000000..9ac7334d4890
--- /dev/null
+++ b/keyboards/era/sirind/tomak79s/keymaps/default/keymap.c
@@ -0,0 +1,24 @@
+// Copyright 2024 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_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_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_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_NUHS, KC_ENT,
+ 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, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_SPC, KC_RALT, MO(1), 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, RM_TOGG, RM_VALU, RM_HUEU, RM_SATU, RM_SPDU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, RM_NEXT, RM_VALD, RM_HUED, RM_SATD, RM_SPDD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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/tomak79s/readme.md b/keyboards/era/sirind/tomak79s/readme.md
new file mode 100644
index 000000000000..5fc275bc65d7
--- /dev/null
+++ b/keyboards/era/sirind/tomak79s/readme.md
@@ -0,0 +1,27 @@
+# Tomak79S, Solder ver
+
+![Tomak79S](https://i.imgur.com/Pq2itWD.jpeg)
+
+Ergonomics Split Keyboard powered by RP2040.
+
+* Keyboard Maintainer: [ERA](https://github.com/eerraa)
+* Hardware supported: SIRIND Tomak79
+* Hardware availability: [Syryan](https://srind.mysoho.com/)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make era/sirind/tomak79s:default
+
+Flashing example for this keyboard:
+
+ make era/sirind/tomak79s: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/tomak79s/tomak79s.c b/keyboards/era/sirind/tomak79s/tomak79s.c
new file mode 100644
index 000000000000..f5f3165b640b
--- /dev/null
+++ b/keyboards/era/sirind/tomak79s/tomak79s.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) {
+ for (uint8_t i = 93; i <= 101; i++) {
+ rgb_matrix_set_color(i, 0, 128, 128);
+ }
+ }
+ return true;
+}
\ No newline at end of file
diff --git a/keyboards/ibm/model_m/ctrl_m/keyboard.json b/keyboards/ibm/model_m/ctrl_m/keyboard.json
new file mode 100644
index 000000000000..41801215c131
--- /dev/null
+++ b/keyboards/ibm/model_m/ctrl_m/keyboard.json
@@ -0,0 +1,409 @@
+{
+ "keyboard_name": "ctrl-M",
+ "manufacturer": "nuess0r",
+ "url": "https://github.com/nuess0r/ctrl-m",
+ "maintainer": "nuess0r",
+ "usb": {
+ "vid": "0x1D50",
+ "pid": "0x6180",
+ "device_version": "1.0.0",
+ "max_power": 100
+ },
+ "features": {
+ "bootmagic": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": false
+ },
+ "matrix_pins": {
+ "cols": ["A15", "B3", "B4", "B5", "B6", "B7", "B8", "B9", "C13", "C14", "C15", "F0", "F1", "A0", "A1", "A2"],
+ "rows": ["A3", "A4", "A5", "A6", "A7", "B0", "B1", "B2"],
+ "ghost": true
+ },
+ "diode_direction": "ROW2COL",
+ "indicators": {
+ "num_lock": "B10",
+ "caps_lock": "B12",
+ "scroll_lock": "B11",
+ "on_state": 0
+ },
+ "bootmagic": {
+ "matrix": [0, 2]
+ },
+ "processor": "STM32F072",
+ "bootloader": "stm32-dfu",
+ "layouts": {
+ "LAYOUT_fullsize_ansi_wkl": {
+ "layout": [
+ {"label": "Esc", "matrix": [0, 2], "x": 0, "y": 0},
+
+ {"label": "F1", "matrix": [2, 3], "x": 2, "y": 0},
+ {"label": "F2", "matrix": [2, 4], "x": 3, "y": 0},
+ {"label": "F3", "matrix": [1, 4], "x": 4, "y": 0},
+ {"label": "F4", "matrix": [0, 4], "x": 5, "y": 0},
+
+ {"label": "F5", "matrix": [0, 6], "x": 6.5, "y": 0},
+ {"label": "F6", "matrix": [0, 8], "x": 7.5, "y": 0},
+ {"label": "F7", "matrix": [1, 9], "x": 8.5, "y": 0},
+ {"label": "F8", "matrix": [2, 9], "x": 9.5, "y": 0},
+
+ {"label": "F9", "matrix": [2, 6], "x": 11, "y": 0},
+ {"label": "F10", "matrix": [3, 6], "x": 12, "y": 0},
+ {"label": "F11", "matrix": [3, 11], "x": 13, "y": 0},
+ {"label": "F12", "matrix": [3, 12], "x": 14, "y": 0},
+
+ {"label": "PrtSc", "matrix": [3, 15], "x": 15.25, "y": 0},
+ {"label": "Scroll Lock", "matrix": [4, 15], "x": 16.25, "y": 0},
+ {"label": "Pause", "matrix": [6, 14], "x": 17.25, "y": 0},
+
+ {"label": "~", "matrix": [2, 2], "x": 0, "y": 1.5},
+ {"label": "!", "matrix": [3, 2], "x": 1, "y": 1.5},
+ {"label": "@", "matrix": [3, 3], "x": 2, "y": 1.5},
+ {"label": "#", "matrix": [3, 4], "x": 3, "y": 1.5},
+ {"label": "$", "matrix": [3, 5], "x": 4, "y": 1.5},
+ {"label": "%", "matrix": [2, 5], "x": 5, "y": 1.5},
+ {"label": "^", "matrix": [2, 7], "x": 6, "y": 1.5},
+ {"label": "&", "matrix": [3, 7], "x": 7, "y": 1.5},
+ {"label": "*", "matrix": [3, 8], "x": 8, "y": 1.5},
+ {"label": "(", "matrix": [3, 9], "x": 9, "y": 1.5},
+ {"label": ")", "matrix": [3, 10], "x": 10, "y": 1.5},
+ {"label": "_", "matrix": [2, 10], "x": 11, "y": 1.5},
+ {"label": "+", "matrix": [2, 8], "x": 12, "y": 1.5},
+ {"label": "Backspace", "matrix": [1, 6], "x": 13, "y": 1.5, "w": 2},
+
+ {"label": "Insert", "matrix": [2, 12], "x": 15.25, "y": 1.5},
+ {"label": "Home", "matrix": [2, 14], "x": 16.25, "y": 1.5},
+ {"label": "PgUp", "matrix": [2, 13], "x": 17.25, "y": 1.5},
+
+ {"label": "Num Lock", "matrix": [6, 11], "x": 18.5, "y": 1.5},
+ {"label": "/", "matrix": [6, 12], "x": 19.5, "y": 1.5},
+ {"label": "*", "matrix": [6, 13], "x": 20.5, "y": 1.5},
+ {"label": "-", "matrix": [7, 13], "x": 21.5, "y": 1.5},
+
+ {"label": "Tab", "matrix": [1, 2], "x": 0, "y": 2.5, "w": 1.5},
+ {"label": "Q", "matrix": [4, 2], "x": 1.5, "y": 2.5},
+ {"label": "W", "matrix": [4, 3], "x": 2.5, "y": 2.5},
+ {"label": "E", "matrix": [4, 4], "x": 3.5, "y": 2.5},
+ {"label": "R", "matrix": [4, 5], "x": 4.5, "y": 2.5},
+ {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 2.5},
+ {"label": "Y", "matrix": [1, 7], "x": 6.5, "y": 2.5},
+ {"label": "U", "matrix": [4, 7], "x": 7.5, "y": 2.5},
+ {"label": "I", "matrix": [4, 8], "x": 8.5, "y": 2.5},
+ {"label": "O", "matrix": [4, 9], "x": 9.5, "y": 2.5},
+ {"label": "P", "matrix": [4, 10], "x": 10.5, "y": 2.5},
+ {"label": "{", "matrix": [1, 10], "x": 11.5, "y": 2.5},
+ {"label": "}", "matrix": [1, 8], "x": 12.5, "y": 2.5},
+ {"label": "|", "matrix": [5, 6], "x": 13.5, "y": 2.5, "w": 1.5},
+
+ {"label": "Delete", "matrix": [2, 11], "x": 15.25, "y": 2.5},
+ {"label": "End", "matrix": [3, 14], "x": 16.25, "y": 2.5},
+ {"label": "PgDn", "matrix": [3, 13], "x": 17.25, "y": 2.5},
+
+ {"label": "7", "matrix": [4, 11], "x": 18.5, "y": 2.5},
+ {"label": "8", "matrix": [4, 12], "x": 19.5, "y": 2.5},
+ {"label": "9", "matrix": [4, 13], "x": 20.5, "y": 2.5},
+ {"label": "+", "matrix": [4, 14], "x": 21.5, "y": 2.5, "h": 2},
+
+ {"label": "Caps Lock", "matrix": [1, 3], "x": 0, "y": 3.5, "w": 1.5},
+ {"label": "A", "matrix": [5, 2], "x": 1.75, "y": 3.5},
+ {"label": "S", "matrix": [5, 3], "x": 2.75, "y": 3.5},
+ {"label": "D", "matrix": [5, 4], "x": 3.75, "y": 3.5},
+ {"label": "F", "matrix": [5, 5], "x": 4.75, "y": 3.5},
+ {"label": "G", "matrix": [0, 5], "x": 5.75, "y": 3.5},
+ {"label": "H", "matrix": [0, 7], "x": 6.75, "y": 3.5},
+ {"label": "J", "matrix": [5, 7], "x": 7.75, "y": 3.5},
+ {"label": "K", "matrix": [5, 8], "x": 8.75, "y": 3.5},
+ {"label": "L", "matrix": [5, 9], "x": 9.75, "y": 3.5},
+ {"label": ":", "matrix": [5, 10], "x": 10.75, "y": 3.5},
+ {"label": "\"", "matrix": [0, 10], "x": 11.75, "y": 3.5},
+ {"label": "Enter", "matrix": [6, 6], "x": 12.75, "y": 3.5, "w": 2.25},
+
+ {"label": "4", "matrix": [1, 11], "x": 18.5, "y": 3.5},
+ {"label": "5", "matrix": [1, 12], "x": 19.5, "y": 3.5},
+ {"label": "6", "matrix": [1, 13], "x": 20.5, "y": 3.5},
+
+ {"label": "Shift", "matrix": [1, 1], "x": 0, "y": 4.5, "w": 2.25},
+ {"label": "Z", "matrix": [6, 2], "x": 2.25, "y": 4.5},
+ {"label": "X", "matrix": [6, 3], "x": 3.25, "y": 4.5},
+ {"label": "C", "matrix": [6, 4], "x": 4.25, "y": 4.5},
+ {"label": "V", "matrix": [6, 5], "x": 5.25, "y": 4.5},
+ {"label": "B", "matrix": [7, 5], "x": 6.25, "y": 4.5},
+ {"label": "N", "matrix": [7, 7], "x": 7.25, "y": 4.5},
+ {"label": "M", "matrix": [6, 7], "x": 8.25, "y": 4.5},
+ {"label": "<", "matrix": [6, 8], "x": 9.25, "y": 4.5},
+ {"label": ">", "matrix": [6, 9], "x": 10.25, "y": 4.5},
+ {"label": "?", "matrix": [7, 10], "x": 11.25, "y": 4.5},
+ {"label": "Shift", "matrix": [6, 1], "x": 12.25, "y": 4.5, "w": 2.75},
+
+ {"label": "\u2191", "matrix": [0, 14], "x": 16.25, "y": 4.5},
+
+ {"label": "1", "matrix": [5, 11], "x": 18.5, "y": 4.5},
+ {"label": "2", "matrix": [5, 12], "x": 19.5, "y": 4.5},
+ {"label": "3", "matrix": [5, 13], "x": 20.5, "y": 4.5},
+ {"label": "Enter", "matrix": [5, 14], "x": 21.5, "y": 4.5, "h": 2},
+
+ {"label": "Ctrl", "matrix": [2, 0], "x": 0, "y": 5.5, "w": 1.5},
+ {"label": "Alt", "matrix": [0, 15], "x": 2.5, "y": 5.5, "w": 1.5},
+ {"matrix": [7, 6], "x": 4, "y": 5.5, "w": 7},
+ {"label": "Alt", "matrix": [7, 15], "x": 11, "y": 5.5, "w": 1.5},
+ {"label": "Ctrl", "matrix": [6, 0], "x": 13.5, "y": 5.5, "w": 1.5},
+
+ {"label": "\u2190", "matrix": [7, 14], "x": 15.25, "y": 5.5},
+ {"label": "\u2193", "matrix": [7, 11], "x": 16.25, "y": 5.5},
+ {"label": "\u2192", "matrix": [7, 12], "x": 17.25, "y": 5.5},
+
+ {"label": "0", "matrix": [0, 12], "x": 18.5, "y": 5.5, "w": 2},
+ {"label": ".", "matrix": [0, 13], "x": 20.5, "y": 5.5}
+ ]
+ },
+ "LAYOUT_fullsize_iso_wkl": {
+ "layout": [
+ {"label": "Esc", "matrix": [0, 2], "x": 0, "y": 0},
+
+ {"label": "F1", "matrix": [2, 3], "x": 2, "y": 0},
+ {"label": "F2", "matrix": [2, 4], "x": 3, "y": 0},
+ {"label": "F3", "matrix": [1, 4], "x": 4, "y": 0},
+ {"label": "F4", "matrix": [0, 4], "x": 5, "y": 0},
+
+ {"label": "F5", "matrix": [0, 6], "x": 6.5, "y": 0},
+ {"label": "F6", "matrix": [0, 8], "x": 7.5, "y": 0},
+ {"label": "F7", "matrix": [1, 9], "x": 8.5, "y": 0},
+ {"label": "F8", "matrix": [2, 9], "x": 9.5, "y": 0},
+
+ {"label": "F9", "matrix": [2, 6], "x": 11, "y": 0},
+ {"label": "F10", "matrix": [3, 6], "x": 12, "y": 0},
+ {"label": "F11", "matrix": [3, 11], "x": 13, "y": 0},
+ {"label": "F12", "matrix": [3, 12], "x": 14, "y": 0},
+
+ {"label": "PrtSc", "matrix": [3, 15], "x": 15.25, "y": 0},
+ {"label": "Scroll Lock", "matrix": [4, 15], "x": 16.25, "y": 0},
+ {"label": "Pause", "matrix": [6, 14], "x": 17.25, "y": 0},
+
+ {"label": "~", "matrix": [2, 2], "x": 0, "y": 1.5},
+ {"label": "!", "matrix": [3, 2], "x": 1, "y": 1.5},
+ {"label": "@", "matrix": [3, 3], "x": 2, "y": 1.5},
+ {"label": "#", "matrix": [3, 4], "x": 3, "y": 1.5},
+ {"label": "$", "matrix": [3, 5], "x": 4, "y": 1.5},
+ {"label": "%", "matrix": [2, 5], "x": 5, "y": 1.5},
+ {"label": "^", "matrix": [2, 7], "x": 6, "y": 1.5},
+ {"label": "&", "matrix": [3, 7], "x": 7, "y": 1.5},
+ {"label": "*", "matrix": [3, 8], "x": 8, "y": 1.5},
+ {"label": "(", "matrix": [3, 9], "x": 9, "y": 1.5},
+ {"label": ")", "matrix": [3, 10], "x": 10, "y": 1.5},
+ {"label": "_", "matrix": [2, 10], "x": 11, "y": 1.5},
+ {"label": "+", "matrix": [2, 8], "x": 12, "y": 1.5},
+ {"label": "Backspace", "matrix": [1, 6], "x": 13, "y": 1.5, "w": 2},
+
+ {"label": "Insert", "matrix": [2, 12], "x": 15.25, "y": 1.5},
+ {"label": "Home", "matrix": [2, 14], "x": 16.25, "y": 1.5},
+ {"label": "PgUp", "matrix": [2, 13], "x": 17.25, "y": 1.5},
+
+ {"label": "Num Lock", "matrix": [6, 11], "x": 18.5, "y": 1.5},
+ {"label": "/", "matrix": [6, 12], "x": 19.5, "y": 1.5},
+ {"label": "*", "matrix": [6, 13], "x": 20.5, "y": 1.5},
+ {"label": "-", "matrix": [7, 13], "x": 21.5, "y": 1.5},
+
+ {"label": "Tab", "matrix": [1, 2], "x": 0, "y": 2.5, "w": 1.5},
+ {"label": "Q", "matrix": [4, 2], "x": 1.5, "y": 2.5},
+ {"label": "W", "matrix": [4, 3], "x": 2.5, "y": 2.5},
+ {"label": "E", "matrix": [4, 4], "x": 3.5, "y": 2.5},
+ {"label": "R", "matrix": [4, 5], "x": 4.5, "y": 2.5},
+ {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 2.5},
+ {"label": "Y", "matrix": [1, 7], "x": 6.5, "y": 2.5},
+ {"label": "U", "matrix": [4, 7], "x": 7.5, "y": 2.5},
+ {"label": "I", "matrix": [4, 8], "x": 8.5, "y": 2.5},
+ {"label": "O", "matrix": [4, 9], "x": 9.5, "y": 2.5},
+ {"label": "P", "matrix": [4, 10], "x": 10.5, "y": 2.5},
+ {"label": "{", "matrix": [1, 10], "x": 11.5, "y": 2.5},
+ {"label": "}", "matrix": [1, 8], "x": 12.5, "y": 2.5},
+
+ {"label": "Delete", "matrix": [2, 11], "x": 15.25, "y": 2.5},
+ {"label": "End", "matrix": [3, 14], "x": 16.25, "y": 2.5},
+ {"label": "PgDn", "matrix": [3, 13], "x": 17.25, "y": 2.5},
+
+ {"label": "7", "matrix": [4, 11], "x": 18.5, "y": 2.5},
+ {"label": "8", "matrix": [4, 12], "x": 19.5, "y": 2.5},
+ {"label": "9", "matrix": [4, 13], "x": 20.5, "y": 2.5},
+ {"label": "+", "matrix": [4, 14], "x": 21.5, "y": 2.5, "h": 2},
+
+ {"label": "Caps Lock", "matrix": [1, 3], "x": 0, "y": 3.5, "w": 1.5},
+ {"label": "A", "matrix": [5, 2], "x": 1.75, "y": 3.5},
+ {"label": "S", "matrix": [5, 3], "x": 2.75, "y": 3.5},
+ {"label": "D", "matrix": [5, 4], "x": 3.75, "y": 3.5},
+ {"label": "F", "matrix": [5, 5], "x": 4.75, "y": 3.5},
+ {"label": "G", "matrix": [0, 5], "x": 5.75, "y": 3.5},
+ {"label": "H", "matrix": [0, 7], "x": 6.75, "y": 3.5},
+ {"label": "J", "matrix": [5, 7], "x": 7.75, "y": 3.5},
+ {"label": "K", "matrix": [5, 8], "x": 8.75, "y": 3.5},
+ {"label": "L", "matrix": [5, 9], "x": 9.75, "y": 3.5},
+ {"label": ":", "matrix": [5, 10], "x": 10.75, "y": 3.5},
+ {"label": "\"", "matrix": [0, 10], "x": 11.75, "y": 3.5},
+ {"label": "NUHS", "matrix": [6, 10], "x": 12.75, "y": 3.5},
+ {"label": "Enter", "matrix": [6, 6], "x": 13.75, "y": 2.5, "w": 1.25, "h": 2},
+
+ {"label": "4", "matrix": [1, 11], "x": 18.5, "y": 3.5},
+ {"label": "5", "matrix": [1, 12], "x": 19.5, "y": 3.5},
+ {"label": "6", "matrix": [1, 13], "x": 20.5, "y": 3.5},
+
+ {"label": "Shift", "matrix": [1, 1], "x": 0, "y": 4.5, "w": 1.25},
+ {"label": "NUBS", "matrix": [0, 3], "x": 1.25, "y": 4.5},
+ {"label": "Z", "matrix": [6, 2], "x": 2.25, "y": 4.5},
+ {"label": "X", "matrix": [6, 3], "x": 3.25, "y": 4.5},
+ {"label": "C", "matrix": [6, 4], "x": 4.25, "y": 4.5},
+ {"label": "V", "matrix": [6, 5], "x": 5.25, "y": 4.5},
+ {"label": "B", "matrix": [7, 5], "x": 6.25, "y": 4.5},
+ {"label": "N", "matrix": [7, 7], "x": 7.25, "y": 4.5},
+ {"label": "M", "matrix": [6, 7], "x": 8.25, "y": 4.5},
+ {"label": "<", "matrix": [6, 8], "x": 9.25, "y": 4.5},
+ {"label": ">", "matrix": [6, 9], "x": 10.25, "y": 4.5},
+ {"label": "?", "matrix": [7, 10], "x": 11.25, "y": 4.5},
+ {"label": "Shift", "matrix": [6, 1], "x": 12.25, "y": 4.5, "w": 2.75},
+
+ {"label": "\u2191", "matrix": [0, 14], "x": 16.25, "y": 4.5},
+
+ {"label": "1", "matrix": [5, 11], "x": 18.5, "y": 4.5},
+ {"label": "2", "matrix": [5, 12], "x": 19.5, "y": 4.5},
+ {"label": "3", "matrix": [5, 13], "x": 20.5, "y": 4.5},
+ {"label": "Enter", "matrix": [5, 14], "x": 21.5, "y": 4.5, "h": 2},
+
+ {"label": "Ctrl", "matrix": [2, 0], "x": 0, "y": 5.5, "w": 1.5},
+ {"label": "Alt", "matrix": [0, 15], "x": 2.5, "y": 5.5, "w": 1.5},
+ {"matrix": [7, 6], "x": 4, "y": 5.5, "w": 7},
+ {"label": "Alt", "matrix": [7, 15], "x": 11, "y": 5.5, "w": 1.5},
+ {"label": "Ctrl", "matrix": [6, 0], "x": 13.5, "y": 5.5, "w": 1.5},
+
+ {"label": "\u2190", "matrix": [7, 14], "x": 15.25, "y": 5.5},
+ {"label": "\u2193", "matrix": [7, 11], "x": 16.25, "y": 5.5},
+ {"label": "\u2192", "matrix": [7, 12], "x": 17.25, "y": 5.5},
+
+ {"label": "0", "matrix": [0, 12], "x": 18.5, "y": 5.5, "w": 2},
+ {"label": ".", "matrix": [0, 13], "x": 20.5, "y": 5.5}
+ ]
+ },
+ "LAYOUT_all": {
+ "layout": [
+ {"label": "Esc", "matrix": [0, 2], "x": 0, "y": 0},
+
+ {"label": "F1", "matrix": [2, 3], "x": 2, "y": 0},
+ {"label": "F2", "matrix": [2, 4], "x": 3, "y": 0},
+ {"label": "F3", "matrix": [1, 4], "x": 4, "y": 0},
+ {"label": "F4", "matrix": [0, 4], "x": 5, "y": 0},
+
+ {"label": "F5", "matrix": [0, 6], "x": 6.5, "y": 0},
+ {"label": "F6", "matrix": [0, 8], "x": 7.5, "y": 0},
+ {"label": "F7", "matrix": [1, 9], "x": 8.5, "y": 0},
+ {"label": "F8", "matrix": [2, 9], "x": 9.5, "y": 0},
+
+ {"label": "F9", "matrix": [2, 6], "x": 11, "y": 0},
+ {"label": "F10", "matrix": [3, 6], "x": 12, "y": 0},
+ {"label": "F11", "matrix": [3, 11], "x": 13, "y": 0},
+ {"label": "F12", "matrix": [3, 12], "x": 14, "y": 0},
+
+ {"label": "PrtSc", "matrix": [3, 15], "x": 15.25, "y": 0},
+ {"label": "Scroll Lock", "matrix": [4, 15], "x": 16.25, "y": 0},
+ {"label": "Pause", "matrix": [6, 14], "x": 17.25, "y": 0},
+
+ {"label": "~", "matrix": [2, 2], "x": 0, "y": 1.5},
+ {"label": "!", "matrix": [3, 2], "x": 1, "y": 1.5},
+ {"label": "@", "matrix": [3, 3], "x": 2, "y": 1.5},
+ {"label": "#", "matrix": [3, 4], "x": 3, "y": 1.5},
+ {"label": "$", "matrix": [3, 5], "x": 4, "y": 1.5},
+ {"label": "%", "matrix": [2, 5], "x": 5, "y": 1.5},
+ {"label": "^", "matrix": [2, 7], "x": 6, "y": 1.5},
+ {"label": "&", "matrix": [3, 7], "x": 7, "y": 1.5},
+ {"label": "*", "matrix": [3, 8], "x": 8, "y": 1.5},
+ {"label": "(", "matrix": [3, 9], "x": 9, "y": 1.5},
+ {"label": ")", "matrix": [3, 10], "x": 10, "y": 1.5},
+ {"label": "_", "matrix": [2, 10], "x": 11, "y": 1.5},
+ {"label": "+", "matrix": [2, 8], "x": 12, "y": 1.5},
+ {"label": "Backspace", "matrix": [1, 6], "x": 13, "y": 1.5, "w": 2},
+
+ {"label": "Insert", "matrix": [2, 12], "x": 15.25, "y": 1.5},
+ {"label": "Home", "matrix": [2, 14], "x": 16.25, "y": 1.5},
+ {"label": "PgUp", "matrix": [2, 13], "x": 17.25, "y": 1.5},
+
+ {"label": "Num Lock", "matrix": [6, 11], "x": 18.5, "y": 1.5},
+ {"label": "/", "matrix": [6, 12], "x": 19.5, "y": 1.5},
+ {"label": "*", "matrix": [6, 13], "x": 20.5, "y": 1.5},
+ {"label": "-", "matrix": [7, 13], "x": 21.5, "y": 1.5},
+
+ {"label": "Tab", "matrix": [1, 2], "x": 0, "y": 2.5, "w": 1.5},
+ {"label": "Q", "matrix": [4, 2], "x": 1.5, "y": 2.5},
+ {"label": "W", "matrix": [4, 3], "x": 2.5, "y": 2.5},
+ {"label": "E", "matrix": [4, 4], "x": 3.5, "y": 2.5},
+ {"label": "R", "matrix": [4, 5], "x": 4.5, "y": 2.5},
+ {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 2.5},
+ {"label": "Y", "matrix": [1, 7], "x": 6.5, "y": 2.5},
+ {"label": "U", "matrix": [4, 7], "x": 7.5, "y": 2.5},
+ {"label": "I", "matrix": [4, 8], "x": 8.5, "y": 2.5},
+ {"label": "O", "matrix": [4, 9], "x": 9.5, "y": 2.5},
+ {"label": "P", "matrix": [4, 10], "x": 10.5, "y": 2.5},
+ {"label": "{", "matrix": [1, 10], "x": 11.5, "y": 2.5},
+ {"label": "}", "matrix": [1, 8], "x": 12.5, "y": 2.5},
+ {"label": "|", "matrix": [5, 6], "x": 13.5, "y": 2.5, "w": 1.5},
+
+ {"label": "Delete", "matrix": [2, 11], "x": 15.25, "y": 2.5},
+ {"label": "End", "matrix": [3, 14], "x": 16.25, "y": 2.5},
+ {"label": "PgDn", "matrix": [3, 13], "x": 17.25, "y": 2.5},
+
+ {"label": "7", "matrix": [4, 11], "x": 18.5, "y": 2.5},
+ {"label": "8", "matrix": [4, 12], "x": 19.5, "y": 2.5},
+ {"label": "9", "matrix": [4, 13], "x": 20.5, "y": 2.5},
+ {"label": "+", "matrix": [4, 14], "x": 21.5, "y": 2.5, "h": 2},
+
+ {"label": "Caps Lock", "matrix": [1, 3], "x": 0, "y": 3.5, "w": 1.5},
+ {"label": "A", "matrix": [5, 2], "x": 1.75, "y": 3.5},
+ {"label": "S", "matrix": [5, 3], "x": 2.75, "y": 3.5},
+ {"label": "D", "matrix": [5, 4], "x": 3.75, "y": 3.5},
+ {"label": "F", "matrix": [5, 5], "x": 4.75, "y": 3.5},
+ {"label": "G", "matrix": [0, 5], "x": 5.75, "y": 3.5},
+ {"label": "H", "matrix": [0, 7], "x": 6.75, "y": 3.5},
+ {"label": "J", "matrix": [5, 7], "x": 7.75, "y": 3.5},
+ {"label": "K", "matrix": [5, 8], "x": 8.75, "y": 3.5},
+ {"label": "L", "matrix": [5, 9], "x": 9.75, "y": 3.5},
+ {"label": ":", "matrix": [5, 10], "x": 10.75, "y": 3.5},
+ {"label": "\"", "matrix": [0, 10], "x": 11.75, "y": 3.5},
+ {"label": "NUHS", "matrix": [6, 10], "x": 12.75, "y": 3.5},
+ {"label": "Enter", "matrix": [6, 6], "x": 13.75, "y": 3.5, "w": 1.25},
+
+ {"label": "4", "matrix": [1, 11], "x": 18.5, "y": 3.5},
+ {"label": "5", "matrix": [1, 12], "x": 19.5, "y": 3.5},
+ {"label": "6", "matrix": [1, 13], "x": 20.5, "y": 3.5},
+
+ {"label": "Shift", "matrix": [1, 1], "x": 0, "y": 4.5, "w": 1.25},
+ {"label": "NUBS", "matrix": [0, 3], "x": 1.25, "y": 4.5},
+ {"label": "Z", "matrix": [6, 2], "x": 2.25, "y": 4.5},
+ {"label": "X", "matrix": [6, 3], "x": 3.25, "y": 4.5},
+ {"label": "C", "matrix": [6, 4], "x": 4.25, "y": 4.5},
+ {"label": "V", "matrix": [6, 5], "x": 5.25, "y": 4.5},
+ {"label": "B", "matrix": [7, 5], "x": 6.25, "y": 4.5},
+ {"label": "N", "matrix": [7, 7], "x": 7.25, "y": 4.5},
+ {"label": "M", "matrix": [6, 7], "x": 8.25, "y": 4.5},
+ {"label": "<", "matrix": [6, 8], "x": 9.25, "y": 4.5},
+ {"label": ">", "matrix": [6, 9], "x": 10.25, "y": 4.5},
+ {"label": "?", "matrix": [7, 10], "x": 11.25, "y": 4.5},
+ {"label": "Shift", "matrix": [6, 1], "x": 12.25, "y": 4.5, "w": 2.75},
+
+ {"label": "\u2191", "matrix": [0, 14], "x": 16.25, "y": 4.5},
+
+ {"label": "1", "matrix": [5, 11], "x": 18.5, "y": 4.5},
+ {"label": "2", "matrix": [5, 12], "x": 19.5, "y": 4.5},
+ {"label": "3", "matrix": [5, 13], "x": 20.5, "y": 4.5},
+ {"label": "Enter", "matrix": [5, 14], "x": 21.5, "y": 4.5, "h": 2},
+
+ {"label": "Ctrl", "matrix": [2, 0], "x": 0, "y": 5.5, "w": 1.5},
+ {"label": "Alt", "matrix": [0, 15], "x": 2.5, "y": 5.5, "w": 1.5},
+ {"matrix": [7, 6], "x": 4, "y": 5.5, "w": 7},
+ {"label": "Alt", "matrix": [7, 15], "x": 11, "y": 5.5, "w": 1.5},
+ {"label": "Ctrl", "matrix": [6, 0], "x": 13.5, "y": 5.5, "w": 1.5},
+
+ {"label": "\u2190", "matrix": [7, 14], "x": 15.25, "y": 5.5},
+ {"label": "\u2193", "matrix": [7, 11], "x": 16.25, "y": 5.5},
+ {"label": "\u2192", "matrix": [7, 12], "x": 17.25, "y": 5.5},
+
+ {"label": "0", "matrix": [0, 12], "x": 18.5, "y": 5.5, "w": 2},
+ {"label": ".", "matrix": [0, 13], "x": 20.5, "y": 5.5}
+ ]
+ }
+ }
+}
diff --git a/keyboards/ibm/model_m/ctrl_m/keymaps/default/keymap.c b/keyboards/ibm/model_m/ctrl_m/keymaps/default/keymap.c
new file mode 100644
index 000000000000..741cb1c4ba7a
--- /dev/null
+++ b/keyboards/ibm/model_m/ctrl_m/keymaps/default/keymap.c
@@ -0,0 +1,27 @@
+/* Copyright 2020 Michael Schwingen
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_all( /* Base layer - standard layout without any special functions */
+ 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_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_DEL , KC_END , KC_PGDN, 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_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_LALT, KC_SPC , KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT
+ )
+};
diff --git a/keyboards/ibm/model_m/ctrl_m/readme.md b/keyboards/ibm/model_m/ctrl_m/readme.md
new file mode 100644
index 000000000000..aab3a685f2e0
--- /dev/null
+++ b/keyboards/ibm/model_m/ctrl_m/readme.md
@@ -0,0 +1,27 @@
+# ctrl-M
+
+![ctrl-M PCB](https://i.imgur.com/wUqY8N3.jpeg)
+
+This is a configuration of QMK intended to be used with the [ctrl-M controller](https://github.com/nuess0r/ctrl-M). Many thanks to iw0rm3r, ashpil, mschwingen and all QMK contributors for working on similar projects and providing the foundation for this!
+
+* Keyboard Maintainer: [nuess0r](https://github.com/nuess0r)
+* Hardware Supported: [ctrl-M](https://github.com/nuess0r/ctrl-m)
+* Hardware Availability: [tindie shop](https://www.tindie.com/products/brain4free/ctrl-m/)
+
+Example how to compile for this keyboard (after setting up your build environment):
+
+ make ibm/model_m/ctrl_m:default
+
+Flashing example for this keyboard:
+
+ make ibm/model_m/ctrl_m: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 Escape key and plug in the keyboard
+* **Physical reset button**: Briefly press the button on the back of the PCB and plug in the keyboard
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
diff --git a/keyboards/kradoindustries/promenade_rp24s/keyboard.json b/keyboards/kradoindustries/promenade_rp24s/keyboard.json
new file mode 100644
index 000000000000..c0d4a7f535fb
--- /dev/null
+++ b/keyboards/kradoindustries/promenade_rp24s/keyboard.json
@@ -0,0 +1,140 @@
+{
+ "keyboard_name": "Promenade RP24S",
+ "manufacturer": "Krado Industries",
+ "url": "https://www.kradoindustries.com/",
+ "maintainer": "Krado Industries",
+ "processor": "RP2040",
+ "bootloader": "rp2040",
+ "usb": {
+ "vid": "0x4B72",
+ "pid": "0x4B6D",
+ "device_version": "1.0.0"
+ },
+ "features": {
+ "bootmagic": true,
+ "mousekey": true,
+ "extrakey": true,
+ "console": false,
+ "command": false,
+ "nkro": true,
+ "encoder": true,
+ "rgblight": true
+ },
+
+ "encoder": {
+ "rotary": [
+ { "pin_a": "GP12", "pin_b": "GP15" },
+ { "pin_a": "GP12", "pin_b": "GP16" },
+ { "pin_a": "GP15", "pin_b": "GP18" },
+ { "pin_a": "GP16", "pin_b": "GP18" },
+ { "pin_a": "GP11", "pin_b": "GP15" },
+ { "pin_a": "GP16", "pin_b": "GP11" },
+ { "pin_a": "GP16", "pin_b": "GP15" },
+ { "pin_a": "GP18", "pin_b": "GP12" }
+ ]
+ },
+
+ "ws2812": {
+ "pin": "GP26",
+ "driver": "vendor"
+ },
+ "rgblight": {
+ "led_count": 14,
+ "sleep": true,
+ "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
+ }
+ },
+
+
+ "diode_direction": "COL2ROW",
+ "matrix_pins": {
+ "cols": ["GP20", "GP10", "GP9", "GP8", "GP7", "GP6", "GP14", "GP13", "GP5", "GP4", "GP3", "GP2", "GP1", "GP0"],
+ "rows": ["GP29", "GP28", "GP27", "GP19", "GP17"]
+ },
+
+ "layouts": {
+ "LAYOUT": {
+ "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, 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.5, "y":0},
+ {"matrix": [0, 10], "x":10.5, "y":0},
+ {"matrix": [0, 11], "x":11.5, "y":0},
+ {"matrix": [0, 12], "x":12.5, "y":0},
+ {"matrix": [0, 13], "x":13.5, "y":0, "w":1.5},
+ {"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.5},
+ {"matrix": [2, 1], "x":1.5, "y":2},
+ {"matrix": [2, 2], "x":2.5, "y":2},
+ {"matrix": [2, 3], "x":3.5, "y":2},
+ {"matrix": [2, 4], "x":4.5, "y":2},
+ {"matrix": [2, 5], "x":5.5, "y":2},
+ {"matrix": [2, 6], "x":6.5, "y":2},
+ {"matrix": [2, 7], "x":7.5, "y":2},
+ {"matrix": [2, 8], "x":8.5, "y":2},
+ {"matrix": [2, 9], "x":9.5, "y":2},
+ {"matrix": [2, 10], "x":10.5, "y":2},
+ {"matrix": [2, 11], "x":11.5, "y":2},
+ {"matrix": [2, 12], "x":12.5, "y":2},
+ {"matrix": [2, 13], "x":13.5, "y":2, "w":1.5},
+ {"matrix": [3, 0], "x":0, "y":3, "w":1.5},
+ {"matrix": [3, 1], "x":1.5, "y":3},
+ {"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, 8], "x":8.5, "y":3},
+ {"matrix": [3, 9], "x":9.5, "y":3},
+ {"matrix": [3, 10], "x":10.5, "y":3},
+ {"matrix": [3, 11], "x":11.5, "y":3},
+ {"matrix": [3, 12], "x":12.5, "y":3},
+ {"matrix": [3, 13], "x":13.5, "y":3, "w":1.5},
+ {"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},
+ {"matrix": [4, 3], "x":3.5, "y":4},
+ {"matrix": [4, 4], "x":4.5, "y":4},
+ {"matrix": [4, 5], "x":5.5, "y":4},
+ {"matrix": [4, 6], "x":6.5, "y":4},
+ {"matrix": [4, 7], "x":7.5, "y":4},
+ {"matrix": [4, 8], "x":8.5, "y":4},
+ {"matrix": [4, 9], "x":9.5, "y":4},
+ {"matrix": [4, 10], "x":10.5, "y":4},
+ {"matrix": [4, 11], "x":11.5, "y":4},
+ {"matrix": [4, 12], "x":12.5, "y":4},
+ {"matrix": [4, 13], "x":13.5, "y":4, "w":1.5}]
+ }
+ }
+}
diff --git a/keyboards/kradoindustries/promenade_rp24s/keymaps/default/keymap.c b/keyboards/kradoindustries/promenade_rp24s/keymaps/default/keymap.c
new file mode 100644
index 000000000000..ed36cc85fbb1
--- /dev/null
+++ b/keyboards/kradoindustries/promenade_rp24s/keymaps/default/keymap.c
@@ -0,0 +1,102 @@
+/*
+Copyright 2024 Matt F
+
+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
+
+
+#define _FN MO(3)
+#define FN_BACK LT(3, KC_BSPC)
+#define ZOOMIN C(KC_EQL)
+#define ZOOMOUT C(KC_MINS)
+#define NTAB C(KC_TAB)
+#define BTAB C(S(KC_TAB))
+
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+
+ /* Base Layer
+
+
+ * .-----------------------------------------------------------------------------------------------------------------------------------.
+ * | Grave | 1 | 2 | 3 | 4 | 5 | - | = | 6 | 7 | 8 | 9 | 0 | Backspace |
+ * | | | | | | | | | | | | | | |
+ * |-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------|
+ * | Tab | Q | W | E | R | T | [ | ] | Y | U | I | O | P | Del |
+ * | | | | | | | | | | | | | | |
+ * |-----------+--------+--------+--------+--------+--------|--------+--------|--------+--------+--------+-----------------+-----------|
+ * | FN_BACK | A | S | D | F | G | [ | ] | H | J | K | L | " | Enter |
+ * | | | | | | | | | | | | | ' | |
+ * |-----------+--------+--------+--------+--------+--------|--------+--------|--------+--------+--------------------------+-----------|
+ * | LShift | Z | X | C | V | B | BTab | NTab | N | M | < | > | ? | RShift |
+ * | | | | | | | | | | | , | . | / | |
+ * |-----------+--------+--------+--------+--------+-----------------+--------+--------+--------+-----------------+--------+-----------|
+ * | LCTRL | LGUI | LALT | FN | Space | Space |Space |Space | Space | Space | Space | RALT | FN | RCTRL |
+ * | | | | | | | | | | | | | | |
+ * '-----------------------------------------------------------------------------------------------------------------------------------'
+ */
+
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MINS, KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRC, KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL,
+ FN_BACK, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LBRC, KC_RBRC, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT,
+ SC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, BTAB, NTAB, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SC_RSPC,
+ KC_LCTL, KC_LGUI, KC_LALT, _FN, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, _FN, KC_RCTL
+ ),
+
+ [1] = LAYOUT( /* Layer One */
+
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MINS, KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRC, KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LBRC, KC_RBRC, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_PGUP, KC_PGDN, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LCTL, KC_LGUI, KC_LALT, _FN, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, _FN, KC_RCTL
+ ),
+
+
+ [2] = LAYOUT( /* Layer Two */
+
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MINS, KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, ZOOMIN, KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL,
+ FN_BACK, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LBRC, KC_RBRC, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, ZOOMOUT, KC_LBRC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LCTL, KC_LGUI, KC_LALT, _FN, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, _FN, KC_RCTL
+ ),
+
+ [3] = LAYOUT( /* Layer Three */
+
+ 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_HOME, KC_UP, KC_END, KC_PGUP, _______, DF(0) , DF(1) , _______, _______, _______, _______, KC_PSCR, KC_BSLS,
+ _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______, _______, _______, _______, _______, _______, _______, KC_SCLN, KC_QUOT,
+ _______, _______, _______, _______, _______, _______, DF(2) , _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, KC_BSLS, KC_CAPS,
+ _______, _______, _______, _______, _______, _______, KC_ENT, KC_ENT, _______, _______, _______, _______, _______, QK_BOOT
+ )
+
+};
+
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
+ [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(UG_NEXT, UG_PREV),
+ ENCODER_CCW_CW(KC_LBRC, KC_RBRC), ENCODER_CCW_CW(C(KC_MINS), C(KC_EQL)),
+ ENCODER_CCW_CW(C(KC_Z), C(S(KC_Z))), ENCODER_CCW_CW(KC_PGUP, KC_PGDN),
+ ENCODER_CCW_CW(KC_WH_U, KC_WH_D), ENCODER_CCW_CW(KC_UP, KC_DOWN)},
+ [1 ... 3] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______),
+ ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______),
+ ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______),
+ ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______)}
+};
+#endif
\ No newline at end of file
diff --git a/keyboards/kradoindustries/promenade_rp24s/keymaps/default/rules.mk b/keyboards/kradoindustries/promenade_rp24s/keymaps/default/rules.mk
new file mode 100644
index 000000000000..a40474b4d5c7
--- /dev/null
+++ b/keyboards/kradoindustries/promenade_rp24s/keymaps/default/rules.mk
@@ -0,0 +1 @@
+ENCODER_MAP_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/kradoindustries/promenade_rp24s/readme.md b/keyboards/kradoindustries/promenade_rp24s/readme.md
new file mode 100644
index 000000000000..9685cb829635
--- /dev/null
+++ b/keyboards/kradoindustries/promenade_rp24s/readme.md
@@ -0,0 +1,29 @@
+# Promenade RP24S
+
+![Promenade RP24S](https://i.imgur.com/uQOhmmJ.jpeg)
+
+The Promenade RP24S is the solder version of the [Promenade](https://github.com/qmk/qmk_firmware/tree/master/keyboards/kradoindustries/promenade) pcb which is based on the [Boardwalk](https://github.com/qmk/qmk_firmware/tree/master/keyboards/boardwalk), a 60% ortholinear keyboard that uses 1.5u Ergodoxian modifier keys. The original Boardwalk's split hand and 65% layouts are supported, and a new 50% extended layout similar to [RGBKB's Pan](https://github.com/qmk/qmk_firmware/tree/master/keyboards/rgbkb/pan) with two right-side macro columns was also added. In addition to Pok3r-style 60% tray mounting points, the pcb also has edge cuts for use in gummy o-ring mount boards like the Bakeneko60. Some additional spacebar options including 3u, 6u, and triple 2u were added. The pcb has two footprint locations for a JST connector, many breakout pins, and 19 rotary encoder locations. The MCU has been upgraded to a RP2040 with 32M-bit of flash memory.
+
+
+* Keyboard Maintainer: [Feags](https://github.com/Feags) / [Krado Industries](https://kradoindustries.com/)
+* Hardware Supported: Promenade pcb. Many 60% cases.
+* Hardware Availability: [Krado Industries](https://kradoindustries.com/)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make kradoindustries/promenade_rp24s:default
+
+Flashing example for this keyboard:
+
+ make kradoindustries/promenade_rp24s:default:flash
+
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+## Bootloader
+
+Enter the bootloader in 3 ways:
+
+* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
+* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
\ No newline at end of file
diff --git a/keyboards/lostdotfish/rp2040_orbweaver/config.h b/keyboards/lostdotfish/rp2040_orbweaver/config.h
new file mode 100644
index 000000000000..da2709dc5b39
--- /dev/null
+++ b/keyboards/lostdotfish/rp2040_orbweaver/config.h
@@ -0,0 +1,21 @@
+/* Copyright 2024 lostdotfish
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 2 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+#define I2C_DRIVER I2CD0
+#define I2C1_SDA_PIN GP12
+#define I2C1_SCL_PIN GP13
+#define IS31FL3731_I2C_ADDRESS_1 IS31FL3731_I2C_ADDRESS_GND
diff --git a/keyboards/lostdotfish/rp2040_orbweaver/keyboard.json b/keyboards/lostdotfish/rp2040_orbweaver/keyboard.json
new file mode 100644
index 000000000000..b711d9c4a89f
--- /dev/null
+++ b/keyboards/lostdotfish/rp2040_orbweaver/keyboard.json
@@ -0,0 +1,141 @@
+
+{
+ "manufacturer": "Lostdotfish",
+ "keyboard_name": "rp2040_orbweaver",
+ "maintainer": "Lostdotfish",
+ "url": "https://geekhack.org/index.php?topic=124092.0",
+ "bootloader": "rp2040",
+ "processor": "RP2040",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x0000",
+ "vid": "0xFEED"
+ },
+ "diode_direction": "ROW2COL",
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgb_matrix": true
+ },
+ "rgb_matrix": {
+ "driver": "is31fl3731",
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0, "flags": 4},
+ {"x": 20, "y": 0, "flags": 4},
+ {"matrix": [0, 1], "x": 40, "y": 0, "flags": 4},
+ {"matrix": [0, 2], "x": 60, "y": 0, "flags": 4},
+ {"matrix": [0, 3], "x": 80, "y": 0, "flags": 4},
+ {"matrix": [0, 4], "x": 0, "y": 20, "flags": 4},
+ {"matrix": [1, 0], "x": 20, "y": 20, "flags": 4},
+ {"matrix": [1, 1], "x": 40, "y": 20, "flags": 4},
+ {"matrix": [1, 2], "x": 60, "y": 20, "flags": 4},
+ {"matrix": [1, 3], "x": 80, "y": 20, "flags": 4},
+ {"matrix": [1, 4], "x": 0, "y": 40, "flags": 4},
+ {"matrix": [2, 0], "x": 20, "y": 40, "flags": 4},
+ {"matrix": [2, 1], "x": 40, "y": 40, "flags": 4},
+ {"matrix": [2, 2], "x": 60, "y": 40, "flags": 4},
+ {"matrix": [2, 3], "x": 80, "y": 40, "flags": 4},
+ {"matrix": [2, 4], "x": 0, "y": 60, "flags": 4},
+ {"matrix": [3, 0], "x": 20, "y": 60, "flags": 4},
+ {"matrix": [3, 1], "x": 40, "y": 60, "flags": 4},
+ {"matrix": [3, 2], "x": 60, "y": 60, "flags": 4},
+ {"matrix": [3, 4], "x": 80, "y": 60, "flags": 4}
+ ],
+ "led_flush_limit": 26,
+ "led_process_limit": 5,
+ "max_brightness": 220,
+ "sleep": true,
+ "center_point": [40, 30],
+ "animations": {
+ "alphas_mods": true,
+ "gradient_up_down": true,
+ "gradient_left_right": true,
+ "breathing": true,
+ "band_sat": true,
+ "band_val": true,
+ "band_pinwheel_sat": true,
+ "band_pinwheel_val": true,
+ "band_spiral_sat": true,
+ "band_spiral_val": true,
+ "cycle_all": true,
+ "cycle_left_right": true,
+ "cycle_up_down": true,
+ "cycle_out_in": true,
+ "cycle_out_in_dual": true,
+ "rainbow_moving_chevron": true,
+ "cycle_pinwheel": true,
+ "cycle_spiral": true,
+ "dual_beacon": true,
+ "rainbow_beacon": true,
+ "rainbow_pinwheels": true,
+ "flower_blooming": true,
+ "raindrops": true,
+ "jellybean_raindrops": true,
+ "hue_breathing": true,
+ "hue_pendulum": true,
+ "hue_wave": true,
+ "pixel_fractal": true,
+ "pixel_flow": true,
+ "pixel_rain": true,
+ "typing_heatmap": true,
+ "digital_rain": true,
+ "solid_reactive_simple": true,
+ "solid_reactive": true,
+ "solid_reactive_wide": true,
+ "solid_reactive_multiwide": true,
+ "solid_reactive_cross": true,
+ "solid_reactive_multicross": true,
+ "solid_reactive_nexus": true,
+ "solid_reactive_multinexus": true,
+ "splash": true,
+ "multisplash": true,
+ "solid_splash": true,
+ "solid_multisplash": true,
+ "starlight": true,
+ "starlight_dual_sat": true,
+ "starlight_dual_hue": true,
+ "riverflow": true
+ }
+},
+ "matrix_pins": {
+ "rows": ["GP0", "GP1", "GP2", "GP3", "GP10", "GP9"],
+ "cols": ["GP4", "GP5", "GP8", "GP7", "GP6"]
+ },
+
+ "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": [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": [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": [3, 0], "x": 0, "y": 3},
+ {"matrix": [3, 1], "x": 1, "y": 3},
+ {"matrix": [3, 2], "x": 2, "y": 3},
+ {"matrix": [3, 3], "x": 3, "y": 3},
+ {"matrix": [3, 4], "x": 4, "y": 3},
+ {"matrix": [4, 0], "x": 0, "y": 4},
+ {"matrix": [4, 1], "x": 1, "y": 4},
+ {"matrix": [4, 2], "x": 2, "y": 4},
+ {"matrix": [4, 3], "x": 3, "y": 4},
+ {"matrix": [4, 4], "x": 4, "y": 4},
+ {"matrix": [5, 0], "x": 0, "y": 5},
+ ]
+ }
+ }
+}
diff --git a/keyboards/lostdotfish/rp2040_orbweaver/keymaps/default/keymap.c b/keyboards/lostdotfish/rp2040_orbweaver/keymaps/default/keymap.c
new file mode 100644
index 000000000000..df59752ce0c4
--- /dev/null
+++ b/keyboards/lostdotfish/rp2040_orbweaver/keymaps/default/keymap.c
@@ -0,0 +1,90 @@
+/* Copyright 2024 lostdotfish
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 2 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include QMK_KEYBOARD_H
+
+
+enum orbweaver_layers {
+ _DEFAULT,
+ _LETTERS,
+ _CONTROL
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+//generic default keymap with Razor defaults (+ 20 shifts layer)
+
+ [_DEFAULT] = LAYOUT(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F,
+ KC_LSFT, KC_Z, KC_X, KC_C, TO(1),
+ KC_LALT, KC_UP, KC_DOWN, KC_RIGHT, KC_LEFT,
+ KC_SPACE
+ ),
+
+//Second example keymap with all modifier keys replaced with numbers or letters
+
+ [_LETTERS] = LAYOUT(
+ KC_0, KC_1, KC_2, KC_3, KC_4,
+ KC_I, KC_Q, KC_W, KC_E, KC_R,
+ KC_J, KC_A, KC_S, KC_D, KC_F,
+ KC_K, KC_Z, KC_X, KC_C, TO(2),
+ KC_L, KC_UP, KC_DOWN, KC_RIGHT, KC_LEFT,
+ KC_SPACE
+ ),
+
+//, RGB Contol Keymap
+ [_CONTROL] = LAYOUT(
+ RM_NEXT, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU,
+ RM_PREV, RM_HUED, RM_SATD, RM_VALD, RM_SPDD,
+ RM_TOGG, KC_A, KC_S, KC_D, KC_F,
+ KC_K, KC_Z, KC_X, KC_C, TO(0),
+ KC_L, KC_UP, KC_DOWN, KC_RIGHT, KC_LEFT,
+ KC_SPACE
+ )
+
+};
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+ gpio_write_pin_high(GP23);
+ gpio_write_pin_high(GP24);
+ gpio_write_pin_high(GP25);
+ switch (get_highest_layer(state)) {
+ case _DEFAULT:
+ gpio_write_pin_low(GP23);
+ break;
+ case _LETTERS:
+ gpio_write_pin_low(GP25);
+ break;
+ case _CONTROL:
+ gpio_write_pin_low(GP24);
+ break;
+ }
+ return state;
+}
+void suspend_power_down_kb(void) {
+ // code will run multiple times while keyboard is suspended
+ gpio_write_pin_high(GP23);
+ gpio_write_pin_high(GP24);
+ gpio_write_pin_high(GP25);
+ suspend_power_down_user();
+}
+
+void suspend_wakeup_init_kb(void) {
+ layer_state_set_kb(layer_state);
+ suspend_wakeup_init_user();
+}
diff --git a/keyboards/lostdotfish/rp2040_orbweaver/mcuconf.h b/keyboards/lostdotfish/rp2040_orbweaver/mcuconf.h
new file mode 100644
index 000000000000..f9b642b1f4e2
--- /dev/null
+++ b/keyboards/lostdotfish/rp2040_orbweaver/mcuconf.h
@@ -0,0 +1,9 @@
+// Copyright 2023 zzeneg (@zzeneg)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include_next
+
+#undef RP_I2C_USE_I2C0
+#define RP_I2C_USE_I2C0 TRUE
diff --git a/keyboards/lostdotfish/rp2040_orbweaver/readme.md b/keyboards/lostdotfish/rp2040_orbweaver/readme.md
new file mode 100644
index 000000000000..0a4a64d7d61c
--- /dev/null
+++ b/keyboards/lostdotfish/rp2040_orbweaver/readme.md
@@ -0,0 +1,51 @@
+# rp2040_orbweaver
+QMK firmware for RP2040 based MCU replacement PCB for the Razer Orbweaver gaming keypad
+
+![RP2040 Orbweaver](https://i.imgur.com/GCPRUbs.png)
+
+
+This firmware is for the Razer Orbweaver Chroma keypad with a custom, plug and play, RP2040 MCU PCB. For installation instructions and board availability see [geekhack](https://geekhack.org/index.php?topic=124092.0).
+
+The firmware controls a 6x5 key matrix (4x5 keypad + 6 additional keys on the thumb pad and up to 4 additional keys added by user). It also controls a IS31FL3731 RGB Matrix controller (on the Chroma model) via I2C interface. This requires a single I2C Driver with 20 common anode RGB LEDs.
+
+Key 20 (bottom right) is used to switch layers.
+
+The default key map provides 3 preset layers.
+
+(layer 0) is a generic layer based on the original Razer defaults.
+(layer 1) replaces modifier keys with letter keys.
+(layer 2) replaces the 2 top rows with RGB control keys.
+
+The three LEDs on the thumb pad indicate the active layer.
+
+Blue = layer 0
+Green = layer 1
+Yellow = layer 3
+
+All LEDs will be off when any other (user added) layout is activated
+
+A set of RGB animations are included in confg.h. These are controlled by activating the Yellow layer and using keys 01 - 11 (11 toggles the lighting on and off - see /keymaps/default/keymap.c for more information)
+
+Many thanks to a_marmot. Without his original handwired project, this board would not have been possible. His original work can be found here. [geekhack](https://geekhack.org/index.php?topic=119396.0).
+
+* Keyboard Maintainer: [Lostdotfish](https://github.com/Lostdotfish)
+* Hardware Supported: RP2040 + IS31FL3731
+* Hardware Availability: [https://geekhack.org/index.php?topic=124092.0](https://geekhack.org/index.php?topic=124092.0)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make lostdotfish/rp2040_orbweaver:default
+
+Flashing example for this keyboard:
+
+ make lostdotfish/rp2040_orbweaver: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:
+
+* Press and hold the upper left hand key on the main keyboard while you plug in the USB.
+* Press and release the boot button on the top of the RP2040_Orbweaver v2.0 inside the modded unit.
diff --git a/keyboards/lostdotfish/rp2040_orbweaver/rp2040_orbweaver.c b/keyboards/lostdotfish/rp2040_orbweaver/rp2040_orbweaver.c
new file mode 100644
index 000000000000..a1ba7c8d1fac
--- /dev/null
+++ b/keyboards/lostdotfish/rp2040_orbweaver/rp2040_orbweaver.c
@@ -0,0 +1,64 @@
+/* Copyright 2024 lostdotfish
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 2 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "rgb_matrix.h"
+#include "quantum.h"
+
+void keyboard_pre_init_kb(void) {
+ // Initialize Reset pins
+
+ gpio_set_pin_output(GP23);
+ gpio_set_pin_output(GP24);
+ gpio_set_pin_output(GP25);
+
+ gpio_write_pin_high(GP23);
+ gpio_write_pin_high(GP24);
+ gpio_write_pin_high(GP25);
+
+ keyboard_pre_init_user();
+}
+
+
+
+const is31fl3731_led_t PROGMEM g_is31fl3731_leds[IS31FL3731_LED_COUNT] = {
+/* Refer to IS31 manual for these locations
+ * driver
+ * | R location
+ * | | G location
+ * | | | B location
+ * | | | | */
+ {0, C9_1, C8_1, C7_1}, //top left key.
+ {0, C9_2, C8_2, C7_2},
+ {0, C9_3, C8_3, C7_3},
+ {0, C9_4, C8_4, C7_4},
+ {0, C9_5, C8_5, C7_5}, //top right key.
+ {0, C9_6, C8_6, C7_6},
+ {0, C9_7, C8_7, C6_6},
+ {0, C9_8, C7_7, C6_7},
+ {0, C1_8, C2_8, C3_8},
+ {0, C1_7, C2_7, C3_7},
+ {0, C1_6, C2_6, C3_6},
+ {0, C1_5, C2_5, C3_5},
+ {0, C1_4, C2_4, C3_4},
+ {0, C1_3, C2_3, C3_3},
+ {0, C1_2, C2_2, C4_3},
+ {0, C1_1, C3_2, C4_2}, //lower left key
+ {0, C9_9, C8_9, C7_9},
+ {0, C9_10, C8_10, C7_10},
+ {0, C9_11, C8_11, C7_11},
+ {0, C9_12, C8_12, C7_12} //lower right key
+
+};
diff --git a/keyboards/vt40/keyboard.json b/keyboards/vt40/keyboard.json
new file mode 100644
index 000000000000..4a8178b8d594
--- /dev/null
+++ b/keyboards/vt40/keyboard.json
@@ -0,0 +1,91 @@
+{
+ "manufacturer": "vladantrhlik",
+ "keyboard_name": "vt40",
+ "maintainer": "vladantrhlik",
+ "bootloader": "rp2040",
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "encoder": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true
+ },
+ "matrix_pins": {
+ "cols": ["GP6", "GP7", "GP8", "GP9", "GP10", "GP11", "GP12", "GP13", "GP21", "GP20", "GP19", "GP18", "GP22"],
+ "rows": ["GP2", "GP3", "GP4", "GP5"]
+ },
+ "encoder": {
+ "rotary": [
+ {"pin_a": "GP26", "pin_b": "GP16"},
+ {"pin_a": "GP27", "pin_b": "GP17"},
+ ]
+ },
+ "processor": "RP2040",
+ "url": "https://github.com/vladantrhlik/VT-40",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x0000",
+ "vid": "0xFEED"
+ },
+ "community_layouts": ["ortho_4x12"],
+ "layouts": {
+ "LAYOUT_ortho_4x12": {
+ "layout": [
+ {"label": "Tab", "matrix": [0, 0], "x": 0, "y": 0},
+ {"label": "Q", "matrix": [0, 1], "x": 1, "y": 0},
+ {"label": "W", "matrix": [0, 2], "x": 2, "y": 0},
+ {"label": "E", "matrix": [0, 3], "x": 3, "y": 0},
+ {"label": "R", "matrix": [0, 4], "x": 4, "y": 0},
+ {"label": "T", "matrix": [0, 5], "x": 5, "y": 0},
+ {"label": "Y", "matrix": [0, 6], "x": 6, "y": 0},
+ {"label": "U", "matrix": [0, 7], "x": 7, "y": 0},
+ {"label": "I", "matrix": [0, 8], "x": 8, "y": 0},
+ {"label": "O", "matrix": [0, 9], "x": 9, "y": 0},
+ {"label": "P", "matrix": [0, 10], "x": 10, "y": 0},
+ {"label": "BackSpace", "matrix": [0, 11], "x": 11, "y": 0},
+
+ {"label": "Esc", "matrix": [1, 0], "x": 0, "y": 1},
+ {"label": "A", "matrix": [1, 1], "x": 1, "y": 1},
+ {"label": "S", "matrix": [1, 2], "x": 2, "y": 1},
+ {"label": "D", "matrix": [1, 3], "x": 3, "y": 1},
+ {"label": "F", "matrix": [1, 4], "x": 4, "y": 1},
+ {"label": "G", "matrix": [1, 5], "x": 5, "y": 1},
+ {"label": "H", "matrix": [1, 6], "x": 6, "y": 1},
+ {"label": "J", "matrix": [1, 7], "x": 7, "y": 1},
+ {"label": "K", "matrix": [1, 8], "x": 8, "y": 1},
+ {"label": "L", "matrix": [1, 9], "x": 9, "y": 1},
+ {"label": ";", "matrix": [1, 10], "x": 10, "y": 1},
+ {"label": "'", "matrix": [1, 11], "x": 11, "y": 1},
+
+ {"label": "Shift", "matrix": [2, 0], "x": 0, "y": 2},
+ {"label": "Z", "matrix": [2, 1], "x": 1, "y": 2},
+ {"label": "X", "matrix": [2, 2], "x": 2, "y": 2},
+ {"label": "C", "matrix": [2, 3], "x": 3, "y": 2},
+ {"label": "V", "matrix": [2, 4], "x": 4, "y": 2},
+ {"label": "B", "matrix": [2, 5], "x": 5, "y": 2},
+ {"label": "N", "matrix": [2, 6], "x": 6, "y": 2},
+ {"label": "M", "matrix": [2, 7], "x": 7, "y": 2},
+ {"label": ",", "matrix": [2, 8], "x": 8, "y": 2},
+ {"label": ".", "matrix": [2, 9], "x": 9, "y": 2},
+ {"label": "/", "matrix": [2, 10], "x": 10, "y": 2},
+ {"label": "Return", "matrix": [2, 11], "x": 11, "y": 2},
+
+ {"matrix": [3, 0], "x": 0, "y": 3},
+ {"label": "Ctrl", "matrix": [3, 1], "x": 1, "y": 3},
+ {"label": "Alt", "matrix": [3, 2], "x": 2, "y": 3},
+ {"label": "Super", "matrix": [3, 3], "x": 3, "y": 3},
+ {"label": "⇓", "matrix": [3, 4], "x": 4, "y": 3},
+ {"matrix": [3, 5], "x": 5, "y": 3},
+ {"matrix": [3, 6], "x": 6, "y": 3},
+ {"label": "⇑", "matrix": [3, 7], "x": 7, "y": 3},
+ {"label": "←", "matrix": [3, 8], "x": 8, "y": 3},
+ {"label": "↓", "matrix": [3, 9], "x": 9, "y": 3},
+ {"label": "↑", "matrix": [3, 10], "x": 10, "y": 3},
+ {"label": "→", "matrix": [3, 11], "x": 11, "y": 3}
+ ]
+ }
+ }
+}
diff --git a/keyboards/vt40/keymaps/default/keymap.c b/keyboards/vt40/keymaps/default/keymap.c
new file mode 100644
index 000000000000..95bd31083fd8
--- /dev/null
+++ b/keyboards/vt40/keymaps/default/keymap.c
@@ -0,0 +1,144 @@
+// Copyright 2023 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+
+enum layers {
+ _QWERTY,
+ _COLEMAK,
+ _DVORAK,
+ _LOWER,
+ _RAISE,
+ _ADJUST
+};
+
+#define LOWER MO(_LOWER)
+#define RAISE MO(_RAISE)
+#define ADJUST MO(_ADJUST)
+#define QWERTY PDF(_QWERTY)
+#define COLEMAK PDF(_COLEMAK)
+#define DVORAK PDF(_DVORAK)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ /* Qwerty
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | A | S | D | F | G | H | J | K | L | ; | " |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Caps | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [_QWERTY] = LAYOUT_ortho_4x12(
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
+ KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT ,
+ KC_CAPS, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+ ),
+
+ /* Colemak
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | A | R | S | T | D | H | N | E | I | O | " |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Caps | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [_COLEMAK] = LAYOUT_ortho_4x12(
+ KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC,
+ KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT ,
+ KC_CAPS, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+ ),
+
+ /* Dvorak
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | A | O | E | U | I | D | H | T | N | S | / |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Caps | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [_DVORAK] = LAYOUT_ortho_4x12(
+ KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC,
+ KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH,
+ KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT ,
+ KC_CAPS, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+ ),
+
+ /* Lower
+ * ,-----------------------------------------------------------------------------------.
+ * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | Home | End | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [_LOWER] = LAYOUT_ortho_4x12(
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC,
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE,
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+ ),
+
+ /* Raise
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / |Pg Up |Pg Dn | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |ADJUST| | | | | | | | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [_RAISE] = LAYOUT_ortho_4x12(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______,
+ ADJUST, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+ ),
+
+ /* Adjust (Lower + Raise)
+ * ,-----------------------------------------------------------------------------------.
+ * | | Reset| | | | | | | | | | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | | | | |AGnorm|AGswap|Qwerty|Colemk|Dvorak| | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | | | | | | | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | | | |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [_ADJUST] = LAYOUT_ortho_4x12(
+ _______, QK_BOOT, DB_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL ,
+ _______, _______, _______, _______, _______, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+
+};
+
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
+ [0] = { ENCODER_CCW_CW(KC_PGUP, KC_PGDN), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+ [1] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) },
+ [2] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) },
+ [3] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) },
+ [4] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) },
+ [5] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) }
+};
+#endif
diff --git a/keyboards/vt40/keymaps/default/rules.mk b/keyboards/vt40/keymaps/default/rules.mk
new file mode 100644
index 000000000000..ee325681483f
--- /dev/null
+++ b/keyboards/vt40/keymaps/default/rules.mk
@@ -0,0 +1 @@
+ENCODER_MAP_ENABLE = yes
diff --git a/keyboards/vt40/readme.md b/keyboards/vt40/readme.md
new file mode 100644
index 000000000000..0d87b011345a
--- /dev/null
+++ b/keyboards/vt40/readme.md
@@ -0,0 +1,24 @@
+# VT-40
+
+* Keyboard Maintainer: [Guido Bartolucci](https://github.com/guidoism)
+* Hardware Supported: Raspberry Pi Pico (RP2040)
+* Hardware Availability: https://github.com/vladantrhlik/VT-40
+
+Make example for this keyboard (after setting up your build environment):
+
+ make vt40:default
+
+Flashing example for this keyboard:
+
+ make vt40: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
+