Compare commits

...

9 Commits

Author SHA1 Message Date
PluskbID
a570e960d3 Merge d0bb586264 into b4bdf3f1d5 2025-09-10 01:53:40 -07:00
diegorodriguezv
b4bdf3f1d5 Update data_driven_config.md (#25612) 2025-09-10 01:52:25 -07:00
Joel Challis
c4ccbf06e1 Fix silakka54 layout (#25643) 2025-09-10 09:11:46 +01:00
diegorodriguezv
24c05ff1c7 Correct link in porting_your_keyboard_to_qmk.md (#25635)
Fixed anchor
2025-09-09 19:44:47 -06:00
diegorodriguezv
65e1afe0af Correct link in faq_general.md (#25640)
Updated the link to the QMK trademark page.
2025-09-09 19:43:28 -06:00
Freather
d0bb586264 Update readme.md 2025-09-02 21:53:22 +08:00
Freather
dc90cd54b0 Revert "Update readme.md"
This reverts commit 475d4ff3b9.
2025-09-02 21:50:15 +08:00
Freather
475d4ff3b9 Update readme.md 2025-09-02 21:48:56 +08:00
Freather
19a6c90aac Add Electra 80 PCB
Add Electra 80 PCB
2025-09-02 21:37:56 +08:00
14 changed files with 334 additions and 32 deletions

View File

@@ -6,7 +6,7 @@ This page describes how QMK's data driven JSON configuration system works. It is
Historically QMK has been configured through a combination of two mechanisms- `rules.mk` and `config.h`. While this worked well when QMK was only a handful of keyboards we've grown to encompass nearly 4000 supported keyboards. That extrapolates out to 6000 configuration files under `keyboards/` alone! The freeform nature of these files and the unique patterns people have used to avoid duplication have made ongoing maintenance a challenge, and a large number of our keyboards follow patterns that are outdated and sometimes harder to understand.
We have also been working on bringing the power of QMK to people who aren't comformable with a CLI, and other projects such as VIA are working to make using QMK as easy as installing a program. These tools need information about how a keyboard is laid out or what pins and features are available so that users can take full advantage of QMK. We introduced `info.json` as a first step towards this. The QMK API is an effort to combine these 3 sources of information- `config.h`, `rules.mk`, and `info.json`- into a single source of truth that end-user tools can use.
We have also been working on bringing the power of QMK to people who aren't comfortable with a CLI, and other projects such as VIA are working to make using QMK as easy as installing a program. These tools need information about how a keyboard is laid out or what pins and features are available so that users can take full advantage of QMK. We introduced `info.json` as a first step towards this. The QMK API is an effort to combine these 3 sources of information- `config.h`, `rules.mk`, and `info.json`- into a single source of truth that end-user tools can use.
Now we have support for generating `rules.mk` and `config.h` values from `info.json`, allowing us to have a single source of truth. This will allow us to use automated tooling to maintain keyboards saving a lot of time and maintenance work.

View File

@@ -38,7 +38,7 @@ Awesome! Open up a Pull Request for it. We'll review the code, and merge it!
That's amazing! We would love to assist you with that!
In fact, we have a [whole page](https://qmk.fm/powered/) dedicated to adding QMK Branding to your page and keyboard. This covers pretty much everything you need (knowledge and images) to officially support QMK.
In fact, we have a [whole page](https://qmk.fm/trademark) dedicated to adding QMK Branding to your page and keyboard. This covers pretty much everything you need (knowledge and images) to officially support QMK.
If you have any questions about this, open an issue or head to [Discord](https://discord.gg/qmk).

View File

@@ -164,7 +164,7 @@ There are a lot of features that can be turned on or off, configured or tuned. S
### Configuration Options
For available options for `config.h`, you should see the [Config Options](config_options#the-configh-file) page for more details.
For available options for `config.h`, you should see the [Config Options](config_options#the-config-h-file) page for more details.
### Build Options

View File

@@ -0,0 +1,17 @@
// Copyright 2025 PluskbID
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
/* disable debug print */
//#define NO_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT

View File

@@ -0,0 +1,58 @@
/* Copyright 2025 PluskbID
*
* 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 "quantum.h"
const rgblight_segment_t PROGMEM my_capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS(
{0, 1, HSV_WHITE}
);
const rgblight_segment_t PROGMEM my_capsoff_layer[] = RGBLIGHT_LAYER_SEGMENTS(
{0, 1, HSV_BLACK}
);
const rgblight_segment_t PROGMEM my_scrlk_layer[] = RGBLIGHT_LAYER_SEGMENTS(
{2, 1, HSV_WHITE}
);
const rgblight_segment_t PROGMEM my_scrlkoff_layer[] = RGBLIGHT_LAYER_SEGMENTS(
{2, 1, HSV_BLACK}
);
// Now define the array of layers. Later layers take precedence
const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(
my_capslock_layer,
my_capsoff_layer,
my_scrlk_layer,
my_scrlkoff_layer
);
void keyboard_post_init_kb(void){
rgblight_layers = my_rgb_layers;
}
bool led_update_kb(led_t led_state){
bool res = led_update_user(led_state);
if (res) {
rgblight_set_layer_state(0, led_state.caps_lock);
rgblight_set_layer_state(1, !led_state.caps_lock);
rgblight_set_layer_state(2, led_state.scroll_lock);
rgblight_set_layer_state(3, !led_state.scroll_lock);
}
return res;
}

View File

@@ -0,0 +1,13 @@
{
"keyboard_name": "Electra 80 Hotswap",
"matrix_pins": {
"cols": ["B12", "A13", "B13", "B14", "B15", "A8", "B1", "B2", "B10", "B11", "A6", "A5", "A4", "A3", "A14", "A15", "B6", "B7"],
"rows": ["B3", "B5", "B4", "B0", "C14", "C13"]
},
"usb": {
"pid": "0x0080"
},
"ws2812": {
"pin": "A2"
}
}

View File

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

View File

@@ -0,0 +1,134 @@
{
"manufacturer": "PlusKBD",
"maintainer": "PluskbID",
"bootloader": "stm32-dfu",
"diode_direction": "COL2ROW",
"features": {
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": true,
"rgblight": true
},
"processor": "STM32F072",
"url": "",
"usb": {
"device_version": "1.0.0",
"vid": "0x454C"
},
"rgblight": {
"led_count": 3,
"sleep": true,
"layers":
{
"enabled": 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
}
},
"layouts": {
"LAYOUT_all": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 2, "y": 0},
{"matrix": [0, 2], "x": 3, "y": 0},
{"matrix": [0, 3], "x": 4, "y": 0},
{"matrix": [0, 4], "x": 5, "y": 0},
{"matrix": [0, 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, "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, 12], "x": 12.75, "y": 3.25, "w": 2.25},
{"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25},
{"matrix": [4, 2], "x": 2.25, "y": 4.25},
{"matrix": [4, 3], "x": 3.25, "y": 4.25},
{"matrix": [4, 4], "x": 4.25, "y": 4.25},
{"matrix": [4, 5], "x": 5.25, "y": 4.25},
{"matrix": [4, 6], "x": 6.25, "y": 4.25},
{"matrix": [4, 7], "x": 7.25, "y": 4.25},
{"matrix": [4, 8], "x": 8.25, "y": 4.25},
{"matrix": [4, 9], "x": 9.25, "y": 4.25},
{"matrix": [4, 10], "x": 10.25, "y": 4.25},
{"matrix": [4, 11], "x": 11.25, "y": 4.25},
{"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 2.75},
{"matrix": [4, 16], "x": 16.25, "y": 4.25},
{"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.25},
{"matrix": [5, 1], "x": 1.25, "y": 5.25, "w": 1.25},
{"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.25},
{"matrix": [5, 6], "x": 3.75, "y": 5.25, "w": 6.25},
{"matrix": [5, 9], "x": 10, "y": 5.25, "w": 1.25},
{"matrix": [5, 10], "x": 11.25, "y": 5.25, "w": 1.25},
{"matrix": [5, 11], "x": 12.5, "y": 5.25, "w": 1.25},
{"matrix": [5, 12], "x": 13.75, "y": 5.25, "w": 1.25},
{"matrix": [5, 15], "x": 15.25, "y": 5.25},
{"matrix": [5, 16], "x": 16.25, "y": 5.25},
{"matrix": [5, 17], "x": 17.25, "y": 5.25}
]
}
}
}

View File

@@ -0,0 +1,39 @@
// Copyright 2025 QMK
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/*
* ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
* │Esc│ │F1 │F2 │F3 │F4 │ │F5 │F6 │F7 │F8 │ │F9 │F10│F11│F12│ │PSc│Scr│Pse│
* └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐
* │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Backsp│ │Ins│Hom│PgU│
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤
* │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │ │Del│End│PgD│
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘
* │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │
* ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ ┌───┐
* │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift │ │ ↑ │
* ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐
* │Ctrl│GUI │Alt │ │ Alt│ GUI│Menu│Ctrl│ │ ← │ ↓ │ → │
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘
*/
[0] = LAYOUT_all(
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SCRL, KC_PAUS,
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
)
};
extern rgblight_config_t rgblight_config;
void keyboard_post_init_user(void) {
rgblight_sethsv_range(HSV_BLUE, 1,1);
rgblight_mode(RGBLIGHT_MODE_BREATHING);
}

View File

@@ -0,0 +1,27 @@
# electra80
![electra80](imgur.com image replace me!)
*A short description of the keyboard/project*
* Keyboard Maintainer: [PluskbID](https://github.com/PluskbID)
* Hardware Supported: Electra80 PCB, STM32F072
* Hardware Availability: http://plexkbd.com/
Make example for this keyboard (after setting up your build environment):
make electra80:default
Flashing example for this keyboard:
make electra80: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

View File

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

View File

@@ -0,0 +1,13 @@
{
"keyboard_name": "Electra80 Solder",
"matrix_pins": {
"cols": ["A8", "B15", "B14", "B13", "B12", "A13", "B11", "B10", "B1", "B2", "A3", "A4", "A5", "A6", "A14", "A15", "B6", "B7"],
"rows": ["B3", "B5", "B4", "A7", "C14", "C13"]
},
"usb": {
"pid": "0x0080"
},
"ws2812": {
"pin": "B0"
}
}

View File

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

View File

@@ -40,12 +40,12 @@
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [5, 5], "x": 0, "y": 5},
{"matrix": [5, 4], "x": 1, "y": 5},
{"matrix": [5, 3], "x": 2, "y": 5},
{"matrix": [5, 2], "x": 3, "y": 5},
{"matrix": [5, 1], "x": 4, "y": 5},
{"matrix": [5, 0], "x": 5, "y": 5},
{"matrix": [5, 5], "x": 7, "y": 0},
{"matrix": [5, 4], "x": 8, "y": 0},
{"matrix": [5, 3], "x": 9, "y": 0},
{"matrix": [5, 2], "x": 10, "y": 0},
{"matrix": [5, 1], "x": 11, "y": 0},
{"matrix": [5, 0], "x": 12, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1},
@@ -55,12 +55,12 @@
{"matrix": [1, 4], "x": 4, "y": 1},
{"matrix": [1, 5], "x": 5, "y": 1},
{"matrix": [6, 5], "x": 0, "y": 6},
{"matrix": [6, 4], "x": 1, "y": 6},
{"matrix": [6, 3], "x": 2, "y": 6},
{"matrix": [6, 2], "x": 3, "y": 6},
{"matrix": [6, 1], "x": 4, "y": 6},
{"matrix": [6, 0], "x": 5, "y": 6},
{"matrix": [6, 5], "x": 7, "y": 1},
{"matrix": [6, 4], "x": 8, "y": 1},
{"matrix": [6, 3], "x": 9, "y": 1},
{"matrix": [6, 2], "x": 10, "y": 1},
{"matrix": [6, 1], "x": 11, "y": 1},
{"matrix": [6, 0], "x": 12, "y": 1},
{"matrix": [2, 0], "x": 0, "y": 2},
{"matrix": [2, 1], "x": 1, "y": 2},
@@ -69,12 +69,12 @@
{"matrix": [2, 4], "x": 4, "y": 2},
{"matrix": [2, 5], "x": 5, "y": 2},
{"matrix": [7, 5], "x": 0, "y": 7},
{"matrix": [7, 4], "x": 1, "y": 7},
{"matrix": [7, 3], "x": 2, "y": 7},
{"matrix": [7, 2], "x": 3, "y": 7},
{"matrix": [7, 1], "x": 4, "y": 7},
{"matrix": [7, 0], "x": 5, "y": 7},
{"matrix": [7, 5], "x": 7, "y": 2},
{"matrix": [7, 4], "x": 8, "y": 2},
{"matrix": [7, 3], "x": 9, "y": 2},
{"matrix": [7, 2], "x": 10, "y": 2},
{"matrix": [7, 1], "x": 11, "y": 2},
{"matrix": [7, 0], "x": 12, "y": 2},
{"matrix": [3, 0], "x": 0, "y": 3},
{"matrix": [3, 1], "x": 1, "y": 3},
@@ -83,22 +83,20 @@
{"matrix": [3, 4], "x": 4, "y": 3},
{"matrix": [3, 5], "x": 5, "y": 3},
{"matrix": [8, 5], "x": 0, "y": 9},
{"matrix": [8, 4], "x": 1, "y": 9},
{"matrix": [8, 3], "x": 2, "y": 9},
{"matrix": [8, 2], "x": 3, "y": 9},
{"matrix": [8, 1], "x": 4, "y": 9},
{"matrix": [8, 0], "x": 5, "y": 9},
{"matrix": [8, 5], "x": 7, "y": 3},
{"matrix": [8, 4], "x": 8, "y": 3},
{"matrix": [8, 3], "x": 9, "y": 3},
{"matrix": [8, 2], "x": 10, "y": 3},
{"matrix": [8, 1], "x": 11, "y": 3},
{"matrix": [8, 0], "x": 12, "y": 3},
{"matrix": [4, 3], "x": 3, "y": 4},
{"matrix": [4, 4], "x": 4, "y": 4},
{"matrix": [4, 5], "x": 5, "y": 4},
{"matrix": [9, 5], "x": 3, "y": 9},
{"matrix": [9, 4], "x": 4, "y": 9},
{"matrix": [9, 3], "x": 5, "y": 9}
{"matrix": [9, 5], "x": 7, "y": 4},
{"matrix": [9, 4], "x": 8, "y": 4},
{"matrix": [9, 3], "x": 9, "y": 4}
]
}
}