keyboard stuff

Add classic48 keyboard (#25492)

Co-authored-by: Pablo Jimenez Mateo <pablojimenezmateo@gmail.com>

authored by

Pablo Jiménez Mateo
Pablo Jimenez Mateo
and committed by
GitHub
c67e4c2c 5ba424ca

+275
+23
keyboards/pablojimenezmateo/classic48/config.h
···
··· 1 + /* Copyright 2025 Pablo Jiménez Mateo (@pablojimenezmateo) 2 + * 3 + * This program is free software: you can redistribute it and/or modify 4 + * it under the terms of the GNU General Public License as published by 5 + * the Free Software Foundation, either version 2 of the License, or 6 + * (at your option) any later version. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + * 13 + * You should have received a copy of the GNU General Public License 14 + * along with this program. If not, see <http://www.gnu.org/licenses/>. 15 + */ 16 + #pragma once 17 + 18 + #define EE_HANDS 19 + 20 + #define MK_KINETIC_SPEED 21 + #define MOUSEKEY_INITIAL_SPEED 200 22 + #define MOUSEKEY_WHEEL_INITIAL_MOVEMENTS 2 23 + #define MOUSEKEY_WHEEL_BASE_MOVEMENTS 16
+152
keyboards/pablojimenezmateo/classic48/keyboard.json
···
··· 1 + { 2 + "manufacturer": "Pablo Jim\u00e9nez Mateo", 3 + "keyboard_name": "classic48", 4 + "maintainer": "pablojimenezmateo", 5 + "development_board": "promicro_rp2040", 6 + "diode_direction": "COL2ROW", 7 + "features": { 8 + "bootmagic": true, 9 + "extrakey": true, 10 + "mousekey": true, 11 + "rgb_matrix": true 12 + }, 13 + "matrix_pins": { 14 + "cols": ["GP23", "GP21", "GP16", "GP15", "GP14", "GP13"], 15 + "rows": ["GP27", "GP26", "GP22", "GP20"] 16 + }, 17 + "rgb_matrix": { 18 + "default": { 19 + "hue": 180, 20 + "sat": 100, 21 + "val": 60 22 + }, 23 + "driver": "ws2812", 24 + "layout": [ 25 + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 4}, 26 + {"matrix": [0, 1], "x": 20, "y": 0, "flags": 4}, 27 + {"matrix": [0, 2], "x": 40, "y": 0, "flags": 4}, 28 + {"matrix": [0, 3], "x": 60, "y": 0, "flags": 4}, 29 + {"matrix": [0, 4], "x": 80, "y": 0, "flags": 4}, 30 + {"matrix": [0, 5], "x": 100, "y": 0, "flags": 4}, 31 + {"matrix": [4, 0], "x": 240, "y": 0, "flags": 4}, 32 + {"matrix": [4, 1], "x": 220, "y": 0, "flags": 4}, 33 + {"matrix": [4, 2], "x": 200, "y": 0, "flags": 4}, 34 + {"matrix": [4, 3], "x": 180, "y": 0, "flags": 4}, 35 + {"matrix": [4, 4], "x": 160, "y": 0, "flags": 4}, 36 + {"matrix": [4, 5], "x": 140, "y": 0, "flags": 4}, 37 + {"matrix": [1, 0], "x": 0, "y": 20, "flags": 4}, 38 + {"matrix": [1, 1], "x": 20, "y": 20, "flags": 4}, 39 + {"matrix": [1, 2], "x": 40, "y": 20, "flags": 4}, 40 + {"matrix": [1, 3], "x": 60, "y": 20, "flags": 4}, 41 + {"matrix": [1, 4], "x": 80, "y": 20, "flags": 4}, 42 + {"matrix": [1, 5], "x": 100, "y": 20, "flags": 4}, 43 + {"matrix": [5, 0], "x": 240, "y": 20, "flags": 4}, 44 + {"matrix": [5, 1], "x": 220, "y": 20, "flags": 4}, 45 + {"matrix": [5, 2], "x": 200, "y": 20, "flags": 4}, 46 + {"matrix": [5, 3], "x": 180, "y": 20, "flags": 4}, 47 + {"matrix": [5, 4], "x": 160, "y": 20, "flags": 4}, 48 + {"matrix": [5, 5], "x": 140, "y": 20, "flags": 4}, 49 + {"matrix": [2, 0], "x": 0, "y": 40, "flags": 4}, 50 + {"matrix": [2, 1], "x": 20, "y": 40, "flags": 4}, 51 + {"matrix": [2, 2], "x": 40, "y": 40, "flags": 4}, 52 + {"matrix": [2, 3], "x": 60, "y": 40, "flags": 4}, 53 + {"matrix": [2, 4], "x": 80, "y": 40, "flags": 4}, 54 + {"matrix": [2, 5], "x": 100, "y": 40, "flags": 4}, 55 + {"matrix": [6, 0], "x": 240, "y": 40, "flags": 4}, 56 + {"matrix": [6, 1], "x": 220, "y": 40, "flags": 4}, 57 + {"matrix": [6, 2], "x": 200, "y": 40, "flags": 4}, 58 + {"matrix": [6, 3], "x": 180, "y": 40, "flags": 4}, 59 + {"matrix": [6, 4], "x": 160, "y": 40, "flags": 4}, 60 + {"matrix": [6, 5], "x": 140, "y": 40, "flags": 4}, 61 + {"matrix": [3, 0], "x": 0, "y": 60, "flags": 4}, 62 + {"matrix": [3, 1], "x": 20, "y": 60, "flags": 4}, 63 + {"matrix": [3, 2], "x": 40, "y": 60, "flags": 4}, 64 + {"matrix": [3, 3], "x": 60, "y": 60, "flags": 4}, 65 + {"matrix": [3, 4], "x": 80, "y": 60, "flags": 4}, 66 + {"matrix": [3, 5], "x": 100, "y": 60, "flags": 4}, 67 + {"matrix": [7, 0], "x": 240, "y": 60, "flags": 4}, 68 + {"matrix": [7, 1], "x": 220, "y": 60, "flags": 4}, 69 + {"matrix": [7, 2], "x": 200, "y": 60, "flags": 4}, 70 + {"matrix": [7, 3], "x": 180, "y": 60, "flags": 4}, 71 + {"matrix": [7, 4], "x": 160, "y": 60, "flags": 4}, 72 + {"matrix": [7, 5], "x": 140, "y": 60, "flags": 4} 73 + ], 74 + "max_brightness": 200 75 + }, 76 + "split": { 77 + "enabled": true, 78 + "serial": { 79 + "driver": "vendor", 80 + "pin": "GP28" 81 + }, 82 + "transport": { 83 + "sync": { 84 + "layer_state": true 85 + } 86 + } 87 + }, 88 + "url": "https://github.com/pablojimenezmateo/classic48", 89 + "usb": { 90 + "device_version": "1.0.0", 91 + "pid": "0x0000", 92 + "vid": "0xFEED" 93 + }, 94 + "ws2812": { 95 + "driver": "vendor", 96 + "pin": "GP29" 97 + }, 98 + "layouts": { 99 + "LAYOUT": { 100 + "layout": [ 101 + {"matrix": [0, 0], "x": 0, "y": 0}, 102 + {"matrix": [0, 1], "x": 1, "y": 0}, 103 + {"matrix": [0, 2], "x": 2, "y": 0}, 104 + {"matrix": [0, 3], "x": 3, "y": 0}, 105 + {"matrix": [0, 4], "x": 4, "y": 0}, 106 + {"matrix": [0, 5], "x": 5, "y": 0}, 107 + {"matrix": [4, 5], "x": 7, "y": 0}, 108 + {"matrix": [4, 4], "x": 8, "y": 0}, 109 + {"matrix": [4, 3], "x": 9, "y": 0}, 110 + {"matrix": [4, 2], "x": 10, "y": 0}, 111 + {"matrix": [4, 1], "x": 11, "y": 0}, 112 + {"matrix": [4, 0], "x": 12, "y": 0}, 113 + {"matrix": [1, 0], "x": 0, "y": 1}, 114 + {"matrix": [1, 1], "x": 1, "y": 1}, 115 + {"matrix": [1, 2], "x": 2, "y": 1}, 116 + {"matrix": [1, 3], "x": 3, "y": 1}, 117 + {"matrix": [1, 4], "x": 4, "y": 1}, 118 + {"matrix": [1, 5], "x": 5, "y": 1}, 119 + {"matrix": [5, 5], "x": 7, "y": 1}, 120 + {"matrix": [5, 4], "x": 8, "y": 1}, 121 + {"matrix": [5, 3], "x": 9, "y": 1}, 122 + {"matrix": [5, 2], "x": 10, "y": 1}, 123 + {"matrix": [5, 1], "x": 11, "y": 1}, 124 + {"matrix": [5, 0], "x": 12, "y": 1}, 125 + {"matrix": [2, 0], "x": 0, "y": 2}, 126 + {"matrix": [2, 1], "x": 1, "y": 2}, 127 + {"matrix": [2, 2], "x": 2, "y": 2}, 128 + {"matrix": [2, 3], "x": 3, "y": 2}, 129 + {"matrix": [2, 4], "x": 4, "y": 2}, 130 + {"matrix": [2, 5], "x": 5, "y": 2}, 131 + {"matrix": [6, 5], "x": 7, "y": 2}, 132 + {"matrix": [6, 4], "x": 8, "y": 2}, 133 + {"matrix": [6, 3], "x": 9, "y": 2}, 134 + {"matrix": [6, 2], "x": 10, "y": 2}, 135 + {"matrix": [6, 1], "x": 11, "y": 2}, 136 + {"matrix": [6, 0], "x": 12, "y": 2}, 137 + {"matrix": [3, 0], "x": 0, "y": 3}, 138 + {"matrix": [3, 1], "x": 1, "y": 3}, 139 + {"matrix": [3, 2], "x": 2, "y": 3}, 140 + {"matrix": [3, 3], "x": 3, "y": 3}, 141 + {"matrix": [3, 4], "x": 4, "y": 3}, 142 + {"matrix": [3, 5], "x": 5, "y": 3}, 143 + {"matrix": [7, 5], "x": 7, "y": 3}, 144 + {"matrix": [7, 4], "x": 8, "y": 3}, 145 + {"matrix": [7, 3], "x": 9, "y": 3}, 146 + {"matrix": [7, 2], "x": 10, "y": 3}, 147 + {"matrix": [7, 1], "x": 11, "y": 3}, 148 + {"matrix": [7, 0], "x": 12, "y": 3} 149 + ] 150 + } 151 + } 152 + }
+72
keyboards/pablojimenezmateo/classic48/keymaps/default/keymap.c
···
··· 1 + /* Copyright 2025 Pablo Jiménez Mateo (@pablojimenezmateo) 2 + * 3 + * This program is free software: you can redistribute it and/or modify 4 + * it under the terms of the GNU General Public License as published by 5 + * the Free Software Foundation, either version 2 of the License, or 6 + * (at your option) any later version. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + * 13 + * You should have received a copy of the GNU General Public License 14 + * along with this program. If not, see <http://www.gnu.org/licenses/>. 15 + */ 16 + 17 + #include QMK_KEYBOARD_H 18 + 19 + enum layer_names { 20 + _MAIN, 21 + _NUMBERS, 22 + _SYMBOLS, 23 + _NAVIGATION 24 + }; 25 + 26 + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 27 + [_MAIN] = LAYOUT( 28 + KC_NO, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_NO, 29 + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, 30 + KC_ESCAPE, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_NO, 31 + LCTL(KC_X), LCTL(KC_C), LCTL(KC_V), KC_NO, MO(_NUMBERS), LT(3, KC_SPC), LT(2, KC_ENTER), KC_LSFT, KC_NO, KC_LGUI, KC_NO, LCTL(KC_F) 32 + ), 33 + [_NUMBERS] = LAYOUT( 34 + KC_NO, KC_F1, KC_F2, KC_F3, KC_F4, KC_NO, KC_NO, KC_7, KC_8, KC_9, KC_NO, KC_NO, 35 + KC_NO, KC_F5, KC_F6, KC_F7, KC_F8, KC_NO, KC_NO, KC_4, KC_5, KC_6, KC_NO, KC_NO, 36 + KC_NO, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, KC_NO, KC_1, KC_2, KC_3, KC_NO, KC_NO, 37 + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_0, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO 38 + ), 39 + [_SYMBOLS] = LAYOUT( 40 + KC_NO, KC_PIPE, KC_AT, KC_LCBR, KC_RCBR, KC_CIRC, KC_QUOT, KC_DQUO, KC_EQL, KC_AMPR, KC_ASTR, KC_GRV, 41 + KC_NO, KC_EXLM, KC_EXLM, KC_LPRN, KC_RPRN, KC_DLR, KC_EXLM, KC_QUES, KC_SLSH, KC_COLN, KC_SCLN, KC_PLUS, 42 + KC_NO, KC_HASH, KC_PERC, KC_LBRC, KC_RBRC, KC_TILD, KC_LT, KC_GT, KC_MINS, KC_UNDS, KC_BSLS, KC_PSCR, 43 + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_BSPC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, QK_BOOT 44 + ), 45 + [_NAVIGATION] = LAYOUT( 46 + KC_NO, KC_NO, MS_BTN4, MS_UP, MS_BTN5, KC_NO, LSFT(KC_LEFT), LALT(KC_DOWN), LALT(KC_UP), LSFT(KC_RGHT), KC_NO, KC_VOLU, 47 + KC_NO, KC_NO, MS_LEFT, MS_DOWN, MS_RGHT, KC_LEFT_CTRL, KC_HOME, MS_BTN1, MS_BTN3, MS_BTN2, KC_END, KC_VOLD, 48 + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_NO, KC_BRIU, 49 + LCTL(KC_X), LCTL(KC_C), LCTL(KC_V), KC_NO, KC_NO, KC_NO, MS_WHLD, MS_WHLU, KC_NO, KC_NO, KC_NO, KC_BRID 50 + ), 51 + }; 52 + 53 + layer_state_t layer_state_set_user(layer_state_t state) { 54 + switch (get_highest_layer(state)) { 55 + case _MAIN: 56 + /* Yellow */ 57 + rgb_matrix_sethsv_noeeprom(50, 255, 255); break; 58 + case _NUMBERS: 59 + /* Cyan */ 60 + rgb_matrix_sethsv_noeeprom(170, 255, 255); break; 61 + case _SYMBOLS: 62 + /* Purple */ 63 + rgb_matrix_sethsv_noeeprom(200, 255, 255); break; 64 + case _NAVIGATION: 65 + /* Green */ 66 + rgb_matrix_sethsv_noeeprom(85, 255, 255); break; 67 + default: 68 + /* Off */ 69 + rgb_matrix_sethsv_noeeprom(0, 0, 0); break; 70 + } 71 + return state; 72 + }
+28
keyboards/pablojimenezmateo/classic48/readme.md
···
··· 1 + # pablojimenezmateo/classic48 2 + 3 + ![pablojimenezmateo/classic48](https://i.imgur.com/czFWWhX.jpeg) 4 + 5 + A custom split keyboard with 48 keys and addressable LEDs. 6 + 7 + * Keyboard Maintainer: [Pablo Jimenez Mateo](https://github.com/pablojimenezmateo) 8 + * Hardware Supported: RP2040 Pro Micro 9 + * Hardware Availability: https://github.com/pablojimenezmateo/classic48 10 + 11 + Make example for this keyboard (after setting up your build environment): 12 + 13 + make pablojimenezmateo/classic48:default 14 + 15 + Flashing example for this keyboard: 16 + 17 + qmk flash -kb pablojimenezmateo/classic48 -km default -bl uf2-split-left 18 + qmk flash -kb pablojimenezmateo/classic48 -km default -bl uf2-split-right 19 + 20 + 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). 21 + 22 + ## Bootloader 23 + 24 + Enter the bootloader in 3 ways: 25 + 26 + * **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard 27 + * **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead 28 + * **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available