aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--jack/color.c140
-rw-r--r--jack/config.h64
-rw-r--r--jack/introspection.c33
-rw-r--r--jack/jack.c67
-rw-r--r--jack/jack.h16
-rw-r--r--jack/oled.c1
-rw-r--r--jack/picosdk_math.mk153
-rw-r--r--jack/post_rules.mk14
-rw-r--r--jack/rgb_matrix_user.inc835
-rw-r--r--jack/rules.mk31
-rw-r--r--jack/tapping.c2
-rw-r--r--keyboards/endgame/readme.md5
-rw-r--r--keyboards/leftover30/chconf.h9
-rw-r--r--keyboards/leftover30/config.h8
-rw-r--r--keyboards/leftover30/keyboard.json75
-rw-r--r--keyboards/leftover30/mcuconf.h8
-rw-r--r--keyboards/leftover30/readme.md5
-rw-r--r--keyboards/pseusplit/config.h19
-rw-r--r--keyboards/pseusplit/halconf.h (renamed from keyboards/leftover30/halconf.h)4
-rw-r--r--keyboards/pseusplit/keyboard.json110
-rw-r--r--keyboards/pseusplit/keymaps/default/keymap.json13
-rw-r--r--keyboards/pseusplit/keymaps/jack/keymap.c (renamed from keyboards/leftover30/keymaps/jack/keymap.c)14
-rw-r--r--keyboards/pseusplit/mcuconf.h11
-rw-r--r--keyboards/pseusplit/pseusplit.c73
-rw-r--r--keyboards/pseusplit/readme.md22
-rw-r--r--keyboards/pseusplit/rules.mk2
-rw-r--r--keyboards/sweep/config.h34
-rw-r--r--keyboards/sweep/halconf.h3
-rw-r--r--keyboards/sweep/keyboard.json273
-rw-r--r--keyboards/sweep/keymaps/jack/keymap.c48
-rw-r--r--keyboards/sweep/mcuconf.h7
-rw-r--r--keyboards/sweep/readme.md8
-rw-r--r--keyboards/sweep/rules.mk6
-rw-r--r--keyboards/sweep/sweep.c21
-rwxr-xr-xkeyboards/tornish/flash.sh8
-rw-r--r--keyboards/tornish/keyboard.json45
-rw-r--r--keyboards/tornish/keymaps/default/keymap.c42
-rw-r--r--keyboards/tornish/readme.md11
-rw-r--r--keyboards/tornish/usbasploader_atmega328p.hex140
-rw-r--r--keyboards/xyz60/keyboard.json2
-rw-r--r--keymaps/beiwagon/keymap.c26
-rw-r--r--keymaps/crkbd/keymap.c8
-rw-r--r--keymaps/crkbd/rules.mk1
-rw-r--r--keymaps/f60/readme.md4
-rw-r--r--keymaps/ferris/config.h24
-rw-r--r--keymaps/ferris/keymap.c56
-rw-r--r--keymaps/ferris/readme.md8
-rw-r--r--keymaps/ferris/rules.mk3
-rw-r--r--keymaps/kyria/rules.mk2
-rw-r--r--keymaps/onekey/f411_qfplib/config.h12
-rw-r--r--keymaps/onekey/f411_qfplib/keymap.c (renamed from keymaps/onekey/stm32f411/keymap.c)0
-rw-r--r--keymaps/onekey/f411_qfplib/qfplib/qfplib.h (renamed from keymaps/onekey/stm32f411/qfplib/qfplib.h)0
-rw-r--r--keymaps/onekey/f411_qfplib/qfplib/qfplib.s (renamed from keymaps/onekey/stm32f411/qfplib/qfplib.s)0
-rw-r--r--keymaps/onekey/f411_qfplib/rules.mk (renamed from keymaps/onekey/stm32f411/rules.mk)0
-rw-r--r--keymaps/onekey/rp2040/rules.mk39
-rw-r--r--keymaps/onekey/rp_smp/chconf.h (renamed from keymaps/onekey/rp2040/chconf.h)0
-rw-r--r--keymaps/onekey/rp_smp/keymap.c (renamed from keymaps/onekey/rp2040/keymap.c)0
-rw-r--r--keymaps/onekey/rp_smp/mcuconf.h (renamed from keymaps/onekey/rp2040/mcuconf.h)0
-rw-r--r--keymaps/onekey/rp_smp/rules.mk3
-rw-r--r--keymaps/onekey/stm32f411/config.h12
-rw-r--r--keymaps/qaz/keymap.c26
-rw-r--r--keymaps/qaz/rules.mk3
-rw-r--r--keymaps/relic/readme.md3
-rw-r--r--keymaps/vault35/readme.md3
-rw-r--r--ld/RP2040_FLASH_TIMECRIT_ROM_MATH.ld148
-rw-r--r--readme.md18
-rwxr-xr-xutil/link.sh3
67 files changed, 1958 insertions, 826 deletions
diff --git a/jack/color.c b/jack/color.c
new file mode 100644
index 0000000..9728d99
--- /dev/null
+++ b/jack/color.c
@@ -0,0 +1,140 @@
+// Copyright 2025 [email protected]
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include "color.h"
+#include <lib/lib8tion/lib8tion.h>
+
+#define K255 255
+#define K171 171
+#define K170 170
+#define K85 85
+
+// Adapted from https://fastled.io/docs/hsv2rgb_8cpp_source.html
+// void hsv2rgb_rainbow() function
+RGB rgb_matrix_hsv_to_rgb(const HSV hsv) {
+ // Yellow has a higher inherent brightness than
+ // any other color; 'pure' yellow is perceived to
+ // be 93% as bright as white. In order to make
+ // yellow appear the correct relative brightness,
+ // it has to be rendered brighter than all other
+ // colors.
+ const uint8_t hue = hsv.h;
+ const uint8_t sat = hsv.s;
+ uint8_t val = hsv.v;
+
+ // offset8 = (hue [0..31]) * 8
+ uint8_t offset8 = hue & 0x1F;
+ offset8 <<= 3;
+
+ uint8_t third = scale8(offset8, (256 / 3)); // max = 85
+ uint8_t r, g, b;
+ if (!(hue & 0x80)) {
+ // 0XX
+ if (!(hue & 0x40)) {
+ // 00X
+ // section 0-1
+ if (!(hue & 0x20)) {
+ // 000
+ // case 0: // R -> O
+ r = K255 - third;
+ g = third;
+ b = 0;
+ } else {
+ // 001
+ // case 1: // O -> Y
+ r = K171;
+ g = K85 + third;
+ b = 0;
+ }
+ } else {
+ // 01X
+ // section 2-3
+ if (!(hue & 0x20)) {
+ // 010
+ // case 2: // Y -> G
+ // uint8_t twothirds = (third << 1);
+ uint8_t twothirds = scale8(offset8, ((256 * 2) / 3)); // max=170
+ r = K171 - twothirds;
+ g = K170 + third;
+ b = 0;
+ } else {
+ // 011
+ // case 3: // G -> A
+ r = 0;
+ g = K255 - third;
+ b = third;
+ }
+ }
+ } else {
+ // section 4-7
+ // 1XX
+ if (!(hue & 0x40)) {
+ // 10X
+ if (!(hue & 0x20)) {
+ // 100
+ // case 4: // A -> B
+ r = 0;
+ // uint8_t twothirds = (third << 1);
+ uint8_t twothirds = scale8(offset8, ((256 * 2) / 3)); // max=170
+ g = K171 - twothirds; // K170?
+ b = K85 + twothirds;
+ } else {
+ // 101
+ // case 5: // B -> P
+ r = third;
+ g = 0;
+ b = K255 - third;
+ }
+ } else {
+ if (!(hue & 0x20)) {
+ // 110
+ // case 6: // P -- K
+ r = K85 + third;
+ g = 0;
+ b = K171 - third;
+ } else {
+ // 111
+ // case 7: // K -> R
+ r = K170 + third;
+ g = 0;
+ b = K85 - third;
+ }
+ }
+ }
+ // This is one of the good places to scale the green down,
+ // although the client can scale green down as well.
+ g >>= 1;
+ // Scale down colors if we're desaturated at all
+ // and add the brightness_floor to r, g, and b.
+ if (sat != 255) {
+ if (sat == 0) {
+ r = 255;
+ b = 255;
+ g = 255;
+ } else {
+ uint8_t desat = 255 - sat;
+ desat = scale8_video(desat, desat);
+ uint8_t satscale = 255 - desat;
+ r = scale8(r, satscale);
+ g = scale8(g, satscale);
+ b = scale8(b, satscale);
+ uint8_t brightness_floor = desat;
+ r += brightness_floor;
+ g += brightness_floor;
+ b += brightness_floor;
+ }
+ }
+ // Now scale everything down if we're at value < 255.
+ if (val != 255) {
+ val = scale8_video(val, val);
+ if (val == 0) {
+ r = 0;
+ g = 0;
+ b = 0;
+ } else {
+ r = scale8(r, val);
+ g = scale8(g, val);
+ b = scale8(b, val);
+ }
+ }
+ return (RGB){.r = r, .g = g, .b = b};
+}
diff --git a/jack/config.h b/jack/config.h
index 0c34ee0..72347f8 100644
--- a/jack/config.h
+++ b/jack/config.h
@@ -35,19 +35,55 @@
#ifdef RGB_MATRIX_ENABLE
#define RGB_MATRIX_SLEEP
#define RGB_MATRIX_TIMEOUT 300000
-#undef RGB_MATRIX_DEFAULT_MODE
-#define RGB_MATRIX_DEFAULT_MODE RGB_MATRIX_ALPHAS_MODS
-#define ENABLE_RGB_MATRIX_ALPHAS_MODS
-#define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT
-#define ENABLE_RGB_MATRIX_CYCLE_SPIRAL
-#define ENABLE_RGB_MATRIX_RAINDROPS
-#define ENABLE_RGB_MATRIX_FRAMEBUFFER_EFFECTS
-#define ENABLE_RGB_MATRIX_TYPING_HEATMAP
-#define ENABLE_RGB_MATRIX_KEYPRESSES
-#define ENABLE_RGB_MATRIX_SOLID_REACTIVE
-#define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH
-#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
-#define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
#define RGB_MATRIX_KEYPRESSES
-#define ENABLE_RGB_MATRIX_SOLID_REACTIVE
+#define PALETTEFX_ENABLE_ALL_EFFECTS
+#define PALETTEFX_ENABLE_ALL_PALETTES
+#undef ENABLE_RGB_MATRIX_ALPHAS_MODS
+#undef ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN
+#undef ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT
+#undef ENABLE_RGB_MATRIX_BREATHING
+#undef ENABLE_RGB_MATRIX_BAND_SAT
+#undef ENABLE_RGB_MATRIX_BAND_VAL
+#undef ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT
+#undef ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL
+#undef ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT
+#undef ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL
+#undef ENABLE_RGB_MATRIX_CYCLE_ALL
+#undef ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
+#undef ENABLE_RGB_MATRIX_CYCLE_UP_DOWN
+#undef ENABLE_RGB_MATRIX_CYCLE_OUT_IN
+#undef ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL
+#undef ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
+#undef ENABLE_RGB_MATRIX_CYCLE_PINWHEEL
+#undef ENABLE_RGB_MATRIX_CYCLE_SPIRAL
+#undef ENABLE_RGB_MATRIX_DUAL_BEACON
+#undef ENABLE_RGB_MATRIX_RAINBOW_BEACON
+#undef ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS
+#undef ENABLE_RGB_MATRIX_FLOWER_BLOOMING
+#undef ENABLE_RGB_MATRIX_RAINDROPS
+#undef ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
+#undef ENABLE_RGB_MATRIX_HUE_BREATHING
+#undef ENABLE_RGB_MATRIX_HUE_PENDULUM
+#undef ENABLE_RGB_MATRIX_HUE_WAVE
+#undef ENABLE_RGB_MATRIX_PIXEL_FRACTAL
+#undef ENABLE_RGB_MATRIX_PIXEL_FLOW
+#undef ENABLE_RGB_MATRIX_PIXEL_RAIN
+#undef ENABLE_RGB_MATRIX_TYPING_HEATMAP
+#undef ENABLE_RGB_MATRIX_DIGITAL_RAIN
+#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
+#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE
+#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
+#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE
+#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
+#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS
+#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
+#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS
+#undef ENABLE_RGB_MATRIX_SPLASH
+#undef ENABLE_RGB_MATRIX_MULTISPLASH
+#undef ENABLE_RGB_MATRIX_SOLID_SPLASH
+#undef ENABLE_RGB_MATRIX_SOLID_MULTISPLASH
+#undef ENABLE_RGB_MATRIX_STARLIGHT
+#undef ENABLE_RGB_MATRIX_STARLIGHT_DUAL_HUE
+#undef ENABLE_RGB_MATRIX_STARLIGHT_DUAL_SAT
+#undef ENABLE_RGB_MATRIX_RIVERFLOW
#endif
diff --git a/jack/introspection.c b/jack/introspection.c
new file mode 100644
index 0000000..86f453b
--- /dev/null
+++ b/jack/introspection.c
@@ -0,0 +1,33 @@
+// Copyright 2025 [email protected]
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include "jack.h"
+
+#ifdef TAP_DANCE_ENABLE
+tap_dance_action_t tap_dance_actions[] = {
+ [EM_DASH_MINS] = ACTION_TAP_DANCE_FN(em_dash_mins),
+ [PLY_NXT_PRV] = ACTION_TAP_DANCE_FN(ply_nxt_prv),
+ [PASTE_RAISE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, raise_paste, td_reset),
+ [CBRACKET] = ACTION_TAP_DANCE_DOUBLE(KC_LCBR, KC_RCBR),
+ [SBRACKET] = ACTION_TAP_DANCE_DOUBLE(KC_LBRC, KC_RBRC),
+};
+#endif
+
+#ifdef ENCODER_MAP_ENABLE
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
+ [_BASE] = {{KC_VOLU, KC_VOLD}, {KC_MNXT, KC_MPRV}},
+ [_LOWER] = {{XRGB_SAI, XRGB_SAD}, {XRGB_HUI, XRGB_HUD}},
+ [_RAISE] = {{C(KC_LEFT), C(KC_RGHT)}, {C(S(KC_TAB)), C(KC_TAB)}}};
+#endif
+
+#ifdef COMBO_ENABLE
+#define CMB(name, action, ...) \
+ uint16_t const name##_combo[] PROGMEM = {__VA_ARGS__, COMBO_END};
+#include "combos.def"
+#undef CMB
+
+#define CMB(name, action, ...) [name] = COMBO(name##_combo, action),
+combo_t key_combos[] = {
+#include "combos.def"
+};
+#undef CMB
+#endif
diff --git a/jack/jack.c b/jack/jack.c
index f41f50a..274a011 100644
--- a/jack/jack.c
+++ b/jack/jack.c
@@ -2,31 +2,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#include "jack.h"
-tap_dance_action_t tap_dance_actions[] = {
- [EM_DASH_MINS] = ACTION_TAP_DANCE_FN(em_dash_mins),
- [PLY_NXT_PRV] = ACTION_TAP_DANCE_FN(ply_nxt_prv),
- [PASTE_RAISE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, raise_paste, td_reset),
- [CBRACKET] = ACTION_TAP_DANCE_DOUBLE(KC_LCBR, KC_RCBR),
- [SBRACKET] = ACTION_TAP_DANCE_DOUBLE(KC_LBRC, KC_RBRC),
-};
-
-#define CMB(name, action, ...) name,
-enum combos {
-#include "combos.def"
-};
-#undef CMB
-
-#define CMB(name, action, ...) \
- uint16_t const name##_combo[] PROGMEM = {__VA_ARGS__, COMBO_END};
-#include "combos.def"
-#undef CMB
-
-#define CMB(name, action, ...) [name] = COMBO(name##_combo, action),
-combo_t key_combos[] = {
-#include "combos.def"
-};
-#undef CMB
-
#if defined(SPLIT_KEYBOARD) && defined(OLED_ENABLE)
#include "transactions.h"
extern char keylog_str[KEYLOG_LEN + 1];
@@ -37,25 +12,31 @@ void keylogger_sync(uint8_t initiator2target_buffer_size,
if (initiator2target_buffer_size == 5)
memcpy(&keylog_str, initiator2target_buffer, initiator2target_buffer_size);
}
+#endif
+__attribute__((weak)) void housekeeping_task_keymap(void) {}
void housekeeping_task_user(void) {
+#if defined(SPLIT_KEYBOARD) && defined(OLED_ENABLE)
if (is_keyboard_master()) {
static uint32_t last_sync;
bool needs_sync = false;
static char tmp_keylog[5] = {0};
- if (memcmp(&keylog_str, &tmp_keylog, 5)) {
+ if (memcmp(&keylog_str, &tmp_keylog, sizeof(tmp_keylog))) {
needs_sync = true;
- memcpy(&tmp_keylog, &keylog_str, 5);
+ memcpy(&tmp_keylog, &keylog_str, sizeof(tmp_keylog));
}
if (timer_elapsed32(last_sync) > 250)
needs_sync = true;
if (needs_sync)
- if (transaction_rpc_send(RPC_ID_USER_KEYLOG_STR, 5, &keylog_str))
+ if (transaction_rpc_send(RPC_ID_USER_KEYLOG_STR, sizeof(tmp_keylog),
+ &keylog_str))
last_sync = timer_read32();
}
-}
#endif
+ housekeeping_task_keymap();
+}
+__attribute__((weak)) void keyboard_post_init_keymap(void) {}
void keyboard_post_init_user(void) {
#if defined(SPLIT_KEYBOARD) && defined(OLED_ENABLE)
transaction_register_rpc(RPC_ID_USER_KEYLOG_STR, keylogger_sync);
@@ -67,7 +48,8 @@ void keyboard_post_init_user(void) {
rgblight_enable_noeeprom();
rgblight_sethsv_noeeprom(HSV_CYAN);
rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
-#elif RGB_MATRIX_ENABLE
+#endif
+#ifdef RGB_MATRIX_ENABLE
rgb_matrix_enable_noeeprom();
rgb_matrix_sethsv_noeeprom(HSV_CYAN);
rgb_matrix_mode_noeeprom(RGB_MATRIX_SOLID_COLOR);
@@ -76,6 +58,7 @@ void keyboard_post_init_user(void) {
if (!autocorrect_is_enabled())
autocorrect_enable();
#endif
+ keyboard_post_init_keymap();
}
void matrix_scan_user(void) {
@@ -84,17 +67,23 @@ void matrix_scan_user(void) {
#endif
}
-#ifdef ENCODER_MAP_ENABLE
-const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
- [_BASE] = {{KC_VOLU, KC_VOLD}, {KC_MNXT, KC_MPRV}},
- [_LOWER] = {{RGB_SAI, RGB_SAD}, {RGB_HUI, RGB_HUD}},
- [_RAISE] = {{C(KC_LEFT), C(KC_RGHT)}, {C(S(KC_TAB)), C(KC_TAB)}}};
-#endif
-
#ifndef MAGIC_ENABLE
uint16_t keycode_config(uint16_t keycode) { return keycode; }
+uint8_t mod_config(uint8_t mod) { return mod; }
#endif
-#ifndef MAGIC_ENABLE
-uint8_t mod_config(uint8_t mod) { return mod; }
+#ifdef RP2040_MATH_IN_ROM
+typedef void (*init_fn)(void);
+extern init_fn __preinit_array_base__;
+extern init_fn __preinit_array_end__;
+#endif
+
+__attribute__((weak)) void keyboard_pre_init_keymap(void) {}
+void keyboard_pre_init_user(void) {
+#ifdef RP2040_MATH_IN_ROM
+ for (init_fn *func = &__preinit_array_base__; func < &__preinit_array_end__;
+ func++)
+ (*func)();
#endif
+ keyboard_pre_init_keymap();
+}
diff --git a/jack/jack.h b/jack/jack.h
index ec7ae69..3d3b1c9 100644
--- a/jack/jack.h
+++ b/jack/jack.h
@@ -21,6 +21,12 @@ enum custom_keycodes {
UC_SUPER
};
+#define CMB(name, action, ...) name,
+enum combos {
+#include "combos.def"
+};
+#undef CMB
+
bool process_record_unicode(uint16_t keycode, keyrecord_t *record);
bool process_record_taps(uint16_t keycode, keyrecord_t *record);
extern uint8_t extract_mod_bits(uint16_t code);
@@ -29,12 +35,15 @@ void tap_code_register(uint8_t code, uint8_t mods, uint16_t delay,
bool register_tap);
void process_tap_code_buffer(void);
void tap_string(const char *str);
+
+#ifdef TAP_DANCE_ENABLE
void td_reset(tap_dance_state_t *state, void *user_data);
void em_dash_mins(tap_dance_state_t *state, void *user_data);
void ply_nxt_prv(tap_dance_state_t *state, void *user_data);
void raise_paste(tap_dance_state_t *state, void *user_data);
+#endif
+
void oled_timer_reset(void);
-bool oled_task_keymap(void);
void anim_frame(uint16_t size, char const action[][size]);
void wpm_graph(void);
void felix_dog(void);
@@ -46,6 +55,11 @@ void render_keylog(void);
void render_wpm(void);
void render_scan_rate(void);
+void keyboard_pre_init_keymap(void);
+void keyboard_post_init_keymap(void);
+void housekeeping_task_keymap(void);
+bool oled_task_keymap(void);
+
#define KEYLOG_LEN 5
#define PNP TD(PLY_NXT_PRV)
#define PSTRSE TD(PASTE_RAISE)
diff --git a/jack/oled.c b/jack/oled.c
index adaad3d..ec52705 100644
--- a/jack/oled.c
+++ b/jack/oled.c
@@ -11,7 +11,6 @@ extern OLED_BLOCK_TYPE oled_dirty;
void oled_timer_reset(void) { oled_timer = timer_read32(); }
__attribute__((weak)) bool oled_task_keymap(void) { return true; }
-
bool oled_task_user(void) {
if (is_keyboard_master()) {
if (timer_elapsed32(oled_timer) > 300000) {
diff --git a/jack/picosdk_math.mk b/jack/picosdk_math.mk
new file mode 100644
index 0000000..82f18a3
--- /dev/null
+++ b/jack/picosdk_math.mk
@@ -0,0 +1,153 @@
+OPT_DEFS += -DPICO_DOUBLE_IN_RAM=1 \
+ -DPICO_FLOAT_IN_RAM=1
+
+# bit
+SRC += $(PICOSDKROOT)/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S
+EXTRALDFLAGS += \
+ -Wl,--wrap=__clzsi2 \
+ -Wl,--wrap=__clzdi2 \
+ -Wl,--wrap=__ctzsi2 \
+ -Wl,--wrap=__ctzdi2 \
+ -Wl,--wrap=__popcountsi2 \
+ -Wl,--wrap=__popcountdi2
+
+# double
+VPATH += $(PICOSDKROOT)/src/rp2_common/pico_double/include
+SRC += \
+ $(PICOSDKROOT)/src/rp2_common/pico_double/double_aeabi.S \
+ $(PICOSDKROOT)/src/rp2_common/pico_double/double_init_rom.c \
+ $(PICOSDKROOT)/src/rp2_common/pico_double/double_math.c \
+ $(PICOSDKROOT)/src/rp2_common/pico_double/double_v1_rom_shim.S
+EXTRALDFLAGS += \
+ -Wl,--wrap=__aeabi_dadd \
+ -Wl,--wrap=__aeabi_ddiv \
+ -Wl,--wrap=__aeabi_dmul \
+ -Wl,--wrap=__aeabi_drsub \
+ -Wl,--wrap=__aeabi_dsub \
+ -Wl,--wrap=__aeabi_cdcmpeq \
+ -Wl,--wrap=__aeabi_cdrcmple \
+ -Wl,--wrap=__aeabi_cdcmple \
+ -Wl,--wrap=__aeabi_dcmpeq \
+ -Wl,--wrap=__aeabi_dcmplt \
+ -Wl,--wrap=__aeabi_dcmple \
+ -Wl,--wrap=__aeabi_dcmpge \
+ -Wl,--wrap=__aeabi_dcmpgt \
+ -Wl,--wrap=__aeabi_dcmpun \
+ -Wl,--wrap=__aeabi_i2d \
+ -Wl,--wrap=__aeabi_l2d \
+ -Wl,--wrap=__aeabi_ui2d \
+ -Wl,--wrap=__aeabi_ul2d \
+ -Wl,--wrap=__aeabi_d2iz \
+ -Wl,--wrap=__aeabi_d2lz \
+ -Wl,--wrap=__aeabi_d2uiz \
+ -Wl,--wrap=__aeabi_d2ulz \
+ -Wl,--wrap=__aeabi_d2f \
+ -Wl,--wrap=sqrt \
+ -Wl,--wrap=cos \
+ -Wl,--wrap=sin \
+ -Wl,--wrap=tan \
+ -Wl,--wrap=atan2 \
+ -Wl,--wrap=exp \
+ -Wl,--wrap=log \
+ -Wl,--wrap=ldexp \
+ -Wl,--wrap=copysign \
+ -Wl,--wrap=trunc \
+ -Wl,--wrap=floor \
+ -Wl,--wrap=ceil \
+ -Wl,--wrap=round \
+ -Wl,--wrap=sincos \
+ -Wl,--wrap=asin \
+ -Wl,--wrap=acos \
+ -Wl,--wrap=atan \
+ -Wl,--wrap=sinh \
+ -Wl,--wrap=cosh \
+ -Wl,--wrap=tanh \
+ -Wl,--wrap=asinh \
+ -Wl,--wrap=acosh \
+ -Wl,--wrap=atanh \
+ -Wl,--wrap=exp2 \
+ -Wl,--wrap=log2 \
+ -Wl,--wrap=exp10 \
+ -Wl,--wrap=log10 \
+ -Wl,--wrap=pow \
+ -Wl,--wrap=powint \
+ -Wl,--wrap=hypot \
+ -Wl,--wrap=cbrt \
+ -Wl,--wrap=fmod \
+ -Wl,--wrap=drem \
+ -Wl,--wrap=remainder \
+ -Wl,--wrap=remquo \
+ -Wl,--wrap=expm1 \
+ -Wl,--wrap=log1p \
+ -Wl,--wrap=fma
+
+# float
+VPATH += $(PICOSDKROOT)/src/rp2_common/pico_float/include
+SRC += \
+ $(PICOSDKROOT)/src/rp2_common/pico_float/float_aeabi.S \
+ $(PICOSDKROOT)/src/rp2_common/pico_float/float_init_rom.c \
+ $(PICOSDKROOT)/src/rp2_common/pico_float/float_math.c \
+ $(PICOSDKROOT)/src/rp2_common/pico_float/float_v1_rom_shim.S
+
+EXTRALDFLAGS += \
+ -Wl,--wrap=__aeabi_fadd \
+ -Wl,--wrap=__aeabi_fdiv \
+ -Wl,--wrap=__aeabi_fmul \
+ -Wl,--wrap=__aeabi_frsub \
+ -Wl,--wrap=__aeabi_fsub \
+ -Wl,--wrap=__aeabi_cfcmpeq \
+ -Wl,--wrap=__aeabi_cfrcmple \
+ -Wl,--wrap=__aeabi_cfcmple \
+ -Wl,--wrap=__aeabi_fcmpeq \
+ -Wl,--wrap=__aeabi_fcmplt \
+ -Wl,--wrap=__aeabi_fcmple \
+ -Wl,--wrap=__aeabi_fcmpge \
+ -Wl,--wrap=__aeabi_fcmpgt \
+ -Wl,--wrap=__aeabi_fcmpun \
+ -Wl,--wrap=__aeabi_i2f \
+ -Wl,--wrap=__aeabi_l2f \
+ -Wl,--wrap=__aeabi_ui2f \
+ -Wl,--wrap=__aeabi_ul2f \
+ -Wl,--wrap=__aeabi_f2iz \
+ -Wl,--wrap=__aeabi_f2lz \
+ -Wl,--wrap=__aeabi_f2uiz \
+ -Wl,--wrap=__aeabi_f2ulz \
+ -Wl,--wrap=__aeabi_f2d \
+ -Wl,--wrap=sqrtf \
+ -Wl,--wrap=cosf \
+ -Wl,--wrap=sinf \
+ -Wl,--wrap=tanf \
+ -Wl,--wrap=atan2f \
+ -Wl,--wrap=expf \
+ -Wl,--wrap=logf \
+ -Wl,--wrap=ldexpf \
+ -Wl,--wrap=copysignf \
+ -Wl,--wrap=truncf \
+ -Wl,--wrap=floorf \
+ -Wl,--wrap=ceilf \
+ -Wl,--wrap=roundf \
+ -Wl,--wrap=sincosf \
+ -Wl,--wrap=asinf \
+ -Wl,--wrap=acosf \
+ -Wl,--wrap=atanf \
+ -Wl,--wrap=sinhf \
+ -Wl,--wrap=coshf \
+ -Wl,--wrap=tanhf \
+ -Wl,--wrap=asinhf \
+ -Wl,--wrap=acoshf \
+ -Wl,--wrap=atanhf \
+ -Wl,--wrap=exp2f \
+ -Wl,--wrap=log2f \
+ -Wl,--wrap=exp10f \
+ -Wl,--wrap=log10f \
+ -Wl,--wrap=powf \
+ -Wl,--wrap=powintf \
+ -Wl,--wrap=hypotf \
+ -Wl,--wrap=cbrtf \
+ -Wl,--wrap=fmodf \
+ -Wl,--wrap=dremf \
+ -Wl,--wrap=remainderf \
+ -Wl,--wrap=remquof \
+ -Wl,--wrap=expm1f \
+ -Wl,--wrap=log1pf \
+ -Wl,--wrap=fmaf
diff --git a/jack/post_rules.mk b/jack/post_rules.mk
new file mode 100644
index 0000000..fb10049
--- /dev/null
+++ b/jack/post_rules.mk
@@ -0,0 +1,14 @@
+ifeq ($(MCU_SERIES), RP2040)
+ include picosdk_math.mk
+endif
+
+ifeq ($(strip $(RP2040_MATH_IN_ROM)), yes)
+ OPT_DEFS += -DRP2040_MATH_IN_ROM
+ MCU_LDSCRIPT = RP2040_FLASH_TIMECRIT_ROM_MATH
+endif
+
+ifeq ($(strip $(MOUSE_JIGGLE_ENABLE)), yes)
+ OPT_DEFS += -DMOUSE_JIGGLE_ENABLE
+ MOUSEKEY_ENABLE = yes
+ DEFERRED_EXEC_ENABLE = yes
+endif
diff --git a/jack/rgb_matrix_user.inc b/jack/rgb_matrix_user.inc
new file mode 100644
index 0000000..2ff9e95
--- /dev/null
+++ b/jack/rgb_matrix_user.inc
@@ -0,0 +1,835 @@
+// Copyright 2025 Google LLC
+// SPDX-License-Identifier: Apache-2.0
+#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_GRADIENT_ENABLE)
+RGB_MATRIX_EFFECT(PALETTEFX_GRADIENT)
+#endif
+#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_FLOW_ENABLE)
+RGB_MATRIX_EFFECT(PALETTEFX_FLOW)
+#endif
+#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_RIPPLE_ENABLE)
+RGB_MATRIX_EFFECT(PALETTEFX_RIPPLE)
+#endif
+#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_SPARKLE_ENABLE)
+RGB_MATRIX_EFFECT(PALETTEFX_SPARKLE)
+#endif
+#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_VORTEX_ENABLE)
+RGB_MATRIX_EFFECT(PALETTEFX_VORTEX)
+#endif
+#if defined(RGB_MATRIX_KEYREACTIVE_ENABLED) && \
+ (defined(PALETTEFX_ENABLE_ALL_EFFECTS) || \
+ defined(PALETTEFX_REACTIVE_ENABLE))
+RGB_MATRIX_EFFECT(PALETTEFX_REACTIVE)
+#endif
+
+#ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
+
+///////////////////////////////////////////////////////////////////////////////
+// PaletteFx function definitions
+///////////////////////////////////////////////////////////////////////////////
+
+/** Gets the selected palette. */
+static const uint16_t *palettefx_get_palette_data(void);
+
+/**
+ * @brief Computes the interpolated HSV palette color at 0 <= x < 256.
+ *
+ * Looks up and linearly interpolates `palette` at 0 <= x < 256. The color
+ * saturation and value are scaled according to rgb_matrix_config.
+ *
+ * @note `palette` must point to a PROGMEM address.
+ *
+ * @param palette Pointer to PROGMEM of a size-16 table of HSV16 colors.
+ * @param x Palette lookup position, a value in 0-255.
+ * @return HSV color.
+ */
+static hsv_t palettefx_interp_color(const uint16_t *palette, uint8_t x);
+
+/** Gets the color data for the selected palette. */
+static const uint16_t *palettefx_get_palette_data(void);
+
+/**
+ * @brief Compute a scaled 16-bit time that wraps smoothly.
+ *
+ * Computes `timer` scaled by `scale`, returning the result as a uint16.
+ * Generally, the scaled time would have a discontinuity every ~65 seconds when
+ * `timer` wraps 16-bit range. This is corrected for to wrap smoothly mod 2^16.
+ *
+ * @param timer A 32-bit timer.
+ * @param scale Scale value in 0-255.
+ * @return Scaled time.
+ */
+inline static uint16_t palettefx_scaled_time(uint32_t timer, uint8_t scale);
+
+///////////////////////////////////////////////////////////////////////////////
+// PaletteFx effects
+///////////////////////////////////////////////////////////////////////////////
+
+#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_GRADIENT_ENABLE)
+// "Gradient" static effect. This is essentially a palette-colored version of
+// RGB_MATRIX_GRADIENT_UP_DOWN. A vertically-sloping gradient is made, with the
+// highest color on the top keys of keyboard and the lowest color at the bottom.
+static bool PALETTEFX_GRADIENT(effect_params_t *params) {
+ // On first call, compute and cache the slope of the gradient.
+ static uint8_t gradient_slope = 0;
+ if (!gradient_slope) {
+ uint8_t y_max = 64; // To avoid overflow below, x_max must be at least 64.
+ for (uint8_t i = 0; i < RGB_MATRIX_LED_COUNT; ++i) {
+ if (g_led_config.point[i].y > y_max) {
+ y_max = g_led_config.point[i].y;
+ }
+ }
+ // Compute the quotient `255 / y_max` with 6 fractional bits and rounding.
+ gradient_slope = (64 * 255 + y_max / 2) / y_max;
+ }
+
+ RGB_MATRIX_USE_LIMITS(led_min, led_max);
+ const uint16_t *palette = palettefx_get_palette_data();
+
+ for (uint8_t i = led_min; i < led_max; ++i) {
+ RGB_MATRIX_TEST_LED_FLAGS();
+ const uint8_t y = g_led_config.point[i].y;
+ const uint8_t value = 255 - (((uint16_t)y * (uint16_t)gradient_slope) >> 6);
+ rgb_t rgb = rgb_matrix_hsv_to_rgb(palettefx_interp_color(palette, value));
+ rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
+ }
+
+ return rgb_matrix_check_finished_leds(led_max);
+}
+#endif
+
+#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_FLOW_ENABLE)
+// "Flow" animated effect. Draws moving wave patterns mimicking the appearance
+// of flowing liquid. For interesting variety of patterns, space coordinates are
+// slowly rotated and a function of several sine waves is evaluated.
+static bool PALETTEFX_FLOW(effect_params_t *params) {
+ RGB_MATRIX_USE_LIMITS(led_min, led_max);
+ const uint16_t *palette = palettefx_get_palette_data();
+ const uint16_t time =
+ palettefx_scaled_time(g_rgb_timer, 1 + rgb_matrix_config.speed / 8);
+ // Compute rotation coefficients with 7 fractional bits.
+ const int8_t rot_c = cos8(time / 4) - 128;
+ const int8_t rot_s = sin8(time / 4) - 128;
+ const uint8_t omega = 32 + sin8(time) / 4;
+
+ for (uint8_t i = led_min; i < led_max; ++i) {
+ RGB_MATRIX_TEST_LED_FLAGS();
+ const uint8_t x = g_led_config.point[i].x;
+ const uint8_t y = g_led_config.point[i].y;
+
+ // Rotate (x, y) by the 2x2 rotation matrix described by rot_c, rot_s.
+ const uint8_t x1 = (uint8_t)((((int16_t)rot_c) * ((int16_t)x)) / 128) -
+ (uint8_t)((((int16_t)rot_s) * ((int16_t)y)) / 128);
+ const uint8_t y1 = (uint8_t)((((int16_t)rot_s) * ((int16_t)x)) / 128) +
+ (uint8_t)((((int16_t)rot_c) * ((int16_t)y)) / 128);
+
+ uint8_t value = scale8(sin8(x1 - 2 * time), omega) + y1 + time / 4;
+ // Evaluate `sawtooth(value)`.
+ value = 2 * ((value <= 127) ? value : (255 - value));
+
+ rgb_t rgb = rgb_matrix_hsv_to_rgb(palettefx_interp_color(palette, value));
+ rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
+ }
+
+ return rgb_matrix_check_finished_leds(led_max);
+}
+#endif
+
+#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_RIPPLE_ENABLE)
+// "Ripple" animated effect. Draws circular rings emanating from random points,
+// simulating water drops falling in a quiet pool.
+static bool PALETTEFX_RIPPLE(effect_params_t *params) {
+ RGB_MATRIX_USE_LIMITS(led_min, led_max);
+ const uint16_t *palette = palettefx_get_palette_data();
+
+ // Each instance of this struct represents one water drop. For efficiency, at
+ // most 3 drops are active at any time.
+ static struct {
+ uint16_t time;
+ uint8_t x;
+ uint8_t y;
+ uint8_t amplitude;
+ uint8_t scale;
+ uint8_t phase;
+ } drops[3];
+ static uint32_t drop_timer = 0;
+ static uint8_t drops_tail = 0;
+
+ if (params->iter == 0) {
+ if (params->init) {
+ for (uint8_t j = 0; j < 3; ++j) {
+ drops[j].amplitude = 0;
+ }
+ drop_timer = g_rgb_timer;
+ }
+
+ if (drops[drops_tail].amplitude == 0 &&
+ timer_expired32(g_rgb_timer, drop_timer)) {
+ // Spawn a new drop, located at a random LED.
+ const uint8_t i = random8_max(RGB_MATRIX_LED_COUNT);
+ drops[drops_tail].time = (uint16_t)g_rgb_timer;
+ drops[drops_tail].x = g_led_config.point[i].x;
+ drops[drops_tail].y = g_led_config.point[i].y;
+ drops[drops_tail].amplitude = 1;
+ ++drops_tail;
+ if (drops_tail == 3) {
+ drops_tail = 0;
+ }
+ drop_timer = g_rgb_timer + 1000;
+ }
+
+ uint8_t amplitude(uint8_t t) { // Drop amplitude as a function of time.
+ if (t <= 55) {
+ return (t < 32) ? (3 + 5 * t) : 192;
+ } else {
+ t = (((uint16_t)(255 - t)) * UINT16_C(123)) >> 7;
+ return scale8(t, t);
+ }
+ }
+
+ for (uint8_t j = 0; j < 3; ++j) {
+ if (drops[j].amplitude == 0) {
+ continue;
+ }
+ const uint16_t tick = scale16by8(g_rgb_timer - drops[j].time,
+ 1 + rgb_matrix_config.speed / 4);
+ if (tick < 4 * 255) {
+ const uint8_t t = (uint8_t)(tick / 4);
+ drops[j].amplitude = amplitude(t);
+ drops[j].scale = 255 / (1 + t / 2);
+ drops[j].phase = (uint8_t)tick;
+ } else {
+ drops[j].amplitude = 0; // Animation for this drop is complete.
+ }
+ }
+ }
+
+ for (uint8_t i = led_min; i < led_max; ++i) {
+ RGB_MATRIX_TEST_LED_FLAGS();
+ int16_t value = 128;
+
+ for (uint8_t j = 0; j < 3; ++j) {
+ if (drops[j].amplitude == 0) {
+ continue;
+ }
+
+ const uint8_t x = abs8((g_led_config.point[i].x - drops[j].x) / 2);
+ const uint8_t y = abs8((g_led_config.point[i].y - drops[j].y) / 2);
+ const uint8_t r = sqrt16(x * x + y * y);
+ const uint16_t r_scaled = (uint16_t)r * (uint16_t)drops[j].scale;
+
+ if (r_scaled < 255) {
+ // The drop is made from a radial sine wave modulated by a smooth bump
+ // to localize its spatial extent.
+ const uint8_t bump = scale8(ease8InOutApprox(255 - (uint8_t)r_scaled),
+ drops[j].amplitude);
+ const int8_t wave = (int16_t)cos8(8 * r - drops[j].phase) - 128;
+ value += ((int16_t)wave * (int16_t)bump) / 128;
+ }
+ }
+
+ // Clip `value` to 0-255 range.
+ if (value < 0) {
+ value = 0;
+ }
+ if (value > 255) {
+ value = 255;
+ }
+ rgb_t rgb =
+ rgb_matrix_hsv_to_rgb(palettefx_interp_color(palette, (uint8_t)value));
+ rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
+ }
+
+ return rgb_matrix_check_finished_leds(led_max);
+}
+#endif
+
+#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_SPARKLE_ENABLE)
+// "Sparkle" effect. Each LED is animated by a sine wave with pseudorandom
+// phase, so that the matrix "sparkles." All the LED sines are modulated by a
+// global amplitude factor, which varies by a slower sine wave, so that the
+// matrix as a whole periodically brightens and dims.
+static bool PALETTEFX_SPARKLE(effect_params_t *params) {
+ RGB_MATRIX_USE_LIMITS(led_min, led_max);
+ const uint16_t *palette = palettefx_get_palette_data();
+ const uint8_t time =
+ palettefx_scaled_time(g_rgb_timer, 1 + rgb_matrix_config.speed / 8);
+ const uint8_t amplitude = 128 + sin8(time) / 2;
+ uint16_t rand_state = 1 + params->iter;
+
+ for (uint8_t i = led_min; i < led_max; ++i) {
+ RGB_MATRIX_TEST_LED_FLAGS();
+ // Multiplicative congruential generator for a random phase for each LED.
+ rand_state *= UINT16_C(36563);
+ const uint8_t phase = (uint8_t)(rand_state >> 8);
+
+ const uint8_t value = scale8(sin8(2 * time + phase), amplitude);
+
+ rgb_t rgb = rgb_matrix_hsv_to_rgb(palettefx_interp_color(palette, value));
+ rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
+ }
+
+ return rgb_matrix_check_finished_leds(led_max);
+}
+#endif
+
+#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_SPARKLE_ENABLE)
+// "Vortex" animated effect. LEDs are animated according to a polar function
+// with the appearance of a spinning vortex centered on k_rgb_matrix_center.
+static bool PALETTEFX_VORTEX(effect_params_t *params) {
+ RGB_MATRIX_USE_LIMITS(led_min, led_max);
+ const uint16_t *palette = palettefx_get_palette_data();
+ const uint16_t time =
+ palettefx_scaled_time(g_rgb_timer, 1 + rgb_matrix_config.speed / 4);
+
+ for (uint8_t i = led_min; i < led_max; ++i) {
+ RGB_MATRIX_TEST_LED_FLAGS();
+ const int16_t x = g_led_config.point[i].x - k_rgb_matrix_center.x;
+ const int16_t y = g_led_config.point[i].y - k_rgb_matrix_center.y;
+ uint8_t value = sin8(atan2_8(y, x) + time - sqrt16(x * x + y * y) / 2);
+
+ rgb_t rgb = rgb_matrix_hsv_to_rgb(palettefx_interp_color(palette, value));
+ rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
+ }
+
+ return rgb_matrix_check_finished_leds(led_max);
+}
+#endif
+
+#if defined(RGB_MATRIX_KEYREACTIVE_ENABLED) && \
+ (defined(PALETTEFX_ENABLE_ALL_EFFECTS) || \
+ defined(PALETTEFX_REACTIVE_ENABLE))
+// Reactive animated effect. This effect is "reactive," it responds to key
+// presses. For each key press, LEDs near the key change momentarily.
+static bool PALETTEFX_REACTIVE(effect_params_t *params) {
+ RGB_MATRIX_USE_LIMITS(led_min, led_max);
+ const uint16_t *palette = palettefx_get_palette_data();
+ const uint8_t count = g_last_hit_tracker.count;
+
+ uint8_t amplitude(uint8_t t) { // Bump amplitude as a function of time.
+ if (t <= 55) {
+ return (t < 32) ? (4 + 8 * t) : 255;
+ } else {
+ t = (((uint16_t)(255 - t)) * UINT16_C(164)) >> 7;
+ return scale8(t, t);
+ }
+ }
+
+ uint8_t hit_amplitude[LED_HITS_TO_REMEMBER] = {0};
+ for (uint8_t j = 0; j < count; ++j) {
+ const uint16_t tick =
+ scale16by8(g_last_hit_tracker.tick[j], 1 + rgb_matrix_config.speed / 4);
+ if (tick <= 255) {
+ hit_amplitude[j] = amplitude((uint8_t)tick);
+ }
+ }
+
+ for (uint8_t i = led_min; i < led_max; ++i) {
+ RGB_MATRIX_TEST_LED_FLAGS();
+ uint8_t value = 0;
+
+ for (uint8_t j = 0; j < count; ++j) {
+ if (hit_amplitude[j] == 0) {
+ continue;
+ }
+
+ uint8_t dx =
+ abs8((g_led_config.point[i].x - g_last_hit_tracker.x[j]) / 2);
+ uint8_t dy =
+ abs8((g_led_config.point[i].y - g_last_hit_tracker.y[j]) / 2);
+ if (dx < 21 && dy < 21) {
+ const uint16_t dist_sqr = dx * dx + dy * dy;
+ if (dist_sqr < 21 * 21) { // Accumulate a radial bump for each hit.
+ const uint8_t dist = sqrt16(dist_sqr);
+ value = qadd8(value, scale8(255 - 12 * dist, hit_amplitude[j]));
+ // Early loop exit where the value has saturated.
+ if (value == 255) {
+ break;
+ }
+ }
+ }
+ }
+
+ hsv_t hsv = palettefx_interp_color(palette, value);
+ if (value < 32) { // Make the background dark regardless of palette.
+ hsv.v = scale8(hsv.v, 64 + 6 * value);
+ }
+
+ const rgb_t rgb = rgb_matrix_hsv_to_rgb(hsv);
+ rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
+ }
+ return rgb_matrix_check_finished_leds(led_max);
+}
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+// PaletteFx implementation
+///////////////////////////////////////////////////////////////////////////////
+
+/**
+ * @brief 16-bit HSV color.
+ *
+ * Represents a color with a 16-bit value in hue-saturation-value (HSV) space.
+ * Components are packed as:
+ *
+ * - Hue: lowest 8 bits.
+ * - Saturation: middle 4 bits.
+ * - Value: highest 4 bits.
+ */
+#define HSV16(h, s, v) ((((v) >> 4) << 12) | (((s) >> 4) << 8) | ((h) & 0xff))
+
+/** Unpacks 16-bit HSV color to hsv_t. */
+static hsv_t unpack_hsv16(uint16_t hsv16) {
+ return (hsv_t){
+ .h = (uint8_t)hsv16,
+ .s = ((uint8_t)(hsv16 >> 8) & 0x0f) * 17,
+ .v = ((uint8_t)(hsv16 >> 12) & 0x0f) * 17,
+ };
+}
+
+/** PaletteFx palette color data. */
+static const uint16_t palettefx_palettes[][16] PROGMEM = {
+#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || \
+ defined(PALETTEFX_AFTERBURN_ENABLE)
+ // "Afterburn" palette.
+ {
+ HSV16(139, 255, 85),
+ HSV16(134, 255, 85),
+ HSV16(131, 255, 102),
+ HSV16(128, 255, 102),
+ HSV16(127, 187, 102),
+ HSV16(125, 119, 102),
+ HSV16(124, 51, 102),
+ HSV16(125, 0, 119),
+ HSV16(15, 17, 119),
+ HSV16(17, 51, 153),
+ HSV16(18, 102, 170),
+ HSV16(19, 153, 204),
+ HSV16(21, 187, 238),
+ HSV16(23, 238, 255),
+ HSV16(26, 255, 255),
+ HSV16(30, 255, 255),
+ },
+#endif
+#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_AMBER_ENABLE)
+ // "Amber" palette.
+ {
+ HSV16(5, 187, 170),
+ HSV16(15, 221, 170),
+ HSV16(22, 238, 187),
+ HSV16(23, 238, 187),
+ HSV16(25, 255, 204),
+ HSV16(27, 255, 221),
+ HSV16(29, 255, 238),
+ HSV16(29, 255, 255),
+ HSV16(28, 187, 255),
+ HSV16(30, 68, 255),
+ HSV16(32, 34, 255),
+ HSV16(32, 34, 255),
+ HSV16(26, 119, 255),
+ HSV16(24, 238, 255),
+ HSV16(21, 221, 255),
+ HSV16(16, 204, 255),
+ },
+#endif
+#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_BADWOLF_ENABLE)
+ // "Bad Wolf" palette. Inspired by the Bad Wolf theme by Steve Losh, which
+ // is
+ // distributed under MIT/X11 license.
+ // https://github.com/sjl/badwolf/tree/61d75affa51d40213d671edc9c8ff83992d7fd6f
+ {
+ HSV16(14, 34, 0),
+ HSV16(245, 255, 255),
+ HSV16(245, 255, 255),
+ HSV16(245, 255, 255),
+ HSV16(14, 34, 0),
+ HSV16(14, 34, 0),
+ HSV16(14, 34, 0),
+ HSV16(14, 34, 0),
+ HSV16(14, 34, 0),
+ HSV16(14, 34, 0),
+ HSV16(24, 17, 136),
+ HSV16(28, 0, 255),
+ HSV16(24, 17, 136),
+ HSV16(14, 34, 0),
+ HSV16(14, 34, 0),
+ HSV16(14, 34, 0),
+ },
+#endif
+#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_CARNIVAL_ENABLE)
+ // "Carnival" palette.
+ {
+ HSV16(132, 255, 85),
+ HSV16(121, 187, 85),
+ HSV16(108, 170, 102),
+ HSV16(90, 153, 119),
+ HSV16(70, 187, 136),
+ HSV16(57, 255, 153),
+ HSV16(50, 255, 187),
+ HSV16(44, 255, 204),
+ HSV16(39, 255, 238),
+ HSV16(32, 255, 255),
+ HSV16(27, 255, 255),
+ HSV16(22, 255, 255),
+ HSV16(18, 255, 255),
+ HSV16(8, 221, 238),
+ HSV16(252, 204, 238),
+ HSV16(241, 255, 221),
+ },
+#endif
+#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_CLASSIC_ENABLE)
+ // "Classic" palette.
+ {
+ HSV16(150, 255, 85),
+ HSV16(151, 238, 119),
+ HSV16(160, 136, 119),
+ HSV16(176, 102, 136),
+ HSV16(193, 85, 136),
+ HSV16(216, 85, 136),
+ HSV16(234, 102, 153),
+ HSV16(247, 119, 187),
+ HSV16(3, 153, 204),
+ HSV16(10, 204, 221),
+ HSV16(15, 255, 255),
+ HSV16(18, 255, 255),
+ HSV16(23, 255, 255),
+ HSV16(24, 204, 255),
+ HSV16(25, 136, 255),
+ HSV16(26, 85, 255),
+ },
+#endif
+#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_DRACULA_ENABLE)
+ // "Dracula" palette. Inspired by the Dracula theme by Zeno Rocha, which is
+ // distributed under MIT license.
+ // https://github.com/dracula/dracula-theme/tree/ac4dc82dab2a3c35e5cac0cd80c97fbf4c2ca986
+ {
+ HSV16(165, 153, 119),
+ HSV16(167, 153, 136),
+ HSV16(170, 170, 187),
+ HSV16(173, 170, 221),
+ HSV16(177, 170, 238),
+ HSV16(183, 170, 255),
+ HSV16(190, 170, 255),
+ HSV16(200, 153, 255),
+ HSV16(216, 153, 255),
+ HSV16(230, 170, 255),
+ HSV16(2, 153, 255),
+ HSV16(29, 153, 238),
+ HSV16(44, 255, 255),
+ HSV16(53, 238, 255),
+ HSV16(63, 238, 238),
+ HSV16(85, 238, 238),
+ },
+#endif
+#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_GROOVY_ENABLE)
+ // "Groovy" palette. Inspired by the Gruvbox theme by Pavel Pertsev, which
+ // is
+ // distributed under MIT/X11 license.
+ // https://github.com/morhetz/gruvbox/tree/f1ecde848f0cdba877acb0c740320568252cc482
+ {
+ HSV16(26, 136, 187),
+ HSV16(23, 85, 102),
+ HSV16(21, 85, 85),
+ HSV16(21, 85, 85),
+ HSV16(21, 85, 85),
+ HSV16(17, 102, 102),
+ HSV16(5, 204, 255),
+ HSV16(4, 255, 255),
+ HSV16(4, 255, 255),
+ HSV16(7, 204, 255),
+ HSV16(23, 136, 187),
+ HSV16(26, 136, 187),
+ HSV16(28, 136, 187),
+ HSV16(50, 238, 238),
+ HSV16(54, 255, 238),
+ HSV16(54, 255, 238),
+ },
+#endif
+#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_NOTPINK_ENABLE)
+ // "Not Pink" palette.
+ {
+ HSV16(9, 255, 153),
+ HSV16(3, 221, 187),
+ HSV16(252, 204, 187),
+ HSV16(248, 204, 187),
+ HSV16(247, 187, 204),
+ HSV16(245, 187, 238),
+ HSV16(244, 170, 255),
+ HSV16(245, 153, 255),
+ HSV16(252, 102, 255),
+ HSV16(16, 68, 255),
+ HSV16(40, 34, 255),
+ HSV16(32, 51, 255),
+ HSV16(6, 85, 255),
+ HSV16(248, 136, 255),
+ HSV16(247, 187, 255),
+ HSV16(249, 221, 255),
+ },
+#endif
+#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_PHOSPHOR_ENABLE)
+ // "Phosphor" palette.
+ {
+ HSV16(116, 102, 34),
+ HSV16(113, 170, 51),
+ HSV16(113, 255, 68),
+ HSV16(110, 255, 68),
+ HSV16(109, 255, 85),
+ HSV16(105, 255, 102),
+ HSV16(95, 238, 102),
+ HSV16(85, 238, 119),
+ HSV16(84, 255, 136),
+ HSV16(84, 255, 153),
+ HSV16(83, 255, 187),
+ HSV16(80, 238, 204),
+ HSV16(69, 221, 238),
+ HSV16(46, 204, 255),
+ HSV16(42, 153, 255),
+ HSV16(40, 102, 255),
+ },
+#endif
+#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || \
+ defined(PALETTEFX_POLARIZED_ENABLE)
+ // "Polarized" palette. Inspired by the Solarized theme by Ethan Schoonover,
+ // which is distributed under MIT license.
+ // https://github.com/altercation/solarized/tree/62f656a02f93c5190a8753159e34b385588d5ff3
+ {
+ HSV16(139, 255, 68),
+ HSV16(139, 221, 85),
+ HSV16(139, 204, 102),
+ HSV16(138, 204, 119),
+ HSV16(137, 204, 136),
+ HSV16(137, 187, 170),
+ HSV16(137, 153, 187),
+ HSV16(132, 170, 187),
+ HSV16(126, 187, 238),
+ HSV16(124, 102, 255),
+ HSV16(124, 102, 255),
+ HSV16(124, 187, 255),
+ HSV16(130, 170, 204),
+ HSV16(137, 153, 187),
+ HSV16(137, 153, 204),
+ HSV16(137, 136, 221),
+ },
+#endif
+#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_ROSEGOLD_ENABLE)
+ // "Rose Gold" palette.
+ {
+ HSV16(246, 255, 204),
+ HSV16(250, 238, 221),
+ HSV16(253, 221, 238),
+ HSV16(1, 221, 255),
+ HSV16(6, 221, 255),
+ HSV16(12, 221, 255),
+ HSV16(18, 204, 255),
+ HSV16(22, 170, 255),
+ HSV16(20, 204, 255),
+ HSV16(17, 221, 255),
+ HSV16(12, 221, 255),
+ HSV16(7, 221, 255),
+ HSV16(255, 204, 255),
+ HSV16(248, 204, 255),
+ HSV16(241, 238, 255),
+ HSV16(235, 255, 255),
+ },
+#endif
+#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_SPORT_ENABLE)
+ // "Sport" palette.
+ {
+ HSV16(156, 102, 51),
+ HSV16(155, 102, 68),
+ HSV16(155, 102, 68),
+ HSV16(154, 102, 68),
+ HSV16(155, 102, 85),
+ HSV16(156, 85, 102),
+ HSV16(158, 68, 119),
+ HSV16(159, 51, 136),
+ HSV16(158, 17, 153),
+ HSV16(130, 0, 170),
+ HSV16(49, 17, 204),
+ HSV16(42, 51, 238),
+ HSV16(39, 85, 255),
+ HSV16(37, 119, 255),
+ HSV16(36, 170, 255),
+ HSV16(36, 255, 255),
+ },
+#endif
+#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || \
+ defined(PALETTEFX_SYNTHWAVE_ENABLE)
+ // "Synthwave" palette.
+ {
+ HSV16(170, 221, 119),
+ HSV16(180, 221, 153),
+ HSV16(196, 238, 153),
+ HSV16(209, 255, 153),
+ HSV16(220, 255, 170),
+ HSV16(227, 255, 204),
+ HSV16(233, 255, 238),
+ HSV16(245, 204, 255),
+ HSV16(3, 170, 255),
+ HSV16(13, 187, 255),
+ HSV16(21, 204, 255),
+ HSV16(28, 221, 255),
+ HSV16(43, 255, 255),
+ HSV16(42, 255, 255),
+ HSV16(68, 68, 255),
+ HSV16(132, 255, 255),
+ },
+#endif
+#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_THERMAL_ENABLE)
+ // "Thermal" palette.
+ {
+ HSV16(7, 0, 17),
+ HSV16(8, 0, 17),
+ HSV16(12, 0, 34),
+ HSV16(13, 0, 51),
+ HSV16(15, 17, 51),
+ HSV16(16, 17, 68),
+ HSV16(20, 34, 85),
+ HSV16(95, 0, 102),
+ HSV16(126, 85, 119),
+ HSV16(112, 85, 153),
+ HSV16(54, 136, 187),
+ HSV16(39, 238, 221),
+ HSV16(33, 255, 255),
+ HSV16(25, 238, 255),
+ HSV16(13, 238, 255),
+ HSV16(5, 238, 255),
+ },
+#endif
+#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_VIRIDIS_ENABLE)
+ // "Viridis" palette. Inspired by the Viridis colormap by Stefan van der
+ // Walt
+ // and Nathaniel Smith, which is distributed under CC0 license.
+ // https://github.com/BIDS/colormap/blob/bc549477db0c12b54a5928087552ad2cf274980f/colormaps.py
+ {
+ HSV16(204, 221, 102),
+ HSV16(194, 187, 119),
+ HSV16(183, 153, 136),
+ HSV16(169, 119, 153),
+ HSV16(155, 153, 153),
+ HSV16(145, 170, 153),
+ HSV16(137, 187, 153),
+ HSV16(130, 204, 153),
+ HSV16(123, 221, 153),
+ HSV16(117, 221, 170),
+ HSV16(108, 187, 187),
+ HSV16(93, 153, 204),
+ HSV16(71, 170, 221),
+ HSV16(56, 221, 221),
+ HSV16(46, 255, 238),
+ HSV16(39, 255, 255),
+ },
+#endif
+#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || \
+ defined(PALETTEFX_WATERMELON_ENABLE)
+ // "Watermelon" palette.
+ {
+ HSV16(67, 255, 102),
+ HSV16(55, 255, 153),
+ HSV16(47, 255, 204),
+ HSV16(48, 136, 238),
+ HSV16(48, 68, 255),
+ HSV16(45, 34, 255),
+ HSV16(39, 34, 255),
+ HSV16(17, 85, 255),
+ HSV16(8, 187, 255),
+ HSV16(1, 255, 255),
+ HSV16(2, 238, 255),
+ HSV16(2, 238, 255),
+ HSV16(0, 238, 255),
+ HSV16(253, 255, 238),
+ HSV16(254, 255, 238),
+ HSV16(255, 255, 221),
+ },
+#endif
+#if __has_include("palettefx_user.inc") // Include user palettes if present.
+#include "palettefx_user.inc"
+#endif
+};
+/** Number of palettes. User palettes, if any, are included in the count. */
+#define NUM_PALETTEFX_PALETTES \
+ (sizeof(palettefx_palettes) / sizeof(*palettefx_palettes))
+
+// Validate at compile time that `1 <= NUM_PALETTEFX_PALETTES <= 32`. The upper
+// limit is due to using RGB Matrix's hue config to select palettes.
+_Static_assert(
+ NUM_PALETTEFX_PALETTES >= 1,
+ "palettefx: No palettes are enabled. To fix: enable all built-in palettes "
+ "by adding in config.h `#define PALETTE_ENABLE_ALL_PALETTES`, or enable at "
+ "least one with `#define PALETTE_<name>_ENABLE`, or define at least one "
+ "custom palette in palettefx_user.inc.");
+_Static_assert(
+ NUM_PALETTEFX_PALETTES <= 256 / RGB_MATRIX_HUE_STEP,
+ "palettefx: Too many palettes. Up to 32 (= 256 / RGB_MATRIX_HUE_STEP) "
+ "palettes are supported. Otherwise, some palettes would be unreachable.");
+
+/** Gets the index of the selected palette. */
+static uint8_t palettefx_get_palette(void) {
+ uint8_t i =
+ (rgb_matrix_get_hue() / RGB_MATRIX_HUE_STEP) % NUM_PALETTEFX_PALETTES;
+
+ if (256 % (RGB_MATRIX_HUE_STEP * NUM_PALETTEFX_PALETTES) != 0) {
+ // Hue wraps mod 256. If NUM_PALETTEFX_PALETTES is not a power of 2, modulo
+ // 256 wraps would jump, and adjustment is needed to cycle as desired:
+ //
+ // * If the hue is a step or less from 256, assume it has wrapped down
+ // from 0 and the last palette is selected.
+ // * Otherwise, i = ((hue / step) % NUM_PALETTEFX_PALETTES) is used. If
+ // 256 - 2 * step <= hue < 256 - step, hue is set to (step * i).
+ hsv_t hsv = rgb_matrix_get_hsv();
+ if (hsv.h >= 256 - 2 * RGB_MATRIX_HUE_STEP) {
+ if (hsv.h >= 256 - RGB_MATRIX_HUE_STEP) {
+ i = NUM_PALETTEFX_PALETTES - 1;
+ hsv.h = RGB_MATRIX_HUE_STEP *
+ ((256 / (RGB_MATRIX_HUE_STEP * NUM_PALETTEFX_PALETTES)) *
+ NUM_PALETTEFX_PALETTES -
+ 1);
+ } else {
+ i %= NUM_PALETTEFX_PALETTES;
+ hsv.h = RGB_MATRIX_HUE_STEP * i;
+ }
+ rgb_matrix_sethsv_noeeprom(hsv.h, hsv.s, hsv.v);
+ }
+ }
+
+ return i;
+}
+
+static const uint16_t *palettefx_get_palette_data(void) {
+ return palettefx_palettes[palettefx_get_palette()];
+}
+
+static hsv_t palettefx_interp_color(const uint16_t *palette, uint8_t x) {
+ // Clamp `x` to [8, 247] and subtract 8, mapping to the range [0, 239].
+ x = (x <= 8) ? 0 : ((x < 247) ? (x - 8) : 239);
+ // Get index into the palette, 0 <= i <= 14.
+ const uint8_t i = x >> 4;
+ // Fractional position between i and (i + 1).
+ const uint8_t frac = x << 4;
+
+ // Look up palette colors at i and (i + 1).
+ hsv_t a = unpack_hsv16(pgm_read_word(&palette[i]));
+ hsv_t b = unpack_hsv16(pgm_read_word(&palette[i + 1]));
+
+ // Linearly interpolate in HSV, accounting for wrapping in hue.
+ const uint8_t hue_wrap = 128 & (a.h >= b.h ? (a.h - b.h) : (b.h - a.h));
+ return (hsv_t){
+ .h = lerp8by8(a.h ^ hue_wrap, b.h ^ hue_wrap, frac) ^ hue_wrap,
+ .s = scale8(lerp8by8(a.s, b.s, frac), rgb_matrix_config.hsv.s),
+ .v = scale8(lerp8by8(a.v, b.v, frac), rgb_matrix_config.hsv.v),
+ };
+}
+
+static uint16_t palettefx_scaled_time(uint32_t timer, uint8_t scale) {
+ static uint16_t wrap_correction = 0;
+ static uint8_t last_high_byte = 0;
+ const uint8_t high_byte = (uint8_t)(timer >> 16);
+
+ if (last_high_byte != high_byte) {
+ last_high_byte = high_byte;
+ wrap_correction += ((uint16_t)scale) << 8;
+ }
+
+ return scale16by8(timer, scale) + wrap_correction;
+}
+
+#endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS
diff --git a/jack/rules.mk b/jack/rules.mk
index c6f1b2b..71ddad7 100644
--- a/jack/rules.mk
+++ b/jack/rules.mk
@@ -16,35 +16,34 @@ MOUSE_JIGGLE_ENABLE = yes
CUSTOM_TAP_CODE_ENABLE = no
DEBOUNCE_TYPE = asym_eager_defer_pk
AVR_CFLAGS += -mrelax
-INTROSPECTION_KEYMAP_C = jack.c
+INTROSPECTION_KEYMAP_C = introspection.c
-SRC += tapping.c
+SRC += $(USER_PATH)/jack.c $(USER_PATH)/tapping.c
ifeq ($(strip $(OLED_ENABLE)), yes)
- SRC += oled.c
+ SRC += $(USER_PATH)/oled.c
WPM_ENABLE = yes
endif
+ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes)
+ RGB_MATRIX_CUSTOM_USER = yes
+ SRC += $(USER_PATH)/color.c
+endif
+
ifeq ($(strip $(UNICODE_COMMON)), yes)
UNICODE_ENABLE = no
- SRC += unicode.c
+ SRC += $(USER_PATH)/unicode.c
endif
ifeq ($(strip $(CUSTOM_TAP_CODE_ENABLE)), yes)
OPT_DEFS += -DCUSTOM_TAP_CODE_ENABLE
- SRC += tap_code.c
+ SRC += $(USER_PATH)tap_code.c
endif
ifeq ($(PLATFORM), CHIBIOS)
- EXTRAFLAGS += -Os
-endif
-
-ifneq ($(findstring Gentoo, $(shell arm-none-eabi-gcc --version)),)
- EXTRAFLAGS += -U_FORTIFY_SOURCE
-endif
-
-ifeq ($(strip $(MOUSE_JIGGLE_ENABLE)), yes)
- OPT_DEFS += -DMOUSE_JIGGLE_ENABLE
- MOUSEKEY_ENABLE = yes
- DEFERRED_EXEC_ENABLE = yes
+ ifeq ($(MCU_SERIES), RP2040)
+ RP2040_MATH_IN_ROM = no
+ PROGRAM_CMD = doas picotool load $(BUILD_DIR)/$(TARGET).uf2
+ endif
+ EXTRAFLAGS += -O3
endif
diff --git a/jack/tapping.c b/jack/tapping.c
index 800d67d..d58b70b 100644
--- a/jack/tapping.c
+++ b/jack/tapping.c
@@ -30,6 +30,7 @@ uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
}
}
+#ifdef TAP_DANCE_ENABLE
void td_reset(tap_dance_state_t *state, void *user_data) {
clear_keyboard();
layer_clear();
@@ -70,6 +71,7 @@ void raise_paste(tap_dance_state_t *state, void *user_data) {
else if (state->count == 1)
tap_code16(C(S(KC_V)));
}
+#endif
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
#ifdef UNICODE_COMMON_ENABLE
diff --git a/keyboards/endgame/readme.md b/keyboards/endgame/readme.md
deleted file mode 100644
index 2c6e6f9..0000000
--- a/keyboards/endgame/readme.md
+++ /dev/null
@@ -1,5 +0,0 @@
-### endgame
-by [oldman6955](https://github.com/OldMan6955/TheEndgame2024)
-![img1]()
-![img2]()
-![img3]()
diff --git a/keyboards/leftover30/chconf.h b/keyboards/leftover30/chconf.h
deleted file mode 100644
index 3889564..0000000
--- a/keyboards/leftover30/chconf.h
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2025 [email protected]
-// SPDX-License-Identifier: GPL-3.0-or-later
-#pragma once
-
-#define CH_CFG_ST_FREQUENCY 10000
-#define CH_CFG_OPTIMIZE_SPEED FALSE
-#define CH_CFG_USE_CONDVARS_TIMEOUT FALSE
-
-#include_next <chconf.h>
diff --git a/keyboards/leftover30/config.h b/keyboards/leftover30/config.h
deleted file mode 100644
index c453ecd..0000000
--- a/keyboards/leftover30/config.h
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright 2025 [email protected]
-// SPDX-License-Identifier: GPL-3.0-or-later
-#pragma once
-
-#define WS2812_SPI_DRIVER SPID2
-#define WS2812_SPI_MOSI_PAL_MODE 0
-#define WS2812_SPI_SCK_PIN B13
-#define WS2812_EXTERNAL_PULLUP
diff --git a/keyboards/leftover30/keyboard.json b/keyboards/leftover30/keyboard.json
deleted file mode 100644
index 0a32fff..0000000
--- a/keyboards/leftover30/keyboard.json
+++ /dev/null
@@ -1,75 +0,0 @@
-{
- "keyboard_name": "leftover30",
- "manufacturer": "jacks",
- "maintainer": "pngu.org",
- "processor": "STM32F072",
- "bootloader": "stm32-dfu",
- "diode_direction": "COL2ROW",
- "encoder": {
- "rotary": [
- {"pin_a": "B12", "pin_b": "B14"}
- ]
- },
- "features": {
- "rgblight": true,
- "encoder": true
- },
- "matrix_pins": {
- "cols": ["A15", "B9", "B8", "B7", "B6", "B5", "C14", "C15", "F1", "F0", "A1"],
- "rows": ["B3", "B4", "C13", "A5"]
- },
- "rgblight": {
- "led_count": 7
- },
- "ws2812": {
- "pin": "B15",
- "driver": "spi"
- },
- "usb": {
- "pid": "0x6C6F",
- "vid": "0x6A73",
- "device_version": "1.0.0"
- },
- "layouts": {
- "LAYOUT": {
- "layout": [
- {"matrix": [0, 0], "x": 0.5, "y": 0},
- {"matrix": [0, 1], "x": 1.5, "y": 0},
- {"matrix": [0, 2], "x": 2.5, "y": 0},
- {"matrix": [0, 3], "x": 3.5, "y": 0},
- {"matrix": [0, 4], "x": 4.5, "y": 0},
- {"matrix": [0, 5], "x": 5.5, "y": 0},
- {"matrix": [0, 6], "x": 6.5, "y": 0},
- {"matrix": [0, 7], "x": 7.5, "y": 0},
- {"matrix": [0, 8], "x": 8.5, "y": 0},
- {"matrix": [0, 9], "x": 9.5, "y": 0},
- {"matrix": [0, 10], "x": 10.5, "y": 0},
- {"matrix": [1, 0], "x": 0.75, "y": 1},
- {"matrix": [1, 1], "x": 1.75, "y": 1},
- {"matrix": [1, 2], "x": 2.75, "y": 1},
- {"matrix": [1, 3], "x": 3.75, "y": 1},
- {"matrix": [1, 4], "x": 4.75, "y": 1},
- {"matrix": [1, 5], "x": 5.75, "y": 1},
- {"matrix": [1, 6], "x": 6.75, "y": 1},
- {"matrix": [1, 7], "x": 7.75, "y": 1},
- {"matrix": [1, 8], "x": 8.75, "y": 1},
- {"matrix": [1, 10], "x": 9.75, "y": 1, "w": 1.75},
- {"matrix": [2, 0], "x": 1, "y": 2},
- {"matrix": [2, 1], "x": 2, "y": 2},
- {"matrix": [2, 2], "x": 3, "y": 2},
- {"matrix": [2, 3], "x": 4, "y": 2},
- {"matrix": [2, 4], "x": 5, "y": 2},
- {"matrix": [2, 5], "x": 6, "y": 2},
- {"matrix": [2, 6], "x": 7, "y": 2},
- {"matrix": [2, 7], "x": 8, "y": 2},
- {"matrix": [2, 8], "x": 9, "y": 2},
- {"matrix": [2, 9], "x": 10, "y": 2, "w": 1.25},
- {"matrix": [3, 0], "x": 0, "y": 3},
- {"matrix": [3, 1], "x": 1.25, "y": 3, "w": 1.25},
- {"matrix": [3, 5], "x": 2.5, "y": 3, "w": 6.25},
- {"matrix": [3, 8], "x": 8.75, "y": 3},
- {"matrix": [3, 9], "x": 9.75, "y": 3, "w": 1.5}
- ]
- }
- }
-}
diff --git a/keyboards/leftover30/mcuconf.h b/keyboards/leftover30/mcuconf.h
deleted file mode 100644
index ec84251..0000000
--- a/keyboards/leftover30/mcuconf.h
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright 2025 [email protected]
-// SPDX-License-Identifier: GPL-3.0-or-later
-#pragma once
-
-#include_next <mcuconf.h>
-
-#undef STM32_SPI_USE_SPI2
-#define STM32_SPI_USE_SPI2 TRUE
diff --git a/keyboards/leftover30/readme.md b/keyboards/leftover30/readme.md
deleted file mode 100644
index d6ce8e1..0000000
--- a/keyboards/leftover30/readme.md
+++ /dev/null
@@ -1,5 +0,0 @@
-### leftover30
-originally designed by [marksard](https://github.com/marksard/Keyboards/tree/master/leftover30), but the pcb seems to be mia...\
-(arm) pcb redesigned by [tominabox1](https://github.com/tominabox1) with a somewhat jank case from p3d.
-![front](https://i.imgur.com/O6vY5om.jpeg)
-![back](https://i.imgur.com/on9pBoA.jpeg)
diff --git a/keyboards/pseusplit/config.h b/keyboards/pseusplit/config.h
new file mode 100644
index 0000000..16bd734
--- /dev/null
+++ b/keyboards/pseusplit/config.h
@@ -0,0 +1,19 @@
+// Copyright 2025 [email protected]
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#define AZOTEQ_IQS5XX_TPS43
+
+#define IS31FL3733_I2C_ADDRESS_1 IS31FL3733_I2C_ADDRESS_GND_GND
+
+#define SPI_DRIVER SPID1
+#define SPI_SCK_PIN B3
+#define SPI_MOSI_PIN B5
+#define SPI_MISO_PIN B4
+
+#define LCD_DC_PIN D1
+#define LCD_CS_PIN D3
+#define LCD_RST_PIN D2
+#define LCD_SPI_DIVISOR 4
+#define ST7789_HEIGHT 240
+#define ST7789_WIDTH 240
diff --git a/keyboards/leftover30/halconf.h b/keyboards/pseusplit/halconf.h
index bfed83f..7470f67 100644
--- a/keyboards/leftover30/halconf.h
+++ b/keyboards/pseusplit/halconf.h
@@ -1,7 +1,9 @@
// Copyright 2025 [email protected]
-// SPDX-License-Identifier: GPL-3.0-or-later
+// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
+#define HAL_USE_I2C TRUE
+
#define HAL_USE_SPI TRUE
#include_next <halconf.h>
diff --git a/keyboards/pseusplit/keyboard.json b/keyboards/pseusplit/keyboard.json
new file mode 100644
index 0000000..000c680
--- /dev/null
+++ b/keyboards/pseusplit/keyboard.json
@@ -0,0 +1,110 @@
+{
+ "manufacturer": "pngu.org",
+ "keyboard_name": "pseusplit",
+ "maintainer": "jack",
+ "bootloader": "stm32-dfu",
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "pointing_device": true,
+ "quantum_painter": false,
+ "rgb_matrix": true
+ },
+ "matrix_pins": {
+ "cols": ["C15", "C14", "C13", "B9", "B8", "A9", "A8", "B15", "B14", "B13"],
+ "rows": ["F1", "F0", "A10", "A15"]
+ },
+ "processor": "STM32G0B1",
+ "rgb_matrix": {
+ "driver": "is31fl3733",
+ "layout": [
+ { "matrix": [0, 0], "x": 0, "y": 0, "flags": 4 },
+ { "matrix": [0, 1], "x": 25, "y": 0, "flags": 4 },
+ { "matrix": [0, 2], "x": 50, "y": 0, "flags": 4 },
+ { "matrix": [0, 3], "x": 75, "y": 0, "flags": 4 },
+ { "matrix": [0, 4], "x": 100, "y": 0, "flags": 4 },
+ { "matrix": [0, 5], "x": 125, "y": 0, "flags": 4 },
+ { "matrix": [0, 6], "x": 150, "y": 0, "flags": 4 },
+ { "matrix": [0, 7], "x": 175, "y": 0, "flags": 4 },
+ { "matrix": [0, 8], "x": 200, "y": 0, "flags": 4 },
+ { "matrix": [0, 9], "x": 224, "y": 0, "flags": 4 },
+ { "matrix": [1, 0], "x": 0, "y": 21, "flags": 4 },
+ { "matrix": [1, 1], "x": 25, "y": 21, "flags": 4 },
+ { "matrix": [1, 2], "x": 50, "y": 21, "flags": 4 },
+ { "matrix": [1, 3], "x": 75, "y": 21, "flags": 4 },
+ { "matrix": [1, 4], "x": 100, "y": 21, "flags": 4 },
+ { "matrix": [1, 5], "x": 125, "y": 21, "flags": 4 },
+ { "matrix": [1, 6], "x": 150, "y": 21, "flags": 4 },
+ { "matrix": [1, 7], "x": 175, "y": 21, "flags": 4 },
+ { "matrix": [1, 8], "x": 200, "y": 21, "flags": 4 },
+ { "matrix": [1, 9], "x": 224, "y": 21, "flags": 4 },
+ { "matrix": [2, 0], "x": 0, "y": 42, "flags": 4 },
+ { "matrix": [2, 1], "x": 25, "y": 42, "flags": 4 },
+ { "matrix": [2, 2], "x": 50, "y": 42, "flags": 4 },
+ { "matrix": [2, 3], "x": 75, "y": 42, "flags": 4 },
+ { "matrix": [2, 4], "x": 100, "y": 42, "flags": 4 },
+ { "matrix": [2, 5], "x": 125, "y": 42, "flags": 4 },
+ { "matrix": [2, 6], "x": 150, "y": 42, "flags": 4 },
+ { "matrix": [2, 7], "x": 175, "y": 42, "flags": 4 },
+ { "matrix": [2, 8], "x": 200, "y": 42, "flags": 4 },
+ { "matrix": [2, 9], "x": 224, "y": 42, "flags": 4 },
+ { "matrix": [3, 2], "x": 50, "y": 64, "flags": 4 },
+ { "matrix": [3, 3], "x": 75, "y": 64, "flags": 4 },
+ { "matrix": [3, 4], "x": 100, "y": 64, "flags": 4 },
+ { "matrix": [3, 5], "x": 125, "y": 64, "flags": 4 },
+ { "matrix": [3, 6], "x": 150, "y": 64, "flags": 4 },
+ { "matrix": [3, 7], "x": 175, "y": 64, "flags": 4 }
+ ]
+ },
+ "url": "https://git.pngu.org/pseusplit",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x7073",
+ "vid": "0x6A73"
+ },
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ { "matrix": [0, 0], "x": 0, "y": 0 },
+ { "matrix": [0, 1], "x": 1, "y": 0 },
+ { "matrix": [0, 2], "x": 2, "y": 0 },
+ { "matrix": [0, 3], "x": 3, "y": 0 },
+ { "matrix": [0, 4], "x": 4, "y": 0 },
+ { "matrix": [0, 5], "x": 5, "y": 0 },
+ { "matrix": [0, 6], "x": 6, "y": 0 },
+ { "matrix": [0, 7], "x": 7, "y": 0 },
+ { "matrix": [0, 8], "x": 8, "y": 0 },
+ { "matrix": [0, 9], "x": 9, "y": 0 },
+ { "matrix": [1, 0], "x": 0, "y": 1 },
+ { "matrix": [1, 1], "x": 1, "y": 1 },
+ { "matrix": [1, 2], "x": 2, "y": 1 },
+ { "matrix": [1, 3], "x": 3, "y": 1 },
+ { "matrix": [1, 4], "x": 4, "y": 1 },
+ { "matrix": [1, 5], "x": 5, "y": 1 },
+ { "matrix": [1, 6], "x": 6, "y": 1 },
+ { "matrix": [1, 7], "x": 7, "y": 1 },
+ { "matrix": [1, 8], "x": 8, "y": 1 },
+ { "matrix": [1, 9], "x": 9, "y": 1 },
+ { "matrix": [2, 0], "x": 0, "y": 2 },
+ { "matrix": [2, 1], "x": 1, "y": 2 },
+ { "matrix": [2, 2], "x": 2, "y": 2 },
+ { "matrix": [2, 3], "x": 3, "y": 2 },
+ { "matrix": [2, 4], "x": 4, "y": 2 },
+ { "matrix": [2, 5], "x": 5, "y": 2 },
+ { "matrix": [2, 6], "x": 6, "y": 2 },
+ { "matrix": [2, 7], "x": 7, "y": 2 },
+ { "matrix": [2, 8], "x": 8, "y": 2 },
+ { "matrix": [2, 9], "x": 9, "y": 2 },
+ { "matrix": [3, 2], "x": 2, "y": 3 },
+ { "matrix": [3, 3], "x": 3, "y": 3 },
+ { "matrix": [3, 4], "x": 4, "y": 3 },
+ { "matrix": [3, 5], "x": 5, "y": 3 },
+ { "matrix": [3, 6], "x": 6, "y": 3 },
+ { "matrix": [3, 7], "x": 7, "y": 3 }
+ ]
+ }
+ }
+}
diff --git a/keyboards/pseusplit/keymaps/default/keymap.json b/keyboards/pseusplit/keymaps/default/keymap.json
new file mode 100644
index 0000000..d697741
--- /dev/null
+++ b/keyboards/pseusplit/keymaps/default/keymap.json
@@ -0,0 +1,13 @@
+{
+ "keyboard": "pseusplit",
+ "keymap": "default",
+ "layout": "LAYOUT",
+ "layers": [
+ [
+ "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P",
+ "KC_A", "KC_S", "KC_D", "KC_F", "KC_G", "KC_H", "KC_J", "KC_K", "KC_L", "KC_SCLN",
+ "KC_Z", "KC_X", "KC_C", "KC_V", "KC_B", "KC_N", "KC_M", "KC_COMM", "KC_DOT", "KC_SLSH",
+ "KC_ESC", "KC_BSPC", "KC_TAB", "KC_SPC", "KC_ENT", "KC_CAPS"
+ ]
+ ]
+}
diff --git a/keyboards/leftover30/keymaps/jack/keymap.c b/keyboards/pseusplit/keymaps/jack/keymap.c
index f0446ce..1a9c5cb 100644
--- a/keyboards/leftover30/keymaps/jack/keymap.c
+++ b/keyboards/pseusplit/keymaps/jack/keymap.c
@@ -5,22 +5,22 @@
// clang-format off
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT_jack(
- ___BASE1___, KC_BSPC,
+ ___BASE1___,
___BASE2___,
- ___BASE3___,
- KC_MPLY, XXXXXXX, LWRSPC, PSTRSE, XXXXXXX
+ ___BASE3___,
+ ___BASE4___
),
[_LOWER] = LAYOUT_jack(
- ___LOWER1___, _______,
+ ___LOWER1___,
___LOWER2___,
___LOWER3___,
- _______, _______, _______, _______, _______,
+ ___LOWER4___
),
[_RAISE] = LAYOUT_jack(
- ___RAISE1___, _______,
+ ___RAISE1___,
___RAISE2___,
___RAISE3___,
- _______, _______, _______, _______, _______,
+ ___RAISE4___
)
};
// clang-format on
diff --git a/keyboards/pseusplit/mcuconf.h b/keyboards/pseusplit/mcuconf.h
new file mode 100644
index 0000000..f600857
--- /dev/null
+++ b/keyboards/pseusplit/mcuconf.h
@@ -0,0 +1,11 @@
+// Copyright 2025 [email protected]
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#include_next <mcuconf.h>
+
+#undef STM32_I2C_USE_I2C1
+#define STM32_I2C_USE_I2C1 TRUE
+
+#undef STM32_SPI_USE_SPI1
+#define STM32_SPI_USE_SPI1 TRUE
diff --git a/keyboards/pseusplit/pseusplit.c b/keyboards/pseusplit/pseusplit.c
new file mode 100644
index 0000000..1281783
--- /dev/null
+++ b/keyboards/pseusplit/pseusplit.c
@@ -0,0 +1,73 @@
+// Copyright 2025 [email protected]
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include "quantum.h"
+
+#if defined(QUANTUM_PAINTER_ENABLE) && defined(POINTING_DEVICE_ENABLE)
+#error "Cannot enable both Quantum Painter and Pointing Device"
+#endif
+
+#ifdef QUANTUM_PAINTER_ENABLE
+#include "qp.h"
+static painter_device_t display;
+
+void keyboard_post_init_kb(void) {
+ display =
+ qp_st7789_make_spi_device(ST7789_HEIGHT, ST7789_WIDTH, LCD_CS_PIN,
+ LCD_DC_PIN, LCD_RST_PIN, LCD_SPI_DIVISOR, 0);
+ qp_init(display, QP_ROTATION_0);
+ keyboard_post_init_user();
+}
+
+void suspend_power_down_kb(void) {
+ qp_power(display, false);
+ suspend_power_down_user();
+}
+
+void suspend_wakeup_init_kb(void) {
+ qp_power(display, true);
+ suspend_wakeup_init_user();
+}
+#endif // QUANTUM_PAINTER_ENABLE
+
+#ifdef RGB_MATRIX_ENABLE
+const is31fl3733_led_t PROGMEM g_is31fl3733_leds[IS31FL3733_LED_COUNT] = {
+ // clang-format off
+ {0, SW2_CS1, SW3_CS1, SW1_CS1},
+ {0, SW2_CS2, SW3_CS2, SW1_CS2},
+ {0, SW2_CS3, SW3_CS3, SW1_CS3},
+ {0, SW2_CS4, SW3_CS4, SW1_CS4},
+ {0, SW2_CS5, SW3_CS5, SW1_CS5},
+ {0, SW2_CS6, SW3_CS6, SW1_CS6},
+ {0, SW2_CS7, SW3_CS7, SW1_CS7},
+ {0, SW2_CS8, SW3_CS8, SW1_CS8},
+ {0, SW2_CS9, SW3_CS9, SW1_CS9},
+ {0, SW2_CS10, SW3_CS10, SW1_CS10},
+ {0, SW5_CS1, SW6_CS1, SW4_CS1},
+ {0, SW5_CS2, SW6_CS2, SW4_CS2},
+ {0, SW5_CS3, SW6_CS3, SW4_CS3},
+ {0, SW5_CS4, SW6_CS4, SW4_CS4},
+ {0, SW5_CS5, SW6_CS5, SW4_CS5},
+ {0, SW5_CS6, SW6_CS6, SW4_CS6},
+ {0, SW5_CS7, SW6_CS7, SW4_CS7},
+ {0, SW5_CS8, SW6_CS8, SW4_CS8},
+ {0, SW5_CS9, SW6_CS9, SW4_CS9},
+ {0, SW5_CS10, SW6_CS10, SW4_CS10},
+ {0, SW8_CS1, SW9_CS1, SW7_CS1},
+ {0, SW8_CS2, SW9_CS2, SW7_CS2},
+ {0, SW8_CS3, SW9_CS3, SW7_CS3},
+ {0, SW8_CS4, SW9_CS4, SW7_CS4},
+ {0, SW8_CS5, SW9_CS5, SW7_CS5},
+ {0, SW8_CS6, SW9_CS6, SW7_CS6},
+ {0, SW8_CS7, SW9_CS7, SW7_CS7},
+ {0, SW8_CS8, SW9_CS8, SW7_CS8},
+ {0, SW8_CS9, SW9_CS9, SW7_CS9},
+ {0, SW8_CS10, SW9_CS10, SW7_CS10},
+ {0, SW10_CS3, SW12_CS3, SW10_CS3},
+ {0, SW10_CS4, SW12_CS4, SW10_CS4},
+ {0, SW10_CS5, SW12_CS5, SW10_CS5},
+ {0, SW10_CS6, SW12_CS6, SW10_CS6},
+ {0, SW10_CS7, SW12_CS7, SW10_CS7},
+ {0, SW10_CS8, SW12_CS8, SW10_CS8},
+ // clang-format on
+};
+#endif // RGB_MATRIX_ENABLE
diff --git a/keyboards/pseusplit/readme.md b/keyboards/pseusplit/readme.md
new file mode 100644
index 0000000..8d55876
--- /dev/null
+++ b/keyboards/pseusplit/readme.md
@@ -0,0 +1,22 @@
+# Pseusplit
+
+* Keyboard Maintainer: [Jack Sangdahl](https://github.com/waffle87)
+* Hardware Supported: PCBs with integrated STM32G0B1 microcontroller
+* Hardware Availability: [git/pseusplit](https://git.pngu.org/pseusplit)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make pseusplit:default
+
+Flashing example for this keyboard:
+
+ make pseusplit: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
+* **Physical reset button**: Briefly press the button on the back of the PCB
diff --git a/keyboards/pseusplit/rules.mk b/keyboards/pseusplit/rules.mk
new file mode 100644
index 0000000..fa4968a
--- /dev/null
+++ b/keyboards/pseusplit/rules.mk
@@ -0,0 +1,2 @@
+POINTING_DEVICE_DRIVER = azoteq_iqs5xx
+QUANTUM_PAINTER_DRIVERS += st7789_spi
diff --git a/keyboards/sweep/config.h b/keyboards/sweep/config.h
index 51edc09..a172b9d 100644
--- a/keyboards/sweep/config.h
+++ b/keyboards/sweep/config.h
@@ -8,32 +8,22 @@
#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
-#ifdef HAL_USE_SPI
#define SPI_DRIVER SPID0
#define SPI_SCK_PIN GP6
#define SPI_MOSI_PIN GP3
-#define SPI_MISO_PIN GP5
-#endif
+#define SPI_MISO_PIN GP4
-#ifdef QUANTUM_PAINTER_ENABLE
-#define LS0XX_CS_PIN GP7
-#define LS0XX_DISPLAY_HEIGHT 160
-#define LS0XX_DISPLAY_WIDTH 68
+#define LCD_CS_PIN GP5
+#define LCD_DC_PIN GP6
+#define LCD_RST_PIN GP28
+#define LCD_DISPLAY_WIDTH 135
+#define LCD_DISPLAY_HEIGHT 240
#define LCD_SPI_DIVISOR 4
-#endif
-#ifdef POINTING_DEVICE_ENABLE
-#define POINTING_DEVICE_CS_PIN GP4
-#define CIRQUE_PINNACLE_CURVED_OVERLAY
-#define CIRQUE_PINNACLE_TAP_ENABLE
-#define CIRQUE_PINNACLE_SECONDARY_TAP_ENABLE
-#define CIRQUE_PINNACLE_DIAMETER_MM 35
-#define SPLIT_POINTING_ENABLE
-#define POINTING_DEVICE_RIGHT
-#endif
+#define BACKLIGHT_PWM_DRIVER PWMD3
+#define BACKLIGHT_PWM_CHANNEL 2
-#ifdef HAL_USE_I2C
-#define I2C_DRIVER I2CD1
-#define I2C1_SDA_PIN GP3
-#define I2C1_SCL_PIN GP6
-#endif
+#define ADC_RESOLUTION 12
+#define ADC_SATURATION ((1 << 12) - 1)
+#define ADC_CURRENT_PIN GP26
+#define ADC_VOLTAGE_PIN GP27
diff --git a/keyboards/sweep/halconf.h b/keyboards/sweep/halconf.h
index a6c11ab..f47c7d4 100644
--- a/keyboards/sweep/halconf.h
+++ b/keyboards/sweep/halconf.h
@@ -2,7 +2,8 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
+#define HAL_USE_ADC TRUE
#define HAL_USE_SPI TRUE
-#define HAL_USE_I2C FALSE
+#define HAL_USE_PWM TRUE
#include_next <halconf.h>
diff --git a/keyboards/sweep/keyboard.json b/keyboards/sweep/keyboard.json
index d625fc9..2e7ef33 100644
--- a/keyboards/sweep/keyboard.json
+++ b/keyboards/sweep/keyboard.json
@@ -1,143 +1,146 @@
{
- "manufacturer": "pngu.org",
- "keyboard_name": "sweep",
- "maintainer": "jack",
- "bootloader": "rp2040",
- "features": {
- "bootmagic": true,
- "oled": false,
- "pointing_device": true,
- "quantum_painter": true,
- "rgb_matrix": true
+ "manufacturer": "pngu.org",
+ "keyboard_name": "sweep",
+ "maintainer": "jack",
+ "bootloader": "rp2040",
+ "features": {
+ "backlight": true,
+ "bootmagic": true,
+ "quantum_painter": true,
+ "rgb_matrix": true
+ },
+ "backlight": {
+ "pin": "GP7"
+ },
+ "matrix_pins": {
+ "direct": [
+ ["GP18", "GP13", "GP12", "GP24", "GP22"],
+ ["GP16", "GP14", "GP10", "GP25", "GP21"],
+ ["GP17", "GP15", "GP11", "GP9", "GP23"],
+ [null, null, null, "GP19", "GP20"]
+ ]
+ },
+ "processor": "RP2040",
+ "rgb_matrix": {
+ "driver": "ws2812",
+ "layout": [
+ { "matrix": [3, 3], "x": 71, "y": 60, "flags": 4 },
+ { "matrix": [3, 4], "x": 92, "y": 64, "flags": 4 },
+ { "matrix": [2, 4], "x": 81, "y": 39, "flags": 4 },
+ { "matrix": [2, 3], "x": 61, "y": 36, "flags": 4 },
+ { "matrix": [2, 2], "x": 41, "y": 32, "flags": 4 },
+ { "matrix": [2, 1], "x": 20, "y": 37, "flags": 4 },
+ { "matrix": [2, 0], "x": 0, "y": 47, "flags": 4 },
+ { "matrix": [1, 0], "x": 0, "y": 31, "flags": 4 },
+ { "matrix": [1, 1], "x": 20, "y": 21, "flags": 4 },
+ { "matrix": [1, 2], "x": 41, "y": 16, "flags": 4 },
+ { "matrix": [1, 3], "x": 61, "y": 20, "flags": 4 },
+ { "matrix": [1, 4], "x": 81, "y": 23, "flags": 4 },
+ { "matrix": [0, 4], "x": 81, "y": 7, "flags": 4 },
+ { "matrix": [0, 3], "x": 61, "y": 4, "flags": 4 },
+ { "matrix": [0, 2], "x": 41, "y": 0, "flags": 4 },
+ { "matrix": [0, 1], "x": 20, "y": 5, "flags": 4 },
+ { "matrix": [0, 0], "x": 0, "y": 15, "flags": 4 },
+ { "x": 10, "y": 14, "flags": 2 },
+ { "x": 71, "y": 6, "flags": 2 },
+ { "x": 83, "y": 56, "flags": 2 },
+ { "x": 10, "y": 45, "flags": 2 },
+ { "matrix": [7, 1], "x": 132, "y": 64, "flags": 4 },
+ { "matrix": [7, 0], "x": 153, "y": 60, "flags": 4 },
+ { "matrix": [6, 0], "x": 143, "y": 39, "flags": 4 },
+ { "matrix": [6, 1], "x": 163, "y": 36, "flags": 4 },
+ { "matrix": [6, 2], "x": 183, "y": 32, "flags": 4 },
+ { "matrix": [6, 3], "x": 204, "y": 37, "flags": 4 },
+ { "matrix": [6, 4], "x": 224, "y": 47, "flags": 4 },
+ { "matrix": [5, 4], "x": 224, "y": 31, "flags": 4 },
+ { "matrix": [5, 3], "x": 204, "y": 21, "flags": 4 },
+ { "matrix": [5, 2], "x": 183, "y": 16, "flags": 4 },
+ { "matrix": [5, 1], "x": 163, "y": 20, "flags": 4 },
+ { "matrix": [5, 0], "x": 143, "y": 23, "flags": 4 },
+ { "matrix": [4, 0], "x": 143, "y": 7, "flags": 4 },
+ { "matrix": [4, 1], "x": 163, "y": 4, "flags": 4 },
+ { "matrix": [4, 2], "x": 183, "y": 0, "flags": 4 },
+ { "matrix": [4, 3], "x": 204, "y": 5, "flags": 4 },
+ { "matrix": [4, 4], "x": 224, "y": 15, "flags": 4 },
+ { "x": 214, "y": 14, "flags": 2 },
+ { "x": 153, "y": 6, "flags": 2 },
+ { "x": 144, "y": 56, "flags": 2 },
+ { "x": 214, "y": 45, "flags": 2 }
+ ],
+ "split_count": [21, 21],
+ "sleep": true
+ },
+ "split": {
+ "enabled": true,
+ "handedness": {
+ "pin": "GP8"
},
"matrix_pins": {
+ "right": {
"direct": [
- ["GP18", "GP13", "GP12", "GP24", "GP22"],
- ["GP16", "GP14", "GP10", "GP25", "GP21"],
- ["GP17", "GP15", "GP11", "GP9", "GP23"],
- [null, null, null, "GP19", "GP20"]
+ ["GP25", "GP21", "GP17", "GP16", "GP13"],
+ ["GP24", "GP20", "GP18", "GP15", "GP12"],
+ ["GP22", "GP23", "GP19", "GP14", "GP11"],
+ ["GP10", "GP9", null, null, null]
]
+ }
},
- "processor": "RP2040",
- "rgb_matrix": {
- "driver": "ws2812",
- "layout": [
- {"matrix": [3, 3], "x": 71, "y": 60, "flags": 4},
- {"matrix": [3, 4], "x": 92, "y": 64, "flags": 4},
- {"matrix": [2, 4], "x": 81, "y": 39, "flags": 4},
- {"matrix": [2, 3], "x": 61, "y": 36, "flags": 4},
- {"matrix": [2, 2], "x": 41, "y": 32, "flags": 4},
- {"matrix": [2, 1], "x": 20, "y": 37, "flags": 4},
- {"matrix": [2, 0], "x": 0, "y": 47, "flags": 4},
- {"matrix": [1, 0], "x": 0, "y": 31, "flags": 4},
- {"matrix": [1, 1], "x": 20, "y": 21, "flags": 4},
- {"matrix": [1, 2], "x": 41, "y": 16, "flags": 4},
- {"matrix": [1, 3], "x": 61, "y": 20, "flags": 4},
- {"matrix": [1, 4], "x": 81, "y": 23, "flags": 4},
- {"matrix": [0, 4], "x": 81, "y": 7, "flags": 4},
- {"matrix": [0, 3], "x": 61, "y": 4, "flags": 4},
- {"matrix": [0, 2], "x": 41, "y": 0, "flags": 4},
- {"matrix": [0, 1], "x": 20, "y": 5, "flags": 4},
- {"matrix": [0, 0], "x": 0, "y": 15, "flags": 4},
- {"x": 10, "y": 14, "flags": 2},
- {"x": 71, "y": 6, "flags": 2},
- {"x": 83, "y": 56, "flags": 2},
- {"x": 10, "y": 45, "flags": 2},
- {"matrix": [7, 1], "x": 132, "y": 64, "flags": 4},
- {"matrix": [7, 0], "x": 153, "y": 60, "flags": 4},
- {"matrix": [6, 0], "x": 143, "y": 39, "flags": 4},
- {"matrix": [6, 1], "x": 163, "y": 36, "flags": 4},
- {"matrix": [6, 2], "x": 183, "y": 32, "flags": 4},
- {"matrix": [6, 3], "x": 204, "y": 37, "flags": 4},
- {"matrix": [6, 4], "x": 224, "y": 47, "flags": 4},
- {"matrix": [5, 4], "x": 224, "y": 31, "flags": 4},
- {"matrix": [5, 3], "x": 204, "y": 21, "flags": 4},
- {"matrix": [5, 2], "x": 183, "y": 16, "flags": 4},
- {"matrix": [5, 1], "x": 163, "y": 20, "flags": 4},
- {"matrix": [5, 0], "x": 143, "y": 23, "flags": 4},
- {"matrix": [4, 0], "x": 143, "y": 7, "flags": 4},
- {"matrix": [4, 1], "x": 163, "y": 4, "flags": 4},
- {"matrix": [4, 2], "x": 183, "y": 0, "flags": 4},
- {"matrix": [4, 3], "x": 204, "y": 5, "flags": 4},
- {"matrix": [4, 4], "x": 224, "y": 15, "flags": 4},
- {"x": 214, "y": 14, "flags": 2},
- {"x": 153, "y": 6, "flags": 2},
- {"x": 144, "y": 56, "flags": 2},
- {"x": 214, "y": 45, "flags": 2}
- ],
- "split_count": [21, 21]
- },
- "split": {
- "enabled": true,
- "handedness": {
- "pin": "GP8"
- },
- "matrix_pins": {
- "right": {
- "direct": [
- ["GP25", "GP22", "GP17", "GP16", "GP13"],
- ["GP24", "GP20", "GP18", "GP15", "GP12"],
- ["GP23", "GP21", "GP19", "GP14", "GP11"],
- ["GP10", "GP9", null, null, null]
- ]
- }
- },
- "serial": {
- "driver": "vendor"
- }
- },
- "url": "https://git.pngu.org/sweep",
- "usb": {
- "device_version": "1.0.0",
- "pid": "0x7370",
- "vid": "0x6A73"
- },
- "ws2812": {
- "driver": "vendor",
- "pin": "GP2"
- },
- "community_layouts": ["split_3x5_2"],
- "layout_aliases": {
- "LAYOUT": "LAYOUT_split_3x5_2"
- },
- "layouts": {
- "LAYOUT_split_3x5_2": {
- "layout": [
- {"matrix": [0, 0], "x": 0, "y": 0.25},
- {"matrix": [0, 1], "x": 1, "y": 0.125},
- {"matrix": [0, 2], "x": 2, "y": 0},
- {"matrix": [0, 3], "x": 3, "y": 0.125},
- {"matrix": [0, 4], "x": 4, "y": 0.25},
- {"matrix": [4, 0], "x": 7, "y": 0.25},
- {"matrix": [4, 1], "x": 8, "y": 0.125},
- {"matrix": [4, 2], "x": 9, "y": 0},
- {"matrix": [4, 3], "x": 10, "y": 0.125},
- {"matrix": [4, 4], "x": 11, "y": 0.25},
- {"matrix": [1, 0], "x": 0, "y": 1.25},
- {"matrix": [1, 1], "x": 1, "y": 1.125},
- {"matrix": [1, 2], "x": 2, "y": 1},
- {"matrix": [1, 3], "x": 3, "y": 1.125},
- {"matrix": [1, 4], "x": 4, "y": 1.25},
- {"matrix": [5, 0], "x": 7, "y": 1.25},
- {"matrix": [5, 1], "x": 8, "y": 1.125},
- {"matrix": [5, 2], "x": 9, "y": 1},
- {"matrix": [5, 3], "x": 10, "y": 1.125},
- {"matrix": [5, 4], "x": 11, "y": 1.25},
- {"matrix": [2, 0], "x": 0, "y": 2.25},
- {"matrix": [2, 1], "x": 1, "y": 2.125},
- {"matrix": [2, 2], "x": 2, "y": 2},
- {"matrix": [2, 3], "x": 3, "y": 2.125},
- {"matrix": [2, 4], "x": 4, "y": 2.25},
- {"matrix": [6, 0], "x": 7, "y": 2.25},
- {"matrix": [6, 1], "x": 8, "y": 2.125},
- {"matrix": [6, 2], "x": 9, "y": 2},
- {"matrix": [6, 3], "x": 10, "y": 2.125},
- {"matrix": [6, 4], "x": 11, "y": 2.25},
- {"matrix": [3, 3], "x": 3.5, "y": 3.25},
- {"matrix": [3, 4], "x": 4.5, "y": 3.5},
- {"matrix": [7, 0], "x": 6.5, "y": 3.5},
- {"matrix": [7, 1], "x": 7.5, "y": 3.25}
- ]
- }
+ "serial": {
+ "driver": "vendor"
+ }
+ },
+ "url": "https://git.pngu.org/sweep",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x7370",
+ "vid": "0x6A73"
+ },
+ "ws2812": {
+ "driver": "vendor",
+ "pin": "GP2"
+ },
+ "community_layouts": ["split_3x5_2"],
+ "layout_aliases": {
+ "LAYOUT": "LAYOUT_split_3x5_2"
+ },
+ "layouts": {
+ "LAYOUT_split_3x5_2": {
+ "layout": [
+ { "matrix": [0, 0], "x": 0, "y": 0.25 },
+ { "matrix": [0, 1], "x": 1, "y": 0.125 },
+ { "matrix": [0, 2], "x": 2, "y": 0 },
+ { "matrix": [0, 3], "x": 3, "y": 0.125 },
+ { "matrix": [0, 4], "x": 4, "y": 0.25 },
+ { "matrix": [4, 0], "x": 7, "y": 0.25 },
+ { "matrix": [4, 1], "x": 8, "y": 0.125 },
+ { "matrix": [4, 2], "x": 9, "y": 0 },
+ { "matrix": [4, 3], "x": 10, "y": 0.125 },
+ { "matrix": [4, 4], "x": 11, "y": 0.25 },
+ { "matrix": [1, 0], "x": 0, "y": 1.25 },
+ { "matrix": [1, 1], "x": 1, "y": 1.125 },
+ { "matrix": [1, 2], "x": 2, "y": 1 },
+ { "matrix": [1, 3], "x": 3, "y": 1.125 },
+ { "matrix": [1, 4], "x": 4, "y": 1.25 },
+ { "matrix": [5, 0], "x": 7, "y": 1.25 },
+ { "matrix": [5, 1], "x": 8, "y": 1.125 },
+ { "matrix": [5, 2], "x": 9, "y": 1 },
+ { "matrix": [5, 3], "x": 10, "y": 1.125 },
+ { "matrix": [5, 4], "x": 11, "y": 1.25 },
+ { "matrix": [2, 0], "x": 0, "y": 2.25 },
+ { "matrix": [2, 1], "x": 1, "y": 2.125 },
+ { "matrix": [2, 2], "x": 2, "y": 2 },
+ { "matrix": [2, 3], "x": 3, "y": 2.125 },
+ { "matrix": [2, 4], "x": 4, "y": 2.25 },
+ { "matrix": [6, 0], "x": 7, "y": 2.25 },
+ { "matrix": [6, 1], "x": 8, "y": 2.125 },
+ { "matrix": [6, 2], "x": 9, "y": 2 },
+ { "matrix": [6, 3], "x": 10, "y": 2.125 },
+ { "matrix": [6, 4], "x": 11, "y": 2.25 },
+ { "matrix": [3, 3], "x": 3.5, "y": 3.25 },
+ { "matrix": [3, 4], "x": 4.5, "y": 3.5 },
+ { "matrix": [7, 0], "x": 6.5, "y": 3.5 },
+ { "matrix": [7, 1], "x": 7.5, "y": 3.25 }
+ ]
}
+ }
}
diff --git a/keyboards/sweep/keymaps/jack/keymap.c b/keyboards/sweep/keymaps/jack/keymap.c
index dc9a11b..5f836e8 100644
--- a/keyboards/sweep/keymaps/jack/keymap.c
+++ b/keyboards/sweep/keymaps/jack/keymap.c
@@ -1,6 +1,9 @@
// Copyright 2025 [email protected]
// SPDX-License-Identifier: GPL-2.0-or-later
#include "jack.h"
+#include "analog.h"
+
+#define NUM_ADC_READS 32
// clang-format off
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
@@ -14,13 +17,54 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
___LOWER1___,
___LOWER2___,
___LOWER3___,
- _______, _______, _______, PNP
+ _______, _______, _______, UPDIR
),
[_RAISE] = LAYOUT_jack(
___RAISE1___,
___RAISE2___,
___RAISE3___,
- REMOVE, _______, _______, _______
+ PNP, _______, _______, _______
)
};
// clang-format on
+
+void housekeeping_task_keymap(void) {
+ static uint32_t last_read = 0;
+ static int16_t current_reads[NUM_ADC_READS] = {0};
+ static int16_t voltage_reads[NUM_ADC_READS] = {0};
+ static uint8_t offset = 0;
+ if (timer_elapsed32(last_read) >= 1) {
+ int16_t current = analogReadPin(ADC_CURRENT_PIN);
+ int16_t voltage = analogReadPin(ADC_VOLTAGE_PIN);
+ int16_t current_ma =
+ (int16_t)(((3300 * (int32_t)current) / ADC_SATURATION));
+ int16_t voltage_mv =
+ (int16_t)((2 * (3300 * (int32_t)voltage)) / ADC_SATURATION);
+ if (!last_read)
+ for (uint8_t i = 0; i < NUM_ADC_READS; ++i) {
+ current_reads[i] = current_ma;
+ voltage_reads[i] = voltage_mv;
+ }
+ current_reads[offset] = current_ma;
+ voltage_reads[offset] = voltage_mv;
+ offset = (offset + 1) % NUM_ADC_READS;
+ static uint16_t counter = 0;
+ counter = (counter + 1) % 2500;
+ if (!counter)
+ dprintf("Current: %dmA\tVoltage: %dmV\n", (int)current_ma,
+ (int)voltage_mv);
+ last_read = timer_read32();
+ }
+ static uint32_t last_draw = 0;
+ if (timer_elapsed32(last_draw) >= 250) {
+ int32_t total_current_ma = 0;
+ int32_t total_voltage_mv = 0;
+ for (uint8_t i = 0; i < NUM_ADC_READS; ++i) {
+ total_current_ma += current_reads[i];
+ total_voltage_mv += voltage_reads[i];
+ }
+ // int16_t avg_current_ma = (int16_t)(total_current_ma / NUM_ADC_READS);
+ // int16_t avg_voltage_mv = (int16_t)(total_voltage_mv / NUM_ADC_READS);
+ last_draw = timer_read32();
+ }
+}
diff --git a/keyboards/sweep/mcuconf.h b/keyboards/sweep/mcuconf.h
index 182be78..c53d80d 100644
--- a/keyboards/sweep/mcuconf.h
+++ b/keyboards/sweep/mcuconf.h
@@ -4,8 +4,11 @@
#include_next <mcuconf.h>
+#undef RP_ADC_USE_ADC1
+#define RP_ADC_USE_ADC1 TRUE
+
#undef RP_SPI_USE_SPI0
#define RP_SPI_USE_SPI0 TRUE
-#undef RP_I2C_USE_I2C1
-#define RP_I2C_USE_I2C1 TRUE
+#undef RP_PWM_USE_PWM3
+#define RP_PWM_USE_PWM3 TRUE
diff --git a/keyboards/sweep/readme.md b/keyboards/sweep/readme.md
index 093fbc1..be6c1a6 100644
--- a/keyboards/sweep/readme.md
+++ b/keyboards/sweep/readme.md
@@ -1,6 +1,8 @@
# Sweep RP2040
-* Keyboard Maintainer: [Jack Sangdahl](https://github.com/waffle87)
+![image](https://git.pngu.org/sweep/about/img/image1.jpg)
+
+* Keyboard Maintainer: [[email protected]](mailto:[email protected])
* Hardware Supported: PCBs with integrated RP2040 microcontroller
* Hardware Availability: [git/sweep](https://git.pngu.org/sweep)
@@ -18,6 +20,6 @@ See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_to
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
+* **Bootmagic reset**: Hold down the key at (0,0) in the matrix and plug in the keyboard
+* **Physical reset button**: Hold button labeled BOOT and tap RESET button
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
diff --git a/keyboards/sweep/rules.mk b/keyboards/sweep/rules.mk
index 3bac055..5533ed9 100644
--- a/keyboards/sweep/rules.mk
+++ b/keyboards/sweep/rules.mk
@@ -1,4 +1,2 @@
-POINTING_DEVICE_DRIVER = cirque_pinnacle_spi
-
-# depends on 21844
-QUANTUM_PAINTER_DRIVERS += ls0xx_spi
+QUANTUM_PAINTER_DRIVERS += st7789_spi
+ANALOG_DRIVER_REQUIRED = yes
diff --git a/keyboards/sweep/sweep.c b/keyboards/sweep/sweep.c
index bd73d8a..c7023bd 100644
--- a/keyboards/sweep/sweep.c
+++ b/keyboards/sweep/sweep.c
@@ -4,15 +4,13 @@
#ifdef QUANTUM_PAINTER_ENABLE
#include "qp.h"
-#include "qp_surface.h"
+
static painter_device_t display;
-static uint8_t framebuffer[SURFACE_REQUIRED_BUFFER_BYTE_SIZE(
- LS0XX_DISPLAY_WIDTH, LS0XX_DISPLAY_HEIGHT, 1)] = {0};
void keyboard_post_init_kb(void) {
- display = qp_ls0xx_device_t_make_spi_device(
- LS0XX_DISPLAY_WIDTH, LS0XX_DISPLAY_HEIGHT, LS0XX_CS_PIN, LCD_SPI_DIVISOR,
- 0, framebuffer);
+ display = qp_st7789_make_spi_device(LCD_DISPLAY_WIDTH, LCD_DISPLAY_HEIGHT,
+ LCD_CS_PIN, LCD_DC_PIN, LCD_RST_PIN,
+ LCD_SPI_DIVISOR, 0);
qp_init(display, QP_ROTATION_0);
keyboard_post_init_user();
}
@@ -27,14 +25,3 @@ void suspend_wakeup_init_kb(void) {
suspend_wakeup_init_user();
}
#endif // QUANTUM_PAINTER_ENABLE
-
-#ifdef OLED_ENABLE
-oled_rotation_t oled_init_kb(oled_rotation_t rotation) { return rotation; }
-
-bool oled_task_kb(void) {
- if (!oled_task_user())
- return false;
- oled_write(PSTR("foo bar baz"), false);
- return true;
-}
-#endif // OLED_ENABLE
diff --git a/keyboards/tornish/flash.sh b/keyboards/tornish/flash.sh
deleted file mode 100755
index 6de066f..0000000
--- a/keyboards/tornish/flash.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/sh
-FIRMWARE=~/git/qmk_firmware/tornish_default.hex
-BOOTLOADER=~/git/qmk_me/keyboards/tornish/usbasploader_atmega328p.hex
-
-qmk compile -kb tornish -km default > /dev/null
-sed -i '$ d' $FIRMWARE
-cat $BOOTLOADER >> $FIRMWARE
-doas avrdude -c usbtiny -p atmega328p -U flash:w:$FIRMWARE:i
diff --git a/keyboards/tornish/keyboard.json b/keyboards/tornish/keyboard.json
deleted file mode 100644
index 5423d74..0000000
--- a/keyboards/tornish/keyboard.json
+++ /dev/null
@@ -1,45 +0,0 @@
-{
- "keyboard_name": "tornish",
- "manufacturer": "jacks",
- "maintainer": "pngu.org",
- "bootloader": "usbasploader",
- "diode_direction": "COL2ROW",
- "matrix_pins": {
- "cols": ["B3", "B4", "B5", "B0", "D7", "D6"],
- "rows": ["D4", "D1", "D0", "D5"]
- },
- "processor": "atmega328p",
- "usb": {
- "device_version": "1.0.0",
- "pid": "0x6A73",
- "vid": "0x6D64"
- },
- "layouts": {
- "LAYOUT": {
- "layout": [
- {"matrix": [0, 0], "x": 0, "y": 0},
- {"matrix": [0, 1], "x": 1, "y": 0},
- {"matrix": [0, 2], "x": 2, "y": 0},
- {"matrix": [0, 3], "x": 3, "y": 0},
- {"matrix": [0, 4], "x": 4, "y": 0},
- {"matrix": [0, 5], "x": 5, "y": 0},
- {"matrix": [1, 0], "x": 0, "y": 1},
- {"matrix": [1, 1], "x": 1, "y": 1},
- {"matrix": [1, 2], "x": 2, "y": 1},
- {"matrix": [1, 3], "x": 3, "y": 1},
- {"matrix": [1, 4], "x": 4, "y": 1},
- {"matrix": [1, 5], "x": 5, "y": 1},
- {"matrix": [2, 0], "x": 0, "y": 2},
- {"matrix": [2, 1], "x": 1, "y": 2},
- {"matrix": [2, 2], "x": 2, "y": 2},
- {"matrix": [2, 3], "x": 3, "y": 2},
- {"matrix": [2, 4], "x": 4, "y": 2},
- {"matrix": [2, 5], "x": 5, "y": 2},
- {"matrix": [3, 2], "x": 2, "y": 3},
- {"matrix": [3, 3], "x": 3, "y": 3},
- {"matrix": [3, 4], "x": 4, "y": 3},
- {"matrix": [3, 5], "x": 5, "y": 3}
- ]
- }
- }
-}
diff --git a/keyboards/tornish/keymaps/default/keymap.c b/keyboards/tornish/keymaps/default/keymap.c
deleted file mode 100644
index acd59b8..0000000
--- a/keyboards/tornish/keymaps/default/keymap.c
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2025 [email protected]
-// SPDX-License-Identifier: GPL-2.0-or-later
-#include QMK_KEYBOARD_H
-
-enum macros { DAY = QK_USER, CLEAR };
-
-// clang-format off
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- [0] = LAYOUT(
- DAY, KC_Q, KC_W, KC_E, KC_R, KC_T,
- CLEAR, KC_A, KC_S, KC_D, KC_F, KC_G,
- XXXXXXX, KC_Z, KC_X, KC_C, KC_V, KC_B,
- KC_ESC, MO(1), KC_SPC, XXXXXXX
- ),
- [1] = LAYOUT(
- XXXXXXX, KC_1, KC_2, KC_3, KC_4, KC_5,
- XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
- XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
- XXXXXXX, _______, XXXXXXX, XXXXXXX
- )
-};
-// clang-format on
-
-bool process_record_user(uint16_t keycode, keyrecord_t *record) {
- switch (keycode) {
- case DAY:
- if (record->event.pressed) {
- tap_code(KC_SLSH);
- wait_ms(500);
- SEND_STRING("time set day" SS_TAP(X_ENT));
- }
- break;
- case CLEAR:
- if (record->event.pressed) {
- tap_code(KC_SLSH);
- wait_ms(500);
- SEND_STRING("weather clear" SS_TAP(X_ENT));
- }
- break;
- }
- return true;
-}
diff --git a/keyboards/tornish/readme.md b/keyboards/tornish/readme.md
deleted file mode 100644
index 57b3d5a..0000000
--- a/keyboards/tornish/readme.md
+++ /dev/null
@@ -1,11 +0,0 @@
-### half a [torn](https://github.com/rtitmuss/torn) keyboard used for minecraft :)
-![img](https://i.imgur.com/e7zKTK7.jpeg)
-
-for whatever reason, this board does not like to flash over usb.
-so [flash.sh](flash.sh) does the work instead:
-```shell
-qmk compile -kb tornish -km default > /dev/null
-sed -i '$ d' $FIRMWARE #remove last line from firmware hex file (eof indicator)
-cat $BOOTLOADER >> $FIRMWARE #append bootloader hex file to firmware
-avrdude -c usbtiny -p atmega328p -U flash:w:$FIRMWARE:i #flash firmware + bootloader over serial
-```
diff --git a/keyboards/tornish/usbasploader_atmega328p.hex b/keyboards/tornish/usbasploader_atmega328p.hex
deleted file mode 100644
index 3f3fb14..0000000
--- a/keyboards/tornish/usbasploader_atmega328p.hex
+++ /dev/null
@@ -1,140 +0,0 @@
-:107000006BC00000AAC000008EC000008CC0000051
-:107010008AC0000088C0000086C0000084C0000054
-:1070200082C0000080C000007EC000007CC0000064
-:107030007AC0000078C0000076C0000074C0000074
-:1070400072C0000070C000006EC000006CC0000084
-:107050006AC0000068C0000066C0000064C0000094
-:1070600062C0000060C00000EC2DFD2DB7B6B0FC82
-:10707000FDCF27BFE895B7B6B0FCFDCF21E1B7B68D
-:10708000B6FCF4CF08950902120001010080320914
-:10709000040000000000000012011001FF000008C1
-:1070A000C016DC050201010200010E035500530069
-:1070B00042006100730070001C03770077007700C6
-:1070C0002E00660069007300630068006C002E00EB
-:1070D000640065000403090411241FBECFEFD8E04B
-:1070E000DEBFCDBF24B7D8E0CEEF39913833399128
-:1070F00009F03FEF30933C0120933B0111E0A0E009
-:10710000B1E0E4E8F8E702C005900D92A630B107BF
-:10711000D9F721E0A6E0B1E001C01D92AB33B20780
-:10712000E1F785D1ADC36CCFA82FB92F80E090E0F7
-:1071300041E050EA609530E009C02D918227979593
-:10714000879510F084279527305EC8F36F5FA8F30A
-:107150000895EADF8D939D930895CF93CFB7CF9392
-:10716000DF93C3954B9BE9F74B9B0BC04B9B09C02F
-:107170004B9B07C04B9B05C04B9B03C04B9B01C067
-:1071800089C06F93C0911E01DD27CB5DDE4F2F9329
-:1071900065E54B9B03C02F916F91E6CF0F931F9333
-:1071A0004F9320E040E15F9309B10C7003FB27F996
-:1071B0003F9350E03BE039C01C7040642F77012FB3
-:1071C0005F5F1EC0406819B11C702F7752501FC0FE
-:1071D000406409B12F770C70D1F15F5F00C023C00C
-:1071E000406219B12F771C7091F15F5F00C025C01C
-:1071F0000C701027515012F45D5F0000115027955C
-:107200002C3F19B1C8F61C700127015027952C3F5F
-:10721000C8F64227499309B10C7010274F731150DB
-:1072200027952C3FA8F64695469519B11C7079F024
-:107230000127015027952C3F98F66B5A60F3315087
-:1072400009B1B0F600C011E01CBB002717C03B50CD
-:107250003195C31BD04011E01CBB0881033CF9F001
-:107260000B34E9F020911C011981110F1213EDCF9D
-:10727000093651F10D3211F0013E39F70093230127
-:107280003F915F914F911F910F912F916F91CCB3CF
-:10729000C0FD67CFDF91CF91CFBFCF9118952091DF
-:1072A0002301222369F310912101112339F5343090
-:1072B0003AF13093210120931D0110911E013BE012
-:1072C000311B30931E011CC0009121010130B4F428
-:1072D0000AE53091010134FD14C000930101C1E1C0
-:1072E000D1E013C0052710E000C000000BB91AC0A0
-:1072F000052710E0221F1DC010E021C04AE502C092
-:1073000032ED432FC4E1D0E032E01AB11C605B9A49
-:107310000BB11AB95CE020E865E320FF05270BB943
-:10732000279517951C3FF0F66695B8F7B1F720FF43
-:1073300005270BB9279517951C3FD0F6279517956C
-:1073400017FF052700001C3F0BB9B0F629913A95AD
-:1073500019F7037F10912201110FC651D0400BB9CC
-:1073600011F010931C0111E01CBB08601AB1137FCF
-:10737000402F437F54E05A95F1F70BB91AB94BB936
-:107380007FCFDC0113964C91139714963C91149780
-:1073900013968D919C911497982789279827129678
-:1073A0002C911297203339F43370E32FF0E0EE5F25
-:1073B000FE4F80810895283561F489E0E1E0F0E036
-:1073C000442371F089E0E3E0F0E0483049F080E0E8
-:1073D0000895203579F4411107C089E0F0E0E0E03C
-:1073E000809357008491089589E0E2E0F0E048300E
-:1073F00071F7F6CF203229F4880F991FFC01849190
-:107400000895283229F4FC01EE0FFF1F3196F7CFC3
-:10741000203A09F41FC2203C21F415966C9122D227
-:10742000D6CF2F3FA1F681EF80930F01D0CF1AB8AE
-:1074300080E28BB981E085BF82E085BFE0E0F1E7C3
-:10744000A89531978040E1F780913B01877F21F437
-:1074500080913C01882371F04D9B0CC0F894539AA5
-:107460001BB81DBA1092690081E085BF15BEF0E01F
-:10747000E0E009958EEF80930F0114BE0FB6F894EB
-:10748000A8958091600088618093600010926000F0
-:107490000FBE80916900826080936900E89A539AD8
-:1074A0008CE0E0E0F5E3A89531978040E1F7539850
-:1074B000789410912101135017FD5AC080911E013C
-:1074C000CCE0D0E0C81BD109CB5DDE4F80911D011F
-:1074D0008D3209F00BC1183009F048C083EC80935D
-:1074E00011018AE580930101109210013881832FE8
-:1074F00080769981882309F49BC046E051E050933F
-:10750000200140931F01933069F4CE013ADF80934C
-:10751000090184E09F81911127C09E81981720F571
-:10752000892F22C0953009F4DFC09A3009F4DCC0FD
-:107530008CEF890F863008F070C04A815B815093D0
-:107540000E0140930D01993009F46EC08E81809335
-:107550000C012D81227020930B0190930A0137FFBB
-:107560008FEF90E890931001809300011092210119
-:107570008091010184FF36C0C0910001CF3F91F19D
-:107580008C2FC93008F088E09C2F981B9093000145
-:107590009091110128E8922790931101CC23B1F02A
-:1075A0004091100147FF2FC190910C01C82F9817EF
-:1075B00008F4C92F9C1B90930C01D0900A01D0E0D5
-:1075C00082E1E82E81E0F82EDC1304C16C2F82E109
-:1075D00091E0BFDDCC5FCC3019F08FEF80930001DC
-:1075E000C093010184E199B19C7031F48150D9F7C5
-:1075F0001092220110921C0180910F01803108F439
-:107600001EC14D9B05C080910F01805180930F01D9
-:1076100080910F0181114DCF21CF80910F019230C8
-:1076200029F48E7F80930F0180E074CF8160FACFC0
-:107630002A8110921A0191110AC010921B012AE1AD
-:1076400031E082E03093200120931F0163CF953019
-:1076500029F4209322012AE131E0F4CF963099F504
-:107660009B81913059F488E990E7909320018093B1
-:107670001F0182E190E4909310014CCF923019F4F5
-:1076800086E890E7F2CF9330A9F7211108C084ED86
-:1076900090E79093200180931F0184E0EBCF21308D
-:1076A00041F488EB90E79093200180931F018CE1D7
-:1076B000E1CF2230F9F68AEA90E790932001809397
-:1076C0001F018EE0D7CF983059F0993019F42093EC
-:1076D0002401C1CF81E09A3009F4BDCF80E0BBCF57
-:1076E00024E231E081E0AECF81E014CF809110013F
-:1076F00087FF3CCF00910C01011708F4102F011BEC
-:1077000000930C01F12CF11628F001112FCF1092EB
-:1077100000012CCF80910D0190910E0120910A0162
-:10772000273058F069919C012F5F3F4F30930E0135
-:1077300020930D0197D0F394E6CF8115904738F749
-:10774000F394F394F894E0910D01F0910E012991D6
-:10775000399181E0090180935700E89511247894CC
-:1077600080910D0190910E01029690930E018093ED
-:107770000D018F779927892B51F00111C4CFF11694
-:1077800008F4C1CF80910B01882309F4BCCFF89491
-:10779000E0910D01F0910E01329783E08093570044
-:1077A000E895789407B600FCFDCFF894E0910D01C0
-:1077B000F0910E01329785E080935700E895789418
-:1077C00007B600FCFDCFF89481E180935700E8955F
-:1077D000789499CF00910D0110910E0126E02D159E
-:1077E00078F4C80137D0F7018083FFEFEF1AFF0A62
-:1077F0000F5F1F4F10930E0100930D01DF5FE4CE6A
-:10780000F8018491F0CF90911F0130912001282F31
-:10781000290FE92FF32FA2E1B1E046FF0BC09491AD
-:107820009D9331962E13FBCFF0932001E0931F011F
-:10783000C82FCCCE91919D932E13FCCFF5CF4D99AF
-:10784000E7CE80910F01823008F4E2CE80910F01E3
-:107850008250DCCEF999FECF92BD81BDF89A99276E
-:1078600080B50895262FF999FECF1FBA92BD81BD2C
-:1078700020BD0FB6F894FA9AF99A0FBE01960895B2
-:04788000F894FFCFAA
-:06788400FF5A1E950F00E3
-:040000030000700089
-:00000001FF
diff --git a/keyboards/xyz60/keyboard.json b/keyboards/xyz60/keyboard.json
index d605eb3..316e36a 100644
--- a/keyboards/xyz60/keyboard.json
+++ b/keyboards/xyz60/keyboard.json
@@ -74,7 +74,7 @@
{"matrix": [4, 1], "x": 0, "y": 0},
{"matrix": [4, 2], "x": 0, "y": 0},
{"matrix": [4, 6], "x": 0, "y": 0},
- {"matrix": [4, 10], "x": 0, "y": 0},
+ {"matrix": [4, 11], "x": 0, "y": 0},
{"matrix": [4, 12], "x": 0, "y": 0},
{"matrix": [4, 13], "x": 0, "y": 0}
]
diff --git a/keymaps/beiwagon/keymap.c b/keymaps/beiwagon/keymap.c
new file mode 100644
index 0000000..eaa9c44
--- /dev/null
+++ b/keymaps/beiwagon/keymap.c
@@ -0,0 +1,26 @@
+// Copyright 2025 [email protected]
+// SPDX-License-Identifier: GPL-3.0-or-later
+#include "jack.h"
+
+// clang-format off
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_BASE] = LAYOUT_jack(
+ G(KC_F), G(KC_Q), G(KC_R),
+ KC_VOLD, PNP, KC_VOLU,
+ REMOVE, XRGB_HUI, XRGB_NXT,
+ XRGB_TOG, XRGB_HUD, TG(_LOWER)
+ ),
+ [_LOWER] = LAYOUT_jack(
+ QK_BOOT, EE_CLR, QK_MAKE,
+ _______, _______, _______,
+ _______, _______, _______,
+ _______, _______, _______
+ )
+};
+// clang-format on
+
+void keyboard_post_init_keymap(void) {
+ for (int i = 0; i < RGB_MATRIX_LED_COUNT; ++i)
+ if (g_led_config.flags[i] & LED_FLAG_UNDERGLOW)
+ g_led_config.flags[i] &= ~LED_FLAG_UNDERGLOW;
+}
diff --git a/keymaps/crkbd/keymap.c b/keymaps/crkbd/keymap.c
index eca3a2a..1e634ab 100644
--- a/keymaps/crkbd/keymap.c
+++ b/keymaps/crkbd/keymap.c
@@ -109,12 +109,4 @@ void matrix_init_user(void) {
4, 4, 4, 2, 2, 2, 2, 2, 2, 1, 1, 1, 4, 4, 4, 4, 4, 1,
1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 2, 2, 2, 2, 2, 2}};
}
-
-bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
- rgb_matrix_sethsv_noeeprom(43, 255, 120);
- for (uint8_t i = led_min; i <= led_max; i++)
- if (g_led_config.flags[i] & LED_FLAG_UNDERGLOW)
- rgb_matrix_set_color(i, RGB_RED);
- return false;
-}
#endif // rgb matrix
diff --git a/keymaps/crkbd/rules.mk b/keymaps/crkbd/rules.mk
index a0d37aa..42387df 100644
--- a/keymaps/crkbd/rules.mk
+++ b/keymaps/crkbd/rules.mk
@@ -5,6 +5,5 @@ OLED_ENABLE = yes
AUDIO_ENABLE = no
AUDIO_DRIVER = dac_basic
ENCODER_ENABLE = yes
-ENCODER_MAP_ENABLE = yes
POINTING_DEVICE_ENABLE = no
POINTING_DEVICE_DRIVER = pimoroni_trackball
diff --git a/keymaps/f60/readme.md b/keymaps/f60/readme.md
deleted file mode 100644
index 81b06f6..0000000
--- a/keymaps/f60/readme.md
+++ /dev/null
@@ -1,4 +0,0 @@
-### trio60
-![front](https://i.imgur.com/MsKEbeB.jpeg)
-![back](https://i.imgur.com/1D9xUYT.jpeg)
-![rear](https://i.imgur.com/x6MBDMd.jpeg)
diff --git a/keymaps/ferris/config.h b/keymaps/ferris/config.h
deleted file mode 100644
index d56921a..0000000
--- a/keymaps/ferris/config.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2025 [email protected]
-// SPDX-License-Identifier: GPL-2.0-or-later
-#pragma once
-
-#define WS2812_DI_PIN B0
-#define RGB_MATRIX_LED_COUNT 34
-#define RGB_MATRIX_SPLIT {17, 17}
-#define __ NO_PIN
-#undef DIRECT_PINS
-#undef DIRECT_PINS_RIGHT
-// clang-format off
-#define DIRECT_PINS { \
- {D7,F7,F6,F5,F4}, \
- {B1,B3,B2,B6,D3}, \
- {D1,D0,D4,C6,E6}, \
- {B4,B5,__,__,__} \
-}
-#define DIRECT_PINS_RIGHT { \
- {F4,F5,F6,F7,D7}, \
- {D3,B6,B2,B3,B1}, \
- {E6,C6,D4,D0,D1}, \
- {B5,B4,__,__,__} \
-}
-// clang-format on
diff --git a/keymaps/ferris/keymap.c b/keymaps/ferris/keymap.c
deleted file mode 100644
index e3e6b36..0000000
--- a/keymaps/ferris/keymap.c
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2025 [email protected]
-// SPDX-License-Identifier: GPL-2.0-or-later
-#include "jack.h"
-#define XX NO_LED
-
-// clang-format off
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- [_BASE] = LAYOUT_jack(
- ___BASE1___,
- ___BASE2___,
- ___BASE3___,
- ESCLWR, KC_SPC, KC_BSPC, PSTRSE
- ),
- [_LOWER] = LAYOUT_jack(
- ___LOWER1___,
- ___LOWER2___,
- ___LOWER3___,
- _______, _______, _______, PNP
- ),
- [_RAISE] = LAYOUT_jack(
- ___RAISE1___,
- ___RAISE2___,
- ___RAISE3___,
- UPDIR, _______, _______, _______
- )
-};
-
-led_config_t g_led_config = {{
- {4, 3, 2, 1, 0 },
- {5, 6, 7, 8, 9 },
- {14, 13, 12, 11, 10},
- {XX, XX, XX, 15, 16},
- {17, 18, 19, 20, 21},
- {26, 25, 24, 23, 22},
- {27, 28, 29, 30, 31},
- {33, 32, XX, XX, XX}
-}, {
- {72,7}, {54,4}, {36,0}, {18,4}, {0,13},
- {0,27}, {18,18},{36,14},{54,18},{72,21},
- {72,35},{54,32},{36,28},{18,32},{0,41},
- {67,45},{90,62},
- {126,13},{144,4}, {162,0}, {180,4}, {198,7},
- {198,21},{180,18},{162,14},{144,18},{126,27},
- {126,41},{144,32},{162,28},{180,32},{198,35},
- {117,62},{135,45}
-}, {
- 4,4,4,4,4,
- 4,4,4,4,4,
- 4,4,4,4,4,
- 4,4,
- 4,4,4,4,4,
- 4,4,4,4,4,
- 4,4,4,4,4,
- 4,4
-}};
-// clang-format on
diff --git a/keymaps/ferris/readme.md b/keymaps/ferris/readme.md
deleted file mode 100644
index c3ac9ca..0000000
--- a/keymaps/ferris/readme.md
+++ /dev/null
@@ -1,8 +0,0 @@
-### rgb ferris sweep
-![parts](https://i.imgur.com/zKJoYMa.jpeg)
-![switches](https://i.imgur.com/ZSEpMGf.jpeg)
-![complete](https://i.imgur.com/Op0bU0N.jpeg)
-
-#### notes
-an elite-c was required for this pcb, as it exposes an io pin where most pro-micro's have a raw power pin.\
-this means no diodes are required :^)
diff --git a/keymaps/ferris/rules.mk b/keymaps/ferris/rules.mk
deleted file mode 100644
index 15e72a1..0000000
--- a/keymaps/ferris/rules.mk
+++ /dev/null
@@ -1,3 +0,0 @@
-BOOTLOADER = atmel-dfu
-RGB_MATRIX_ENABLE = yes
-RGB_MATRIX_DRIVER = ws2812
diff --git a/keymaps/kyria/rules.mk b/keymaps/kyria/rules.mk
index 2694171..cd88dc8 100644
--- a/keymaps/kyria/rules.mk
+++ b/keymaps/kyria/rules.mk
@@ -1,7 +1,5 @@
CONVERT_TO = blok
RGBLIGHT_ENABLE = no
RGB_MATRIX_ENABLE = yes
-ENCODER_MAP_ENABLE = yes
POINTING_DEVICE_ENABLE = yes
POINTING_DEVICE_DRIVER = cirque_pinnacle_i2c
-PROGRAM_CMD = doas picotool load $(BUILD_DIR)/$(TARGET).uf2
diff --git a/keymaps/onekey/f411_qfplib/config.h b/keymaps/onekey/f411_qfplib/config.h
new file mode 100644
index 0000000..8fbef05
--- /dev/null
+++ b/keymaps/onekey/f411_qfplib/config.h
@@ -0,0 +1,12 @@
+// Copyright 2025 [email protected]
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#undef ADC_PIN
+#undef BACKLIGHT_PIN
+#undef MATRIX_ROW_PINS
+#undef MATRIX_COL_PINS
+
+// clang-format off
+#define DIRECT_PINS {{A0}}
+// clang-format on
diff --git a/keymaps/onekey/stm32f411/keymap.c b/keymaps/onekey/f411_qfplib/keymap.c
index 36202c2..36202c2 100644
--- a/keymaps/onekey/stm32f411/keymap.c
+++ b/keymaps/onekey/f411_qfplib/keymap.c
diff --git a/keymaps/onekey/stm32f411/qfplib/qfplib.h b/keymaps/onekey/f411_qfplib/qfplib/qfplib.h
index d172da8..d172da8 100644
--- a/keymaps/onekey/stm32f411/qfplib/qfplib.h
+++ b/keymaps/onekey/f411_qfplib/qfplib/qfplib.h
diff --git a/keymaps/onekey/stm32f411/qfplib/qfplib.s b/keymaps/onekey/f411_qfplib/qfplib/qfplib.s
index e035472..e035472 100644
--- a/keymaps/onekey/stm32f411/qfplib/qfplib.s
+++ b/keymaps/onekey/f411_qfplib/qfplib/qfplib.s
diff --git a/keymaps/onekey/stm32f411/rules.mk b/keymaps/onekey/f411_qfplib/rules.mk
index 8b12a3d..8b12a3d 100644
--- a/keymaps/onekey/stm32f411/rules.mk
+++ b/keymaps/onekey/f411_qfplib/rules.mk
diff --git a/keymaps/onekey/rp2040/rules.mk b/keymaps/onekey/rp2040/rules.mk
deleted file mode 100644
index a263ca2..0000000
--- a/keymaps/onekey/rp2040/rules.mk
+++ /dev/null
@@ -1,39 +0,0 @@
-CONSOLE_ENABLE = yes
-OPT_DEFS += -UCRT0_EXTRA_CORES_NUMBER \
- -DCRT0_EXTRA_CORES_NUMBER=1
-
-define WRAP
- $(foreach FUNC,$1,$(eval EXTRALDFLAGS += -Wl,--wrap=$(FUNC)))
-endef
-
-SRC += $(PICOSDKROOT)/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S
-BIT_FUNCTIONS := __clzsi2 __clzdi2 __ctzsi2 __ctzdi2 __popcountsi2 __popcountdi2
-$(call WRAP, $(BIT_FUNCTIONS))
-
-VPATH += $(PICOSDKROOT)/src/rp2_common/pico_double/include
-SRC += $(PICOSDKROOT)/src/rp2_common/pico_double/double_aeabi.S \
- $(PICOSDKROOT)/src/rp2_common/pico_double/double_init_rom.c \
- $(PICOSDKROOT)/src/rp2_common/pico_double/double_math.c \
- $(PICOSDKROOT)/src/rp2_common/pico_double/double_v1_rom_shim.S
-DOUBLE_FUNCTIONS := __aeabi_dadd __aeabi_ddiv __aeabi_dmul __aeabi_drsub __aeabi_dsub __aeabi_cdcmpeq \
- __aeabi_cdrcmple __aeabi_cdcmple __aeabi_dcmpeq __aeabi_dcmplt __aeabi_dcmple \
- __aeabi_dcmpge __aeabi_dcmpgt __aeabi_dcmpun __aeabi_i2d __aeabi_l2d __aeabi_ui2d \
- __aeabi_ul2d __aeabi_d2iz __aeabi_d2lz __aeabi_d2uiz __aeabi_d2ulz __aeabi_d2f \
- sqrt cos sin tan atan2 exp log ldexp copysign trunc floor ceil round sincos asin \
- acos atan sinh cosh tanh asinh acosh atanh exp2 log2 exp10 log10 pow powint hypot \
- cbrt fmod drem remainder remquo expm1 log1p fma
-$(call WRAP, $(DOUBLE_FUNCTIONS))
-
-VPATH += $(PICOSDKROOT)/src/rp2_common/pico_float/include
-SRC += $(PICOSDKROOT)/src/rp2_common/pico_float/float_aeabi.S \
- $(PICOSDKROOT)/src/rp2_common/pico_float/float_init_rom.c \
- $(PICOSDKROOT)/src/rp2_common/pico_float/float_math.c \
- $(PICOSDKROOT)/src/rp2_common/pico_float/float_v1_rom_shim.S
-FLOAT_FUNCTIONS := __aeabi_fadd __aeabi_fdiv __aeabi_fmul __aeabi_frsub __aeabi_fsub __aeabi_cfcmpeq \
- __aeabi_cfrcmple __aeabi_cfcmple __aeabi_fcmpeq __aeabi_fcmplt __aeabi_fcmple \
- __aeabi_fcmpge __aeabi_fcmpgt __aeabi_fcmpun __aeabi_i2f __aeabi_l2f __aeabi_ui2f \
- __aeabi_ul2f __aeabi_f2iz __aeabi_f2lz __aeabi_f2uiz __aeabi_f2ulz __aeabi_f2d \
- sqrtf cosf sinf tanf atan2f expf logf ldexpf copysignf truncf floorf ceilf roundf \
- sincosf asinf acosf atanf sinhf coshf tanhf asinhf acoshf atanhf exp2f log2f exp10f \
- log10f powf powintf hypotf cbrtf fmodf dremf remainderf remquof expm1f log1pf fmaf
-$(call WRAP, $(FLOAT_FUNCTIONS))
diff --git a/keymaps/onekey/rp2040/chconf.h b/keymaps/onekey/rp_smp/chconf.h
index 8937db2..8937db2 100644
--- a/keymaps/onekey/rp2040/chconf.h
+++ b/keymaps/onekey/rp_smp/chconf.h
diff --git a/keymaps/onekey/rp2040/keymap.c b/keymaps/onekey/rp_smp/keymap.c
index 20372fd..20372fd 100644
--- a/keymaps/onekey/rp2040/keymap.c
+++ b/keymaps/onekey/rp_smp/keymap.c
diff --git a/keymaps/onekey/rp2040/mcuconf.h b/keymaps/onekey/rp_smp/mcuconf.h
index c35ba16..c35ba16 100644
--- a/keymaps/onekey/rp2040/mcuconf.h
+++ b/keymaps/onekey/rp_smp/mcuconf.h
diff --git a/keymaps/onekey/rp_smp/rules.mk b/keymaps/onekey/rp_smp/rules.mk
new file mode 100644
index 0000000..790127f
--- /dev/null
+++ b/keymaps/onekey/rp_smp/rules.mk
@@ -0,0 +1,3 @@
+CONSOLE_ENABLE = yes
+OPT_DEFS += -UCRT0_EXTRA_CORES_NUMBER \
+ -DCRT0_EXTRA_CORES_NUMBER=1
diff --git a/keymaps/onekey/stm32f411/config.h b/keymaps/onekey/stm32f411/config.h
deleted file mode 100644
index 668ebfb..0000000
--- a/keymaps/onekey/stm32f411/config.h
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2025 [email protected]
-// SPDX-License-Identifier: GPL-2.0-or-later
-#pragma once
-
-#undef ADC_PIN
-#undef BACKLIGHT_PIN
-#undef MATRIX_ROW_PINS
-#undef MATRIX_COL_PINS
-#define DIRECT_PINS \
- { \
- { A0 } \
- }
diff --git a/keymaps/qaz/keymap.c b/keymaps/qaz/keymap.c
deleted file mode 100644
index 35f03a1..0000000
--- a/keymaps/qaz/keymap.c
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2025 [email protected]
-// SPDX-License-Identifier: GPL-3.0-or-later
-#include "jack.h"
-
-// clang-format off
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- [_BASE] = LAYOUT_jack_sp(
- KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,
- HRML(KC_A, KC_S, KC_D, KC_F), KC_G, KC_H, HRMR(KC_J, KC_K, KC_L, KC_SCLN),
- KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT,
- UPDIR, XXXXXXX, KC_ESC, LWRSPC, RSEBSP, C(S(KC_V)), XXXXXXX, PNP
- ),
- [_LOWER] = LAYOUT_jack_sp(
- KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,
- HRML(KC_EXLM, KC_AT, KC_HASH, KC_DLR), KC_PERC, KC_CIRC, HRMR(KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN),
- KC_TAB, KC_CAPS, REMOVE, KC_GRV, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_SLSH,
- _______, _______, _______, _______, _______, _______, _______, _______
- ),
- [_RAISE] = LAYOUT_jack_sp(
- XRGB_TOG, XRGB_NXT, XRGB_HUI, XRGB_SAI, XRGB_VAI, UC_NOMODE, UC_SCRIPT, UC_BLOCKS, UC_REGIONAL, QK_MAKE,
- M_JIGGLE, XRGB_PRV, XRGB_HUD, XRGB_SAD, XRGB_VAD, UC_WIDE, UC_AUSSIE, UC_ZALGO, UC_SUPER, QK_BOOT,
- KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9,
- _______, _______, _______, _______, _______, _______, _______, _______
- )
-};
-// clang-format on
diff --git a/keymaps/qaz/rules.mk b/keymaps/qaz/rules.mk
deleted file mode 100644
index e9c301e..0000000
--- a/keymaps/qaz/rules.mk
+++ /dev/null
@@ -1,3 +0,0 @@
-RGBLIGHT_ENABLE = no
-MOUSEKEY_ENABLE = no
-BOOTLOADER = atmel-dfu
diff --git a/keymaps/relic/readme.md b/keymaps/relic/readme.md
deleted file mode 100644
index efab677..0000000
--- a/keymaps/relic/readme.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### relic
-![front](https://i.imgur.com/FMkKVs0.jpeg)
-![back](https://i.imgur.com/s1HrBum.jpeg)
diff --git a/keymaps/vault35/readme.md b/keymaps/vault35/readme.md
deleted file mode 100644
index 876e6fa..0000000
--- a/keymaps/vault35/readme.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### vault35
-![w/o keycaps](https://i.imgur.com/AHwhQdD.jpeg)
-![w/ keycaps](https://i.imgur.com/lXP50IT.jpeg)
diff --git a/ld/RP2040_FLASH_TIMECRIT_ROM_MATH.ld b/ld/RP2040_FLASH_TIMECRIT_ROM_MATH.ld
new file mode 100644
index 0000000..4b1c595
--- /dev/null
+++ b/ld/RP2040_FLASH_TIMECRIT_ROM_MATH.ld
@@ -0,0 +1,148 @@
+/*
+ * Copyright 2006..2021 ChibiOS
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/*
+ * RP2040 memory setup.
+ */
+MEMORY
+{
+ flash0 (rx) : org = 0x00000000, len = 16k /* ROM */
+ flash1 (rx) : org = 0x10000000, len = DEFINED(FLASH_LEN) ? FLASH_LEN : 2048k /* XIP */
+ flash2 (rx) : org = 0x00000000, len = 0
+ flash3 (rx) : org = 0x00000000, len = 0
+ flash4 (rx) : org = 0x00000000, len = 0
+ flash5 (rx) : org = 0x00000000, len = 0
+ flash6 (rx) : org = 0x00000000, len = 0
+ flash7 (rx) : org = 0x00000000, len = 0
+ ram0 (wx) : org = 0x20000000, len = 256k /* SRAM0 striped */
+ ram1 (wx) : org = 0x00000000, len = 256k /* SRAM0 non striped */
+ ram2 (wx) : org = 0x00000000, len = 0
+ ram3 (wx) : org = 0x00000000, len = 0
+ ram4 (wx) : org = 0x20040000, len = 4k /* SRAM4 */
+ ram5 (wx) : org = 0x20041000, len = 4k /* SRAM5 */
+ ram6 (wx) : org = 0x00000000, len = 0
+ ram7 (wx) : org = 0x20041f00, len = 256 /* SRAM5 boot */
+}
+
+/* For each data/text section two region are defined, a virtual region
+ and a load region (_LMA suffix).*/
+
+/* Flash region to be used for exception vectors.*/
+REGION_ALIAS("VECTORS_FLASH", flash1);
+REGION_ALIAS("VECTORS_FLASH_LMA", flash1);
+
+/* Flash region to be used for constructors and destructors.*/
+REGION_ALIAS("XTORS_FLASH", flash1);
+REGION_ALIAS("XTORS_FLASH_LMA", flash1);
+
+/* Flash region to be used for code text.*/
+REGION_ALIAS("TEXT_FLASH", flash1);
+REGION_ALIAS("TEXT_FLASH_LMA", flash1);
+
+/* Flash region to be used for read only data.*/
+REGION_ALIAS("RODATA_FLASH", flash1);
+REGION_ALIAS("RODATA_FLASH_LMA", flash1);
+
+/* Flash region to be used for various.*/
+REGION_ALIAS("VARIOUS_FLASH", flash1);
+REGION_ALIAS("VARIOUS_FLASH_LMA", flash1);
+
+/* Flash region to be used for RAM(n) initialization data.*/
+REGION_ALIAS("RAM_INIT_FLASH_LMA", flash1);
+
+/* RAM region to be used for Main stack. This stack accommodates the processing
+ of all exceptions and interrupts.*/
+REGION_ALIAS("MAIN_STACK_RAM", ram4);
+
+/* RAM region to be used for the process stack. This is the stack used by
+ the main() function.*/
+REGION_ALIAS("PROCESS_STACK_RAM", ram4);
+
+/* RAM region to be used for Main stack. This stack accommodates the processing
+ of all exceptions and interrupts.*/
+REGION_ALIAS("C1_MAIN_STACK_RAM", ram5);
+
+/* RAM region to be used for the process stack. This is the stack used by
+ the main() function.*/
+REGION_ALIAS("C1_PROCESS_STACK_RAM", ram5);
+
+/* RAM region to be used for data segment.*/
+REGION_ALIAS("DATA_RAM", ram0);
+REGION_ALIAS("DATA_RAM_LMA", flash1);
+
+/* RAM region to be used for BSS segment.*/
+REGION_ALIAS("BSS_RAM", ram0);
+
+/* RAM region to be used for the default heap.*/
+REGION_ALIAS("HEAP_RAM", ram0);
+
+SECTIONS
+{
+ .flash_begin : {
+ __flash_binary_start = .;
+ } > flash1
+
+ .boot2 : {
+ __boot2_start__ = .;
+ KEEP (*(.boot2))
+ __boot2_end__ = .;
+ } > flash1
+}
+
+/* Generic rules inclusion.*/
+INCLUDE rules_stacks.ld
+INCLUDE rules_stacks_c1.ld
+INCLUDE RP2040_rules_code_with_boot2.ld
+
+SECTIONS
+{
+ .data : ALIGN(4)
+ {
+ PROVIDE(_textdata = LOADADDR(.data));
+ PROVIDE(_data = .);
+ __textdata_base__ = LOADADDR(.data);
+ __data_base__ = .;
+ *(vtable)
+ *(.time_critical*)
+ . = ALIGN(4);
+ *(.data)
+ *(.data.*)
+ *(.ramtext)
+ . = ALIGN(4);
+ PROVIDE(_edata = .);
+ __data_end__ = .;
+ } > DATA_RAM AT > DATA_RAM_LMA
+
+ .bss (NOLOAD) : ALIGN(4)
+ {
+ __bss_base__ = .;
+ *(.bss)
+ *(.bss.*)
+ *(COMMON)
+ . = ALIGN(4);
+ __bss_end__ = .;
+ PROVIDE(end = .);
+ } > BSS_RAM
+}
+
+INCLUDE rules_memory.ld
+
+SECTIONS
+{
+ .flash_end : {
+ __flash_binary_end = .;
+ } > flash1
+}
+
+SECTIONS
+{
+ .preinit : ALIGN(4){
+ . = ALIGN(4);
+ __preinit_array_base__ = .;
+ KEEP(*(SORT(.preinit_array.*)))
+ KEEP(*(.preinit_array))
+ __preinit_array_end__ = .;
+ } > XTORS_FLASH AT > XTORS_FLASH_LMA
+}
diff --git a/readme.md b/readme.md
index c081265..1f6be41 100644
--- a/readme.md
+++ b/readme.md
@@ -1,23 +1,21 @@
-### qmk.me
-this is a self-contained repository for my personal [qmk](https://github.com/qmk/qmk_firmware) userspace & keyboard code.
+## qmk.me
+This is a self-contained repository for my personal [QMK](https://github.com/qmk/qmk_firmware) userspace & keyboard code.
![keyboard](https://i.imgur.com/s0dN0JD.jpeg)
### building
-symlinks are used to compile this code in a proper `qmk_firmware` repository.
+Symlinks are used to compile this code in a proper `qmk_firmware` repository.
eg.
```shell
-ln -s ~/qmk.me/jack ~/qmk_firmware/users/jack
-ln -s ~/qmk.me/keyboards/relic ~/qmk_firmware/keyboards/relic
-echo "users/jack\nkeyboards/relic" >> ~/qmk_firmware/.git/info/exclude
+ln -s qmk.me/jack qmk_firmware/users/jack
+ln -s qmk.me/keyboards/relic qmk_firmware/keyboards/relic
+echo "users/jack\nkeyboards/relic" >> qmk_firmware/.git/info/exclude
qmk compile -kb relic -km jack
```
-the official [userspace feature](https://docs.qmk.fm/newbs_external_userspace)
-is not used as this repository contains personal keyboards, which are not supported.
+The official external [userspace feature](https://docs.qmk.fm/newbs_external_userspace) is not used as this repository contains personal keyboards, which are not supported.
### layout
-a simple 34-key layout that makes use of 2 (primary) layers, home-row mods, & combos for many symbols.
-mostly used in sway, vim (c, python), & other generic computing tasks.
+A simple 34-key layout that makes use of 2 (primary) layers, home-row mods, & combos for many symbols. Mostly used in Sway, Vim (C, Python), & other generic computing tasks.
![layout](img/layout.svg)
diff --git a/util/link.sh b/util/link.sh
index c05dcb4..c0231bf 100755
--- a/util/link.sh
+++ b/util/link.sh
@@ -23,10 +23,9 @@ link() {
}
link crkbd crkbd
+link beiwagon boardsource/beiwagon
link bully mkh_studio/bully
link f60 bioi/f60
-link ferris ferris
link kyria splitkb/kyria
link relic projectcain/relic
link vault35 projectcain/vault35
-link qaz tominabox1/qaz