summaryrefslogtreecommitdiff
path: root/keyboards/handwired
diff options
context:
space:
mode:
authorAlex Ong <the.onga@gmail.com>2019-01-26 11:36:28 +1100
committerAlex Ong <the.onga@gmail.com>2019-01-26 11:36:28 +1100
commitd977daa8dc9136746425f9e1414e1f93cb161877 (patch)
tree209ab8082580e5fdf37f1a8b7c1169250b7548c0 /keyboards/handwired
parent47c91fc7f75ae0a477e55b687aa0fc30da0a283c (diff)
parent0306e487e2cd6a77ad840d0a441b478747b7ccd0 (diff)
downloadqmk_firmware-d977daa8dc9136746425f9e1414e1f93cb161877.tar.gz
qmk_firmware-d977daa8dc9136746425f9e1414e1f93cb161877.zip
Merge branch 'master' of https://github.com/qmk/qmk_firmware
Diffstat (limited to 'keyboards/handwired')
-rw-r--r--keyboards/handwired/atreus50/keymaps/ajp10304/rules.mk4
-rw-r--r--keyboards/handwired/dactyl_manuform/4x5/keymaps/default/rules.mk3
-rw-r--r--keyboards/handwired/dactyl_manuform/4x5/keymaps/dvorak/rules.mk3
-rw-r--r--keyboards/handwired/datahand/config.h87
-rw-r--r--keyboards/handwired/datahand/datahand.h133
-rw-r--r--keyboards/handwired/datahand/keymaps/default/keymap.c313
-rw-r--r--keyboards/handwired/datahand/matrix.c125
-rw-r--r--keyboards/handwired/datahand/readme.md15
-rw-r--r--keyboards/handwired/datahand/rules.mk59
-rw-r--r--keyboards/handwired/downbubble/config.h245
-rw-r--r--keyboards/handwired/downbubble/downbubble.c16
-rw-r--r--keyboards/handwired/downbubble/downbubble.h111
-rw-r--r--keyboards/handwired/downbubble/info.json559
-rw-r--r--keyboards/handwired/downbubble/keymaps/default/config.h19
-rw-r--r--keyboards/handwired/downbubble/keymaps/default/keymap.c103
-rw-r--r--keyboards/handwired/downbubble/keymaps/default/readme.md1
-rw-r--r--keyboards/handwired/downbubble/license201
-rw-r--r--keyboards/handwired/downbubble/readme.md15
-rw-r--r--keyboards/handwired/downbubble/rules.mk81
-rw-r--r--keyboards/handwired/frenchdev/keymaps/default/keymap.c9
-rw-r--r--keyboards/handwired/frenchdev/rules.mk3
-rw-r--r--keyboards/handwired/hexon38/config.h60
-rw-r--r--keyboards/handwired/hexon38/hexon38.c3
-rw-r--r--keyboards/handwired/hexon38/hexon38.h17
-rw-r--r--keyboards/handwired/hexon38/keymaps/default/keymap.c407
-rw-r--r--keyboards/handwired/hexon38/readme.md11
-rw-r--r--keyboards/handwired/hexon38/rules.mk64
-rw-r--r--keyboards/handwired/ibm122m/keymaps/lukaus/keymap.c4
-rw-r--r--keyboards/handwired/ibm122m/readme.md2
-rw-r--r--keyboards/handwired/not_so_minidox/readme.md2
-rw-r--r--keyboards/handwired/numbrero/config.h51
-rw-r--r--keyboards/handwired/numbrero/info.json62
-rw-r--r--keyboards/handwired/numbrero/keymaps/default/keymap.c30
-rw-r--r--keyboards/handwired/numbrero/license201
-rw-r--r--keyboards/handwired/numbrero/numbrero.c1
-rw-r--r--keyboards/handwired/numbrero/numbrero.h30
-rw-r--r--keyboards/handwired/numbrero/readme.md13
-rw-r--r--keyboards/handwired/numbrero/rules.mk59
-rw-r--r--keyboards/handwired/numpad20/readme.md2
-rw-r--r--keyboards/handwired/ortho5x13/ortho5x13.h7
-rw-r--r--keyboards/handwired/ortho60/info.json67
-rw-r--r--keyboards/handwired/ortho60/readme.md11
-rw-r--r--keyboards/handwired/ortho60/rules.mk2
-rw-r--r--keyboards/handwired/promethium/keymaps/default/keymap.c1
-rw-r--r--keyboards/handwired/promethium/keymaps/priyadi/keymap.c1
-rw-r--r--keyboards/handwired/pteron/keymaps/FSund/keymap.c4
-rw-r--r--keyboards/handwired/qc60/README.md5
-rw-r--r--keyboards/handwired/qc60/info.json634
-rw-r--r--keyboards/handwired/qc60/keymaps/default/keymap.c3
-rw-r--r--keyboards/handwired/qc60/keymaps/wntrmln/keymap.c3
-rw-r--r--keyboards/handwired/qc60/proto/proto.h26
-rw-r--r--keyboards/handwired/reddot/info.json108
-rw-r--r--[-rwxr-xr-x]keyboards/handwired/reddot/keymaps/default/keymap.c39
-rwxr-xr-xkeyboards/handwired/reddot/readme.md26
-rwxr-xr-xkeyboards/handwired/reddot/reddot.h27
-rw-r--r--keyboards/handwired/retro_refit/info.json95
-rw-r--r--keyboards/handwired/retro_refit/keymaps/default/keymap.c37
-rw-r--r--keyboards/handwired/retro_refit/readme.md72
-rw-r--r--keyboards/handwired/retro_refit/retro_refit.h51
-rw-r--r--keyboards/handwired/rs60/README.md27
-rw-r--r--keyboards/handwired/rs60/config.h47
-rw-r--r--keyboards/handwired/rs60/keymaps/default/keymap.c207
-rw-r--r--keyboards/handwired/rs60/keymaps/default/readme.md1
-rw-r--r--keyboards/handwired/rs60/rs60.c18
-rw-r--r--keyboards/handwired/rs60/rs60.h36
-rw-r--r--keyboards/handwired/rs60/rules.mk61
-rw-r--r--keyboards/handwired/terminus_mini/readme.md2
-rw-r--r--keyboards/handwired/tradestation/info.json12
-rw-r--r--keyboards/handwired/tradestation/readme.md26
-rw-r--r--keyboards/handwired/tradestation/rules.mk3
-rw-r--r--keyboards/handwired/tradestation/tradestation.h32
-rw-r--r--keyboards/handwired/traveller/keymaps/default/keymap.c3
-rw-r--r--keyboards/handwired/woodpad/keymaps/default/keymap.c4
-rw-r--r--keyboards/handwired/woodpad/keymaps/default/rules.mk3
-rw-r--r--keyboards/handwired/woodpad/keymaps/drashna/rules.mk3
-rw-r--r--keyboards/handwired/xealous/debounce.c63
-rw-r--r--keyboards/handwired/xealous/rules.mk10
77 files changed, 4583 insertions, 318 deletions
diff --git a/keyboards/handwired/atreus50/keymaps/ajp10304/rules.mk b/keyboards/handwired/atreus50/keymaps/ajp10304/rules.mk
index f2a91de897..fc5d9ba1aa 100644
--- a/keyboards/handwired/atreus50/keymaps/ajp10304/rules.mk
+++ b/keyboards/handwired/atreus50/keymaps/ajp10304/rules.mk
@@ -1,7 +1,3 @@
-ifndef QUANTUM_DIR
- include ../../../../Makefile
-endif
-
AUDIO_ENABLE = no
MOUSEKEY_ENABLE = yes
diff --git a/keyboards/handwired/dactyl_manuform/4x5/keymaps/default/rules.mk b/keyboards/handwired/dactyl_manuform/4x5/keymaps/default/rules.mk
index 457a3d01d4..e69de29bb2 100644
--- a/keyboards/handwired/dactyl_manuform/4x5/keymaps/default/rules.mk
+++ b/keyboards/handwired/dactyl_manuform/4x5/keymaps/default/rules.mk
@@ -1,3 +0,0 @@
-ifndef QUANTUM_DIR
- include ../../../../Makefile
-endif
diff --git a/keyboards/handwired/dactyl_manuform/4x5/keymaps/dvorak/rules.mk b/keyboards/handwired/dactyl_manuform/4x5/keymaps/dvorak/rules.mk
index 457a3d01d4..e69de29bb2 100644
--- a/keyboards/handwired/dactyl_manuform/4x5/keymaps/dvorak/rules.mk
+++ b/keyboards/handwired/dactyl_manuform/4x5/keymaps/dvorak/rules.mk
@@ -1,3 +0,0 @@
-ifndef QUANTUM_DIR
- include ../../../../Makefile
-endif
diff --git a/keyboards/handwired/datahand/config.h b/keyboards/handwired/datahand/config.h
new file mode 100644
index 0000000000..1ba8479f0a
--- /dev/null
+++ b/keyboards/handwired/datahand/config.h
@@ -0,0 +1,87 @@
+/* Copyright 2017-2019 Nikolaus Wittenstein <nikolaus.wittenstein@gmail.com>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+ * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+/* Taken from the DataHand PS/2-USB adaptor. */
+#define VENDOR_ID 0x13BA
+#define PRODUCT_ID 0x0017
+#define DEVICE_VER 0x0001
+#define MANUFACTURER DataHand
+#define PRODUCT DataHand
+#define DESCRIPTION DataHand Teensy++ 2.0 conversion
+
+/* key matrix size */
+#define MATRIX_ROWS 13
+#define MATRIX_COLS 4
+
+#define DIODE_DIRECTION CUSTOM_MATRIX
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCING_DELAY 0
+
+/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
+#define LOCKING_SUPPORT_ENABLE
+/* Locking resynchronize hack */
+#define LOCKING_RESYNC_ENABLE
+
+/*
+ * Force NKRO
+ *
+ * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
+ * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
+ * makefile for this to work.)
+ *
+ * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
+ * until the next keyboard reset.
+ *
+ * NKRO may prevent your keystrokes from being detected in the BIOS, but it is
+ * fully operational during normal computer usage.
+ *
+ * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
+ * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
+ * bootmagic, NKRO mode will always be enabled until it is toggled again during a
+ * power-up.
+ */
+#define FORCE_NKRO
+
+/*
+ * Magic Key Options
+ *
+ * Magic keys are hotkey commands that allow control over firmware functions of
+ * the keyboard. They are best used in combination with the HID Listen program,
+ * found here: https://www.pjrc.com/teensy/hid_listen.html
+ *
+ * The options below allow the magic key functionality to be changed. This is
+ * useful if your keyboard/keypad is missing keys and you want magic key support.
+ */
+
+/* key combination for magic key command */
+#define IS_COMMAND() ( \
+ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
+)
+
+/*
+ * Command/Windows key option
+ *
+ * If you define this, the thumb enter key becomes the Command/Windows key. There's still an enter key on the right
+ * ring finger, so this key is much better utilized as the otherwise nonexistent Command key. I think some newer
+ * DataHands let you remap right ring east as Command, but having it on the thumb is nicer. Comment out this define
+ * to use the original layout.
+ */
+#define DATAHAND_THUMB_RETURN_COMMAND
diff --git a/keyboards/handwired/datahand/datahand.h b/keyboards/handwired/datahand/datahand.h
new file mode 100644
index 0000000000..cb9a4d3e3b
--- /dev/null
+++ b/keyboards/handwired/datahand/datahand.h
@@ -0,0 +1,133 @@
+/* Copyright 2017-2019 Nikolaus Wittenstein <nikolaus.wittenstein@gmail.com>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+ * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#pragma once
+
+#include "quantum.h"
+
+/* This a shortcut to help you visually see your layout.
+ * The first section contains all of the arguements; the second converts the arguments into a two-dimensional array.
+ */
+
+/* Each code is three letters
+ * l or r - left or right hand
+ * p, r, m, i, t - pinky, ring finger, middle finger, index finger, thumb
+ * fingers: n, s, e, w, c - north, south, east, west, and center (manual calls this "well" but we already have "west")
+ * thumb: p, n, c, l, u, k - pad, nail, center, lock (harder center), up, knuckle
+ */
+#define LAYOUT( \
+ lpn, lrn, lmn, lin, rin, rmn, rrn, rpn, \
+lpw, lpc, lpe, lrw, lrc, lre, lmw, lmc, lme, liw, lic, lie, riw, ric, rie, rmw, rmc, rme, rrw, rrc, rre, rpw, rpc, rpe, \
+ lps, lrs, lms, lis, ris, rms, rrs, rps, \
+ ltp, ltn, rtn, rtp, \
+ ltc, rtc, \
+ ltl, rtl, \
+ ltu, ltk, rtk, rtu) \
+{ \
+ {riw, rin, lpw, lpn},\
+ {ric, rie, lpc, lpe},\
+ {ris, rms, lps, lrs},\
+ {rmw, rmn, lrw, lrn},\
+ {rmc, rme, lrc, lre},\
+ {rrw, rrn, lmw, lmn},\
+ {rrc, rre, lmc, lme},\
+ {rrs, rps, lms, lis},\
+ {rpw, rpn, liw, lin},\
+ {rpc, rpe, lic, lie},\
+ {rtk, rtn, ltk, ltn},\
+ {rtc, rtl, ltc, ltl},\
+ {rtp, rtu, ltp, ltu},\
+}
+
+/* Mode LEDs are active-low on Port B on the Teensy. */
+#define LED_MODE_PORT PORTB
+#define LED_TENKEY (1<<3)
+#define LED_FN (1<<4)
+#define LED_NORMAL (1<<5)
+#define LED_NAS (1<<6)
+
+/* Lock LEDs are active-low on Port F on the Teensy. */
+#define LED_LOCK_PORT PORTF
+#define LED_CAPS_LOCK (1<<4)
+#define LED_MOUSE_LOCK (1<<5)
+#define LED_NUM_LOCK (1<<6)
+#define LED_SCROLL_LOCK (1<<7)
+
+
+/* Appendix:
+ * Table based on https://geekhack.org/index.php?topic=12212.msg2059319#msg2059319
+ * Some pin assignments (e.g. for PS/2 I/O) have been fixed.
+ *
+ * Teensy Datahand 8051 pin pin 8051 Datahand Teensy
+ * ------ -------- ---- --- --- ---- -------- ------
+ * GND Mtrx send A P1.0 1 40 VCC VCC VCC
+ * PB7 Mtrx send B P1.1 2 39 P0.0 LED RH NAS PB6
+ * PD0 Mtrx send C P1.2 3 38 P0.1 LED RH NORM PB5
+ * PD1 Mtrx send D P1.3 4 37 P0.2 LED RH FCTN PB4
+ * PD2 RH rcv 0 P1.4 5 36 P0.3 LED RH 10K PB3
+ * PD3 RH rcv 1 P1.5 6 35 P0.4 LED RH unused PB2
+ * PD4 LH rcv 0 P1.6 7 34 P0.5 LED RH unused PE1
+ * PD5 LH rcv 1 P1.7 8 33 P0.6 LED RH unused PE0
+ * PD6 Reset button RST 9 32 P0.7 ? PE7
+ * PD7 ? P3.0 10 31 VPP - PE6
+ * PE0 ? P3.1 11 30 ALE - GND
+ * PE1 kbd data P3.2 12 29 PSEN - AREF
+ * PC0 ? P3.3 13 28 P2.7 ? PF0
+ * PC1 kbd clk P3.4 14 27 P2.6 ? PF1
+ * PC2 ? P3.5 15 26 P2.5 ? PF2
+ * PC3 RAM P3.6 16 25 P2.4 ? PF3
+ * PC4 RAM P3.7 17 24 P2.3 LED D15 LH (CAPLK) PF4
+ * PC5 XTAL2 XTAL2 18 23 P2.2 LED D13 LH (MSELK) PF5
+ * PC6 XTAL1 XTAL1 19 22 P2.1 LED D6 LH (NUMLK) PF6
+ * PC7 GND GND 20 21 P2.0 LED D14 LH (SCRLK) PF7
+ *
+ * JP3 Pinout
+ * 2 - keyboard data
+ * 3 - keyboard clock
+ *
+ * In order to get the Teensy to work, we need to move pin 1 to a different pin. This is
+ * because on the Teensy pin 1 is ground, but we need to write to pin 1 in order to read
+ * the keyboard matrix. An ideal pin to move it to is VPP (pin 31), because this pin tells
+ * the 8051 whether it should read from external or internal memory. The Teensy doesn't
+ * care about that.
+ *
+ * The easiest way to reassign the pin is to use standoffs. You can check out this thread:
+ * https://geekhack.org/index.php?topic=12212.msg235382#msg235382 for a picture of what
+ * this looks like. Note that in the picture the pin has been reassigned to pin 12. We
+ * don't want to do that because we're going to use that pin to send data over PS/2.
+ *
+ * We could if we wanted also reassign the PS/2 pins to Teensy hardware UART pins, but
+ * that's more work. Instead we'll just bit-bang PS/2 because it's an old, slow protocol
+ * (and because there's already a bit-banged PS/2 host implementation in QMK - we just
+ * need to add the device side).
+ *
+ * So overall, we want the following inputs and outputs:
+ * Outputs:
+ * Matrix:
+ * PB7
+ * PD0
+ * PD1
+ * PE6 (moved from pin1, GND)
+ * LEDs:
+ * PB3-6
+ * PF4-7
+ * Inputs:
+ * Matrix:
+ * PD2-5
+ * I/Os (start up as inputs):
+ * PS/2:
+ * PC1
+ * PE1
+ */
diff --git a/keyboards/handwired/datahand/keymaps/default/keymap.c b/keyboards/handwired/datahand/keymaps/default/keymap.c
new file mode 100644
index 0000000000..8f44535594
--- /dev/null
+++ b/keyboards/handwired/datahand/keymaps/default/keymap.c
@@ -0,0 +1,313 @@
+/* Copyright 2017-2019 Nikolaus Wittenstein <nikolaus.wittenstein@gmail.com>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+ * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include QMK_KEYBOARD_H
+
+#include <stdbool.h>
+
+/* Datahand features not supported:
+ * * All online reprogramming (user settings using the reset button).
+ * * Program Selection features.
+ * * Macros.
+ * * Direct substitutions.
+ * * L/R Modf.
+ * * Mouse Click Lock (Function Direct Access + Mouse Button key).
+ * * Different mouse movement speeds with the two pointer fingers, and using both pointer fingers to move even faster.
+ *
+ * As far as I know, everything else works.
+ */
+
+enum layer {
+ NORMAL,
+#ifdef DATAHAND_THUMB_RETURN_COMMAND
+ NORMAL_THUMB_RETURN_COMMAND,
+#endif
+ FUNCTION_MOUSE,
+ FUNCTION_ARROWS,
+ NAS,
+ NAS_NUMLOCK,
+ NAS_TENKEY,
+ NAS_TENKEY_NUMLOCK,
+
+ NUM_LAYERS
+};
+
+enum custom_keycodes {
+ N = SAFE_RANGE, /* Normal */
+ NS, /* NAS */
+ NSL, /* NAS Lock */
+ NLK, /* Numlock */
+ FN, /* Function mode - needs to be able to switch to mouse or arrow layer */
+ TK0, /* Ten-key off button */
+ TK1, /* Ten-key on button */
+ AR, /* FN arrow mode */
+ MS, /* FN mouse mode */
+ DZ, /* Double zero button */
+};
+
+static bool mouse_enabled = true;
+static bool tenkey_enabled = false;
+static bool numlock_enabled = false;
+static bool nas_locked = false;
+
+/* Declared weak so that it can easily be overridden. */
+__attribute__((weak)) const uint16_t PROGMEM keymaps[NUM_LAYERS][MATRIX_ROWS][MATRIX_COLS] = {
+[NORMAL] = LAYOUT(
+ KC_Q, KC_W, KC_E, KC_R, KC_U, KC_I, KC_O, KC_P,
+KC_DEL, KC_A, KC_LBRC, KC_ESC, KC_S, KC_B, KC_GRV, KC_D, KC_T, KC_DQT, KC_F, KC_G, KC_H, KC_J, KC_QUOT, KC_Y, KC_K, KC_COLN, KC_N, KC_L, KC_ENT, KC_RBRC, KC_SCLN, KC_BSLS,
+ KC_Z, KC_X, KC_C, KC_V, KC_M, KC_COMM, KC_DOT, KC_SLSH,
+ KC_ENT, KC_TAB, KC_BSPC, KC_SPC,
+ KC_LSFT, NS,
+ KC_CAPS, NSL,
+ N, KC_LCTL, KC_LALT, FN),
+
+#ifdef DATAHAND_THUMB_RETURN_COMMAND
+[NORMAL_THUMB_RETURN_COMMAND] = LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______,
+ KC_LCMD, _______, _______, _______,
+ _______, _______,
+ _______, _______,
+ _______, _______, _______, _______),
+#endif
+
+[FUNCTION_MOUSE] = LAYOUT(
+ KC_F2, KC_F4, KC_F6, KC_MS_U, KC_MS_U, KC_F8, KC_F10, KC_PGUP,
+_______, KC_NO, KC_SLCK, _______, KC_BTN3, NLK, KC_BTN1, MS, KC_BTN2, KC_MS_L, KC_BTN1, KC_MS_R, KC_MS_L, KC_BTN2, KC_MS_R, KC_END, AR, KC_LSFT, KC_INS, KC_9, KC_ENT, KC_F11, KC_0, KC_F12,
+ KC_F1, KC_F3, KC_F5, KC_MS_D, KC_MS_D, KC_F7, KC_F9, KC_PGDN,
+ _______, _______, _______, _______,
+ _______, _______,
+ _______, _______,
+ _______, _______, _______, _______),
+[FUNCTION_ARROWS] = LAYOUT(
+ _______, _______, _______, KC_UP, KC_UP, _______, _______, _______,
+_______, _______, _______, _______, KC_LCTL, _______, _______, _______, _______, KC_LEFT, KC_HOME, KC_RGHT, KC_LEFT, KC_HOME, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, KC_DOWN, KC_DOWN, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______,
+ _______, _______,
+ _______, _______, _______, _______),
+[NAS] = LAYOUT(
+ KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN,
+_______, KC_1, KC_TILD, _______, KC_2, NLK, KC_LABK, KC_3, KC_RABK, KC_SLSH, KC_4, KC_5, KC_6, KC_7, KC_UNDS, KC_CIRC, KC_8, KC_ENT, KC_SCLN, KC_9, KC_BSLS, TK0, KC_0, TK1,
+ KC_EQL, KC_X, KC_PERC, KC_MINS, KC_PLUS, KC_DOT, KC_SLSH, KC_QUES,
+ _______, _______, _______, _______,
+ _______, _______,
+ _______, _______,
+ _______, _______, _______, _______),
+[NAS_NUMLOCK] = LAYOUT(
+ _______, _______, _______, _______, _______, KC_PAST, _______, _______,
+_______, KC_KP_1, _______, _______, KC_KP_2, _______, _______, KC_KP_3, _______, KC_PSLS, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_7, _______, _______, KC_KP_8, _______, _______, KC_KP_9, KC_PENT, _______, KC_KP_0, _______,
+ KC_PEQL, _______, _______, KC_PMNS, KC_PPLS, _______, KC_PDOT, _______,
+ _______, _______, _______, _______,
+ _______, _______,
+ _______, _______,
+ _______, _______, _______, _______),
+[NAS_TENKEY] = LAYOUT(
+ _______, _______, _______, KC_UP, KC_7, KC_8, KC_9, KC_ASTR,
+_______, KC_QUOT, _______, _______, KC_DLR, _______, _______, KC_AMPR, _______, KC_LEFT, KC_HOME, KC_RGHT, KC_0, KC_4, DZ, KC_PLUS, KC_5, KC_MINS, KC_EQL, KC_6, KC_ENT, _______, KC_DOT, _______,
+ KC_LPRN, KC_RPRN, _______, KC_DOWN, KC_1, KC_2, KC_3, KC_SLSH,
+ _______, _______, _______, _______,
+ _______, _______,
+ _______, _______,
+ _______, _______, _______, _______),
+[NAS_TENKEY_NUMLOCK] = LAYOUT(
+ _______, _______, _______, _______, KC_KP_7, KC_KP_8, KC_KP_9, KC_PAST,
+_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_KP_0, KC_KP_4, _______, KC_PPLS, KC_KP_5, KC_PMNS, KC_PEQL, KC_KP_6, KC_PENT, _______, KC_PDOT, _______,
+ _______, _______, _______, _______, KC_KP_1, KC_KP_2, KC_KP_3, KC_PSLS,
+ _______, _______, _______, _______,
+ _______, _______,
+ _______, _______,
+ _______, _______, _______, _______),
+};
+
+static void lock_led_set(bool on, uint8_t led) {
+ if (on) {
+ LED_LOCK_PORT &= ~led;
+ } else {
+ LED_LOCK_PORT |= led;
+ }
+}
+
+static void mode_led_set(uint8_t led) {
+ static const uint8_t ALL_MODE_LEDS = LED_FN | LED_NORMAL | LED_NAS | LED_TENKEY;
+ LED_MODE_PORT |= ALL_MODE_LEDS;
+ LED_MODE_PORT &= ~led;
+}
+
+static void layer_set(bool on, uint8_t layer) {
+ if (on) {
+ layer_on(layer);
+ } else {
+ layer_off(layer);
+ }
+
+ if (layer_state_is(NAS) || layer_state_is(NAS_NUMLOCK) || layer_state_is(NAS_TENKEY) || layer_state_is(NAS_TENKEY_NUMLOCK)) {
+ if (tenkey_enabled) {
+ mode_led_set(LED_NAS | LED_TENKEY);
+ } else {
+ mode_led_set(LED_NAS);
+ }
+ } else if (layer_state_is(FUNCTION_MOUSE) || layer_state_is(FUNCTION_ARROWS)) {
+ mode_led_set(LED_FN);
+ } else if (layer_state_is(NORMAL)) {
+ mode_led_set(LED_NORMAL);
+ }
+}
+
+static void set_normal(void) {
+ layer_move(NORMAL);
+
+#ifdef DATAHAND_THUMB_RETURN_COMMAND
+ layer_set(true, NORMAL_THUMB_RETURN_COMMAND);
+#endif
+
+ /* Then call layer_set to update LEDs. */
+ layer_set(true, NORMAL);
+}
+
+static void set_nas(bool on) {
+ /* Always turn on the base NAS layer so other layers can fall through. */
+ layer_set(on, NAS);
+
+ layer_set(on && numlock_enabled, NAS_NUMLOCK);
+ layer_set(on && tenkey_enabled, NAS_TENKEY);
+ layer_set(on && tenkey_enabled && numlock_enabled, NAS_TENKEY_NUMLOCK);
+}
+
+static void set_tenkey(bool on) {
+ tenkey_enabled = on;
+
+ /* We have to be on the NAS layer in order to be able to toggle TK.
+ * Re-toggle it on so that we move to the right layer (and set the right LED).
+ */
+ set_nas(true);
+}
+
+static void toggle_numlock(void) {
+ numlock_enabled = !numlock_enabled;
+ lock_led_set(numlock_enabled, LED_NUM_LOCK);
+
+ if (layer_state_is(NAS)) {
+ /* If we're already in NAS, re-set it so that we activate the numlock layer. */
+ set_nas(true);
+ }
+}
+
+static void set_function(void) {
+ /* Make sure to turn off NAS if we're entering function */
+ set_nas(false);
+
+ /* Always turn on the mouse layer so the arrow layer can fall through. */
+ layer_set(true, FUNCTION_MOUSE);
+ layer_set(!mouse_enabled, FUNCTION_ARROWS);
+}
+
+static void set_mouse_enabled(bool on) {
+ mouse_enabled = on;
+
+ /* Re-run set_function to set our layers correctly. */
+ set_function();
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ bool pressed = record->event.pressed;
+
+ switch(keycode) {
+ case N:
+ if (pressed) {
+ set_normal();
+ }
+ break;
+
+ case NS:
+ if (pressed) {
+ nas_locked = false;
+ }
+ set_nas(pressed);
+ break;
+
+ case NSL:
+ if (pressed) {
+ nas_locked = true;
+ set_nas(true);
+ }
+ break;
+
+ case NLK:
+ if (pressed) {
+ toggle_numlock();
+ SEND_STRING(SS_DOWN(X_NUMLOCK));
+ } else {
+ SEND_STRING(SS_UP(X_NUMLOCK));
+ }
+ break;
+
+ case FN:
+ if (pressed) {
+ set_function();
+ }
+ break;
+
+ case TK0:
+ if (pressed) {
+ set_tenkey(false);
+ }
+ break;
+
+ case TK1:
+ if (pressed) {
+ set_tenkey(true);
+ }
+ break;
+
+ case MS:
+ if (pressed) {
+ set_mouse_enabled(true);
+ }
+ break;
+
+ case AR:
+ if (pressed) {
+ set_mouse_enabled(false);
+ }
+ break;
+
+ case DZ:
+ if (pressed) {
+ SEND_STRING(SS_TAP(X_KP_0) SS_TAP(X_KP_0));
+ }
+ break;
+ }
+
+ return true;
+};
+
+void matrix_init_user(void) {
+#ifdef DATAHAND_THUMB_RETURN_COMMAND
+ set_normal();
+#endif
+}
+
+void matrix_scan_user(void) {
+
+}
+
+void led_set_user(uint8_t usb_led) {
+ lock_led_set(usb_led & (1<<USB_LED_NUM_LOCK), LED_NUM_LOCK);
+ lock_led_set(usb_led & (1<<USB_LED_CAPS_LOCK), LED_CAPS_LOCK);
+ lock_led_set(usb_led & (1<<USB_LED_SCROLL_LOCK), LED_SCROLL_LOCK);
+}
diff --git a/keyboards/handwired/datahand/matrix.c b/keyboards/handwired/datahand/matrix.c
new file mode 100644
index 0000000000..a08450d779
--- /dev/null
+++ b/keyboards/handwired/datahand/matrix.c
@@ -0,0 +1,125 @@
+/* Copyright 2017-2019 Nikolaus Wittenstein <nikolaus.wittenstein@gmail.com>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+ * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "datahand.h"
+
+#include "matrix.h"
+#include "action.h"
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <avr/io.h>
+
+static matrix_row_t matrix[MATRIX_ROWS];
+
+static matrix_row_t read_cols(void);
+static void select_row(uint8_t row);
+
+void matrix_init(void) {
+ /* See datahand.h for more detail on pins. */
+
+ /* 7 - matrix scan; 6-3 - mode LEDs */
+ DDRB = 0b11111000;
+
+ /* 1-0 - matrix scan */
+ DDRD = 0b00000011;
+
+ /* 6 - matrix scan */
+ DDRE = 0b01000000;
+
+ /* 7-4 - lock LEDs */
+ DDRF = 0b11110000;
+
+ /* Turn off the non-Normal LEDs (they're active low). */
+ PORTB |= LED_TENKEY | LED_FN | LED_NAS;
+
+ /* Turn off the lock LEDs. */
+ PORTF |= LED_CAPS_LOCK | LED_NUM_LOCK | LED_SCROLL_LOCK | LED_MOUSE_LOCK;
+
+ matrix_init_user();
+}
+
+uint8_t matrix_scan(void) {
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ select_row(row);
+ /* The default hardware works down to at least 100us, but I have a replacement
+ * photodiode that responds a little more slowly. Cranking it up to 1000us fixes
+ * shadowing issues.
+ */
+ _delay_us(1000);
+ matrix[row] = read_cols();
+ }
+
+ matrix_scan_user();
+
+ return 1;
+}
+
+matrix_row_t matrix_get_row(uint8_t row) {
+ return matrix[row];
+}
+
+void matrix_print(void) {
+ print("\nr/c 01234567\n");
+
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ phex(row);
+ print(": ");
+ print_bin_reverse8(matrix_get_row(row));
+ print("\n");
+ }
+}
+
+bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
+ return process_record_user(keycode, record);
+}
+
+static void select_row(uint8_t row) {
+ /* Original 8051: P1 bits 0-3 (pins 1-4)
+ * Teensy++: PE0, PB7, PD0, PD1
+ */
+
+ if (row & (1<<0)) {
+ PORTE |= (1<<6);
+ } else {
+ PORTE &= ~(1<<6);
+ }
+
+ if (row & (1<<1)) {
+ PORTB |= (1<<7);
+ } else {
+ PORTB &= ~(1<<7);
+ }
+
+ if (row & (1<<2)) {
+ PORTD |= (1<<0);
+ } else {
+ PORTD &= ~(1<<0);
+ }
+
+ if (row & (1<<3)) {
+ PORTD |= (1<<1);
+ } else {
+ PORTD &= ~(1<<1);
+ }
+}
+
+static matrix_row_t read_cols(void) {
+ /* Original 8051: P1 bits 4-7 (pins 5-8)
+ * Teensy++: PD bits 2-5
+ */
+
+ return (PIND & 0b00111100) >> 2;
+}
diff --git a/keyboards/handwired/datahand/readme.md b/keyboards/handwired/datahand/readme.md
new file mode 100644
index 0000000000..923cebb00e
--- /dev/null
+++ b/keyboards/handwired/datahand/readme.md
@@ -0,0 +1,15 @@
+# DataHand
+
+A keyboard designed to prevent RSI. See [Wikipedia](https://en.wikipedia.org/wiki/DataHand) and [this website](http://octopup.org/computer/datahand) for more info.
+
+To use this firmware, you have to replace the stock microcontroller with a Teensy++ 2.0. This is relatively easy and also reversible. See the notes at the bottom of datahand.h for more info.
+
+Keyboard Maintainer: [Nikolaus Wittenstein](https://github.com/adzenith)
+Hardware Supported: DataHand Personal or Pro II
+Hardware Availability: No longer in production
+
+Make example for this keyboard (after setting up your build environment):
+
+ make handwired/datahand:default
+
+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).
diff --git a/keyboards/handwired/datahand/rules.mk b/keyboards/handwired/datahand/rules.mk
new file mode 100644
index 0000000000..59f14e17a4
--- /dev/null
+++ b/keyboards/handwired/datahand/rules.mk
@@ -0,0 +1,59 @@
+# Project-specific includes
+SRC = matrix.c
+
+# MCU name
+MCU = at90usb1286
+
+# Processor frequency.
+# This will define a symbol, F_CPU, in all source code files equal to the
+# processor frequency in Hz. You can then use this symbol in your source code to
+# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+# automatically to create a 32-bit value in your source code.
+#
+# This will be an integer division of F_USB below, as it is sourced by
+# F_USB after it has run through any CPU prescalers. Note that this value
+# does not *change* the processor frequency - it should merely be updated to
+# reflect the processor speed set externally so that the code can use accurate
+# software delays.
+F_CPU = 16000000
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+# This will define a symbol, F_USB, in all source code files equal to the
+# input clock frequency (before any prescaling is performed) in Hz. This value may
+# differ from F_CPU if prescaling is used on the latter, and is required as the
+# raw input clock is fed directly to the PLL sections of the AVR for high speed
+# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+# at the end, this will be done automatically to create a 32-bit value in your
+# source code.
+#
+# If no clock division is performed on the input clock inside the AVR (via the
+# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+BOOTLOADER = halfkay
+
+# Build Options
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
+CONSOLE_ENABLE = yes # Console for debug(+400)
+COMMAND_ENABLE = yes # Commands for debug and configuration
+NKRO_ENABLE = yes # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default
+MIDI_ENABLE = no # MIDI controls
+UNICODE_ENABLE = no # Unicode
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+CUSTOM_MATRIX = yes # We definitely have a nonstandard matrix
+
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
diff --git a/keyboards/handwired/downbubble/config.h b/keyboards/handwired/downbubble/config.h
new file mode 100644
index 0000000000..0da13a4b15
--- /dev/null
+++ b/keyboards/handwired/downbubble/config.h
@@ -0,0 +1,245 @@
+/*
+Copyright 2018 Don Chiou
+
+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
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x0000
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Flehrad
+#define PRODUCT downbubble
+#define DESCRIPTION An Ergonomic Centered Numpad Keyboard
+
+/* key matrix size */
+#define MATRIX_ROWS 6
+#define MATRIX_COLS 20
+
+/*
+ * Keyboard Matrix Assignments
+ *
+ * Change this to how you wired your keyboard
+ * COLS: AVR pins used for columns, left to right
+ * ROWS: AVR pins used for rows, top to bottom
+ * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
+ * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
+ *
+*/
+#define MATRIX_ROW_PINS { F1, F2, F3, F4, F5, F6 }
+#define MATRIX_COL_PINS { F7, C7, C6, C5, C4, C3, C2, C1, C0, E1, E0, D7, D6, D5, D4, D3, D2, D1, D0, B7 }
+#define UNUSED_PINS
+
+/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */
+#define DIODE_DIRECTION COL2ROW
+
+/*
+ * Split Keyboard specific options, make sure you have 'SPLIT_KEYBOARD = yes' in your rules.mk, and define SOFT_SERIAL_PIN.
+ */
+//#define SOFT_SERIAL_PIN D0 // or D1, D2, D3, E6
+
+// #define BACKLIGHT_PIN B7
+// #define BACKLIGHT_BREATHING
+// #define BACKLIGHT_LEVELS 3
+
+// #define RGB_DI_PIN E2
+// #ifdef RGB_DI_PIN
+// #define RGBLED_NUM 16
+// #define RGBLIGHT_HUE_STEP 8
+// #define RGBLIGHT_SAT_STEP 8
+// #define RGBLIGHT_VAL_STEP 8
+// #define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */
+// #define RGBLIGHT_SLEEP /* If defined, the RGB lighting will be switched off when the host goes to sleep */
+// /*== all animations enable ==*/
+// #define RGBLIGHT_ANIMATIONS
+// /*== or choose animations ==*/
+// #define RGBLIGHT_EFFECT_BREATHING
+// #define RGBLIGHT_EFFECT_RAINBOW_MOOD
+// #define RGBLIGHT_EFFECT_RAINBOW_SWIRL
+// #define RGBLIGHT_EFFECT_SNAKE
+// #define RGBLIGHT_EFFECT_KNIGHT
+// #define RGBLIGHT_EFFECT_CHRISTMAS
+// #define RGBLIGHT_EFFECT_STATIC_GRADIENT
+// #define RGBLIGHT_EFFECT_RGB_TEST
+// #define RGBLIGHT_EFFECT_ALTERNATING
+// #endif
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCING_DELAY 5
+
+/* define if matrix has ghost (lacks anti-ghosting diodes) */
+//#define MATRIX_HAS_GHOST
+
+/* number of backlight levels */
+
+/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
+#define LOCKING_SUPPORT_ENABLE
+/* Locking resynchronize hack */
+#define LOCKING_RESYNC_ENABLE
+
+/* If defined, GRAVE_ESC will always act as ESC when CTRL is held.
+ * This is userful for the Windows task manager shortcut (ctrl+shift+esc).
+ */
+// #define GRAVE_ESC_CTRL_OVERRIDE
+
+/*
+ * Force NKRO
+ *
+ * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
+ * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
+ * makefile for this to work.)
+ *
+ * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
+ * until the next keyboard reset.
+ *
+ * NKRO may prevent your keystrokes from being detected in the BIOS, but it is
+ * fully operational during normal computer usage.
+ *
+ * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
+ * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
+ * bootmagic, NKRO mode will always be enabled until it is toggled again during a
+ * power-up.
+ *
+ */
+//#define FORCE_NKRO
+
+/*
+ * Magic Key Options
+ *
+ * Magic keys are hotkey commands that allow control over firmware functions of
+ * the keyboard. They are best used in combination with the HID Listen program,
+ * found here: https://www.pjrc.com/teensy/hid_listen.html
+ *
+ * The options below allow the magic key functionality to be changed. This is
+ * useful if your keyboard/keypad is missing keys and you want magic key support.
+ *
+ */
+
+/* key combination for magic key command */
+#define IS_COMMAND() ( \
+ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
+)
+
+/* control how magic key switches layers */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
+
+/* override magic key keymap */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
+//#define MAGIC_KEY_HELP1 H
+//#define MAGIC_KEY_HELP2 SLASH
+//#define MAGIC_KEY_DEBUG D
+//#define MAGIC_KEY_DEBUG_MATRIX X
+//#define MAGIC_KEY_DEBUG_KBD K
+//#define MAGIC_KEY_DEBUG_MOUSE M
+//#define MAGIC_KEY_VERSION V
+//#define MAGIC_KEY_STATUS S
+//#define MAGIC_KEY_CONSOLE C
+//#define MAGIC_KEY_LAYER0_ALT1 ESC
+//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
+//#define MAGIC_KEY_LAYER0 0
+//#define MAGIC_KEY_LAYER1 1
+//#define MAGIC_KEY_LAYER2 2
+//#define MAGIC_KEY_LAYER3 3
+//#define MAGIC_KEY_LAYER4 4
+//#define MAGIC_KEY_LAYER5 5
+//#define MAGIC_KEY_LAYER6 6
+//#define MAGIC_KEY_LAYER7 7
+//#define MAGIC_KEY_LAYER8 8
+//#define MAGIC_KEY_LAYER9 9
+//#define MAGIC_KEY_BOOTLOADER PAUSE
+//#define MAGIC_KEY_LOCK CAPS
+//#define MAGIC_KEY_EEPROM E
+//#define MAGIC_KEY_NKRO N
+//#define MAGIC_KEY_SLEEP_LED Z
+
+/*
+ * Feature disable options
+ * These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+//#define NO_DEBUG
+
+/* disable print */
+//#define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+
+/*
+ * MIDI options
+ */
+
+/* Prevent use of disabled MIDI features in the keymap */
+//#define MIDI_ENABLE_STRICT 1
+
+/* enable basic MIDI features:
+ - MIDI notes can be sent when in Music mode is on
+*/
+//#define MIDI_BASIC
+
+/* enable advanced MIDI features:
+ - MIDI notes can be added to the keymap
+ - Octave shift and transpose
+ - Virtual sustain, portamento, and modulation wheel
+ - etc.
+*/
+//#define MIDI_ADVANCED
+
+/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
+//#define MIDI_TONE_KEYCODE_OCTAVES 1
+
+/*
+ * HD44780 LCD Display Configuration
+ */
+/*
+#define LCD_LINES 2 //< number of visible lines of the display
+#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display
+
+#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode
+
+#if LCD_IO_MODE
+#define LCD_PORT PORTB //< port for the LCD lines
+#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0
+#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1
+#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2
+#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3
+#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0
+#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1
+#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2
+#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3
+#define LCD_RS_PORT LCD_PORT //< port for RS line
+#define LCD_RS_PIN 3 //< pin for RS line
+#define LCD_RW_PORT LCD_PORT //< port for RW line
+#define LCD_RW_PIN 2 //< pin for RW line
+#define LCD_E_PORT LCD_PORT //< port for Enable line
+#define LCD_E_PIN 1 //< pin for Enable line
+#endif
+*/
+
+/* Bootmagic Lite key configuration */
+// #define BOOTMAGIC_LITE_ROW 0
+// #define BOOTMAGIC_LITE_COLUMN 0
diff --git a/keyboards/handwired/downbubble/downbubble.c b/keyboards/handwired/downbubble/downbubble.c
new file mode 100644
index 0000000000..48be8e4998
--- /dev/null
+++ b/keyboards/handwired/downbubble/downbubble.c
@@ -0,0 +1,16 @@
+/* Copyright 2018 REPLACE_WITH_YOUR_NAME
+ *
+ * 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 "downbubble.h"
diff --git a/keyboards/handwired/downbubble/downbubble.h b/keyboards/handwired/downbubble/downbubble.h
new file mode 100644
index 0000000000..0df39dd9ee
--- /dev/null
+++ b/keyboards/handwired/downbubble/downbubble.h
@@ -0,0 +1,111 @@
+/* Copyright 2018 REPLACE_WITH_YOUR_NAME
+ *
+ * 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
+
+#include "quantum.h"
+
+/* This a shortcut to help you visually see your layout.
+ *
+ * The first section contains all of the arguments representing the physical
+ * layout of the board and position of the keys.
+ *
+ * The second converts the arguments into a two-dimensional array which
+ * represents the switch matrix.
+ */
+#define LAYOUT_standard( \
+ K00, K01, K02, K03, K04, K05, K06, K010, K011, K012, K013, K014, K015, K016, K017, K018, K019,\
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, K113, K114, K115, K116, K118, K119,\
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K210, K211, K212, K213, K214, K215, K216, K217, K218, K219,\
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K29, K310, K311, K312, K313, K314, K315, K317, \
+ K40, K41, K42, K43, K44, K45, K46, K47, K48, K410, K411, K412, K413, K414, K416, K418, \
+ K50, K51, K52, K53, K54, K56, K58, K49, K510, K512, K513, K514, K516, K517, K518, K519 \
+) \
+{ \
+ { K00, K01, K02, K03, K04, K05, K06, KC_NO, KC_NO, KC_NO, K010, K011, K012, K013, K014, K015, K016, K017, K018, K019 }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, K113, K114, K115, K116, KC_NO, K118, K119 }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, K212, K213, K214, K215, K216, K217, K218, K219 }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37, K38, KC_NO, K310, K311, K312, K313, K314, K315, KC_NO, K317, KC_NO, KC_NO }, \
+ { K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K410, K411, K412, K413, K414, KC_NO, K416, KC_NO, K418, KC_NO }, \
+ { K50, K51, K52, K53, K54, KC_NO, K56, KC_NO, K58, KC_NO, K510, KC_NO, K512, K513, K514, KC_NO, K516, K517, K518, K519 }, \
+ }
+
+#define LAYOUT_split_bs( \
+ K00, K01, K02, K03, K04, K05, K06, K010, K011, K012, K013, K014, K015, K016, K017, K018, K019,\
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, K113, K114, K115, K116, K117, K118, K119,\
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K210, K211, K212, K213, K214, K215, K216, K217, K218, K219,\
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K29, K310, K311, K312, K313, K314, K315, K317, \
+ K40, K41, K42, K43, K44, K45, K46, K47, K48, K410, K411, K412, K413, K414, K416, K418, \
+ K50, K51, K52, K53, K54, K56, K58, K49, K510, K512, K513, K514, K516, K517, K518, K519 \
+) \
+{ \
+ { K00, K01, K02, K03, K04, K05, K06, KC_NO, KC_NO, KC_NO, K010, K011, K012, K013, K014, K015, K016, K017, K018, K019 }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, K113, K114, K115, K116, K117, K118, K119 }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, K212, K213, K214, K215, K216, K217, K218, K219 }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37, K38, KC_NO, K310, K311, K312, K313, K314, K315, KC_NO, K317, KC_NO, KC_NO }, \
+ { K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K410, K411, K412, K413, K414, KC_NO, K416, KC_NO, K418, KC_NO }, \
+ { K50, K51, K52, K53, K54, KC_NO, K56, KC_NO, K58, KC_NO, K510, KC_NO, K512, K513, K514, KC_NO, K516, K517, K518, K519 }, \
+ }
+
+#define LAYOUT_split_rshift( \
+ K00, K01, K02, K03, K04, K05, K06, K010, K011, K012, K013, K014, K015, K016, K017, K018, K019,\
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, K113, K114, K115, K116, K118, K119,\
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K210, K211, K212, K213, K214, K215, K216, K217, K218, K219,\
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K29, K310, K311, K312, K313, K314, K315, K317, \
+ K40, K41, K42, K43, K44, K45, K46, K47, K48, K410, K411, K412, K413, K414, K416, K417, K418, \
+ K50, K51, K52, K53, K54, K56, K58, K49, K510, K512, K513, K514, K516, K517, K518, K519 \
+) \
+{ \
+ { K00, K01, K02, K03, K04, K05, K06, KC_NO, KC_NO, KC_NO, K010, K011, K012, K013, K014, K015, K016, K017, K018, K019 }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, K113, K114, K115, K116, KC_NO, K118, K119 }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, K212, K213, K214, K215, K216, K217, K218, K219 }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37, K38, KC_NO, K310, K311, K312, K313, K314, K315, KC_NO, K317, KC_NO, KC_NO }, \
+ { K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K410, K411, K412, K413, K414, KC_NO, K416, K417, K418, KC_NO }, \
+ { K50, K51, K52, K53, K54, KC_NO, K56, KC_NO, K58, KC_NO, K510, KC_NO, K512, K513, K514, KC_NO, K516, K517, K518, K519 }, \
+ }
+
+#define LAYOUT_split_numpad( \
+ K00, K01, K02, K03, K04, K05, K06, K010, K011, K012, K013, K014, K015, K016, K017, K018, K019,\
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, K113, K114, K115, K116, K118, K119,\
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, K212, K213, K214, K215, K216, K217, K218, K219,\
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K310, K311, K312, K313, K314, K315, K317, \
+ K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K410, K411, K412, K413, K414, K416, K418, \
+ K50, K51, K52, K53, K54, K56, K57, K58, K59, K510, K512, K513, K514, K516, K517, K518, K519 \
+) \
+{ \
+ { K00, K01, K02, K03, K04, K05, K06, KC_NO, KC_NO, KC_NO, K010, K011, K012, K013, K014, K015, K016, K017, K018, K019 }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, K113, K114, K115, K116, KC_NO, K118, K119 }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, K212, K213, K214, K215, K216, K217, K218, K219 }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K310, K311, K312, K313, K314, K315, KC_NO, K317, KC_NO, KC_NO }, \
+ { K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K410, K411, K412, K413, K414, KC_NO, K416, KC_NO, K418, KC_NO }, \
+ { K50, K51, K52, K53, K54, KC_NO, K56, K57, K58, K59, K510, KC_NO, K512, K513, K514, KC_NO, K516, K517, K518, K519 }, \
+ }
+
+#define LAYOUT_all( \
+ K00, K01, K02, K03, K04, K05, K06, K010, K011, K012, K013, K014, K015, K016, K017, K018, K019,\
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, K113, K114, K115, K116, K117, K118, K119,\
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, K212, K213, K214, K215, K216, K217, K218, K219,\
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K310, K311, K312, K313, K314, K315, K317, \
+ K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K410, K411, K412, K413, K414, K416, K417, K418, \
+ K50, K51, K52, K53, K54, K56, K57, K58, K59, K510, K512, K513, K514, K516, K517, K518, K519 \
+) \
+{ \
+ { K00, K01, K02, K03, K04, K05, K06, KC_NO, KC_NO, KC_NO, K010, K011, K012, K013, K014, K015, K016, K017, K018, K019 }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, K113, K114, K115, K116, K117, K118, K119 }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, K212, K213, K214, K215, K216, K217, K218, K219 }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K310, K311, K312, K313, K314, K315, KC_NO, K317, KC_NO, KC_NO }, \
+ { K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K410, K411, K412, K413, K414, KC_NO, K416, K417, K418, KC_NO }, \
+ { K50, K51, K52, K53, K54, KC_NO, K56, K57, K58, K59, K510, KC_NO, K512, K513, K514, KC_NO, K516, K517, K518, K519 }, \
+ }
diff --git a/keyboards/handwired/downbubble/info.json b/keyboards/handwired/downbubble/info.json
new file mode 100644
index 0000000000..c5cd97de54
--- /dev/null
+++ b/keyboards/handwired/downbubble/info.json
@@ -0,0 +1,559 @@
+{
+ "keyboard_name": "downbubble",
+ "url": "",
+ "maintainer": "flehrad",
+ "width": 22.75,
+ "height": 6,
+ "layouts": {
+ "LAYOUT_standard": {
+ "layout": [
+ {"label":"K00", "x":0, "y":0},
+ {"label":"K01", "x":1, "y":0},
+ {"label":"K02", "x":2, "y":0},
+ {"label":"K03", "x":3, "y":0},
+ {"label":"K04", "x":4, "y":0},
+ {"label":"K05", "x":5, "y":0},
+ {"label":"K06", "x":6, "y":0},
+ {"label":"K010", "x":12.75, "y":0},
+ {"label":"K011", "x":13.75, "y":0},
+ {"label":"K012", "x":14.75, "y":0},
+ {"label":"K013", "x":15.75, "y":0},
+ {"label":"K014", "x":16.75, "y":0},
+ {"label":"K015", "x":17.75, "y":0},
+ {"label":"K016", "x":18.75, "y":0},
+ {"label":"K017", "x":19.75, "y":0},
+ {"label":"K018", "x":20.75, "y":0},
+ {"label":"K019", "x":21.75, "y":0},
+ {"label":"K10", "x":0, "y":1},
+ {"label":"K11", "x":1, "y":1},
+ {"label":"K12", "x":2, "y":1},
+ {"label":"K13", "x":3, "y":1},
+ {"label":"K14", "x":4, "y":1},
+ {"label":"K15", "x":5, "y":1},
+ {"label":"K16", "x":6, "y":1},
+ {"label":"K17", "x":8.75, "y":1},
+ {"label":"K18", "x":9.75, "y":1},
+ {"label":"K19", "x":10.75, "y":1},
+ {"label":"K110", "x":12.75, "y":1},
+ {"label":"K111", "x":13.75, "y":1},
+ {"label":"K112", "x":14.75, "y":1},
+ {"label":"K113", "x":15.75, "y":1},
+ {"label":"K114", "x":16.75, "y":1},
+ {"label":"K115", "x":17.75, "y":1},
+ {"label":"K116", "x":18.75, "y":1, "w":2},
+ {"label":"K118", "x":20.75, "y":1},
+ {"label":"K119", "x":21.75, "y":1},
+ {"label":"K20", "x":0, "y":2, "w":1.5},
+ {"label":"K21", "x":1.5, "y":2},
+ {"label":"K22", "x":2.5, "y":2},
+ {"label":"K23", "x":3.5, "y":2},
+ {"label":"K24", "x":4.5, "y":2},
+ {"label":"K25", "x":5.5, "y":2},
+ {"label":"K26", "x":7.75, "y":2},
+ {"label":"K17", "x":8.75, "y":2},
+ {"label":"K28", "x":9.75, "y":2},
+ {"label":"K210", "x":12.25, "y":2},
+ {"label":"K211", "x":13.25, "y":2},
+ {"label":"K212", "x":14.25, "y":2},
+ {"label":"K213", "x":15.25, "y":2},
+ {"label":"K214", "x":16.25, "y":2},
+ {"label":"K215", "x":17.25, "y":2},
+ {"label":"K216", "x":18.25, "y":2},
+ {"label":"K217", "x":19.25, "y":2, "w":1.5},
+ {"label":"K218", "x":20.75, "y":2},
+ {"label":"K219", "x":21.75, "y":2},
+ {"label":"K30", "x":0, "y":3, "w":1.75},
+ {"label":"K31", "x":1.75, "y":3},
+ {"label":"K32", "x":2.75, "y":3},
+ {"label":"K33", "x":3.75, "y":3},
+ {"label":"K34", "x":4.75, "y":3},
+ {"label":"K35", "x":5.75, "y":3},
+ {"label":"K36", "x":7.75, "y":3},
+ {"label":"K37", "x":8.75, "y":3},
+ {"label":"K38", "x":9.75, "y":3},
+ {"label":"K29", "x":10.75, "y":2, "h":2},
+ {"label":"K310", "x":12.5, "y":3},
+ {"label":"K311", "x":13.5, "y":3},
+ {"label":"K312", "x":14.5, "y":3},
+ {"label":"K313", "x":15.5, "y":3},
+ {"label":"K314", "x":16.5, "y":3},
+ {"label":"K315", "x":17.5, "y":3},
+ {"label":"K317", "x":18.5, "y":3, "w":2.25},
+ {"label":"K40", "x":0, "y":4, "w":2.25},
+ {"label":"K41", "x":2.25, "y":4},
+ {"label":"K42", "x":3.25, "y":4},
+ {"label":"K43", "x":4.25, "y":4},
+ {"label":"K44", "x":5.25, "y":4},
+ {"label":"K45", "x":6.25, "y":4},
+ {"label":"K46", "x":7.75, "y":4},
+ {"label":"K47", "x":8.75, "y":4},
+ {"label":"K48", "x":9.75, "y":4},
+ {"label":"K410", "x":13, "y":4},
+ {"label":"K411", "x":14, "y":4},
+ {"label":"K412", "x":15, "y":4},
+ {"label":"K413", "x":16, "y":4},
+ {"label":"K414", "x":17, "y":4},
+ {"label":"K416", "x":18, "y":4, "w":2.75},
+ {"label":"K418", "x":20.75, "y":4},
+ {"label":"K50", "x":0, "y":5, "w":1.25},
+ {"label":"K51", "x":1.25, "y":5, "w":1.25},
+ {"label":"K52", "x":2.5, "y":5, "w":1.25},
+ {"label":"K53", "x":3.75, "y":5, "w":1.25},
+ {"label":"K54", "x":5, "y":5, "w":2.25},
+ {"label":"K56", "x":7.75, "y":5, "w":2},
+ {"label":"K58", "x":9.75, "y":5},
+ {"label":"K49", "x":10.75, "y":4, "h":2},
+ {"label":"K510", "x":13, "y":5, "w":2},
+ {"label":"K512", "x":15, "y":5, "w":1.25},
+ {"label":"K513", "x":16.25, "y":5, "w":1.25},
+ {"label":"K514", "x":17.5, "y":5, "w":1.25},
+ {"label":"K516", "x":18.75, "y":5},
+ {"label":"K517", "x":19.75, "y":5},
+ {"label":"K518", "x":20.75, "y":5},
+ {"label":"K519", "x":21.75, "y":5}
+ ]
+ },
+ "LAYOUT_split_bs": {
+ "layout": [
+ {"label":"K00", "x":0, "y":0},
+ {"label":"K01", "x":1, "y":0},
+ {"label":"K02", "x":2, "y":0},
+ {"label":"K03", "x":3, "y":0},
+ {"label":"K04", "x":4, "y":0},
+ {"label":"K05", "x":5, "y":0},
+ {"label":"K06", "x":6, "y":0},
+ {"label":"K010", "x":12.75, "y":0},
+ {"label":"K011", "x":13.75, "y":0},
+ {"label":"K012", "x":14.75, "y":0},
+ {"label":"K013", "x":15.75, "y":0},
+ {"label":"K014", "x":16.75, "y":0},
+ {"label":"K015", "x":17.75, "y":0},
+ {"label":"K016", "x":18.75, "y":0},
+ {"label":"K017", "x":19.75, "y":0},
+ {"label":"K018", "x":20.75, "y":0},
+ {"label":"K019", "x":21.75, "y":0},
+ {"label":"K10", "x":0, "y":1},
+ {"label":"K11", "x":1, "y":1},
+ {"label":"K12", "x":2, "y":1},
+ {"label":"K13", "x":3, "y":1},
+ {"label":"K14", "x":4, "y":1},
+ {"label":"K15", "x":5, "y":1},
+ {"label":"K16", "x":6, "y":1},
+ {"label":"K17", "x":8.75, "y":1},
+ {"label":"K18", "x":9.75, "y":1},
+ {"label":"K19", "x":10.75, "y":1},
+ {"label":"K110", "x":12.75, "y":1},
+ {"label":"K111", "x":13.75, "y":1},
+ {"label":"K112", "x":14.75, "y":1},
+ {"label":"K113", "x":15.75, "y":1},
+ {"label":"K114", "x":16.75, "y":1},
+ {"label":"K115", "x":17.75, "y":1},
+ {"label":"K116", "x":18.75, "y":1},
+ {"label":"K117", "x":19.75, "y":1},
+ {"label":"K118", "x":20.75, "y":1},
+ {"label":"K119", "x":21.75, "y":1},
+ {"label":"K20", "x":0, "y":2, "w":1.5},
+ {"label":"K21", "x":1.5, "y":2},
+ {"label":"K22", "x":2.5, "y":2},
+ {"label":"K23", "x":3.5, "y":2},
+ {"label":"K24", "x":4.5, "y":2},
+ {"label":"K25", "x":5.5, "y":2},
+ {"label":"K26", "x":7.75, "y":2},
+ {"label":"K17", "x":8.75, "y":2},
+ {"label":"K28", "x":9.75, "y":2},
+ {"label":"K210", "x":12.25, "y":2},
+ {"label":"K211", "x":13.25, "y":2},
+ {"label":"K212", "x":14.25, "y":2},
+ {"label":"K213", "x":15.25, "y":2},
+ {"label":"K214", "x":16.25, "y":2},
+ {"label":"K215", "x":17.25, "y":2},
+ {"label":"K216", "x":18.25, "y":2},
+ {"label":"K217", "x":19.25, "y":2, "w":1.5},
+ {"label":"K218", "x":20.75, "y":2},
+ {"label":"K219", "x":21.75, "y":2},
+ {"label":"K30", "x":0, "y":3, "w":1.75},
+ {"label":"K31", "x":1.75, "y":3},
+ {"label":"K32", "x":2.75, "y":3},
+ {"label":"K33", "x":3.75, "y":3},
+ {"label":"K34", "x":4.75, "y":3},
+ {"label":"K35", "x":5.75, "y":3},
+ {"label":"K36", "x":7.75, "y":3},
+ {"label":"K37", "x":8.75, "y":3},
+ {"label":"K38", "x":9.75, "y":3},
+ {"label":"K29", "x":10.75, "y":2, "h":2},
+ {"label":"K310", "x":12.5, "y":3},
+ {"label":"K311", "x":13.5, "y":3},
+ {"label":"K312", "x":14.5, "y":3},
+ {"label":"K313", "x":15.5, "y":3},
+ {"label":"K314", "x":16.5, "y":3},
+ {"label":"K315", "x":17.5, "y":3},
+ {"label":"K317", "x":18.5, "y":3, "w":2.25},
+ {"label":"K40", "x":0, "y":4, "w":2.25},
+ {"label":"K41", "x":2.25, "y":4},
+ {"label":"K42", "x":3.25, "y":4},
+ {"label":"K43", "x":4.25, "y":4},
+ {"label":"K44", "x":5.25, "y":4},
+ {"label":"K45", "x":6.25, "y":4},
+ {"label":"K46", "x":7.75, "y":4},
+ {"label":"K47", "x":8.75, "y":4},
+ {"label":"K48", "x":9.75, "y":4},
+ {"label":"K410", "x":13, "y":4},
+ {"label":"K411", "x":14, "y":4},
+ {"label":"K412", "x":15, "y":4},
+ {"label":"K413", "x":16, "y":4},
+ {"label":"K414", "x":17, "y":4},
+ {"label":"K416", "x":18, "y":4, "w":2.75},
+ {"label":"K418", "x":20.75, "y":4},
+ {"label":"K50", "x":0, "y":5, "w":1.25},
+ {"label":"K51", "x":1.25, "y":5, "w":1.25},
+ {"label":"K52", "x":2.5, "y":5, "w":1.25},
+ {"label":"K53", "x":3.75, "y":5, "w":1.25},
+ {"label":"K54", "x":5, "y":5, "w":2.25},
+ {"label":"K56", "x":7.75, "y":5, "w":2},
+ {"label":"K58", "x":9.75, "y":5},
+ {"label":"K49", "x":10.75, "y":4, "h":2},
+ {"label":"K510", "x":13, "y":5, "w":2},
+ {"label":"K512", "x":15, "y":5, "w":1.25},
+ {"label":"K513", "x":16.25, "y":5, "w":1.25},
+ {"label":"K514", "x":17.5, "y":5, "w":1.25},
+ {"label":"K516", "x":18.75, "y":5},
+ {"label":"K517", "x":19.75, "y":5},
+ {"label":"K518", "x":20.75, "y":5},
+ {"label":"K519", "x":21.75, "y":5}
+ ]
+ },
+ "LAYOUT_split_rshift": {
+ "layout": [
+ {"label":"K00", "x":0, "y":0},
+ {"label":"K01", "x":1, "y":0},
+ {"label":"K02", "x":2, "y":0},
+ {"label":"K03", "x":3, "y":0},
+ {"label":"K04", "x":4, "y":0},
+ {"label":"K05", "x":5, "y":0},
+ {"label":"K06", "x":6, "y":0},
+ {"label":"K010", "x":12.75, "y":0},
+ {"label":"K011", "x":13.75, "y":0},
+ {"label":"K012", "x":14.75, "y":0},
+ {"label":"K013", "x":15.75, "y":0},
+ {"label":"K014", "x":16.75, "y":0},
+ {"label":"K015", "x":17.75, "y":0},
+ {"label":"K016", "x":18.75, "y":0},
+ {"label":"K017", "x":19.75, "y":0},
+ {"label":"K018", "x":20.75, "y":0},
+ {"label":"K019", "x":21.75, "y":0},
+ {"label":"K10", "x":0, "y":1},
+ {"label":"K11", "x":1, "y":1},
+ {"label":"K12", "x":2, "y":1},
+ {"label":"K13", "x":3, "y":1},
+ {"label":"K14", "x":4, "y":1},
+ {"label":"K15", "x":5, "y":1},
+ {"label":"K16", "x":6, "y":1},
+ {"label":"K17", "x":8.75, "y":1},
+ {"label":"K18", "x":9.75, "y":1},
+ {"label":"K19", "x":10.75, "y":1},
+ {"label":"K110", "x":12.75, "y":1},
+ {"label":"K111", "x":13.75, "y":1},
+ {"label":"K112", "x":14.75, "y":1},
+ {"label":"K113", "x":15.75, "y":1},
+ {"label":"K114", "x":16.75, "y":1},
+ {"label":"K115", "x":17.75, "y":1},
+ {"label":"K116", "x":18.75, "y":1, "w":2},
+ {"label":"K118", "x":20.75, "y":1},
+ {"label":"K119", "x":21.75, "y":1},
+ {"label":"K20", "x":0, "y":2, "w":1.5},
+ {"label":"K21", "x":1.5, "y":2},
+ {"label":"K22", "x":2.5, "y":2},
+ {"label":"K23", "x":3.5, "y":2},
+ {"label":"K24", "x":4.5, "y":2},
+ {"label":"K25", "x":5.5, "y":2},
+ {"label":"K26", "x":7.75, "y":2},
+ {"label":"K17", "x":8.75, "y":2},
+ {"label":"K28", "x":9.75, "y":2},
+ {"label":"K210", "x":12.25, "y":2},
+ {"label":"K211", "x":13.25, "y":2},
+ {"label":"K212", "x":14.25, "y":2},
+ {"label":"K213", "x":15.25, "y":2},
+ {"label":"K214", "x":16.25, "y":2},
+ {"label":"K215", "x":17.25, "y":2},
+ {"label":"K216", "x":18.25, "y":2},
+ {"label":"K217", "x":19.25, "y":2, "w":1.5},
+ {"label":"K218", "x":20.75, "y":2},
+ {"label":"K219", "x":21.75, "y":2},
+ {"label":"K30", "x":0, "y":3, "w":1.75},
+ {"label":"K31", "x":1.75, "y":3},
+ {"label":"K32", "x":2.75, "y":3},
+ {"label":"K33", "x":3.75, "y":3},
+ {"label":"K34", "x":4.75, "y":3},
+ {"label":"K35", "x":5.75, "y":3},
+ {"label":"K36", "x":7.75, "y":3},
+ {"label":"K37", "x":8.75, "y":3},
+ {"label":"K38", "x":9.75, "y":3},
+ {"label":"K29", "x":10.75, "y":2, "h":2},
+ {"label":"K310", "x":12.5, "y":3},
+ {"label":"K311", "x":13.5, "y":3},
+ {"label":"K312", "x":14.5, "y":3},
+ {"label":"K313", "x":15.5, "y":3},
+ {"label":"K314", "x":16.5, "y":3},
+ {"label":"K315", "x":17.5, "y":3},
+ {"label":"K317", "x":18.5, "y":3, "w":2.25},
+ {"label":"K40", "x":0, "y":4, "w":2.25},
+ {"label":"K41", "x":2.25, "y":4},
+ {"label":"K42", "x":3.25, "y":4},
+ {"label":"K43", "x":4.25, "y":4},
+ {"label":"K44", "x":5.25, "y":4},
+ {"label":"K45", "x":6.25, "y":4},
+ {"label":"K46", "x":7.75, "y":4},
+ {"label":"K47", "x":8.75, "y":4},
+ {"label":"K48", "x":9.75, "y":4},
+ {"label":"K410", "x":13, "y":4},
+ {"label":"K411", "x":14, "y":4},
+ {"label":"K412", "x":15, "y":4},
+ {"label":"K413", "x":16, "y":4},
+ {"label":"K414", "x":17, "y":4},
+ {"label":"K416", "x":18, "y":4, "w":1.75},
+ {"label":"K417", "x":19.75, "y":4},
+ {"label":"K418", "x":20.75, "y":4},
+ {"label":"K50", "x":0, "y":5, "w":1.25},
+ {"label":"K51", "x":1.25, "y":5, "w":1.25},
+ {"label":"K52", "x":2.5, "y":5, "w":1.25},
+ {"label":"K53", "x":3.75, "y":5, "w":1.25},
+ {"label":"K54", "x":5, "y":5, "w":2.25},
+ {"label":"K56", "x":7.75, "y":5, "w":2},
+ {"label":"K58", "x":9.75, "y":5},
+ {"label":"K49", "x":10.75, "y":4, "h":2},
+ {"label":"K510", "x":13, "y":5, "w":2},
+ {"label":"K512", "x":15, "y":5, "w":1.25},
+ {"label":"K513", "x":16.25, "y":5, "w":1.25},
+ {"label":"K514", "x":17.5, "y":5, "w":1.25},
+ {"label":"K516", "x":18.75, "y":5},
+ {"label":"K517", "x":19.75, "y":5},
+ {"label":"K518", "x":20.75, "y":5},
+ {"label":"K519", "x":21.75, "y":5}
+ ]
+ },
+ "LAYOUT_split_numpad": {
+ "layout": [
+ {"label":"K00", "x":0, "y":0},
+ {"label":"K01", "x":1, "y":0},
+ {"label":"K02", "x":2, "y":0},
+ {"label":"K03", "x":3, "y":0},
+ {"label":"K04", "x":4, "y":0},
+ {"label":"K05", "x":5, "y":0},
+ {"label":"K06", "x":6, "y":0},
+ {"label":"K010", "x":12.75, "y":0},
+ {"label":"K011", "x":13.75, "y":0},
+ {"label":"K012", "x":14.75, "y":0},
+ {"label":"K013", "x":15.75, "y":0},
+ {"label":"K014", "x":16.75, "y":0},
+ {"label":"K015", "x":17.75, "y":0},
+ {"label":"K016", "x":18.75, "y":0},
+ {"label":"K017", "x":19.75, "y":0},
+ {"label":"K018", "x":20.75, "y":0},
+ {"label":"K019", "x":21.75, "y":0},
+ {"label":"K10", "x":0, "y":1},
+ {"label":"K11", "x":1, "y":1},
+ {"label":"K12", "x":2, "y":1},
+ {"label":"K13", "x":3, "y":1},
+ {"label":"K14", "x":4, "y":1},
+ {"label":"K15", "x":5, "y":1},
+ {"label":"K16", "x":6, "y":1},
+ {"label":"K17", "x":8.75, "y":1},
+ {"label":"K18", "x":9.75, "y":1},
+ {"label":"K19", "x":10.75, "y":1},
+ {"label":"K110", "x":12.75, "y":1},
+ {"label":"K111", "x":13.75, "y":1},
+ {"label":"K112", "x":14.75, "y":1},
+ {"label":"K113", "x":15.75, "y":1},
+ {"label":"K114", "x":16.75, "y":1},
+ {"label":"K115", "x":17.75, "y":1},
+ {"label":"K116", "x":18.75, "y":1, "w":2},
+ {"label":"K118", "x":20.75, "y":1},
+ {"label":"K119", "x":21.75, "y":1},
+ {"label":"K20", "x":0, "y":2, "w":1.5},
+ {"label":"K21", "x":1.5, "y":2},
+ {"label":"K22", "x":2.5, "y":2},
+ {"label":"K23", "x":3.5, "y":2},
+ {"label":"K24", "x":4.5, "y":2},
+ {"label":"K25", "x":5.5, "y":2},
+ {"label":"K26", "x":7.75, "y":2},
+ {"label":"K17", "x":8.75, "y":2},
+ {"label":"K28", "x":9.75, "y":2},
+ {"label":"K29", "x":10.75, "y":2},
+ {"label":"K210", "x":12.25, "y":2},
+ {"label":"K211", "x":13.25, "y":2},
+ {"label":"K212", "x":14.25, "y":2},
+ {"label":"K213", "x":15.25, "y":2},
+ {"label":"K214", "x":16.25, "y":2},
+ {"label":"K215", "x":17.25, "y":2},
+ {"label":"K216", "x":18.25, "y":2},
+ {"label":"K217", "x":19.25, "y":2, "w":1.5},
+ {"label":"K218", "x":20.75, "y":2},
+ {"label":"K219", "x":21.75, "y":2},
+ {"label":"K30", "x":0, "y":3, "w":1.75},
+ {"label":"K31", "x":1.75, "y":3},
+ {"label":"K32", "x":2.75, "y":3},
+ {"label":"K33", "x":3.75, "y":3},
+ {"label":"K34", "x":4.75, "y":3},
+ {"label":"K35", "x":5.75, "y":3},
+ {"label":"K36", "x":7.75, "y":3},
+ {"label":"K37", "x":8.75, "y":3},
+ {"label":"K38", "x":9.75, "y":3},
+ {"label":"K39", "x":10.75, "y":3},
+ {"label":"K310", "x":12.5, "y":3},
+ {"label":"K311", "x":13.5, "y":3},
+ {"label":"K312", "x":14.5, "y":3},
+ {"label":"K313", "x":15.5, "y":3},
+ {"label":"K314", "x":16.5, "y":3},
+ {"label":"K315", "x":17.5, "y":3},
+ {"label":"K317", "x":18.5, "y":3, "w":2.25},
+ {"label":"K40", "x":0, "y":4, "w":2.25},
+ {"label":"K41", "x":2.25, "y":4},
+ {"label":"K42", "x":3.25, "y":4},
+ {"label":"K43", "x":4.25, "y":4},
+ {"label":"K44", "x":5.25, "y":4},
+ {"label":"K45", "x":6.25, "y":4},
+ {"label":"K46", "x":7.75, "y":4},
+ {"label":"K47", "x":8.75, "y":4},
+ {"label":"K48", "x":9.75, "y":4},
+ {"label":"K49", "x":10.75, "y":4},
+ {"label":"K410", "x":13, "y":4},
+ {"label":"K411", "x":14, "y":4},
+ {"label":"K412", "x":15, "y":4},
+ {"label":"K413", "x":16, "y":4},
+ {"label":"K414", "x":17, "y":4},
+ {"label":"K416", "x":18, "y":4, "w":2.75},
+ {"label":"K418", "x":20.75, "y":4},
+ {"label":"K50", "x":0, "y":5, "w":1.25},
+ {"label":"K51", "x":1.25, "y":5, "w":1.25},
+ {"label":"K52", "x":2.5, "y":5, "w":1.25},
+ {"label":"K53", "x":3.75, "y":5, "w":1.25},
+ {"label":"K54", "x":5, "y":5, "w":2.25},
+ {"label":"K56", "x":7.75, "y":5},
+ {"Label":"K57", "x":8.75, "y":5},
+ {"label":"K58", "x":9.75, "y":5},
+ {"label":"K59", "x":10.75, "y":5},
+ {"label":"K510", "x":13, "y":5, "w":2},
+ {"label":"K512", "x":15, "y":5, "w":1.25},
+ {"label":"K513", "x":16.25, "y":5, "w":1.25},
+ {"label":"K514", "x":17.5, "y":5, "w":1.25},
+ {"label":"K516", "x":18.75, "y":5},
+ {"label":"K517", "x":19.75, "y":5},
+ {"label":"K518", "x":20.75, "y":5},
+ {"label":"K519", "x":21.75, "y":5}
+ ]
+ },
+ "LAYOUT_all": {
+ "layout": [
+ {"label":"K00", "x":0, "y":0},
+ {"label":"K01", "x":1, "y":0},
+ {"label":"K02", "x":2, "y":0},
+ {"label":"K03", "x":3, "y":0},
+ {"label":"K04", "x":4, "y":0},
+ {"label":"K05", "x":5, "y":0},
+ {"label":"K06", "x":6, "y":0},
+ {"label":"K010", "x":12.75, "y":0},
+ {"label":"K011", "x":13.75, "y":0},
+ {"label":"K012", "x":14.75, "y":0},
+ {"label":"K013", "x":15.75, "y":0},
+ {"label":"K014", "x":16.75, "y":0},
+ {"label":"K015", "x":17.75, "y":0},
+ {"label":"K016", "x":18.75, "y":0},
+ {"label":"K017", "x":19.75, "y":0},
+ {"label":"K018", "x":20.75, "y":0},
+ {"label":"K019", "x":21.75, "y":0},
+ {"label":"K10", "x":0, "y":1},
+ {"label":"K11", "x":1, "y":1},
+ {"label":"K12", "x":2, "y":1},
+ {"label":"K13", "x":3, "y":1},
+ {"label":"K14", "x":4, "y":1},
+ {"label":"K15", "x":5, "y":1},
+ {"label":"K16", "x":6, "y":1},
+ {"label":"K17", "x":8.75, "y":1},
+ {"label":"K18", "x":9.75, "y":1},
+ {"label":"K19", "x":10.75, "y":1},
+ {"label":"K110", "x":12.75, "y":1},
+ {"label":"K111", "x":13.75, "y":1},
+ {"label":"K112", "x":14.75, "y":1},
+ {"label":"K113", "x":15.75, "y":1},
+ {"label":"K114", "x":16.75, "y":1},
+ {"label":"K115", "x":17.75, "y":1},
+ {"label":"K116", "x":18.75, "y":1},
+ {"label":"K117", "x":19.75, "y":1},
+ {"label":"K118", "x":20.75, "y":1},
+ {"label":"K119", "x":21.75, "y":1},
+ {"label":"K20", "x":0, "y":2, "w":1.5},
+ {"label":"K21", "x":1.5, "y":2},
+ {"label":"K22", "x":2.5, "y":2},
+ {"label":"K23", "x":3.5, "y":2},
+ {"label":"K24", "x":4.5, "y":2},
+ {"label":"K25", "x":5.5, "y":2},
+ {"label":"K26", "x":7.75, "y":2},
+ {"label":"K27", "x":8.75, "y":2},
+ {"label":"K28", "x":9.75, "y":2},
+ {"label":"K29", "x":10.75, "y":2},
+ {"label":"K210", "x":12.25, "y":2},
+ {"label":"K211", "x":13.25, "y":2},
+ {"label":"K212", "x":14.25, "y":2},
+ {"label":"K213", "x":15.25, "y":2},
+ {"label":"K214", "x":16.25, "y":2},
+ {"label":"K215", "x":17.25, "y":2},
+ {"label":"K216", "x":18.25, "y":2},
+ {"label":"K217", "x":19.25, "y":2, "w":1.5},
+ {"label":"K218", "x":20.75, "y":2},
+ {"label":"K219", "x":21.75, "y":2},
+ {"label":"K30", "x":0, "y":3, "w":1.75},
+ {"label":"K31", "x":1.75, "y":3},
+ {"label":"K32", "x":2.75, "y":3},
+ {"label":"K33", "x":3.75, "y":3},
+ {"label":"K34", "x":4.75, "y":3},
+ {"label":"K35", "x":5.75, "y":3},
+ {"label":"K36", "x":7.75, "y":3},
+ {"label":"K37", "x":8.75, "y":3},
+ {"label":"K38", "x":9.75, "y":3},
+ {"label":"K39", "x":10.75, "y":3},
+ {"label":"K310", "x":12.5, "y":3},
+ {"label":"K311", "x":13.5, "y":3},
+ {"label":"K312", "x":14.5, "y":3},
+ {"label":"K313", "x":15.5, "y":3},
+ {"label":"K314", "x":16.5, "y":3},
+ {"label":"K315", "x":17.5, "y":3},
+ {"label":"K317", "x":18.5, "y":3, "w":2.25},
+ {"label":"K40", "x":0, "y":4, "w":2.25},
+ {"label":"K41", "x":2.25, "y":4},
+ {"label":"K42", "x":3.25, "y":4},
+ {"label":"K43", "x":4.25, "y":4},
+ {"label":"K44", "x":5.25, "y":4},
+ {"label":"K45", "x":6.25, "y":4},
+ {"label":"K46", "x":7.75, "y":4},
+ {"label":"K47", "x":8.75, "y":4},
+ {"label":"K48", "x":9.75, "y":4},
+ {"label":"K49", "x":10.75, "y":4},
+ {"label":"K410", "x":13, "y":4},
+ {"label":"K411", "x":14, "y":4},
+ {"label":"K412", "x":15, "y":4},
+ {"label":"K413", "x":16, "y":4},
+ {"label":"K414", "x":17, "y":4},
+ {"label":"K416", "x":18, "y":4, "w":1.75},
+ {"label":"K417", "x":19.75, "y":4},
+ {"label":"K418", "x":20.75, "y":4},
+ {"label":"K50", "x":0, "y":5, "w":1.25},
+ {"label":"K51", "x":1.25, "y":5, "w":1.25},
+ {"label":"K52", "x":2.5, "y":5, "w":1.25},
+ {"label":"K53", "x":3.75, "y":5, "w":1.25},
+ {"label":"K54", "x":5, "y":5, "w":2.25},
+ {"label":"K56", "x":7.75, "y":5},
+ {"label":"K57", "x":8.75, "y":5},
+ {"label":"K58", "x":9.75, "y":5},
+ {"label":"K59", "x":10.75, "y":5},
+ {"label":"K510", "x":13, "y":5, "w":2},
+ {"label":"K512", "x":15, "y":5, "w":1.25},
+ {"label":"K513", "x":16.25, "y":5, "w":1.25},
+ {"label":"K514", "x":17.5, "y":5, "w":1.25},
+ {"label":"K516", "x":18.75, "y":5},
+ {"label":"K517", "x":19.75, "y":5},
+ {"label":"K518", "x":20.75, "y":5},
+ {"label":"K519", "x":21.75, "y":5}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/downbubble/keymaps/default/config.h b/keyboards/handwired/downbubble/keymaps/default/config.h
new file mode 100644
index 0000000000..4496c59100
--- /dev/null
+++ b/keyboards/handwired/downbubble/keymaps/default/config.h
@@ -0,0 +1,19 @@
+/* Copyright 2018 REPLACE_WITH_YOUR_NAME
+ *
+ * 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
+
+// place overrides here
diff --git a/keyboards/handwired/downbubble/keymaps/default/keymap.c b/keyboards/handwired/downbubble/keymaps/default/keymap.c
new file mode 100644
index 0000000000..48303900fb
--- /dev/null
+++ b/keyboards/handwired/downbubble/keymaps/default/keymap.c
@@ -0,0 +1,103 @@
+/* Copyright 2018 REPLACE_WITH_YOUR_NAME
+ *
+ * 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
+
+// Defines the keycodes used by our macros in process_record_user
+enum custom_keycodes {
+ QMKBEST = SAFE_RANGE,
+ QMKURL
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_standard(\
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_NLCK, KC_HOME, KC_TRNS,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_PSLS, KC_PAST, KC_PMNS, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_END, KC_PGUP,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_P7, KC_P8, KC_P9, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_PGDN,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_P1, KC_P2, KC_P3, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_BSPC, KC_SPC, KC_P0, KC_PDOT, KC_PENT, KC_BSPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ LAYOUT_split_bs(\
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_NLCK, KC_HOME, KC_TRNS,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_PSLS, KC_PAST, KC_PMNS, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_TRNS, KC_END, KC_PGUP,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_P7, KC_P8, KC_P9, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_PGDN,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_P1, KC_P2, KC_P3, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_BSPC, KC_SPC, KC_P0, KC_PDOT, KC_PENT, KC_BSPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ LAYOUT_split_rshift(\
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_NLCK, KC_HOME, KC_TRNS,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_PSLS, KC_PAST, KC_PMNS, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_END, KC_PGUP,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_P7, KC_P8, KC_P9, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_PGDN,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_P1, KC_P2, KC_P3, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_TRNS, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_BSPC, KC_SPC, KC_P0, KC_PDOT, KC_PENT, KC_BSPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ LAYOUT_split_numpad(\
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_NLCK, KC_HOME, KC_TRNS,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_PSLS, KC_PAST, KC_PMNS, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_END, KC_PGUP,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_P7, KC_P8, KC_P9, KC_PPLS, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_PGDN,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_P4, KC_P5, KC_P6, KC_TRNS, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_P1, KC_P2, KC_P3, KC_PENT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_BSPC, KC_SPC, KC_P0, KC_TRNS, KC_PDOT, KC_TRNS, KC_BSPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ LAYOUT_all(\
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_NLCK, KC_HOME, KC_TRNS,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_PSLS, KC_PAST, KC_PMNS, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_TRNS, KC_END, KC_PGUP,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_P7, KC_P8, KC_P9, KC_PPLS, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_PGDN,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_P4, KC_P5, KC_P6, KC_TRNS, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_P1, KC_P2, KC_P3, KC_PENT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_TRNS, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_BSPC, KC_SPC, KC_P0, KC_TRNS, KC_PDOT, KC_TRNS, KC_BSPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case QMKBEST:
+ if (record->event.pressed) {
+ // when keycode QMKBEST is pressed
+ SEND_STRING("QMK is the best thing ever!");
+ } else {
+ // when keycode QMKBEST is released
+ }
+ break;
+ case QMKURL:
+ if (record->event.pressed) {
+ // when keycode QMKURL is pressed
+ SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER));
+ } else {
+ // when keycode QMKURL is released
+ }
+ break;
+ }
+ return true;
+}
+
+void matrix_init_user(void) {
+
+}
+
+void matrix_scan_user(void) {
+
+}
+
+void led_set_user(uint8_t usb_led) {
+
+}
diff --git a/keyboards/handwired/downbubble/keymaps/default/readme.md b/keyboards/handwired/downbubble/keymaps/default/readme.md
new file mode 100644
index 0000000000..757d990625
--- /dev/null
+++ b/keyboards/handwired/downbubble/keymaps/default/readme.md
@@ -0,0 +1 @@
+# The default keymaps for downbubble
diff --git a/keyboards/handwired/downbubble/license b/keyboards/handwired/downbubble/license
new file mode 100644
index 0000000000..e6e77b0890
--- /dev/null
+++ b/keyboards/handwired/downbubble/license
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/keyboards/handwired/downbubble/readme.md b/keyboards/handwired/downbubble/readme.md
new file mode 100644
index 0000000000..e662345127
--- /dev/null
+++ b/keyboards/handwired/downbubble/readme.md
@@ -0,0 +1,15 @@
+# downbubble
+
+Prototype hand-wired version of this keyboard - https://imgur.com/a/0KbX1JH
+
+This is an ergonomic keyboard with a 5 degree rotation on keyboard halves, and a rotated numpad in the center for RH users.
+
+Keyboard Maintainer: [Flehrad](https://github.com/flehrad)
+Hardware Supported: downbubble PCB, AT90USB1286 MCU, MX switches and MiniUSB connector
+Hardware Availability: The Board Podcast Slack
+
+Make example for this keyboard (after setting up your build environment):
+
+ make downbubble:default
+
+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).
diff --git a/keyboards/handwired/downbubble/rules.mk b/keyboards/handwired/downbubble/rules.mk
new file mode 100644
index 0000000000..87d0d4a1e2
--- /dev/null
+++ b/keyboards/handwired/downbubble/rules.mk
@@ -0,0 +1,81 @@
+# MCU name
+MCU = at90usb1286
+#MCU = atmega32u4
+
+# Processor frequency.
+# This will define a symbol, F_CPU, in all source code files equal to the
+# processor frequency in Hz. You can then use this symbol in your source code to
+# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+# automatically to create a 32-bit value in your source code.
+#
+# This will be an integer division of F_USB below, as it is sourced by
+# F_USB after it has run through any CPU prescalers. Note that this value
+# does not *change* the processor frequency - it should merely be updated to
+# reflect the processor speed set externally so that the code can use accurate
+# software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+# This will define a symbol, F_USB, in all source code files equal to the
+# input clock frequency (before any prescaling is performed) in Hz. This value may
+# differ from F_CPU if prescaling is used on the latter, and is required as the
+# raw input clock is fed directly to the PLL sections of the AVR for high speed
+# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+# at the end, this will be done automatically to create a 32-bit value in your
+# source code.
+#
+# If no clock division is performed on the input clock inside the AVR (via the
+# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# atmega32a bootloadHID
+BOOTLOADER = atmel-dfu
+
+
+# If you don't know the bootloader type, then you can specify the
+# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line
+# Teensy halfKay 512
+# Teensy++ halfKay 1024
+# Atmel DFU loader 4096
+# LUFA bootloader 4096
+# USBaspLoader 2048
+# OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
+CONSOLE_ENABLE = yes # Console for debug(+400)
+COMMAND_ENABLE = yes # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = no # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config)
+UNICODE_ENABLE = no # Unicode
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400)
diff --git a/keyboards/handwired/frenchdev/keymaps/default/keymap.c b/keyboards/handwired/frenchdev/keymaps/default/keymap.c
index 635383b55b..3d0f1fbfb8 100644
--- a/keyboards/handwired/frenchdev/keymaps/default/keymap.c
+++ b/keyboards/handwired/frenchdev/keymaps/default/keymap.c
@@ -176,11 +176,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
};
-
-const uint16_t PROGMEM fn_actions[] = {
-
-};
-
void hold_shift(void) {
shift_count = shift_count + 1;
register_code(KC_LSHIFT);
@@ -359,10 +354,6 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
return MACRO_NONE;
};
-void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
-
-}
-
void matrix_init_user(void) {
}
diff --git a/keyboards/handwired/frenchdev/rules.mk b/keyboards/handwired/frenchdev/rules.mk
index 2b70ae564e..c82bf4a389 100644
--- a/keyboards/handwired/frenchdev/rules.mk
+++ b/keyboards/handwired/frenchdev/rules.mk
@@ -87,6 +87,3 @@ AUDIO_ENABLE = no # Audio output on port C6
RGBLIGHT_ENABLE = no
API_SYSEX_ENABLE = no
-#ifndef QUANTUM_DIR
-# include ../../../Makefile
-#endif
diff --git a/keyboards/handwired/hexon38/config.h b/keyboards/handwired/hexon38/config.h
new file mode 100644
index 0000000000..23eb51e014
--- /dev/null
+++ b/keyboards/handwired/hexon38/config.h
@@ -0,0 +1,60 @@
+// see https://github.com/pepaslabs/hexon38
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x6060
+#define DEVICE_VER 0x0001
+#define MANUFACTURER pepaslabs
+#define PRODUCT hexon38
+#define DESCRIPTION "A handmade non-split ergonomic 38-key keyboard, inspired by the lil38. See https://github.com/pepaslabs/hexon38."
+
+/* key matrix size */
+#define MATRIX_ROWS 4
+#define MATRIX_COLS 12
+
+/* key matrix pins */
+#define MATRIX_ROW_PINS { B0, F0, B2, F4 }
+#define MATRIX_COL_PINS { C6, D3, D2, D1, D0, B7, F6, F7, B6, B5, B4, D7 }
+#define UNUSED_PINS
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION ROW2COL
+
+/* number of backlight levels */
+
+#ifdef BACKLIGHT_PIN
+#define BACKLIGHT_LEVELS 0
+#endif
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCING_DELAY 5
+
+
+/* key combination for command */
+#define IS_COMMAND() ( \
+ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
+)
+
+#ifdef RGB_DI_PIN
+#define RGBLIGHT_ANIMATIONS
+#define RGBLED_NUM 0
+#define RGBLIGHT_HUE_STEP 8
+#define RGBLIGHT_SAT_STEP 8
+#define RGBLIGHT_VAL_STEP 8
+#endif
+
+
+// Disabled features:
+
+/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
+//#define LOCKING_SUPPORT_ENABLE
+
+/* Locking resynchronize hack */
+//#define LOCKING_RESYNC_ENABLE
+
+/* prevent stuck modifiers */
+//#define PREVENT_STUCK_MODIFIERS
diff --git a/keyboards/handwired/hexon38/hexon38.c b/keyboards/handwired/hexon38/hexon38.c
new file mode 100644
index 0000000000..d830adef3c
--- /dev/null
+++ b/keyboards/handwired/hexon38/hexon38.c
@@ -0,0 +1,3 @@
+// see https://github.com/pepaslabs/hexon38
+
+#include "hexon38.h"
diff --git a/keyboards/handwired/hexon38/hexon38.h b/keyboards/handwired/hexon38/hexon38.h
new file mode 100644
index 0000000000..f98f460faf
--- /dev/null
+++ b/keyboards/handwired/hexon38/hexon38.h
@@ -0,0 +1,17 @@
+// see https://github.com/pepaslabs/hexon38
+
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT( \
+ K002, K003, K004, K005, K006, K007, K008, K009, \
+ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, \
+ K200, K201, K202, K203, K204, K207, K208, K209, K210, K211, \
+ K302, K303, K304, K305, K306, K307, K308, K309 \
+) { \
+ { KC_NO, KC_NO, K002, K003, K004, K005, K006, K007, K008, K009, KC_NO, KC_NO }, \
+ { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111 }, \
+ { K200, K201, K202, K203, K204, KC_NO, KC_NO, K207, K208, K209, K210, K211 }, \
+ { KC_NO, KC_NO, K302, K303, K304, K305, K306, K307, K308, K309, KC_NO, KC_NO } \
+}
diff --git a/keyboards/handwired/hexon38/keymaps/default/keymap.c b/keyboards/handwired/hexon38/keymaps/default/keymap.c
new file mode 100644
index 0000000000..c3805991f0
--- /dev/null
+++ b/keyboards/handwired/hexon38/keymaps/default/keymap.c
@@ -0,0 +1,407 @@
+// see https://github.com/pepaslabs/hexon38
+
+#include "hexon38.h"
+
+#define A_ KC_A
+#define B_ KC_B
+#define C_ KC_C
+#define D_ KC_D
+#define E_ KC_E
+#define F_ KC_F
+#define G_ KC_G
+#define H_ KC_H
+#define I_ KC_I
+#define J_ KC_J
+#define K_ KC_K
+#define L_ KC_L
+#define M_ KC_M
+#define N_ KC_N
+#define O_ KC_O
+#define P_ KC_P
+#define Q_ KC_Q
+#define R_ KC_R
+#define S_ KC_S
+#define T_ KC_T
+#define U_ KC_U
+#define V_ KC_V
+#define W_ KC_W
+#define X_ KC_X
+#define Y_ KC_Y
+#define Z_ KC_Z
+
+// Dual-role keys: modifier when held, alpha when tapped.
+#define A_CTL CTL_T(KC_A)
+#define S_ALT ALT_T(KC_S)
+#define D_GUI GUI_T(KC_D)
+#define F_SFT SFT_T(KC_F)
+#define J_SFT SFT_T(KC_J)
+#define K_GUI GUI_T(KC_K)
+#define L_ALT ALT_T(KC_L)
+#define COLN_CTL CTL_T(KC_SCLN)
+
+#define ______ KC_TRNS
+#define LSHIFT KC_LSHIFT
+#define RSHIFT KC_RSHIFT
+#define COMMA KC_COMM
+#define SLASH KC_SLSH
+#define SPACE KC_SPC
+#define TAB KC_TAB
+#define BKSPC KC_BSPC
+#define ENTER KC_ENT
+#define PERIOD KC_DOT
+
+#define BASE_LAYER LAYOUT
+#define BLANK_LAYER LAYOUT
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ BASE_LAYER(
+// ,--------+--------+--------+--------. ,--------+--------+--------+--------.
+ W_ , E_ , R_ , T_ , Y_ , U_ , I_ , O_ ,
+//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------.
+ Q_ , A_CTL , S_ALT , D_GUI , F_SFT , G_ , H_ , J_SFT , K_GUI , L_ALT ,COLN_CTL, P_ ,
+//|--------+--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------+--------|
+ B_ , Z_ , X_ , C_ , V_ , M_ , COMMA , PERIOD , SLASH , N_ ,
+//`--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------'
+
+// ,--------+--------+--------+--------. ,--------+--------+--------+--------.
+ LSHIFT , SPACE , TAB , DEBUG , SPACE , BKSPC , ENTER , RSHIFT
+// `--------+--------+--------+--------' `--------+--------+--------+--------'
+),
+
+ BLANK_LAYER(
+// ,--------+--------+--------+--------. ,--------+--------+--------+--------.
+ ______ , ______ , ______ , ______ , ______ , ______ , ______ , ______ ,
+//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------.
+ ______ , ______ , ______ , ______ , ______ , ______ , ______ , ______ , ______ , ______ , ______ , ______ ,
+//|--------+--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------+--------|
+ ______ , ______ , ______ , ______ , ______ , ______ , ______ , ______ , ______ , ______ ,
+//`--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------'
+
+// ,--------+--------+--------+--------. ,--------+--------+--------+--------.
+ ______ , ______ , ______ , ______ , ______ , ______ , ______ , ______
+// `--------+--------+--------+--------' `--------+--------+--------+--------'
+)
+
+};
+
+// a linked list of pending key events (press or release) which we haven't processed yet.
+struct _pending_key_t {
+ uint16_t keycode;
+ keyrecord_t record;
+ struct _pending_key_t *next;
+};
+typedef struct _pending_key_t pending_key_t;
+
+// worst case is 10 down strokes and 1 up stroke before we can start disambiguating.
+#define RINGSIZE 11
+
+// a ring buffer and linked list to store pending key events (presses and releases).
+// (basically, this is a fixed-allocation linked list.)
+struct _kring_t {
+ // the actual key events.
+ pending_key_t items[RINGSIZE];
+ // the index of the oldest item, or -1 if no items.
+ int8_t ifirst;
+ // the index of the most recently added item, or -1 if no items.
+ int8_t ilast;
+ // the number of items in the ring.
+ uint8_t count;
+ // the head of the linked list.
+ pending_key_t *head;
+};
+typedef struct _kring_t kring_t;
+
+// safe accessor to the i-th item of the linked list (returns pointer or NULL).
+pending_key_t* kring_get(kring_t *ring, uint8_t i) {
+ if (i >= ring->count) {
+ return NULL;
+ }
+ uint8_t j = (ring->ifirst + i) % RINGSIZE;
+ return &(ring->items[j]);
+}
+
+// return the last key in the list of buffered keys.
+pending_key_t* kring_last(kring_t *ring) {
+ if (ring->count == 0) {
+ return NULL;
+ }
+ return kring_get(ring, ring->count - 1);
+}
+
+// remove the oldest item from the ring (the head of the list).
+void kring_pop(kring_t *ring) {
+ if (ring->count > 0) {
+ ring->ifirst += 1;
+ ring->ifirst %= RINGSIZE;
+ ring->head = ring->head->next;
+ ring->count -= 1;
+ }
+}
+
+// add an item to the ring (append to the list).
+void kring_append(kring_t *ring, uint16_t keycode, keyrecord_t *record) {
+ if (ring->count >= RINGSIZE) {
+ // uh oh, we overflowed the capacity of our buffer :(
+ return;
+ }
+
+ // if the ring is empty, insert at index 0.
+ if (ring->count == 0) {
+ ring->count += 1;
+ ring->ifirst = 0;
+ ring->ilast = 0;
+ ring->head = &(ring->items[0]);
+ }
+ // else, append it onto the end.
+ else {
+ ring->count += 1;
+ ring->ilast += 1;
+ ring->ilast %= RINGSIZE;
+ }
+
+ // the index at which we should insert this item.
+ int8_t i = ring->ilast;
+
+ // insert the item.
+ ring->items[i].keycode = keycode;
+ ring->items[i].record.event = record->event;
+#ifndef NO_ACTION_TAPPING
+ ring->items[i].record.tap = record->tap;
+#endif
+ ring->items[i].next = NULL;
+
+ // update the previous item to point to this item.
+ if (ring->count > 1) {
+ kring_get(ring, ring->count - 2)->next = &(ring->items[i]);
+ }
+}
+
+kring_t g_pending;
+
+void matrix_init_user(void) {
+ g_pending.ifirst = -1;
+ g_pending.ilast = -1;
+ g_pending.count = 0;
+ g_pending.head = NULL;
+}
+
+void matrix_scan_user(void) {}
+
+/*
+a_ a-: emit a
+a_ b_ b- a-: emit SHIFT+b
+a_ b_ a- b-: emit a, b
+dual1down, dual1up -> norm1down, norm1up
+dual1down, norm2down, norm2up -> mod1down, norm2down, norm2up
+dual1down, norm2down, dual1up -> norm1down, norm2down, norm1up
+dual1down, dual2down, norm3down, norm3up -> mod1down, mod2down, norm3down, norm3up
+so, a dual key can't be disambiguated until the next keyup of a keydown (not including keyups from keys before it).
+*/
+
+bool is_ambiguous_kc(uint16_t kc) {
+ // See the MT() define: https://github.com/qmk/qmk_firmware/blob/master/quantum/quantum_keycodes.h#L642
+ // See the QK_MOD_TAP case: https://github.com/qmk/qmk_firmware/blob/master/quantum/keymap_common.c#L134
+ uint8_t mod = mod_config((kc >> 0x8) & 0x1F);
+ return mod != 0;
+}
+
+bool is_down(pending_key_t *k) {
+ return k->record.event.pressed;
+}
+
+bool is_up(pending_key_t *k) {
+ return !is_down(k);
+}
+
+bool keys_match(pending_key_t *a, pending_key_t *b) {
+ return a->record.event.key.col == b->record.event.key.col
+ && a->record.event.key.row == b->record.event.key.row;
+}
+
+// both the down and corresponding upstroke of a keypress.
+struct _pending_pair_t {
+ pending_key_t *down;
+ pending_key_t *up;
+};
+typedef struct _pending_pair_t pending_pair_t;
+
+// returns true if this keydown event has a corresponding keyup event in the
+// list of buffered keys. also fills out 'p'.
+bool is_downup_pair(pending_key_t *k, pending_pair_t *p) {
+ // first, make sure this event is keydown.
+ if (!is_down(k)) {
+ return false;
+ }
+ // now find its matching keyup.
+ pending_key_t *next = k->next;
+ while (next != NULL) {
+ if (keys_match(k, next) && is_up(next)) {
+ // found it.
+ if (p != NULL) {
+ p->down = k;
+ p->up = next;
+ }
+ return true;
+ }
+ next = next->next;
+ }
+ // didn't find it.
+ return false;
+}
+
+// given a QK_MOD_TAP keycode, return the KC_* version of the modifier keycode.
+uint16_t get_mod_kc(uint16_t keycode) {
+ uint8_t mod = mod_config((keycode >> 0x8) & 0x1F);
+ switch (mod) {
+ case MOD_LCTL:
+ return KC_LCTL;
+ case MOD_RCTL:
+ return KC_RCTL;
+ case MOD_LSFT:
+ return KC_LSFT;
+ case MOD_RSFT:
+ return KC_RSFT;
+ case MOD_LALT:
+ return KC_LALT;
+ case MOD_RALT:
+ return KC_RALT;
+ case MOD_LGUI:
+ return KC_LGUI;
+ case MOD_RGUI:
+ return KC_RGUI;
+ default:
+ // shrug? this shouldn't happen.
+ return keycode;
+ }
+}
+
+bool is_mod_kc(uint16_t keycode) {
+ switch (keycode) {
+ case QK_MODS ... QK_MODS_MAX:
+ return true;
+ default:
+ return false;
+ }
+}
+
+void interpret_as_mod(pending_pair_t *p) {
+ // see https://github.com/qmk/qmk_firmware/issues/1503
+ pending_key_t *k;
+ k = p->down;
+ if (k != NULL) {
+ k->keycode = get_mod_kc(k->keycode);
+ }
+ k = p->up;
+ if (k != NULL) {
+ k->keycode = get_mod_kc(k->keycode);
+ }
+}
+
+void interpret_as_normal(pending_pair_t *p) {
+ pending_key_t *k;
+ k = p->down;
+ if (k != NULL) {
+ k->keycode = k->keycode & 0xFF;
+ }
+ k = p->up;
+ if (k != NULL) {
+ k->keycode = k->keycode & 0xFF;
+ }
+}
+
+void execute_head_and_pop(kring_t *ring) {
+ pending_key_t *head = kring_get(ring, 0);
+ uint16_t kc = head->keycode;
+ if (is_mod_kc(kc)) {
+ if (is_down(head)) {
+ dprintf(" %s: mod down 0x%04X\n", __func__, kc);
+ set_mods(get_mods() | MOD_BIT(kc));
+ } else {
+ dprintf(" %s: mod up 0x%04X\n", __func__, kc);
+ set_mods(get_mods() & ~MOD_BIT(kc));
+ }
+ } else {
+ if (is_down(head)) {
+ dprintf(" %s: key down 0x%04X\n", __func__, kc);
+ register_code16(kc);
+ } else {
+ dprintf(" %s: key up 0x%04X\n", __func__, kc);
+ unregister_code16(kc);
+ }
+ }
+ kring_pop(ring);
+}
+
+// try to figure out what the next pending keypress means.
+bool parse_next(kring_t *pending) {
+ pending_pair_t p;
+ pending_key_t *first = kring_get(pending, 0);
+ if (!is_ambiguous_kc(first->keycode)) {
+ // this pending key isn't ambiguous, so execute it.
+ dprintf(" %s: found unambiguous key\n", __func__);
+ execute_head_and_pop(pending);
+ return true;
+ } else if (is_ambiguous_kc(first->keycode) && is_up(first)) {
+ dprintf(" %s: interpreting keyup as mod\n", __func__);
+ p.down = NULL;
+ p.up = first;
+ interpret_as_mod(&p);
+ execute_head_and_pop(pending);
+ return true;
+ } else if (is_downup_pair(first, &p)) {
+ // 'first' was released before any other pressed key, so treat this as
+ // a rolling series of normal key taps.
+ dprintf(" %s: found down-up pair, interpreting as normal key\n", __func__);
+ interpret_as_normal(&p);
+ execute_head_and_pop(pending);
+ return true;
+ } else {
+ // if another key was pressed and released while 'first' was held, then we
+ // should treat it like a modifier.
+ pending_key_t *next = first->next;
+ while (next != NULL) {
+ if (is_downup_pair(next, NULL)) {
+ dprintf(" %s: found subsequent downup pair, interpreting head as mod\n", __func__);
+ p.down = first;
+ p.up = NULL;
+ interpret_as_mod(&p);
+ execute_head_and_pop(pending);
+ return true;
+ }
+ next = next->next;
+ }
+
+ // we can't disambiguate 'first' yet. wait for another keypress.
+ dprintf(" %s: can't disambiguate (yet)\n", __func__);
+ return false;
+ }
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ if (keycode == DEBUG) {
+ return true;
+ }
+
+ if (g_pending.count == 0 && !is_ambiguous_kc(keycode)) {
+ // we have no pending keys and this key isn't ambiguous, so we should
+ // just let QMK take care of it.
+ dprintf("%s: handled by qmk\n", __func__);
+ return true;
+ } else {
+ dprintf("%s: got dual-role key\n", __func__);
+ // append the keypress and then try parsing all pending keypresses.
+ kring_append(&g_pending, keycode, record);
+ while (g_pending.count > 0) {
+ dprintf("%s: looping through %d keys...\n", __func__, g_pending.count);
+ if (!parse_next(&g_pending)) {
+ // one of our keypresses is ambiguous and we can't proceed until
+ // we get further keypresses to disambiguate it.
+ dprintf("%s: %d pending keys are ambiguous\n", __func__, g_pending.count);
+ break;
+ }
+ }
+ return false;
+ }
+}
diff --git a/keyboards/handwired/hexon38/readme.md b/keyboards/handwired/hexon38/readme.md
new file mode 100644
index 0000000000..c8ada8e2b2
--- /dev/null
+++ b/keyboards/handwired/hexon38/readme.md
@@ -0,0 +1,11 @@
+# hexon38
+
+QMK support for the [hexon38](https://github.com/pepaslabs/hexon38).
+
+## Building
+
+```
+$ cd qmk_firmware
+$ make handwired/hexon38
+```
+
diff --git a/keyboards/handwired/hexon38/rules.mk b/keyboards/handwired/hexon38/rules.mk
new file mode 100644
index 0000000000..2b6f17afc2
--- /dev/null
+++ b/keyboards/handwired/hexon38/rules.mk
@@ -0,0 +1,64 @@
+# see https://github.com/pepaslabs/hexon38
+
+# MCU name
+MCU = atmega32u4
+
+# Processor frequency.
+# This will define a symbol, F_CPU, in all source code files equal to the
+# processor frequency in Hz. You can then use this symbol in your source code to
+# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+# automatically to create a 32-bit value in your source code.
+#
+# This will be an integer division of F_USB below, as it is sourced by
+# F_USB after it has run through any CPU prescalers. Note that this value
+# does not *change* the processor frequency - it should merely be updated to
+# reflect the processor speed set externally so that the code can use accurate
+# software delays.
+F_CPU = 16000000
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+# This will define a symbol, F_USB, in all source code files equal to the
+# input clock frequency (before any prescaling is performed) in Hz. This value may
+# differ from F_CPU if prescaling is used on the latter, and is required as the
+# raw input clock is fed directly to the PLL sections of the AVR for high speed
+# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+# at the end, this will be done automatically to create a 32-bit value in your
+# source code.
+#
+# If no clock division is performed on the input clock inside the AVR (via the
+# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# atmega32a bootloadHID
+BOOTLOADER = halfkay
+
+
+# Enabled build options:
+BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
+CONSOLE_ENABLE = yes # Console for debug(+400)
+COMMAND_ENABLE = yes # Commands for debug and configuration
+NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+
+# Disabled build options:
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+AUDIO_ENABLE = no
+RGBLIGHT_ENABLE = no
diff --git a/keyboards/handwired/ibm122m/keymaps/lukaus/keymap.c b/keyboards/handwired/ibm122m/keymaps/lukaus/keymap.c
index 9cd58c0ec9..130465e8d8 100644
--- a/keyboards/handwired/ibm122m/keymaps/lukaus/keymap.c
+++ b/keyboards/handwired/ibm122m/keymaps/lukaus/keymap.c
@@ -137,10 +137,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),*/
};
-const uint16_t PROGMEM fn_actions[] = {
-
-};
-
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function
diff --git a/keyboards/handwired/ibm122m/readme.md b/keyboards/handwired/ibm122m/readme.md
index 09dac49c0d..de89d7596e 100644
--- a/keyboards/handwired/ibm122m/readme.md
+++ b/keyboards/handwired/ibm122m/readme.md
@@ -13,4 +13,4 @@ Make example for this keyboard (after setting up your build environment):
make handwired/ibm122m:default
-See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information.
+See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information.
diff --git a/keyboards/handwired/not_so_minidox/readme.md b/keyboards/handwired/not_so_minidox/readme.md
index bd40607357..c791e6e3f9 100644
--- a/keyboards/handwired/not_so_minidox/readme.md
+++ b/keyboards/handwired/not_so_minidox/readme.md
@@ -12,7 +12,7 @@ Make example for this keyboard (after setting up your build environment):
make not_so_minidox/rev1:default
-See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information.
+See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information.
Flashing
-------
diff --git a/keyboards/handwired/numbrero/config.h b/keyboards/handwired/numbrero/config.h
new file mode 100644
index 0000000000..cbcb1d8261
--- /dev/null
+++ b/keyboards/handwired/numbrero/config.h
@@ -0,0 +1,51 @@
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x6060
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Flehrad
+#define PRODUCT Numbrero
+#define DESCRIPTION Pro Micro-powered Reversible L/H Numpad with Extra Macro Keys
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 5
+
+/* key matrix pins */
+#define MATRIX_ROW_PINS { F6, B5, B4, E6, F7 }
+#define MATRIX_COL_PINS { D1, D0, D4, F5, F4 }
+#define UNUSED_PINS
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* number of backlight levels */
+
+#ifdef BACKLIGHT_PIN
+#define BACKLIGHT_LEVELS 3
+#endif
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCING_DELAY 5
+
+/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
+#define LOCKING_SUPPORT_ENABLE
+
+/* Locking resynchronize hack */
+#define LOCKING_RESYNC_ENABLE
+
+/* key combination for command */
+#define IS_COMMAND() ( \
+ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
+)
+
+#ifdef RGB_DI_PIN
+#define RGBLIGHT_ANIMATIONS
+#define RGBLED_NUM 5
+#define RGBLIGHT_HUE_STEP 8
+#define RGBLIGHT_SAT_STEP 8
+#define RGBLIGHT_VAL_STEP 8
+#endif
diff --git a/keyboards/handwired/numbrero/info.json b/keyboards/handwired/numbrero/info.json
new file mode 100644
index 0000000000..d2f7ebd031
--- /dev/null
+++ b/keyboards/handwired/numbrero/info.json
@@ -0,0 +1,62 @@
+{
+ "keyboard_name": "Numbrero",
+ "url": "",
+ "maintainer": "Flehrad",
+ "width": 5,
+ "height": 5,
+ "layouts": {
+ "LAYOUT_numbrero_numpad": {
+ "layout": [
+ {"label":"K00", "x":0, "y":0},
+ {"label":"K01", "x":1, "y":0},
+ {"label":"K02", "x":2, "y":0},
+ {"label":"K03", "x":3, "y":0},
+ {"label":"K04", "x":4, "y":0},
+ {"label":"K10", "x":0, "y":1, "h":1.5},
+ {"label":"K11", "x":1, "y":1},
+ {"label":"K12", "x":2, "y":1},
+ {"label":"K13", "x":3, "y":1},
+ {"label":"K20", "x":0, "y":2.5},
+ {"label":"K21", "x":1, "y":2},
+ {"label":"K22", "x":2, "y":2},
+ {"label":"K23", "x":3, "y":2},
+ {"label":"K14", "x":4, "y":1, "h":2},
+ {"label":"K30", "x":0, "y":3.5, "h":1.5},
+ {"label":"K31", "x":1, "y":3},
+ {"label":"K32", "x":2, "y":3},
+ {"label":"K33", "x":3, "y":3},
+ {"label":"K41", "x":1, "y":4, "w":2},
+ {"label":"K43", "x":3, "y":4},
+ {"label":"K34", "x":4, "y":3, "h":2}
+ ]
+ },
+ "LAYOUT_numbrero_ortho": {
+ "layout": [
+ {"label":"K00", "x":0, "y":0},
+ {"label":"K01", "x":1, "y":0},
+ {"label":"K02", "x":2, "y":0},
+ {"label":"K03", "x":3, "y":0},
+ {"label":"K04", "x":4, "y":0},
+ {"label":"K10", "x":0, "y":1, "h":1.5},
+ {"label":"K11", "x":1, "y":1},
+ {"label":"K12", "x":2, "y":1},
+ {"label":"K13", "x":3, "y":1},
+ {"label":"K14", "x":4, "y":1},
+ {"label":"K20", "x":0, "y":2.5},
+ {"label":"K21", "x":1, "y":2},
+ {"label":"K22", "x":2, "y":2},
+ {"label":"K23", "x":3, "y":2},
+ {"label":"K24", "x":4, "y":2},
+ {"label":"K30", "x":0, "y":3.5, "h":1.5},
+ {"label":"K31", "x":1, "y":3},
+ {"label":"K32", "x":2, "y":3},
+ {"label":"K33", "x":3, "y":3},
+ {"label":"K34", "x":4, "y":3},
+ {"label":"K41", "x":1, "y":4},
+ {"label":"K42", "x":2, "y":4},
+ {"label":"K43", "x":3, "y":4},
+ {"label":"K44", "x":4, "y":4}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/numbrero/keymaps/default/keymap.c b/keyboards/handwired/numbrero/keymaps/default/keymap.c
new file mode 100644
index 0000000000..903ed8d88c
--- /dev/null
+++ b/keyboards/handwired/numbrero/keymaps/default/keymap.c
@@ -0,0 +1,30 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ LAYOUT_numbrero_numpad(
+ KC_TRNS, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_TRNS, KC_P7, KC_P8, KC_P9,
+ KC_TRNS, KC_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_TRNS, KC_P1, KC_P2, KC_P3,
+ KC_P0, KC_PDOT, KC_PENT),
+
+ LAYOUT_numbrero_ortho(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+
+};
+
+void matrix_init_user(void) {
+}
+
+void matrix_scan_user(void) {
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ return true;
+}
diff --git a/keyboards/handwired/numbrero/license b/keyboards/handwired/numbrero/license
new file mode 100644
index 0000000000..b09cd7856d
--- /dev/null
+++ b/keyboards/handwired/numbrero/license
@@ -0,0 +1,201 @@
+Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/keyboards/handwired/numbrero/numbrero.c b/keyboards/handwired/numbrero/numbrero.c
new file mode 100644
index 0000000000..d3ec36904a
--- /dev/null
+++ b/keyboards/handwired/numbrero/numbrero.c
@@ -0,0 +1 @@
+#include "numbrero.h"
diff --git a/keyboards/handwired/numbrero/numbrero.h b/keyboards/handwired/numbrero/numbrero.h
new file mode 100644
index 0000000000..c72e654078
--- /dev/null
+++ b/keyboards/handwired/numbrero/numbrero.h
@@ -0,0 +1,30 @@
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT_numbrero_numpad( \
+ K00, K01, K02, K03, K04, \
+ K10, K11, K12, K13, \
+ K20, K21, K22, K23, K14, \
+ K30, K31, K32, K33, \
+ K41, K43, K34 \
+) { \
+ { K00, K01, K02, K03, K04 }, \
+ { K10, K11, K12, K13, K14 }, \
+ { K20, K21, K22, K23, KC_NO }, \
+ { K30, K31, K32, K33, K34 }, \
+ { KC_NO, K41, KC_NO, K43, KC_NO } \
+}
+#define LAYOUT_numbrero_ortho(\
+ K00, K01, K02, K03, K04, \
+ K10, K11, K12, K13, K14, \
+ K20, K21, K22, K23, K24, \
+ K30, K31, K32, K33, K34, \
+ K41, K42, K43, K44 \
+){ \
+ { K00, K01, K02, K03, K04 }, \
+ { K10, K11, K12, K13, K14 }, \
+ { K20, K21, K22, K23, K24 }, \
+ { K30, K31, K32, K33, K34 }, \
+ { KC_NO, K41, K42, K43, K44 } \
+}
diff --git a/keyboards/handwired/numbrero/readme.md b/keyboards/handwired/numbrero/readme.md
new file mode 100644
index 0000000000..42f005dbe2
--- /dev/null
+++ b/keyboards/handwired/numbrero/readme.md
@@ -0,0 +1,13 @@
+# Numbrero
+
+A reversible numpad (left/right-handed) with extra macro keys.
+
+Keyboard Maintainer: [Flehrad](https://github.com/flehrad)
+Hardware Supported: Numbrero PCB, Pro Micro
+Hardware Availability: The Board Podcast Slack
+
+Make example for this keyboard (after setting up your build environment):
+
+ make handwired/numbrero/numbrero:default
+
+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).
diff --git a/keyboards/handwired/numbrero/rules.mk b/keyboards/handwired/numbrero/rules.mk
new file mode 100644
index 0000000000..bda6c866e2
--- /dev/null
+++ b/keyboards/handwired/numbrero/rules.mk
@@ -0,0 +1,59 @@
+# MCU name
+MCU = atmega32u4
+
+# Processor frequency.
+# This will define a symbol, F_CPU, in all source code files equal to the
+# processor frequency in Hz. You can then use this symbol in your source code to
+# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+# automatically to create a 32-bit value in your source code.
+#
+# This will be an integer division of F_USB below, as it is sourced by
+# F_USB after it has run through any CPU prescalers. Note that this value
+# does not *change* the processor frequency - it should merely be updated to
+# reflect the processor speed set externally so that the code can use accurate
+# software delays.
+F_CPU = 16000000
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+# This will define a symbol, F_USB, in all source code files equal to the
+# input clock frequency (before any prescaling is performed) in Hz. This value may
+# differ from F_CPU if prescaling is used on the latter, and is required as the
+# raw input clock is fed directly to the PLL sections of the AVR for high speed
+# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+# at the end, this will be done automatically to create a 32-bit value in your
+# source code.
+#
+# If no clock division is performed on the input clock inside the AVR (via the
+# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+#Bootloder
+#Pro Micro = caterina
+BOOTLOADER = caterina
+
+# Boot Section Size in *bytes*
+#OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+# comment out to disable the options.
+#
+BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
+CONSOLE_ENABLE = no # Console for debug(+400)
+COMMAND_ENABLE = no # Commands for debug and configuration
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+AUDIO_ENABLE = no
+RGBLIGHT_ENABLE = no
diff --git a/keyboards/handwired/numpad20/readme.md b/keyboards/handwired/numpad20/readme.md
index 29c832daf0..4e14fbb005 100644
--- a/keyboards/handwired/numpad20/readme.md
+++ b/keyboards/handwired/numpad20/readme.md
@@ -10,4 +10,4 @@ Make example for this keyboard (after setting up your build environment):
make handwired/numpad20:default
-See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. \ No newline at end of file
+See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. \ No newline at end of file
diff --git a/keyboards/handwired/ortho5x13/ortho5x13.h b/keyboards/handwired/ortho5x13/ortho5x13.h
index 93551bd70b..a43fc76ae6 100644
--- a/keyboards/handwired/ortho5x13/ortho5x13.h
+++ b/keyboards/handwired/ortho5x13/ortho5x13.h
@@ -1,5 +1,4 @@
-#ifndef ORTHO5X13_H
-#define ORTHO5X13_H
+#pragma once
#include "quantum.h"
@@ -18,7 +17,7 @@
{ k40, k41, k42, k43, k44, k45, KC_NO, k47, k48, k49, k4a, k4b, k4c } \
}
-#define LAYOUT_compact( \
+#define LAYOUT_kc( \
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, \
k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, \
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, \
@@ -32,5 +31,3 @@
{ KC_##k30, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_##k35, KC_##k35, KC_##k37, KC_##k38, KC_##k39, KC_##k3a, KC_##k3b, KC_##k3c }, \
{ KC_##k40, KC_##k41, KC_##k42, KC_##k43, KC_##k44, KC_##k45, KC_NO, KC_##k47, KC_##k48, KC_##k49, KC_##k4a, KC_##k4b, KC_##k4c } \
}
-
-#endif \ No newline at end of file
diff --git a/keyboards/handwired/ortho60/info.json b/keyboards/handwired/ortho60/info.json
index b6e4854410..b94bfc7b53 100644
--- a/keyboards/handwired/ortho60/info.json
+++ b/keyboards/handwired/ortho60/info.json
@@ -65,8 +65,71 @@
{"label":"Raise", "x":7, "y":4},
{"label":"Left", "x":8, "y":4},
{"label":"Down", "x":9, "y":4},
- {"label":"Right", "x":10, "y":4},
- {"label":"up", "x":11, "y":4}
+ {"label":"Up", "x":10, "y":4},
+ {"label":"Right", "x":11, "y":4}
+ ]
+ },
+ "LAYOUT_1x2uC": {
+ "layout": [
+ {"label":"`", "x":0, "y":0},
+ {"label":"1", "x":1, "y":0},
+ {"label":"2", "x":2, "y":0},
+ {"label":"3", "x":3, "y":0},
+ {"label":"4", "x":4, "y":0},
+ {"label":"5", "x":5, "y":0},
+ {"label":"6", "x":6, "y":0},
+ {"label":"7", "x":7, "y":0},
+ {"label":"8", "x":8, "y":0},
+ {"label":"9", "x":9, "y":0},
+ {"label":"0", "x":10, "y":0},
+ {"label":"Backspace", "x":11, "y":0},
+ {"label":"Tab", "x":0, "y":1},
+ {"label":"Q", "x":1, "y":1},
+ {"label":"W", "x":2, "y":1},
+ {"label":"E", "x":3, "y":1},
+ {"label":"R", "x":4, "y":1},
+ {"label":"T", "x":5, "y":1},
+ {"label":"Y", "x":6, "y":1},
+ {"label":"U", "x":7, "y":1},
+ {"label":"I", "x":8, "y":1},
+ {"label":"O", "x":9, "y":1},
+ {"label":"P", "x":10, "y":1},
+ {"label":"Delete", "x":11, "y":1},
+ {"label":"Esc", "x":0, "y":2},
+ {"label":"A", "x":1, "y":2},
+ {"label":"S", "x":2, "y":2},
+ {"label":"D", "x":3, "y":2},
+ {"label":"F", "x":4, "y":2},
+ {"label":"G", "x":5, "y":2},
+ {"label":"H", "x":6, "y":2},
+ {"label":"J", "x":7, "y":2},
+ {"label":"K", "x":8, "y":2},
+ {"label":"L", "x":9, "y":2},
+ {"label":";", "x":10, "y":2},
+ {"label":"'", "x":11, "y":2},
+ {"label":"Shift", "x":0, "y":3},
+ {"label":"Z", "x":1, "y":3},
+ {"label":"X", "x":2, "y":3},
+ {"label":"C", "x":3, "y":3},
+ {"label":"V", "x":4, "y":3},
+ {"label":"B", "x":5, "y":3},
+ {"label":"N", "x":6, "y":3},
+ {"label":"M", "x":7, "y":3},
+ {"label":",", "x":8, "y":3},
+ {"label":".", "x":9, "y":3},
+ {"label":"/", "x":10, "y":3},
+ {"label":"Enter", "x":11, "y":3},
+ {"label":"Fn", "x":0, "y":4},
+ {"label":"Ctrl", "x":1, "y":4},
+ {"label":"Alt", "x":2, "y":4},
+ {"label":"Meta", "x":3, "y":4},
+ {"label":"Lower", "x":4, "y":4},
+ {"label":"Space", "x":5, "y":4, "w":2},
+ {"label":"Raise", "x":7, "y":4},
+ {"label":"Left", "x":8, "y":4},
+ {"label":"Down", "x":9, "y":4},
+ {"label":"Up", "x":10, "y":4},
+ {"label":"Right", "x":11, "y":4}
]
}
}
diff --git a/keyboards/handwired/ortho60/readme.md b/keyboards/handwired/ortho60/readme.md
index 8db1b7df7d..be2a027c4f 100644
--- a/keyboards/handwired/ortho60/readme.md
+++ b/keyboards/handwired/ortho60/readme.md
@@ -1,3 +1,12 @@
# Ortho 60
-Blue Pill STM32F103C8T6 based 12x5 Ortholinear Board
+A Blue Pill STM32F103C8T6-based 12x5 ortholinear keyboard.
+
+Keyboard Maintainer: [Andrew Kannan](https://github.com/awkannan1)
+Hardware Supported: Blue Pill STM32F103C8T6
+
+Make example for this keyboard (after setting up your build environment):
+
+ make handwired/ortho60:default
+
+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).
diff --git a/keyboards/handwired/ortho60/rules.mk b/keyboards/handwired/ortho60/rules.mk
index 3f4574473c..91acb3c5c6 100644
--- a/keyboards/handwired/ortho60/rules.mk
+++ b/keyboards/handwired/ortho60/rules.mk
@@ -52,5 +52,3 @@ NKRO_ENABLE = yes # USB Nkey Rollover
BACKLIGHT_ENABLE = yes
LAYOUTS = ortho_5x12
-
-DEFAULT_FOLDER = handwired/ortho60
diff --git a/keyboards/handwired/promethium/keymaps/default/keymap.c b/keyboards/handwired/promethium/keymaps/default/keymap.c
index a1ca79f9a9..faae89f935 100644
--- a/keyboards/handwired/promethium/keymaps/default/keymap.c
+++ b/keyboards/handwired/promethium/keymaps/default/keymap.c
@@ -60,7 +60,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// Fillers to make layering clearer
#define _______ KC_TRNS
#define XXXXXXX KC_NO
-#define G(x) LGUI(x)
#define KC_WWWB KC_WWW_BACK
#define KC_WWWF KC_WWW_FORWARD
diff --git a/keyboards/handwired/promethium/keymaps/priyadi/keymap.c b/keyboards/handwired/promethium/keymaps/priyadi/keymap.c
index a1ca79f9a9..faae89f935 100644
--- a/keyboards/handwired/promethium/keymaps/priyadi/keymap.c
+++ b/keyboards/handwired/promethium/keymaps/priyadi/keymap.c
@@ -60,7 +60,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// Fillers to make layering clearer
#define _______ KC_TRNS
#define XXXXXXX KC_NO
-#define G(x) LGUI(x)
#define KC_WWWB KC_WWW_BACK
#define KC_WWWF KC_WWW_FORWARD
diff --git a/keyboards/handwired/pteron/keymaps/FSund/keymap.c b/keyboards/handwired/pteron/keymaps/FSund/keymap.c
index f34beae063..a52e842977 100644
--- a/keyboards/handwired/pteron/keymaps/FSund/keymap.c
+++ b/keyboards/handwired/pteron/keymaps/FSund/keymap.c
@@ -10,10 +10,8 @@ enum pteron_layers {
#define LOWER MO(_LOWER)
#define RAISE MO(_RAISE)
-// use S() to produce shifted versions of keys
-// #define S(kc) LSFT(kc) // defined by default
-
// alt gr
+#undef G
#define G(kc) RALT(kc)
// custom keycodes
diff --git a/keyboards/handwired/qc60/README.md b/keyboards/handwired/qc60/README.md
index 85570a8a76..4fdd9ba6ef 100644
--- a/keyboards/handwired/qc60/README.md
+++ b/keyboards/handwired/qc60/README.md
@@ -1,5 +1,4 @@
-QC60
-========
+# QC60
![qc60 layout](https://i.imgur.com/BAW1VGc.png)
@@ -19,4 +18,4 @@ Example of flashing this keyboard:
make handwired/qc60/proto:avrdude
-See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information.
+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).
diff --git a/keyboards/handwired/qc60/info.json b/keyboards/handwired/qc60/info.json
index b39ec587bc..c047d50307 100644
--- a/keyboards/handwired/qc60/info.json
+++ b/keyboards/handwired/qc60/info.json
@@ -1,11 +1,93 @@
{
- "keyboard_name": "QC60",
- "url": "",
- "maintainer": "coarse",
- "width": 15,
- "height": 5,
+ "keyboard_name": "QC60",
+ "url": "",
+ "maintainer": "coarse",
+ "width": 16,
+ "height": 5,
"layouts": {
- "LAYOUT_ANSI_DEFAULT": {
+ "LAYOUT": {
+ "key_count": 67,
+ "layout": [
+ {"label":"L00", "x":0, "y":0},
+ {"label":"L01", "x":1, "y":0},
+ {"label":"L02", "x":2, "y":0},
+ {"label":"L03", "x":3, "y":0},
+ {"label":"L04", "x":4, "y":0},
+ {"label":"L05", "x":5, "y":0},
+ {"label":"L06", "x":6, "y":0},
+
+ {"label":"R00", "x":8, "y":0},
+ {"label":"R01", "x":9, "y":0},
+ {"label":"R02", "x":10, "y":0},
+ {"label":"R03", "x":11, "y":0},
+ {"label":"R04", "x":12, "y":0},
+ {"label":"R05", "x":13, "y":0},
+ {"label":"R06", "x":14, "y":0},
+ {"label":"R07", "x":15, "y":0},
+
+ {"label":"L10", "x":0, "y":1, "w":1.5},
+ {"label":"L11", "x":1.5, "y":1},
+ {"label":"L12", "x":2.5, "y":1},
+ {"label":"L13", "x":3.5, "y":1},
+ {"label":"L14", "x":4.5, "y":1},
+ {"label":"L15", "x":5.5, "y":1},
+
+ {"label":"R10", "x":7.5, "y":1},
+ {"label":"R11", "x":8.5, "y":1},
+ {"label":"R12", "x":9.5, "y":1},
+ {"label":"R13", "x":10.5, "y":1},
+ {"label":"R14", "x":11.5, "y":1},
+ {"label":"R15", "x":12.5, "y":1},
+ {"label":"R16", "x":13.5, "y":1},
+ {"label":"R17", "x":14.5, "y":1, "w":1.5},
+
+ {"label":"L20", "x":0, "y":2, "w":1.75},
+ {"label":"L21", "x":1.75, "y":2},
+ {"label":"L22", "x":2.75, "y":2},
+ {"label":"L23", "x":3.75, "y":2},
+ {"label":"L24", "x":4.75, "y":2},
+ {"label":"L25", "x":5.75, "y":2},
+
+ {"label":"R21", "x":7.75, "y":2},
+ {"label":"R22", "x":8.75, "y":2},
+ {"label":"R23", "x":9.75, "y":2},
+ {"label":"R24", "x":10.75, "y":2},
+ {"label":"R25", "x":11.75, "y":2},
+ {"label":"R26", "x":12.75, "y":2},
+ {"label":"R27", "x":13.75, "y":2, "w":2.25},
+
+ {"label":"L30", "x":0, "y":3, "w":1.25},
+ {"label":"L31", "x":1.25, "y":3},
+ {"label":"L32", "x":2.25, "y":3},
+ {"label":"L33", "x":3.25, "y":3},
+ {"label":"L34", "x":4.25, "y":3},
+ {"label":"L35", "x":5.25, "y":3},
+ {"label":"L36", "x":6.25, "y":3},
+
+ {"label":"R31", "x":8.25, "y":3},
+ {"label":"R32", "x":9.25, "y":3},
+ {"label":"R33", "x":10.25, "y":3},
+ {"label":"R34", "x":11.25, "y":3},
+ {"label":"R35", "x":12.25, "y":3},
+ {"label":"R36", "x":13.25, "y":3, "w":1.75},
+ {"label":"R37", "x":15, "y":3},
+
+ {"label":"L40", "x":0, "y":4, "w":1.25},
+ {"label":"L41", "x":1.25, "y":4, "w":1.25},
+ {"label":"L42", "x":2.5, "y":4, "w":1.25},
+ {"label":"L43", "x":3.75, "y":4, "w":2.75},
+ {"label":"L44", "x":6.5, "y":4, "w":1.25},
+
+ {"label":"R43", "x":8.75, "y":4, "w":1.25},
+ {"label":"R44", "x":10, "y":4, "w":2},
+ {"label":"R42", "x":12, "y":4},
+ {"label":"R45", "x":13, "y":4},
+ {"label":"R46", "x":14, "y":4},
+ {"label":"R47", "x":15, "y":4}
+ ]
+ },
+
+ "LAYOUT_ansi_default": {
"key_count": 64,
"layout": [
{"label":"Esc", "x":0, "y":0},
@@ -16,13 +98,13 @@
{"label":"5", "x":5, "y":0},
{"label":"6", "x":6, "y":0},
- {"label":"7", "x":7, "y":0},
- {"label":"8", "x":8, "y":0},
- {"label":"9", "x":9, "y":0},
- {"label":"0", "x":10, "y":0},
- {"label":"-", "x":11, "y":0},
- {"label":"=", "x":12, "y":0},
- {"label":"Backspace", "x":13, "y":0, "w":2.0},
+ {"label":"7", "x":8, "y":0},
+ {"label":"8", "x":9, "y":0},
+ {"label":"9", "x":10, "y":0},
+ {"label":"0", "x":11, "y":0},
+ {"label":"-", "x":12, "y":0},
+ {"label":"=", "x":13, "y":0},
+ {"label":"Backspace", "x":14, "y":0, "w":2.0},
{"label":"Tab", "x":0, "y":1, "w":1.5},
{"label":"Q", "x":1.5, "y":1},
@@ -31,14 +113,14 @@
{"label":"R", "x":4.5, "y":1},
{"label":"T", "x":5.5, "y":1},
- {"label":"Y", "x":6.5, "y":1},
- {"label":"U", "x":7.5, "y":1},
- {"label":"I", "x":8.5, "y":1},
- {"label":"O", "x":9.5, "y":1},
- {"label":"P", "x":10.5, "y":1},
- {"label":"[", "x":11.5, "y":1},
- {"label":"]", "x":12.5, "y":1},
- {"label":"\\", "x":13.5, "y":1, "w":1.5},
+ {"label":"Y", "x":7.5, "y":1},
+ {"label":"U", "x":8.5, "y":1},
+ {"label":"I", "x":9.5, "y":1},
+ {"label":"O", "x":10.5, "y":1},
+ {"label":"P", "x":11.5, "y":1},
+ {"label":"[", "x":12.5, "y":1},
+ {"label":"]", "x":13.5, "y":1},
+ {"label":"\\", "x":14.5, "y":1, "w":1.5},
{"label":"CapsLock", "x":0, "y":2, "w":1.75},
{"label":"A", "x":1.75, "y":2},
@@ -47,13 +129,13 @@
{"label":"F", "x":4.75, "y":2},
{"label":"G", "x":5.75, "y":2},
- {"label":"H", "x":6.75, "y":2},
- {"label":"J", "x":7.75, "y":2},
- {"label":"K", "x":8.75, "y":2},
- {"label":"L", "x":9.75, "y":2},
- {"label":";", "x":10.75, "y":2},
- {"label":"'", "x":11.75, "y":2},
- {"label":"Enter", "x":12.75, "y":2, "w":2.25},
+ {"label":"H", "x":7.75, "y":2},
+ {"label":"J", "x":8.75, "y":2},
+ {"label":"K", "x":9.75, "y":2},
+ {"label":"L", "x":10.75, "y":2},
+ {"label":";", "x":11.75, "y":2},
+ {"label":"'", "x":12.75, "y":2},
+ {"label":"Enter", "x":13.75, "y":2, "w":2.25},
{"label":"Shift", "x":0, "y":3, "w":2.25},
{"label":"Z", "x":2.25, "y":3},
@@ -62,12 +144,12 @@
{"label":"V", "x":5.25, "y":3},
{"label":"B", "x":6.25, "y":3},
- {"label":"N", "x":7.25, "y":3},
- {"label":"M", "x":8.25, "y":3},
- {"label":",", "x":9.25, "y":3},
- {"label":".", "x":10.25, "y":3},
- {"label":"/", "x":11.25, "y":3},
- {"label":"Shift", "x":12.25, "y":3, "w":2.75},
+ {"label":"N", "x":8.25, "y":3},
+ {"label":"M", "x":9.25, "y":3},
+ {"label":",", "x":10.25, "y":3},
+ {"label":".", "x":11.25, "y":3},
+ {"label":"/", "x":12.25, "y":3},
+ {"label":"Shift", "x":13.25, "y":3, "w":2.75},
{"label":"Ctrl", "x":0, "y":4, "w":1.25},
{"label":"Win", "x":1.25, "y":4, "w":1.25},
@@ -75,13 +157,483 @@
{"x":3.75, "y":4, "w":2.75},
{"x":6.5, "y":4, "w":1.25},
- {"x":7.75, "y":4, "w":1.25},
- {"x":9, "y":4, "w":2.0},
- {"label":"Alt", "x":11, "y":4},
- {"label":"Win", "x":12, "y":4},
- {"label":"Menu", "x":13, "y":4},
- {"label":"Ctrl", "x":14, "y":4}
+ {"x":8.75, "y":4, "w":1.25},
+ {"x":10, "y":4, "w":2.0},
+ {"label":"Alt", "x":12, "y":4},
+ {"label":"Win", "x":13, "y":4},
+ {"label":"Menu", "x":14, "y":4},
+ {"label":"Ctrl", "x":15, "y":4}
+ ]
+ },
+
+ "LAYOUT_ansi_alt": {
+ "key_count": 63,
+ "layout": [
+ {"label":"L00", "x":0, "y":0},
+ {"label":"L01", "x":1, "y":0},
+ {"label":"L02", "x":2, "y":0},
+ {"label":"L03", "x":3, "y":0},
+ {"label":"L04", "x":4, "y":0},
+ {"label":"L05", "x":5, "y":0},
+ {"label":"L06", "x":6, "y":0},
+
+ {"label":"R00", "x":8, "y":0},
+ {"label":"R01", "x":9, "y":0},
+ {"label":"R02", "x":10, "y":0},
+ {"label":"R03", "x":11, "y":0},
+ {"label":"R04", "x":12, "y":0},
+ {"label":"R05", "x":13, "y":0},
+ {"label":"R07", "x":14, "y":0, "w":2},
+
+ {"label":"L10", "x":0, "y":1, "w":1.5},
+ {"label":"L11", "x":1.5, "y":1},
+ {"label":"L12", "x":2.5, "y":1},
+ {"label":"L13", "x":3.5, "y":1},
+ {"label":"L14", "x":4.5, "y":1},
+ {"label":"L15", "x":5.5, "y":1},
+
+ {"label":"R10", "x":7.5, "y":1},
+ {"label":"R11", "x":8.5, "y":1},
+ {"label":"R12", "x":9.5, "y":1},
+ {"label":"R13", "x":10.5, "y":1},
+ {"label":"R14", "x":11.5, "y":1},
+ {"label":"R15", "x":12.5, "y":1},
+ {"label":"R16", "x":13.5, "y":1},
+ {"label":"R17", "x":14.5, "y":1, "w":1.5},
+
+ {"label":"L20", "x":0, "y":2, "w":1.75},
+ {"label":"L21", "x":1.75, "y":2},
+ {"label":"L22", "x":2.75, "y":2},
+ {"label":"L23", "x":3.75, "y":2},
+ {"label":"L24", "x":4.75, "y":2},
+ {"label":"L25", "x":5.75, "y":2},
+
+ {"label":"R21", "x":7.75, "y":2},
+ {"label":"R22", "x":8.75, "y":2},
+ {"label":"R23", "x":9.75, "y":2},
+ {"label":"R24", "x":10.75, "y":2},
+ {"label":"R25", "x":11.75, "y":2},
+ {"label":"R26", "x":12.75, "y":2},
+ {"label":"R27", "x":13.75, "y":2, "w":2.25},
+
+ {"label":"L31", "x":0, "y":3, "w":2.25},
+ {"label":"L32", "x":2.25, "y":3},
+ {"label":"L33", "x":3.25, "y":3},
+ {"label":"L34", "x":4.25, "y":3},
+ {"label":"L35", "x":5.25, "y":3},
+ {"label":"L36", "x":6.25, "y":3},
+
+ {"label":"R31", "x":8.25, "y":3},
+ {"label":"R32", "x":9.25, "y":3},
+ {"label":"R33", "x":10.25, "y":3},
+ {"label":"R34", "x":11.25, "y":3},
+ {"label":"R35", "x":12.25, "y":3},
+ {"label":"R36", "x":13.25, "y":3, "w":2.75},
+
+ {"label":"L40", "x":0, "y":4, "w":1.5},
+ {"label":"L41", "x":1.5, "y":4},
+ {"label":"L42", "x":2.5, "y":4, "w":1.5},
+ {"label":"L43", "x":4, "y":4, "w":2.75},
+ {"label":"L44", "x":6.75, "y":4},
+
+ {"label":"R43", "x":8.75, "y":4},
+ {"label":"R44", "x":9.75, "y":4, "w":2.25},
+ {"label":"R45", "x":12, "y":4, "w":1.5},
+ {"label":"R46", "x":13.5, "y":4},
+ {"label":"R47", "x":14.5, "y":4, "w":1.5}
+ ]
+ },
+
+ "LAYOUT_iso_default": {
+ "key_count": 65,
+ "layout": [
+ {"label":"L00", "x":0, "y":0},
+ {"label":"L01", "x":1, "y":0},
+ {"label":"L02", "x":2, "y":0},
+ {"label":"L03", "x":3, "y":0},
+ {"label":"L04", "x":4, "y":0},
+ {"label":"L05", "x":5, "y":0},
+ {"label":"L06", "x":6, "y":0},
+
+ {"label":"R00", "x":8, "y":0},
+ {"label":"R01", "x":9, "y":0},
+ {"label":"R02", "x":10, "y":0},
+ {"label":"R03", "x":11, "y":0},
+ {"label":"R04", "x":12, "y":0},
+ {"label":"R05", "x":13, "y":0},
+ {"label":"R07", "x":14, "y":0, "w":2},
+
+ {"label":"L10", "x":0, "y":1, "w":1.5},
+ {"label":"L11", "x":1.5, "y":1},
+ {"label":"L12", "x":2.5, "y":1},
+ {"label":"L13", "x":3.5, "y":1},
+ {"label":"L14", "x":4.5, "y":1},
+ {"label":"L15", "x":5.5, "y":1},
+
+ {"label":"R10", "x":7.5, "y":1},
+ {"label":"R11", "x":8.5, "y":1},
+ {"label":"R12", "x":9.5, "y":1},
+ {"label":"R13", "x":10.5, "y":1},
+ {"label":"R14", "x":11.5, "y":1},
+ {"label":"R15", "x":12.5, "y":1},
+ {"label":"R16", "x":13.5, "y":1},
+
+ {"label":"L20", "x":0, "y":2, "w":1.75},
+ {"label":"L21", "x":1.75, "y":2},
+ {"label":"L22", "x":2.75, "y":2},
+ {"label":"L23", "x":3.75, "y":2},
+ {"label":"L24", "x":4.75, "y":2},
+ {"label":"L25", "x":5.75, "y":2},
+
+ {"label":"R21", "x":7.75, "y":2},
+ {"label":"R22", "x":8.75, "y":2},
+ {"label":"R23", "x":9.75, "y":2},
+ {"label":"R24", "x":10.75, "y":2},
+ {"label":"R25", "x":11.75, "y":2},
+ {"label":"R26", "x":12.75, "y":2},
+ {"label":"R17", "x":13.75, "y":2},
+ {"label":"R27", "x":14.75, "y":1, "w":1.25, "h":2},
+
+ {"label":"L30", "x":0, "y":3, "w":1.25},
+ {"label":"L31", "x":1.25, "y":3},
+ {"label":"L32", "x":2.25, "y":3},
+ {"label":"L33", "x":3.25, "y":3},
+ {"label":"L34", "x":4.25, "y":3},
+ {"label":"L35", "x":5.25, "y":3},
+ {"label":"L36", "x":6.25, "y":3},
+
+ {"label":"R31", "x":8.25, "y":3},
+ {"label":"R32", "x":9.25, "y":3},
+ {"label":"R33", "x":10.25, "y":3},
+ {"label":"R34", "x":11.25, "y":3},
+ {"label":"R35", "x":12.25, "y":3},
+ {"label":"R36", "x":13.25, "y":3, "w":2.75},
+
+ {"label":"L40", "x":0, "y":4, "w":1.25},
+ {"label":"L41", "x":1.25, "y":4, "w":1.25},
+ {"label":"L42", "x":2.5, "y":4, "w":1.25},
+ {"label":"L43", "x":3.75, "y":4, "w":2.75},
+ {"label":"L44", "x":6.5, "y":4, "w":1.25},
+
+ {"label":"R43", "x":8.75, "y":4, "w":1.25},
+ {"label":"R44", "x":10, "y":4, "w":2},
+ {"label":"R42", "x":12, "y":4},
+ {"label":"R45", "x":13, "y":4},
+ {"label":"R46", "x":14, "y":4},
+ {"label":"R47", "x":15, "y":4}
+ ]
+ },
+
+ "LAYOUT_iso_alt": {
+ "key_count": 64,
+ "layout": [
+ {"label":"L00", "x":0, "y":0},
+ {"label":"L01", "x":1, "y":0},
+ {"label":"L02", "x":2, "y":0},
+ {"label":"L03", "x":3, "y":0},
+ {"label":"L04", "x":4, "y":0},
+ {"label":"L05", "x":5, "y":0},
+ {"label":"L06", "x":6, "y":0},
+
+ {"label":"R00", "x":8, "y":0},
+ {"label":"R01", "x":9, "y":0},
+ {"label":"R02", "x":10, "y":0},
+ {"label":"R03", "x":11, "y":0},
+ {"label":"R04", "x":12, "y":0},
+ {"label":"R05", "x":13, "y":0},
+ {"label":"R07", "x":14, "y":0, "w":2},
+
+ {"label":"L10", "x":0, "y":1, "w":1.5},
+ {"label":"L11", "x":1.5, "y":1},
+ {"label":"L12", "x":2.5, "y":1},
+ {"label":"L13", "x":3.5, "y":1},
+ {"label":"L14", "x":4.5, "y":1},
+ {"label":"L15", "x":5.5, "y":1},
+
+ {"label":"R10", "x":7.5, "y":1},
+ {"label":"R11", "x":8.5, "y":1},
+ {"label":"R12", "x":9.5, "y":1},
+ {"label":"R13", "x":10.5, "y":1},
+ {"label":"R14", "x":11.5, "y":1},
+ {"label":"R15", "x":12.5, "y":1},
+ {"label":"R16", "x":13.5, "y":1},
+
+ {"label":"L20", "x":0, "y":2, "w":1.75},
+ {"label":"L21", "x":1.75, "y":2},
+ {"label":"L22", "x":2.75, "y":2},
+ {"label":"L23", "x":3.75, "y":2},
+ {"label":"L24", "x":4.75, "y":2},
+ {"label":"L25", "x":5.75, "y":2},
+
+ {"label":"R21", "x":7.75, "y":2},
+ {"label":"R22", "x":8.75, "y":2},
+ {"label":"R23", "x":9.75, "y":2},
+ {"label":"R24", "x":10.75, "y":2},
+ {"label":"R25", "x":11.75, "y":2},
+ {"label":"R26", "x":12.75, "y":2},
+ {"label":"R17", "x":13.75, "y":2},
+ {"label":"R27", "x":14.75, "y":1, "w":1.25, "h":2},
+
+ {"label":"L30", "x":0, "y":3, "w":1.25},
+ {"label":"L31", "x":1.25, "y":3},
+ {"label":"L32", "x":2.25, "y":3},
+ {"label":"L33", "x":3.25, "y":3},
+ {"label":"L34", "x":4.25, "y":3},
+ {"label":"L35", "x":5.25, "y":3},
+ {"label":"L36", "x":6.25, "y":3},
+
+ {"label":"R31", "x":8.25, "y":3},
+ {"label":"R32", "x":9.25, "y":3},
+ {"label":"R33", "x":10.25, "y":3},
+ {"label":"R34", "x":11.25, "y":3},
+ {"label":"R35", "x":12.25, "y":3},
+ {"label":"R36", "x":13.25, "y":3, "w":2.75},
+
+ {"label":"L40", "x":0, "y":4, "w":1.5},
+ {"label":"L41", "x":1.5, "y":4},
+ {"label":"L42", "x":2.5, "y":4, "w":1.5},
+ {"label":"L43", "x":4, "y":4, "w":2.75},
+ {"label":"L44", "x":6.75, "y":4},
+
+ {"label":"R43", "x":8.75, "y":4},
+ {"label":"R44", "x":9.75, "y":4, "w":2.25},
+ {"label":"R45", "x":12, "y":4, "w":1.5},
+ {"label":"R46", "x":13.5, "y":4},
+ {"label":"R47", "x":14.5, "y":4, "w":1.5}
+ ]
+ },
+
+ "LAYOUT_hhkb_default": {
+ "key_count": 63,
+ "layout": [
+ {"label":"L00", "x":0, "y":0},
+ {"label":"L01", "x":1, "y":0},
+ {"label":"L02", "x":2, "y":0},
+ {"label":"L03", "x":3, "y":0},
+ {"label":"L04", "x":4, "y":0},
+ {"label":"L05", "x":5, "y":0},
+ {"label":"L06", "x":6, "y":0},
+
+ {"label":"R00", "x":8, "y":0},
+ {"label":"R01", "x":9, "y":0},
+ {"label":"R02", "x":10, "y":0},
+ {"label":"R03", "x":11, "y":0},
+ {"label":"R04", "x":12, "y":0},
+ {"label":"R05", "x":13, "y":0},
+ {"label":"R06", "x":14, "y":0},
+ {"label":"R07", "x":15, "y":0},
+
+ {"label":"L10", "x":0, "y":1, "w":1.5},
+ {"label":"L11", "x":1.5, "y":1},
+ {"label":"L12", "x":2.5, "y":1},
+ {"label":"L13", "x":3.5, "y":1},
+ {"label":"L14", "x":4.5, "y":1},
+ {"label":"L15", "x":5.5, "y":1},
+
+ {"label":"R10", "x":7.5, "y":1},
+ {"label":"R11", "x":8.5, "y":1},
+ {"label":"R12", "x":9.5, "y":1},
+ {"label":"R13", "x":10.5, "y":1},
+ {"label":"R14", "x":11.5, "y":1},
+ {"label":"R15", "x":12.5, "y":1},
+ {"label":"R16", "x":13.5, "y":1},
+ {"label":"R17", "x":14.5, "y":1, "w":1.5},
+
+ {"label":"L20", "x":0, "y":2, "w":1.75},
+ {"label":"L21", "x":1.75, "y":2},
+ {"label":"L22", "x":2.75, "y":2},
+ {"label":"L23", "x":3.75, "y":2},
+ {"label":"L24", "x":4.75, "y":2},
+ {"label":"L25", "x":5.75, "y":2},
+
+ {"label":"R21", "x":7.75, "y":2},
+ {"label":"R22", "x":8.75, "y":2},
+ {"label":"R23", "x":9.75, "y":2},
+ {"label":"R24", "x":10.75, "y":2},
+ {"label":"R25", "x":11.75, "y":2},
+ {"label":"R26", "x":12.75, "y":2},
+ {"label":"R27", "x":13.75, "y":2, "w":2.25},
+
+ {"label":"L31", "x":0, "y":3, "w":2.25},
+ {"label":"L32", "x":2.25, "y":3},
+ {"label":"L33", "x":3.25, "y":3},
+ {"label":"L34", "x":4.25, "y":3},
+ {"label":"L35", "x":5.25, "y":3},
+ {"label":"L36", "x":6.25, "y":3},
+
+ {"label":"R31", "x":8.25, "y":3},
+ {"label":"R32", "x":9.25, "y":3},
+ {"label":"R33", "x":10.25, "y":3},
+ {"label":"R34", "x":11.25, "y":3},
+ {"label":"R35", "x":12.25, "y":3},
+ {"label":"R36", "x":13.25, "y":3, "w":1.75},
+ {"label":"R37", "x":15, "y":3},
+
+ {"label":"L41", "x":1.5, "y":4},
+ {"label":"L42", "x":2.5, "y":4, "w":1.5},
+ {"label":"L43", "x":4, "y":4, "w":2.75},
+ {"label":"L44", "x":6.75, "y":4},
+
+ {"label":"R43", "x":8.75, "y":4},
+ {"label":"R44", "x":9.75, "y":4, "w":2.25},
+ {"label":"R45", "x":12, "y":4, "w":1.5},
+ {"label":"R46", "x":13.5, "y":4}
+ ]
+ },
+
+ "LAYOUT_hhkb_split_lshift": {
+ "key_count": 64,
+ "layout": [
+ {"label":"L00", "x":0, "y":0},
+ {"label":"L01", "x":1, "y":0},
+ {"label":"L02", "x":2, "y":0},
+ {"label":"L03", "x":3, "y":0},
+ {"label":"L04", "x":4, "y":0},
+ {"label":"L05", "x":5, "y":0},
+ {"label":"L06", "x":6, "y":0},
+
+ {"label":"R00", "x":8, "y":0},
+ {"label":"R01", "x":9, "y":0},
+ {"label":"R02", "x":10, "y":0},
+ {"label":"R03", "x":11, "y":0},
+ {"label":"R04", "x":12, "y":0},
+ {"label":"R05", "x":13, "y":0},
+ {"label":"R06", "x":14, "y":0},
+ {"label":"R07", "x":15, "y":0},
+
+ {"label":"L10", "x":0, "y":1, "w":1.5},
+ {"label":"L11", "x":1.5, "y":1},
+ {"label":"L12", "x":2.5, "y":1},
+ {"label":"L13", "x":3.5, "y":1},
+ {"label":"L14", "x":4.5, "y":1},
+ {"label":"L15", "x":5.5, "y":1},
+
+ {"label":"R10", "x":7.5, "y":1},
+ {"label":"R11", "x":8.5, "y":1},
+ {"label":"R12", "x":9.5, "y":1},
+ {"label":"R13", "x":10.5, "y":1},
+ {"label":"R14", "x":11.5, "y":1},
+ {"label":"R15", "x":12.5, "y":1},
+ {"label":"R16", "x":13.5, "y":1},
+ {"label":"R17", "x":14.5, "y":1, "w":1.5},
+
+ {"label":"L20", "x":0, "y":2, "w":1.75},
+ {"label":"L21", "x":1.75, "y":2},
+ {"label":"L22", "x":2.75, "y":2},
+ {"label":"L23", "x":3.75, "y":2},
+ {"label":"L24", "x":4.75, "y":2},
+ {"label":"L25", "x":5.75, "y":2},
+
+ {"label":"R21", "x":7.75, "y":2},
+ {"label":"R22", "x":8.75, "y":2},
+ {"label":"R23", "x":9.75, "y":2},
+ {"label":"R24", "x":10.75, "y":2},
+ {"label":"R25", "x":11.75, "y":2},
+ {"label":"R26", "x":12.75, "y":2},
+ {"label":"R27", "x":13.75, "y":2, "w":2.25},
+
+ {"label":"L30", "x":0, "y":3, "w":1.25},
+ {"label":"L31", "x":1.25, "y":3},
+ {"label":"L32", "x":2.25, "y":3},
+ {"label":"L33", "x":3.25, "y":3},
+ {"label":"L34", "x":4.25, "y":3},
+ {"label":"L35", "x":5.25, "y":3},
+ {"label":"L36", "x":6.25, "y":3},
+
+ {"label":"R31", "x":8.25, "y":3},
+ {"label":"R32", "x":9.25, "y":3},
+ {"label":"R33", "x":10.25, "y":3},
+ {"label":"R34", "x":11.25, "y":3},
+ {"label":"R35", "x":12.25, "y":3},
+ {"label":"R36", "x":13.25, "y":3, "w":1.75},
+ {"label":"R37", "x":15, "y":3},
+
+ {"label":"L41", "x":1.5, "y":4},
+ {"label":"L42", "x":2.5, "y":4, "w":1.5},
+ {"label":"L43", "x":4, "y":4, "w":2.75},
+ {"label":"L44", "x":6.75, "y":4},
+
+ {"label":"R43", "x":8.75, "y":4},
+ {"label":"R44", "x":9.75, "y":4, "w":2.25},
+ {"label":"R45", "x":12, "y":4, "w":1.5},
+ {"label":"R46", "x":13.5, "y":4}
+ ]
+ },
+
+ "LAYOUT_wkl_default": {
+ "key_count": 61,
+ "layout": [
+ {"label":"L00", "x":0, "y":0},
+ {"label":"L01", "x":1, "y":0},
+ {"label":"L02", "x":2, "y":0},
+ {"label":"L03", "x":3, "y":0},
+ {"label":"L04", "x":4, "y":0},
+ {"label":"L05", "x":5, "y":0},
+ {"label":"L06", "x":6, "y":0},
+
+ {"label":"R00", "x":8, "y":0},
+ {"label":"R01", "x":9, "y":0},
+ {"label":"R02", "x":10, "y":0},
+ {"label":"R03", "x":11, "y":0},
+ {"label":"R04", "x":12, "y":0},
+ {"label":"R05", "x":13, "y":0},
+ {"label":"R07", "x":14, "y":0, "w":2},
+
+ {"label":"L10", "x":0, "y":1, "w":1.5},
+ {"label":"L11", "x":1.5, "y":1},
+ {"label":"L12", "x":2.5, "y":1},
+ {"label":"L13", "x":3.5, "y":1},
+ {"label":"L14", "x":4.5, "y":1},
+ {"label":"L15", "x":5.5, "y":1},
+
+ {"label":"R10", "x":7.5, "y":1},
+ {"label":"R11", "x":8.5, "y":1},
+ {"label":"R12", "x":9.5, "y":1},
+ {"label":"R13", "x":10.5, "y":1},
+ {"label":"R14", "x":11.5, "y":1},
+ {"label":"R15", "x":12.5, "y":1},
+ {"label":"R16", "x":13.5, "y":1},
+ {"label":"R17", "x":14.5, "y":1, "w":1.5},
+
+ {"label":"L20", "x":0, "y":2, "w":1.75},
+ {"label":"L21", "x":1.75, "y":2},
+ {"label":"L22", "x":2.75, "y":2},
+ {"label":"L23", "x":3.75, "y":2},
+ {"label":"L24", "x":4.75, "y":2},
+ {"label":"L25", "x":5.75, "y":2},
+
+ {"label":"R21", "x":7.75, "y":2},
+ {"label":"R22", "x":8.75, "y":2},
+ {"label":"R23", "x":9.75, "y":2},
+ {"label":"R24", "x":10.75, "y":2},
+ {"label":"R25", "x":11.75, "y":2},
+ {"label":"R26", "x":12.75, "y":2},
+ {"label":"R27", "x":13.75, "y":2, "w":2.25},
+
+ {"label":"L31", "x":0, "y":3, "w":2.25},
+ {"label":"L32", "x":2.25, "y":3},
+ {"label":"L33", "x":3.25, "y":3},
+ {"label":"L34", "x":4.25, "y":3},
+ {"label":"L35", "x":5.25, "y":3},
+ {"label":"L36", "x":6.25, "y":3},
+
+ {"label":"R31", "x":8.25, "y":3},
+ {"label":"R32", "x":9.25, "y":3},
+ {"label":"R33", "x":10.25, "y":3},
+ {"label":"R34", "x":11.25, "y":3},
+ {"label":"R35", "x":12.25, "y":3},
+ {"label":"R36", "x":13.25, "y":3, "w":2.75},
+
+ {"label":"L40", "x":0, "y":4, "w":1.5},
+ {"label":"L42", "x":2.5, "y":4, "w":1.5},
+ {"label":"L43", "x":4, "y":4, "w":2.75},
+ {"label":"L44", "x":6.75, "y":4},
+
+ {"label":"R43", "x":8.75, "y":4},
+ {"label":"R44", "x":9.75, "y":4, "w":2.25},
+ {"label":"R45", "x":12, "y":4, "w":1.5},
+ {"label":"R47", "x":14.5, "y":4, "w":1.5}
]
}
}
-} \ No newline at end of file
+}
diff --git a/keyboards/handwired/qc60/keymaps/default/keymap.c b/keyboards/handwired/qc60/keymaps/default/keymap.c
index bafaf5058e..88062d4ed4 100644
--- a/keyboards/handwired/qc60/keymaps/default/keymap.c
+++ b/keyboards/handwired/qc60/keymaps/default/keymap.c
@@ -24,9 +24,6 @@ extern keymap_config_t keymap_config;
// entirely and just use numbers.
#define _BASE 0
-#define _______ KC_TRNS
-#define XXXXXXX KC_NO
-
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT_ansi_default(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \
diff --git a/keyboards/handwired/qc60/keymaps/wntrmln/keymap.c b/keyboards/handwired/qc60/keymaps/wntrmln/keymap.c
index f99635d531..f024ddb4b9 100644
--- a/keyboards/handwired/qc60/keymaps/wntrmln/keymap.c
+++ b/keyboards/handwired/qc60/keymaps/wntrmln/keymap.c
@@ -25,9 +25,6 @@ extern keymap_config_t keymap_config;
#define _BASE 0
#define _FN 1
-#define _______ KC_TRNS
-#define XXXXXXX KC_NO
-
#define FN MO(_FN)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
diff --git a/keyboards/handwired/qc60/proto/proto.h b/keyboards/handwired/qc60/proto/proto.h
index 191e8150a7..7e7755d0e2 100644
--- a/keyboards/handwired/qc60/proto/proto.h
+++ b/keyboards/handwired/qc60/proto/proto.h
@@ -14,8 +14,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef PROTO_H
-#define PROTO_H
+#pragma once
#include "qc60.h"
@@ -26,10 +25,10 @@
/* Split Backspace
* {R07, XXX, R05, R04, R03, R02, R01, R00}
- *
+ *
* Split Right Shift
* {R37, R36, R35, R34, R33, R32, R31, XXX}
- *
+ *
* Split Left Shift
* {L30, L31, L32, L33, L34, L35, L36, XXX}
*
@@ -101,14 +100,14 @@
L00, L01, L02, L03, L04, L05, L06, R00, R01, R02, R03, R04, R05, R07, \
L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, R16, \
L20, L21, L22, L23, L24, L25, R21, R22, R23, R24, R25, R26, R17, R27, \
- L31, L32, L33, L34, L35, L36, R31, R32, R33, R34, R35, R36, \
+ L30, L31, L32, L33, L34, L35, L36, R31, R32, R33, R34, R35, R36, \
L40, L41, L42, L43, L44, R43, R44, R42, R45, R46, R47 \
) \
{ \
{L00, L01, L02, L03, L04, L05, L06, XXX}, \
{L10, L11, L12, L13, L14, L15, XXX, XXX}, \
{L20, L21, L22, L23, L24, L25, XXX, XXX}, \
- {XXX, L31, L32, L33, L34, L35, L36, XXX}, \
+ {L30, L31, L32, L33, L34, L35, L36, XXX}, \
{L40, L41, L42, L43, L44, XXX, XXX, XXX}, \
{R07, XXX, R05, R04, R03, R02, R01, R00}, \
{R17, R16, R15, R14, R13, R12, R11, R10}, \
@@ -118,17 +117,17 @@
}
#define LAYOUT_iso_alt( \
- L00, L01, L02, L03, L04, L05, L06, R00, R01, R02, R03, R04, R05, R07, \
- L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, R16, R17, \
- L20, L21, L22, L23, L24, L25, R21, R22, R23, R24, R25, R26, R27, \
- L31, L32, L33, L34, L35, L36, R31, R32, R33, R34, R35, R36, \
- L40, L41, L42, L43, L44, R43, R44, R45, R46, R47 \
+ L00, L01, L02, L03, L04, L05, L06, R00, R01, R02, R03, R04, R05, R07, \
+ L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, R16, \
+ L20, L21, L22, L23, L24, L25, R21, R22, R23, R24, R25, R26, R17, R27, \
+ L30, L31, L32, L33, L34, L35, L36, R31, R32, R33, R34, R35, R36, \
+ L40, L41, L42, L43, L44, R43, R44, R45, R46, R47 \
) \
{ \
{L00, L01, L02, L03, L04, L05, L06, XXX}, \
{L10, L11, L12, L13, L14, L15, XXX, XXX}, \
{L20, L21, L22, L23, L24, L25, XXX, XXX}, \
- {XXX, L31, L32, L33, L34, L35, L36, XXX}, \
+ {L30, L31, L32, L33, L34, L35, L36, XXX}, \
{L40, L41, L42, L43, L44, XXX, XXX, XXX}, \
{R07, XXX, R05, R04, R03, R02, R01, R00}, \
{R17, R16, R15, R14, R13, R12, R11, R10}, \
@@ -196,6 +195,3 @@
{XXX, R36, R35, R34, R33, R32, R31, XXX}, \
{R47, XXX, R45, R44, R43, XXX, XXX, XXX}, \
}
-
-
-#endif
diff --git a/keyboards/handwired/reddot/info.json b/keyboards/handwired/reddot/info.json
new file mode 100644
index 0000000000..1fcc8677e8
--- /dev/null
+++ b/keyboards/handwired/reddot/info.json
@@ -0,0 +1,108 @@
+{
+ "keyboard_name": "handwired/reddot",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 20.5,
+ "height": 5,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label":"k00 (Esc)", "x":0, "y":0},
+ {"label":"k01 (F1)", "x":1, "y":0},
+ {"label":"k02 (F2)", "x":2, "y":0},
+ {"label":"k03 (F3)", "x":3, "y":0},
+ {"label":"k04 (F4)", "x":4, "y":0},
+ {"label":"k05 (F5)", "x":5, "y":0},
+ {"label":"k06 (Tab)", "x":6, "y":0, "w":2},
+ {"label":"k07 (Caps Lock)", "x":8, "y":0},
+ {"label":"k08 (F6)", "x":9, "y":0},
+ {"label":"k09 (F7)", "x":10, "y":0},
+ {"label":"k0A (F8)", "x":11, "y":0},
+ {"label":"k0B (F9)", "x":12, "y":0},
+ {"label":"k0C (F10)", "x":13, "y":0},
+ {"label":"k0D (F11)", "x":14, "y":0},
+ {"label":"k0E (F12)", "x":15, "y":0},
+ {"label":"k10 (Function)", "x":16.5, "y":0},
+ {"label":"k11 (Keypad /)", "x":17.5, "y":0},
+ {"label":"k12 (Keypad *)", "x":18.5, "y":0},
+ {"label":"k13 (Keypad -)", "x":19.5, "y":0},
+
+ {"label":"k20 (Left Alt)", "x":0, "y":1},
+ {"label":"k21 (1 / FR Ampersand)", "x":1, "y":1},
+ {"label":"k22 (2 / FR É)", "x":2, "y":1},
+ {"label":"k23 (3 / FR Quote)", "x":3, "y":1},
+ {"label":"k24 (4 / FR Apostrophe)", "x":4, "y":1},
+ {"label":"k25 (5 / FR Left Parenthesis)", "x":5, "y":1},
+ {"label":"k26 (Backspace)", "x":6, "y":1, "w":2},
+ {"label":"k27 (Delete)", "x":8, "y":1},
+ {"label":"k28 (6 / FR Minus)", "x":9, "y":1},
+ {"label":"k29 (7 / FR È)", "x":10, "y":1},
+ {"label":"k2A (8 / FR Underscore)", "x":11, "y":1},
+ {"label":"k2B (9 / FR Ç)", "x":12, "y":1},
+ {"label":"k2C (0 / FR À)", "x":13, "y":1},
+ {"label":"k2D (Minus / FR Right Parenthesis)", "x":14, "y":1},
+ {"label":"k2E (Equals / FR Equals)", "x":15, "y":1},
+ {"label":"k30 (Insert)", "x":16.5, "y":1},
+ {"label":"k31 (Home)", "x":17.5, "y":1},
+ {"label":"k32 (Page Up)", "x":18.5, "y":1},
+
+ {"label":"k40 (GUI)", "x":0, "y":2},
+ {"label":"k41 (Q / FR A)", "x":1, "y":2},
+ {"label":"k42 (W / FR Z)", "x":2, "y":2},
+ {"label":"k43 (E)", "x":3, "y":2},
+ {"label":"k44 (R)", "x":4, "y":2},
+ {"label":"k45 (T)", "x":5, "y":2},
+ {"label":"k46 (Shift)", "x":6, "y":2, "h":2},
+ {"label":"k66 (Enter)", "x":7, "y":2, "h":2},
+ {"label":"k47 (Enter)", "x":8, "y":2, "h":2},
+ {"label":"k48 (Y)", "x":9, "y":2},
+ {"label":"k49 (U)", "x":10, "y":2},
+ {"label":"k4A (I)", "x":11, "y":2},
+ {"label":"k4B (O)", "x":12, "y":2},
+ {"label":"k4C (P)", "x":13, "y":2},
+ {"label":"k4D (Left Bracket / FR Circumflex)", "x":14, "y":2},
+ {"label":"k4E (Right Bracket / FR Dollar)", "x":15, "y":2},
+ {"label":"k50 (Delete)", "x":16.5, "y":2},
+ {"label":"k51 (End)", "x":17.5, "y":2},
+ {"label":"k52 (Page Down)", "x":18.5, "y":2},
+ {"label":"k53 (Keypad +)", "x":19.5, "y":1, "h":2},
+
+ {"label":"k60 (Ctrl)", "x":0, "y":3},
+ {"label":"k61 (A / FR Q)", "x":1, "y":3},
+ {"label":"k62 (S)", "x":2, "y":3},
+ {"label":"k63 (D)", "x":3, "y":3},
+ {"label":"k64 (F)", "x":4, "y":3},
+ {"label":"k65 (G)", "x":5, "y":3},
+ {"label":"k68 (H)", "x":9, "y":3},
+ {"label":"k69 (J)", "x":10, "y":3},
+ {"label":"k6A (K)", "x":11, "y":3},
+ {"label":"k6B (L)", "x":12, "y":3},
+ {"label":"k6C (Semicolon / FR M)", "x":13, "y":3},
+ {"label":"k6D (Quote / FR Ù)", "x":14, "y":3},
+ {"label":"k6E (ISO Hash / FR Asterisk)", "x":15, "y":3},
+ {"label":"k70 (Keypad 1)", "x":16.5, "y":3},
+ {"label":"k71 (Up)", "x":17.5, "y":3},
+ {"label":"k72 (Keypad 3)", "x":18.5, "y":3},
+
+ {"label":"k80 (ISO Backslash / FR Less Than)", "x":0, "y":4},
+ {"label":"k81 (Z / FR W)", "x":1, "y":4},
+ {"label":"k82 (X)", "x":2, "y":4},
+ {"label":"k83 (C)", "x":3, "y":4},
+ {"label":"k84 (V)", "x":4, "y":4},
+ {"label":"k85 (B)", "x":5, "y":4},
+ {"label":"k86 (Space)", "x":6, "y":4, "w":2},
+ {"label":"k88 (Space)", "x":8, "y":4, "w":2},
+ {"label":"k89 (N)", "x":10, "y":4},
+ {"label":"k8A (M / FR Comma)", "x":11, "y":4},
+ {"label":"k8B (Comma / FR Semicolon)", "x":12, "y":4},
+ {"label":"k8C (Period / Colon)", "x":13, "y":4},
+ {"label":"k8D (Slash / FR Exclaim)", "x":14, "y":4},
+ {"label":"k8E (Right Alt / FR AltGr)", "x":15, "y":4},
+ {"label":"k90 (Left)", "x":16.5, "y":4},
+ {"label":"k91 (Down)", "x":17.5, "y":4},
+ {"label":"k92 (Right)", "x":18.5, "y":4},
+ {"label":"k93 (Keypad Enter)", "x":19.5, "y":3, "h":2}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/reddot/keymaps/default/keymap.c b/keyboards/handwired/reddot/keymaps/default/keymap.c
index 73aeff2252..246a03b4d7 100755..100644
--- a/keyboards/handwired/reddot/keymaps/default/keymap.c
+++ b/keyboards/handwired/reddot/keymaps/default/keymap.c
@@ -1,29 +1,22 @@
-#include "reddot.h"
-#include "../../../../../quantum/keymap_extras/keymap_french.h"
+#include QMK_KEYBOARD_H
+#include "keymap_french.h"
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = KEYMAP(
- KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TAB, KC_CAPS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_FN0, KC_KP_SLASH, KC_KP_ASTERISK, KC_KP_MINUS,\
- KC_LALT, FR_AMP, FR_EACU, FR_QUOT, FR_APOS, FR_LPRN, KC_BSPACE, KC_DELETE, FR_MINS, FR_EGRV, FR_UNDS, FR_CCED, FR_AGRV, FR_RPRN, FR_EQL, KC_INSERT, KC_HOME, KC_PGUP,\
- KC_LGUI, FR_A, FR_Z, KC_E, KC_R, KC_T, KC_LSFT, KC_ENT, KC_Y, KC_U, KC_I, KC_O, KC_P, FR_CIRC, FR_DLR, KC_DELETE, KC_END, KC_PGDOWN, KC_KP_PLUS,\
- KC_LCTL, FR_Q, KC_S, KC_D, KC_F, KC_G, KC_ENT, KC_H, KC_J, KC_K, KC_L, FR_M, FR_UGRV, FR_ASTR, KC_KP_1, KC_UP, KC_KP_3,\
- FR_LESS, FR_W, KC_X, KC_C, KC_V, KC_B, KC_SPACE, KC_SPACE, KC_N, FR_COMM, FR_SCLN, FR_COLN, FR_EXLM, KC_ALGR, KC_LEFT, KC_DOWN, KC_RIGHT, KC_KP_ENTER),
-
- [1] = KEYMAP(
- KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TAB, KC_CAPS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_FN0, KC_KP_SLASH, KC_KP_ASTERISK, KC_KP_MINUS,\
- KC_LALT, FR_AMP, FR_EACU, FR_QUOT, FR_APOS, FR_LPRN, KC_BSPACE, KC_DELETE, FR_MINS, FR_EGRV, FR_UNDS, FR_CCED, FR_AGRV, FR_RPRN, FR_EQL, KC_7, KC_8, KC_9,\
- KC_LGUI, FR_A, FR_Z, KC_E, KC_R, KC_T, KC_LSFT, KC_ENT, KC_Y, KC_U, KC_I, KC_O, KC_P, FR_CIRC, FR_DLR, KC_4, KC_5, KC_6, KC_KP_PLUS,\
- KC_LCTL, FR_Q, KC_S, KC_D, KC_F, KC_G, KC_ENT, KC_H, KC_J, KC_K, KC_L, FR_M, FR_UGRV, FR_ASTR, KC_1, KC_2, KC_3,\
- FR_LESS, FR_W, KC_X, KC_C, KC_V, KC_B, KC_SPACE, KC_SPACE, KC_N, FR_COMM, FR_SCLN, FR_COLN, FR_EXLM, KC_ALGR, KC_LEFT, KC_DOWN, KC_RIGHT, KC_KP_ENTER),
-};
+ [0] = LAYOUT(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TAB, KC_CAPS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, TG(1), KC_PSLS, KC_PAST, KC_PMNS, \
+ KC_LALT, FR_AMP, FR_EACU, FR_QUOT, FR_APOS, FR_LPRN, KC_BSPC, KC_DEL, FR_MINS, FR_EGRV, FR_UNDS, FR_CCED, FR_AGRV, FR_RPRN, FR_EQL, KC_INS, KC_HOME, KC_PGUP, \
+ KC_LGUI, FR_A, FR_Z, KC_E, KC_R, KC_T, KC_LSFT, KC_ENT, KC_ENT, KC_Y, KC_U, KC_I, KC_O, KC_P, FR_CIRC, FR_DLR, KC_DEL, KC_END, KC_PGDN, KC_PPLS, \
+ KC_LCTL, FR_Q, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, FR_M, FR_UGRV, FR_ASTR, KC_P1, KC_UP, KC_P3, \
+ FR_LESS, FR_W, KC_X, KC_C, KC_V, KC_B, KC_SPC, KC_SPC, KC_N, FR_COMM, FR_SCLN, FR_COLN, FR_EXLM, KC_ALGR, KC_LEFT, KC_DOWN, KC_RGHT, KC_PENT \
+ ),
+ [1] = LAYOUT(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TAB, KC_CAPS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_PSLS, KC_PAST, KC_PMNS, \
+ KC_LALT, FR_AMP, FR_EACU, FR_QUOT, FR_APOS, FR_LPRN, KC_BSPC, KC_DEL, FR_MINS, FR_EGRV, FR_UNDS, FR_CCED, FR_AGRV, FR_RPRN, FR_EQL, KC_7, KC_8, KC_9, \
+ KC_LGUI, FR_A, FR_Z, KC_E, KC_R, KC_T, KC_LSFT, KC_ENT, KC_ENT, KC_Y, KC_U, KC_I, KC_O, KC_P, FR_CIRC, FR_DLR, KC_4, KC_5, KC_6, KC_PPLS, \
+ KC_LCTL, FR_Q, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, FR_M, FR_UGRV, FR_ASTR, KC_1, KC_2, KC_3, \
+ FR_LESS, FR_W, KC_X, KC_C, KC_V, KC_B, KC_SPC, KC_SPC, KC_N, FR_COMM, FR_SCLN, FR_COLN, FR_EXLM, KC_ALGR, KC_LEFT, KC_DOWN, KC_RGHT, KC_PENT \
+ ),
-const uint16_t PROGMEM fn_actions[] = {
- ACTION_LAYER_TOGGLE(1),
};
-
-const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
- return MACRO_NONE;
-};
-
diff --git a/keyboards/handwired/reddot/readme.md b/keyboards/handwired/reddot/readme.md
index 8cdbb47d66..27c8b54d60 100755
--- a/keyboards/handwired/reddot/readme.md
+++ b/keyboards/handwired/reddot/readme.md
@@ -1,24 +1,14 @@
-## RedDot Specific Info ##
+# RedDot
+An ortholinear compact fullsize keyboard configured for French AZERTY layout.
-## Quantum MK Firmware
+- [Layout](http://www.keyboard-layout-editor.com/##@_plate:true%3B&@_sm=cherry&sb=cherry&st=MX1A-L1xx%3B&=Esc&=F1&=F2&=F3&=F4&=F5&_w:2%3B&=Tab&=Caps%20Lock&=F6&=F7&=F8&=F9&=F10&=F11&=F12&_x:0.5%3B&=Fn&=%2F%2F&=*&=-%3B&@=Alt&=1%0A%2F&&=2%0A%C3%A9%0A%0A~&=3%0A%22%0A%0A%23&=4%0A'%0A%0A%7B&=5%0A(%0A%0A%5B&_w:2%3B&=Back&=Del&=6%0A-%0A%0A%7C&=7%0A%C3%A8%0A%0A%60&=8%0A%2F_%0A%0A%5C&=9%0A%C3%A7%0A%0A%5E&=0%0A%C3%A0%0A%0A%2F@&=%C2%B0%0A)%0A%0A%5D&=+%0A%2F=%0A%0A%7D&_x:0.5%3B&=Insert&=Home&=Page%20Up&_h:2%3B&=+%3B&@=Win&=A&=Z&=E&=R&=T&_h:2%3B&=Shift&_h:2%3B&=Enter&_h:2%3B&=Enter&=Y&=U&=I&=O&=P&=%C2%A8%0A%5E&=%C2%A3%0A$&_x:0.5%3B&=Delete&=End&=Page%20Down%3B&@=Ctrl&=Q&=S&=D&=F&=G&_x:3%3B&=H&=J&=K&=L&=M&=%25%0A%C3%B9&=%C2%B5%0A*&_x:0.5%3B&=1%0AEnd&=Up&=3%0APgDn&_h:2%3B&=Enter%3B&@=%3E%0A%3C&=W&=X&=C&=V&=B&_w:2%3B&=Space&_w:2%3B&=Space&=N&=%3F%0A,&=.%0A%2F%3B&=%2F%2F%0A%2F:&=%C2%A7%0A!&=Alt%20Gr&_x:0.5%3B&=Left&=Down&=Right)
-For the full Quantum feature list, see [the parent README.md](/readme.md).
+Keyboard Maintainer: [The QMK Community](https://github.com/qmk)
+Hardware Supported: RedDot handwired
-## Building
+Make example for this keyboard (after setting up your build environment):
-Download or clone the whole firmware and navigate to the keyboard/reddot folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file.
+ make handwired/reddot:default
-Depending on which keymap you would like to use, you will have to compile slightly differently.
-
-### Default
-To build with the default keymap, simply run `make`.
-
-### Other Keymaps
-Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` and see keymap document (you can find in top README.md) and existent keymap files.
-
-To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like:
-```
-$ make KEYMAP=[default|jack|<name>]
-```
-Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
+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).
diff --git a/keyboards/handwired/reddot/reddot.h b/keyboards/handwired/reddot/reddot.h
index f0c4be5571..a763f2ddc3 100755
--- a/keyboards/handwired/reddot/reddot.h
+++ b/keyboards/handwired/reddot/reddot.h
@@ -1,20 +1,17 @@
-#ifndef REDDOT_H
-#define REDDOT_H
+#pragma once
#include "quantum.h"
-#define KEYMAP( \
- k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, k10, k11, k12, k13, \
- k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2E, k30, k31, k32, \
- k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4A, k4B, k4C, k4D, k4E, k50, k51, k52, k53, \
- k60, k61, k62, k63, k64, k65, k66, k68, k69, k6A, k6B, k6C, k6D, k6E, k70, k71, k72, \
- k80, k81, k82, k83, k84, k85, k86, k88, k89, k8A, k8B, k8C, k8D, k8E, k90, k91, k92, k93\
+#define LAYOUT( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, k10, k11, k12, k13, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2E, k30, k31, k32, \
+ k40, k41, k42, k43, k44, k45, k46, k66, k47, k48, k49, k4A, k4B, k4C, k4D, k4E, k50, k51, k52, k53, \
+ k60, k61, k62, k63, k64, k65, k68, k69, k6A, k6B, k6C, k6D, k6E, k70, k71, k72, \
+ k80, k81, k82, k83, k84, k85, k86, k88, k89, k8A, k8B, k8C, k8D, k8E, k90, k91, k92, k93 \
) { \
- { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, k10, k11, k12, k13 }, \
- { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2E, k30, k31, k32, KC_NO }, \
- { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4A, k4B, k4C, k4D, k4E, k50, k51, k52, k53 }, \
- { k60, k61, k62, k63, k64, k65, k66, KC_NO, k68, k69, k6A, k6B, k6C, k6D, k6E, k70, k71, k72, KC_NO }, \
- { k80, k81, k82, k83, k84, k85, k86, KC_NO, k88, k89, k8A, k8B, k8C, k8D, k8E, k90, k91, k92, k93 } \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, k10, k11, k12, k13 }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2E, k30, k31, k32, KC_NO }, \
+ { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4A, k4B, k4C, k4D, k4E, k50, k51, k52, k53 }, \
+ { k60, k61, k62, k63, k64, k65, k66, KC_NO, k68, k69, k6A, k6B, k6C, k6D, k6E, k70, k71, k72, KC_NO }, \
+ { k80, k81, k82, k83, k84, k85, k86, KC_NO, k88, k89, k8A, k8B, k8C, k8D, k8E, k90, k91, k92, k93 } \
}
-
-#endif
diff --git a/keyboards/handwired/retro_refit/info.json b/keyboards/handwired/retro_refit/info.json
new file mode 100644
index 0000000000..44ae97cd12
--- /dev/null
+++ b/keyboards/handwired/retro_refit/info.json
@@ -0,0 +1,95 @@
+{
+ "keyboard_name": "handwired/retro_refit",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 15.5,
+ "height": 6.5,
+ "layouts": {
+ "LAYOUT": {
+ "key_count": 81,
+ "layout": [
+ {"label":"Esc", "x":0, "y":0},
+ {"label":"F1", "x":1, "y":0},
+ {"label":"F2", "x":2, "y":0},
+ {"label":"F3", "x":3, "y":0},
+ {"label":"F4", "x":4, "y":0},
+ {"label":"F5", "x":5, "y":0},
+ {"label":"F6", "x":6, "y":0},
+ {"label":"F7", "x":7, "y":0},
+ {"label":"F8", "x":8, "y":0},
+ {"label":"F9", "x":9, "y":0},
+ {"label":"F10", "x":10, "y":0},
+ {"label":"Num Lock", "x":11.5, "y":0},
+ {"label":"Scroll Lock", "x":12.5, "y":0},
+ {"label":"Print Screen", "x":13.5, "y":0},
+ {"label":"Pause", "x":14.5, "y":0},
+ {"label":"`", "x":0, "y":1.5},
+ {"label":"1", "x":1, "y":1.5},
+ {"label":"2", "x":2, "y":1.5},
+ {"label":"3", "x":3, "y":1.5},
+ {"label":"4", "x":4, "y":1.5},
+ {"label":"5", "x":5, "y":1.5},
+ {"label":"6", "x":6, "y":1.5},
+ {"label":"7", "x":7, "y":1.5},
+ {"label":"8", "x":8, "y":1.5},
+ {"label":"9", "x":9, "y":1.5},
+ {"label":"0", "x":10, "y":1.5},
+ {"label":"-", "x":11, "y":1.5},
+ {"label":"=", "x":12, "y":1.5},
+ {"label":"Backspace", "x":13, "y":1.5, "w":1.5},
+ {"label":"Home", "x":14.5, "y":1.5},
+ {"label":"Tab", "x":0, "y":2.5, "w":1.5},
+ {"label":"Q", "x":1.5, "y":2.5},
+ {"label":"W", "x":2.5, "y":2.5},
+ {"label":"E", "x":3.5, "y":2.5},
+ {"label":"R", "x":4.5, "y":2.5},
+ {"label":"T", "x":5.5, "y":2.5},
+ {"label":"Y", "x":6.5, "y":2.5},
+ {"label":"U", "x":7.5, "y":2.5},
+ {"label":"I", "x":8.5, "y":2.5},
+ {"label":"O", "x":9.5, "y":2.5},
+ {"label":"P", "x":10.5, "y":2.5},
+ {"label":"[", "x":11.5, "y":2.5},
+ {"label":"]", "x":12.5, "y":2.5},
+ {"label":"Page Up", "x":14.5, "y":2.5},
+ {"label":"Ctrl", "x":0, "y":3.5, "w":1.75},
+ {"label":"A", "x":1.75, "y":3.5},
+ {"label":"S", "x":2.75, "y":3.5},
+ {"label":"D", "x":3.75, "y":3.5},
+ {"label":"F", "x":4.75, "y":3.5},
+ {"label":"G", "x":5.75, "y":3.5},
+ {"label":"H", "x":6.75, "y":3.5},
+ {"label":"J", "x":7.75, "y":3.5},
+ {"label":"K", "x":8.75, "y":3.5},
+ {"label":"L", "x":9.75, "y":3.5},
+ {"label":";", "x":10.75, "y":3.5},
+ {"label":"'", "x":11.75, "y":3.5},
+ {"label":"Enter", "x":12.75, "y":3.5, "w":1.75},
+ {"label":"Page Down", "x":14.5, "y":3.5},
+ {"label":"Shift", "x":0, "y":4.5, "w":2.25},
+ {"label":"Z", "x":2.25, "y":4.5},
+ {"label":"X", "x":3.25, "y":4.5},
+ {"label":"C", "x":4.25, "y":4.5},
+ {"label":"V", "x":5.25, "y":4.5},
+ {"label":"B", "x":6.25, "y":4.5},
+ {"label":"N", "x":7.25, "y":4.5},
+ {"label":"M", "x":8.25, "y":4.5},
+ {"label":",", "x":9.25, "y":4.5},
+ {"label":".", "x":10.25, "y":4.5},
+ {"label":"/", "x":11.25, "y":4.5},
+ {"label":"Shift", "x":12.25, "y":4.5, "w":1.25},
+ {"label":"Up", "x":13.5, "y":4.5},
+ {"label":"End", "x":14.5, "y":4.5},
+ {"label":"Alt", "x":0, "y":5.5, "w":1.25},
+ {"label":"Caps Lock", "x":1.25, "y":5.5, "w":1.25},
+ {"label":"\\", "x":2.5, "y":5.5},
+ {"label":"Space", "x":3.5, "y":5.5, "w":7},
+ {"label":"Insert", "x":10.5, "y":5.5},
+ {"label":"Delete", "x":11.5, "y":5.5},
+ {"label":"Left", "x":12.5, "y":5.5},
+ {"label":"Down", "x":13.5, "y":5.5},
+ {"label":"Right", "x":14.5, "y":5.5}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/retro_refit/keymaps/default/keymap.c b/keyboards/handwired/retro_refit/keymaps/default/keymap.c
index 598541a05b..2f9f28478e 100644
--- a/keyboards/handwired/retro_refit/keymaps/default/keymap.c
+++ b/keyboards/handwired/retro_refit/keymaps/default/keymap.c
@@ -1,31 +1,12 @@
-
-#include "retro_refit.h"
+#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] =
- KEYMAP( ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, NLCK, SLCK, PSCR, PAUS, \
- GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS, EQL, BSPC, HOME, \
- TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC, RBRC, PGUP, \
- BSLS, A, S, D, F, G, H, J, K, L, SCLN, QUOT, ENT, PGDN, \
- LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, RSFT, UP, END, \
- LCTL, LGUI, LALT, SPC, INS, DEL, LEFT, DOWN, RGHT),
-};
-
-const uint16_t PROGMEM fn_actions[] = {
-
-};
-
-const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
- // MACRODOWN only works in this function
- switch(id) {
- case 0:
- if (record->event.pressed) {
- register_code(KC_RSFT);
- } else {
- unregister_code(KC_RSFT);
- }
- break;
- }
- return MACRO_NONE;
+ [0] = LAYOUT( \
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_NLCK, KC_SLCK, KC_PSCR, KC_PAUS, \
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME, \
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_PGUP, \
+ KC_BSLS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, \
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, \
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_INS, KC_DEL, KC_LEFT, KC_DOWN, KC_RGHT \
+ ),
};
diff --git a/keyboards/handwired/retro_refit/readme.md b/keyboards/handwired/retro_refit/readme.md
index 9f10edf9fc..8dfca7b10b 100644
--- a/keyboards/handwired/retro_refit/readme.md
+++ b/keyboards/handwired/retro_refit/readme.md
@@ -1,60 +1,42 @@
-retro_refit keyboard firmware
-======================
-
-## Keyboard Info
+# retro_refit
The retro refit keyboard used a Teensy to replace the original controller on a 386 "laptop".
-http://imgur.com/a/08Fyj
+[Image Gallery](https://imgur.com/a/08Fyj)
-This keyboard uses a KEYMAP macro that is a great example of using a non-standard row-column matrix. The keyboard in question had 11 rows and 8 columns, but the rows were not all horizontal, and the columns were not all vertical. For example, row 2 contained "Print Screen", "N", "M", ",", ".", "/", "Right Shift", and"Left Alt". Column 0 contained "F6", "7", "O", "'", "Q", "D", "B", "Left Alt", "Up Arrow", and "Down Arrow".
+This keyboard uses a LAYOUT macro that is a great example of using a non-standard row-column matrix. The keyboard in question had 11 rows and 8 columns, but the rows were not all horizontal, and the columns were not all vertical. For example, row 2 contained "Print Screen", "N", "M", ",", ".", "/", "Right Shift", and"Left Alt". Column 0 contained "F6", "7", "O", "'", "Q", "D", "B", "Left Alt", "Up Arrow", and "Down Arrow".
-The macro makes programming the keys easier and in a more straight-forward manner because it realigns the keys into a 6x15 sensible keyboard layout instead of the obtuse 11x8 matrix. Each Kxy corrisponds to a key in row x column y.
+The macro makes programming the keys easier and in a more straight-forward manner because it realigns the keys into a 6x15 sensible keyboard layout instead of the obtuse 11x8 matrix. Each Kxy corresponds to a key in row x column y.
```
-#define KEYMAP( \
- K77, K05, K04, K03, K02, K01, K00, KA7, KA6, KA5, KA4, KA3, KA2, K11, K94, \
- K27, K76, K75, K74, K73, K72, K71, K70, K67, K66, K65, K64, K63, K62, KA1, \
- K61, K60, K57, K56, K55, K54, K53, K52, K51, K50, K47, K46, K45, K97, \
- K43, K42, K41, K40, K37, K36, K35, K34, K33, K32, K31, K30, K44, K87, \
- K26, K24, K23, K22, K21, K20, K17, K16, K15, K14, K13, K12, KA0, K91, \
- K10, K06, K25, K07, K86, K85, K95, K90, K93 \
+#define LAYOUT( \
+ K77, K05, K04, K03, K02, K01, K00, KA7, KA6, KA5, KA4, KA3, KA2, K11, K94, \
+ K27, K76, K75, K74, K73, K72, K71, K70, K67, K66, K65, K64, K63, K62, KA1, \
+ K61, K60, K57, K56, K55, K54, K53, K52, K51, K50, K47, K46, K45, K97, \
+ K43, K42, K41, K40, K37, K36, K35, K34, K33, K32, K31, K30, K44, K87, \
+ K26, K24, K23, K22, K21, K20, K17, K16, K15, K14, K13, K12, KA0, K91, \
+ K10, K06, K25, K07, K86, K85, K95, K90, K93 \
) { \
-{ KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, }, \
-{ KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, }, \
-{ KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, }, \
-{ KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, }, \
-{ KC_##K40, KC_##K41, KC_##K42, KC_##K43, KC_##K44, KC_##K45, KC_##K46, KC_##K47, }, \
-{ KC_##K50, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57, }, \
-{ KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_##K66, KC_##K67, }, \
-{ KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_##K77, }, \
-{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_##K85, KC_##K86, KC_##K87, }, \
-{ KC_##K90, KC_##K91, KC_NO, KC_##K93, KC_##K94, KC_##K95, KC_NO, KC_##K97, }, \
-{ KC_##KA0, KC_##KA1, KC_##KA2, KC_##KA3, KC_##KA4, KC_##KA5, KC_##KA6, KC_##KA7, } \
+ { K00, K01, K02, K03, K04, K05, K06, K07 }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17 }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27 }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37 }, \
+ { K40, K41, K42, K43, K44, K45, K46, K47 }, \
+ { K50, K51, K52, K53, K54, K55, K56, K57 }, \
+ { K60, K61, K62, K63, K64, K65, K66, K67 }, \
+ { K70, K71, K72, K73, K74, K75, K76, K77 }, \
+ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, K85, K86, K87 }, \
+ { K90, K91, KC_NO, K93, K94, K95, KC_NO, K97 }, \
+ { KA0, KA1, KA2, KA3, KA4, KA5, KA6, KA7 } \
}
```
-## Quantum MK Firmware
-
-For the full Quantum feature list, see [the parent readme.md](/readme.md).
-
-## Building
-
-Download or clone the whole firmware and navigate to the keyboards/retro_refit folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file.
-
-Depending on which keymap you would like to use, you will have to compile slightly differently.
+Keyboard Maintainer: [The QMK Community](https://github.com/qmk)
+Hardware Supported: Leading Edge D3 386 keyboard, Teensy
-### Default
-To build with the default keymap, simply run `make default`.
+Make example for this keyboard (after setting up your build environment):
-### Other Keymaps
-Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` and see keymap document (you can find in top readme.md) and existent keymap files.
-
-To build the firmware binary hex file with a keymap just do `make` with a keymap like this:
-
-```
-$ make [default|jack|<name>]
-```
+ make handwired/retro_refit:default
-Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder. \ No newline at end of file
+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).
diff --git a/keyboards/handwired/retro_refit/retro_refit.h b/keyboards/handwired/retro_refit/retro_refit.h
index 109acdc399..ad1c567a84 100644
--- a/keyboards/handwired/retro_refit/retro_refit.h
+++ b/keyboards/handwired/retro_refit/retro_refit.h
@@ -1,38 +1,35 @@
-#ifndef RETRO_REFIT_H
-#define RETRO_REFIT_H
+#pragma once
#include "quantum.h"
-// This macro is an example of using a non-standard row-column matrix. The
-// keyboard in question had 11 rows and 8 columns, but the rows were not all
-// horizontal, and the columns were not all vertical. For example, row 2
+// This macro is an example of using a non-standard row-column matrix. The
+// keyboard in question had 11 rows and 8 columns, but the rows were not all
+// horizontal, and the columns were not all vertical. For example, row 2
// contained "Print Screen", "N", "M", ",", ".", "/", "Right Shift", and
-// "Left Alt". Column 0 contained "F6", "7", "O", "'", "Q", "D", "B",
+// "Left Alt". Column 0 contained "F6", "7", "O", "'", "Q", "D", "B",
// "Left Alt", "Up Arrow", and "Down Arrow".
//
// The macro makes programming the keys easier and in a more straight-forward
-// manner because it realigns the keys into a 6x15 sensible keyboard layout
+// manner because it realigns the keys into a 6x15 sensible keyboard layout
// instead of the obtuse 11x8 matrix.
-#define KEYMAP( \
- K77, K05, K04, K03, K02, K01, K00, KA7, KA6, KA5, KA4, KA3, KA2, K11, K94, \
- K27, K76, K75, K74, K73, K72, K71, K70, K67, K66, K65, K64, K63, K62, KA1, \
- K61, K60, K57, K56, K55, K54, K53, K52, K51, K50, K47, K46, K45, K97, \
- K43, K42, K41, K40, K37, K36, K35, K34, K33, K32, K31, K30, K44, K87, \
- K26, K24, K23, K22, K21, K20, K17, K16, K15, K14, K13, K12, KA0, K91, \
- K10, K06, K25, K07, K86, K85, K95, K90, K93 \
+#define LAYOUT( \
+ K77, K05, K04, K03, K02, K01, K00, KA7, KA6, KA5, KA4, KA3, KA2, K11, K94, \
+ K27, K76, K75, K74, K73, K72, K71, K70, K67, K66, K65, K64, K63, K62, KA1, \
+ K61, K60, K57, K56, K55, K54, K53, K52, K51, K50, K47, K46, K45, K97, \
+ K43, K42, K41, K40, K37, K36, K35, K34, K33, K32, K31, K30, K44, K87, \
+ K26, K24, K23, K22, K21, K20, K17, K16, K15, K14, K13, K12, KA0, K91, \
+ K10, K06, K25, K07, K86, K85, K95, K90, K93 \
) { \
-{ KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, }, \
-{ KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, }, \
-{ KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, }, \
-{ KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, }, \
-{ KC_##K40, KC_##K41, KC_##K42, KC_##K43, KC_##K44, KC_##K45, KC_##K46, KC_##K47, }, \
-{ KC_##K50, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57, }, \
-{ KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_##K66, KC_##K67, }, \
-{ KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_##K77, }, \
-{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_##K85, KC_##K86, KC_##K87, }, \
-{ KC_##K90, KC_##K91, KC_NO, KC_##K93, KC_##K94, KC_##K95, KC_NO, KC_##K97, }, \
-{ KC_##KA0, KC_##KA1, KC_##KA2, KC_##KA3, KC_##KA4, KC_##KA5, KC_##KA6, KC_##KA7, } \
+ { K00, K01, K02, K03, K04, K05, K06, K07 }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17 }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27 }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37 }, \
+ { K40, K41, K42, K43, K44, K45, K46, K47 }, \
+ { K50, K51, K52, K53, K54, K55, K56, K57 }, \
+ { K60, K61, K62, K63, K64, K65, K66, K67 }, \
+ { K70, K71, K72, K73, K74, K75, K76, K77 }, \
+ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, K85, K86, K87 }, \
+ { K90, K91, KC_NO, K93, K94, K95, KC_NO, K97 }, \
+ { KA0, KA1, KA2, KA3, KA4, KA5, KA6, KA7 } \
}
-
-#endif \ No newline at end of file
diff --git a/keyboards/handwired/rs60/README.md b/keyboards/handwired/rs60/README.md
new file mode 100644
index 0000000000..07c967e276
--- /dev/null
+++ b/keyboards/handwired/rs60/README.md
@@ -0,0 +1,27 @@
+# rs60: Handwired Slim Preonic Clone
+
+I wanted a preonic layout but with a very low profile. As Jack is still working on the Preonic PCB for Kailh Choc switches, I figured I could try to handwire one myself. It's my first custom keyboard, so I had a lot to learn.
+
+First I designed the case in fusion 360. I wanted to build it using acrylic, constrained myself to standard acrylic sheet thickness.
+
+![](https://imgur.com/NscS7Rd.jpg)
+
+You can download the model [here](https://a360.co/2OqiKLm).
+
+To test my design I 3D printed the parts.
+
+![](https://imgur.com/MSF7zLS.jpg)
+
+The result was encouraging, so I decided to build a prototype out of the printed plates using Kailh Choc brown switches. I tried to make the handwiring job as flat as possible so it can fit in my design.
+
+![](https://i.imgur.com/67yZx0V.jpg)
+![](https://i.imgur.com/ft72Cgj.jpg)
+
+I designed switch plate and the middle plates so that they would be glued together. The middle plate has inserts to attach the bottom plate using m8 screws.
+
+![](https://i.imgur.com/GstTohI.jpg)
+
+The end result is not too bad, but there is a few things I would do differently. Gluing 3D printed plates wasn't a good idea. The switch layer is so thin, that it bends when all the switches are slotted. As a result, the keyboard is not entirely flat. I will replace the bottom plate by a metal one so I get more weight and rigidity.
+
+Even with acrylic, I think I will have the same issue. I might switch to screws + bolts that go all the way through.
+
diff --git a/keyboards/handwired/rs60/config.h b/keyboards/handwired/rs60/config.h
new file mode 100644
index 0000000000..371150a79a
--- /dev/null
+++ b/keyboards/handwired/rs60/config.h
@@ -0,0 +1,47 @@
+/*
+Copyright 2018 QMK Contributors
+
+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
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x4260
+#define DEVICE_VER 0x0001
+#define MANUFACTURER rs
+#define PRODUCT rs60
+#define DESCRIPTION Preonic clone based on pro micro
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 12
+
+/* key matrix pins */
+#define MATRIX_ROW_PINS { B5, B6, B4, B2, E6 }
+#define MATRIX_COL_PINS { C6, D4, D0, D1, D2, D3, F4, F5, F6, F7, B1, B3}
+#define UNUSED_PINS { }
+
+#define QMK_ESC_OUTPUT C6
+#define QMK_ESC_INPUT B4
+#define QMK_LED B0
+// #define QMK_SPEAKER C6
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* key combination for command */
+#define IS_COMMAND() ( \
+ false \
+)
diff --git a/keyboards/handwired/rs60/keymaps/default/keymap.c b/keyboards/handwired/rs60/keymaps/default/keymap.c
new file mode 100644
index 0000000000..9fea769d05
--- /dev/null
+++ b/keyboards/handwired/rs60/keymaps/default/keymap.c
@@ -0,0 +1,207 @@
+/* Copyright 2015-2017 Jack Humbert
+ *
+ * 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
+
+enum layers {
+ _QWERTY,
+ _COLEMAK,
+ _DVORAK,
+ _LOWER,
+ _RAISE,
+ _ADJUST
+};
+
+enum keycodes {
+ QWERTY = SAFE_RANGE,
+ COLEMAK,
+ DVORAK,
+ LOWER,
+ RAISE,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Qwerty
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Tab | Q | W | E | R | T | Y | U | I | O | P | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | A | S | D | F | G | H | J | K | L | ; | " |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_QWERTY] = LAYOUT( \
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL, \
+ KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, \
+ _______, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
+),
+
+/* Colemak
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | A | R | S | T | D | H | N | E | I | O | " |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_COLEMAK] = LAYOUT( \
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \
+ KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL, \
+ KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, \
+ _______, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
+),
+
+/* Dvorak
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Tab | " | , | . | P | Y | F | G | C | R | L | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | A | O | E | U | I | D | H | T | N | S | / |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_DVORAK] = LAYOUT( \
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \
+ KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL, \
+ KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \
+ KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT, \
+ _______, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
+),
+
+/* Lower
+ * ,-----------------------------------------------------------------------------------.
+ * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_LOWER] = LAYOUT( \
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),KC_HOME, KC_END, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
+),
+
+/* Raise
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_RAISE] = LAYOUT( \
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
+),
+
+/* Adjust (Lower + Raise)
+ * ,-----------------------------------------------------------------------------------.
+ * | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | Reset| | | | | | | | | | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | | |Aud on|AudOff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | |Voice-|Voice+|Mus on|MusOff|MidiOn|MidOff| | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | | | |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_ADJUST] = LAYOUT( \
+ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \
+ _______, RESET, DEBUG, _______, _______, _______, _______, TERM_ON, TERM_OFF,_______, _______, KC_DEL, \
+ _______, _______, _______, _______, _______, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
+)
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case QWERTY:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_QWERTY);
+ }
+ return false;
+ break;
+ case COLEMAK:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_COLEMAK);
+ }
+ return false;
+ break;
+ case DVORAK:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_DVORAK);
+ }
+ return false;
+ break;
+ case LOWER:
+ if (record->event.pressed) {
+ layer_on(_LOWER);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ } else {
+ layer_off(_LOWER);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ }
+ return false;
+ break;
+ case RAISE:
+ if (record->event.pressed) {
+ layer_on(_RAISE);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ } else {
+ layer_off(_RAISE);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ }
+ return false;
+ break;
+ }
+ return true;
+};
diff --git a/keyboards/handwired/rs60/keymaps/default/readme.md b/keyboards/handwired/rs60/keymaps/default/readme.md
new file mode 100644
index 0000000000..e911968dd9
--- /dev/null
+++ b/keyboards/handwired/rs60/keymaps/default/readme.md
@@ -0,0 +1 @@
+# The default Preonic layout - largely based on the Planck's \ No newline at end of file
diff --git a/keyboards/handwired/rs60/rs60.c b/keyboards/handwired/rs60/rs60.c
new file mode 100644
index 0000000000..f748740cbe
--- /dev/null
+++ b/keyboards/handwired/rs60/rs60.c
@@ -0,0 +1,18 @@
+/*
+Copyright 2018 QMK Community
+
+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 "rs60.h"
diff --git a/keyboards/handwired/rs60/rs60.h b/keyboards/handwired/rs60/rs60.h
new file mode 100644
index 0000000000..f2113f05c3
--- /dev/null
+++ b/keyboards/handwired/rs60/rs60.h
@@ -0,0 +1,36 @@
+/*
+Copyright 2018 QMK Community
+
+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
+
+#include "quantum.h"
+
+#define LAYOUT( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \
+ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, \
+ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b \
+) \
+{ \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b }, \
+ { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b }, \
+ { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b } \
+}
+
+#define LAYOUT_ortho_5x12 LAYOUT
diff --git a/keyboards/handwired/rs60/rules.mk b/keyboards/handwired/rs60/rules.mk
new file mode 100644
index 0000000000..7b4ec69d0d
--- /dev/null
+++ b/keyboards/handwired/rs60/rules.mk
@@ -0,0 +1,61 @@
+# MCU name
+MCU = atmega32u4
+
+# Processor frequency.
+# This will define a symbol, F_CPU, in all source code files equal to the
+# processor frequency in Hz. You can then use this symbol in your source code to
+# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+# automatically to create a 32-bit value in your source code.
+#
+# This will be an integer division of F_USB below, as it is sourced by
+# F_USB after it has run through any CPU prescalers. Note that this value
+# does not *change* the processor frequency - it should merely be updated to
+# reflect the processor speed set externally so that the code can use accurate
+# software delays.
+F_CPU = 16000000
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+# This will define a symbol, F_USB, in all source code files equal to the
+# input clock frequency (before any prescaling is performed) in Hz. This value may
+# differ from F_CPU if prescaling is used on the latter, and is required as the
+# raw input clock is fed directly to the PLL sections of the AVR for high speed
+# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+# at the end, this will be done automatically to create a 32-bit value in your
+# source code.
+#
+# If no clock division is performed on the input clock inside the AVR (via the
+# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Bootloader
+BOOTLOADER = qmk-dfu
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+LAYOUTS = ortho_5x12
+
+# Boot Section Size in *bytes*
+#OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+# comment out to disable the options.
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = no # Mouse keys(+4700)
+EXTRAKEY_ENABLE = no # Audio control and System control(+450)
+CONSOLE_ENABLE = yes # Console for debug(+400)
+COMMAND_ENABLE = no # Commands for debug and configuration
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+NKRO_ENABLE = no # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE = no # Custom backlighting code is used, so this should not be enabled
+AUDIO_ENABLE = no # This can be enabled if a speaker is connected to the expansion port. Not compatible with RGBLIGHT below
+RGBLIGHT_ENABLE = no # This can be enabled if a ws2812 strip is connected to the expansion port.
+
diff --git a/keyboards/handwired/terminus_mini/readme.md b/keyboards/handwired/terminus_mini/readme.md
index 94249d6a96..5f0271bb40 100644
--- a/keyboards/handwired/terminus_mini/readme.md
+++ b/keyboards/handwired/terminus_mini/readme.md
@@ -10,4 +10,4 @@ Make example for this keyboard (after setting up your build environment):
make handwired/terminus_mini:default
-See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. \ No newline at end of file
+See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. \ No newline at end of file
diff --git a/keyboards/handwired/tradestation/info.json b/keyboards/handwired/tradestation/info.json
index f26d4ec371..e59c217cb7 100644
--- a/keyboards/handwired/tradestation/info.json
+++ b/keyboards/handwired/tradestation/info.json
@@ -2,14 +2,14 @@
"keyboard_name": "Tradestation",
"url": "",
"maintainer": "Flehrad",
- "bootloader": "",
- "width": 4.3,
- "height": 4.5,
+ "width": 4.375,
+ "height": 4.375,
"layouts": {
"LAYOUT_tradestation": {
- "layout": [{"x":0, "y":0}, {"x":1.1, "y":0}, {"x":2.2, "y":0}, {"x":3.3, "y":0}, {"x":0, "y":1.1}, {"x":1.1, "y":1.1}, {"x":2.2, "y":1.1}, {"x":3.3, "y":1.1}, {"x":0, "y":2.25, "w":2}, {"x":2.25, "y":2.25, "w":2}, {"x":0, "y":3.5, "w":2}, {"x":2.25, "y":3.5, "w":2}]
+ "layout": [{"x":0, "y":0},{"x":1.125, "y":0},{"x":2.25, "y":0},{"x":3.375, "y":0},{"x":0, "y":1.1},{"x":1.125, "y":1.1},{"x":2.25, "y":1.1},{"x":3.375, "y":1.1},{"x":0, "y":2.25, "w":2},{"x":2.25, "y":2.25, "w":2},{"x":0, "y":3.5, "w":2},{"x":2.25, "y":3.5, "w":2}]
},
- "LAYOUT_ortho_4x4": {
- "layout": [{"x":0, "y":0}, {"x":1.1, "y":0}, {"x":2.2, "y":0}, {"x":3.3, "y":0}, {"x":0, "y":1.1}, {"x":1.1, "y":1.1}, {"x":2.2, "y":1.1}, {"x":3.3, "y":1.1}, {"x":0, "y":2.25}, {"x":1, "y":2.25}, {"x":2.25, "y":2.25}, {"x":3.25, "y":2.25}, {"x":0, "y":3.5}, {"x":1, "y":3.5}, {"x":2.25, "y":3.5}, {"x":3.25, "y":3.5}]
+ "LAYOUT_ortho_4x4": {
+ "layout": [{"x":0, "y":0},{"x":1.125, "y":0},{"x":2.25, "y":0},{"x":3.375, "y":0},{"x":0, "y":1.1},{"x":1.125, "y":1.1},{"x":2.25, "y":1.1},{"x":3.375, "y":1.1},{"x":0, "y":2.25},{"x":1.125, "y":2.25},{"x":2.25, "y":2.25},{"x":3.375, "y":2.25},{"x":0, "y":3.5},{"x":1.125, "y":3.5},{"x":2.25, "y":3.5},{"x":3.375, "y":3.5}]
+ }
}
}
diff --git a/keyboards/handwired/tradestation/readme.md b/keyboards/handwired/tradestation/readme.md
index 69c0331a92..3a8c39e263 100644
--- a/keyboards/handwired/tradestation/readme.md
+++ b/keyboards/handwired/tradestation/readme.md
@@ -1,25 +1,27 @@
# Tradestation
-QMK for Tradestation Macropad
-This macropad was layout designed by Didier Luximon
+[Image Gallery](https://imgur.com/a/yxQJXMT)
+
+A 4x4 ortholinear macropad, with options for 2U keys on the bottom half. Can be built as single PCB with custom case, or as two-PCB style with standoffs. Requires a Pro Micro.
This PCB supports an overall 4x4 matrix with unique spacing.
+
* Top two rows are 1U keys with 1/8U spacing
* Bottom two rows are available with 4x2 1U as clusters of 2x1U or as 2x2 2U, spaced with 1/4U
-For QMK Configurator, the info.json is utilised.
-- For 2U keys , the first 1u row/column key assignment is the same as the 2u position.
-
-Build requires a pro micro.
+If you like this simple PCB and want to make a donation, you can do so at [paypal.me/theboardpodcast](https://paypal.me/theboardpodcast).
-Can be built as single PCB with custom case, or as two PCB style with standoffs.
+- [The Board Podcast on YouTube](https://www.youtube.com/channel/UCg98oJZNffR9nDLJNkorjqw)
+- [The Board Podcast on Libsyn](http://theboard.libsyn.com/)
+- [The Board Podcast on Patreon](https://www.patreon.com/theboardpodcast)
-If you like this simple PCB and want to make a donation, you can at https://paypal.me/theboardpodcast
+Designed by Didier Luximon.
-Check out our:
+Keyboard Maintainer: [flehrad](https://github.com/flehrad)
+Hardware Supported: Tradestation PCB, Pro Micro
-YouTube (https://www.youtube.com/channel/UCg98oJZNffR9nDLJNkorjqw)
+Make example for this keyboard (after setting up your build environment):
-Podcast (www.libsyn.com/theboardpodcast)
+ make tradestation:default
-Patreon (www.patreon.com/theboardpodcast)
+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).
diff --git a/keyboards/handwired/tradestation/rules.mk b/keyboards/handwired/tradestation/rules.mk
index 9d49888b5f..649b63babf 100644
--- a/keyboards/handwired/tradestation/rules.mk
+++ b/keyboards/handwired/tradestation/rules.mk
@@ -62,4 +62,5 @@ NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https:/
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
AUDIO_ENABLE = no
RGBLIGHT_ENABLE = no
- LAYOUTS = ortho_4x4
+
+LAYOUTS = ortho_4x4
diff --git a/keyboards/handwired/tradestation/tradestation.h b/keyboards/handwired/tradestation/tradestation.h
index 15e40e3b51..60b53b7ddf 100644
--- a/keyboards/handwired/tradestation/tradestation.h
+++ b/keyboards/handwired/tradestation/tradestation.h
@@ -3,25 +3,25 @@
#include "quantum.h"
#define LAYOUT_ortho_4x4( \
- K00, K01, K02, K03, \
- K10, K11, K12, K13, \
- K20, K21, K22, K23, \
- K30, K31, K32, K33 \
+ K00, K01, K02, K03, \
+ K10, K11, K12, K13, \
+ K20, K21, K22, K23, \
+ K30, K31, K32, K33 \
) { \
- { K00, K01, K02, K03 }, \
- { K10, K11, K12, K13 }, \
- { K20, K21, K22, K23 }, \
- { K30, K31, K32, K33 } \
+ { K00, K01, K02, K03 }, \
+ { K10, K11, K12, K13 }, \
+ { K20, K21, K22, K23 }, \
+ { K30, K31, K32, K33 } \
}
#define LAYOUT_tradestation( \
- K00, K01, K02, K03, \
- K10, K11, K12, K13, \
- K20, K22, \
- K30, K32 \
+ K00, K01, K02, K03, \
+ K10, K11, K12, K13, \
+ K20, K22, \
+ K30, K32 \
) { \
- { K00, K01, K02, K03 }, \
- { K10, K11, K12, K13 }, \
- { K20, KC_NO, K22, KC_NO }, \
- { K30, KC_NO, K32, KC_NO } \
+ { K00, K01, K02, K03 }, \
+ { K10, K11, K12, K13 }, \
+ { K20, KC_NO, K22, KC_NO }, \
+ { K30, KC_NO, K32, KC_NO } \
}
diff --git a/keyboards/handwired/traveller/keymaps/default/keymap.c b/keyboards/handwired/traveller/keymaps/default/keymap.c
index 13d889ab8b..f7f08268f0 100644
--- a/keyboards/handwired/traveller/keymaps/default/keymap.c
+++ b/keyboards/handwired/traveller/keymaps/default/keymap.c
@@ -157,11 +157,8 @@ Right hand nav keys work pretty well chorded with the Right hand Hi Key
const uint16_t PROGMEM fn_actions[] = {
[_QW] = ACTION_LAYER_ON(_QW,ON_RELEASE), // return to QWERTY layer
[_LW] = ACTION_LAYER_TAP_TOGGLE(_LW), // Turn on LW when holding, or tap 3 times to switch
- [_HI] = ACTION_LAYER_TAP_TOGGLE(_HI), // Turn on LW when holding, or tap 3 times to switch
[_NAV] = ACTION_LAYER_TOGGLE(_NAV),
[_FKEYS] = ACTION_LAYER_TOGGLE(_FKEYS),
- [_LWOUT] = ACTION_LAYER_OFF(_LW,ON_RELEASE),
- [_HIOUT] = ACTION_LAYER_OFF(_HI,ON_RELEASE),
// Functions
[RGBLED_TOGGLE] = ACTION_FUNCTION(RGBLED_TOGGLE),
diff --git a/keyboards/handwired/woodpad/keymaps/default/keymap.c b/keyboards/handwired/woodpad/keymaps/default/keymap.c
index 1fa90ba919..70c05fc271 100644
--- a/keyboards/handwired/woodpad/keymaps/default/keymap.c
+++ b/keyboards/handwired/woodpad/keymaps/default/keymap.c
@@ -59,10 +59,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
};
-const uint16_t PROGMEM fn_actions[] = {
-
-};
-
void numlock_led_on(void) {
PORTF |= (1<<7);
}
diff --git a/keyboards/handwired/woodpad/keymaps/default/rules.mk b/keyboards/handwired/woodpad/keymaps/default/rules.mk
index f060db79c0..fce19bfaa8 100644
--- a/keyboards/handwired/woodpad/keymaps/default/rules.mk
+++ b/keyboards/handwired/woodpad/keymaps/default/rules.mk
@@ -32,6 +32,3 @@ BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
-ifndef QUANTUM_DIR
- include ../../../../Makefile
-endif
diff --git a/keyboards/handwired/woodpad/keymaps/drashna/rules.mk b/keyboards/handwired/woodpad/keymaps/drashna/rules.mk
index ed7d2e7c6d..7f7f30e2ad 100644
--- a/keyboards/handwired/woodpad/keymaps/drashna/rules.mk
+++ b/keyboards/handwired/woodpad/keymaps/drashna/rules.mk
@@ -8,6 +8,3 @@ MOUSEKEY_ENABLE = no
EXTRAFLAGS = -flto
-ifndef QUANTUM_DIR
- include ../../../../Makefile
-endif
diff --git a/keyboards/handwired/xealous/debounce.c b/keyboards/handwired/xealous/debounce.c
new file mode 100644
index 0000000000..65a99f27f2
--- /dev/null
+++ b/keyboards/handwired/xealous/debounce.c
@@ -0,0 +1,63 @@
+#include <string.h>
+#include "config.h"
+#include "matrix.h"
+#include "timer.h"
+#include "quantum.h"
+
+#ifndef DEBOUNCING_DELAY
+# define DEBOUNCING_DELAY 5
+#endif
+
+//Debouncing counters
+typedef uint8_t debounce_counter_t;
+#define DEBOUNCE_COUNTER_MODULO 250
+#define DEBOUNCE_COUNTER_INACTIVE 251
+
+static debounce_counter_t *debounce_counters;
+
+void debounce_init(uint8_t num_rows)
+{
+ debounce_counters = malloc(num_rows*MATRIX_COLS);
+ memset(debounce_counters, DEBOUNCE_COUNTER_INACTIVE, num_rows*MATRIX_COLS);
+}
+
+void update_debounce_counters(uint8_t num_rows, uint8_t current_time)
+{
+ for (uint8_t row = 0; row < num_rows; row++)
+ {
+ for (uint8_t col = 0; col < MATRIX_COLS; col++)
+ {
+ if (debounce_counters[row*MATRIX_COLS + col] != DEBOUNCE_COUNTER_INACTIVE)
+ {
+ if (TIMER_DIFF(current_time, debounce_counters[row*MATRIX_COLS + col], DEBOUNCE_COUNTER_MODULO) >= DEBOUNCING_DELAY) {
+ debounce_counters[row*MATRIX_COLS + col] = DEBOUNCE_COUNTER_INACTIVE;
+ }
+ }
+ }
+ }
+}
+
+void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time)
+{
+ for (uint8_t row = 0; row < num_rows; row++)
+ {
+ matrix_row_t delta = raw[row] ^ cooked[row];
+
+ for (uint8_t col = 0; col < MATRIX_COLS; col++)
+ {
+ if (debounce_counters[row*MATRIX_COLS + col] == DEBOUNCE_COUNTER_INACTIVE && (delta & (1<<col)))
+ {
+ debounce_counters[row*MATRIX_COLS + col] = current_time;
+ cooked[row] ^= (1 << col);
+ }
+ }
+ }
+}
+
+void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed)
+{
+ uint8_t current_time = timer_read() % DEBOUNCE_COUNTER_MODULO;
+
+ update_debounce_counters(num_rows, current_time);
+ transfer_matrix_values(raw, cooked, num_rows, current_time);
+} \ No newline at end of file
diff --git a/keyboards/handwired/xealous/rules.mk b/keyboards/handwired/xealous/rules.mk
index eebd11d86e..07e1c875e6 100644
--- a/keyboards/handwired/xealous/rules.mk
+++ b/keyboards/handwired/xealous/rules.mk
@@ -1,4 +1,5 @@
-SRC += matrix_scanrate.c matrix.c
+#SRC += matrix_scanrate.c matrix.c
+SRC += debounce.c
# MCU name
MCU = atmega32u4
@@ -37,7 +38,7 @@ F_USB = $(F_CPU)
# Bootloader
# This definition is optional, and if your keyboard supports multiple bootloaders of
-# different sizes, comment this out, and the correct address will be loaded
+# different sizes, comment this out, and the correct address will be loaded
# automatically (+60). See bootloader.mk for all options.
BOOTLOADER = caterina
@@ -59,14 +60,15 @@ MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = yes # Audio output on port C6
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
-RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
+RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
SPLIT_KEYBOARD = yes # Use shared split_common code
SUBPROJECT_rev1 = yes
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
-CUSTOM_MATRIX = yes
+CUSTOM_MATRIX = no
+CUSTOM_DEBOUNCE = yes
LAYOUTS = split60