Browse Source

[Keyboard] Added ymdk split64 based on walston's work (#9183)

* Added ymdk split64 based on walson's work

* Commented out features on walston's keymap as it was too big to compile

* Update keyboards/ymdk_sp64/config.h

* Update keyboards/ymdk_sp64/keymaps/daed/keymap.c

* Update keyboards/ymdk_sp64/matrix.c

* Update keyboards/ymdk_sp64/matrix.c

* Update keyboards/ymdk_sp64/matrix.c

* keymap changes

* Update keyboards/ymdk_sp64/matrix.c

* Update keyboards/ymdk_sp64/matrix.c

* Update keyboards/ymdk_sp64/rules.mk

* Update keyboards/ymdk_sp64/config.h

* Update keyboards/ymdk_sp64/config.h

* Update keyboards/ymdk_sp64/readme.md

* Update keyboards/ymdk_sp64/rules.mk

* Update keyboards/ymdk_sp64/config.h

* Update keyboards/ymdk_sp64/rules.mk

* Update keyboards/ymdk_sp64/ymdk_sp64.c

* Update keyboards/ymdk_sp64/keymaps/walston/rules.mk

* Update keyboards/ymdk_sp64/readme.md

* Made requested changes and moved keyboard under ymdk directory

* Update keyboards/ymdk/ymdk_sp64/keymaps/walston/keymap.c

* Update keyboards/ymdk/ymdk_sp64/config.h

* Update keyboards/ymdk/ymdk_sp64/config.h

* Update keyboards/ymdk/ymdk_sp64/keymaps/default/keymap.c

* Update keyboards/ymdk/ymdk_sp64/keymaps/default/keymap.c

* updated changes for pr 9183

* updated changes for pr 9183

* updated changes for pr 9183

* Removed redundant "QMK_KEYBOARD_H" include
Brad Arnett 5 years ago
parent
commit
716924de3e

+ 45 - 0
keyboards/ymdk/sp64/config.h

@@ -0,0 +1,45 @@
+/*
+Copyright 2019 Neil Kettle
+
+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"
+
+#define VENDOR_ID       0x594D
+#define PRODUCT_ID      0x5364
+#define DEVICE_VER      0x0200
+#define MANUFACTURER    YMDK
+#define PRODUCT SP64
+#define DESCRIPTION YMDK Split 64
+
+#define MATRIX_ROWS 6
+#define MATRIX_COLS 15
+
+#define RIGHT_HALF
+
+/* disable these deprecated features by default */
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
+
+/* RGB underglow */
+#define RGBLED_NUM 12
+#define RGBLIGHT_HUE_STEP 8
+#define RGBLIGHT_SAT_STEP 8
+#define RGBLIGHT_VAL_STEP 8
+#define RGBLIGHT_LIMIT_VAL 250 /* The maximum brightness level */
+#define RGBLIGHT_SLEEP  /* If defined, the RGB lighting will be switched off when the host goes to sleep */
+#define RGBLIGHT_ANIMATIONS

+ 79 - 0
keyboards/ymdk/sp64/info.json

