Browse Source

code style and pr prep

pull/17504/head
Ian Klug 1 year ago
parent
commit
ebae385de8
11 changed files with 198 additions and 154 deletions
  1. +7
    -12
      keyboards/ianklug/bemini/config.h
  2. +14
    -14
      keyboards/ianklug/bemini/info.json
  3. +20
    -0
      keyboards/ianklug/bemini/keymaps/default/config.h
  4. +25
    -22
      keyboards/ianklug/bemini/keymaps/default/keymap.c
  5. +20
    -0
      keyboards/ianklug/bemini/keymaps/default_p2/config.h
  6. +25
    -22
      keyboards/ianklug/bemini/keymaps/default_p2/keymap.c
  7. +1
    -1
      keyboards/ianklug/bemini/keymaps/default_p2/readme.md
  8. +20
    -0
      keyboards/ianklug/bemini/keymaps/gamepad/config.h
  9. +55
    -77
      keyboards/ianklug/bemini/keymaps/gamepad/keymap.c
  10. +10
    -5
      keyboards/ianklug/bemini/readme.md
  11. +1
    -1
      keyboards/ianklug/bemini/rules.mk

+ 7
- 12
keyboards/ianklug/bemini/config.h View File

@ -28,33 +28,28 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define MATRIX_ROWS 1
#define MATRIX_COLS 13
// switch wiring
// F4, F5, B6, B5, B4, D7, D6, D4, D3, D2, D1, D0, C6 (prototype)
/* switch wiring (direct, no diodes) */
#define DIRECT_PINS { \
{ C7, C6, B6, B5, B4, D7, D6, D4, D3, D2, D1, D0, F5 } \
}
#define UNUSED_PINS
// encoder pins
/* encoder pins */
#define ENCODERS_PAD_A { F7 }
#define ENCODERS_PAD_B { F6 }
// encoder sensitivity
/* encoder hardware resolution */
#define ENCODER_RESOLUTION 2
// debounce
/* debounce */
#define DEBOUNCE 5
// unbind deprecated actions
#define NO_ACTION_MACRO
#define NO_ACTION_FUNCTION
// joystick
/* gamepad buttons and axes */
#define JOYSTICK_BUTTON_COUNT 16
#define JOYSTICK_AXES_COUNT 2
// n-key rollover
/* n-key rollover */
#define FORCE_NKRO
// 1000hz polling
/* 1000hz polling */
#define USB_POLLING_INTERVAL_MS 1
#define QMK_KEYS_PER_SCAN 12

+ 14
- 14
keyboards/ianklug/bemini/info.json View File

@ -7,20 +7,20 @@
"layouts": {
"LAYOUT": {
"layout": [
{"label": "k01", "x": 3.5, "y": 1.5, "w": 1, "h": 1.5},
{"label": "k02", "x": 4, "y": 0, "w": 1, "h": 1.5},
{"label": "k03", "x": 4.5, "y": 1.5, "w": 1, "h": 1.5},
{"label": "k04", "x": 5, "y": 0, "w": 1, "h": 1.5},
{"label": "k05", "x": 5.5, "y": 1.5, "w": 1, "h": 1.5},
{"label": "k06", "x": 6, "y": 0, "w": 1, "h": 1.5},
{"label": "k07", "x": 6.5, "y": 1.5, "w": 1, "h": 1.5},
{"label": "k08", "x": 7, "y": 0, "w": 1, "h": 1.5},
{"label": "k09", "x": 7.5, "y": 1.5, "w": 1, "h": 1.5},
{"label": "k10", "x": 9, "y": 0, "w": 1, "h": 1},
{"label": "k11", "x": 9, "y": 1, "w": 1, "h": 1},
{"label": "k12", "x": 9, "y": 2, "w": 1, "h": 1},
{"label": "k13", "x": 1, "y": 1, "w": 1, "h": 1}
]
{"label": "Z", "x": 3.5, "y": 1.5, "w": 1, "h": 1.5},
{"label": "S", "x": 4, "y": 0, "w": 1, "h": 1.5},
{"label": "X", "x": 4.5, "y": 1.5, "w": 1, "h": 1.5},
{"label": "D", "x": 5, "y": 0, "w": 1, "h": 1.5},
{"label": "C", "x": 5.5, "y": 1.5, "w": 1, "h": 1.5},
{"label": "F", "x": 6, "y": 0, "w": 1, "h": 1.5},
{"label": "V", "x": 6.5, "y": 1.5, "w": 1, "h": 1.5},
{"label": "T", "x": 7, "y": 0, "w": 1, "h": 1.5},
{"label": "G", "x": 7.5, "y": 1.5, "w": 1, "h": 1.5},
{"label": "Enter", "x": 9, "y": 0, "w": 1, "h": 1},
{"label": "1", "x": 9, "y": 1, "w": 1, "h": 1},
{"label": "Tab", "x": 9, "y": 2, "w": 1, "h": 1},
{"label": "Shift", "x": 1, "y": 1, "w": 1, "h": 1}
]
}
}
}

