aboutsummaryrefslogtreecommitdiff
path: root/keyboards
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards')
-rw-r--r--keyboards/merge/um70/config.h63
-rw-r--r--keyboards/merge/um70/info.json21
-rw-r--r--keyboards/merge/um70/keymaps/default/keymap.c182
-rw-r--r--keyboards/merge/um70/keymaps/default/readme.md5
-rw-r--r--keyboards/merge/um70/keymaps/default/rules.mk2
-rw-r--r--keyboards/merge/um70/keymaps/via/config.h20
-rw-r--r--keyboards/merge/um70/keymaps/via/keymap.c182
-rw-r--r--keyboards/merge/um70/keymaps/via/rules.mk3
-rw-r--r--keyboards/merge/um70/readme.md14
-rw-r--r--keyboards/merge/um70/rules.mk25
-rw-r--r--keyboards/merge/um70/um70.c77
-rw-r--r--keyboards/merge/um70/um70.h97
12 files changed, 691 insertions, 0 deletions
diff --git a/keyboards/merge/um70/config.h b/keyboards/merge/um70/config.h
new file mode 100644
index 000000000..a1374aa9a
--- /dev/null
+++ b/keyboards/merge/um70/config.h
@@ -0,0 +1,63 @@
1/* Copyright 2021 duoshock
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#include "config_common.h"
18
19#define VENDOR_ID 0x4D65
20#define PRODUCT_ID 0x3222
21#define DEVICE_VER 0x0001
22#define MANUFACTURER Merge
23#define PRODUCT UM-70
24
25#define MATRIX_ROWS 10
26#define MATRIX_COLS 8
27
28#define MATRIX_ROW_PINS { B0, B1, B2, B3, B7 }
29#define MATRIX_COL_PINS { F0, F1, F4, F5, F6, F7, D6, D4 }
30#define UNUSED_PINS
31
32/* COL2ROW or ROW2COL */
33#define DIODE_DIRECTION COL2ROW
34
35#define SOFT_SERIAL_PIN D2
36#define SPLIT_USB_DETECT
37#define MASTER_LEFT
38#define SPLIT_MODS_ENABLE
39
40#define RGB_DI_PIN D3
41#define RGBLIGHT_SPLIT
42#define RGBLED_NUM 83
43#define RGBLED_SPLIT { 39, 44 }
44#ifdef RGB_MATRIX_ENABLE
45# define DRIVER_LED_TOTAL RGBLED_NUM
46# define RGB_MATRIX_SPLIT RGBLED_SPLIT
47#endif
48#define RGBLIGHT_SLEEP
49#define RGBLIGHT_LIMIT_VAL 150
50
51#define DEBOUNCE 5
52
53#define B6_AUDIO
54
55#ifdef AUDIO_ENABLE
56 #define STARTUP_SONG SONG(STARTUP_SOUND)
57#endif
58
59#define ENCODERS_PAD_A { B4 }
60#define ENCODERS_PAD_B { B5 }
61
62#define BOOTMAGIC_LITE_ROW 0
63#define BOOTMAGIC_LITE_COLUMN 0 \ No newline at end of file
diff --git a/keyboards/merge/um70/info.json b/keyboards/merge/um70/info.json
new file mode 100644
index 000000000..56c764c81
--- /dev/null
+++ b/keyboards/merge/um70/info.json
@@ -0,0 +1,21 @@
1{
2 "keyboard_name": "UM-70",
3 "url": "https://mergedesign.store/um-70",
4 "maintainer": "duoshock",
5 "width": 18.75,
6 "height": 5.25,
7 "layouts": {
8 "LAYOUT_rspace_2u_bksp": {
9 "layout": [{"x":1.5, "y":0}, {"x":2.5, "y":0}, {"x":3.5, "y":0}, {"x":4.5, "y":0}, {"x":5.5, "y":0}, {"x":6.5, "y":0}, {"x":7.5, "y":0}, {"x":9.25, "y":0}, {"x":10.25, "y":0}, {"x":11.25, "y":0}, {"x":12.25, "y":0}, {"x":13.25, "y":0}, {"x":14.25, "y":0}, {"x":15.25, "y":0, "w":2}, {"x":17.75, "y":0}, {"x":1.5, "y":1, "w":1.5}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8.75, "y":1}, {"x":9.75, "y":1}, {"x":10.75, "y":1}, {"x":11.75, "y":1}, {"x":12.75, "y":1}, {"x":13.75, "y":1}, {"x":14.75, "y":1}, {"x":15.75, "y":1, "w":1.5}, {"x":17.75, "y":1}, {"x":0, "y":2}, {"x":1.5, "y":2, "w":1.75}, {"x":3.25, "y":2}, {"x":4.25, "y":2}, {"x":5.25, "y":2}, {"x":6.25, "y":2}, {"x":7.25, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":12, "y":2}, {"x":13, "y":2}, {"x":14, "y":2}, {"x":15, "y":2, "w":2.25}, {"x":17.75, "y":2}, {"x":0, "y":3}, {"x":1.5, "y":3, "w":2.25}, {"x":3.75, "y":3}, {"x":4.75, "y":3}, {"x":5.75, "y":3}, {"x":6.75, "y":3}, {"x":7.75, "y":3}, {"x":9.5, "y":3}, {"x":10.5, "y":3}, {"x":11.5, "y":3}, {"x":12.5, "y":3}, {"x":13.5, "y":3}, {"x":14.5, "y":3, "w":1.75}, {"x":16.5, "y":3.25}, {"x":0, "y":4}, {"x":1.5, "y":4, "w":1.25}, {"x":2.75, "y":4, "w":1.25}, {"x":4, "y":4, "w":1.25}, {"x":5.25, "y":4, "w":1.25}, {"x":6.5, "y":4, "w":2.25}, {"x":9.5, "y":4, "w":2.75}, {"x":12.25, "y":4, "w":1.5}, {"x":13.75, "y":4, "w":1.5}, {"x":15.5, "y":4.25}, {"x":16.5, "y":4.25}, {"x":17.5, "y":4.25}]
10 },
11 "LAYOUT_rspace_split_bksp": {
12 "layout": [{"x":1.5, "y":0}, {"x":2.5, "y":0}, {"x":3.5, "y":0}, {"x":4.5, "y":0}, {"x":5.5, "y":0}, {"x":6.5, "y":0}, {"x":7.5, "y":0}, {"x":9.25, "y":0}, {"x":10.25, "y":0}, {"x":11.25, "y":0}, {"x":12.25, "y":0}, {"x":13.25, "y":0}, {"x":14.25, "y":0}, {"x":15.25, "y":0}, {"x":16.25, "y":0}, {"x":17.75, "y":0}, {"x":1.5, "y":1, "w":1.5}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8.75, "y":1}, {"x":9.75, "y":1}, {"x":10.75, "y":1}, {"x":11.75, "y":1}, {"x":12.75, "y":1}, {"x":13.75, "y":1}, {"x":14.75, "y":1}, {"x":15.75, "y":1, "w":1.5}, {"x":17.75, "y":1}, {"x":0, "y":2}, {"x":1.5, "y":2, "w":1.75}, {"x":3.25, "y":2}, {"x":4.25, "y":2}, {"x":5.25, "y":2}, {"x":6.25, "y":2}, {"x":7.25, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":12, "y":2}, {"x":13, "y":2}, {"x":14, "y":2}, {"x":15, "y":2, "w":2.25}, {"x":17.75, "y":2}, {"x":0, "y":3}, {"x":1.5, "y":3, "w":2.25}, {"x":3.75, "y":3}, {"x":4.75, "y":3}, {"x":5.75, "y":3}, {"x":6.75, "y":3}, {"x":7.75, "y":3}, {"x":9.5, "y":3}, {"x":10.5, "y":3}, {"x":11.5, "y":3}, {"x":12.5, "y":3}, {"x":13.5, "y":3}, {"x":14.5, "y":3, "w":1.75}, {"x":16.5, "y":3.25}, {"x":0, "y":4}, {"x":1.5, "y":4, "w":1.25}, {"x":2.75, "y":4, "w":1.25}, {"x":4, "y":4, "w":1.25}, {"x":5.25, "y":4, "w":1.25}, {"x":6.5, "y":4, "w":2.25}, {"x":9.5, "y":4, "w":2.75}, {"x":12.25, "y":4, "w":1.5}, {"x":13.75, "y":4, "w":1.5}, {"x":15.5, "y":4.25}, {"x":16.5, "y":4.25}, {"x":17.5, "y":4.25}]
13 },
14 "LAYOUT_lspace_2u_bksp": {
15 "layout": [{"x":1.5, "y":0}, {"x":2.5, "y":0}, {"x":3.5, "y":0}, {"x":4.5, "y":0}, {"x":5.5, "y":0}, {"x":6.5, "y":0}, {"x":7.5, "y":0}, {"x":9.25, "y":0}, {"x":10.25, "y":0}, {"x":11.25, "y":0}, {"x":12.25, "y":0}, {"x":13.25, "y":0}, {"x":14.25, "y":0}, {"x":15.25, "y":0, "w":2}, {"x":17.75, "y":0}, {"x":1.5, "y":1, "w":1.5}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8.75, "y":1}, {"x":9.75, "y":1}, {"x":10.75, "y":1}, {"x":11.75, "y":1}, {"x":12.75, "y":1}, {"x":13.75, "y":1}, {"x":14.75, "y":1}, {"x":15.75, "y":1, "w":1.5}, {"x":17.75, "y":1}, {"x":0, "y":2}, {"x":1.5, "y":2, "w":1.75}, {"x":3.25, "y":2}, {"x":4.25, "y":2}, {"x":5.25, "y":2}, {"x":6.25, "y":2}, {"x":7.25, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":12, "y":2}, {"x":13, "y":2}, {"x":14, "y":2}, {"x":15, "y":2, "w":2.25}, {"x":17.75, "y":2}, {"x":0, "y":3}, {"x":1.5, "y":3, "w":2.25}, {"x":3.75, "y":3}, {"x":4.75, "y":3}, {"x":5.75, "y":3}, {"x":6.75, "y":3}, {"x":7.75, "y":3}, {"x":9.5, "y":3}, {"x":10.5, "y":3}, {"x":11.5, "y":3}, {"x":12.5, "y":3}, {"x":13.5, "y":3}, {"x":14.5, "y":3, "w":1.75}, {"x":16.5, "y":3.25}, {"x":0, "y":4}, {"x":1.5, "y":4, "w":1.25}, {"x":2.75, "y":4, "w":1.25}, {"x":4, "y":4, "w":1.25}, {"x":5.25, "y":4, "w":2.25}, {"x":7.5, "y":4, "w":1.25}, {"x":9.5, "y":4, "w":2.75}, {"x":12.25, "y":4, "w":1.5}, {"x":13.75, "y":4, "w":1.5}, {"x":15.5, "y":4.25}, {"x":16.5, "y":4.25}, {"x":17.5, "y":4.25}]
16 },
17 "LAYOUT_lspace_split_bksp": {
18 "layout": [{"x":1.5, "y":0}, {"x":2.5, "y":0}, {"x":3.5, "y":0}, {"x":4.5, "y":0}, {"x":5.5, "y":0}, {"x":6.5, "y":0}, {"x":7.5, "y":0}, {"x":9.25, "y":0}, {"x":10.25, "y":0}, {"x":11.25, "y":0}, {"x":12.25, "y":0}, {"x":13.25, "y":0}, {"x":14.25, "y":0}, {"x":15.25, "y":0}, {"x":16.25, "y":0}, {"x":17.75, "y":0}, {"x":1.5, "y":1, "w":1.5}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8.75, "y":1}, {"x":9.75, "y":1}, {"x":10.75, "y":1}, {"x":11.75, "y":1}, {"x":12.75, "y":1}, {"x":13.75, "y":1}, {"x":14.75, "y":1}, {"x":15.75, "y":1, "w":1.5}, {"x":17.75, "y":1}, {"x":0, "y":2}, {"x":1.5, "y":2, "w":1.75}, {"x":3.25, "y":2}, {"x":4.25, "y":2}, {"x":5.25, "y":2}, {"x":6.25, "y":2}, {"x":7.25, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":12, "y":2}, {"x":13, "y":2}, {"x":14, "y":2}, {"x":15, "y":2, "w":2.25}, {"x":17.75, "y":2}, {"x":0, "y":3}, {"x":1.5, "y":3, "w":2.25}, {"x":3.75, "y":3}, {"x":4.75, "y":3}, {"x":5.75, "y":3}, {"x":6.75, "y":3}, {"x":7.75, "y":3}, {"x":9.5, "y":3}, {"x":10.5, "y":3}, {"x":11.5, "y":3}, {"x":12.5, "y":3}, {"x":13.5, "y":3}, {"x":14.5, "y":3, "w":1.75}, {"x":16.5, "y":3.25}, {"x":0, "y":4}, {"x":1.5, "y":4, "w":1.25}, {"x":2.75, "y":4, "w":1.25}, {"x":4, "y":4, "w":1.25}, {"x":5.25, "y":4, "w":2.25}, {"x":7.5, "y":4, "w":1.25}, {"x":9.5, "y":4, "w":2.75}, {"x":12.25, "y":4, "w":1.5}, {"x":13.75, "y":4, "w":1.5}, {"x":15.5, "y":4.25}, {"x":16.5, "y":4.25}, {"x":17.5, "y":4.25}]
19 }
20 }
21}
diff --git a/keyboards/merge/um70/keymaps/default/keymap.c b/keyboards/merge/um70/keymaps/default/keymap.c
new file mode 100644
index 000000000..1025d37a9
--- /dev/null
+++ b/keyboards/merge/um70/keymaps/default/keymap.c
@@ -0,0 +1,182 @@
1/* Copyright 2021 duoshock
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#include QMK_KEYBOARD_H
18#include <stdio.h>
19
20enum layer_names {
21 _BASE,
22 _ONE,
23 _TWO,
24 _THREE
25};
26
27const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
28
29/*
30 * .---------------------------. .-------------------------------. .---.
31 * |Esc| 1| 2| 3| 4| 5| 6| | 7| 8| 9| 0| -| =| Bsp | |EC |
32 * |-------------------------. .---------------------------------| |---|
33 * |Tab | Q| W| E| R| T| | Y| U| I| O| P| [| ]| \ | |Hom|
34 * .---. |-------------------------. '---------------------------------| |---|
35 * |M0 | |CapsL | A| S| D| F| G| | H| J| K| L| ;| :| Retn | |End|
36 * |---| |----------------------------. '--------------------------------| .---. '---'
37 * |M1 | |Shft | Z| X| C| V| B| | N| M| ,| ,| /| Shift| |Up |
38 * |---| |----------------------------| |---------------------------' .-----------.
39 * |M2 | |Ctl |Gui |Alt |Fn0 |Space | | Space| Alt| Ctl| |Lef|Dow|Rig|
40 * '---' '----------------------------' '-----------------------' '-----------'
41 */
42
43[_BASE] = LAYOUT_rspace_2u_bksp(
44 KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_MUTE,
45 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_HOME,
46 KC_1, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_END,
47 KC_2, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
48 KC_3, KC_LCTL, KC_LGUI, KC_LALT, MO(1), KC_SPC, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
49),
50
51[_ONE] = LAYOUT_rspace_2u_bksp(
52 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
53 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
54 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
55 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
56 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
57),
58[_TWO] = LAYOUT_rspace_2u_bksp(
59 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
60 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
61 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
62 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
63 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
64),
65[_THREE] = LAYOUT_rspace_2u_bksp(
66 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
67 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
68 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
69 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
70 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
71),
72};
73
74void encoder_update_user(uint8_t index, bool clockwise) {
75 if (index == 0) { /* Master Left */
76 if (clockwise) {
77 tap_code(KC_VOLU);
78 } else {
79 tap_code(KC_VOLD);
80 }
81 } else if (index == 1) { /* Master Right */
82 if (clockwise) {
83 tap_code(KC_VOLU);
84 } else {
85 tap_code(KC_VOLD);
86 }
87 }
88}
89
90
91#ifdef OLED_DRIVER_ENABLE
92void suspend_power_down_user(void) {
93 oled_off();
94}
95
96oled_rotation_t oled_init_user(oled_rotation_t rotation) {
97 if (is_keyboard_master()) {
98 return OLED_ROTATION_90;
99 }
100
101 return rotation;
102}
103
104static void render_logo(void) {
105 static const char PROGMEM raw_logo[] = {
106 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,192,192,224,224,224,224,224,224,224,224,224,224,224,224,224,224,192,192,128,128,192,192,224,224,224,224,224,224,224,224,192,192,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
107 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 15, 3, 1, 0, 1,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,252,240, 0, 0, 0, 0, 0, 0, 0, 0, 0,254,254,254, 0, 0, 0, 0, 0, 0,254,254,254, 0, 0, 0,254,254,254,252,248,224,192,128,224,248,252,254,254,254, 0, 0,128,128,128,128,128,128, 0, 14, 14, 14, 14,142,238,254,254,126, 30, 4,224,248,252, 62, 30, 14, 14, 14, 30, 62,252,248,240, 0, 0, 0, 0, 0, 0, 0, 0, 0,
108 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,240,192,128, 0,128,255,255,255,255,255,255,255,255,255,255,255,255,255,255,127, 63, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 63, 63,124,112,112,112,112,124, 63, 63, 15, 0, 0, 0,127,127,127, 0, 1, 7, 15, 15, 7, 1, 0,127,127,127, 0, 0, 3, 3, 3, 3, 3, 3, 1, 0,112,124,126, 63, 15, 3, 1, 0, 0, 0, 15, 31, 63,124,120,112,112,112,120,124, 63, 31, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0,
109 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 3, 3, 1, 1, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 3, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
110 };
111 oled_write_raw_P(raw_logo, sizeof(raw_logo));
112}
113
114
115// 32 * 18 Merge logos
116static const char PROGMEM merge_logo[] = {
117 0xf8, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x0e,
118 0x06, 0x04, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfc, 0xf8, 0xf0, 0xc0,
119 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xc0,
120 0x80, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x3f, 0x0f,
121 0x00, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01,
122 0x01, 0x00, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00
123};
124
125int current_wpm = 0;
126
127static void print_status_narrow(void) {
128 oled_set_cursor(0,1);
129 oled_write_raw_P(merge_logo, sizeof(merge_logo));
130 oled_set_cursor(0,5);
131 oled_write_P(PSTR("-----"), false);
132 oled_set_cursor(0,6);
133 oled_write_P(PSTR("LYR "), false);
134 switch (get_highest_layer(layer_state)) {
135 case _BASE:
136 oled_write_P(PSTR("0"), false);
137 break;
138 case _ONE:
139 oled_write_P(PSTR("1"), false);
140 break;
141 case _TWO:
142 oled_write_P(PSTR("2"), false);
143 break;
144 case _THREE:
145 oled_write_P(PSTR("3"), false);
146 break;
147 default:
148 oled_write_ln_P(PSTR("Undef"), false);
149 }
150 led_t led_usb_state = host_keyboard_led_state();
151 oled_write_ln_P(PSTR(" "), false);
152 oled_write_P(PSTR("CAP "), false);
153 oled_write_P(PSTR("."), led_usb_state.caps_lock);
154 oled_write_P(PSTR("NUM "), false);
155 oled_write_P(PSTR("."), led_usb_state.num_lock);
156 oled_write_P(PSTR("SCR "), false);
157 oled_write_P(PSTR("."), led_usb_state.scroll_lock);
158 //oled_write_ln_P(PSTR(" "), false);
159 oled_write_P(PSTR("-----"), false);
160
161 // WPM counter Start (Need #include <stdio.h> to work)
162 char wpm_str[8];
163 oled_set_cursor(0,13);
164 sprintf(wpm_str, " %03d", current_wpm);
165 oled_write(wpm_str, false);
166 oled_set_cursor(0,14);
167 oled_write(" WPM ", false);
168 // WPM counter End
169}
170
171void oled_task_user(void) {
172 current_wpm = get_current_wpm();
173 if (is_keyboard_master()) {
174 print_status_narrow();
175 //render_logo();
176 } else {
177 render_logo();
178 //print_status_narrow();
179 }
180}
181
182#endif \ No newline at end of file
diff --git a/keyboards/merge/um70/keymaps/default/readme.md b/keyboards/merge/um70/keymaps/default/readme.md
new file mode 100644
index 000000000..a77fe70e7
--- /dev/null
+++ b/keyboards/merge/um70/keymaps/default/readme.md
@@ -0,0 +1,5 @@
1# Default UM-70 Layout
2
3![UM-70 Layout Image](https://i.imgur.com/5lucSbi.jpg)
4
5This is the default layout that comes flashed on every UM-70.
diff --git a/keyboards/merge/um70/keymaps/default/rules.mk b/keyboards/merge/um70/keymaps/default/rules.mk
new file mode 100644
index 000000000..1888ce3a1
--- /dev/null
+++ b/keyboards/merge/um70/keymaps/default/rules.mk
@@ -0,0 +1,2 @@
1WPM_ENABLE = yes
2LTO_ENABLE = yes \ No newline at end of file
diff --git a/keyboards/merge/um70/keymaps/via/config.h b/keyboards/merge/um70/keymaps/via/config.h
new file mode 100644
index 000000000..ea112f48e
--- /dev/null
+++ b/keyboards/merge/um70/keymaps/via/config.h
@@ -0,0 +1,20 @@
1/* Copyright 2021 duoshock
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#define RGBLIGHT_EFFECT_BREATHING
18#define RGBLIGHT_EFFECT_RAINBOW_MOOD
19#define RGBLIGHT_EFFECT_RAINBOW_SWIRL
20#define RGBLIGHT_EFFECT_SNAKE
diff --git a/keyboards/merge/um70/keymaps/via/keymap.c b/keyboards/merge/um70/keymaps/via/keymap.c
new file mode 100644
index 000000000..e71af2d32
--- /dev/null
+++ b/keyboards/merge/um70/keymaps/via/keymap.c
@@ -0,0 +1,182 @@
1/* Copyright 2021 duoshock
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#include QMK_KEYBOARD_H
18#include <stdio.h>
19
20enum layer_names {
21 _BASE,
22 _ONE,
23 _TWO,
24 _THREE
25};
26
27const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
28
29/*
30 * .---------------------------. .-------------------------------. .---.
31 * |Esc| 1| 2| 3| 4| 5| 6| | 7| 8| 9| 0| -| =|` |Bsp| |EC |
32 * |-------------------------. .---------------------------------| |---|
33 * |Tab | Q| W| E| R| T| | Y| U| I| O| P| [| ]| \ | |Hom|
34 * .---. |-------------------------. '---------------------------------| |---|
35 * |M0 | |CapsL | A| S| D| F| G| | H| J| K| L| ;| :| Retn | |End|
36 * |---| |----------------------------. '--------------------------------| .---. '---'
37 * |M1 | |Shft | Z| X| C| V| B| | N| M| ,| ,| /| Shift| |Up |
38 * |---| |----------------------------| |---------------------------' .-----------.
39 * |M2 | |Ctl |Gui |Alt |Fn0 |Space | | Space| Alt| Ctl| |Lef|Dow|Rig|
40 * '---' '----------------------------' '-----------------------' '-----------'
41 */
42
43[_BASE] = LAYOUT_rspace_split_bksp(
44 KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC, KC_MUTE,
45 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_HOME,
46 KC_1, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_END,
47 KC_2, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
48 KC_3, KC_LCTL, KC_LGUI, KC_LALT, MO(1), KC_SPC, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
49),
50
51[_ONE] = LAYOUT_rspace_split_bksp(
52 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
53 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
54 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
55 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
56 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
57),
58[_TWO] = LAYOUT_rspace_split_bksp(
59 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
60 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
61 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
62 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
63 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
64),
65[_THREE] = LAYOUT_rspace_split_bksp(
66 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
67 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
68 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
69 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
70 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
71),
72};
73
74void encoder_update_user(uint8_t index, bool clockwise) {
75 if (index == 0) { /* Master Left */
76 if (clockwise) {
77 tap_code(KC_VOLU);
78 } else {
79 tap_code(KC_VOLD);
80 }
81 } else if (index == 1) { /* Master Right */
82 if (clockwise) {
83 tap_code(KC_VOLU);
84 } else {
85 tap_code(KC_VOLD);
86 }
87 }
88}
89
90
91#ifdef OLED_DRIVER_ENABLE
92void suspend_power_down_user(void) {
93 oled_off();
94}
95
96oled_rotation_t oled_init_user(oled_rotation_t rotation) {
97 if (is_keyboard_master()) {
98 return OLED_ROTATION_90;
99 }
100
101 return rotation;
102}
103
104static void render_logo(void) {
105 static const char PROGMEM raw_logo[] = {
106 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,192,192,224,224,224,224,224,224,224,224,224,224,224,224,224,224,192,192,128,128,192,192,224,224,224,224,224,224,224,224,192,192,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
107 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 15, 3, 1, 0, 1,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,252,240, 0, 0, 0, 0, 0, 0, 0, 0, 0,254,254,254, 0, 0, 0, 0, 0, 0,254,254,254, 0, 0, 0,254,254,254,252,248,224,192,128,224,248,252,254,254,254, 0, 0,128,128,128,128,128,128, 0, 14, 14, 14, 14,142,238,254,254,126, 30, 4,224,248,252, 62, 30, 14, 14, 14, 30, 62,252,248,240, 0, 0, 0, 0, 0, 0, 0, 0, 0,
108 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,240,192,128, 0,128,255,255,255,255,255,255,255,255,255,255,255,255,255,255,127, 63, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 63, 63,124,112,112,112,112,124, 63, 63, 15, 0, 0, 0,127,127,127, 0, 1, 7, 15, 15, 7, 1, 0,127,127,127, 0, 0, 3, 3, 3, 3, 3, 3, 1, 0,112,124,126, 63, 15, 3, 1, 0, 0, 0, 15, 31, 63,124,120,112,112,112,120,124, 63, 31, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0,
109 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 3, 3, 1, 1, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 3, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
110 };
111 oled_write_raw_P(raw_logo, sizeof(raw_logo));
112}
113
114
115// 32 * 18 Merge logos
116static const char PROGMEM merge_logo[] = {
117 0xf8, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x0e,
118 0x06, 0x04, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfc, 0xf8, 0xf0, 0xc0,
119 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xc0,
120 0x80, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x3f, 0x0f,
121 0x00, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01,
122 0x01, 0x00, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00
123};
124
125int current_wpm = 0;
126
127static void print_status_narrow(void) {
128 oled_set_cursor(0,1);
129 oled_write_raw_P(merge_logo, sizeof(merge_logo));
130 oled_set_cursor(0,5);
131 oled_write_P(PSTR("-----"), false);
132 oled_set_cursor(0,6);
133 oled_write_P(PSTR("LYR "), false);
134 switch (get_highest_layer(layer_state)) {
135 case _BASE:
136 oled_write_P(PSTR("0"), false);
137 break;
138 case _ONE:
139 oled_write_P(PSTR("1"), false);
140 break;
141 case _TWO:
142 oled_write_P(PSTR("2"), false);
143 break;
144 case _THREE:
145 oled_write_P(PSTR("3"), false);
146 break;
147 default:
148 oled_write_ln_P(PSTR("Undef"), false);
149 }
150 led_t led_usb_state = host_keyboard_led_state();
151 oled_write_ln_P(PSTR(" "), false);
152 oled_write_P(PSTR("CAP "), false);
153 oled_write_P(PSTR("."), led_usb_state.caps_lock);
154 oled_write_P(PSTR("NUM "), false);
155 oled_write_P(PSTR("."), led_usb_state.num_lock);
156 oled_write_P(PSTR("SCR "), false);
157 oled_write_P(PSTR("."), led_usb_state.scroll_lock);
158 //oled_write_ln_P(PSTR(" "), false);
159 oled_write_P(PSTR("-----"), false);
160
161 // WPM counter Start (Need #include <stdio.h> to work)
162 char wpm_str[8];
163 oled_set_cursor(0,13);
164 sprintf(wpm_str, " %03d", current_wpm);
165 oled_write(wpm_str, false);
166 oled_set_cursor(0,14);
167 oled_write(" WPM ", false);
168 // WPM counter End
169}
170
171void oled_task_user(void) {
172 current_wpm = get_current_wpm();
173 if (is_keyboard_master()) {
174 print_status_narrow();
175 //render_logo();
176 } else {
177 render_logo();
178 //print_status_narrow();
179 }
180}
181
182#endif
diff --git a/keyboards/merge/um70/keymaps/via/rules.mk b/keyboards/merge/um70/keymaps/via/rules.mk
new file mode 100644
index 000000000..56de955c2
--- /dev/null
+++ b/keyboards/merge/um70/keymaps/via/rules.mk
@@ -0,0 +1,3 @@
1VIA_ENABLE = yes
2WPM_ENABLE = yes
3LTO_ENABLE = yes \ No newline at end of file
diff --git a/keyboards/merge/um70/readme.md b/keyboards/merge/um70/readme.md
new file mode 100644
index 000000000..0c297a640
--- /dev/null
+++ b/keyboards/merge/um70/readme.md
@@ -0,0 +1,14 @@
1# UM-70
2
3![UM-70](https://i.imgur.com/zrvMOZel.jpeg)
4
5A 70 keys keyboard in 65% layout with encoder and OLED screen sold by Merge. [Product page](https://mergedesign.store/products/um-70)
6
7* Keyboard Maintainer: [duoshock](https://github.com/duoshock)
8* Hardware Availability: [Merge Store](https://mergedesign.store/products/um-70)
9
10Make example for this keyboard (after setting up your build environment):
11
12 make merge/um70:default
13
14See 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). \ No newline at end of file
diff --git a/keyboards/merge/um70/rules.mk b/keyboards/merge/um70/rules.mk
new file mode 100644
index 000000000..4e4abc1d8
--- /dev/null
+++ b/keyboards/merge/um70/rules.mk
@@ -0,0 +1,25 @@
1# MCU name
2MCU = atmega32u4
3
4# Bootloader selection
5BOOTLOADER = atmel-dfu
6
7# Build Options
8# change yes to no to disable
9#
10BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
11MOUSEKEY_ENABLE = yes # Mouse keys
12EXTRAKEY_ENABLE = yes # Audio control and System control
13CONSOLE_ENABLE = no # Console for debug
14COMMAND_ENABLE = no # Commands for debug and configuration
15# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
16SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
17# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
18NKRO_ENABLE = yes # USB Nkey Rollover
19BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
20RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
21BLUETOOTH_ENABLE = no # Enable Bluetooth
22AUDIO_ENABLE = no # Audio output
23ENCODER_ENABLE = yes
24SPLIT_KEYBOARD = yes
25OLED_DRIVER_ENABLE = yes
diff --git a/keyboards/merge/um70/um70.c b/keyboards/merge/um70/um70.c
new file mode 100644
index 000000000..3283e7e26
--- /dev/null
+++ b/keyboards/merge/um70/um70.c
@@ -0,0 +1,77 @@
1/* Copyright 2021 duoshock
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#include "um70.h"
18
19#ifdef RGB_MATRIX_ENABLE
20/*
21 Underglow Underglow 13,14 = split bksp, 14 = 2u bksp
22 07 08 09 10 11 12 13 01 01 07 08 09 10 11 12 13 14
23 14 15 16 17 18 19 02 02 15 16 17 18 19 20 21 22 23
2420 21 22 23 24 25 26 03 03 24 25 26 27 28 29 30 31
2527 28 29 30 31 32 33 04 04 32 33 34 35 36 37 38
2634 35 36 37 38 39 05 05 39 40 41 42 43 44
27 06 06
28*/
29
30#define XX NO_LED
31
32led_config_t g_led_config = { {
33 { 6, 7, 8, 9, 10, 11, 12, XX },
34 { 13, 14, 15, 16, 17, 18, XX, XX },
35 { 20, 21, 22, 23, 24, 25, XX, XX },
36 { 27, 28, 29, 30, 31, 32, XX, XX },
37 { 34, 35, 36, 37, 38, 19, 26, 33 },
38
39 { 45, 46, 47, 48, 49, 50, 51, 52 },
40 { 53, 54, 55, 56, 57, 58, 59, 60 },
41 { 62, 63, 64, 65, 66, 67, 68, XX },
42 { 70, 71, 72, 73, 74, 75, 76, 61 },
43 { 77, 78, 79, 80, 81, 82, XX, 69 },
44}, {
45 { 224, 0 }, { 224, 13 }, { 224, 26 }, { 148, 39 }, { 185, 52 }, { 224, 64 },
46
47 { 32, 0 }, { 64, 0 }, { 96, 0 }, { 128, 0 }, { 160, 0 }, { 192, 0 }, { 224, 0 },
48 { 32, 16 }, { 64, 16 }, { 96, 16 }, { 128, 16 }, { 160, 16 }, { 192, 16 },
49 { 0, 32 }, { 32, 32 }, { 64, 32 }, { 96, 32 }, { 128, 32 }, { 160, 32 }, { 192, 32 },
50 { 0, 48 }, { 32, 48 }, { 64, 48 }, { 96, 48 }, { 128, 48 }, { 160, 48 }, { 192, 48 },
51 { 0, 64 }, { 32, 64 }, { 64, 64 }, { 96, 64 }, { 128, 64 }, { 160, 64 },
52
53 { 224, 0 }, { 224, 13 }, { 224, 26 }, { 148, 39 }, { 185, 52 }, { 224, 64 },
54
55 { 0, 0 }, { 32, 0 }, { 64, 0 }, { 96, 0 }, { 128, 0 }, { 160, 0 }, { 192, 0 }, { 224, 0 },
56 { 0, 16 }, { 32, 16 }, { 64, 16 }, { 96, 16 }, { 128, 16 }, { 160, 16 }, { 192, 16 }, { 223, 16 }, { 224, 16 },
57 { 0, 32 }, { 32, 32 }, { 64, 32 }, { 96, 32 }, { 128, 32 }, { 160, 32 }, { 192, 32 }, { 223, 32 },
58 { 0, 48 }, { 32, 48 }, { 64, 48 }, { 96, 48 }, { 128, 48 }, { 160, 48 }, { 192, 48 },
59 { 0, 46 }, { 32, 46 }, { 64, 64 }, { 96, 64 }, { 128, 64 }, { 160, 64 }
60
61}, {
62 2, 2, 2, 2, 2, 2,
63 4, 4, 4, 4, 4, 4, 4,
64 1, 4, 4, 4, 4, 4,
65 4, 1, 4, 4, 4, 4, 4,
66 4, 1, 4, 4, 4, 4, 4,
67 4, 1, 1, 1, 1, 1,
68
69 2, 2, 2, 2, 2, 2,
70 4, 4, 4, 4, 4, 4, 4, 1,
71 4, 4, 4, 4, 4, 4, 4, 1, 4,
72 4, 4, 4, 4, 4, 4, 1, 4,
73 4, 4, 4, 4, 4, 1, 4,
74 1, 1, 1, 4, 4, 4
75} };
76
77#endif \ No newline at end of file
diff --git a/keyboards/merge/um70/um70.h b/keyboards/merge/um70/um70.h
new file mode 100644
index 000000000..9b46c94a9
--- /dev/null
+++ b/keyboards/merge/um70/um70.h
@@ -0,0 +1,97 @@
1/* Copyright 2021 duoshock
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#pragma once
18
19#include "quantum.h"
20
21#define XXX KC_NO
22
23#define LAYOUT_rspace_split_bksp( \
24 L00, L01, L02, L03, L04, L05, L06, R00, R01, R02, R03, R04, R05, R06, R07, R27, \
25 L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, R16, R17, R37, \
26 L45, L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, R26, R47, \
27 L46, L30, L31, L32, L33, L34, L35, R30, R31, R32, R33, R34, R35, R36,\
28 L47, L40, L41, L42, L43, L44, R40, R41, R42, R43, R44, R45 \
29) { \
30 { L00, L01, L02, L03, L04, L05, L06, XXX }, \
31 { L10, L11, L12, L13, L14, L15, XXX, XXX }, \
32 { L20, L21, L22, L23, L24, L25, XXX, XXX }, \
33 { L30, L31, L32, L33, L34, L35, XXX, XXX }, \
34 { L40, L41, L42, L43, L44, L45, L46, L47 }, \
35 { R00, R01, R02, R03, R04, R05, R06, R07 }, \
36 { R10, R11, R12, R13, R14, R15, R16, R17 }, \
37 { R20, R21, R22, R23, R24, R25, R26, R27 }, \
38 { R30, R31, R32, R33, R34, R35, R36, R37 }, \
39 { R40, R41, R42, R43, R44, R45, XXX, R47 } \
40}
41
42#define LAYOUT_rspace_2u_bksp( \
43 L00, L01, L02, L03, L04, L05, L06, R00, R01, R02, R03, R04, R05, R07, R27, \
44 L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, R16, R17, R37, \
45 L45, L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, R26, R47, \
46 L46, L30, L31, L32, L33, L34, L35, R30, R31, R32, R33, R34, R35, R36,\
47 L47, L40, L41, L42, L43, L44, R40, R41, R42, R43, R44, R45 \
48) { \
49 { L00, L01, L02, L03, L04, L05, L06, XXX }, \
50 { L10, L11, L12, L13, L14, L15, XXX, XXX }, \
51 { L20, L21, L22, L23, L24, L25, XXX, XXX }, \
52 { L30, L31, L32, L33, L34, L35, XXX, XXX }, \
53 { L40, L41, L42, L43, L44, L45, L46, L47 }, \
54 { R00, R01, R02, R03, R04, R05, XXX, R07 }, \
55 { R10, R11, R12, R13, R14, R15, R16, R17 }, \
56 { R20, R21, R22, R23, R24, R25, R26, R27 }, \
57 { R30, R31, R32, R33, R34, R35, R36, R37 }, \
58 { R40, R41, R42, R43, R44, R45, XXX, R47 } \
59}
60
61#define LAYOUT_lspace_2u_bksp( \
62 L00, L01, L02, L03, L04, L05, L06, R00, R01, R02, R03, R04, R05, R07, R27, \
63 L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, R16, R17, R37, \
64 L45, L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, R26, R47, \
65 L46, L30, L31, L32, L33, L34, L35, R30, R31, R32, R33, R34, R35, R36,\
66 L47, L40, L41, L42, L44, L43, R40, R41, R42, R43, R44, R45 \
67) { \
68 { L00, L01, L02, L03, L04, L05, L06, XXX }, \
69 { L10, L11, L12, L13, L14, L15, XXX, XXX }, \
70 { L20, L21, L22, L23, L24, L25, XXX, XXX }, \
71 { L30, L31, L32, L33, L34, L35, XXX, XXX }, \
72 { L40, L41, L42, L43, L44, L45, L46, L47 }, \
73 { R00, R01, R02, R03, R04, R05, XXX, R07 }, \
74 { R10, R11, R12, R13, R14, R15, R16, R17 }, \
75 { R20, R21, R22, R23, R24, R25, R26, R27 }, \
76 { R30, R31, R32, R33, R34, R35, R36, R37 }, \
77 { R40, R41, R42, R43, R44, R45, XXX, R47 } \
78}
79
80#define LAYOUT_lspace_split_bksp( \
81 L00, L01, L02, L03, L04, L05, L06, R00, R01, R02, R03, R04, R05, R06, R07, R27, \
82 L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, R16, R17, R37, \
83 L45, L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, R26, R47, \
84 L46, L30, L31, L32, L33, L34, L35, R30, R31, R32, R33, R34, R35, R36,\
85 L47, L40, L41, L42, L44, L43, R40, R41, R42, R43, R44, R45 \
86) { \
87 { L00, L01, L02, L03, L04, L05, L06, XXX }, \
88 { L10, L11, L12, L13, L14, L15, XXX, XXX }, \
89 { L20, L21, L22, L23, L24, L25, XXX, XXX }, \
90 { L30, L31, L32, L33, L34, L35, XXX, XXX }, \
91 { L40, L41, L42, L43, L44, L45, L46, L47 }, \
92 { R00, R01, R02, R03, R04, R05, R06, R07 }, \
93 { R10, R11, R12, R13, R14, R15, R16, R17 }, \
94 { R20, R21, R22, R23, R24, R25, R26, R27 }, \
95 { R30, R31, R32, R33, R34, R35, R36, R37 }, \
96 { R40, R41, R42, R43, R44, R45, XXX, R47 } \
97}