@@ -0,0 +1,79 @@
+{
+    "keyboard_name": "YMDK_SP64",
+    "url": "",
+    "maintainer": "walston",
+    "width": 16,
+    "height": 5,
+    "layouts": {
+        "LAYOUT": {
+            "layout": [
+                {"label":"~", "x":0, "y":0},
+                {"label":"!", "x":1, "y":0},
+                {"label":"@", "x":2, "y":0},
+                {"label":"#", "x":3, "y":0},
+                {"label":"$", "x":4, "y":0},
+                {"label":"%", "x":5, "y":0},
+                {"label":"^", "x":6, "y":0},
+                {"label":"&", "x":8, "y":0},
+                {"label":"*", "x":9, "y":0},
+                {"label":"(", "x":10, "y":0},
+                {"label":")", "x":11, "y":0},
+                {"label":"_", "x":12, "y":0},
+                {"label":"+", "x":13, "y":0},
+                {"label":"Backspace", "x":14, "y":0, "w":2},
+                {"label":"Tab", "x":0, "y":1, "w":1.5},
+                {"label":"Q", "x":1.5, "y":1},
+                {"label":"W", "x":2.5, "y":1},
+                {"label":"E", "x":3.5, "y":1},
+                {"label":"R", "x":4.5, "y":1},
+                {"label":"T", "x":5.5, "y":1},
+                {"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":"Caps Lock", "x":0, "y":2, "w":1.75},
+                {"label":"A", "x":1.75, "y":2},
+                {"label":"S", "x":2.75, "y":2},
+                {"label":"D", "x":3.75, "y":2},
+                {"label":"F", "x":4.75, "y":2},
+                {"label":"G", "x":5.75, "y":2},
+                {"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},
+                {"label":"Z", "x":2, "y":3},
+                {"label":"X", "x":3, "y":3},
+                {"label":"C", "x":4, "y":3},
+                {"label":"V", "x":5, "y":3},
+                {"label":"B", "x":6, "y":3},
+                {"label":"N", "x":8, "y":3},
+                {"label":"M", "x":9, "y":3},
+                {"label":"<", "x":10, "y":3},
+                {"label":">", "x":11, "y":3},
+                {"label":"?", "x":12, "y":3},
+                {"label":"Shift", "x":13, "y":3},
+                {"label":"Up", "x":14, "y":3},
+                {"label":"F3", "x":15, "y":3},
+                {"label":"Ctrl", "x":0, "y":4, "w":1.25},
+                {"label":"Win", "x":1.25, "y":4},
+                {"label":"Alt", "x":2.25, "y":4, "w":1.25},
+                {"label":"Space", "x":3.5, "y":4, "w":2.25},
+                {"label":"Fn", "x":5.75, "y":4},
+                {"label":"Space", "x":7.75, "y":4, "w":2.75},
+                {"label":"Alt", "x":10.5, "y":4, "w":1.25},
+                {"label":"Win", "x":11.75, "y":4, "w":1.25},
+                {"label":"Left", "x":13, "y":4},
+                {"label":"Down", "x":14, "y":4},
+                {"label":"Right", "x":15, "y":4}
+            ]
+        }
+    }
+}

+ 140 - 0
keyboards/ymdk/sp64/keymaps/daed/keymap.c

@@ -0,0 +1,140 @@
+#include QMK_KEYBOARD_H
+
+enum layer_names {
+    _BASE,
+    _GAMER,
+    _FN,
+    _RAISE,
+    _MODE,
+    _GACROS,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Keymap 0: Basic layer
+ *
+ * ┌-----┬-----┬-----┬-----┬-----┬-----┬-----┐    ┌-----┬-----┬-----┬-----┬-----┬-----┬----------┐
+ * │ Esc │  1  │  2  │  3  │  4  │  5  │  6  │    │  7  │  8  │  9  │  0  │  -  │  =  │ BkSp     │
+ * ├-----┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┘ ┌--┴-----┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬-------┤
+ * │ Tab    │  Q  │  W  │  E  │  R  │  T  │    │  Y  │  U  │  I  │  O  │  P  │  [  │  ]  │ \     │
+ * ├--------┴┬----┴┬----┴┬----┴┬----┴┬----┴┐   └┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴-------┤
+ * │ Ctrl    │  A  │  S  │  D  │  F  │  G  │    │  H  │  J  │  K  │  L  │  ;  │  '  │ Enter      │
+ * ├---------┴┬----┴┬----┴┬----┴┬----┴┬----┴┐   └┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴┬-----┬-----┤
+ * │ LShift   │  Z  │  X  │  C  │  V  │  B  │    │  N  │  M  │  <  │  >  │  ?  │ Sft │ Up  │ _MO │
+ * ├------┬---┴-┬---┴--┬--┴-----┴----┬┴----┬┘   ┌┴-----┴-----┴--┬--┴----┬┴-----┼-----┼-----┼-----┤
+ * │ _FN  │ Win │ Alt  │             │ _RA │    │               │ Alt   │ Win  │ Lft │ Dwn │ Rgt │
+ * └------┴-----┴------┴-------------┴-----┘    └---------------┴-------┴------┴-----┴-----┴-----┘
+ */
+[_BASE] = LAYOUT(
+  KC_ESC,  KC_1,    KC_2,    KC_3,     KC_4,    KC_5,     KC_6,               KC_7, KC_8,    KC_9,    KC_0,      KC_MINUS,    KC_EQUAL,    KC_BSPACE,
+  KC_TAB,  KC_Q,    KC_W,    KC_E,     KC_R,    KC_T,               KC_Y,     KC_U, KC_I,    KC_O,    KC_P,      KC_LBRACKET, KC_RBRACKET, KC_BSLS,
+  KC_LCTL, KC_A,    KC_S,    KC_D,     KC_F,    KC_G,               KC_H,     KC_J, KC_K,    KC_L,    KC_SCOLON, KC_QUOTE,                 KC_ENTER,
+  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,       MO(_MODE),
+  MO(_FN), KC_LGUI, KC_LALT, KC_SPACE,      MO(_RAISE),             KC_SPACE,           KC_RALT,      KC_RCTL,   KC_LEFT,     KC_DOWN,     KC_RIGHT
+  ),
+/* Keymap 1: Gamer layer
+ *
+ * ┌-----┬-----┬-----┬-----┬-----┬-----┬-----┐    ┌-----┬-----┬-----┬-----┬-----┬-----┬----------┐
+ * │ Esc │  1  │  2  │  3  │  4  │  5  │  6  │    │  7  │  8  │  9  │  0  │  -  │  =  │ BkSp     │
+ * ├-----┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┘ ┌--┴-----┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬-------┤
+ * │ Tab    │  Q  │  W  │  E  │  R  │  T  │    │  Y  │  U  │  I  │  O  │  P  │  [  │  ]  │ \     │
+ * ├--------┴┬----┴┬----┴┬----┴┬----┴┬----┴┐   └┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴-------┤
+ * │ Ctrl    │  A  │  S  │  D  │  F  │  G  │    │  H  │  J  │  K  │  L  │  ;  │  '  │ Enter      │
+ * ├---------┴┬----┴┬----┴┬----┴┬----┴┬----┴┐   └┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴┬-----┬-----┤
+ * │ LShift   │  Z  │  X  │  C  │  V  │  B  │    │  N  │  M  │  <  │  >  │  ?  │ Sft │ Up  │ _MO │
+ * ├------┬---┴-┬---┴--┬--┴-----┴----┬┴----┬┘   ┌┴-----┴-----┴--┬--┴----┬┴-----┼-----┼-----┼-----┤
+ * │ _FN  │ F13 │ Alt  │             │ _GA │    │               │ Alt   │ Win  │ Lft │ Dwn │ Rgt │
+ * └------┴-----┴------┴-------------┴-----┘    └---------------┴-------┴------┴-----┴-----┴-----┘
+ */
+[_GAMER] = LAYOUT(
+  KC_ESC,  KC_1,    KC_2,    KC_3,     KC_4,    KC_5,     KC_6,               KC_7, KC_8,    KC_9,    KC_0,      KC_MINUS,    KC_EQUAL,    KC_BSPACE,
+  KC_TAB,  KC_Q,    KC_W,    KC_E,     KC_R,    KC_T,               KC_Y,     KC_U, KC_I,    KC_O,    KC_P,      KC_LBRACKET, KC_RBRACKET, KC_BSLS,
+  KC_LCTL, KC_A,    KC_S,    KC_D,     KC_F,    KC_G,               KC_H,     KC_J, KC_K,    KC_L,    KC_SCOLON, KC_QUOTE,                 KC_ENTER,
+  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,       MO(_MODE),
+  MO(_FN), KC_F13,  KC_LALT, KC_SPACE,      MO(_GACROS),             KC_SPACE,           KC_RALT,      KC_RCTL,   KC_LEFT,     KC_DOWN,     KC_RIGHT
+  ),
+
+/* Keymap 2: Function
+ *
+ * ┌-----┬-----┬-----┬-----┬-----┬-----┬-----┐    ┌-----┬-----┬-----┬-----┬-----┬-----┬----------┐
+ * │  `  │ F1  │  F2 │ F3  │ F4  │ F5  │ F6  │    │ F7  │ F8  │ F9  │ F10 │ F11 │ F12 │          │
+ * ├-----┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┘ ┌--┴-----┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬-------┤
+ * │        │     │     │     │     │     │    │     │     │     │     │     │     │     │       │
+ * ├--------┴┬----┴┬----┴┬----┴┬----┴┬----┴┐   └┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴-------┤
+ * │         │     │     │     │     │     │    │Left │ Up  │Down │Right│     │     │            │
+ * ├---------┴┬----┴┬----┴┬----┴┬----┴┬----┴┐   └┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴┬-----┬-----┤
+ * │          │     │     │     │     │     │    │     │     │     │     │     │     │     │     │
+ * ├------┬---┴-┬---┴--┬--┴-----┴----┬┴----┬┘   ┌┴-----┴-----┴--┬--┴----┬┴-----┼-----┼-----┼-----┤
+ * │      │     │      │             │     │    │               │       │      │     │     │     │
+ * └------┴-----┴------┴-------------┴-----┘    └---------------┴-------┴------┴-----┴-----┴-----┘
+ */
+[_FN] = LAYOUT(
+  KC_GRAVE, 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_DEL,
+  _______, _______, _______, _______, _______, _______,        _______, _______, _______, _______, _______, _______, _______, _______,
+  KC_CAPS, _______, _______, _______, _______, _______,        KC_LEFT, KC_DOWN,   KC_UP, KC_RIGHT, _______, _______,          _______,
+  _______, _______, _______, _______, _______, _______,        _______, _______, _______, _______, _______, _______, KC_PGUP, _______,
+  _______, _______, _______, _______,          _______,        _______,          _______, _______,          KC_HOME, KC_PGDN, KC_END
+  ),
+/* Keymap 3: Raise / Quality of life
+ *
+ * ┌-----┬-----┬-----┬-----┬-----┬-----┬-----┐    ┌-----┬-----┬-----┬-----┬-----┬-----┬----------┐
+ * │  `  │ F1  │  F2 │ F3  │ F4  │ F5  │ F6  │    │ F7  │ F8  │ F9  │ F10 │ F11 │ F12 │          │
+ * ├-----┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┘ ┌--┴-----┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬-------┤
+ * │        │     │     │     │     │     │    │     │     │     │     │     │     │     │       │
+ * ├--------┴┬----┴┬----┴┬----┴┬----┴┬----┴┐   └┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴-------┤
+ * │         │     │     │     │     │     │    │Left │ Up  │Down │Right│     │     │            │
+ * ├---------┴┬----┴┬----┴┬----┴┬----┴┬----┴┐   └┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴┬-----┬-----┤
+ * │          │     │     │     │     │     │    │     │     │     │     │     │     │     │     │
+ * ├------┬---┴-┬---┴--┬--┴-----┴----┬┴----┬┘   ┌┴-----┴-----┴--┬--┴----┬┴-----┼-----┼-----┼-----┤
+ * │      │     │      │             │     │    │               │       │      │     │     │     │
+ * └------┴-----┴------┴-------------┴-----┘    └---------------┴-------┴------┴-----┴-----┴-----┘
+ */
+[_RAISE] = LAYOUT(
+  KC_GRAVE, 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_DEL,
+  _______, _______, _______, _______, _______, _______,        _______, _______, _______, _______, _______, _______, _______, _______,
+  KC_CAPS, _______, _______, _______, _______, _______,        KC_LEFT, KC_DOWN,   KC_UP, KC_RIGHT, _______, _______,          _______,
+  _______, _______, _______, _______, _______, _______,        _______, _______, _______, _______, _______,  _______, KC_PGUP, _______,
+  _______, _______, _______, _______,          _______,        _______,          _______, _______,           KC_HOME, KC_PGDN, KC_END
+  ),
+/* Keymap 4: Mode switching
+ *
+ * ┌-----┬-----┬-----┬-----┬-----┬-----┬-----┐    ┌-----┬-----┬-----┬-----┬-----┬-----┬----------┐
+ * │  `  │ F1  │  F2 │ F3  │ F4  │ F5  │ F6  │    │ F7  │ F8  │ F9  │ F10 │ F11 │ F12 │          │
+ * ├-----┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┘ ┌--┴-----┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬-------┤
+ * │ RGB 0/1│RGBM-│RGBB+│RGBM+│     │     │    │     │     │     │     │     │     │     │ Reset │
+ * ├--------┴┬----┴┬----┴┬----┴┬----┴┬----┴┐   └┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴-------┤
+ * │         │RGBS-│RGBB-│RGBS+│     │     │    │Left │ Up  │Down │Right│     │     │            │
+ * ├---------┴┬----┴┬----┴┬----┴┬----┴┬----┴┐   └┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴┬-----┬-----┤
+ * │          │     │     │     │     │     │    │     │     │     │ GAME| BASE│     │     │     │
+ * ├------┬---┴-┬---┴--┬--┴-----┴----┬┴----┬┘   ┌┴-----┴-----┴--┬--┴----┬┴-----┼-----┼-----┼-----┤
+ * │      │     │      │             │     │    │               │       │      │     │     │     │
+ * └------┴-----┴------┴-------------┴-----┘    └---------------┴-------┴------┴-----┴-----┴-----┘
+ */
+[_MODE] = LAYOUT(
+  KC_GRAVE, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,          KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  _______,
+  RGB_TOG, RGB_RMOD, RGB_VAI, RGB_MOD, _______, _______,        _______, _______, _______, _______, _______, _______, _______, RESET,
+  _______, RGB_SPD,  RGB_VAD, RGB_SPI, _______, _______,        KC_LEFT, KC_DOWN,   KC_UP, KC_RIGHT, _______, _______,          _______,
+  _______, _______,  _______, _______, _______, _______,        _______, _______, _______, TO(_GAMER), TO(_BASE), _______, _______, _______,
+  _______, _______,  _______, _______,          _______,        _______,          _______, _______,          _______, _______, _______
+  ),
+/* Keymap 5: Gaming macros
+ *
+ * ┌-----┬-----┬-----┬-----┬-----┬-----┬-----┐    ┌-----┬-----┬-----┬-----┬-----┬-----┬----------┐
+ * │  `  │ F1  │  F2 │ F3  │ F4  │ F5  │ F6  │    │ F7  │ F8  │ F9  │ F10 │ F11 │ F12 │          │
+ * ├-----┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┘ ┌--┴-----┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬-------┤
+ * │        │     │ PUSH│     │     │     │    │     │     │     │     │     │     │     │       │
+ * ├--------┴┬----┴┬----┴┬----┴┬----┴┬----┴┐   └┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴-------┤
+ * │         │     │ FALL│     │     │     │    │Left │ Up  │Down │Right│     │     │            │
+ * ├---------┴┬----┴┬----┴┬----┴┬----┴┬----┴┐   └┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴┬-----┬-----┤
+ * │          │     │ CAP │     │     │     │    │     │     │     │ GAME| BASE│     │     │     │
+ * ├------┬---┴-┬---┴--┬--┴-----┴----┬┴----┬┘   ┌┴-----┴-----┴--┬--┴----┬┴-----┼-----┼-----┼-----┤
+ * │      │     │      │             │     │    │               │       │      │     │     │     │
+ * └------┴-----┴------┴-------------┴-----┘    └---------------┴-------┴------┴-----┴-----┴-----┘
+ */
+[_GACROS] = LAYOUT(
+  KC_GRAVE, 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_LEFT, KC_DOWN,   KC_UP, KC_RIGHT, _______, _______,          _______,
+  _______, _______,  _______, _______, _______, _______,          _______, _______, _______, TO(_GAMER), TO(_BASE), _______, _______, _______,
+  _______, _______,       _______, _______,        _______, _______,                                _______, _______,          _______, _______, _______
+  ),
+};

+ 74 - 0
keyboards/ymdk/sp64/keymaps/default/keymap.c

@@ -0,0 +1,74 @@
+#include QMK_KEYBOARD_H
+
+enum layer_names {
+    BASE, // default layer
+    _FN,  // function layer
+    _FX   // media keys
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Keymap 0: Basic layer
+ *
+ * ┌-----┬-----┬-----┬-----┬-----┬-----┬-----┐    ┌-----┬-----┬-----┬-----┬-----┬-----┬----------┐
+ * │ Esc │  1  │  2  │  3  │  4  │  5  │  6  │    │  7  │  8  │  9  │  0  │  -  │  =  │ BkSp     │
+ * ├-----┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┘ ┌--┴-----┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬-------┤
+ * │ Tab    │  Q  │  W  │  E  │  R  │  T  │    │  Y  │  U  │  I  │  O  │  P  │  [  │  ]  │ \     │
+ * ├--------┴┬----┴┬----┴┬----┴┬----┴┬----┴┐   └┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴-------┤
+ * │ Caps    │  A  │  S  │  D  │  F  │  G  │    │  H  │  J  │  K  │  L  │  ;  │  '  │ Enter      │
+ * ├---------┴┬----┴┬----┴┬----┴┬----┴┬----┴┐   └┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴┬-----┬-----┤
+ * │ LShift   │  Z  │  X  │  C  │  V  │  B  │    │  N  │  M  │  <  │  >  │  ?  │ Sft │ Up  │ Fn  │
+ * ├------┬---┴-┬---┴--┬--┴-----┴----┬┴----┬┘   ┌┴-----┴-----┴--┬--┴----┬┴-----┼-----┼-----┼-----┤
+ * │ Ctrl │ Win │ Alt  │             │ Fn  │    │               │ Alt   │ Win  │ Lft │ Dwn │ Rgt │
+ * └------┴-----┴------┴-------------┴-----┘    └---------------┴-------┴------┴-----┴-----┴-----┘
+ */
+[BASE] = LAYOUT(
+  KC_ESC,  KC_1,    KC_2,    KC_3,     KC_4,    KC_5,     KC_6,               KC_7, KC_8,    KC_9,    KC_0,      KC_MINUS,    KC_EQUAL,    KC_BSPACE,
+  KC_TAB,  KC_Q,    KC_W,    KC_E,     KC_R,    KC_T,               KC_Y,     KC_U, KC_I,    KC_O,    KC_P,      KC_LBRACKET, KC_RBRACKET, KC_BSLS,
+  KC_CAPS, KC_A,    KC_S,    KC_D,     KC_F,    KC_G,               KC_H,     KC_J, KC_K,    KC_L,    KC_SCOLON, KC_QUOTE,                 KC_ENTER,
+  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_F3,
+  KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE,      MO(_FN),     KC_SPACE,                  KC_RALT, KC_RGUI,            KC_LEFT,     KC_DOWN,     KC_RIGHT
+  ),
+/* Function
+ *
+ * ┌-----┬-----┬-----┬-----┬-----┬-----┬-----┐    ┌-----┬-----┬-----┬-----┬-----┬-----┬----------┐
+ * │     │ F1  │  F2 │ F3  │ F4  │ F5  │ F6  │    │ F7  │ F8  │ F9  │ F10 │ F11 │ F12 │          │
+ * ├-----┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┘ ┌--┴-----┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬-------┤
+ * │        │     │     │     │     │     │    │     │     │     │     │     │     │     │       │
+ * ├--------┴┬----┴┬----┴┬----┴┬----┴┬----┴┐   └┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴-------┤
+ * │         │     │     │     │     │     │    │     │     │     │     │     │     │            │
+ * ├---------┴┬----┴┬----┴┬----┴┬----┴┬----┴┐   └┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴┬-----┬-----┤
+ * │          │     │     │     │     │     │    │     │     │     │     │     │     │     │     │
+ * ├------┬---┴-┬---┴--┬--┴-----┴----┬┴----┬┘   ┌┴-----┴-----┴--┬--┴----┬┴-----┼-----┼-----┼-----┤
+ * │      │     │      │             │     │    │               │       │      │     │     │     │
+ * └------┴-----┴------┴-------------┴-----┘    └---------------┴-------┴------┴-----┴-----┴-----┘
+ */
+[_FN] = 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,  _______,
+  _______, _______, _______, _______, _______, _______,        _______, _______, _______, _______, _______, _______, _______, _______,
+  _______, _______, _______, _______, _______, _______,        _______, _______, _______, _______, _______, _______,          _______,
+  _______, _______, _______, _______, _______, _______,        _______, _______, _______, _______, _______, _______, _______, _______,
+  _______, _______, _______, _______,          _______,        _______,          _______, _______,          _______, _______, _______
+  ),
+/* Media
+ *
+ * ┌-----┬-----┬-----┬-----┬-----┬-----┬-----┐    ┌-----┬-----┬-----┬-----┬-----┬-----┬----------┐
+ * │     │     │     │     │     │     │     │    │     │     │     │     │     │     │          │
+ * ├-----┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┘ ┌--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬-------┤
+ * │        │     │     │     │     │     │    │     │     │     │     │     │     │     │       │
+ * ├--------┴┬----┴┬----┴┬----┴┬----┴┬----┴┐   └┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴-------┤
+ * │         │     │     │     │     │     │    │     │     │     │     │     │     │            │
+ * ├---------┴┬----┴┬----┴┬----┴┬----┴┬----┴┐   └┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴┬-----┬-----┤
+ * │          │     │     │     │     │     │    │     │     │     │     │     │     │     │     │
+ * ├------┬---┴-┬---┴--┬--┴-----┴----┬┴----┬┘   ┌┴-----┴-----┴--┬--┴----┬┴-----┼-----┼-----┼-----┤
+ * │      │     │      │             │     │    │               │       │      │     │     │     │
+ * └------┴-----┴------┴-------------┴-----┘    └---------------┴-------┴------┴-----┴-----┴-----┘
+ */
+[_FX] = LAYOUT(
+  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,          _______,
+  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+  _______, _______, _______, _______,          _______, _______,          _______, _______,          _______, _______, _______
+  ),
+};
+