+ 20
- 0
keyboards/ianklug/bemini/keymaps/default/config.h View File

@ -0,0 +1,20 @@
/* Copyright 2022 Ian Klug
*
* 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/>.
*/
#pragma once
/* how long (ms) to hold the keys "tapped" by encoder rotation */
#define TAP_CODE_DELAY 10

+ 25
- 22
keyboards/ianklug/bemini/keymaps/default/keymap.c View File

@ -15,31 +15,34 @@
*/
#include QMK_KEYBOARD_H
// how long (ms) to hold buttons tapped by the encoder
#define TAP_CODE_DELAY 10
/* define names for use in layer keycodes and the keymap */
enum layer_names {
BASE
};
// bemini key layout, player 1 configuration
// .-----------------------------------------------------------------------------------------.
// | |
// | .-------.-------.-------.-------. .-------. |
// | | | | | | | | |
// | | | | | | | K12 | |
// | | K02 | K04 | K06 | K08 | | | |
// | .-------. | | | | | +-------+ |
// | | | | | | | | | | |
// | |K13/ENC| .---+---+---+---+---+---+---+---+---+---. | K11 | |
// | | | | | | | | | | | |
// | '-------' | | | | | | +-------+ |
// | | K01 | K03 | K05 | K07 | K09 | | | |
// | | | | | | | | K10 | |
// | | | | | | | | | |
// | '-------'-------'-------'-------'-------' '-------' |
// | |
// '-----------------------------------------------------------------------------------------'
/* bemini key layout, player 1 configuration
* .-----------------------------------------------------------------------------------------.
* | |
* | .-------.-------.-------.-------. .-------. |
* | | | | | | | | |
* | | | | | | | K12 | |
* | | K02 | K04 | K06 | K08 | | | |
* | .-------. | | | | | +-------+ |
* | | | | | | | | | | |
* | |K13/ENC| .---+---+---+---+---+---+---+---+---+---. | K11 | |
* | | | | | | | | | | | |
* | '-------' | | | | | | +-------+ |
* | | K01 | K03 | K05 | K07 | K09 | | | |
* | | | | | | | | K10 | |
* | | | | | | | | | |
* | '-------'-------'-------'-------'-------' '-------' |
* | |
* '-----------------------------------------------------------------------------------------'
*/
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT(
// K01 K02 K03 K04 K05 K06 K07 K08 K09 K10 K11 K12 K13
[BASE] = LAYOUT(
/* K01 K02 K03 K04 K05 K06 K07 K08 K09 K10 K11 K12 K13 */
KC_Z, KC_S, KC_X, KC_D, KC_C, KC_F, KC_V, KC_T, KC_G, KC_ENT, KC_1, KC_TAB, KC_LSFT
)
};


+ 20
- 0
keyboards/ianklug/bemini/keymaps/default_p2/config.h View File

