mirror of
https://github.com/qmk/qmk_firmware.git
synced 2026-10-01 22:40:11 +02:00
Merge remote-tracking branch 'origin/develop' into xap
This commit is contained in:
@@ -0,0 +1,47 @@
|
|||||||
|
// Copyright 2025 Jacek Królikowski (@nietaki)
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include QMK_KEYBOARD_H
|
||||||
|
|
||||||
|
enum custom_keycodes {
|
||||||
|
_QWERTY,
|
||||||
|
_FUN,
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
|
||||||
|
[_QWERTY] = LAYOUT(
|
||||||
|
//┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐
|
||||||
|
KC_GRV ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_BSPC
|
||||||
|
//├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤
|
||||||
|
,KC_TAB ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,KC_INS , KC_DEL ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,KC_BSLS
|
||||||
|
//├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤
|
||||||
|
,KC_ESC ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,KC_LBRC , KC_RBRC ,KC_H ,KC_J ,KC_K ,KC_L ,KC_SCLN ,KC_QUOT
|
||||||
|
//├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤
|
||||||
|
,KC_LSFT ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,TO(0) , TO(1) ,KC_N ,KC_M ,KC_COMM ,KC_DOT ,KC_SLSH ,KC_RSFT
|
||||||
|
//├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┐ ┌────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤
|
||||||
|
,KC_LCTL ,KC_LGUI ,KC_LGUI ,MO(1) , KC_LALT , KC_SPC ,KC_EQL , KC_ENT , KC_MINS, KC_RALT , KC_LEFT ,KC_DOWN ,KC_UP ,KC_RGHT
|
||||||
|
//└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘
|
||||||
|
// ┌───────────┬───────────┬───────────┐
|
||||||
|
,MS_BTN1 ,MS_BTN3 ,MS_BTN2
|
||||||
|
// └───────────┴───────────┴───────────┘
|
||||||
|
),
|
||||||
|
|
||||||
|
[_FUN] = LAYOUT(
|
||||||
|
//┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐
|
||||||
|
_______ ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 , KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,_______
|
||||||
|
//├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤
|
||||||
|
,_______ ,KC_F11 ,KC_F12 ,_______ ,_______ ,_______ ,QK_BOOT , RMS_TOG ,_______ ,_______ ,_______ ,_______ ,_______ ,_______
|
||||||
|
//├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤
|
||||||
|
,TO(0) ,_______ ,_______ ,_______ ,_______ ,_______ ,QK_RBT , RMS_OFF ,KC_MPRV ,KC_VOLD , KC_VOLU,KC_MNXT ,KC_MPLY ,_______
|
||||||
|
//├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤
|
||||||
|
,KC_CAPS ,_______ ,_______ ,BL_STEP ,_______ ,_______ ,_______ , _______ ,TO(0) ,QK_LLCK ,_______ ,_______ ,_______ ,_______
|
||||||
|
//├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┐ ┌────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤
|
||||||
|
,_______ ,_______ ,_______ ,_______ , _______ , _______ ,_______ , _______ , _______ , _______ , KC_HOME ,KC_PGDN ,KC_PGUP ,KC_END
|
||||||
|
//└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘
|
||||||
|
// ┌───────────┬───────────┬───────────┐
|
||||||
|
,MS_WHLD ,MS_WHLU , _______
|
||||||
|
// └───────────┴───────────┴───────────┘
|
||||||
|
),
|
||||||
|
};
|
||||||
|
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
# Revolt
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
- Keyboard Maintainer: [Jacek Królikowski](https://github.com/nietaki)
|
||||||
|
- Hardware Supported: RPI 2040, Revolt Keyboard rev2
|
||||||
|
- Hardware Availability:
|
||||||
|
- [purchase from NTK studio](https://ntkstudio.net/products/revolt-keyboard/)
|
||||||
|
- [make your own](https://github.com/nietaki/revolt-keyboard) (Kicad, CC-BY-SA-4.0 license)
|
||||||
|
|
||||||
|
## Non-basic functionality
|
||||||
|
|
||||||
|
- backlight cycling
|
||||||
|
- midi (advanced) functionality is enabled (although currently not mapped in the default keymap)
|
||||||
|
- capslock indicator is mapped to the LED on the underside of the RP2040 board
|
||||||
|
- You can use the custom keycodes: `RMS_ON` to enable the joystick mouse and `RMS_OFF` to disable it, `RMS_TOG` to toggle it.
|
||||||
|
- it can be useful in case the joystick potentiometers wear out and you don't have a spare
|
||||||
|
- the setting is saved in EEPROM, so the behaviour will be retained if you unplug the keyboard and plug it back in.
|
||||||
|
|
||||||
|
## Revisions
|
||||||
|
|
||||||
|
The firmware revision you want to use is determined by the revision of the commander
|
||||||
|
PCB. You want the largest revision number that's less than or equal to your commander PCB revision.
|
||||||
|
|
||||||
|
So if you have commander PCB rev3, you want to use firmware rev2, unless rev3 is available. Firmware rev4 is likely incompatible with rev3 commander PCBs.
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
Make example for this keyboard (after setting up your build environment), using the `default` keymap:
|
||||||
|
|
||||||
|
$ make revolt/rev2:default
|
||||||
|
# alternatively, using qmk cli
|
||||||
|
$ qmk compile -kb revolt/rev2 -km default
|
||||||
|
|
||||||
|
This will create a `revolt_rev2_default.uf2` file in the root `qmk_firmware` repo directory.
|
||||||
|
|
||||||
|
Flash the firmware by putting the kyboard into the bootloader mode and copying the compiled `.uf2` file into the `RPI-RP2` drive that appears.
|
||||||
|
|
||||||
|
## Bootloader
|
||||||
|
|
||||||
|
Enter the bootloader in one of 3 ways:
|
||||||
|
|
||||||
|
- **Bootmagic reset**: Hold down the top left key of the left hand board and plug in or reset the keyboard
|
||||||
|
- **Physical reset button**: Briefly press the reset button on the top side of the Commander board
|
||||||
|
- **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
// Copyright 2025 Jacek Królikowski (@nietaki)
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#define BACKLIGHT_PWM_DRIVER PWMD6
|
||||||
|
#define BACKLIGHT_PWM_CHANNEL RP2040_PWM_CHANNEL_A
|
||||||
|
|
||||||
|
#define ANALOG_JOYSTICK_READ_INTERVAL 2
|
||||||
|
#define ANALOG_JOYSTICK_X_AXIS_PIN GP26
|
||||||
|
#define ANALOG_JOYSTICK_Y_AXIS_PIN GP27
|
||||||
|
#define ANALOG_JOYSTICK_AUTO_AXIS
|
||||||
|
|
||||||
|
// Lower Values Create Faster Movement
|
||||||
|
#define ANALOG_JOYSTICK_SPEED_REGULATOR 10
|
||||||
|
|
||||||
|
// Weights topping out at 100 early to account for the circular gate of the PSP joystick
|
||||||
|
// JSON.stringify(Array.from(Array(101).keys()).map(x =>Math.min(Math.round( x / 4 + Math.pow(Math.max(x - 20, 0), 3)/2000), 100)))
|
||||||
|
#define ANALOG_JOYSTICK_WEIGHTS {0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 10, 10, 11, 12, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 26, 28, 29, 31, 33, 35, 37, 40, 42, 44, 47, 50, 53, 56, 59, 62, 65, 69, 72, 76, 80, 84, 88, 93, 97, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100}
|
||||||
|
|
||||||
|
#define MIDI_ADVANCED
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
// Copyright 2025 Jacek Królikowski (@nietaki)
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#define HAL_USE_PWM TRUE
|
||||||
|
|
||||||
|
#include_next <halconf.h>
|
||||||
@@ -0,0 +1,131 @@
|
|||||||
|
{
|
||||||
|
"manufacturer": "NTK studio",
|
||||||
|
"keyboard_name": "revolt/rev2",
|
||||||
|
"maintainer": "nietaki",
|
||||||
|
"backlight": {
|
||||||
|
"pin": "GP28"
|
||||||
|
},
|
||||||
|
"bootloader": "rp2040",
|
||||||
|
"bootloader_instructions": "hold the button on the MCU while plugging in the keyboard (or pressing the reset button on the top surface of the commander board)",
|
||||||
|
"diode_direction": "COL2ROW",
|
||||||
|
"dynamic_keymap": {
|
||||||
|
"layer_count": 7
|
||||||
|
},
|
||||||
|
"features": {
|
||||||
|
"backlight": true,
|
||||||
|
"bootmagic": true,
|
||||||
|
"extrakey": true,
|
||||||
|
"layer_lock": true,
|
||||||
|
"midi": true,
|
||||||
|
"mousekey": true,
|
||||||
|
"nkro": true,
|
||||||
|
"pointing_device": true
|
||||||
|
},
|
||||||
|
"indicators": {
|
||||||
|
"caps_lock": "GP25"
|
||||||
|
},
|
||||||
|
"keycodes": [
|
||||||
|
{
|
||||||
|
"key": "RMS_OFF",
|
||||||
|
"label": "revolt mouse off"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "RMS_ON",
|
||||||
|
"label": "revolt mouse on"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "RMS_TOG",
|
||||||
|
"label": "revolt mouse toggle"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"matrix_pins": {
|
||||||
|
"cols": ["GP22", "GP21", "GP20", "GP19", "GP18", "GP17", "GP16", "GP8", "GP7", "GP6", "GP3", "GP2", "GP1", "GP0", "GP14", "GP15", "GP4"],
|
||||||
|
"masked": true,
|
||||||
|
"rows": ["GP13", "GP12", "GP11", "GP10", "GP9"]
|
||||||
|
},
|
||||||
|
"processor": "RP2040",
|
||||||
|
"tags": ["split", "ergonomic", "ortho", "choc v1", "rp2040", "choc spaced", "65%"],
|
||||||
|
"url": "https://ntkstudio.net/products/revolt-keyboard/",
|
||||||
|
"usb": {
|
||||||
|
"device_version": "2.0.0",
|
||||||
|
"pid": "0x0002",
|
||||||
|
"vid": "0x1987"
|
||||||
|
},
|
||||||
|
"layouts": {
|
||||||
|
"LAYOUT": {
|
||||||
|
"layout": [
|
||||||
|
{"label": "`", "matrix": [0, 0], "x": 0, "y": 0.25},
|
||||||
|
{"label": "1", "matrix": [0, 1], "x": 1, "y": 0.25},
|
||||||
|
{"label": "2", "matrix": [0, 2], "x": 2, "y": 0},
|
||||||
|
{"label": "3", "matrix": [0, 3], "x": 3, "y": 0},
|
||||||
|
{"label": "4", "matrix": [0, 4], "x": 4, "y": 0},
|
||||||
|
{"label": "5", "matrix": [0, 5], "x": 5, "y": 0},
|
||||||
|
{"label": "6", "matrix": [0, 8], "x": 12, "y": 0},
|
||||||
|
{"label": "7", "matrix": [0, 9], "x": 13, "y": 0},
|
||||||
|
{"label": "8", "matrix": [0, 10], "x": 14, "y": 0},
|
||||||
|
{"label": "9", "matrix": [0, 11], "x": 15, "y": 0},
|
||||||
|
{"label": "0", "matrix": [0, 12], "x": 16, "y": 0.25},
|
||||||
|
{"label": "=", "matrix": [0, 13], "x": 17, "y": 0.25},
|
||||||
|
{"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1.25},
|
||||||
|
{"label": "Q", "matrix": [1, 1], "x": 1, "y": 1.25},
|
||||||
|
{"label": "W", "matrix": [1, 2], "x": 2, "y": 1},
|
||||||
|
{"label": "E", "matrix": [1, 3], "x": 3, "y": 1},
|
||||||
|
{"label": "R", "matrix": [1, 4], "x": 4, "y": 1},
|
||||||
|
{"label": "T", "matrix": [1, 5], "x": 5, "y": 1},
|
||||||
|
{"label": "LB1", "matrix": [1, 6], "x": 6, "y": 1},
|
||||||
|
{"label": "RB1", "matrix": [1, 7], "x": 11, "y": 1},
|
||||||
|
{"label": "Y", "matrix": [1, 8], "x": 12, "y": 1},
|
||||||
|
{"label": "U", "matrix": [1, 9], "x": 13, "y": 1},
|
||||||
|
{"label": "I", "matrix": [1, 10], "x": 14, "y": 1},
|
||||||
|
{"label": "O", "matrix": [1, 11], "x": 15, "y": 1},
|
||||||
|
{"label": "P", "matrix": [1, 12], "x": 16, "y": 1.25},
|
||||||
|
{"label": "backslash", "matrix": [1, 13], "x": 17, "y": 1.25},
|
||||||
|
{"label": "Caps", "matrix": [2, 0], "x": 0, "y": 2.25},
|
||||||
|
{"label": "A", "matrix": [2, 1], "x": 1, "y": 2.25},
|
||||||
|
{"label": "S", "matrix": [2, 2], "x": 2, "y": 2},
|
||||||
|
{"label": "D", "matrix": [2, 3], "x": 3, "y": 2},
|
||||||
|
{"label": "F", "matrix": [2, 4], "x": 4, "y": 2},
|
||||||
|
{"label": "G", "matrix": [2, 5], "x": 5, "y": 2},
|
||||||
|
{"label": "LB2", "matrix": [2, 6], "x": 6, "y": 2},
|
||||||
|
{"label": "RB2", "matrix": [2, 7], "x": 11, "y": 2},
|
||||||
|
{"label": "H", "matrix": [2, 8], "x": 12, "y": 2},
|
||||||
|
{"label": "J", "matrix": [2, 9], "x": 13, "y": 2},
|
||||||
|
{"label": "K", "matrix": [2, 10], "x": 14, "y": 2},
|
||||||
|
{"label": "L", "matrix": [2, 11], "x": 15, "y": 2},
|
||||||
|
{"label": ";", "matrix": [2, 12], "x": 16, "y": 2.25},
|
||||||
|
{"label": "'", "matrix": [2, 13], "x": 17, "y": 2.25},
|
||||||
|
{"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3.25},
|
||||||
|
{"label": "Z", "matrix": [3, 1], "x": 1, "y": 3.25},
|
||||||
|
{"label": "X", "matrix": [3, 2], "x": 2, "y": 3},
|
||||||
|
{"label": "C", "matrix": [3, 3], "x": 3, "y": 3},
|
||||||
|
{"label": "V", "matrix": [3, 4], "x": 4, "y": 3},
|
||||||
|
{"label": "B", "matrix": [3, 5], "x": 5, "y": 3},
|
||||||
|
{"label": "LT3", "matrix": [3, 6], "x": 6.25, "y": 3.25},
|
||||||
|
{"label": "RT3", "matrix": [3, 7], "x": 10.75, "y": 3.25},
|
||||||
|
{"label": "N", "matrix": [3, 8], "x": 12, "y": 3},
|
||||||
|
{"label": "M", "matrix": [3, 9], "x": 13, "y": 3},
|
||||||
|
{"label": ",", "matrix": [3, 10], "x": 14, "y": 3},
|
||||||
|
{"label": ".", "matrix": [3, 11], "x": 15, "y": 3},
|
||||||
|
{"label": "/", "matrix": [3, 12], "x": 16, "y": 3.25},
|
||||||
|
{"label": "SHIFT", "matrix": [3, 13], "x": 17, "y": 3.25},
|
||||||
|
{"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4.25},
|
||||||
|
{"label": "WIN", "matrix": [4, 1], "x": 1, "y": 4.25},
|
||||||
|
{"label": "SUPER", "matrix": [4, 2], "x": 2, "y": 4},
|
||||||
|
{"label": "HYPER", "matrix": [4, 3], "x": 3, "y": 4},
|
||||||
|
{"label": "ALT", "matrix": [4, 4], "x": 4.5, "y": 4},
|
||||||
|
{"label": "LT1", "matrix": [4, 5], "x": 6.25, "y": 4.25},
|
||||||
|
{"label": "LT2", "matrix": [4, 6], "x": 7.25, "y": 4.25},
|
||||||
|
{"label": "RT2", "matrix": [4, 7], "x": 9.75, "y": 4.25},
|
||||||
|
{"label": "RT1", "matrix": [4, 8], "x": 10.75, "y": 4.25},
|
||||||
|
{"label": "ALT", "matrix": [4, 9], "x": 12.5, "y": 4},
|
||||||
|
{"label": "left", "matrix": [4, 10], "x": 14, "y": 4},
|
||||||
|
{"label": "down", "matrix": [4, 11], "x": 15, "y": 4},
|
||||||
|
{"label": "up", "matrix": [4, 12], "x": 16, "y": 4.25},
|
||||||
|
{"label": "right", "matrix": [4, 13], "x": 17, "y": 4.25},
|
||||||
|
{"label": "LMB", "matrix": [4, 14], "x": 7.5, "y": 5.5},
|
||||||
|
{"label": "MMB", "matrix": [4, 15], "x": 8.5, "y": 5.5},
|
||||||
|
{"label": "RMB", "matrix": [4, 16], "x": 9.5, "y": 5.5}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
// Copyright 2025 Jacek Królikowski (@nietaki)
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include_next <mcuconf.h>
|
||||||
|
|
||||||
|
#undef RP_PWM_USE_PWM6
|
||||||
|
#define RP_PWM_USE_PWM6 TRUE
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
// Copyright 2025 Jacek Królikowski (@nietaki)
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include QMK_KEYBOARD_H
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
uint32_t raw;
|
||||||
|
struct {
|
||||||
|
bool mouseEnabled : 1;
|
||||||
|
};
|
||||||
|
} keyboard_config_t;
|
||||||
|
|
||||||
|
keyboard_config_t revoltConfig;
|
||||||
|
|
||||||
|
void persistConfig(void) {
|
||||||
|
eeconfig_update_kb(revoltConfig.raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
void eeconfig_init_kb(void) {
|
||||||
|
// default config values
|
||||||
|
revoltConfig.mouseEnabled = true;
|
||||||
|
|
||||||
|
persistConfig();
|
||||||
|
|
||||||
|
eeconfig_init_user();
|
||||||
|
}
|
||||||
|
|
||||||
|
void keyboard_post_init_kb(void) {
|
||||||
|
revoltConfig.raw = eeconfig_read_kb();
|
||||||
|
keyboard_post_init_user();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
/* provide a way to disable the pointing device functionality at runtime */
|
||||||
|
switch (keycode) {
|
||||||
|
case RMS_ON:
|
||||||
|
revoltConfig.mouseEnabled = true;
|
||||||
|
persistConfig();
|
||||||
|
return false;
|
||||||
|
case RMS_OFF:
|
||||||
|
revoltConfig.mouseEnabled = false;
|
||||||
|
persistConfig();
|
||||||
|
return false;
|
||||||
|
case RMS_TOG:
|
||||||
|
revoltConfig.mouseEnabled = !revoltConfig.mouseEnabled;
|
||||||
|
persistConfig();
|
||||||
|
return false;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return process_record_user(keycode, record);
|
||||||
|
}
|
||||||
|
|
||||||
|
report_mouse_t pointing_device_task_kb(report_mouse_t mouse_report) {
|
||||||
|
if (!revoltConfig.mouseEnabled) {
|
||||||
|
mouse_report.x = 0;
|
||||||
|
mouse_report.y = 0;
|
||||||
|
}
|
||||||
|
return pointing_device_task_user(mouse_report);
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
POINTING_DEVICE_DRIVER = analog_joystick
|
||||||
Reference in New Issue
Block a user