summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSalicylic-acid3 <46864619+Salicylic-acid3@users.noreply.github.com>2019-10-17 02:26:43 +0900
committerDrashna Jaelre <drashna@live.com>2019-10-16 10:26:43 -0700
commitf360c27f9302b1f916985dc32f68657ec22b3b9c (patch)
treeb3c3210e6c0c450b5d27d643c6d6817309ac83fc
parent2fc3494fd967bb2d8ffba3dcd33fa4a7ef1066ed (diff)
[Keyboard] Add keyboard Naked60 (#6527)
* Add Naked60 * readme Update * Update keyboards/naked60/rules.mk Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com> * Updated keymaps Changed the alias. * updated rule.mk Unnecessary part was deleted and explanation was added to the boot loader. * Update keyboards/naked60/rules.mk Co-Authored-By: fauxpark <fauxpark@gmail.com> * Update keyboards/naked60/rules.mk Co-Authored-By: fauxpark <fauxpark@gmail.com> * Update keyboards/naked60/rev1/rev1.h Co-Authored-By: fauxpark <fauxpark@gmail.com> * Update keyboards/naked60/rev1/rev1.h Co-Authored-By: fauxpark <fauxpark@gmail.com> * Update keyboards/naked60/rev1/config.h Co-Authored-By: fauxpark <fauxpark@gmail.com> * Update keyboards/naked60/rev1/config.h Co-Authored-By: fauxpark <fauxpark@gmail.com> * Updated keymaps rules.mk. Cleaned up declarations in rules.mk. * Updated keymap Changed remaining aliases. * Update rev1.c Cleaned up declarations in rev1.c. * Update readme The appearance has been adjusted. * Update keyboards/naked60/keymaps/default/readme.md Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com> * Update keyboards/naked60/keymaps/default_with_nafuda/readme.md Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com> * Update keyboards/naked60/keymaps/default_with_nafuda/readme.md Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com> * Update keyboards/naked60/keymaps/salicylic/readme.md Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com> * Update keyboards/naked60/keymaps/salicylic/rules.mk Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com> * Update keyboards/naked60/keymaps/salicylic_with_nafuda/rules.mk Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com> * Update keyboards/naked60/keymaps/salicylic_with_nafuda/rules.mk Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com> * Update keyboards/naked60/keymaps/salicylic_with_setta21/rules.mk Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com> * Update keyboards/naked60/keymaps/salicylic_with_setta21/rules.mk Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com> * Update keyboards/naked60/rev1/rev1.c Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com> * Update keyboards/naked60/rules.mk Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com> * Update keyboards/naked60/rules.mk Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com> * Update keyboards/naked60/keymaps/default_with_nafuda/rules.mk Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com> * Update keyboards/naked60/keymaps/salicylic/rules.mk Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com> * Update keyboards/naked60/keymaps/default_with_nafuda/rules.mk Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com> * Update keyboards/naked60/keymaps/default_with_setta21/rules.mk Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com> * Update keyboards/naked60/keymaps/default_with_setta21/rules.mk Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com> * Updated keymaps The appearance has been adjusted. Unnecessary rules.mk was deleted. * Update keyboards/naked60/readme.md Co-Authored-By: fauxpark <fauxpark@gmail.com> * Update readme Changed to markdown format. * Update keyboards/naked60/keymaps/default/readme.md Co-Authored-By: fauxpark <fauxpark@gmail.com> * Update keyboards/naked60/keymaps/salicylic/readme.md Co-Authored-By: fauxpark <fauxpark@gmail.com> * Update keyboards/naked60/keymaps/salicylic/readme.md Co-Authored-By: fauxpark <fauxpark@gmail.com>
-rw-r--r--keyboards/naked60/config.h43
-rw-r--r--keyboards/naked60/info.json312
-rw-r--r--keyboards/naked60/keymaps/default/config.h51
-rw-r--r--keyboards/naked60/keymaps/default/keymap.c139
-rw-r--r--keyboards/naked60/keymaps/default/readme.md53
-rw-r--r--keyboards/naked60/keymaps/default_with_nafuda/config.h90
-rw-r--r--keyboards/naked60/keymaps/default_with_nafuda/keymap.c212
-rw-r--r--keyboards/naked60/keymaps/default_with_nafuda/readme.md31
-rw-r--r--keyboards/naked60/keymaps/default_with_nafuda/rules.mk10
-rw-r--r--keyboards/naked60/keymaps/default_with_setta21/config.h90
-rw-r--r--keyboards/naked60/keymaps/default_with_setta21/keymap.c207
-rw-r--r--keyboards/naked60/keymaps/default_with_setta21/readme.md44
-rw-r--r--keyboards/naked60/keymaps/default_with_setta21/rules.mk9
-rw-r--r--keyboards/naked60/keymaps/salicylic/config.h51
-rw-r--r--keyboards/naked60/keymaps/salicylic/keymap.c147
-rw-r--r--keyboards/naked60/keymaps/salicylic/readme.md53
-rw-r--r--keyboards/naked60/keymaps/salicylic_with_nafuda/config.h90
-rw-r--r--keyboards/naked60/keymaps/salicylic_with_nafuda/keymap.c207
-rw-r--r--keyboards/naked60/keymaps/salicylic_with_nafuda/readme.md32
-rw-r--r--keyboards/naked60/keymaps/salicylic_with_nafuda/rules.mk9
-rw-r--r--keyboards/naked60/keymaps/salicylic_with_setta21/config.h90
-rw-r--r--keyboards/naked60/keymaps/salicylic_with_setta21/keymap.c207
-rw-r--r--keyboards/naked60/keymaps/salicylic_with_setta21/readme.md44
-rw-r--r--keyboards/naked60/keymaps/salicylic_with_setta21/rules.mk10
-rw-r--r--keyboards/naked60/naked60.c1
-rw-r--r--keyboards/naked60/naked60.h12
-rw-r--r--keyboards/naked60/readme.md18
-rw-r--r--keyboards/naked60/rev1/config.h119
-rw-r--r--keyboards/naked60/rev1/matrix.c357
-rw-r--r--keyboards/naked60/rev1/rev1.c1
-rw-r--r--keyboards/naked60/rev1/rev1.h97
-rw-r--r--keyboards/naked60/rev1/rules.mk3
-rw-r--r--keyboards/naked60/rev1/serial_config.h8
-rw-r--r--keyboards/naked60/rev1/serial_config_simpleapi.h8
-rw-r--r--keyboards/naked60/rev1/split_scomm.c92
-rw-r--r--keyboards/naked60/rev1/split_scomm.h22
-rw-r--r--keyboards/naked60/rev1/split_util.c70
-rw-r--r--keyboards/naked60/rev1/split_util.h16
-rw-r--r--keyboards/naked60/rules.mk40
-rw-r--r--keyboards/naked60/serial.c590
-rw-r--r--keyboards/naked60/serial.h86
41 files changed, 3771 insertions, 0 deletions
diff --git a/keyboards/naked60/config.h b/keyboards/naked60/config.h
new file mode 100644
index 0000000000..47f2a9aacf
--- /dev/null
+++ b/keyboards/naked60/config.h
@@ -0,0 +1,43 @@
+/*
+Copyright 2012 Jun Wako <wakojun@gmail.com>
+Copyright 2015 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/>.
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+// GCC include 'config.h" sequence in qmk_firmware/keyboards/naked60/
+// -include keyboards/naked60/config.h
+// -include keyboards/naked60/rev?/config.h
+// -include keyboards/naked60/rev?/keymaps/MAPNAME/config.h
+// XXXX.c
+
+#include <serial_config.h>
+
+// GCC include search path in qmk_firmare/keyboards/naked60/
+// #include "..." search starts here:
+// #include <...> search starts here:
+// keyboards/naked60/rev?/keymaps/MAPNAME
+// keyboards/naked60
+// keyboards/naked60/rev?
+// .
+// ./tmk_core
+// ......
+
+// MACRO and FUNCTION are features that are depreciated.
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
diff --git a/keyboards/naked60/info.json b/keyboards/naked60/info.json
new file mode 100644
index 0000000000..bc353f659a
--- /dev/null
+++ b/keyboards/naked60/info.json
@@ -0,0 +1,312 @@
+{
+ "keyboard_name": "Naked60",
+ "url": "https://salicylic-acid3.hatenablog.com/",
+ "maintainer": "Salicylic_acid3",
+ "width": 14,
+ "height": 5,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {
+ "label":"ESC",
+ "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":8,
+ "y":0
+ },
+ {
+ "label":"7",
+ "x":9,
+ "y":0
+ },
+ {
+ "label":"8",
+ "x":10,
+ "y":0
+ },
+ {
+ "label":"9",
+ "x":11,
+ "y":0
+ },
+ {
+ "label":"0",
+ "x":12,
+ "y":0
+ },
+ {
+ "label":"Back Space",
+ "x":13,
+ "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":8,
+ "y":1,
+ },
+ {
+ "label":"U",
+ "x":9,
+ "y":1,
+ },
+ {
+ "label":"I",
+ "x":10,
+ "y":1,
+ },
+ {
+ "label":"O",
+ "x":11,
+ "y":1,
+ },
+ {
+ "label":"P",
+ "x":12,
+ "y":1,
+ },
+ {
+ "label":"\\",
+ "x":13,
+ "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":8,
+ "y":2,
+ },
+ {
+ "label":"J",
+ "x":9,
+ "y":2,
+ },
+ {
+ "label":"K",
+ "x":10,
+ "y":2,
+ },
+ {
+ "label":"L",
+ "x":11,
+ "y":2,
+ },
+ {
+ "label":";",
+ "x":12,
+ "y":2,
+ },
+ {
+ "label":"'",
+ "x":13,
+ "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":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":"Enter",
+ "x":13,
+ "y":3,
+ },
+ {
+ "label":"Adjust",
+ "x":1,
+ "y":4,
+ },
+ {
+ "label":"Ctrl",
+ "x":2,
+ "y":4,
+ },
+ {
+ "label":"Alt",
+ "x":3,
+ "y":4,
+ },
+ {
+ "label":"GUI",
+ "x":4,
+ "y":4,
+ },
+ {
+ "label":"&dArr;",
+ "x":5,
+ "y":4,
+ },
+ {
+ "x":6,
+ "y":4,
+ },
+ {
+ "x":7,
+ "y":4,
+ },
+ {
+ "label":"&uArr;",
+ "x":8,
+ "y":4,
+ },
+ {
+ "label":"&larr;",
+ "x":9,
+ "y":4,
+ },
+ {
+ "label":"&darr;",
+ "x":10,
+ "y":4,
+ },
+ {
+ "label":"&uarr;",
+ "x":11,
+ "y":4,
+ },
+ {
+ "label":"&rarr;",
+ "x":12,
+ "y":4,
+ }
+ ]
+ }
+ }
+} \ No newline at end of file
diff --git a/keyboards/naked60/keymaps/default/config.h b/keyboards/naked60/keymaps/default/config.h
new file mode 100644
index 0000000000..140a79c772
--- /dev/null
+++ b/keyboards/naked60/keymaps/default/config.h
@@ -0,0 +1,51 @@
+/* Copyright 2018 Salicylic_acid3
+ *
+ * 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
+
+/* Select hand configuration */
+
+#define MASTER_LEFT
+// #define MASTER_RIGHT
+// #define EE_HANDS
+
+#define USE_SERIAL_PD2
+
+#define TAPPING_FORCE_HOLD
+#define TAPPING_TERM 180
+
+#define MK_3_SPEED
+
+#undef MOUSEKEY_INTERVAL
+#define MOUSEKEY_INTERVAL 0
+
+#undef MOUSEKEY_TIME_TO_MAX
+#define MOUSEKEY_TIME_TO_MAX 150
+
+#undef MOUSEKEY_MAX_SPEED
+#define MOUSEKEY_MAX_SPEED 3
+
+#undef MOUSEKEY_MOVE_DELTA
+#define MOUSEKEY_MOVE_DELTA 5
+
+#undef MOUSEKEY_DELAY
+#define MOUSEKEY_DELAY 0
+
+#undef MOUSEKEY_WHEEL_MAX_SPEED
+#define MOUSEKEY_WHEEL_MAX_SPEED 1
+
+#undef MOUSEKEY_WHEEL_TIME_TO_MAX
+#define MOUSEKEY_WHEEL_TIME_TO_MAX 0
diff --git a/keyboards/naked60/keymaps/default/keymap.c b/keyboards/naked60/keymaps/default/keymap.c
new file mode 100644
index 0000000000..4b15e969de
--- /dev/null
+++ b/keyboards/naked60/keymaps/default/keymap.c
@@ -0,0 +1,139 @@
+#include QMK_KEYBOARD_H
+
+extern keymap_config_t keymap_config;
+
+#ifdef RGBLIGHT_ENABLE
+//Following line allows macro to read current RGB settings
+extern rgblight_config_t rgblight_config;
+#endif
+
+extern uint8_t is_master;
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+enum layer_number {
+ _QWERTY = 0,
+ _FLOCK,
+ _LOWER,
+ _RAISE,
+ _ADJUST,
+};
+
+enum custom_keycodes {
+ FLOCK = SAFE_RANGE,
+ ADJUST,
+ RGBRST
+};
+
+enum tapdances{
+ TD_ESFL = 0,
+ TD_ESQW,
+};
+
+// Layer Mode aliases
+
+#define KC_SNUBS S(KC_NUBS)
+#define KC_SNUHS S(KC_NUHS)
+
+qk_tap_dance_action_t tap_dance_actions[] = {
+ [TD_ESFL] = ACTION_TAP_DANCE_DUAL_ROLE(KC_ESC, _FLOCK),
+ [TD_ESQW] = ACTION_TAP_DANCE_DUAL_ROLE(KC_ESC, _QWERTY),
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_QWERTY] = LAYOUT(
+ //,-----------------------------------------------------| |-----------------------------------------------------.
+ TD(TD_ESFL), 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_BSLS,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LCTRL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ ADJUST,KC_LCTRL, KC_LALT, KC_LGUI,MO(_LOWER),KC_SPC, KC_SPC,MO(_RAISE),KC_LEFT, KC_DOWN, KC_UP,KC_RIGHT
+ //`------------------------------------------------------------------------------------------------------------'
+ ),
+
+
+ [_FLOCK] = LAYOUT(
+ //,-----------------------------------------------------| |-----------------------------------------------------.
+ TD(TD_ESQW), KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ //`------------------------------------------------------------------------------------------------------------'
+ ),
+
+
+ [_LOWER] = LAYOUT(
+ //,-----------------------------------------------------| |-----------------------------------------------------.
+ KC_ESC, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ 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_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,KC_SNUHS,KC_SNUBS, _______, _______, _______,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+ //`------------------------------------------------------------------------------------------------------------'
+ ),
+
+
+ [_RAISE] = LAYOUT(
+ //,-----------------------------------------------------| |-----------------------------------------------------.
+ KC_ESC, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_TILD, 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, _______, _______, _______,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ //`------------------------------------------------------------------------------------------------------------'
+ ),
+
+
+ [_ADJUST] = LAYOUT( /* Base */
+ //,-----------------------------------------------------| |-----------------------------------------------------.
+ KC_ESC, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ _______, RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_MS_U, KC_BTN2, XXXXXXX,LALT(KC_PSCR),
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R, XXXXXXX, KC_PSCR,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,LCA(KC_DEL),
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ //`------------------------------------------------------------------------------------------------------------'
+ )
+};
+
+uint32_t layer_state_set_user(uint32_t state) {
+ return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
+}
+
+int RGB_current_mode;
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+
+ bool result = false;
+ switch (keycode) {
+ case ADJUST:
+ update_tri_layer_state(record->event.pressed, _ADJUST, _RAISE, _LOWER);
+ break;
+ default:
+ result = true;
+ break;
+ }
+
+ return result;
+} \ No newline at end of file
diff --git a/keyboards/naked60/keymaps/default/readme.md b/keyboards/naked60/keymaps/default/readme.md
new file mode 100644
index 0000000000..87ce8b3a29
--- /dev/null
+++ b/keyboards/naked60/keymaps/default/readme.md
@@ -0,0 +1,53 @@
+# The default keymap for naked60
+
+## Default
+| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
+|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|
+| ESC(FLock) | 1| 2| 3| 4| 5| | | 6| 7| 8| 9| 0| BSPC|
+| TAB | Q| W| E| R| T| | | Y| U| I| O| P| \ |
+| LSFT | A| S| D| F| G| | | H| J| K| L| ;| '|
+|LCTRL | Z| X| C| V| B| | | N| M| ,| .| /| ENT|
+| |ADJUST| LCTRL| LALT| LGUI| LOWER| SPC| SPC| RAISE| LEFT| DOWN| UP| RIGHT| |
+
+
+
+## FLock
+| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
+|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|
+| ESC(FLock)| F2| F3| F4| F5| F6| | | F7| F8| F9| F10| F11| BSPC|
+| TAB | Q| W| E| R| T| | | Y| U| I| O| P| BSLS|
+| LSFT | A| S| D| F| G| | | H| J| K| L| SCLN| QUOT|
+|LCTRL | Z| X| C| V| B| | | N| M| COMM| DOT| SLSH| ENT|
+| |ADJUST| LCTRL| LALT| LGUI| LOWER| SPC| SPC| RAISE| LEFT| DOWN| UP| RIGHT| |
+
+
+## Lower
+| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
+|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|
+| ESC| F2| F3| F4| F5| F6| | | F7| F8| F9| F10| F11| F12|
+| ~| !| @| #| $| %| | | ^| &| *| (| )| DEL|
+| _____| F1| F2| F3| F4| F5| | | F6| _| +| {| }| PIPE|
+| _____| F7| F8| F9| F10| F11| | | F12| SNUHS| SNUBS| ,| .| _____|
+| |ADJUST| LCTRL| LALT| LGUI| LOWER| SPC| SPC| RAISE| MNXT| VOLD| VOLU| MPLY| |
+
+
+## Raise
+| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
+|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|
+| ESC| F2| F3| F4| F5| F6| | | F7| F8| F9| F10| F11| F12|
+| ~| 1| 2| 3| 4| 5| | | 6| 7| 8| 9| 0| DEL|
+| _____| F1| F2| F3| F4| F5| | | F6| -| =| [| ]| BSLS|
+| _____| F7| F8| F9| F10| F11| | | F12| NUHS| NUBS| ,| .| _____|
+| |ADJUST| LCTRL| LALT| LGUI| LOWER| SPC| SPC| RAISE| MNXT| VOLD| VOLU| MPLY| |
+
+
+
+## Adjust
+| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
+|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|
+| ESC| F2| F3| F4| F5| F6| | | F7| F8| F9| F10| F11| F12|
+| TILD| RST| XXXXX| XXXXX| XXXXX| XXXXX| | | XXXXX| BTN1| MS_U| BTN2| XXXXX|Alt+PSCR|
+| LSFT| XXXXX| XXXXX| XXXXX| XXXXX| XXXXX| | | XXXXX| MS_L| MS_D| MS_R| XXXXX| PSCR|
+| LCTRL| XXXXX| XXXXX| XXXXX| XXXXX| XXXXX| | | XXXXX| XXXXX| XXXXX| XXXXX| XXXXX| C+A+D|
+| |ADJUST| LCTRL| LALT| LGUI| LOWER| SPC| SPC| RAISE| MNXT| VOLD| VOLU| MPLY| |
+
diff --git a/keyboards/naked60/keymaps/default_with_nafuda/config.h b/keyboards/naked60/keymaps/default_with_nafuda/config.h
new file mode 100644
index 0000000000..e188262cf9
--- /dev/null
+++ b/keyboards/naked60/keymaps/default_with_nafuda/config.h
@@ -0,0 +1,90 @@
+/* Copyright 2018 Salicylic_acid3
+ *
+ * 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
+
+/* Select hand configuration */
+
+#define MASTER_LEFT
+// #define MASTER_RIGHT
+// #define EE_HANDS
+
+#define USE_SERIAL_PD2
+
+#define TAPPING_FORCE_HOLD
+#define TAPPING_TERM 180
+
+#define RGBLED_NUM 7
+
+#ifndef IOS_DEVICE_ENABLE
+ #define RGBLIGHT_LIMIT_VAL 180
+ #define RGBLIGHT_VAL_STEP 17
+#else
+ #define RGBLIGHT_LIMIT_VAL 50
+ #define RGBLIGHT_VAL_STEP 4
+#endif
+#define RGBLIGHT_HUE_STEP 10
+#define RGBLIGHT_SAT_STEP 17
+
+#if defined(RGBLIGHT_ENABLE) && !defined(IOS_DEVICE_ENABLE)
+// USB_MAX_POWER_CONSUMPTION value for naked48 keyboard
+// 120 RGBoff, OLEDoff
+// 120 OLED
+// 330 RGB 6
+// 300 RGB 32
+// 310 OLED & RGB 32
+ #define USB_MAX_POWER_CONSUMPTION 400
+#else
+ // fix iPhone and iPad power adapter issue
+ // iOS device need lessthan 100
+ #define USB_MAX_POWER_CONSUMPTION 100
+#endif
+
+// Selection of RGBLIGHT MODE to use.
+#if defined(LED_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
+
+#define MK_3_SPEED
+
+#undef MOUSEKEY_INTERVAL
+#define MOUSEKEY_INTERVAL 0
+
+#undef MOUSEKEY_TIME_TO_MAX
+#define MOUSEKEY_TIME_TO_MAX 150
+
+#undef MOUSEKEY_MAX_SPEED
+#define MOUSEKEY_MAX_SPEED 3
+
+#undef MOUSEKEY_MOVE_DELTA
+#define MOUSEKEY_MOVE_DELTA 5
+
+#undef MOUSEKEY_DELAY
+#define MOUSEKEY_DELAY 0
+
+#undef MOUSEKEY_WHEEL_MAX_SPEED
+#define MOUSEKEY_WHEEL_MAX_SPEED 1
+
+#undef MOUSEKEY_WHEEL_TIME_TO_MAX
+#define MOUSEKEY_WHEEL_TIME_TO_MAX 0
diff --git a/keyboards/naked60/keymaps/default_with_nafuda/keymap.c b/keyboards/naked60/keymaps/default_with_nafuda/keymap.c
new file mode 100644
index 0000000000..d50af530da
--- /dev/null
+++ b/keyboards/naked60/keymaps/default_with_nafuda/keymap.c
@@ -0,0 +1,212 @@
+#include QMK_KEYBOARD_H
+
+extern keymap_config_t keymap_config;
+
+#ifdef RGBLIGHT_ENABLE
+//Following line allows macro to read current RGB settings
+extern rgblight_config_t rgblight_config;
+#endif
+
+extern uint8_t is_master;
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+enum layer_number {
+ _QWERTY = 0,
+ _FLOCK,
+ _MOUSE,
+ _BROWSER,
+ _LOWER,
+ _RAISE,
+ _ADJUST,
+};
+
+enum custom_keycodes {
+ FLOCK = SAFE_RANGE,
+ MOUSE,
+ BROWSER,
+ LOWER,
+ RAISE,
+ ADJUST,
+ RGBRST
+};
+
+enum tapdances{
+ TD_ESFL = 0,
+ TD_ESQW,
+};
+
+// Fillers to make layering more clear
+
+#define KC_CAD LCA(KC_DEL)
+#define KC_APSCR LALT(KC_PSCR)
+
+#define KC_SNUBS S(KC_NUBS)
+#define KC_SNUHS S(KC_NUHS)
+
+#define KC_RTAB LCTL(KC_TAB)
+#define KC_LTAB LCTL(LSFT(KC_TAB))
+#define KC_CTAB LCTL(KC_W)
+#define KC_RETAB LCTL(LSFT(KC_T))
+
+#define KC_TGMO TG(_MOUSE)
+#define KC_TGBR TG(_BROWSER)
+#define KC_BSAD LT(_ADJUST, KC_BSPC)
+
+qk_tap_dance_action_t tap_dance_actions[] = {
+ [TD_ESFL] = ACTION_TAP_DANCE_DUAL_ROLE(KC_ESC, _FLOCK),
+ [TD_ESQW] = ACTION_TAP_DANCE_DUAL_ROLE(KC_ESC, _QWERTY),
+};
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_QWERTY] = LAYOUT_with_nafuda(
+ //,-----------------------------------------------------| |-----------------------------------------------------. |--------------------------|
+ TD(TD_ESFL), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, KC_TGMO,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------|
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, KC_BSAD, KC_UP, KC_TGBR,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------|
+ KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_LEFT, KC_DOWN,KC_RIGHT,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------------------------|
+ KC_LCTRL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ ADJUST,KC_LCTRL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP,KC_RIGHT
+ //`------------------------------------------------------------------------------------------------------------'
+ ),
+
+ [_FLOCK] = LAYOUT_with_nafuda(
+ //,-----------------------------------------------------| |-----------------------------------------------------. |--------------------------|
+ TD(TD_ESQW), KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------------------------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ //`------------------------------------------------------------------------------------------------------------'
+ ),
+
+ [_MOUSE] = LAYOUT_with_nafuda(
+ //,-----------------------------------------------------| |-----------------------------------------------------. |--------------------------|
+ TD(TD_ESFL), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, KC_TGMO,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_BTN1, KC_MS_U, KC_BTN2,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------------------------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ //`------------------------------------------------------------------------------------------------------------'
+ ),
+
+ [_BROWSER] = LAYOUT_with_nafuda(
+ //,-----------------------------------------------------| |-----------------------------------------------------. |--------------------------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_CTAB,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_RETAB, KC_WH_U, KC_TGBR,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LTAB, KC_WH_D, KC_RTAB,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------------------------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ //`------------------------------------------------------------------------------------------------------------'
+ ),
+
+ [_LOWER] = LAYOUT_with_nafuda(
+ //,-----------------------------------------------------| |-----------------------------------------------------. |--------------------------|
+ KC_ESC, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TGMO,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------|
+ 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_BSAD, KC_UP, KC_TGBR,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------|
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, KC_LEFT, KC_DOWN,KC_RIGHT,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------------------------|
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,KC_SNUHS,KC_SNUBS, _______, _______, _______,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+ //`------------------------------------------------------------------------------------------------------------'
+ ),
+
+ [_RAISE] = LAYOUT_with_nafuda(
+ //,-----------------------------------------------------| |-----------------------------------------------------. |--------------------------|
+ KC_ESC, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TGMO,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------|
+ KC_TILD, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, KC_BSAD, KC_UP, KC_TGBR,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------|
+ 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_LEFT, KC_DOWN,KC_RIGHT,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------------------------|
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ //`------------------------------------------------------------------------------------------------------------'
+ ),
+
+ [_ADJUST] = LAYOUT_with_nafuda( /* Base */
+ //,-----------------------------------------------------| |-----------------------------------------------------. |--------------------------|
+ KC_ESC, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, RGB_VAD,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------|
+ _______, RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_MS_U, KC_BTN2, XXXXXXX,LALT(KC_PSCR), ADJUST, RGB_SAD, RGB_VAI,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------|
+ _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R, XXXXXXX, KC_PSCR, RGB_MOD, RGB_TOG, RGB_SAI,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------------------------|
+ _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,LCA(KC_DEL),
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ //`------------------------------------------------------------------------------------------------------------'
+ )
+};
+
+static inline void update_change_layer(bool pressed, uint8_t layer1, uint8_t layer2, uint8_t layer3) {
+
+ pressed ? layer_on(layer1) : layer_off(layer1);
+ IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2) ? layer_on(layer3) : layer_off(layer3);
+}
+
+int RGB_current_mode;
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+
+ bool result = false;
+ switch (keycode) {
+ case LOWER:
+ update_change_layer(record->event.pressed, _LOWER, _RAISE, _ADJUST);
+ break;
+ case RAISE:
+ update_change_layer(record->event.pressed, _RAISE, _LOWER, _ADJUST);
+ break;
+ case ADJUST:
+ update_change_layer(record->event.pressed, _ADJUST, _RAISE, _LOWER);
+ break;
+ #ifdef RGBLIGHT_ENABLE
+ case RGB_MOD:
+ if (record->event.pressed) {
+ rgblight_mode(RGB_current_mode);
+ rgblight_step();
+ RGB_current_mode = rgblight_config.mode;
+ }
+ break;
+ case RGBRST:
+ if (record->event.pressed) {
+ eeconfig_update_rgblight_default();
+ rgblight_enable();
+ RGB_current_mode = rgblight_config.mode;
+ }
+ break;
+ #endif
+ default:
+ result = true;
+ break;
+ }
+
+ return result;
+}
+
+void matrix_init_user(void) {
+ #ifdef RGBLIGHT_ENABLE
+ RGB_current_mode = rgblight_config.mode;
+ #endif
+}
diff --git a/keyboards/naked60/keymaps/default_with_nafuda/readme.md b/keyboards/naked60/keymaps/default_with_nafuda/readme.md
new file mode 100644
index 0000000000..574f90ffbd
--- /dev/null
+++ b/keyboards/naked60/keymaps/default_with_nafuda/readme.md
@@ -0,0 +1,31 @@
+# The default_with_nafuda keymap for naked60
+
+Add Nafuda maps to the default layout.
+
+## Default
+| 1 | 2 | 3 |
+|:----:|:----:|:----:|
+| | MOUSE| |
+| BS+Ad| UP|Browser|
+| LEFT| DOWN| RIGHT|
+
+## Mouse
+| 1 | 2 | 3 |
+|:----:|:----:|:----:|
+| |Default| |
+| BTN1| MS_U| BTN2|
+| MS_L| MS_D| MS_R|
+
+## Browser
+| 1 | 2 | 3 |
+|:----:|:----:|:----:|
+| |CloseTAB| |
+|ReOpenTAB|WH_U|Default|
+| LTAB| WH_D| RTAB|
+
+## Adjust
+| 1 | 2 | 3 |
+|:----:|:----:|:----:|
+| |LED_VAD| |
+|Default|LED_HUD|LED_VAI|
+|LED_MOD|LED_ON/Off|LED_HUI|
diff --git a/keyboards/naked60/keymaps/default_with_nafuda/rules.mk b/keyboards/naked60/keymaps/default_with_nafuda/rules.mk
new file mode 100644
index 0000000000..15a887e781
--- /dev/null
+++ b/keyboards/naked60/keymaps/default_with_nafuda/rules.mk
@@ -0,0 +1,10 @@
+RGBLIGHT_ENABLE = yes
+
+# If your custom naked60 pcb, you can rewrite to yes.
+LED_ANIMATIONS = yes # LED animations
+
+ifeq ($(strip $(LED_ANIMATIONS)), yes)
+ # OPT_DEFS += -DRGBLIGHT_ANIMATIONS
+ OPT_DEFS += -DLED_ANIMATIONS
+endif
+
diff --git a/keyboards/naked60/keymaps/default_with_setta21/config.h b/keyboards/naked60/keymaps/default_with_setta21/config.h
new file mode 100644
index 0000000000..fe162510d0
--- /dev/null
+++ b/keyboards/naked60/keymaps/default_with_setta21/config.h
@@ -0,0 +1,90 @@
+/* Copyright 2018 Salicylic_acid3
+ *
+ * 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
+
+/* Select hand configuration */
+
+#define MASTER_LEFT
+// #define MASTER_RIGHT
+// #define EE_HANDS
+
+#define USE_SERIAL_PD2
+
+#define TAPPING_FORCE_HOLD
+#define TAPPING_TERM 180
+
+#define RGBLED_NUM 21
+
+#ifndef IOS_DEVICE_ENABLE
+ #define RGBLIGHT_LIMIT_VAL 180
+ #define RGBLIGHT_VAL_STEP 17
+#else
+ #define RGBLIGHT_LIMIT_VAL 50
+ #define RGBLIGHT_VAL_STEP 4
+#endif
+#define RGBLIGHT_HUE_STEP 10
+#define RGBLIGHT_SAT_STEP 17
+
+#if defined(RGBLIGHT_ENABLE) && !defined(IOS_DEVICE_ENABLE)
+// USB_MAX_POWER_CONSUMPTION value for naked48 keyboard
+// 120 RGBoff, OLEDoff
+// 120 OLED
+// 330 RGB 6
+// 300 RGB 32
+// 310 OLED & RGB 32
+ #define USB_MAX_POWER_CONSUMPTION 400
+#else
+ // fix iPhone and iPad power adapter issue
+ // iOS device need lessthan 100
+ #define USB_MAX_POWER_CONSUMPTION 100
+#endif
+
+// Selection of RGBLIGHT MODE to use.
+#if defined(LED_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
+
+#define MK_3_SPEED
+
+#undef MOUSEKEY_INTERVAL
+#define MOUSEKEY_INTERVAL 0
+
+#undef MOUSEKEY_TIME_TO_MAX
+#define MOUSEKEY_TIME_TO_MAX 150
+
+#undef MOUSEKEY_MAX_SPEED
+#define MOUSEKEY_MAX_SPEED 3
+
+#undef MOUSEKEY_MOVE_DELTA
+#define MOUSEKEY_MOVE_DELTA 5
+
+#undef MOUSEKEY_DELAY
+#define MOUSEKEY_DELAY 0
+
+#undef MOUSEKEY_WHEEL_MAX_SPEED
+#define MOUSEKEY_WHEEL_MAX_SPEED 1
+
+#undef MOUSEKEY_WHEEL_TIME_TO_MAX
+#define MOUSEKEY_WHEEL_TIME_TO_MAX 0
diff --git a/keyboards/naked60/keymaps/default_with_setta21/keymap.c b/keyboards/naked60/keymaps/default_with_setta21/keymap.c
new file mode 100644
index 0000000000..06ea56501a
--- /dev/null
+++ b/keyboards/naked60/keymaps/default_with_setta21/keymap.c
@@ -0,0 +1,207 @@
+#include QMK_KEYBOARD_H
+
+extern keymap_config_t keymap_config;
+
+#ifdef RGBLIGHT_ENABLE
+//Following line allows macro to read current RGB settings
+extern rgblight_config_t rgblight_config;
+#endif
+
+extern uint8_t is_master;
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+enum layer_number {
+ _QWERTY = 0,
+ _FLOCK,
+ _LOWER,
+ _RAISE,
+ _ADJUST,
+};
+
+enum custom_keycodes {
+ FLOCK = SAFE_RANGE,
+ LOWER,
+ RAISE,
+ ADJUST,
+ KANJI,
+ RGBRST,
+ SEND_SUM,
+ SEND_AVERAGE,
+ SEND_COUNTIF,
+ SEND_MAX,
+ SEND_MIN
+};
+
+enum tapdances{
+ TD_ESFL = 0,
+ TD_ESQW,
+};
+
+// Fillers to make layering more clear
+#define KC_SNUBS S(KC_NUBS)
+#define KC_SNUHS S(KC_NUHS)
+
+#define KC_SSUM SEND_SUM
+#define KC_SAVE SEND_AVERAGE
+#define KC_SCOU SEND_COUNTIF
+#define KC_SMAX SEND_MAX
+#define KC_SMIN SEND_MIN
+
+#define KC_RADO LT(_RAISE, KC_PDOT)
+#define KC_LOP0 LT(_LOWER, KC_P0)
+#define KC_ADNL LT(_ADJUST, KC_NLCK)
+
+qk_tap_dance_action_t tap_dance_actions[] = {
+ [TD_ESFL] = ACTION_TAP_DANCE_DUAL_ROLE(KC_ESC, _FLOCK),
+ [TD_ESQW] = ACTION_TAP_DANCE_DUAL_ROLE(KC_ESC, _QWERTY),
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_QWERTY] = LAYOUT_with_setta21(
+ //,-----------------------------------------------------| |-----------------------------------------------------. |-----------------------------------------------|
+ TD(TD_ESFL), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, KC_LOP0, KC_P1, KC_P4, KC_P7,KC_ADNL, KC_ESC,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |-------+-------+-------+-------+-------+-------|
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, KC_P2, KC_P5, KC_P8,KC_PSLS, KC_F2,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |-------+-------+-------+-------+-------+-------|
+ KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_RADO, KC_P3, KC_P6, KC_P9,KC_PAST, KC_EQL,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |---------------+---------------+-------+-------|
+ KC_LCTRL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, KC_PENT, KC_PPLS,KC_PMNS, KC_DEL,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |-----------------------------------------------|
+ ADJUST,KC_LCTRL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP,KC_RIGHT
+ //`------------------------------------------------------------------------------------------------------------'
+ ),
+
+ [_FLOCK] = LAYOUT_with_setta21(
+ //,-----------------------------------------------------| |-----------------------------------------------------. |-----------------------------------------------|
+ TD(TD_ESQW), KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, _______,_______,_______,_______,_______,_______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |-------+-------+-------+-------+-------+-------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,_______,_______,_______,_______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |-------+-------+-------+-------+-------+-------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,_______,_______,_______,_______,_______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |---------------+---------------+-------+-------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,_______,_______,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |-----------------------------------------------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ //`------------------------------------------------------------------------------------------------------------'
+ ),
+
+ [_LOWER] = LAYOUT_with_setta21(
+ //,-----------------------------------------------------| |-----------------------------------------------------. |-----------------------------------------------|
+ KC_ESC, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, LOWER,XXXXXXX,KC_LEFT,XXXXXXX,XXXXXXX, KC_ESC,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |-------+-------+-------+-------+-------+-------|
+ 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_DOWN,KC_DOWN, KC_UP,KC_PSLS, KC_F2,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |-------+-------+-------+-------+-------+-------|
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, RAISE,XXXXXXX,KC_RIGHT,XXXXXXX,KC_PAST, KC_EQL,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |---------------+---------------+-------+-------|
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,KC_SNUHS,KC_SNUBS, _______, _______, _______, KC_PENT, KC_PPLS,KC_PMNS, KC_DEL,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |-----------------------------------------------|
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+ //`------------------------------------------------------------------------------------------------------------'
+ ),
+
+ [_RAISE] = LAYOUT_with_setta21(
+ //,-----------------------------------------------------| |-----------------------------------------------------. |-----------------------------------------------|
+ KC_ESC, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, LOWER, KC_F11, KC_F4, KC_F7,KC_SMIN, KC_ESC,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |-------+-------+-------+-------+-------+-------|
+ KC_TILD, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, KC_F12, KC_F5, KC_F8,KC_SMAX, KC_F2,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |-------+-------+-------+-------+-------+-------|
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, RAISE, KC_F3, KC_F6, KC_F9,KC_SCOU, KC_EQL,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |---------------+---------------+-------+-------|
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______, KC_RPRN, KC_SSUM,KC_SAVE, KC_DEL,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |-----------------------------------------------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ //`------------------------------------------------------------------------------------------------------------'
+ ),
+
+ [_ADJUST] = LAYOUT_with_setta21( /* Base */
+ //,-----------------------------------------------------| |-----------------------------------------------------. |-----------------------------------------------|
+ KC_ESC, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, LOWER,RGB_VAD,RGB_HUD,RGB_SAD, ADJUST,RGB_TOG,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |-------+-------+-------+-------+-------+-------|
+ _______, RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_MS_U, KC_BTN2, XXXXXXX,LALT(KC_PSCR), RGB_VAI,RGB_HUI,RGB_SAI,XXXXXXX,_______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |-------+-------+-------+-------+-------+-------|
+ _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R, XXXXXXX, KC_PSCR, RAISE,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,_______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |---------------+---------------+-------+-------|
+ _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,LCA(KC_DEL), RGB_MOD, _______,_______,_______,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |-----------------------------------------------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ //`------------------------------------------------------------------------------------------------------------'
+ )
+};
+
+static inline void update_change_layer(bool pressed, uint8_t layer1, uint8_t layer2, uint8_t layer3) {
+
+ pressed ? layer_on(layer1) : layer_off(layer1);
+ IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2) ? layer_on(layer3) : layer_off(layer3);
+}
+
+int RGB_current_mode;
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+
+ bool result = false;
+ switch (keycode) {
+ case LOWER:
+ update_change_layer(record->event.pressed, _LOWER, _RAISE, _ADJUST);
+ break;
+ case RAISE:
+ update_change_layer(record->event.pressed, _RAISE, _LOWER, _ADJUST);
+ break;
+ case ADJUST:
+ update_change_layer(record->event.pressed, _ADJUST, _RAISE, _LOWER);
+ break;
+ case SEND_SUM:
+ if (record->event.pressed) {
+ SEND_STRING("=SUM(");
+ }
+ break;
+ case SEND_AVERAGE:
+ if (record->event.pressed) {
+ SEND_STRING("=AVERAGE(");
+ }
+ break;
+ case SEND_COUNTIF:
+ if (record->event.pressed) {
+ SEND_STRING("=COUNTIF(");
+ }
+ break;
+ case SEND_MAX:
+ if (record->event.pressed) {
+ SEND_STRING("=MAX(");
+ }
+ break;
+ case SEND_MIN:
+ if (record->event.pressed) {
+ SEND_STRING("=MIN(");
+ }
+ break;
+ #ifdef RGBLIGHT_ENABLE
+ case RGB_MOD:
+ if (record->event.pressed) {
+ rgblight_mode(RGB_current_mode);
+ rgblight_step();
+ RGB_current_mode = rgblight_config.mode;
+ }
+ break;
+ case RGBRST:
+ if (record->event.pressed) {
+ eeconfig_update_rgblight_default();
+ rgblight_enable();
+ RGB_current_mode = rgblight_config.mode;
+ }
+ break;
+ #endif
+ default:
+ result = true;
+ break;
+ }
+
+ return result;
+}
+
+void matrix_init_user(void) {
+ #ifdef RGBLIGHT_ENABLE
+ RGB_current_mode = rgblight_config.mode;
+ #endif
+}
diff --git a/keyboards/naked60/keymaps/default_with_setta21/readme.md b/keyboards/naked60/keymaps/default_with_setta21/readme.md
new file mode 100644
index 0000000000..750a8b3508
--- /dev/null
+++ b/keyboards/naked60/keymaps/default_with_setta21/readme.md
@@ -0,0 +1,44 @@
+# The default_with_setta21 keymap for naked60
+
+Add Setta21 maps to the default layout.
+
+## Default
+| 1 | 2 | 3 | 4 |
+|:----:|:----:|:----:|:----:|
+| ESC| F2| =| DEL|
+|Ad+Num| /| *| -|
+| 7| 8| 9| |
+| 4| 5| 6| +|
+| 1| 2| 3| |
+| Rai+0| | LOW + .| ENT|
+
+## Lower
+| 1 | 2 | 3 | 4 |
+|:----:|:----:|:----:|:----:|
+| ESC| F2| =| DEL|
+| =MIN(| =MAX(|=COUNTIF(|=AVERAGE(|
+| F7| F8| F9| |
+| F4| F5| F6| =SUM(|
+| F11| F12| F3| |
+| RAISE| | LOWER| )|
+
+## Raise
+| 1 | 2 | 3 | 4 |
+|:----:|:----:|:----:|:----:|
+| ESC| F2| =| DEL|
+| XXXXX| /| *| -|
+| XXXXX| UP| XXXXX| |
+| LEFT| DOWN| RIGHT| +|
+| XXXXX| DOWN| XXXXX| |
+| RAISE| | LOWER| ENT|
+
+## Adjust
+| 1 | 2 | 3 | 4 |
+|:----:|:----:|:----:|:----:|
+| ESC| F2| =| DEL|
+|ADJUST| XXXXX| XXXXX| -|
+|LED_SAD|LED_SAI| XXXXX| |
+|LED_HUD|LED_HUI| XXXXX| +|
+|LED_VAD|LED_VAI| XXXXX| |
+|LED_ON/Off| | XXXXX|LED_MOD|
+
diff --git a/keyboards/naked60/keymaps/default_with_setta21/rules.mk b/keyboards/naked60/keymaps/default_with_setta21/rules.mk
new file mode 100644
index 0000000000..b714c8f51f
--- /dev/null
+++ b/keyboards/naked60/keymaps/default_with_setta21/rules.mk
@@ -0,0 +1,9 @@
+RGBLIGHT_ENABLE = yes
+
+# If your custom naked60 pcb, you can rewrite to yes.
+LED_ANIMATIONS = yes # LED animations
+
+ifeq ($(strip $(LED_ANIMATIONS)), yes)
+ # OPT_DEFS += -DRGBLIGHT_ANIMATIONS
+ OPT_DEFS += -DLED_ANIMATIONS
+endif
diff --git a/keyboards/naked60/keymaps/salicylic/config.h b/keyboards/naked60/keymaps/salicylic/config.h
new file mode 100644
index 0000000000..140a79c772
--- /dev/null
+++ b/keyboards/naked60/keymaps/salicylic/config.h
@@ -0,0 +1,51 @@
+/* Copyright 2018 Salicylic_acid3
+ *
+ * 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
+
+/* Select hand configuration */
+
+#define MASTER_LEFT
+// #define MASTER_RIGHT
+// #define EE_HANDS
+
+#define USE_SERIAL_PD2
+
+#define TAPPING_FORCE_HOLD
+#define TAPPING_TERM 180
+
+#define MK_3_SPEED
+
+#undef MOUSEKEY_INTERVAL
+#define MOUSEKEY_INTERVAL 0
+
+#undef MOUSEKEY_TIME_TO_MAX
+#define MOUSEKEY_TIME_TO_MAX 150
+
+#undef MOUSEKEY_MAX_SPEED
+#define MOUSEKEY_MAX_SPEED 3
+
+#undef MOUSEKEY_MOVE_DELTA
+#define MOUSEKEY_MOVE_DELTA 5
+
+#undef MOUSEKEY_DELAY
+#define MOUSEKEY_DELAY 0
+
+#undef MOUSEKEY_WHEEL_MAX_SPEED
+#define MOUSEKEY_WHEEL_MAX_SPEED 1
+
+#undef MOUSEKEY_WHEEL_TIME_TO_MAX
+#define MOUSEKEY_WHEEL_TIME_TO_MAX 0
diff --git a/keyboards/naked60/keymaps/salicylic/keymap.c b/keyboards/naked60/keymaps/salicylic/keymap.c
new file mode 100644
index 0000000000..11d2e14310
--- /dev/null
+++ b/keyboards/naked60/keymaps/salicylic/keymap.c
@@ -0,0 +1,147 @@
+#include QMK_KEYBOARD_H
+#include "keymap_jp.h"
+
+extern keymap_config_t keymap_config;
+
+#ifdef RGBLIGHT_ENABLE
+//Following line allows macro to read current RGB settings
+extern rgblight_config_t rgblight_config;
+#endif
+
+extern uint8_t is_master;
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+enum layer_number {
+ _QWERTY = 0,
+ _FLOCK,
+ _LOWER,
+ _RAISE,
+ _ADJUST,
+};
+
+enum custom_keycodes {
+ FLOCK = SAFE_RANGE,
+ LOWER,
+ RAISE,
+ ADJUST,
+ RGBRST
+};
+
+enum tapdances{
+ TD_ESFL = 0,
+ TD_ESQW,
+};
+
+// Fillers to make layering more clear
+#define KC_CT11 LCTL_T(KC_F11)
+#define KC_SF12 SFT_T(KC_F12)
+#define KC_LOEN LT(_LOWER, KC_ENT)
+#define KC_RASP LT(_RAISE, KC_SPC)
+
+qk_tap_dance_action_t tap_dance_actions[] = {
+ [TD_ESFL] = ACTION_TAP_DANCE_DUAL_ROLE(KC_ESC, _FLOCK),
+ [TD_ESQW] = ACTION_TAP_DANCE_DUAL_ROLE(KC_ESC, _QWERTY),
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_QWERTY] = LAYOUT(
+ //,-----------------------------------------------------| |-----------------------------------------------------.
+ TD(TD_ESFL), 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, JP_LBRC,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LCTRL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, JP_MINS, JP_RBRC,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, JP_COMM, JP_DOT, JP_SLSH, JP_BSLS,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ KC_LEFT,KC_RIGHT, KC_LGUI, KC_MHEN, KC_LOEN, KC_BSPC, KC_DEL, KC_RASP, KC_HENK, KC_LALT, KC_DOWN, KC_UP
+ //`------------------------------------------------------------------------------------------------------------'
+ ),
+
+
+ [_FLOCK] = LAYOUT(
+ //,-----------------------------------------------------| |-----------------------------------------------------.
+ TD(TD_ESQW), KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ //`------------------------------------------------------------------------------------------------------------'
+ ),
+
+
+ [_LOWER] = LAYOUT(
+ //,-----------------------------------------------------| |-----------------------------------------------------.
+ KC_ESC, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ JP_COLN, JP_EXLM, JP_QUES, JP_LBRC, JP_RBRC, JP_TILD, KC_6, KC_7, KC_8, KC_9, JP_ASTR, JP_SLSH,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ JP_QUOT, JP_HASH, JP_DQT, JP_LPRN, JP_RPRN, JP_AT, XXXXXXX, KC_4, KC_5, KC_6, JP_MINS, JP_EQL,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ JP_CIRC, JP_PERC, JP_AMPR, JP_SCLN, JP_COLN, JP_PIPE, KC_0, KC_1, KC_2, KC_3, JP_PLUS, KC_ENT,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, KC_ZKHK, LOWER, _______, _______, RAISE, KC_0, JP_DOT, _______, _______
+ //`------------------------------------------------------------------------------------------------------------'
+ ),
+
+
+ [_RAISE] = LAYOUT(
+ //,-----------------------------------------------------| |-----------------------------------------------------.
+ KC_ESC, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, XXXXXXX, KC_UP, XXXXXXX, KC_PGUP, KC_DEL,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_CT11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, XXXXXXX, KC_LEFT, KC_DOWN,KC_RIGHT, KC_LSFT, KC_ENT,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_SF12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PGDN, XXXXXXX,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ //`------------------------------------------------------------------------------------------------------------'
+ ),
+
+ [_ADJUST] = LAYOUT( /* Base */
+ //,-----------------------------------------------------| |-----------------------------------------------------.
+ KC_ESC, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ _______, RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_MS_U, KC_BTN2, XXXXXXX,LALT(KC_PSCR),
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LCTRL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R, XXXXXXX, KC_PSCR,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,LCA(KC_DEL),
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ //`------------------------------------------------------------------------------------------------------------'
+ )
+};
+
+static inline void update_change_layer(bool pressed, uint8_t layer1, uint8_t layer2, uint8_t layer3) {
+
+ pressed ? layer_on(layer1) : layer_off(layer1);
+ IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2) ? layer_on(layer3) : layer_off(layer3);
+}
+
+int RGB_current_mode;
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+
+ bool result = false;
+ switch (keycode) {
+ case LOWER:
+ update_change_layer(record->event.pressed, _LOWER, _RAISE, _ADJUST);
+ break;
+ case RAISE:
+ update_change_layer(record->event.pressed, _RAISE, _LOWER, _ADJUST);
+ break;
+ default:
+ result = true;
+ break;
+ }
+
+ return result;
+}
diff --git a/keyboards/naked60/keymaps/salicylic/readme.md b/keyboards/naked60/keymaps/salicylic/readme.md
new file mode 100644
index 0000000000..da21263816
--- /dev/null
+++ b/keyboards/naked60/keymaps/salicylic/readme.md
@@ -0,0 +1,53 @@
+# The salicylic keymap for naked60
+
+## Default
+| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
+|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|
+| ESC(FLock) | 1| 2| 3| 4| 5| | | 6| 7| 8| 9| 0| BSPC|
+| TAB | Q| W| E| R| T| | | Y| U| I| O| P| [|
+|LCTRL | A| S| D| F| G| | | H| J| K| L| -| ]|
+| LSFT | Z| X| C| V| B| | | N| M| ,| .| /| \ |
+| | LEFT| RIGHT| LGUI| MHEN|Low+Ent| BSPC| DEL|Rai+SPC| HENK| LALT| UP| DOWN| |
+
+
+
+## FLock
+| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
+|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|
+| ESC(FLock)|F2| F3| F4| F5| F6| | | F7| F8| F9| F10| F11| _____|
+| TAB | Q| W| E| R| T| | | Y| U| I| O| P| [|
+|LCTRL | A| S| D| F| G| | | H| J| K| L| -| ]|
+| LSFT | Z| X| C| V| B| | | N| M| ,| .| /| \ |
+| | LEFT| RIGHT| LGUI| MHEN|Low+Ent| BSPC| DEL|Rai+SPC| HENK| LALT| UP| DOWN| |
+
+
+## Lower
+| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
+|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|
+| ESC| F2| F3| F4| F5| F6| | | F7| F8| F9| F10| F11| F12|
+| :| !| ?| [| ]| ~| | | 6| 7| 8| 9| *| /|
+| '| #| "| (| )| @| | | XXXXX| 4| 5| 6| -| =|
+| ^| %| &| ;| :| PIPE| | | 0| 1| 2| 3| +| ENT|
+| | LEFT| RIGHT| LGUI| ZKHK| LOWER| BSPC| DEL| RAISE| 0| .| UP| DOWN| |
+
+
+## Raise
+| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
+|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|
+| ESC| F2| F3| F4| F5| F6| | | F7| F8| F9| F10| F11| F12|
+| ESC| 1| 2| 3| 4| 5| | | XXXXX| XXXXX| UP| XXXXX| PGUP| BSPC|
+|CtrlF11| F1| F2| F3| F4| F5| | | XXXXX| LEFT| DOWN| RIGHT| LSFT| ENT|
+|ShiftF12| F6| F7| F8| F9| F10| | | XXXXX| XXXXX| XXXXX| XXXXX| PGDN| XXXXX|
+| | LEFT| RIGHT| LGUI| ZKHK| LOWER| BSPC| DEL| RAISE| HENK| LALT| UP| DOWN| |
+
+
+
+## Adjust
+| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
+|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|
+| ESC| F2| F3| F4| F5| | | F6| F7| F8| F9| F10| F11| F12|
+| ESC| RST| XXXXX| XXXXX| XXXXX| XXXXX| | | XXXXX| BTN1| MS_U| BTN2| XXXXX|Alt+PSCR|
+| LCTRL| XXXXX| XXXXX| XXXXX| XXXXX| XXXXX| | | XXXXX| MS_L| MS_D| MS_R| XXXXX| PSCR|
+| LSFT| XXXXX| XXXXX| XXXXX| XXXXX| XXXXX| | | XXXXX| XXXXX| XXXXX| XXXXX| XXXXX| C+A+D|
+| | LEFT| RIGHT| LGUI| ZKHK| LOWER| BSPC| DEL| RAISE| HENK| LALT| UP| DOWN| |
+
diff --git a/keyboards/naked60/keymaps/salicylic_with_nafuda/config.h b/keyboards/naked60/keymaps/salicylic_with_nafuda/config.h
new file mode 100644
index 0000000000..e188262cf9
--- /dev/null
+++ b/keyboards/naked60/keymaps/salicylic_with_nafuda/config.h
@@ -0,0 +1,90 @@
+/* Copyright 2018 Salicylic_acid3
+ *
+ * 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
+
+/* Select hand configuration */
+
+#define MASTER_LEFT
+// #define MASTER_RIGHT
+// #define EE_HANDS
+
+#define USE_SERIAL_PD2
+
+#define TAPPING_FORCE_HOLD
+#define TAPPING_TERM 180
+
+#define RGBLED_NUM 7
+
+#ifndef IOS_DEVICE_ENABLE
+ #define RGBLIGHT_LIMIT_VAL 180
+ #define RGBLIGHT_VAL_STEP 17
+#else
+ #define RGBLIGHT_LIMIT_VAL 50
+ #define RGBLIGHT_VAL_STEP 4
+#endif
+#define RGBLIGHT_HUE_STEP 10
+#define RGBLIGHT_SAT_STEP 17
+
+#if defined(RGBLIGHT_ENABLE) && !defined(IOS_DEVICE_ENABLE)
+// USB_MAX_POWER_CONSUMPTION value for naked48 keyboard
+// 120 RGBoff, OLEDoff
+// 120 OLED
+// 330 RGB 6
+// 300 RGB 32
+// 310 OLED & RGB 32
+ #define USB_MAX_POWER_CONSUMPTION 400
+#else
+ // fix iPhone and iPad power adapter issue
+ // iOS device need lessthan 100
+ #define USB_MAX_POWER_CONSUMPTION 100
+#endif
+
+// Selection of RGBLIGHT MODE to use.
+#if defined(LED_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
+
+#define MK_3_SPEED
+
+#undef MOUSEKEY_INTERVAL
+#define MOUSEKEY_INTERVAL 0
+
+#undef MOUSEKEY_TIME_TO_MAX
+#define MOUSEKEY_TIME_TO_MAX 150
+
+#undef MOUSEKEY_MAX_SPEED
+#define MOUSEKEY_MAX_SPEED 3
+
+#undef MOUSEKEY_MOVE_DELTA
+#define MOUSEKEY_MOVE_DELTA 5
+
+#undef MOUSEKEY_DELAY
+#define MOUSEKEY_DELAY 0
+
+#undef MOUSEKEY_WHEEL_MAX_SPEED
+#define MOUSEKEY_WHEEL_MAX_SPEED 1
+
+#undef MOUSEKEY_WHEEL_TIME_TO_MAX
+#define MOUSEKEY_WHEEL_TIME_TO_MAX 0
diff --git a/keyboards/naked60/keymaps/salicylic_with_nafuda/keymap.c b/keyboards/naked60/keymaps/salicylic_with_nafuda/keymap.c
new file mode 100644
index 0000000000..33ccdf603f
--- /dev/null
+++ b/keyboards/naked60/keymaps/salicylic_with_nafuda/keymap.c
@@ -0,0 +1,207 @@
+#include QMK_KEYBOARD_H
+#include "keymap_jp.h"
+
+extern keymap_config_t keymap_config;
+
+#ifdef RGBLIGHT_ENABLE
+//Following line allows macro to read current RGB settings
+extern rgblight_config_t rgblight_config;
+#endif
+
+extern uint8_t is_master;
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+enum layer_number {
+ _QWERTY = 0,
+ _FLOCK,
+ _MOUSE,
+ _BROWSER,
+ _LOWER,
+ _RAISE,
+ _ADJUST,
+};
+
+enum custom_keycodes {
+ FLOCK = SAFE_RANGE,
+ MOUSE,
+ BROWSER,
+ LOWER,
+ RAISE,
+ ADJUST,
+ RGBRST
+};
+
+enum tapdances{
+ TD_ESFL = 0,
+ TD_ESQW,
+};
+
+// Fillers to make layering more clear
+#define KC_CT11 LCTL_T(KC_F11)
+#define KC_SF12 SFT_T(KC_F12)
+#define KC_LOEN LT(_LOWER, KC_ENT)
+#define KC_RASP LT(_RAISE, KC_SPC)
+
+#define KC_RTAB LCTL(KC_TAB)
+#define KC_LTAB LCTL(LSFT(KC_TAB))
+#define KC_CTAB LCTL(KC_W)
+#define KC_RETAB LCTL(LSFT(KC_T))
+
+#define KC_TGMO TG(_MOUSE)
+#define KC_TGBR TG(_BROWSER)
+#define KC_BSAD LT(_ADJUST, KC_BSPC)
+
+qk_tap_dance_action_t tap_dance_actions[] = {
+ [TD_ESFL] = ACTION_TAP_DANCE_DUAL_ROLE(KC_ESC, _FLOCK),
+ [TD_ESQW] = ACTION_TAP_DANCE_DUAL_ROLE(KC_ESC, _QWERTY),
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_QWERTY] = LAYOUT_with_nafuda(
+ //,-----------------------------------------------------| |-----------------------------------------------------. |--------------------------|
+ TD(TD_ESFL), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, KC_TGMO,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------|
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, JP_LBRC, KC_BSAD, KC_UP, KC_TGBR,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------|
+ KC_LCTRL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, JP_MINS, JP_RBRC, KC_LEFT, KC_DOWN,KC_RIGHT,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------------------------|
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, JP_COMM, JP_DOT, JP_SLSH, JP_BSLS,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ KC_LEFT,KC_RIGHT, KC_LGUI, KC_MHEN, KC_LOEN, KC_BSPC, KC_DEL, KC_RASP, KC_HENK, KC_LALT, KC_DOWN, KC_UP
+ //`------------------------------------------------------------------------------------------------------------'
+ ),
+
+ [_FLOCK] = LAYOUT_with_nafuda(
+ //,-----------------------------------------------------| |-----------------------------------------------------. |--------------------------|
+ TD(TD_ESQW), KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------------------------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ //`------------------------------------------------------------------------------------------------------------'
+ ),
+
+ [_MOUSE] = LAYOUT_with_nafuda(
+ //,-----------------------------------------------------| |-----------------------------------------------------. |--------------------------|
+ TD(TD_ESFL), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, KC_TGMO,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_BTN1, KC_MS_U, KC_BTN2,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------------------------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ //`------------------------------------------------------------------------------------------------------------'
+ ),
+
+ [_BROWSER] = LAYOUT_with_nafuda(
+ //,-----------------------------------------------------| |-----------------------------------------------------. |--------------------------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_CTAB,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_RETAB, KC_WH_U, KC_TGBR,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LTAB, KC_WH_D, KC_RTAB,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------------------------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ //`------------------------------------------------------------------------------------------------------------'
+ ),
+
+ [_LOWER] = LAYOUT_with_nafuda(
+ //,-----------------------------------------------------| |-----------------------------------------------------. |--------------------------|
+ KC_ESC, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TGMO,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------|
+ JP_COLN, JP_EXLM, JP_QUES, JP_LBRC, JP_RBRC, JP_TILD, KC_6, KC_7, KC_8, KC_9, JP_ASTR, JP_SLSH, KC_BSAD, KC_UP, KC_TGBR,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------|
+ JP_QUOT, JP_HASH, JP_DQT, JP_LPRN, JP_RPRN, JP_AT, XXXXXXX, KC_4, KC_5, KC_6, JP_MINS, JP_EQL, KC_LEFT, KC_DOWN,KC_RIGHT,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------------------------|
+ JP_CIRC, JP_PERC, JP_AMPR, JP_SCLN, JP_COLN, JP_PIPE, KC_0, KC_1, KC_2, KC_3, JP_PLUS, KC_ENT,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, KC_ZKHK, LOWER, _______, _______, RAISE, KC_0, JP_DOT, _______, _______
+ //`------------------------------------------------------------------------------------------------------------'
+ ),
+
+ [_RAISE] = LAYOUT_with_nafuda(
+ //,-----------------------------------------------------| |-----------------------------------------------------. |--------------------------|
+ KC_ESC, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TGMO,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------|
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, XXXXXXX, KC_UP, XXXXXXX, KC_PGUP, KC_DEL, KC_BSAD, KC_UP, KC_TGBR,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------|
+ KC_CT11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, XXXXXXX, KC_LEFT, KC_DOWN,KC_RIGHT, KC_LSFT, KC_ENT, KC_LEFT, KC_DOWN,KC_RIGHT,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------------------------|
+ KC_SF12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PGDN, XXXXXXX,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ //`------------------------------------------------------------------------------------------------------------'
+ ),
+
+ [_ADJUST] = LAYOUT_with_nafuda( /* Base */
+ //,-----------------------------------------------------| |-----------------------------------------------------. |--------------------------|
+ KC_ESC, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, RGB_VAD,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------|
+ _______, RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_MS_U, KC_BTN2, XXXXXXX,LALT(KC_PSCR), ADJUST, RGB_SAD, RGB_VAI,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------|
+ KC_LCTRL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R, XXXXXXX, KC_PSCR, RGB_MOD, RGB_TOG, RGB_SAI,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------------------------|
+ KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,LCA(KC_DEL),
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ //`------------------------------------------------------------------------------------------------------------'
+ )
+};
+
+static inline void update_change_layer(bool pressed, uint8_t layer1, uint8_t layer2, uint8_t layer3) {
+
+ pressed ? layer_on(layer1) : layer_off(layer1);
+ IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2) ? layer_on(layer3) : layer_off(layer3);
+}
+
+int RGB_current_mode;
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+
+ bool result = false;
+ switch (keycode) {
+ case LOWER:
+ update_change_layer(record->event.pressed, _LOWER, _RAISE, _ADJUST);
+ break;
+ case RAISE:
+ update_change_layer(record->event.pressed, _RAISE, _LOWER, _ADJUST);
+ break;
+ #ifdef RGBLIGHT_ENABLE
+ case RGB_MOD:
+ if (record->event.pressed) {
+ rgblight_mode(RGB_current_mode);
+ rgblight_step();
+ RGB_current_mode = rgblight_config.mode;
+ }
+ break;
+ case RGBRST:
+ if (record->event.pressed) {
+ eeconfig_update_rgblight_default();
+ rgblight_enable();
+ RGB_current_mode = rgblight_config.mode;
+ }
+ break;
+ #endif
+ default:
+ result = true;
+ break;
+ }
+
+ return result;
+}
+
+void matrix_init_user(void) {
+ #ifdef RGBLIGHT_ENABLE
+ RGB_current_mode = rgblight_config.mode;
+ #endif
+}
diff --git a/keyboards/naked60/keymaps/salicylic_with_nafuda/readme.md b/keyboards/naked60/keymaps/salicylic_with_nafuda/readme.md
new file mode 100644
index 0000000000..8c83f7ea36
--- /dev/null
+++ b/keyboards/naked60/keymaps/salicylic_with_nafuda/readme.md
@@ -0,0 +1,32 @@
+# The salicylic_with_nafuda keymap for naked60
+
+Add Nafuda maps to the salicylic layout.
+
+## Default
+| 1 | 2 | 3 |
+|:----:|:----:|:----:|
+| | MOUSE| |
+| BS+Ad| UP|Browser|
+| LEFT| DOWN| RIGHT|
+
+## Mouse
+| 1 | 2 | 3 |
+|:----:|:----:|:----:|
+| |Default| |
+| BTN1| MS_U| BTN2|
+| MS_L| MS_D| MS_R|
+
+## Browser
+| 1 | 2 | 3 |
+|:----:|:----:|:----:|
+| |CloseTAB| |
+|ReOpenTAB|WH_U|Default|
+| LTAB| WH_D| RTAB|
+
+## Adjust
+| 1 | 2 | 3 |
+|:----:|:----:|:----:|
+| |LED_VAD| |
+|Default|LED_HUD|LED_VAI|
+|LED_MOD|LED_ON/Off|LED_HUI|
+
diff --git a/keyboards/naked60/keymaps/salicylic_with_nafuda/rules.mk b/keyboards/naked60/keymaps/salicylic_with_nafuda/rules.mk
new file mode 100644
index 0000000000..b714c8f51f
--- /dev/null
+++ b/keyboards/naked60/keymaps/salicylic_with_nafuda/rules.mk
@@ -0,0 +1,9 @@
+RGBLIGHT_ENABLE = yes
+
+# If your custom naked60 pcb, you can rewrite to yes.
+LED_ANIMATIONS = yes # LED animations
+
+ifeq ($(strip $(LED_ANIMATIONS)), yes)
+ # OPT_DEFS += -DRGBLIGHT_ANIMATIONS
+ OPT_DEFS += -DLED_ANIMATIONS
+endif
diff --git a/keyboards/naked60/keymaps/salicylic_with_setta21/config.h b/keyboards/naked60/keymaps/salicylic_with_setta21/config.h
new file mode 100644
index 0000000000..fe162510d0
--- /dev/null
+++ b/keyboards/naked60/keymaps/salicylic_with_setta21/config.h
@@ -0,0 +1,90 @@
+/* Copyright 2018 Salicylic_acid3
+ *
+ * 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
+
+/* Select hand configuration */
+
+#define MASTER_LEFT
+// #define MASTER_RIGHT
+// #define EE_HANDS
+
+#define USE_SERIAL_PD2
+
+#define TAPPING_FORCE_HOLD
+#define TAPPING_TERM 180
+
+#define RGBLED_NUM 21
+
+#ifndef IOS_DEVICE_ENABLE
+ #define RGBLIGHT_LIMIT_VAL 180
+ #define RGBLIGHT_VAL_STEP 17
+#else
+ #define RGBLIGHT_LIMIT_VAL 50
+ #define RGBLIGHT_VAL_STEP 4
+#endif
+#define RGBLIGHT_HUE_STEP 10
+#define RGBLIGHT_SAT_STEP 17
+
+#if defined(RGBLIGHT_ENABLE) && !defined(IOS_DEVICE_ENABLE)
+// USB_MAX_POWER_CONSUMPTION value for naked48 keyboard
+// 120 RGBoff, OLEDoff
+// 120 OLED
+// 330 RGB 6
+// 300 RGB 32
+// 310 OLED & RGB 32
+ #define USB_MAX_POWER_CONSUMPTION 400
+#else
+ // fix iPhone and iPad power adapter issue
+ // iOS device need lessthan 100
+ #define USB_MAX_POWER_CONSUMPTION 100
+#endif
+
+// Selection of RGBLIGHT MODE to use.
+#if defined(LED_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
+
+#define MK_3_SPEED
+
+#undef MOUSEKEY_INTERVAL
+#define MOUSEKEY_INTERVAL 0
+
+#undef MOUSEKEY_TIME_TO_MAX
+#define MOUSEKEY_TIME_TO_MAX 150
+
+#undef MOUSEKEY_MAX_SPEED
+#define MOUSEKEY_MAX_SPEED 3
+
+#undef MOUSEKEY_MOVE_DELTA
+#define MOUSEKEY_MOVE_DELTA 5
+
+#undef MOUSEKEY_DELAY
+#define MOUSEKEY_DELAY 0
+
+#undef MOUSEKEY_WHEEL_MAX_SPEED
+#define MOUSEKEY_WHEEL_MAX_SPEED 1
+
+#undef MOUSEKEY_WHEEL_TIME_TO_MAX
+#define MOUSEKEY_WHEEL_TIME_TO_MAX 0
diff --git a/keyboards/naked60/keymaps/salicylic_with_setta21/keymap.c b/keyboards/naked60/keymaps/salicylic_with_setta21/keymap.c
new file mode 100644
index 0000000000..4d2618c52d
--- /dev/null
+++ b/keyboards/naked60/keymaps/salicylic_with_setta21/keymap.c
@@ -0,0 +1,207 @@
+#include QMK_KEYBOARD_H
+#include "keymap_jp.h"
+
+extern keymap_config_t keymap_config;
+
+#ifdef RGBLIGHT_ENABLE
+//Following line allows macro to read current RGB settings
+extern rgblight_config_t rgblight_config;
+#endif
+
+extern uint8_t is_master;
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+enum layer_number {
+ _QWERTY = 0,
+ _FLOCK,
+ _LOWER,
+ _RAISE,
+ _ADJUST,
+};
+
+enum custom_keycodes {
+ FLOCK = SAFE_RANGE,
+ LOWER,
+ RAISE,
+ ADJUST,
+ KANJI,
+ RGBRST,
+ SEND_SUM,
+ SEND_AVERAGE,
+ SEND_COUNTIF,
+ SEND_MAX,
+ SEND_MIN
+};
+
+enum tapdances{
+ TD_ESFL = 0,
+ TD_ESQW,
+};
+
+// Fillers to make layering more clear
+#define KC_CT11 LCTL_T(KC_F11)
+#define KC_SF12 SFT_T(KC_F12)
+#define KC_LOEN LT(_LOWER, KC_ENT)
+#define KC_RASP LT(_RAISE, KC_SPC)
+
+#define KC_SSUM SEND_SUM
+#define KC_SAVE SEND_AVERAGE
+#define KC_SCOU SEND_COUNTIF
+#define KC_SMAX SEND_MAX
+#define KC_SMIN SEND_MIN
+
+#define KC_RADO LT(_RAISE, KC_PDOT)
+#define KC_LOP0 LT(_LOWER, KC_P0)
+#define KC_ADNL LT(_ADJUST, KC_NLCK)
+
+qk_tap_dance_action_t tap_dance_actions[] = {
+ [TD_ESFL] = ACTION_TAP_DANCE_DUAL_ROLE(KC_ESC, _FLOCK),
+ [TD_ESQW] = ACTION_TAP_DANCE_DUAL_ROLE(KC_ESC, _QWERTY),
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_QWERTY] = LAYOUT_with_setta21(
+ //,-----------------------------------------------------| |-----------------------------------------------------. |-----------------------------------------------|
+ TD(TD_ESFL), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, KC_LOP0, KC_P1, KC_P4, KC_P7,KC_ADNL, KC_ESC,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |-------+-------+-------+-------+-------+-------|
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, JP_LBRC, KC_P2, KC_P5, KC_P8,KC_PSLS, KC_F2,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |-------+-------+-------+-------+-------+-------|
+ KC_LCTRL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, JP_MINS, JP_RBRC, KC_RADO, KC_P3, KC_P6, KC_P9,KC_PAST, JP_EQL,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |---------------+---------------+-------+-------|
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, JP_COMM, JP_DOT, JP_SLSH, JP_BSLS, KC_PENT, KC_PPLS,KC_PMNS, KC_DEL,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |-----------------------------------------------|
+ KC_LEFT,KC_RIGHT, KC_LGUI, KC_MHEN, KC_LOEN, KC_BSPC, KC_DEL, KC_RASP, KC_HENK, KC_LALT, KC_DOWN, KC_UP
+ //`------------------------------------------------------------------------------------------------------------'
+ ),
+
+ [_FLOCK] = LAYOUT_with_setta21(
+ //,-----------------------------------------------------| |-----------------------------------------------------. |-----------------------------------------------|
+ TD(TD_ESQW), KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______,_______,_______,_______,_______,_______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |-------+-------+-------+-------+-------+-------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,_______,_______,_______,_______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |-------+-------+-------+-------+-------+-------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,_______,_______,_______,_______,_______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |---------------+---------------+-------+-------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,_______,_______,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |-----------------------------------------------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ //`------------------------------------------------------------------------------------------------------------'
+ ),
+
+ [_LOWER] = LAYOUT_with_setta21(
+ //,-----------------------------------------------------| |-----------------------------------------------------. |-----------------------------------------------|
+ KC_ESC, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, LOWER,XXXXXXX,KC_LEFT,XXXXXXX,XXXXXXX, KC_ESC,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |-------+-------+-------+-------+-------+-------|
+ JP_COLN, JP_EXLM, JP_QUES, JP_LBRC, JP_RBRC, JP_TILD, KC_6, KC_7, KC_8, KC_9, JP_ASTR, JP_SLSH, KC_DOWN,KC_DOWN, KC_UP,KC_PSLS, KC_F2,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |-------+-------+-------+-------+-------+-------|
+ JP_QUOT, JP_HASH, JP_DQT, JP_LPRN, JP_RPRN, JP_AT, XXXXXXX, KC_4, KC_5, KC_6, JP_MINS, JP_EQL, RAISE,XXXXXXX,KC_RIGHT,XXXXXXX,KC_PAST, JP_EQL,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |---------------+---------------+-------+-------|
+ JP_CIRC, JP_PERC, JP_AMPR, JP_SCLN, JP_COLN, JP_PIPE, KC_0, KC_1, KC_2, KC_3, JP_PLUS, KC_ENT, KC_PENT, KC_PPLS,KC_PMNS, KC_DEL,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |-----------------------------------------------|
+ _______, _______, _______, KC_ZKHK, LOWER, _______, _______, RAISE, KC_0, JP_DOT, _______, _______
+ //`------------------------------------------------------------------------------------------------------------'
+ ),
+
+ [_RAISE] = LAYOUT_with_setta21(
+ //,-----------------------------------------------------| |-----------------------------------------------------. |-----------------------------------------------|
+ KC_ESC, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, LOWER, KC_F11, KC_F4, KC_F7,KC_SMIN, KC_ESC,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |-------+-------+-------+-------+-------+-------|
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, XXXXXXX, KC_UP, XXXXXXX, KC_PGUP, KC_DEL, KC_F12, KC_F5, KC_F8,KC_SMAX, KC_F2,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |-------+-------+-------+-------+-------+-------|
+ KC_CT11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, XXXXXXX, KC_LEFT, KC_DOWN,KC_RIGHT, KC_LSFT, KC_ENT, RAISE, KC_F3, KC_F6, KC_F9,KC_SCOU, JP_EQL,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |---------------+---------------+-------+-------|
+ KC_SF12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PGDN, XXXXXXX, JP_RPRN, KC_SSUM,KC_SAVE, KC_DEL,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |-----------------------------------------------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ //`------------------------------------------------------------------------------------------------------------'
+ ),
+
+ [_ADJUST] = LAYOUT_with_setta21( /* Base */
+ //,-----------------------------------------------------| |-----------------------------------------------------. |-----------------------------------------------|
+ KC_ESC, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, LOWER,RGB_VAD,RGB_HUD,RGB_SAD, ADJUST,RGB_TOG,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |-------+-------+-------+-------+-------+-------|
+ _______, RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_MS_U, KC_BTN2, XXXXXXX,LALT(KC_PSCR), RGB_VAI,RGB_HUI,RGB_SAI,XXXXXXX,_______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |-------+-------+-------+-------+-------+-------|
+ KC_LCTRL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R, XXXXXXX, KC_PSCR, RAISE,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,_______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |---------------+---------------+-------+-------|
+ KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,LCA(KC_DEL), RGB_MOD, _______,_______,_______,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |-----------------------------------------------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ //`------------------------------------------------------------------------------------------------------------'
+ )
+};
+
+static inline void update_change_layer(bool pressed, uint8_t layer1, uint8_t layer2, uint8_t layer3) {
+
+ pressed ? layer_on(layer1) : layer_off(layer1);
+ IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2) ? layer_on(layer3) : layer_off(layer3);
+}
+
+int RGB_current_mode;
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+
+ bool result = false;
+ switch (keycode) {
+ case LOWER:
+ update_change_layer(record->event.pressed, _LOWER, _RAISE, _ADJUST);
+ break;
+ case RAISE:
+ update_change_layer(record->event.pressed, _RAISE, _LOWER, _ADJUST);
+ break;
+ case SEND_SUM:
+ if (record->event.pressed) {
+ SEND_STRING("_SUM*");
+ }
+ break;
+ case SEND_AVERAGE:
+ if (record->event.pressed) {
+ SEND_STRING("_AVERAGE*");
+ }
+ break;
+ case SEND_COUNTIF:
+ if (record->event.pressed) {
+ SEND_STRING("_COUNTIF*");
+ }
+ break;
+ case SEND_MAX:
+ if (record->event.pressed) {
+ SEND_STRING("_MAX*");
+ }
+ break;
+ case SEND_MIN:
+ if (record->event.pressed) {
+ SEND_STRING("_MIN*");
+ }
+ break;
+ #ifdef RGBLIGHT_ENABLE
+ case RGB_MOD:
+ if (record->event.pressed) {
+ rgblight_mode(RGB_current_mode);
+ rgblight_step();
+ RGB_current_mode = rgblight_config.mode;
+ }
+ break;
+ case RGBRST:
+ if (record->event.pressed) {
+ eeconfig_update_rgblight_default();
+ rgblight_enable();
+ RGB_current_mode = rgblight_config.mode;
+ }
+ break;
+ #endif
+ default:
+ result = true;
+ break;
+ }
+
+ return result;
+}
+
+void matrix_init_user(void) {
+ #ifdef RGBLIGHT_ENABLE
+ RGB_current_mode = rgblight_config.mode;
+ #endif
+}
diff --git a/keyboards/naked60/keymaps/salicylic_with_setta21/readme.md b/keyboards/naked60/keymaps/salicylic_with_setta21/readme.md
new file mode 100644
index 0000000000..0912d5431a
--- /dev/null
+++ b/keyboards/naked60/keymaps/salicylic_with_setta21/readme.md
@@ -0,0 +1,44 @@
+# The salicylic_with_setta21 keymap for naked60
+
+Add Setta21 maps to the salicylic layout.
+
+## Default
+| 1 | 2 | 3 | 4 |
+|:----:|:----:|:----:|:----:|
+| ESC| F2| =| DEL|
+|Ad+Num| /| *| -|
+| 7| 8| 9| |
+| 4| 5| 6| +|
+| 1| 2| 3| |
+| Rai+0| | LOW + .| ENT|
+
+## Lower
+| 1 | 2 | 3 | 4 |
+|:----:|:----:|:----:|:----:|
+| ESC| F2| =| DEL|
+| =MIN(| =MAX(|=COUNTIF(|=AVERAGE(|
+| F7| F8| F9| |
+| F4| F5| F6| =SUM(|
+| F11| F12| F3| |
+| RAISE| | LOWER| )|
+
+## Raise
+| 1 | 2 | 3 | 4 |
+|:----:|:----:|:----:|:----:|
+| ESC| F2| =| DEL|
+| XXXXX| /| *| -|
+| XXXXX| UP| XXXXX| |
+| LEFT| DOWN| RIGHT| +|
+| XXXXX| DOWN| XXXXX| |
+| RAISE| | LOWER| ENT|
+
+## Adjust
+| 1 | 2 | 3 | 4 |
+|:----:|:----:|:----:|:----:|
+| ESC| F2| =| DEL|
+|ADJUST| XXXXX| XXXXX| -|
+|LED_SAD|LED_SAI| XXXXX| |
+|LED_HUD|LED_HUI| XXXXX| +|
+|LED_VAD|LED_VAI| XXXXX| |
+|LED_ON/Off| | XXXXX|LED_MOD|
+
diff --git a/keyboards/naked60/keymaps/salicylic_with_setta21/rules.mk b/keyboards/naked60/keymaps/salicylic_with_setta21/rules.mk
new file mode 100644
index 0000000000..15a887e781
--- /dev/null
+++ b/keyboards/naked60/keymaps/salicylic_with_setta21/rules.mk
@@ -0,0 +1,10 @@
+RGBLIGHT_ENABLE = yes
+
+# If your custom naked60 pcb, you can rewrite to yes.
+LED_ANIMATIONS = yes # LED animations
+
+ifeq ($(strip $(LED_ANIMATIONS)), yes)
+ # OPT_DEFS += -DRGBLIGHT_ANIMATIONS
+ OPT_DEFS += -DLED_ANIMATIONS
+endif
+
diff --git a/keyboards/naked60/naked60.c b/keyboards/naked60/naked60.c
new file mode 100644
index 0000000000..1ff159cdb4
--- /dev/null
+++ b/keyboards/naked60/naked60.c
@@ -0,0 +1 @@
+#include "naked60.h"
diff --git a/keyboards/naked60/naked60.h b/keyboards/naked60/naked60.h
new file mode 100644
index 0000000000..fde791c5ef
--- /dev/null
+++ b/keyboards/naked60/naked60.h
@@ -0,0 +1,12 @@
+#pragma once
+
+#ifdef KEYBOARD_naked60_rev1
+ #include "rev1.h"
+#endif
+
+#include "quantum.h"
+
+#ifdef PROTOCOL_LUFA
+#include "lufa.h"
+#include "split_util.h"
+#endif
diff --git a/keyboards/naked60/readme.md b/keyboards/naked60/readme.md
new file mode 100644
index 0000000000..60bb164377
--- /dev/null
+++ b/keyboards/naked60/readme.md
@@ -0,0 +1,18 @@
+# naked60
+
+![naked60](https://cdn-ak.f.st-hatena.com/images/fotolife/S/Salicylic_acid3/20190530/20190530040355.jpg)
+
+This is 60 keys modification Ortholinear keyboard.
+
+Keyboard Maintainer: [Salicylic_acid3](https://github.com/Salicylic-acid3)
+Hardware Supported: Naked60BMP PCB, Pro Micro
+Hardware Availability: [PCB & Case Data](https://github.com/Salicylic-acid3/PCB_Data), [Booth Shop](https://salicylic-acid3.booth.pm/items/1360780)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make naked60:default:avrdude
+
+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).
+
+[Build guide](https://salicylic-acid3.hatenablog.com/entry/naked60bmp-build-guide)
+[Firmware](https://github.com/Salicylic-acid3/qmk_firmware/tree/master/keyboards/naked60)
diff --git a/keyboards/naked60/rev1/config.h b/keyboards/naked60/rev1/config.h
new file mode 100644
index 0000000000..1724ef060a
--- /dev/null
+++ b/keyboards/naked60/rev1/config.h
@@ -0,0 +1,119 @@
+/*
+Copyright 2012 Jun Wako <wakojun@gmail.com>
+Copyright 2015 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/>.
+*/
+
+#pragma once
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x3060
+#define DEVICE_VER 0x0002
+#define MANUFACTURER Salicylic_Acid
+#define PRODUCT naked60
+#define DESCRIPTION Ortholinear 60 Keys Keyboard
+
+/* Use I2C or Serial */
+//#define USE_I2C
+#define USE_SERIAL
+//#define USE_MATRIX_I2C
+
+/* Select hand configuration */
+#define MASTER_LEFT
+// #define MASTER_RIGHT
+// #define EE_HANDS
+
+// OLED support
+// see ./rules.mk: OLED_ENABLE=yes or no
+#ifdef OLED_ENABLE
+ #define SSD1306OLED
+#endif
+
+/* key matrix size */
+#define MATRIX_ROWS 10
+#define MATRIX_COLS 14
+
+// Rows are doubled-up
+#define MATRIX_ROW_PINS { B6, D1, D0, D4, C6 }
+
+// wiring of each half
+#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3, B2, D7, E6, B4, B5, D3 }
+// #define MATRIX_COL_PINS { D3, B5, B4, E6, D7, B2, B3, B1, F7, F6, F5, F4 } //uncomment this line and comment line above if you need to reverse left-to-right key order
+
+/* define if matrix has ghost */
+//#define MATRIX_HAS_GHOST
+
+/* number of backlight levels */
+// #define BACKLIGHT_LEVELS 3
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 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
+
+/* ws2812 RGB LED */
+#define RGB_DI_PIN D3
+#define RGBLIGHT_TIMER
+
+// naked60 keyboard RGB LED support
+//#define RGBLIGHT_ANIMATIONS : see ./rules.mk: LED_ANIMATIONS = yes or no
+// see ./rules.mk: LED_BACK_ENABLE or LED_UNDERGLOW_ENABLE set yes
+//#define RGBLED_NUM 21
+
+#ifndef IOS_DEVICE_ENABLE
+ #define RGBLIGHT_LIMIT_VAL 180
+ #define RGBLIGHT_VAL_STEP 17
+#else
+ #define RGBLIGHT_LIMIT_VAL 50
+ #define RGBLIGHT_VAL_STEP 4
+#endif
+#define RGBLIGHT_HUE_STEP 10
+#define RGBLIGHT_SAT_STEP 17
+
+#if defined(RGBLIGHT_ENABLE) && !defined(IOS_DEVICE_ENABLE)
+// USB_MAX_POWER_CONSUMPTION value for naked60 keyboard
+// 120 RGBoff, OLEDoff
+// 120 OLED
+// 330 RGB 6
+// 300 RGB 32
+// 310 OLED & RGB 32
+ #define USB_MAX_POWER_CONSUMPTION 400
+#else
+ // fix iPhone and iPad power adapter issue
+ // iOS device need lessthan 100
+ #define USB_MAX_POWER_CONSUMPTION 100
+#endif
+
+/*
+ * 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
diff --git a/keyboards/naked60/rev1/matrix.c b/keyboards/naked60/rev1/matrix.c
new file mode 100644
index 0000000000..8685a8125e
--- /dev/null
+++ b/keyboards/naked60/rev1/matrix.c
@@ -0,0 +1,357 @@
+/*
+Copyright 2012 Jun Wako <wakojun@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/>.
+*/
+
+/*
+ * scan matrix
+ */
+#include <stdint.h>
+#include <stdbool.h>
+#include <string.h>
+#include <avr/io.h>
+#include <avr/wdt.h>
+#include <avr/interrupt.h>
+#include <util/delay.h>
+#include "print.h"
+#include "debug.h"
+#include "util.h"
+#include "matrix.h"
+#include "split_util.h"
+#include "pro_micro.h"
+
+#ifdef USE_MATRIX_I2C
+# include "i2c.h"
+#else // USE_SERIAL
+# include "split_scomm.h"
+#endif
+
+#ifndef DEBOUNCE
+# define DEBOUNCE 5
+#endif
+
+#define ERROR_DISCONNECT_COUNT 5
+
+static uint8_t debouncing = DEBOUNCE;
+static const int ROWS_PER_HAND = MATRIX_ROWS/2;
+static uint8_t error_count = 0;
+uint8_t is_master = 0 ;
+
+static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS;
+static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
+
+/* matrix state(1:on, 0:off) */
+static matrix_row_t matrix[MATRIX_ROWS];
+static matrix_row_t matrix_debouncing[MATRIX_ROWS];
+
+static matrix_row_t read_cols(void);
+static void init_cols(void);
+static void unselect_rows(void);
+static void select_row(uint8_t row);
+static uint8_t matrix_master_scan(void);
+
+
+__attribute__ ((weak))
+void matrix_init_kb(void) {
+ matrix_init_user();
+}
+
+__attribute__ ((weak))
+void matrix_scan_kb(void) {
+ matrix_scan_user();
+}
+
+__attribute__ ((weak))
+void matrix_init_user(void) {
+}
+
+__attribute__ ((weak))
+void matrix_scan_user(void) {
+}
+
+inline
+uint8_t matrix_rows(void)
+{
+ return MATRIX_ROWS;
+}
+
+inline
+uint8_t matrix_cols(void)
+{
+ return MATRIX_COLS;
+}
+
+void matrix_init(void)
+{
+ debug_enable = true;
+ debug_matrix = true;
+ debug_mouse = true;
+ // initialize row and col
+ unselect_rows();
+ init_cols();
+
+ TX_RX_LED_INIT;
+ TXLED0;
+ RXLED0;
+
+ // initialize matrix state: all keys off
+ for (uint8_t i=0; i < MATRIX_ROWS; i++) {
+ matrix[i] = 0;
+ matrix_debouncing[i] = 0;
+ }
+
+ is_master = has_usb();
+
+ matrix_init_quantum();
+}
+
+uint8_t _matrix_scan(void)
+{
+ // Right hand is stored after the left in the matirx so, we need to offset it
+ int offset = isLeftHand ? 0 : (ROWS_PER_HAND);
+
+ for (uint8_t i = 0; i < ROWS_PER_HAND; i++) {
+ select_row(i);
+ _delay_us(30); // without this wait read unstable value.
+ matrix_row_t cols = read_cols();
+ if (matrix_debouncing[i+offset] != cols) {
+ matrix_debouncing[i+offset] = cols;
+ debouncing = DEBOUNCE;
+ }
+ unselect_rows();
+ }
+
+ if (debouncing) {
+ if (--debouncing) {
+ _delay_ms(1);
+ } else {
+ for (uint8_t i = 0; i < ROWS_PER_HAND; i++) {
+ matrix[i+offset] = matrix_debouncing[i+offset];
+ }
+ }
+ }
+
+ return 1;
+}
+
+#ifdef USE_MATRIX_I2C
+
+// Get rows from other half over i2c
+int i2c_transaction(void) {
+ int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0;
+
+ int err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE);
+ if (err) goto i2c_error;
+
+ // start of matrix stored at 0x00
+ err = i2c_master_write(0x00);
+ if (err) goto i2c_error;
+
+ // Start read
+ err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_READ);
+ if (err) goto i2c_error;
+
+ if (!err) {
+ int i;
+ for (i = 0; i < ROWS_PER_HAND-1; ++i) {
+ matrix[slaveOffset+i] = i2c_master_read(I2C_ACK);
+ }
+ matrix[slaveOffset+i] = i2c_master_read(I2C_NACK);
+ i2c_master_stop();
+ } else {
+i2c_error: // the cable is disconnceted, or something else went wrong
+ i2c_reset_state();
+ return err;
+ }
+
+ return 0;
+}
+
+#else // USE_SERIAL
+
+int serial_transaction(int master_changed) {
+ int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0;
+#ifdef SERIAL_USE_MULTI_TRANSACTION
+ int ret=serial_update_buffers(master_changed);
+#else
+ int ret=serial_update_buffers();
+#endif
+ if (ret ) {
+ if(ret==2) RXLED1;
+ return 1;
+ }
+ RXLED0;
+ memcpy(&matrix[slaveOffset],
+ (void *)serial_slave_buffer, sizeof(serial_slave_buffer));
+ return 0;
+}
+#endif
+
+uint8_t matrix_scan(void)
+{
+ if (is_master) {
+ matrix_master_scan();
+ }else{
+ matrix_slave_scan();
+ int offset = (isLeftHand) ? ROWS_PER_HAND : 0;
+ memcpy(&matrix[offset],
+ (void *)serial_master_buffer, sizeof(serial_master_buffer));
+ matrix_scan_quantum();
+ }
+ return 1;
+}
+
+
+uint8_t matrix_master_scan(void) {
+
+ int ret = _matrix_scan();
+ int mchanged = 1;
+
+ int offset = (isLeftHand) ? 0 : ROWS_PER_HAND;
+
+#ifdef USE_MATRIX_I2C
+// for (int i = 0; i < ROWS_PER_HAND; ++i) {
+ /* i2c_slave_buffer[i] = matrix[offset+i]; */
+// i2c_slave_buffer[i] = matrix[offset+i];
+// }
+#else // USE_SERIAL
+ #ifdef SERIAL_USE_MULTI_TRANSACTION
+ mchanged = memcmp((void *)serial_master_buffer,
+ &matrix[offset], sizeof(serial_master_buffer));
+ #endif
+ memcpy((void *)serial_master_buffer,
+ &matrix[offset], sizeof(serial_master_buffer));
+#endif
+
+#ifdef USE_MATRIX_I2C
+ if( i2c_transaction() ) {
+#else // USE_SERIAL
+ if( serial_transaction(mchanged) ) {
+#endif
+ // turn on the indicator led when halves are disconnected
+ TXLED1;
+
+ error_count++;
+
+ if (error_count > ERROR_DISCONNECT_COUNT) {
+ // reset other half if disconnected
+ int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0;
+ for (int i = 0; i < ROWS_PER_HAND; ++i) {
+ matrix[slaveOffset+i] = 0;
+ }
+ }
+ } else {
+ // turn off the indicator led on no error
+ TXLED0;
+ error_count = 0;
+ }
+ matrix_scan_quantum();
+ return ret;
+}
+
+void matrix_slave_scan(void) {
+ _matrix_scan();
+
+ int offset = (isLeftHand) ? 0 : ROWS_PER_HAND;
+
+#ifdef USE_MATRIX_I2C
+ for (int i = 0; i < ROWS_PER_HAND; ++i) {
+ /* i2c_slave_buffer[i] = matrix[offset+i]; */
+ i2c_slave_buffer[i] = matrix[offset+i];
+ }
+#else // USE_SERIAL
+ #ifdef SERIAL_USE_MULTI_TRANSACTION
+ int change = 0;
+ #endif
+ for (int i = 0; i < ROWS_PER_HAND; ++i) {
+ #ifdef SERIAL_USE_MULTI_TRANSACTION
+ if( serial_slave_buffer[i] != matrix[offset+i] )
+ change = 1;
+ #endif
+ serial_slave_buffer[i] = matrix[offset+i];
+ }
+ #ifdef SERIAL_USE_MULTI_TRANSACTION
+ slave_buffer_change_count += change;
+ #endif
+#endif
+}
+
+bool matrix_is_modified(void)
+{
+ if (debouncing) return false;
+ return true;
+}
+
+inline
+bool matrix_is_on(uint8_t row, uint8_t col)
+{
+ return (matrix[row] & ((matrix_row_t)1<<col));
+}
+
+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 init_cols(void)
+{
+ for(int x = 0; x < MATRIX_COLS; x++) {
+ _SFR_IO8((col_pins[x] >> 4) + 1) &= ~_BV(col_pins[x] & 0xF);
+ _SFR_IO8((col_pins[x] >> 4) + 2) |= _BV(col_pins[x] & 0xF);
+ }
+}
+
+static matrix_row_t read_cols(void)
+{
+ matrix_row_t result = 0;
+ for(int x = 0; x < MATRIX_COLS; x++) {
+ result |= (_SFR_IO8(col_pins[x] >> 4) & _BV(col_pins[x] & 0xF)) ? 0 : (1 << x);
+ }
+ return result;
+}
+
+static void unselect_rows(void)
+{
+ for(int x = 0; x < ROWS_PER_HAND; x++) {
+ _SFR_IO8((row_pins[x] >> 4) + 1) &= ~_BV(row_pins[x] & 0xF);
+ _SFR_IO8((row_pins[x] >> 4) + 2) |= _BV(row_pins[x] & 0xF);
+ }
+}
+
+static void select_row(uint8_t row)
+{
+ _SFR_IO8((row_pins[row] >> 4) + 1) |= _BV(row_pins[row] & 0xF);
+ _SFR_IO8((row_pins[row] >> 4) + 2) &= ~_BV(row_pins[row] & 0xF);
+}
diff --git a/keyboards/naked60/rev1/rev1.c b/keyboards/naked60/rev1/rev1.c
new file mode 100644
index 0000000000..520a869e57
--- /dev/null
+++ b/keyboards/naked60/rev1/rev1.c
@@ -0,0 +1 @@
+#include "rev1.h"
diff --git a/keyboards/naked60/rev1/rev1.h b/keyboards/naked60/rev1/rev1.h
new file mode 100644
index 0000000000..38e355cfcf
--- /dev/null
+++ b/keyboards/naked60/rev1/rev1.h
@@ -0,0 +1,97 @@
+#pragma once
+
+#include "naked60.h"
+
+#include "quantum.h"
+
+#ifdef RGBLIGHT_ENABLE
+//rgb led driver
+#include "ws2812.h"
+#endif
+
+
+//////////////////////////////////////////////////////////////////////////////
+// When only use naked60.
+//////////////////////////////////////////////////////////////////////////////
+/*
+ * ,------------------------------------ ------------------------------------.
+ * | L00 | L01 | L02 | L03 | L04 | L05 | | L06 | L07 | L08 | L09 | L0A | L0B |
+ * |------------------------------------ ------------------------------------+
+ * | L10 | L11 | L12 | L13 | L14 | L15 | | L16 | L17 | L18 | L19 | L1A | L1B |
+ * |------------------------------------ ------------------------------------+
+ * | L20 | L21 | L22 | L23 | L24 | L25 | | L26 | L17 | L28 | L29 | L2A | L2B |
+ * |------------------------------------ ------------------------------------+
+ * | L30 | L31 | L32 | L33 | L34 | L35 | | L36 | L37 | L38 | L39 | L3A | L3B |
+ * |-----------------------------------------------------------------------'
+ * | L40 | L41 | L42 | L43 | L44 | L45 | L46 | L47 | L48 | L49 | L4A | L4B |
+ * |-----------------------------------------------------------------------'
+ */
+
+#define LAYOUT( \
+ L00, L01, L02, L03, L04, L05, L06, L07, L08, L09, L0A, L0B, \
+ L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L1A, L1B, \
+ L20, L21, L22, L23, L24, L25, L26, L27, L28, L29, L2A, L2B, \
+ L30, L31, L32, L33, L34, L35, L36, L37, L38, L39, L3A, L3B, \
+ L40, L41, L42, L43, L44, L45, L46, L47, L48, L49, L4A, L4B \
+ ) \
+ { \
+ { L00, L01, L02, L03, L04, L05, L06, L07, L08, L09, L0A, L0B }, \
+ { L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L1A, L1B }, \
+ { L20, L21, L22, L23, L24, L25, L26, L27, L28, L29, L2A, L2B }, \
+ { L30, L31, L32, L33, L34, L35, L36, L37, L38, L39, L3A, L3B }, \
+ { L40, L41, L42, L43, L44, L45, L46, L47, L48, L49, L4A, L4B }, \
+ {KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO }, \
+ {KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO }, \
+ {KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO }, \
+ {KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO }, \
+ {KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO } \
+ }
+
+//////////////////////////////////////////////////////////////////////////////
+// When connecting Setta21 to naked60.
+//////////////////////////////////////////////////////////////////////////////
+
+#define LAYOUT_with_setta21( \
+ L00, L01, L02, L03, L04, L05, L06, L07, L08, L09, L0A, L0B, R00, R01, R02, R03, R04, R05, \
+ L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L1A, L1B, R11, R12, R13, R14, R15, \
+ L20, L21, L22, L23, L24, L25, L26, L27, L28, L29, L2A, L2B, R20, R21, R22, R23, R24, R25, \
+ L30, L31, L32, L33, L34, L35, L36, L37, L38, L39, L3A, L3B, R30, R32, R34, R35, \
+ L40, L41, L42, L43, L44, L45, L46, L47, L48, L49, L4A, L4B \
+ ) \
+ { \
+ { L00, L01, L02, L03, L04, L05, L06, L07, L08, L09, L0A, L0B,KC_NO,KC_NO }, \
+ { L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L1A, L1B,KC_NO,KC_NO }, \
+ { L20, L21, L22, L23, L24, L25, L26, L27, L28, L29, L2A, L2B,KC_NO,KC_NO }, \
+ { L30, L31, L32, L33, L34, L35, L36, L37, L38, L39, L3A, L3B,KC_NO,KC_NO }, \
+ { L40, L41, L42, L43, L44, L45, L46, L47, L48, L49, L4A, L4B,KC_NO,KC_NO }, \
+ { R00, R01, R02, R03, R04, R05,KC_NO,KC_NO,KC_NO, R11, R12, R13, R14, R15 }, \
+ { R20, R21, R22, R23, R24, R25,KC_NO,KC_NO, R30,KC_NO, R32,KC_NO, R34, R35 }, \
+ {KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO }, \
+ {KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO }, \
+ {KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO } \
+ }
+
+//////////////////////////////////////////////////////////////////////////////
+// When connecting Nafuda to naked60.
+//////////////////////////////////////////////////////////////////////////////
+
+#define LAYOUT_with_nafuda( \
+ L00, L01, L02, L03, L04, L05, L06, L07, L08, L09, L0A, L0B, R01, \
+ L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L1A, L1B, R10, R11, R12, \
+ L20, L21, L22, L23, L24, L25, L26, L27, L28, L29, L2A, L2B, R20, R21, R22, \
+ L30, L31, L32, L33, L34, L35, L36, L37, L38, L39, L3A, L3B, \
+ L40, L41, L42, L43, L44, L45, L46, L47, L48, L49, L4A, L4B \
+ ) \
+ { \
+ { L00, L01, L02, L03, L04, L05, L06, L07, L08, L09, L0A, L0B,KC_NO,KC_NO }, \
+ { L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L1A, L1B,KC_NO,KC_NO }, \
+ { L20, L21, L22, L23, L24, L25, L26, L27, L28, L29, L2A, L2B,KC_NO,KC_NO }, \
+ { L30, L31, L32, L33, L34, L35, L36, L37, L38, L39, L3A, L3B,KC_NO,KC_NO }, \
+ { L40, L41, L42, L43, L44, L45, L46, L47, L48, L49, L4A, L4B,KC_NO,KC_NO }, \
+ {KC_NO, R01,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO, R10, R11, R12,KC_NO,KC_NO,KC_NO }, \
+ { R20, R21, R22,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO }, \
+ {KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO }, \
+ {KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO }, \
+ {KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO } \
+ }
+
diff --git a/keyboards/naked60/rev1/rules.mk b/keyboards/naked60/rev1/rules.mk
new file mode 100644
index 0000000000..a711810333
--- /dev/null
+++ b/keyboards/naked60/rev1/rules.mk
@@ -0,0 +1,3 @@
+SRC += matrix.c \
+ split_util.c \
+ split_scomm.c
diff --git a/keyboards/naked60/rev1/serial_config.h b/keyboards/naked60/rev1/serial_config.h
new file mode 100644
index 0000000000..37135213d5
--- /dev/null
+++ b/keyboards/naked60/rev1/serial_config.h
@@ -0,0 +1,8 @@
+//// #error rev2 serial config
+
+#ifndef SOFT_SERIAL_PIN
+/* Soft Serial defines */
+#define SOFT_SERIAL_PIN D2
+
+#define SERIAL_USE_MULTI_TRANSACTION
+#endif
diff --git a/keyboards/naked60/rev1/serial_config_simpleapi.h b/keyboards/naked60/rev1/serial_config_simpleapi.h
new file mode 100644
index 0000000000..e2d22a41e7
--- /dev/null
+++ b/keyboards/naked60/rev1/serial_config_simpleapi.h
@@ -0,0 +1,8 @@
+#ifndef SERIAL_CONFIG_SIMPLEAPI_H
+#define SERIAL_CONFIG_SIMPLEAPI_H
+
+#undef SERIAL_USE_MULTI_TRANSACTION
+#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2
+#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2
+
+#endif // SERIAL_CONFIG_SIMPLEAPI_H
diff --git a/keyboards/naked60/rev1/split_scomm.c b/keyboards/naked60/rev1/split_scomm.c
new file mode 100644
index 0000000000..ada7867960
--- /dev/null
+++ b/keyboards/naked60/rev1/split_scomm.c
@@ -0,0 +1,92 @@
+#ifdef USE_SERIAL
+#ifdef SERIAL_USE_MULTI_TRANSACTION
+/* --- USE flexible API (using multi-type transaction function) --- */
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <split_scomm.h>
+#include "serial.h"
+#ifdef CONSOLE_ENABLE
+ #include <print.h>
+#endif
+
+uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0};
+uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0};
+uint8_t volatile status_com = 0;
+uint8_t volatile status1 = 0;
+uint8_t slave_buffer_change_count = 0;
+uint8_t s_change_old = 0xff;
+uint8_t s_change_new = 0xff;
+
+SSTD_t transactions[] = {
+#define GET_SLAVE_STATUS 0
+ /* master buffer not changed, only recive slave_buffer_change_count */
+ { (uint8_t *)&status_com,
+ 0, NULL,
+ sizeof(slave_buffer_change_count), &slave_buffer_change_count,
+ },
+#define PUT_MASTER_GET_SLAVE_STATUS 1
+ /* master buffer changed need send, and recive slave_buffer_change_count */
+ { (uint8_t *)&status_com,
+ sizeof(serial_master_buffer), (uint8_t *)serial_master_buffer,
+ sizeof(slave_buffer_change_count), &slave_buffer_change_count,
+ },
+#define GET_SLAVE_BUFFER 2
+ /* recive serial_slave_buffer */
+ { (uint8_t *)&status1,
+ 0, NULL,
+ sizeof(serial_slave_buffer), (uint8_t *)serial_slave_buffer
+ }
+};
+
+void serial_master_init(void)
+{
+ soft_serial_initiator_init(transactions, TID_LIMIT(transactions));
+}
+
+void serial_slave_init(void)
+{
+ soft_serial_target_init(transactions, TID_LIMIT(transactions));
+}
+
+// 0 => no error
+// 1 => slave did not respond
+// 2 => checksum error
+int serial_update_buffers(int master_update)
+{
+ int status, smatstatus;
+ static int need_retry = 0;
+
+ if( s_change_old != s_change_new ) {
+ smatstatus = soft_serial_transaction(GET_SLAVE_BUFFER);
+ if( smatstatus == TRANSACTION_END ) {
+ s_change_old = s_change_new;
+#ifdef CONSOLE_ENABLE
+ uprintf("slave matrix = %b %b %b %b %b\n",
+ serial_slave_buffer[0], serial_slave_buffer[1],
+ serial_slave_buffer[2], serial_slave_buffer[3],
+ serial_slave_buffer[4] );
+#endif
+ }
+ } else {
+ // serial_slave_buffer dosen't change
+ smatstatus = TRANSACTION_END; // dummy status
+ }
+
+ if( !master_update && !need_retry) {
+ status = soft_serial_transaction(GET_SLAVE_STATUS);
+ } else {
+ status = soft_serial_transaction(PUT_MASTER_GET_SLAVE_STATUS);
+ }
+ if( status == TRANSACTION_END ) {
+ s_change_new = slave_buffer_change_count;
+ need_retry = 0;
+ } else {
+ need_retry = 1;
+ }
+ return smatstatus;
+}
+
+#endif // SERIAL_USE_MULTI_TRANSACTION
+#endif /* USE_SERIAL */
diff --git a/keyboards/naked60/rev1/split_scomm.h b/keyboards/naked60/rev1/split_scomm.h
new file mode 100644
index 0000000000..537ec40808
--- /dev/null
+++ b/keyboards/naked60/rev1/split_scomm.h
@@ -0,0 +1,22 @@
+#pragma once
+
+#ifndef SERIAL_USE_MULTI_TRANSACTION
+/* --- USE Simple API (OLD API, compatible with let's split serial.c) --- */
+#include "serial.h"
+
+#else
+/* --- USE flexible API (using multi-type transaction function) --- */
+// Buffers for master - slave communication
+#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2
+#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2
+
+extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH];
+extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH];
+extern uint8_t slave_buffer_change_count;
+
+void serial_master_init(void);
+void serial_slave_init(void);
+int serial_update_buffers(int master_changed);
+
+#endif
+
diff --git a/keyboards/naked60/rev1/split_util.c b/keyboards/naked60/rev1/split_util.c
new file mode 100644
index 0000000000..e1ff8b4379
--- /dev/null
+++ b/keyboards/naked60/rev1/split_util.c
@@ -0,0 +1,70 @@
+#include <avr/io.h>
+#include <avr/wdt.h>
+#include <avr/power.h>
+#include <avr/interrupt.h>
+#include <util/delay.h>
+#include <avr/eeprom.h>
+#include "split_util.h"
+#include "matrix.h"
+#include "keyboard.h"
+
+#ifdef USE_MATRIX_I2C
+# include "i2c.h"
+#else
+# include "split_scomm.h"
+#endif
+
+volatile bool isLeftHand = true;
+
+static void setup_handedness(void) {
+ #ifdef EE_HANDS
+ isLeftHand = eeprom_read_byte(EECONFIG_HANDEDNESS);
+ #else
+ // I2C_MASTER_RIGHT is deprecated, use MASTER_RIGHT instead, since this works for both serial and i2c
+ #if defined(I2C_MASTER_RIGHT) || defined(MASTER_RIGHT)
+ isLeftHand = !has_usb();
+ #else
+ isLeftHand = has_usb();
+ #endif
+ #endif
+}
+
+static void keyboard_master_setup(void) {
+
+#ifdef USE_MATRIX_I2C
+ i2c_master_init();
+#else
+ serial_master_init();
+#endif
+}
+
+static void keyboard_slave_setup(void) {
+
+#ifdef USE_MATRIX_I2C
+ i2c_slave_init(SLAVE_I2C_ADDRESS);
+#else
+ serial_slave_init();
+#endif
+}
+
+bool has_usb(void) {
+ USBCON |= (1 << OTGPADE); //enables VBUS pad
+ _delay_us(5);
+ return (USBSTA & (1<<VBUS)); //checks state of VBUS
+}
+
+void split_keyboard_setup(void) {
+ setup_handedness();
+
+ if (has_usb()) {
+ keyboard_master_setup();
+ } else {
+ keyboard_slave_setup();
+ }
+ sei();
+}
+
+// this code runs before the usb and keyboard is initialized
+void matrix_setup(void) {
+ split_keyboard_setup();
+}
diff --git a/keyboards/naked60/rev1/split_util.h b/keyboards/naked60/rev1/split_util.h
new file mode 100644
index 0000000000..f593047560
--- /dev/null
+++ b/keyboards/naked60/rev1/split_util.h
@@ -0,0 +1,16 @@
+#pragma once
+
+#include <stdbool.h>
+#include "eeconfig.h"
+
+#define SLAVE_I2C_ADDRESS 0x32
+
+extern volatile bool isLeftHand;
+
+// slave version of matix scan, defined in matrix.c
+void matrix_slave_scan(void);
+
+void split_keyboard_setup(void);
+bool has_usb(void);
+
+void matrix_master_OLED_init (void);
diff --git a/keyboards/naked60/rules.mk b/keyboards/naked60/rules.mk
new file mode 100644
index 0000000000..fc2fe30320
--- /dev/null
+++ b/keyboards/naked60/rules.mk
@@ -0,0 +1,40 @@
+QUANTUM_LIB_SRC += serial.c
+
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = caterina
+
+# Build Options
+# change to "no" to disable the options, or define them in the Makefile in
+# the appropriate keymap folder that will get included automatically
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
+EXTRAKEY_ENABLE = no # Audio control and System control(+450)
+CONSOLE_ENABLE = no # Console for debug(+400)
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # 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
+MIDI_ENABLE = no # MIDI controls
+AUDIO_ENABLE = no # 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.
+TAP_DANCE_ENABLE = yes
+SUBPROJECT_rev1 = no
+USE_I2C = no
+# 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
+
+DEFAULT_FOLDER = naked60/rev1
diff --git a/keyboards/naked60/serial.c b/keyboards/naked60/serial.c
new file mode 100644
index 0000000000..6006ebf1bd
--- /dev/null
+++ b/keyboards/naked60/serial.c
@@ -0,0 +1,590 @@
+/*
+ * WARNING: be careful changing this code, it is very timing dependent
+ *
+ * 2018-10-28 checked
+ * avr-gcc 4.9.2
+ * avr-gcc 5.4.0
+ * avr-gcc 7.3.0
+ */
+
+#ifndef F_CPU
+#define F_CPU 16000000
+#endif
+
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include <util/delay.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "serial.h"
+//#include <pro_micro.h>
+
+#ifdef SOFT_SERIAL_PIN
+
+#ifdef __AVR_ATmega32U4__
+ // if using ATmega32U4 I2C, can not use PD0 and PD1 in soft serial.
+ #ifdef USE_I2C
+ #if SOFT_SERIAL_PIN == D0 || SOFT_SERIAL_PIN == D1
+ #error Using ATmega32U4 I2C, so can not use PD0, PD1
+ #endif
+ #endif
+
+ #if SOFT_SERIAL_PIN >= D0 && SOFT_SERIAL_PIN <= D3
+ #define SERIAL_PIN_DDR DDRD
+ #define SERIAL_PIN_PORT PORTD
+ #define SERIAL_PIN_INPUT PIND
+ #if SOFT_SERIAL_PIN == D0
+ #define SERIAL_PIN_MASK _BV(PD0)
+ #define EIMSK_BIT _BV(INT0)
+ #define EICRx_BIT (~(_BV(ISC00) | _BV(ISC01)))
+ #define SERIAL_PIN_INTERRUPT INT0_vect
+ #elif SOFT_SERIAL_PIN == D1
+ #define SERIAL_PIN_MASK _BV(PD1)
+ #define EIMSK_BIT _BV(INT1)
+ #define EICRx_BIT (~(_BV(ISC10) | _BV(ISC11)))
+ #define SERIAL_PIN_INTERRUPT INT1_vect
+ #elif SOFT_SERIAL_PIN == D2
+ #define SERIAL_PIN_MASK _BV(PD2)
+ #define EIMSK_BIT _BV(INT2)
+ #define EICRx_BIT (~(_BV(ISC20) | _BV(ISC21)))
+ #define SERIAL_PIN_INTERRUPT INT2_vect
+ #elif SOFT_SERIAL_PIN == D3
+ #define SERIAL_PIN_MASK _BV(PD3)
+ #define EIMSK_BIT _BV(INT3)
+ #define EICRx_BIT (~(_BV(ISC30) | _BV(ISC31)))
+ #define SERIAL_PIN_INTERRUPT INT3_vect
+ #endif
+ #elif SOFT_SERIAL_PIN == E6
+ #define SERIAL_PIN_DDR DDRE
+ #define SERIAL_PIN_PORT PORTE
+ #define SERIAL_PIN_INPUT PINE
+ #define SERIAL_PIN_MASK _BV(PE6)
+ #define EIMSK_BIT _BV(INT6)
+ #define EICRx_BIT (~(_BV(ISC60) | _BV(ISC61)))
+ #define SERIAL_PIN_INTERRUPT INT6_vect
+ #else
+ #error invalid SOFT_SERIAL_PIN value
+ #endif
+
+#else
+ #error serial.c now support ATmega32U4 only
+#endif
+
+//////////////// for backward compatibility ////////////////////////////////
+#if !defined(SERIAL_USE_SINGLE_TRANSACTION) && !defined(SERIAL_USE_MULTI_TRANSACTION)
+/* --- USE OLD API (compatible with let's split serial.c) */
+ #if SERIAL_SLAVE_BUFFER_LENGTH > 0
+ uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0};
+ #endif
+ #if SERIAL_MASTER_BUFFER_LENGTH > 0
+ uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0};
+ #endif
+ uint8_t volatile status0 = 0;
+
+SSTD_t transactions[] = {
+ { (uint8_t *)&status0,
+ #if SERIAL_MASTER_BUFFER_LENGTH > 0
+ sizeof(serial_master_buffer), (uint8_t *)serial_master_buffer,
+ #else
+ 0, (uint8_t *)NULL,
+ #endif
+ #if SERIAL_SLAVE_BUFFER_LENGTH > 0
+ sizeof(serial_slave_buffer), (uint8_t *)serial_slave_buffer
+ #else
+ 0, (uint8_t *)NULL,
+ #endif
+ }
+};
+
+void serial_master_init(void)
+{ soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); }
+
+void serial_slave_init(void)
+{ soft_serial_target_init(transactions, TID_LIMIT(transactions)); }
+
+// 0 => no error
+// 1 => slave did not respond
+// 2 => checksum error
+int serial_update_buffers()
+{
+ int result;
+ result = soft_serial_transaction();
+ return result;
+}
+
+#endif // end of OLD API (compatible with let's split serial.c)
+////////////////////////////////////////////////////////////////////////////
+
+#define ALWAYS_INLINE __attribute__((always_inline))
+#define NO_INLINE __attribute__((noinline))
+#define _delay_sub_us(x) __builtin_avr_delay_cycles(x)
+
+// parity check
+#define ODD_PARITY 1
+#define EVEN_PARITY 0
+#define PARITY EVEN_PARITY
+
+#ifdef SERIAL_DELAY
+ // custom setup in config.h
+ // #define TID_SEND_ADJUST 2
+ // #define SERIAL_DELAY 6 // micro sec
+ // #define READ_WRITE_START_ADJUST 30 // cycles
+ // #define READ_WRITE_WIDTH_ADJUST 8 // cycles
+#else
+// ============ Standard setups ============
+
+#ifndef SELECT_SOFT_SERIAL_SPEED
+#define SELECT_SOFT_SERIAL_SPEED 1
+// 0: about 189kbps
+// 1: about 137kbps (default)
+// 2: about 75kbps
+// 3: about 39kbps
+// 4: about 26kbps
+// 5: about 20kbps
+#endif
+
+#if __GNUC__ < 6
+ #define TID_SEND_ADJUST 14
+#else
+ #define TID_SEND_ADJUST 2
+#endif
+
+#if SELECT_SOFT_SERIAL_SPEED == 0
+ // Very High speed
+ #define SERIAL_DELAY 4 // micro sec
+ #if __GNUC__ < 6
+ #define READ_WRITE_START_ADJUST 33 // cycles
+ #define READ_WRITE_WIDTH_ADJUST 3 // cycles
+ #else
+ #define READ_WRITE_START_ADJUST 34 // cycles
+ #define READ_WRITE_WIDTH_ADJUST 7 // cycles
+ #endif
+#elif SELECT_SOFT_SERIAL_SPEED == 1
+ // High speed
+ #define SERIAL_DELAY 6 // micro sec
+ #if __GNUC__ < 6
+ #define READ_WRITE_START_ADJUST 30 // cycles
+ #define READ_WRITE_WIDTH_ADJUST 3 // cycles
+ #else
+ #define READ_WRITE_START_ADJUST 33 // cycles
+ #define READ_WRITE_WIDTH_ADJUST 7 // cycles
+ #endif
+#elif SELECT_SOFT_SERIAL_SPEED == 2
+ // Middle speed
+ #define SERIAL_DELAY 12 // micro sec
+ #define READ_WRITE_START_ADJUST 30 // cycles
+ #if __GNUC__ < 6
+ #define READ_WRITE_WIDTH_ADJUST 3 // cycles
+ #else
+ #define READ_WRITE_WIDTH_ADJUST 7 // cycles
+ #endif
+#elif SELECT_SOFT_SERIAL_SPEED == 3
+ // Low speed
+ #define SERIAL_DELAY 24 // micro sec
+ #define READ_WRITE_START_ADJUST 30 // cycles
+ #if __GNUC__ < 6
+ #define READ_WRITE_WIDTH_ADJUST 3 // cycles
+ #else
+ #define READ_WRITE_WIDTH_ADJUST 7 // cycles
+ #endif
+#elif SELECT_SOFT_SERIAL_SPEED == 4
+ // Very Low speed
+ #define SERIAL_DELAY 36 // micro sec
+ #define READ_WRITE_START_ADJUST 30 // cycles
+ #if __GNUC__ < 6
+ #define READ_WRITE_WIDTH_ADJUST 3 // cycles
+ #else
+ #define READ_WRITE_WIDTH_ADJUST 7 // cycles
+ #endif
+#elif SELECT_SOFT_SERIAL_SPEED == 5
+ // Ultra Low speed
+ #define SERIAL_DELAY 48 // micro sec
+ #define READ_WRITE_START_ADJUST 30 // cycles
+ #if __GNUC__ < 6
+ #define READ_WRITE_WIDTH_ADJUST 3 // cycles
+ #else
+ #define READ_WRITE_WIDTH_ADJUST 7 // cycles
+ #endif
+#else
+#error invalid SELECT_SOFT_SERIAL_SPEED value
+#endif /* SELECT_SOFT_SERIAL_SPEED */
+#endif /* SERIAL_DELAY */
+
+#define SERIAL_DELAY_HALF1 (SERIAL_DELAY/2)
+#define SERIAL_DELAY_HALF2 (SERIAL_DELAY - SERIAL_DELAY/2)
+
+#define SLAVE_INT_WIDTH_US 1
+#ifndef SERIAL_USE_MULTI_TRANSACTION
+ #define SLAVE_INT_RESPONSE_TIME SERIAL_DELAY
+#else
+ #define SLAVE_INT_ACK_WIDTH_UNIT 2
+ #define SLAVE_INT_ACK_WIDTH 4
+#endif
+
+static SSTD_t *Transaction_table = NULL;
+static uint8_t Transaction_table_size = 0;
+
+inline static void serial_delay(void) ALWAYS_INLINE;
+inline static
+void serial_delay(void) {
+ _delay_us(SERIAL_DELAY);
+}
+
+inline static void serial_delay_half1(void) ALWAYS_INLINE;
+inline static
+void serial_delay_half1(void) {
+ _delay_us(SERIAL_DELAY_HALF1);
+}
+
+inline static void serial_delay_half2(void) ALWAYS_INLINE;
+inline static
+void serial_delay_half2(void) {
+ _delay_us(SERIAL_DELAY_HALF2);
+}
+
+inline static void serial_output(void) ALWAYS_INLINE;
+inline static
+void serial_output(void) {
+ SERIAL_PIN_DDR |= SERIAL_PIN_MASK;
+}
+
+// make the serial pin an input with pull-up resistor
+inline static void serial_input_with_pullup(void) ALWAYS_INLINE;
+inline static
+void serial_input_with_pullup(void) {
+ SERIAL_PIN_DDR &= ~SERIAL_PIN_MASK;
+ SERIAL_PIN_PORT |= SERIAL_PIN_MASK;
+}
+
+inline static uint8_t serial_read_pin(void) ALWAYS_INLINE;
+inline static
+uint8_t serial_read_pin(void) {
+ return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK);
+}
+
+inline static void serial_low(void) ALWAYS_INLINE;
+inline static
+void serial_low(void) {
+ SERIAL_PIN_PORT &= ~SERIAL_PIN_MASK;
+}
+
+inline static void serial_high(void) ALWAYS_INLINE;
+inline static
+void serial_high(void) {
+ SERIAL_PIN_PORT |= SERIAL_PIN_MASK;
+}
+
+void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size)
+{
+ Transaction_table = sstd_table;
+ Transaction_table_size = (uint8_t)sstd_table_size;
+ serial_output();
+ serial_high();
+}
+
+void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size)
+{
+ Transaction_table = sstd_table;
+ Transaction_table_size = (uint8_t)sstd_table_size;
+ serial_input_with_pullup();
+
+ // Enable INT0-INT3,INT6
+ EIMSK |= EIMSK_BIT;
+#if SERIAL_PIN_MASK == _BV(PE6)
+ // Trigger on falling edge of INT6
+ EICRB &= EICRx_BIT;
+#else
+ // Trigger on falling edge of INT0-INT3
+ EICRA &= EICRx_BIT;
+#endif
+}
+
+// Used by the sender to synchronize timing with the reciver.
+static void sync_recv(void) NO_INLINE;
+static
+void sync_recv(void) {
+ for (uint8_t i = 0; i < SERIAL_DELAY*5 && serial_read_pin(); i++ ) {
+ }
+ // This shouldn't hang if the target disconnects because the
+ // serial line will float to high if the target does disconnect.
+ while (!serial_read_pin());
+}
+
+// Used by the reciver to send a synchronization signal to the sender.
+static void sync_send(void) NO_INLINE;
+static
+void sync_send(void) {
+ serial_low();
+ serial_delay();
+ serial_high();
+}
+
+// Reads a byte from the serial line
+static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) NO_INLINE;
+static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) {
+ uint8_t byte, i, p, pb;
+
+ _delay_sub_us(READ_WRITE_START_ADJUST);
+ for( i = 0, byte = 0, p = PARITY; i < bit; i++ ) {
+ serial_delay_half1(); // read the middle of pulses
+ if( serial_read_pin() ) {
+ byte = (byte << 1) | 1; p ^= 1;
+ } else {
+ byte = (byte << 1) | 0; p ^= 0;
+ }
+ _delay_sub_us(READ_WRITE_WIDTH_ADJUST);
+ serial_delay_half2();
+ }
+ /* recive parity bit */
+ serial_delay_half1(); // read the middle of pulses
+ pb = serial_read_pin();
+ _delay_sub_us(READ_WRITE_WIDTH_ADJUST);
+ serial_delay_half2();
+
+ *pterrcount += (p != pb)? 1 : 0;
+
+ return byte;
+}
+
+// Sends a byte with MSB ordering
+void serial_write_chunk(uint8_t data, uint8_t bit) NO_INLINE;
+void serial_write_chunk(uint8_t data, uint8_t bit) {
+ uint8_t b, p;
+ for( p = PARITY, b = 1<<(bit-1); b ; b >>= 1) {
+ if(data & b) {
+ serial_high(); p ^= 1;
+ } else {
+ serial_low(); p ^= 0;
+ }
+ serial_delay();
+ }
+ /* send parity bit */
+ if(p & 1) { serial_high(); }
+ else { serial_low(); }
+ serial_delay();
+
+ serial_low(); // sync_send() / senc_recv() need raise edge
+}
+
+static void serial_send_packet(uint8_t *buffer, uint8_t size) NO_INLINE;
+static
+void serial_send_packet(uint8_t *buffer, uint8_t size) {
+ for (uint8_t i = 0; i < size; ++i) {
+ uint8_t data;
+ data = buffer[i];
+ sync_send();
+ serial_write_chunk(data,8);
+ }
+}
+
+static uint8_t serial_recive_packet(uint8_t *buffer, uint8_t size) NO_INLINE;
+static
+uint8_t serial_recive_packet(uint8_t *buffer, uint8_t size) {
+ uint8_t pecount = 0;
+ for (uint8_t i = 0; i < size; ++i) {
+ uint8_t data;
+ sync_recv();
+ data = serial_read_chunk(&pecount, 8);
+ buffer[i] = data;
+ }
+ return pecount == 0;
+}
+
+inline static
+void change_sender2reciver(void) {
+ sync_send(); //0
+ serial_delay_half1(); //1
+ serial_low(); //2
+ serial_input_with_pullup(); //2
+ serial_delay_half1(); //3
+}
+
+inline static
+void change_reciver2sender(void) {
+ sync_recv(); //0
+ serial_delay(); //1
+ serial_low(); //3
+ serial_output(); //3
+ serial_delay_half1(); //4
+}
+
+static inline uint8_t nibble_bits_count(uint8_t bits)
+{
+ bits = (bits & 0x5) + (bits >> 1 & 0x5);
+ bits = (bits & 0x3) + (bits >> 2 & 0x3);
+ return bits;
+}
+
+// interrupt handle to be used by the target device
+ISR(SERIAL_PIN_INTERRUPT) {
+
+#ifndef SERIAL_USE_MULTI_TRANSACTION
+ serial_low();
+ serial_output();
+ SSTD_t *trans = Transaction_table;
+#else
+ // recive transaction table index
+ uint8_t tid, bits;
+ uint8_t pecount = 0;
+ sync_recv();
+ bits = serial_read_chunk(&pecount,7);
+ tid = bits>>3;
+ bits = (bits&7) != nibble_bits_count(tid);
+ if( bits || pecount> 0 || tid > Transaction_table_size ) {
+ return;
+ }
+ serial_delay_half1();
+
+ serial_high(); // response step1 low->high
+ serial_output();
+ _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT*SLAVE_INT_ACK_WIDTH);
+ SSTD_t *trans = &Transaction_table[tid];
+ serial_low(); // response step2 ack high->low
+#endif
+
+ // target send phase
+ if( trans->target2initiator_buffer_size > 0 )
+ serial_send_packet((uint8_t *)trans->target2initiator_buffer,
+ trans->target2initiator_buffer_size);
+ // target switch to input
+ change_sender2reciver();
+
+ // target recive phase
+ if( trans->initiator2target_buffer_size > 0 ) {
+ if (serial_recive_packet((uint8_t *)trans->initiator2target_buffer,
+ trans->initiator2target_buffer_size) ) {
+ *trans->status = TRANSACTION_ACCEPTED;
+ } else {
+ *trans->status = TRANSACTION_DATA_ERROR;
+ }
+ } else {
+ *trans->status = TRANSACTION_ACCEPTED;
+ }
+
+ sync_recv(); //weit initiator output to high
+}
+
+/////////
+// start transaction by initiator
+//
+// int soft_serial_transaction(int sstd_index)
+//
+// Returns:
+// TRANSACTION_END
+// TRANSACTION_NO_RESPONSE
+// TRANSACTION_DATA_ERROR
+// this code is very time dependent, so we need to disable interrupts
+#ifndef SERIAL_USE_MULTI_TRANSACTION
+int soft_serial_transaction(void) {
+ SSTD_t *trans = Transaction_table;
+#else
+int soft_serial_transaction(int sstd_index) {
+ if( sstd_index > Transaction_table_size )
+ return TRANSACTION_TYPE_ERROR;
+ SSTD_t *trans = &Transaction_table[sstd_index];
+#endif
+ cli();
+
+ // signal to the target that we want to start a transaction
+ serial_output();
+ serial_low();
+ _delay_us(SLAVE_INT_WIDTH_US);
+
+#ifndef SERIAL_USE_MULTI_TRANSACTION
+ // wait for the target response
+ serial_input_with_pullup();
+ _delay_us(SLAVE_INT_RESPONSE_TIME);
+
+ // check if the target is present
+ if (serial_read_pin()) {
+ // target failed to pull the line low, assume not present
+ serial_output();
+ serial_high();
+ *trans->status = TRANSACTION_NO_RESPONSE;
+ sei();
+ return TRANSACTION_NO_RESPONSE;
+ }
+
+#else
+ // send transaction table index
+ int tid = (sstd_index<<3) | (7 & nibble_bits_count(sstd_index));
+ sync_send();
+ _delay_sub_us(TID_SEND_ADJUST);
+ serial_write_chunk(tid, 7);
+ serial_delay_half1();
+
+ // wait for the target response (step1 low->high)
+ serial_input_with_pullup();
+ while( !serial_read_pin() ) {
+ _delay_sub_us(2);
+ }
+
+ // check if the target is present (step2 high->low)
+ for( int i = 0; serial_read_pin(); i++ ) {
+ if (i > SLAVE_INT_ACK_WIDTH + 1) {
+ // slave failed to pull the line low, assume not present
+ serial_output();
+ serial_high();
+ *trans->status = TRANSACTION_NO_RESPONSE;
+ sei();
+ return TRANSACTION_NO_RESPONSE;
+ }
+ _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT);
+ }
+#endif
+
+ // initiator recive phase
+ // if the target is present syncronize with it
+ if( trans->target2initiator_buffer_size > 0 ) {
+ if (!serial_recive_packet((uint8_t *)trans->target2initiator_buffer,
+ trans->target2initiator_buffer_size) ) {
+ serial_output();
+ serial_high();
+ *trans->status = TRANSACTION_DATA_ERROR;
+ sei();
+ return TRANSACTION_DATA_ERROR;
+ }
+ }
+
+ // initiator switch to output
+ change_reciver2sender();
+
+ // initiator send phase
+ if( trans->initiator2target_buffer_size > 0 ) {
+ serial_send_packet((uint8_t *)trans->initiator2target_buffer,
+ trans->initiator2target_buffer_size);
+ }
+
+ // always, release the line when not in use
+ sync_send();
+
+ *trans->status = TRANSACTION_END;
+ sei();
+ return TRANSACTION_END;
+}
+
+#ifdef SERIAL_USE_MULTI_TRANSACTION
+int soft_serial_get_and_clean_status(int sstd_index) {
+ SSTD_t *trans = &Transaction_table[sstd_index];
+ cli();
+ int retval = *trans->status;
+ *trans->status = 0;;
+ sei();
+ return retval;
+}
+#endif
+
+#endif
+
+// Helix serial.c history
+// 2018-1-29 fork from let's split and add PD2, modify sync_recv() (#2308, bceffdefc)
+// 2018-6-28 bug fix master to slave comm and speed up (#3255, 1038bbef4)
+// (adjusted with avr-gcc 4.9.2)
+// 2018-7-13 remove USE_SERIAL_PD2 macro (#3374, f30d6dd78)
+// (adjusted with avr-gcc 4.9.2)
+// 2018-8-11 add support multi-type transaction (#3608, feb5e4aae)
+// (adjusted with avr-gcc 4.9.2)
+// 2018-10-21 fix serial and RGB animation conflict (#4191, 4665e4fff)
+// (adjusted with avr-gcc 7.3.0)
+// 2018-10-28 re-adjust compiler depend value of delay (#4269, 8517f8a66)
+// (adjusted with avr-gcc 5.4.0, 7.3.0)
diff --git a/keyboards/naked60/serial.h b/keyboards/naked60/serial.h
new file mode 100644
index 0000000000..5deaf789e3
--- /dev/null
+++ b/keyboards/naked60/serial.h
@@ -0,0 +1,86 @@
+#pragma once
+
+#include <stdbool.h>
+
+// /////////////////////////////////////////////////////////////////
+// Need Soft Serial defines in config.h
+// /////////////////////////////////////////////////////////////////
+// ex.
+// #define SOFT_SERIAL_PIN ?? // ?? = D0,D1,D2,D3,E6
+// OPTIONAL: #define SELECT_SOFT_SERIAL_SPEED ? // ? = 1,2,3,4,5
+// // 1: about 137kbps (default)
+// // 2: about 75kbps
+// // 3: about 39kbps
+// // 4: about 26kbps
+// // 5: about 20kbps
+//
+// //// USE OLD API (compatible with let's split serial.c)
+// ex.
+// #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2
+// #define SERIAL_MASTER_BUFFER_LENGTH 1
+//
+// //// USE NEW API
+// //// USE simple API (using signle-type transaction function)
+// #define SERIAL_USE_SINGLE_TRANSACTION
+// //// USE flexible API (using multi-type transaction function)
+// #define SERIAL_USE_MULTI_TRANSACTION
+//
+// /////////////////////////////////////////////////////////////////
+
+
+//////////////// for backward compatibility ////////////////////////////////
+#if !defined(SERIAL_USE_SINGLE_TRANSACTION) && !defined(SERIAL_USE_MULTI_TRANSACTION)
+/* --- USE OLD API (compatible with let's split serial.c) */
+ #if SERIAL_SLAVE_BUFFER_LENGTH > 0
+ extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH];
+ #endif
+ #if SERIAL_MASTER_BUFFER_LENGTH > 0
+ extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH];
+ #endif
+
+ void serial_master_init(void);
+ void serial_slave_init(void);
+ int serial_update_buffers(void);
+
+#endif // end of USE OLD API
+////////////////////////////////////////////////////////////////////////////
+
+// Soft Serial Transaction Descriptor
+typedef struct _SSTD_t {
+ uint8_t *status;
+ uint8_t initiator2target_buffer_size;
+ uint8_t *initiator2target_buffer;
+ uint8_t target2initiator_buffer_size;
+ uint8_t *target2initiator_buffer;
+} SSTD_t;
+#define TID_LIMIT( table ) (sizeof(table) / sizeof(SSTD_t))
+
+// initiator is transaction start side
+void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size);
+// target is interrupt accept side
+void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size);
+
+// initiator resullt
+#define TRANSACTION_END 0
+#define TRANSACTION_NO_RESPONSE 0x1
+#define TRANSACTION_DATA_ERROR 0x2
+#define TRANSACTION_TYPE_ERROR 0x4
+#ifndef SERIAL_USE_MULTI_TRANSACTION
+int soft_serial_transaction(void);
+#else
+int soft_serial_transaction(int sstd_index);
+#endif
+
+// target status
+// *SSTD_t.status has
+// initiator:
+// TRANSACTION_END
+// or TRANSACTION_NO_RESPONSE
+// or TRANSACTION_DATA_ERROR
+// target:
+// TRANSACTION_DATA_ERROR
+// or TRANSACTION_ACCEPTED
+#define TRANSACTION_ACCEPTED 0x8
+#ifdef SERIAL_USE_MULTI_TRANSACTION
+int soft_serial_get_and_clean_status(int sstd_index);
+#endif