@ -0,0 +1,20 @@
/* Copyright 2022 Ian Klug
*
* 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/>.
*/
#pragma once
/* how long (ms) to hold the keys "tapped" by encoder rotation */
#define TAP_CODE_DELAY 10

+ 25
- 22
keyboards/ianklug/bemini/keymaps/default_p2/keymap.c View File

@ -15,31 +15,34 @@
*/
#include QMK_KEYBOARD_H
// how long (ms) to hold buttons tapped by the encoder
#define TAP_CODE_DELAY 10
/* define names for use in layer keycodes and the keymap */
enum layer_names {
BASE
};
// bemini key layout, player 2 configuration
// .-----------------------------------------------------------------------------------------.
// | |
// | .-------. .-------.-------.-------.-------. |
// | | | | | | | | |
// | | K10 | | | | | | |
// | | | | K08 | K06 | K04 | K02 | |
// | +-------+ | | | | | .-------. |
// | | | | | | | | | | |
// | | K11 | .---+---+---+---+---+---+---+---+---+---. |K13/ENC| |
// | | | | | | | | | | | |
// | +-------+ | | | | | | '-------' |
// | | | | K09 | K07 | K05 | K03 | K01 | |
// | | K12 | | | | | | | |
// | | | | | | | | | |
// | '-------' '-------'-------'-------'-------'-------' |
// | |
// '-----------------------------------------------------------------------------------------'
/* bemini key layout, player 2 configuration
* .-----------------------------------------------------------------------------------------.
* | |
* | .-------. .-------.-------.-------.-------. |
* | | | | | | | | |
* | | K10 | | | | | | |
* | | | | K08 | K06 | K04 | K02 | |
* | +-------+ | | | | | .-------. |
* | | | | | | | | | | |
* | | K11 | .---+---+---+---+---+---+---+---+---+---. |K13/ENC| |
* | | | | | | | | | | | |
* | +-------+ | | | | | | '-------' |
* | | | | K09 | K07 | K05 | K03 | K01 | |
* | | K12 | | | | | | | |
* | | | | | | | | | |
* | '-------' '-------'-------'-------'-------'-------' |
* | |
* '-----------------------------------------------------------------------------------------'
*/
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT(
// K01 K02 K03 K04 K05 K06 K07 K08 K09 K10 K11 K12 K13
[BASE] = LAYOUT(
/* K01 K02 K03 K04 K05 K06 K07 K08 K09 K10 K11 K12 K13 */
KC_DOT, KC_L, KC_COMM, KC_K, KC_M, KC_J, KC_N, KC_H, KC_B, KC_TAB, KC_1, KC_ENT, KC_RSFT
)
};


+ 1
- 1
keyboards/ianklug/bemini/keymaps/default_p2/readme.md View File

@ -1 +1 @@
# The default_p2 keymap for bemini
# The default p2 keymap for bemini

+ 20
- 0
keyboards/ianklug/bemini/keymaps/gamepad/config.h View File

@ -0,0 +1,20 @@
/* Copyright 2022 Ian Klug
*
* 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/>.
*/
#pragma once
/* how long to wait (ms) between pulses before releasing encoder hold in bms/keyboard modes */
#define ENC_HOLD_TIME 50

+ 55
- 77
keyboards/ianklug/bemini/keymaps/gamepad/keymap.c View File

