[Keyboard] Adding OSAv2 Numpad Topre support (#21224)
9 files changed, 446 insertions(+), 0 deletions(-) A keyboards/viktus/osav2_numpad_topre/ec.c A keyboards/viktus/osav2_numpad_topre/ec.h A keyboards/viktus/osav2_numpad_topre/info.json A keyboards/viktus/osav2_numpad_topre/keymaps/default/keymap.c A keyboards/viktus/osav2_numpad_topre/keymaps/via/keymap.c A keyboards/viktus/osav2_numpad_topre/keymaps/via/rules.mk A keyboards/viktus/osav2_numpad_topre/osav2_numpad_topre.c A keyboards/viktus/osav2_numpad_topre/readme.md A keyboards/viktus/osav2_numpad_topre/rules.mk
A keyboards/viktus/osav2_numpad_topre/ec.c => keyboards/viktus/osav2_numpad_topre/ec.c +181 -0
@@ 0,0 1,181 @@ /* Copyright 2023 Viktus Design LLC * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include "quantum.h" #include "ec.h" #include "analog.h" //#include "debug.h" // needed for debugging // sensing channel definitions #define A0 0 #define A1 1 #define A2 2 #define A3 3 #define A4 4 #define A5 5 #define A6 6 #define A7 7 // analog connection settings #define DISCHARGE_PIN B5 #define ANALOG_PORT B6 #ifndef MUX_SEL_PIN # define MUX_SEL_PINS \ { D6, D7, B4 } #endif // pin connections const uint8_t row_channels[] = MATRIX_ROW_PINS; const uint8_t col_pins[] = MATRIX_COL_PINS; const uint8_t mux_sel_pins[] = MUX_SEL_PINS; _Static_assert(sizeof(mux_sel_pins) == 3, "invalid MUX_SEL_PINS"); static ec_config_t config; static uint16_t ec_sw_value[MATRIX_COLS][MATRIX_ROWS]; static inline void discharge_capacitor(void) { setPinOutput(DISCHARGE_PIN); } static inline void charge_capacitor(uint8_t col) { setPinInput(DISCHARGE_PIN); writePinHigh(col_pins[col]); } static inline void clear_all_col_pins(void) { for (int col = 0; col < sizeof(col_pins); col++) { writePinLow(col_pins[col]); } } void init_mux_sel(void) { for (int idx = 0; idx < sizeof(mux_sel_pins); idx++) { setPinOutput(mux_sel_pins[idx]); } } void select_mux(uint8_t row) { uint8_t ch = row_channels[row]; writePin(mux_sel_pins[0], ch & 1); writePin(mux_sel_pins[1], ch & 2); writePin(mux_sel_pins[2], ch & 4); } void init_col(void) { for (int idx = 0; idx < sizeof(col_pins); idx++) { setPinOutput(col_pins[idx]); writePinLow(col_pins[idx]); } } void ec_init(ec_config_t const* const ec_config) { // save config config = *ec_config; // initialize discharge pin as discharge mode writePinLow(DISCHARGE_PIN); setPinOutput(DISCHARGE_PIN); // set analog reference analogReference(ADC_REF_POWER); // initialize drive lines init_col(); // initialize multiplexer select pin init_mux_sel(); // set discharge pin to charge mode setPinInput(DISCHARGE_PIN); } uint16_t ec_readkey_raw(uint8_t col, uint8_t row) { uint16_t sw_value = 0; discharge_capacitor(); select_mux(row); clear_all_col_pins(); cli(); charge_capacitor(col); sw_value = analogReadPin(ANALOG_PORT); sei(); return sw_value; } bool ec_update_key(matrix_row_t* current_row, matrix_row_t col, uint16_t sw_value, uint16_t reset_pt, uint16_t actuation_pt) { bool current_state = (*current_row >> col) & 1; // press to release if (current_state && sw_value < reset_pt) { *current_row &= ~(MATRIX_ROW_SHIFTER << col); return true; } // rest to press if ((!current_state) && sw_value > actuation_pt) { *current_row |= (MATRIX_ROW_SHIFTER << col); return true; } return false; } bool ec_matrix_scan(matrix_row_t current_matrix[]) { bool updated = false; for (int row = 0; row < sizeof(row_channels); row++) { for (int col = 0; col < sizeof(col_pins); col++) { uint16_t reset_pt = config.reset_pt; uint16_t actuation_pt = config.actuation_pt; //Modifying threshold values for overlapping pads switch(row) { case 1: case 2: case 3: case 4: switch(col) { case 3: // lower threshold for plus and enter: (37 rest, 61 btm) reset_pt = 45; actuation_pt = 50; break; } break; } ec_sw_value[col][row] = ec_readkey_raw(col, row); updated |= ec_update_key(¤t_matrix[row], col, ec_sw_value[col][row], reset_pt, actuation_pt); } } return updated; } // console debugging for pad values /*void ec_dprint_matrix(void) { for (int row = 0; row < sizeof(row_channels); row++) { for (int col = 0; col < sizeof(col_pins); col++) { dprintf("%5d", ec_sw_value[col][row]); } dprintf("\n"); } }*/
A keyboards/viktus/osav2_numpad_topre/ec.h => keyboards/viktus/osav2_numpad_topre/ec.h +31 -0
@@ 0,0 1,31 @@ /* Copyright 2023 Viktus Design LLC * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include <stdint.h> #include <stdbool.h> #include "matrix.h" typedef struct { uint16_t reset_pt; uint16_t actuation_pt; } ec_config_t; void ec_init(ec_config_t const* const ec_config); bool ec_matrix_scan(matrix_row_t current_matrix[]); //void ec_dprint_matrix(void); // needed for debugging uint16_t ec_readkey_raw(uint8_t col, uint8_t row); bool ec_update_key(matrix_row_t* current_row, uint8_t col, uint16_t sw_value, uint16_t reset_pt, uint16_t actuation_pt);
A keyboards/viktus/osav2_numpad_topre/info.json => keyboards/viktus/osav2_numpad_topre/info.json +100 -0
@@ 0,0 1,100 @@ { "manufacturer": "Viktus Design LLC", "keyboard_name": "OSAv2 Numpad - Topre", "maintainer": "BlindAssassin111", "url": "https://viktus.design", "usb": { "device_version": "1.1.0", "vid": "0x5644", "pid": "0x4E54" }, "bootloader": "atmel-dfu", "processor": "atmega32u4", "features": { "bootmagic": true, "command": false, "console": false, "extrakey": true, "mousekey": true, "nkro": true }, "build": { "lto": true }, "diode_direction": "COL2ROW", "matrix_pins": { "cols": ["F5", "F6", "D3", "D2"], "rows": ["A1", "A0", "A3", "A2", "A4"] }, "layouts": { "LAYOUT_ortho_5x4": { "layout": [ { "label": "K00", "matrix": [0, 0], "x": 0, "y": 0 }, { "label": "K01", "matrix": [0, 1], "x": 1, "y": 0 }, { "label": "K02", "matrix": [0, 2], "x": 2, "y": 0 }, { "label": "K03", "matrix": [0, 3], "x": 3, "y": 0 }, { "label": "K10", "matrix": [1, 0], "x": 0, "y": 1 }, { "label": "K11", "matrix": [1, 1], "x": 1, "y": 1 }, { "label": "K12", "matrix": [1, 2], "x": 2, "y": 1 }, { "label": "K13", "matrix": [1, 3], "x": 3, "y": 1 }, { "label": "K20", "matrix": [2, 0], "x": 0, "y": 2 }, { "label": "K21", "matrix": [2, 1], "x": 1, "y": 2 }, { "label": "K22", "matrix": [2, 2], "x": 2, "y": 2 }, { "label": "K23", "matrix": [2, 3], "x": 3, "y": 2 }, { "label": "K30", "matrix": [3, 0], "x": 0, "y": 3 }, { "label": "K31", "matrix": [3, 1], "x": 1, "y": 3 }, { "label": "K32", "matrix": [3, 2], "x": 2, "y": 3 }, { "label": "K33", "matrix": [3, 3], "x": 3, "y": 3 }, { "label": "K40", "matrix": [4, 0], "x": 0, "y": 4 }, { "label": "K41", "matrix": [4, 1], "x": 1, "y": 4 }, { "label": "K42", "matrix": [4, 2], "x": 2, "y": 4 }, { "label": "K43", "matrix": [4, 3], "x": 3, "y": 4 } ] }, "LAYOUT_split_plus_2u_enter": { "layout": [ { "label": "K00", "matrix": [0, 0], "x": 0, "y": 0 }, { "label": "K01", "matrix": [0, 1], "x": 1, "y": 0 }, { "label": "K02", "matrix": [0, 2], "x": 2, "y": 0 }, { "label": "K03", "matrix": [0, 3], "x": 3, "y": 0 }, { "label": "K10", "matrix": [1, 0], "x": 0, "y": 1 }, { "label": "K11", "matrix": [1, 1], "x": 1, "y": 1 }, { "label": "K12", "matrix": [1, 2], "x": 2, "y": 1 }, { "label": "K13", "matrix": [1, 3], "x": 3, "y": 1 }, { "label": "K20", "matrix": [2, 0], "x": 0, "y": 2 }, { "label": "K21", "matrix": [2, 1], "x": 1, "y": 2 }, { "label": "K22", "matrix": [2, 2], "x": 2, "y": 2 }, { "label": "K23", "matrix": [2, 3], "x": 3, "y": 2 }, { "label": "K30", "matrix": [3, 0], "x": 0, "y": 3 }, { "label": "K31", "matrix": [3, 1], "x": 1, "y": 3 }, { "label": "K32", "matrix": [3, 2], "x": 2, "y": 3 }, { "label": "K33", "matrix": [3, 3], "h": 2, "x": 3, "y": 3 }, { "label": "K40", "matrix": [4, 0], "x": 0, "y": 4 }, { "label": "K41", "matrix": [4, 1], "x": 1, "y": 4 }, { "label": "K42", "matrix": [4, 2], "x": 2, "y": 4 } ] }, "LAYOUT_2u_plus_2u_enter": { "layout": [ { "label": "K00", "matrix": [0, 0], "x": 0, "y": 0 }, { "label": "K01", "matrix": [0, 1], "x": 1, "y": 0 }, { "label": "K02", "matrix": [0, 2], "x": 2, "y": 0 }, { "label": "K03", "matrix": [0, 3], "x": 3, "y": 0 }, { "label": "K10", "matrix": [1, 0], "x": 0, "y": 1 }, { "label": "K11", "matrix": [1, 1], "x": 1, "y": 1 }, { "label": "K12", "matrix": [1, 2], "x": 2, "y": 1 }, { "label": "K20", "matrix": [2, 0], "x": 0, "y": 2 }, { "label": "K21", "matrix": [2, 1], "x": 1, "y": 2 }, { "label": "K22", "matrix": [2, 2], "x": 2, "y": 2 }, { "label": "K23", "matrix": [2, 3], "h": 2, "x": 3, "y": 1 }, { "label": "K30", "matrix": [3, 0], "x": 0, "y": 3 }, { "label": "K31", "matrix": [3, 1], "x": 1, "y": 3 }, { "label": "K32", "matrix": [3, 2], "x": 2, "y": 3 }, { "label": "K33", "matrix": [3, 3], "h": 2, "x": 3, "y": 3 }, { "label": "K40", "matrix": [4, 0], "x": 0, "y": 4 }, { "label": "K41", "matrix": [4, 1], "x": 1, "y": 4 }, { "label": "K42", "matrix": [4, 2], "x": 2, "y": 4 } ] } } }
A keyboards/viktus/osav2_numpad_topre/keymaps/default/keymap.c => keyboards/viktus/osav2_numpad_topre/keymaps/default/keymap.c +27 -0
@@ 0,0 1,27 @@ /* Copyright 2023 Viktus Design LLC * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_ortho_5x4( KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, KC_P7, KC_P8, KC_P9, KC_PEQL, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_P1, KC_P2, KC_P3, KC_PENT, KC_P0, KC_P0, KC_PDOT, KC_DEL ) };
A keyboards/viktus/osav2_numpad_topre/keymaps/via/keymap.c => keyboards/viktus/osav2_numpad_topre/keymaps/via/keymap.c +27 -0
@@ 0,0 1,27 @@ /* Copyright 2023 Viktus Design LLC * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_ortho_5x4( KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, KC_P7, KC_P8, KC_P9, KC_PEQL, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_P1, KC_P2, KC_P3, KC_PENT, KC_P0, KC_P0, KC_PDOT, KC_DEL ) };
A keyboards/viktus/osav2_numpad_topre/keymaps/via/rules.mk => keyboards/viktus/osav2_numpad_topre/keymaps/via/rules.mk +1 -0
A keyboards/viktus/osav2_numpad_topre/osav2_numpad_topre.c => keyboards/viktus/osav2_numpad_topre/osav2_numpad_topre.c +49 -0
@@ 0,0 1,49 @@ /* Copyright 2023 Viktus Design LLC * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include "quantum.h" #include "ec.h" #include "matrix.h" //#include "debug.h" // needed for debugging #define RESET_PT 55 #define ACTUATION_PT 65 // console debugging for pad values void keyboard_post_init_kb() { debug_enable = true; debug_matrix = true; } void matrix_init_custom(void) { ec_config_t ec_config = {.reset_pt = RESET_PT, .actuation_pt = ACTUATION_PT}; ec_init(&ec_config); } bool matrix_scan_custom(matrix_row_t current_matrix[]) { bool updated = ec_matrix_scan(current_matrix); // console debugging for pad values /*static int cnt = 0; if (cnt++ == 1000) { cnt = 0; ec_dprint_matrix(); dprintf("\n"); }*/ return updated; }
A keyboards/viktus/osav2_numpad_topre/readme.md => keyboards/viktus/osav2_numpad_topre/readme.md +27 -0
@@ 0,0 1,27 @@ # OSAv2 Numpad - Topre  An OSAv2 Numpad in topre flavor. - Keyboard Maintainer: BlindAssassin111 - Hardware Supported: OSAv2 Numpad Topre PCB - Hardware Availability: Viktus Design LLC Make example for this keyboard (after setting up your build environment): make viktus/osav2_numpad_topre:default Flashing example for this keyboard: make viktus/osav2_numpad_topre:default:flash See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). ## Bootloader Enter the bootloader in 3 ways: * **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard * **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead * **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
A keyboards/viktus/osav2_numpad_topre/rules.mk => keyboards/viktus/osav2_numpad_topre/rules.mk +3 -0