+ 94 - 0
keyboards/ymdk/sp64/keymaps/walston/keymap.c

@@ -0,0 +1,94 @@
+#include QMK_KEYBOARD_H
+enum layer_names {
+  BASE, // default layer
+  _FUN, // function layer
+  _NUMPAD, // num-pad
+  _MEDIA // media keys
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Keymap 0: Basic layer
+ *
+ * ┌-----┬-----┬-----┬-----┬-----┬-----┬-----┐    ┌-----┬-----┬-----┬-----┬-----┬-----┬----------┐
+ * │  `  │  1  │  2  │  3  │  4  │  5  │  6  │    │  7  │  8  │  9  │  0  │  -  │  =  │ BkSp     │
+ * ├-----┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┘ ┌--┴-----┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬-------┤
+ * │ Tab    │  Q  │  W  │  E  │  R  │  T  │    │  Y  │  U  │  I  │  O  │  P  │  [  │  ]  │ \     │
+ * ├--------┴┬----┴┬----┴┬----┴┬----┴┬----┴┐   └┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴-------┤
+ * │ Ctrl    │  A  │  S  │  D  │  F  │  G  │    │  H  │  J  │  K  │  L  │  ;  │  '  │ Enter      │
+ * ├---------┴┬----┴┬----┴┬----┴┬----┴┬----┴┐   └┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴┬-----┬-----┤
+ * │ LShift   │  Z  │  X  │  C  │  V  │  B  │    │  N  │  M  │  <  │  >  │  ?  │ Sft │ Up  │_MED │
+ * ├------┬---┴-┬---┴--┬--┴-----┴----┬┴----┬┘   ┌┴-----┴-----┴--┬--┴----┬┴-----┼-----┼-----┼-----┤
+ * │ _NUM │_MED │ Alt  │ Cmd         │ Spc │    │ Space         │ Cmd   │ Alt  │ Lft │ Dwn │ Rgt │
+ * └------┴-----┴------┴-------------┴-----┘    └---------------┴-------┴------┴-----┴-----┴-----┘
+ */
+[BASE] = LAYOUT(
+  MT(RESET, KC_GRAVE),   KC_1,      KC_2,    KC_3,    KC_4,    KC_5,     KC_6,     KC_7,    KC_8,    KC_9,    KC_0,      KC_MINUS,    KC_EQUAL,    KC_BSPACE,
+  KC_TAB,                KC_Q,      KC_W,    KC_E,    KC_R,    KC_T,     KC_Y,     KC_U,    KC_I,    KC_O,    KC_P,      KC_LBRACKET, KC_RBRACKET,   KC_BSLS,
+  KC_LCTL,               KC_A,      KC_S,    KC_D,    KC_F,    KC_G,     KC_H,     KC_J,    KC_K,    KC_L,    KC_SCOLON, KC_QUOTE,                  KC_ENTER,
+  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,     OSL(_MEDIA),
+  LT(_NUMPAD, KC_CAPS), TT(_MEDIA), KC_LALT, KC_LGUI, LT(_FUN, KC_SPACE),    KC_SPACE,          KC_RGUI, KC_RALT,        KC_LEFT,   KC_DOWN,        KC_RIGHT
+  ),
+/* Keymap 1: Function Layer / Vim Arrows
+ *
+ * ┌-----┬-----┬-----┬-----┬-----┬-----┬-----┐    ┌-----┬-----┬-----┬-----┬-----┬-----┬----------┐
+ * │ Esc │ F1  │  F2 │ F3  │ F4  │ F5  │ F6  │    │ F7  │ F8  │ F9  │ F10 │ F11 │ F12 │          │
+ * ├-----┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┘ ┌--┴-----┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬-------┤
+ * │        │     │     │     │     │     │    │     │     │     │     │     │     │     │       │
+ * ├--------┴┬----┴┬----┴┬----┴┬----┴┬----┴┐   └┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴-------┤
+ * │         │     │     │     │     │     │    │     │Left │ Up  │Down │Right│     │            │
+ * ├---------┴┬----┴┬----┴┬----┴┬----┴┬----┴┐   └┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴┬-----┬-----┤
+ * │          │     │     │     │     │     │    │     │     │     │     │     │     │     │     │
+ * ├------┬---┴-┬---┴--┬--┴-----┴----┬┴----┬┘   ┌┴-----┴-----┴--┬--┴----┬┴-----┼-----┼-----┼-----┤
+ * │      │     │      │             │     │    │               │       │      │     │     │     │
+ * └------┴-----┴------┴-------------┴-----┘    └---------------┴-------┴------┴-----┴-----┴-----┘
+ */
+[_FUN] = LAYOUT(
+  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_LEFT, KC_UP,   KC_DOWN, KC_RIGHT, _______, _______,          _______,
+  _______, _______, _______, _______, _______, _______,           _______, _______, _______, _______,  _______, _______, _______, _______,
+  _______, _______, _______, _______,          _______,           _______,          _______, _______,           _______, _______, _______
+  ),
+/* Keymap 2: NumPad
+ *
+ * ┌-----┬-----┬-----┬-----┬-----┬-----┬-----┐    ┌-----┬-----┬-----┬-----┬-----┬-----┬----------┐
+ * │     │     │     │     │     │     │     │    │  7  │  8  │  9  │     │ Vol-│ Vol+│ Mute     │
+ * ├-----┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┘ ┌--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬-------┤
+ * │        │     │     │     │     │     │    │     │  4  │  5  │  6  │     │ |<< │ >>| │ >||   │
+ * ├--------┴┬----┴┬----┴┬----┴┬----┴┬----┴┐   └┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴-------┤
+ * │         │     │     │     │     │     │    │     │  1  │  2  │  3  │     │     │            │
+ * ├---------┴┬----┴┬----┴┬----┴┬----┴┬----┴┐   └┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴┬-----┬-----┤
+ * │          │     │     │     │     │     │    │     │  0  │     │     │     │     │     │     │
+ * ├------┬---┴-┬---┴--┬--┴-----┴----┬┴----┬┘   ┌┴-----┴-----┴--┬--┴----┬┴-----┼-----┼-----┼-----┤
+ * │      │     │      │             │     │    │               │       │      │     │     │     │
+ * └------┴-----┴------┴-------------┴-----┘    └---------------┴-------┴------┴-----┴-----┴-----┘
+ */
+[_NUMPAD] = LAYOUT(
+  _______, _______, _______, _______, _______, _______, _______,           KC_P7,   KC_P8,   KC_P9,   _______, KC_VOLD, KC_VOLU, KC_MUTE,
+  _______, _______, _______, _______, _______, _______,           _______, KC_P4,   KC_P5,   KC_P6,   _______, KC_MPRV, KC_MNXT, KC_MPLY,
+  _______, _______, _______, _______, _______, _______,           _______, KC_P1,   KC_P2,   KC_P3,   _______, _______,          _______,
+  _______, _______, _______, _______, _______, _______,           _______, KC_P0,   _______, _______, _______, _______, _______, _______,
+  _______, _______, _______, _______,          _______,           _______,          _______, _______,          _______, _______, _______
+  ),
+/* Keymap 3: Media
+ *
+ * ┌-----┬-----┬-----┬-----┬-----┬-----┬-----┐    ┌-----┬-----┬-----┬-----┬-----┬-----┬----------┐
+ * │     │     │     │     │     │     │     │    │     │     │     │     │     │     │          │
+ * ├-----┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┘ ┌--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬-------┤
+ * │        │     │     │     │     │     │    │     │     │     │     │     │     │     │       │
+ * ├--------┴┬----┴┬----┴┬----┴┬----┴┬----┴┐   └┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴-------┤
+ * │         │     │     │     │     │     │    │     │     │     │     │     │     │            │
+ * ├---------┴┬----┴┬----┴┬----┴┬----┴┬----┴┐   └┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴┬-----┬-----┤
+ * │          │     │     │     │     │     │    │     │     │     │     │     │     │     │     │
+ * ├------┬---┴-┬---┴--┬--┴-----┴----┬┴----┬┘   ┌┴-----┴-----┴--┬--┴----┬┴-----┼-----┼-----┼-----┤
+ * │      │     │      │ Backlight   │     │    │               │       │      │     │     │     │
+ * └------┴-----┴------┴-------------┴-----┘    └---------------┴-------┴------┴-----┴-----┴-----┘
+ */
+[_MEDIA] = LAYOUT(
+  _______, _______, _______, _______, _______, _______, _______,           _______, _______, _______, _______, _______, _______, _______,
+  _______, _______, _______, _______, _______, _______,           _______, _______, _______, _______, _______, _______, _______, _______,
+  _______, _______, _______, _______, _______, _______,           _______, _______, _______, _______, _______, _______,          _______,
+  _______, _______, _______, _______, _______, _______,           _______, _______, _______, _______, _______, _______, _______, _______,
+  _______, _______, _______, RGB_TOG,          _______,           _______,          _______, _______,          _______, _______, _______
+  ),
+};

+ 1 - 0
keyboards/ymdk/sp64/keymaps/walston/rules.mk

@@ -0,0 +1 @@
+COMMAND_ENABLE = no

+ 169 - 0
keyboards/ymdk/sp64/matrix.c

@@ -0,0 +1,169 @@
+/*
+Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
+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 "matrix.h"
+#include <stdint.h>
+#include <stdbool.h>
+#include <avr/io.h>
+#include "wait.h"
+#include "action_layer.h"
+#include "print.h"
+#include "debug.h"
+#include "util.h"
+#include "sp64.h"
+#include "debounce.h"
+
+/* matrix state(1:on, 0:off) */
+static matrix_row_t matrix[MATRIX_ROWS];
+
+// Debouncing: store for each key the number of scans until it's eligible to
+// change.  When scanning the matrix, ignore any changes in keys that have
+// already changed in the last DEBOUNCE scans.
+static matrix_row_t matrix_debouncing[MATRIX_ROWS];
+
+static void matrix_select_row(uint8_t row);
+
+#ifdef RIGHT_HALF
+static uint8_t mcp23018_reset_loop = 0;
+#endif
+
+void matrix_init(void)
+{
+  // all outputs for rows high
+  DDRB = 0xFF;
+  PORTB = 0xFF;
+  // all inputs for columns
+  DDRA = 0x00;
+  DDRC &= ~(0x111111<<2);
+  DDRD &= ~(1<<PIND7);
+  // all columns are pulled-up
+  PORTA = 0xFF;
+  PORTC |= (0b111111<<2);
+  PORTD |= (1<<PIND7);
+
+#ifdef RIGHT_HALF
+  // initialize row and col
+  mcp23018_status = init_mcp23018();
+#endif
+
+  // initialize matrix state: all keys off
+  for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+    matrix[row] = 0;
+    matrix_debouncing[row] = 0;
+  }
+  debounce_init(MATRIX_ROWS);
+  matrix_init_quantum();
+}
+
+uint8_t matrix_scan(void)
+{
+#ifdef RIGHT_HALF
+  // Then the keyboard
+  if (mcp23018_status != I2C_STATUS_SUCCESS) {
+    if (++mcp23018_reset_loop == 0) {
+      // if (++mcp23018_reset_loop >= 1300) {
+      // since mcp23018_reset_loop is 8 bit - we'll try to reset once in 255 matrix scans
+      // this will be approx bit more frequent than once per second
+      print("trying to reset mcp23018\n");
+      mcp23018_status = init_mcp23018();
+      if (mcp23018_status) {
+        print("left side not responding\n");
+      } else {
+        print("left side attached\n");
+      }
+    }
+  }
+#endif
+  bool changed = false;
+  for (uint8_t row = 0; row < MATRIX_ROWS; row++)
+  {
+    matrix_row_t cols;
+
+    matrix_select_row(row);
+#ifndef RIGHT_HALF
+    _delay_us(5);
+#endif
+
+    cols = (
+      // cols 0..7, PORTA 0 -> 7
+      (~PINA) & 0xFF
+    );
+
+#ifdef RIGHT_HALF
+    uint8_t data = 0x7F;
+    // Receive the columns from right half
+    i2c_receive(I2C_ADDR_WRITE, &data, 1, MCP23018_I2C_TIMEOUT);
+    cols |= ((~(data) & 0x7F) << 7);
+#endif
+
+    if (matrix_debouncing[row] != cols) {
+      matrix_debouncing[row] = cols;
+      //debouncing = DEBOUNCE;
+      changed = true;
+    }
+  }
+
+  debounce(matrix_debouncing, matrix, MATRIX_ROWS, changed);
+
+  matrix_scan_quantum();
+
+#ifdef DEBUG_MATRIX
+  for (uint8_t c = 0; c < MATRIX_COLS; c++)
+    for (uint8_t r = 0; r < MATRIX_ROWS; r++)
+      if (matrix_is_on(r, c)) xprintf("r:%d c:%d \n", r, c);
+#endif
+
+  return (uint8_t)changed;
+}
+
+inline
+matrix_row_t matrix_get_row(uint8_t row)
+{
+    return matrix[row];
+}
+
+void matrix_print(void)
+{
+  print("\nr/c 0123456789ABCDEF\n");
+  for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+    phex(row); print(": ");
+    pbin_reverse16(matrix_get_row(row));
+    print("\n");
+  }
+}
+
+uint8_t matrix_key_count(void)
+{
+  uint8_t count = 0;
+  for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+    count += bitpop16(matrix[i]);
+  }
+  return count;
+}
+
+static void matrix_select_row(uint8_t row)
+{
+#ifdef RIGHT_HALF
+  uint8_t txdata[3];
+
+  //Set the remote row on port A
+  txdata[0] = GPIOA;
+  txdata[1] = 0xFF & ~(1<<row);
+  mcp23018_status = i2c_transmit(I2C_ADDR_WRITE, (uint8_t *)txdata, 2, MCP23018_I2C_TIMEOUT);
+#endif
+
+  // select other half
+  DDRB = (1 << row);
+  PORTB = ~(1 << row);
+}

+ 17 - 0
keyboards/ymdk/sp64/readme.md

@@ -0,0 +1,17 @@
+# YMDK SP64
+
+* Keyboard Maintainer: [Nathan Walston](https://github.com/walston)
+* Hardware Supported: YMDK SP64 with the ATmega32a chip.
+* Hardware Availability: [Aliexpress](https://www.aliexpress.com/item/4000074426801.html?spm=a2g0o.productlist.0.0.13a043a4NuWRUc&algo_pvid=d2e1c7f2-710a-47be-98be-c2ee4c35e205&algo_expid=d2e1c7f2-710a-47be-98be-c2ee4c35e205-1&btsid=7eeb6dd6-e91f-4ecc-b94c-0ce4b1d089e0&ws_ab_test=searchweb0_0,searchweb201602_9,searchweb201603_53)
+
+Make example for this keyboard (after setting up your build environment):
+
+    make ymdk/sp64:default
+
+Flashing example for this keyboard ([after setting up the bootloadHID flashing environment](https://docs.qmk.fm/#/flashing_bootloadhid))
+
+    make ymdk/sp64:default:flash
+
+**Reset Key**: Hold down the key located at top left on the left hand board, commonly programmed as _ESC_ while plugging in the keyboard.  (NOTE:  If this doesn't work, try the lower left key on the lower left board, commonly programmed as _Control_.  There might be a different version of the board that uses that key as the reset.)
+
+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).

+ 32 - 0
keyboards/ymdk/sp64/rules.mk

@@ -0,0 +1,32 @@
+# MCU name
+MCU = atmega32a
+
+# Bootloader selection
+#   Teensy       halfkay
+#   Pro Micro    caterina
+#   Atmel DFU    atmel-dfu
+#   LUFA DFU     lufa-dfu
+#   QMK DFU      qmk-dfu
+#   ATmega32A    bootloadHID
+#   ATmega328P   USBasp
+BOOTLOADER = bootloadHID
+
+# Build Options
+#   change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes      # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = no        # Mouse keys
+EXTRAKEY_ENABLE = yes       # Audio control and System control
+CONSOLE_ENABLE = no        # Console for debug
+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
+#BACKLIGHT_ENABLE = yes       # Enable keyboard backlight functionality
+AUDIO_ENABLE = no    # There is no speaker on this PCB
+RGBLIGHT_ENABLE = yes       # Enable keyboard RGB underglow
+CUSTOM_MATRIX = yes
+
+# Needed for underglow
+WS2812_DRIVER = i2c
+
+SRC += matrix.c 
+QUANTUM_LIB_SRC += i2c_master.c

+ 93 - 0
keyboards/ymdk/sp64/sp64.c

@@ -0,0 +1,93 @@
+/* Copyright 2019 Neil Kettle
+ *
+ * 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 "sp64.h"
+
+#ifdef RIGHT_HALF
+bool i2c_initialized = 0;
+i2c_status_t mcp23018_status = I2C_STATUS_ERROR;
+
+uint8_t init_mcp23018(void)
+{
+  uint8_t data[3];
+  mcp23018_status = I2C_STATUS_ERROR;
+
+  // I2C subsystem
+  if (i2c_initialized == 0) {
+    i2c_init();  // on pins D(1,0)
+    i2c_initialized = true;
+    _delay_ms(1000);
+  }
+
+  // set pin direction
+  // - unused  : input  : 1
+  // - input   : input  : 1
+  // - driving : output :
+  data[0] = IODIRA;
+  data[1] = 0b00000000;
+  data[2] = 0b11111111;
+  mcp23018_status = i2c_transmit(I2C_ADDR_WRITE, (uint8_t *)data, 3, MCP23018_I2C_TIMEOUT);
+  if (mcp23018_status != I2C_STATUS_SUCCESS)
+    goto out;
+
+  // set pull-up
+  // - unused  : on  : 1
+  // - input   : on  : 1
+  // - driving : off : 0
+  data[0] = GPPUA;
+  data[1] = 0b00000000;
+  data[2] = 0b11111111;
+  mcp23018_status = i2c_transmit(I2C_ADDR_WRITE, (uint8_t *)data, 3, MCP23018_I2C_TIMEOUT);
+  if (mcp23018_status != I2C_STATUS_SUCCESS)
+    goto out;
+
+  //  set logical value (doesn't matter on inputs)
+  // - unused  : hi-Z : 1
+  // - input   : hi-Z : 1
+  // - driving : hi-Z : 1
+  data[0] = OLATA;
+  data[1] = 0b11111111;
+  data[2] = 0b11111111;
+  mcp23018_status = i2c_transmit(I2C_ADDR_WRITE, (uint8_t *)data, 3, MCP23018_I2C_TIMEOUT);
+
+out:
+  return (mcp23018_status);
+}
+#endif
+
+// Optional override functions below.
+// You can leave any or all of these undefined.
+// These are only required if you want to perform custom actions.
+
+__attribute__ ((weak))
+void matrix_init_user(void) {}
+
+void matrix_init_kb(void) {
+    // put your keyboard start-up code here
+    // runs once when the firmware starts up
+
+    matrix_init_user();
+}
+
+__attribute__ ((weak))
+void matrix_scan_user(void) {}
+
+void matrix_scan_kb(void) {
+    // put your looping keyboard code here
+    // runs every cycle (a lot)
+
+    matrix_scan_user();
+}

+ 84 - 0
keyboards/ymdk/sp64/sp64.h

@@ -0,0 +1,84 @@
+/* Copyright 2019 Neil Kettle
+ *
+ * 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"
+
+#ifdef RIGHT_HALF
+# include <stdint.h>
+# include "i2c_master.h"
+
+// I2C aliases and register addresses (see "mcp23018.md")
+# define I2C_ADDR        0b0100000
+# define I2C_ADDR_WRITE  ( (I2C_ADDR<<1) | I2C_WRITE )
+# define I2C_ADDR_READ   ( (I2C_ADDR<<1) | I2C_READ  )
+# define IODIRA          0x00            // i/o direction register
+# define IODIRB          0x01
+# define GPPUA           0x0C            // GPIO pull-up resistor register
+# define GPPUB           0x0D
+# define GPIOA           0x12            // general purpose i/o port register (write modifies OLAT)
+# define GPIOB           0x13
+# define OLATA           0x14            // output latch register
+# define OLATB           0x15
+
+extern i2c_status_t mcp23018_status;
+# define MCP23018_I2C_TIMEOUT 100
+
+uint8_t init_mcp23018(void);
+#endif
+
+#define ___ KC_NO
+#define XXX KC_NO
+
+/* This is 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.
+ *
+ *  LEFT HAND                                        RIGHT HAND
+ * ┌-----┬-----┬-----┬-----┬-----┬-----┬-----┐    ┌-----┬-----┬-----┬-----┬-----┬-----┬----------┐
+ * │ L00 │ L01 │ L02 │ L03 │ L04 │ L05 │ L06 │    │ R07 │ R08 │ R09 │ R0A │ R0B │ R0C │ R0D      │
+ * ├-----┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┘ ┌--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬--┴--┬-------┤
+ * │ L10    │ L11 │ L12 │ L13 │ L14 │ L15 │    │ R16 │ R17 │ R18 │ R19 │ R1A │ R1B │ R1C │ R1D   │
+ * ├--------┴┬----┴┬----┴┬----┴┬----┴┬----┴┐   └┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴-------┤
+ * │ L20     │ L21 │ L22 │ L23 │ L24 │ L25 │    │ R26 │ R27 │ R28 │ R29 │ R2A │ R2B │ R2C        │
+ * ├---------┴┬----┴┬----┴┬----┴┬----┴┬----┴┐   └┬----┴┬----┴┬----┴┬----┴┬----┴┬----┴┬-----┬-----┤
+ * │ L30      │ L31 │ L32 │ L33 │ L34 │ L35 │    │ R36 │ R37 │ R38 │ R39 │ R3A │ R3B │ R3C │ R3D │
+ * ├------┬---┴-┬---┴--┬--┴-----┴----┬┴----┬┘   ┌┴-----┴-----┴--┬--┴----┬┴-----┼-----┼-----┼-----┤
+ * │ L40  │ L41 │ L42  │ L43         │ L45 │    │ R46           │ R48   │ R4A  │ R4B │ R4C │ R4D │
+ * └------┴-----┴------┴-------------┴-----┘    └---------------┴-------┴------┴-----┴-----┴-----┘
+ */
+#define LAYOUT(                                                      \
+    L00, L01, L02, L03, L04, L05, L06,      R07, R08, R09, R0A, R0B, R0C, R0D, \
+    L10, L11, L12, L13, L14, L15,      R16, R17, R18, R19, R1A, R1B, R1C, R1D, \
+    L20, L21, L22, L23, L24, L25,      R26, R27, R28, R29, R2A, R2B, R2C,      \
+    L30, L31, L32, L33, L34, L35,      R36, R37, R38, R39, R3A, R3B, R3C, R3D, \
+    L40, L41, L42, L43,      L45,      R46,      R48,      R4A, R4B, R4C, R4D  \
+    )                       \
+   /* matrix positions */   \
+   {                        \
+    { ___, ___, ___, ___, ___, ___, ___, R46, R48, R4A, R4B, R4C, R4D, R3D },  \
+    { L40, L41, L42, L43, L45, L06, ___, R36, R37, R38, R39, R3A, R3B, R3C },  \
+    { L30, L31, L32, L33, L34, L35, ___, R26, R27, R28, R29, R2A, R2B, R2C },  \
+    { L20, L21, L22, L23, L24, L25, ___, R17, R18, R19, R1A, R1B, R1C, R1D },  \
+    { L10, L11, L12, L13, L14, L15, ___, R07, R08, R09, R0A, R0B, R0C, R0D },  \
+    { L00, L01, L02, L03, L04, L05, ___, R16, ___, ___, ___, ___, ___, ___ }   \
+   }
+