@ -18,25 +18,22 @@
#include "joystick.h"
#include "timer.h"
// how long to wait (ms) between pulses before releasing encoder hold in bms/keyboard modes
#define ENC_HOLD_TIME 50
// joystick axes
/* joystick axes */
joystick_config_t joystick_axes[JOYSTICK_AXES_COUNT] = {
[0] = JOYSTICK_AXIS_VIRTUAL,
[1] = JOYSTICK_AXIS_VIRTUAL
};
// encoder
/* encoder state */
int x_axis_val = 0;
int enc_reverse = 0;
uint16_t hold_timer = 0;
uint16_t held_keycode = 0;
// toggle button
/* toggle button state */
bool is_toggled = 0;
// layer state
/* layer state */
bool is_player_two = 0;
int mode_swap = 0;
int mode_swap_p2 = 0;
@ -46,24 +43,25 @@ bool mode_swap_bms = 0;
bool mode_swap_keyboard = 0;
bool mode_swap_ninekey = 0;
// bemini v1 key layout, player 1 configuration
// .-----------------------------------------------------------------------------------------.
// | |
// | .-------.-------.-------.-------. .-------. |
// | | | | | | | | |
// | | | | | | | K12 | |
// | | K02 | K04 | K06 | K08 | | | |
// | .-------. | | | | | +-------+ |
// | | | | | | | | | | |
// | |K13/ENC| .---+---+---+---+---+---+---+---+---+---. | K11 | |
// | | | | | | | | | | | |
// | '-------' | | | | | | +-------+ |
// | | K01 | K03 | K05 | K07 | K09 | | | |
// | | | | | | | | K10 | |
// | | | | | | | | | |
// | '-------'-------'-------'-------'-------' '-------' |
// | |
// '-----------------------------------------------------------------------------------------'
/* bemini key layout, player 1 configuration
* .-----------------------------------------------------------------------------------------.
* | |
* | .-------.-------.-------.-------. .-------. |
* | | | | | | | | |
* | | | | | | | K12 | |
* | | K02 | K04 | K06 | K08 | | | |
* | .-------. | | | | | +-------+ |
* | | | | | | | | | | |
* | |K13/ENC| .---+---+---+---+---+---+---+---+---+---. | K11 | |
* | | | | | | | | | | | |
* | '-------' | | | | | | +-------+ |
* | | K01 | K03 | K05 | K07 | K09 | | | |
* | | | | | | | | K10 | |
* | | | | | | | | | |
* | '-------'-------'-------'-------'-------' '-------' |
* | |
* '-----------------------------------------------------------------------------------------'
*/
enum custom_keycodes {
TOGGLE_BUTTON = SAFE_RANGE,
@ -83,7 +81,7 @@ enum layer_names {
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// K01 K02 K03 K04 K05 K06 K07 K08 K09 K10 K11 K12 K13
/* K01 K02 K03 K04 K05 K06 K07 K08 K09 K10 K11 K12 K13 */
[STANDARD_P1] = LAYOUT(
JS_BUTTON12, JS_BUTTON13, JS_BUTTON0, JS_BUTTON1, JS_BUTTON2, JS_BUTTON3, JS_BUTTON4, JS_BUTTON5, JS_BUTTON6, JS_BUTTON10, JS_BUTTON9, JS_BUTTON8, TOGGLE_BUTTON
),
@ -116,7 +114,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
)
};
// set player state from eeprom on boot
/* set player state from eeprom on boot */
void matrix_init_user(void) {
eeconfig_read_default_layer();
if (biton32(default_layer_state) == STANDARD_P2) {
@ -124,8 +122,9 @@ void matrix_init_user(void) {
}
}
// manage encoder hold/release behavior (bms, keyboard modes)
// hold while rotating, release hold when rotation stops
/* manage encoder hold/release behavior (bms, keyboard modes)
* hold while rotating, release hold when rotation stops
*/
void matrix_scan_user(void) {
if (hold_timer != 0) {
if (timer_elapsed(hold_timer) > ENC_HOLD_TIME) {
@ -142,7 +141,7 @@ void matrix_scan_user(void) {
}
}
// encoder behavior
/* encoder behavior */
bool encoder_update_user(uint8_t index, bool clockwise) {
if (index == 0) {
if (layer_state_is(STANDARD_P1) || layer_state_is(STANDARD_P2)) {
@ -191,7 +190,7 @@ bool encoder_update_user(uint8_t index, bool clockwise) {
} else if (x_axis_val != x_axis_input) {
enc_reverse++;
// require two consecutive reverse signals to change direction
/* require two consecutive reverse signals to change direction */
if (enc_reverse > 1) {
x_axis_val = x_axis_input;
joystick_status.axes[0] = x_axis_input;
@ -221,7 +220,7 @@ bool encoder_update_user(uint8_t index, bool clockwise) {
} else if (held_keycode != mapped_code) {
enc_reverse++;
// require two consecutive reverse signals to change direction
/* require two consecutive reverse signals to change direction */
if (enc_reverse > 1) {
unregister_code(held_keycode);
register_code(mapped_code);
@ -252,7 +251,7 @@ bool encoder_update_user(uint8_t index, bool clockwise) {
} else if (held_keycode != mapped_code) {
enc_reverse++;
// require two consecutive reverse signals to change direction
/* require two consecutive reverse signals to change direction */
if (enc_reverse > 1) {
unregister_code(held_keycode);
register_code(mapped_code);
@ -267,43 +266,32 @@ bool encoder_update_user(uint8_t index, bool clockwise) {
hold_timer = timer_read();
}
} else if (layer_state_is(NINEKEY_P1) || layer_state_is(NINEKEY_P2)) {
// not bound
/* not bound */
}
}
return true;
}
// custom keypress behavior
/* custom keypress behavior */
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch(keycode){
case TOGGLE_BUTTON:
// K13
if (layer_state_is(STANDARD_P1) || layer_state_is(STANDARD_P2)) {
if (record->event.pressed) {
is_toggled ^= 1;
if (is_toggled) {
// zero-indexed button id
uint8_t joystick_button = 14;
joystick_status.buttons[joystick_button / 8] |= 1 << (joystick_button % 8);
joystick_status.status |= JS_UPDATED;
register_joystick_button(14);
} else {
uint8_t joystick_button = 15;
joystick_status.buttons[joystick_button / 8] |= 1 << (joystick_button % 8);
joystick_status.status |= JS_UPDATED;
register_joystick_button(15);
}
} else {
if (is_toggled) {
uint8_t joystick_button = 14;
joystick_status.buttons[joystick_button / 8] &= ~(1 << (joystick_button % 8));
joystick_status.status |= JS_UPDATED;
unregister_joystick_button(14);
} else {
uint16_t joystick_button = 15;
joystick_status.buttons[joystick_button / 8] &= ~(1 << (joystick_button % 8));
joystick_status.status |= JS_UPDATED;
unregister_joystick_button(15);
}
}
} else if (layer_state_is(INVERTED_P1)) {
// inverted p1
if (record->event.pressed) {
is_toggled ^= 1;
if (is_toggled) {
@ -319,7 +307,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
}
}
} else if (layer_state_is(INVERTED_P2)) {
//inverted p2
if (record->event.pressed) {
is_toggled ^= 1;
if (is_toggled) {
@ -338,24 +325,15 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed) {
is_toggled ^= 1;
if (is_toggled) {
// zero-indexed button id
uint8_t joystick_button = 14;
joystick_status.buttons[joystick_button / 8] |= 1 << (joystick_button % 8);
joystick_status.status |= JS_UPDATED;
register_joystick_button(14);
} else {
uint8_t joystick_button = 15;
joystick_status.buttons[joystick_button / 8] |= 1 << (joystick_button % 8);
joystick_status.status |= JS_UPDATED;
register_joystick_button(15);
}
} else {
if (is_toggled) {
uint8_t joystick_button = 14;
joystick_status.buttons[joystick_button / 8] &= ~(1 << (joystick_button % 8));
joystick_status.status |= JS_UPDATED;
unregister_joystick_button(14);
} else {
uint16_t joystick_button = 15;
joystick_status.buttons[joystick_button / 8] &= ~(1 << (joystick_button % 8));
joystick_status.status |= JS_UPDATED;
unregister_joystick_button(15);
}
}
} else if (layer_state_is(KEYBOARD_P1)) {
@ -389,53 +367,53 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
}
}
} else if (layer_state_is(NINEKEY_P1) || layer_state_is(NINEKEY_P2)) {
// unbound
/* not bound */
}
break;
case KC_E: case KC_R: case KC_T: case KC_O: case KC_P: case KC_LBRC: case JS_BUTTON8: case JS_BUTTON9: case JS_BUTTON10: case JS_BUTTON11:
// K10, K11, K12
/* K10, K11, K12 */
if (record->event.pressed)
mode_swap++;
else
mode_swap--;
break;
case KC_A: case KC_DOT: case JS_BUTTON12: case JS_BUTTON13:
// White 1
/* White 1 */
if (record->event.pressed)
mode_swap_ninekey = 1;
else
mode_swap_ninekey = 0;
break;
case KC_D: case KC_Z: case JS_BUTTON0:
// White 2
/* White 2 */
if (record->event.pressed)
mode_swap_standard = 1;
else
mode_swap_standard = 0;
break;
case KC_G: case KC_C: case JS_BUTTON2:
// White 3
/* White 3 */
if (record->event.pressed)
mode_swap_inverted = 1;
else
mode_swap_inverted = 0;
break;
case KC_J: case KC_B: case JS_BUTTON4:
// White 4
/* White 4 */
if (record->event.pressed)
mode_swap_bms = 1;
else
mode_swap_bms = 0;
break;
case KC_L: case KC_M: case JS_BUTTON6:
// White 5
/* White 5 */
if (record->event.pressed)
mode_swap_keyboard = 1;
else
mode_swap_keyboard = 0;
break;
case KC_F: case KC_H: case KC_N: case KC_V: case JS_BUTTON1: case JS_BUTTON3: case JS_BUTTON5:
// Black 2 + Black 3
/* Black 2 + Black 3 */
if (record->event.pressed)
mode_swap_p2++;
else
@ -443,11 +421,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
break;
}
// switch active layer when any white key + e keys are pressed
// switch player mode when middle two black keys + e keys are pressed
/* switch active layer when any white key + e keys are pressed
* switch player mode when middle two black keys + e keys are pressed
*/
if (mode_swap == 3) {
// save default player mode to eeprom
/* save default player mode to eeprom */
if (mode_swap_p2 == 2) {
is_player_two ^= 1;
if (is_player_two) {
@ -485,7 +463,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
}
}
// reset everything after layer switch
/* reset everything after layer switch */
x_axis_val = 0;
hold_timer = 0;
held_keycode = 0;


+ 10
- 5
keyboards/ianklug/bemini/readme.md View File

@ -1,14 +1,12 @@
# Bemini
A miniature mechanical keyboard controller with a rotary encoder for staggered key rhythm games
A miniature mechanical keyboard controller with a rotary encoder for staggered-key rhythm games
![Bemini PCB](https://i.imgur.com/wbMkbHX.jpg)
* Keyboard Maintainer: [ianklug](https://github.com/ianklug)
* Keyboard Maintainer: [Ian Klug](https://github.com/ianklug)
* Hardware Supported: bemini
* Hardware Availability: https://kayboards.com/products/bemini
Press the button on the back of the keyboard to enter bootloader mode.
* Hardware Availability: https://github.com/ianklug/bemini
Make example for this keyboard (after setting up your build environment):
@ -19,3 +17,10 @@ Flashing example for this keyboard:
make ianklug/bemini: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 2 ways:
* **Bootmagic reset**: Hold down the first white key (labeled K1 on PCB) and plug in the keyboard
* **Physical reset button**: Briefly press the button on the back of the PCB

+ 1
- 1
keyboards/ianklug/bemini/rules.mk View File

@ -1,7 +1,7 @@
MCU = atmega32u4
BOOTLOADER = atmel-dfu
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
MOUSEKEY_ENABLE = yes # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
NKRO_ENABLE = yes # USB Nkey Rollover


Loading…
Cancel
Save