summaryrefslogtreecommitdiffstats
path: root/keyboards/hotdox76v2
diff options
context:
space:
mode:
authorlokher <lokher@gmail.com>2022-12-06 17:04:10 +0800
committerlokher <lokher@gmail.com>2022-12-06 17:04:10 +0800
commit27fc28fd2ff52e079a5bc58d6aaea4c752420615 (patch)
tree7ac943fb1ba4f430a7220efd18f66f6a77205c30 /keyboards/hotdox76v2
parente736133392fe6427cfb995da0787337189828272 (diff)
parent2709b6ed616f8012ff4cfd3ee69a822a8d188351 (diff)
Merge upstream master
Diffstat (limited to 'keyboards/hotdox76v2')
-rw-r--r--keyboards/hotdox76v2/config.h45
-rw-r--r--keyboards/hotdox76v2/hotdox76v2.c309
-rw-r--r--keyboards/hotdox76v2/hotdox76v2.h9
-rw-r--r--keyboards/hotdox76v2/info.json224
-rw-r--r--keyboards/hotdox76v2/keymaps/default/keymap.c35
-rw-r--r--keyboards/hotdox76v2/keymaps/ifohancroft/README.md20
-rw-r--r--keyboards/hotdox76v2/keymaps/ifohancroft/config.h23
-rw-r--r--keyboards/hotdox76v2/keymaps/ifohancroft/keymap.c145
-rw-r--r--keyboards/hotdox76v2/keymaps/ifohancroft/rules.mk6
-rw-r--r--keyboards/hotdox76v2/keymaps/via/keymap.c179
-rw-r--r--keyboards/hotdox76v2/keymaps/via/rules.mk3
-rw-r--r--keyboards/hotdox76v2/oled_font_lib/ext_font.h122
-rw-r--r--keyboards/hotdox76v2/oled_font_lib/logo2.h14
-rw-r--r--keyboards/hotdox76v2/readme.md25
-rw-r--r--keyboards/hotdox76v2/rules.mk1
15 files changed, 1160 insertions, 0 deletions
diff --git a/keyboards/hotdox76v2/config.h b/keyboards/hotdox76v2/config.h
new file mode 100644
index 0000000000..5a3d53d447
--- /dev/null
+++ b/keyboards/hotdox76v2/config.h
@@ -0,0 +1,45 @@
+// Copyright 2021 JasonRen(biu)
+// Copyright 2022 Drashna Jael're (@Drashna Jael're)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "config_common.h"
+/*
+ * 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 RGB_MATRIX_SPLIT \
+ { 43, 43 }
+
+#define RGB_DI_PIN D3
+#define RGB_MATRIX_LED_COUNT 86
+
+#define RGB_MATRIX_MAXIMUM_BRIGHTNESS 150
+#define RGB_DISABLE_WHEN_USB_SUSPENDED
+#define RGB_MATRIX_CENTER \
+ { 112, 32 }
+
+#define SPLIT_TRANSPORT_MIRROR
+#define SPLIT_MODS_ENABLE
+#define SPLIT_LAYER_STATE_ENABLE
+#define SPLIT_LED_STATE_ENABLE
+#define SPLIT_OLED_ENABLE
+#define SPLIT_TRANSACTION_IDS_KB KEYBOARD_CURRENT_ALPA_SYNC
+
+#define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN
+#define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT
+#define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
+#define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL
diff --git a/keyboards/hotdox76v2/hotdox76v2.c b/keyboards/hotdox76v2/hotdox76v2.c
new file mode 100644
index 0000000000..15613a36cd
--- /dev/null
+++ b/keyboards/hotdox76v2/hotdox76v2.c
@@ -0,0 +1,309 @@
+// Copyright 2021 JasonRen(biu)
+// Copyright 2022 Drashna Jael're (@Drashna Jael're)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+#include <string.h>
+#include <transactions.h>
+#include "oled_font_lib/logo2.h"
+#include "oled_font_lib/ext_font.h"
+
+
+#ifdef RGB_MATRIX_ENABLE
+// clang-format off
+led_config_t g_led_config = {
+ {
+ { NO_LED, 34, 33, 32, 35, 37, 36 },
+ { 27, 28, 29, 30, 31, NO_LED, NO_LED },
+ { 26, 25, 24, 23, 22, 21, 20 },
+ { 14, 15, 16, 17, 18, 19, NO_LED },
+ { 13, 12, 11, 10, 9, 8, 7 },
+ { 0, 1, 2, 3, 4, 5, 6 },
+ /*right*/
+ { NO_LED, 72, 71, 70, 73, 75, 74 },
+ { 65, 66, 67, 68, 69, NO_LED, NO_LED },
+ { 64, 63, 62, 61, 60, 59, 58 },
+ { 52, 53, 54, 55, 56, 57, NO_LED },
+ { 51, 50, 49, 48, 47, 46, 45 },
+ { 38, 39, 40, 41, 42, 43, 44 }
+ },
+ {
+ // LED Index to Physical Position
+ {0,0}, {17,0}, {34,0}, {52,0}, {69,0}, {86,0}, {103,0}, \
+ {103,13}, {86,13}, {69,13}, {52,13}, {34,13}, {17,13}, {0,13}, \
+ {0,26}, {17,26}, {34,26}, {52,26}, {69,26}, {86,26}, \
+ {103,38}, {86,38}, {69,38}, {52,38}, {34,38}, {17,38}, {0,38}, \
+ {0,51}, {17,51}, {34,51}, {52,51}, {69,51}, \
+ {86,64}, {69,64}, {52,64}, {34,64}, {17,64}, {0,64}, \
+ {69,64}, {52,64}, {34,64}, {17,64}, {0,64}, \
+
+ \
+ {224,0}, {207,0}, {190,0}, {172,0}, {155,0}, {138,0}, {121,0}, \
+ {121,13}, {138,13}, {155,13}, {172,13}, {190,13}, {207,13}, {224,13}, \
+ {224,26}, {207,26}, {190,26}, {172,26}, {155,26}, {138,26}, \
+ {121,38}, {138,38}, {155,38}, {172,38}, {190,38}, {207,38}, {224,38}, \
+ {224,51}, {207,51}, {190,51}, {172,51}, {155,51}, \
+ {138,64}, {155,64}, {172,64}, {190,64}, {207,64}, {224,64}, \
+ {155,64}, {172,64}, {190,64}, {207,64}, {224,64}\
+
+
+ },
+ {
+ // LED Index to Flag
+ 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,\
+ 2,2,2,2,2,\
+ 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,\
+ 2,2,2,2,2
+ }
+};
+// clang-format on
+#endif
+
+#ifdef OLED_ENABLE
+
+# define UNC (94 + 0x21)
+typedef struct _master_to_slave_t {
+ int cur_alp_index;
+ char current_alp[7];
+} master_to_slave_t;
+master_to_slave_t m2s;
+
+typedef struct _slave_to_master_t {
+ int cur_alp_index;
+ char current_alp[7];
+} slave_to_master_t;
+slave_to_master_t s2m;
+
+oled_rotation_t oled_init_kb(oled_rotation_t rotation) {
+ strcpy((char *)(m2s.current_alp), "[ ]");
+ m2s.current_alp[1] = UNC;
+ m2s.current_alp[2] = UNC;
+ m2s.current_alp[3] = UNC;
+ m2s.current_alp[4] = UNC;
+
+ m2s.cur_alp_index = 1;
+
+ strcpy((char *)(s2m.current_alp), "[ ]");
+ s2m.current_alp[1] = UNC;
+ s2m.current_alp[2] = UNC;
+ s2m.current_alp[3] = UNC;
+ s2m.current_alp[4] = UNC;
+
+ s2m.cur_alp_index = 1;
+
+ if (is_keyboard_left()) {
+ return OLED_ROTATION_180;
+ } else {
+ return OLED_ROTATION_0;
+ }
+}
+
+void render_logo(void) {
+ uint8_t i = 0, j = 0;
+ for (i = 0; i < 4; ++i) {
+ for (j = 0; j < 32; ++j) {
+ if (is_keyboard_left()) {
+ oled_write_raw_byte(pgm_read_byte(&logo_mouse[i * 32 + j]), i * 128 + j);
+ } else {
+ oled_write_raw_byte(pgm_read_byte(&logo_mouse[i * 32 + j]), i * 128 + j + 96);
+ }
+ }
+ }
+}
+
+void render_layer_helper_fun(uint8_t start_line, const char *data, uint8_t gap_w, uint8_t l) {
+ uint8_t j = 0, k = 0;
+ for (j = 0; j < l; ++j) { // font index
+ for (k = 0; k < 12; ++k) { // font byte index
+ // base + logo_w(32) + gap_w(12) +l*font_w(12)+current_byte_index
+ oled_write_raw_byte(pgm_read_byte(&ext_big_font[pgm_read_byte(&data[j]) - 0x21][k]), start_line * 2 * 128 + 32 + gap_w + j * 12 + k);
+ oled_write_raw_byte(pgm_read_byte(&ext_big_font[pgm_read_byte(&data[j]) - 0x21][k + 12]), start_line * 2 * 128 + 128 + 32 + gap_w + j * 12 + k);
+ }
+ }
+ for (j = 0; j < gap_w; ++j) {
+ oled_write_raw_byte(pgm_read_byte(&blank_block), start_line * 2 * 128 + 32 + j);
+ oled_write_raw_byte(pgm_read_byte(&blank_block), start_line * 2 * 128 + 32 + gap_w + l * 12 + j);
+
+ oled_write_raw_byte(pgm_read_byte(&blank_block), start_line * 2 * 128 + 128 + 32 + j);
+ oled_write_raw_byte(pgm_read_byte(&blank_block), start_line * 2 * 128 + 128 + 32 + gap_w + l * 12 + j);
+ }
+}
+void render_layer(uint8_t layer) {
+ render_layer_helper_fun(0, PSTR("LAYER:"), 12, 6);
+ switch (layer) {
+ case 0:
+ render_layer_helper_fun(1, PSTR("1:HOME"), 12, 6);
+ break;
+ case 1:
+ render_layer_helper_fun(1, PSTR("2:CODE"), 12, 6);
+ break;
+ case 2:
+ render_layer_helper_fun(1, PSTR("3:OFFICE"), 0, 8);
+ break;
+ case 3:
+ default:
+ render_layer_helper_fun(1, PSTR("4:OTHERS"), 0, 8);
+ break;
+ }
+}
+
+void render_cur_input_helper_fun(uint8_t start_line, const char *data, uint8_t gap_w, uint8_t l) {
+ uint8_t j = 0, k = 0;
+ for (j = 0; j < l; ++j) { // font index
+ for (k = 0; k < 12; ++k) { // font byte index
+ // base + logo_w(0) + gap_w(12) +l*font_w(12)+current_byte_index
+ oled_write_raw_byte(pgm_read_byte(&ext_big_font[data[j] - 0x21][k]), start_line * 2 * 128 + gap_w + j * 12 + k);
+ oled_write_raw_byte(pgm_read_byte(&ext_big_font[data[j] - 0x21][12 + k]), start_line * 2 * 128 + 128 + gap_w + j * 12 + k);
+ }
+ }
+ for (j = 0; j < gap_w; ++j) {
+ oled_write_raw_byte(pgm_read_byte(&blank_block), start_line * 2 * 128 + j);
+ oled_write_raw_byte(pgm_read_byte(&blank_block), start_line * 2 * 128 + gap_w + l * 12 + j);
+
+ oled_write_raw_byte(pgm_read_byte(&blank_block), start_line * 2 * 128 + 128 + j);
+ oled_write_raw_byte(pgm_read_byte(&blank_block), start_line * 2 * 128 + 128 + gap_w + l * 12 + j);
+ }
+}
+
+void render_cur_input(void) {
+ render_cur_input_helper_fun(0, "INPUTS:", 6, 7);
+ if (is_keyboard_master()) {
+ render_cur_input_helper_fun(1, (const char *)(m2s.current_alp), 12, 6);
+ } else {
+ render_cur_input_helper_fun(1, (const char *)(s2m.current_alp), 12, 6);
+ }
+ return;
+}
+
+bool oled_task_kb(void) {
+ if (!oled_task_user()) {
+ return false;
+ }
+ render_logo();
+ if (is_keyboard_left()) {
+ render_layer(biton32(layer_state));
+ } else {
+ render_cur_input();
+ }
+ return false;
+}
+
+static const char PROGMEM code_to_name[0xFF] = {
+ // 0 1 2 3 4 5 6 7 8 9 A B c D E F
+ UNC, UNC, UNC, UNC, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', // 0x
+ 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', // 1x
+ '3', '4', '5', '6', '7', '8', '9', '0', UNC, UNC, UNC, UNC, UNC, '-', '=', '[', // 2x
+ ']', '\\', '#', ';', '\'', '`', ',', '.', '/', UNC, UNC, UNC, UNC, UNC, UNC, UNC, // 3x
+ UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, // 4x
+ UNC, UNC, UNC, UNC, '/', '*', '-', '+', UNC, '1', '2', '3', '4', '5', '6', '7', // 5x
+ '8', '9', '0', '.', UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, // 6x
+ UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, // 7x
+ UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, // 8x
+ UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, // 9x
+ UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, // Ax
+ UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, // Bx
+ UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, // Cx
+ UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, // Dx
+ UNC, UNC, 'A', 'W', UNC, 'S', UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, // Ex
+ UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC, UNC // Fx
+};
+
+void get_cur_alp_hook(uint16_t keycode) {
+ if (keycode >= 0xF0) {
+ keycode = 0xF0;
+ }
+ if (m2s.cur_alp_index < 4) {
+ m2s.current_alp[m2s.cur_alp_index] = pgm_read_byte(&code_to_name[keycode]);
+ if (m2s.cur_alp_index == 1) {
+ m2s.current_alp[2] = m2s.current_alp[3] = m2s.current_alp[4] = UNC;
+ }
+ m2s.cur_alp_index++;
+ } else {
+ for (uint8_t i = 2; i <= 4; ++i) {
+ m2s.current_alp[i - 1] = m2s.current_alp[i];
+ }
+ m2s.current_alp[m2s.cur_alp_index] = pgm_read_byte(&code_to_name[keycode]);
+ }
+}
+
+bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
+ if (record->event.pressed) {
+ get_cur_alp_hook(keycode);
+ }
+ if (!process_record_user(keycode, record)) {
+ return false;
+ }
+ switch (keycode) {
+ case TOG_OLED:
+ if (record->event.pressed) {
+ if (is_oled_on()) {
+ oled_off();
+ } else {
+ oled_on();
+ }
+ }
+ return false;
+ default:
+ return true;
+ }
+ return true;
+}
+
+void matrix_scan_kb(void) {
+ if (!is_oled_on()) {
+ m2s.cur_alp_index = 1;
+ }
+ matrix_scan_user();
+}
+
+void user_sync_alpa_slave_handler(uint8_t in_buflen, const void *in_data, uint8_t out_buflen, void *out_data) {
+ const master_to_slave_t *m2s_p = (const master_to_slave_t *)in_data;
+ s2m.cur_alp_index = m2s_p->cur_alp_index;
+ for (size_t i = 0; i < 7; i++) {
+ s2m.current_alp[i] = m2s_p->current_alp[i];
+ }
+}
+
+void keyboard_post_init_kb(void) {
+ transaction_register_rpc(KEYBOARD_CURRENT_ALPA_SYNC, user_sync_alpa_slave_handler);
+ keyboard_post_init_user();
+}
+
+void housekeeping_task_kb(void) {
+ if (is_keyboard_master()) {
+ // Interact with slave every 200ms
+ static uint32_t last_sync = 0;
+ if (timer_elapsed32(last_sync) > 200) {
+ if (transaction_rpc_exec(KEYBOARD_CURRENT_ALPA_SYNC, sizeof(m2s), &m2s, sizeof(s2m), &s2m)) {
+ last_sync = timer_read32();
+ dprint("Slave sync successed!\n");
+ } else {
+ dprint("Slave sync failed!\n");
+ }
+ }
+ }
+ housekeeping_task_user();
+}
+
+#endif
+
+#ifdef SWAP_HANDS_ENABLE
+__attribute__((weak))
+const keypos_t PROGMEM hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = {
+ /* Left hand, matrix positions */
+ {{0, 6}, {1, 6}, {2, 6}, {3, 6}, {4, 6}, {5, 6}, {6, 6}},
+ {{0, 7}, {1, 7}, {2, 7}, {3, 7}, {4, 7}, {5, 7}, {6, 7}},
+ {{0, 8}, {1, 8}, {2, 8}, {3, 8}, {4, 8}, {5, 8}, {6, 8}},
+ {{0, 9}, {1, 9}, {2, 9}, {3, 9}, {4, 9}, {5, 9}, {6, 9}},
+ {{0, 10}, {1, 10}, {2, 10}, {3, 10}, {4, 10}, {5, 10}, {6, 10}},
+ {{0, 11}, {1, 11}, {2, 11}, {3, 11}, {4, 11}, {5, 11}, {6, 11}},
+
+ /* Right hand, matrix positions */
+ {{0, 5}, {1, 5}, {2, 5}, {3, 5}, {4, 5}, {5, 5}, {6, 5}},
+ {{0, 4}, {1, 4}, {2, 4}, {3, 4}, {4, 4}, {5, 4}, {6, 4}},
+ {{0, 3}, {1, 3}, {2, 3}, {3, 3}, {4, 3}, {5, 3}, {6, 3}},
+ {{0, 2}, {1, 2}, {2, 2}, {3, 2}, {4, 2}, {5, 2}, {6, 2}},
+ {{0, 1}, {1, 1}, {2, 1}, {3, 1}, {4, 1}, {5, 1}, {6, 1}},
+ {{0, 0}, {1, 0}, {2, 0}, {3, 0}, {4, 0}, {5, 0}, {6, 0}}
+};
+#endif
diff --git a/keyboards/hotdox76v2/hotdox76v2.h b/keyboards/hotdox76v2/hotdox76v2.h
new file mode 100644
index 0000000000..a9165dd673
--- /dev/null
+++ b/keyboards/hotdox76v2/hotdox76v2.h
@@ -0,0 +1,9 @@
+// Copyright 2021 JasonRen(biu)
+// Copyright 2022 Drashna Jael're (@Drashna Jael're)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "quantum.h"
+
+#define TOG_OLED KC_F13
diff --git a/keyboards/hotdox76v2/info.json b/keyboards/hotdox76v2/info.json
new file mode 100644
index 0000000000..70c62212f1
--- /dev/null
+++ b/keyboards/hotdox76v2/info.json
@@ -0,0 +1,224 @@
+{
+ "manufacturer": "JasonRen biu",
+ "keyboard_name": "hotdox76",
+ "maintainer": "Drashna Jael're",
+ "bootloader": "atmel-dfu",
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "lto": true,
+ "oled": true,
+ "rgb_matrix": true
+ },
+ "matrix_pins": {
+ "cols": ["F7", "F6", "F5", "F4", "F1", "F0", "E6"],
+ "rows": ["D6", "D7", "B4", "B5", "B6", "C6"]
+ },
+ "split": {
+ "enabled": true,
+ "soft_serial_pin": "D2"
+ },
+ "processor": "atmega32u4",
+ "url": "https://github.com/Oh-My-Mechanical-Keyboard",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0xAAA9",
+ "vid": "0xAA96"
+ },
+ "community_layouts": [
+ "ergodox"
+ ],
+ "layouts": {
+ "LAYOUT_ergodox": {
+ "layout": [
+ { "label": "L00", "matrix": [5, 0], "w": 1.5, "x": 0, "y": 0.375 },
+ { "label": "L01", "matrix": [5, 1], "w": 1, "x": 1.5, "y": 0.375 },
+ { "label": "L02", "matrix": [5, 2], "w": 1, "x": 2.5, "y": 0.125 },
+ { "label": "L03", "matrix": [5, 3], "w": 1, "x": 3.5, "y": 0 },
+ { "label": "L04", "matrix": [5, 4], "w": 1, "x": 4.5, "y": 0.125 },
+ { "label": "L05", "matrix": [5, 5], "w": 1, "x": 5.5, "y": 0.25 },
+ { "label": "L06", "matrix": [5, 6], "w": 1, "x": 6.5, "y": 0.25 },
+
+ { "label": "L10", "matrix": [4, 0], "w": 1.5, "x": 0, "y": 1.375 },
+ { "label": "L11", "matrix": [4, 1], "w": 1, "x": 1.5, "y": 1.375 },
+ { "label": "L12", "matrix": [4, 2], "w": 1, "x": 2.5, "y": 1.125 },
+ { "label": "L13", "matrix": [4, 3], "w": 1, "x": 3.5, "y": 1 },
+ { "label": "L14", "matrix": [4, 4], "w": 1, "x": 4.5, "y": 1.125 },
+ { "label": "L15", "matrix": [4, 5], "w": 1, "x": 5.5, "y": 1.25 },
+ { "label": "L16", "matrix": [4, 6], "w": 1, "x": 6.5, "y": 1.25, "h": 1.5 },
+
+ { "label": "L20", "matrix": [3, 0], "w": 1.5, "x": 0, "y": 2.375 },
+ { "label": "L21", "matrix": [3, 1], "w": 1, "x": 1.5, "y": 2.375 },
+ { "label": "L22", "matrix": [3, 2], "w": 1, "x": 2.5, "y": 2.125 },
+ { "label": "L23", "matrix": [3, 3], "w": 1, "x": 3.5, "y": 2 },
+ { "label": "L24", "matrix": [3, 4], "w": 1, "x": 4.5, "y": 2.125 },
+ { "label": "L25", "matrix": [3, 5], "w": 1, "x": 5.5, "y": 2.25 },
+
+ { "label": "L30", "matrix": [2, 0], "w": 1.5, "x": 0, "y": 3.375 },
+ { "label": "L31", "matrix": [2, 1], "w": 1, "x": 1.5, "y": 3.375 },
+ { "label": "L32", "matrix": [2, 2], "w": 1, "x": 2.5, "y": 3.125 },
+ { "label": "L33", "matrix": [2, 3], "w": 1, "x": 3.5, "y": 3 },
+ { "label": "L34", "matrix": [2, 4], "w": 1, "x": 4.5, "y": 3.125 },
+ { "label": "L35", "matrix": [2, 5], "w": 1, "x": 5.5, "y": 3.25 },
+ { "label": "L36", "matrix": [2, 6], "w": 1, "x": 6.5, "y": 2.75, "h": 1.5 },
+
+ { "label": "L40", "matrix": [1, 0], "w": 1, "x": 0.5, "y": 4.375 },
+ { "label": "L41", "matrix": [1, 1], "w": 1, "x": 1.5, "y": 4.375 },
+ { "label": "L42", "matrix": [1, 2], "w": 1, "x": 2.5, "y": 4.125 },
+ { "label": "L43", "matrix": [1, 3], "w": 1, "x": 3.5, "y": 4 },
+ { "label": "L44", "matrix": [1, 4], "w": 1, "x": 4.5, "y": 4.125 },
+
+ { "label": "L55", "matrix": [0, 5], "w": 1, "x": 6, "y": 5 },
+ { "label": "L56", "matrix": [0, 6], "w": 1, "x": 7, "y": 5 },
+ { "label": "L54", "matrix": [0, 4], "w": 1, "x": 7, "y": 6 },
+ { "label": "L53", "matrix": [0, 3], "w": 1, "x": 5, "y": 6, "h": 2 },
+ { "label": "L52", "matrix": [0, 2], "w": 1, "x": 6, "y": 6, "h": 2 },
+ { "label": "L51", "matrix": [0, 1], "w": 1, "x": 7, "y": 7 },
+
+ { "label": "R06", "matrix": [11, 6], "w": 1, "x": 9.5, "y": 0.25 },
+ { "label": "R05", "matrix": [11, 5], "w": 1, "x": 10.5, "y": 0.25 },
+ { "label": "R04", "matrix": [11, 4], "w": 1, "x": 11.5, "y": 0.125 },
+ { "label": "R03", "matrix": [11, 3], "w": 1, "x": 12.5, "y": 0 },
+ { "label": "R02", "matrix": [11, 2], "w": 1, "x": 13.5, "y": 0.125 },
+ { "label": "R01", "matrix": [11, 1], "w": 1, "x": 14.5, "y": 0.375 },
+ { "label": "R00", "matrix": [11, 0], "w": 1.5, "x": 15.5, "y": 0.375 },
+
+ { "label": "R16", "matrix": [10, 6], "w": 1, "x": 9.5, "y": 1.25, "h": 1.5 },
+ { "label": "R15", "matrix": [10, 5], "w": 1, "x": 10.5, "y": 1.25 },
+ { "label": "R14", "matrix": [10, 4], "w": 1, "x": 11.5, "y": 1.125 },
+ { "label": "R13", "matrix": [10, 3], "w": 1, "x": 12.5, "y": 1 },
+ { "label": "R12", "matrix": [10, 2], "w": 1, "x": 13.5, "y": 1.125 },
+ { "label": "R11", "matrix": [10, 1], "w": 1, "x": 14.5, "y": 1.375 },
+ { "label": "R10", "matrix": [10, 0], "w": 1.5, "x": 15.5, "y": 1.375 },
+
+ { "label": "R25", "matrix": [9, 5], "w": 1, "x": 10.5, "y": 2.25 },
+ { "label": "R24", "matrix": [9, 4], "w": 1, "x": 11.5, "y": 2.125 },
+ { "label": "R23", "matrix": [9, 3], "w": 1, "x": 12.5, "y": 2 },
+ { "label": "R22", "matrix": [9, 2], "w": 1, "x": 13.5, "y": 2.125 },
+ { "label": "R21", "matrix": [9, 1], "w": 1, "x": 14.5, "y": 2.375 },
+ { "label": "R20", "matrix": [9, 0], "w": 1.5, "x": 15.5, "y": 2.375 },
+
+ { "label": "R36", "matrix": [8, 6], "w": 1, "x": 9.5, "y": 2.75, "h": 1.5 },
+ { "label": "R35", "matrix": [8, 5], "w": 1, "x": 10.5, "y": 3.25 },
+ { "label": "R34", "matrix": [8, 4], "w": 1, "x": 11.5, "y": 3.125 },
+ { "label": "R33", "matrix": [8, 3], "w": 1, "x": 12.5, "y": 3 },
+ { "label": "R32", "matrix": [8, 2], "w": 1, "x": 13.5, "y": 3.125 },
+ { "label": "R31", "matrix": [8, 1], "w": 1, "x": 14.5, "y": 3.375 },
+ { "label": "R30", "matrix": [8, 0], "w": 1.5, "x": 15.5, "y": 3.375 },
+
+ { "label": "R44", "matrix": [7, 4], "w": 1, "x": 11.5, "y": 4.125 },
+ { "label": "R43", "matrix": [7, 3], "w": 1, "x": 12.5, "y": 4 },
+ { "label": "R42", "matrix": [7, 2], "w": 1, "x": 13.5, "y": 4.125 },
+ { "label": "R41", "matrix": [7, 1], "w": 1, "x": 14.5, "y": 4.375 },
+ { "label": "R40", "matrix": [7, 0], "w": 1, "x": 15.5, "y": 4.375 },
+
+ { "label": "R56", "matrix": [6, 6], "w": 1, "x": 9, "y": 5 },
+ { "label": "R55", "matrix": [6, 5], "w": 1, "x": 10, "y": 5 },
+ { "label": "R54", "matrix": [6, 4], "w": 1, "x": 9, "y": 6 },
+ { "label": "R51", "matrix": [6, 1], "w": 1, "x": 9, "y": 7 },
+ { "label": "R52", "matrix": [6, 2], "w": 1, "x": 11, "y": 6, "h": 2 },
+ { "label": "R53", "matrix": [6, 3], "w": 1, "x": 10, "y": 6, "h": 2 }
+ ]
+ },
+ "LAYOUT_ergodox_pretty": {
+ "layout": [
+ { "label": "L00", "matrix": [5, 0], "w": 1.5, "x": 0, "y": 0.375 },
+ { "label": "L01", "matrix": [5, 1], "w": 1, "x": 1.5, "y": 0.375 },
+ { "label": "L02", "matrix": [5, 2], "w": 1, "x": 2.5, "y": 0.125 },
+ { "label": "L03", "matrix": [5, 3], "w": 1, "x": 3.5, "y": 0 },
+ { "label": "L04", "matrix": [5, 4], "w": 1, "x": 4.5, "y": 0.125 },
+ { "label": "L05", "matrix": [5, 5], "w": 1, "x": 5.5, "y": 0.25 },
+ { "label": "L06", "matrix": [5, 6], "w": 1, "x": 6.5, "y": 0.25 },
+
+ { "label": "R06", "matrix": [11, 6], "w": 1, "x": 9.5, "y": 0.25 },
+ { "label": "R05", "matrix": [11, 5], "w": 1, "x": 10.5, "y": 0.25 },
+ { "label": "R04", "matrix": [11, 4], "w": 1, "x": 11.5, "y": 0.125 },
+ { "label": "R03", "matrix": [11, 3], "w": 1, "x": 12.5, "y": 0 },
+ { "label": "R02", "matrix": [11, 2], "w": 1, "x": 13.5, "y": 0.125 },
+ { "label": "R01", "matrix": [11, 1], "w": 1, "x": 14.5, "y": 0.375 },
+ { "label": "R00", "matrix": [11, 0], "w": 1.5, "x": 15.5, "y": 0.375 },
+
+ { "label": "L10", "matrix": [4, 0], "w": 1.5, "x": 0, "y": 1.375 },
+ { "label": "L11", "matrix": [4, 1], "w": 1, "x": 1.5, "y": 1.375 },
+ { "label": "L12", "matrix": [4, 2], "w": 1, "x": 2.5, "y": 1.125 },
+ { "label": "L13", "matrix": [4, 3], "w": 1, "x": 3.5, "y": 1 },
+ { "label": "L14", "matrix": [4, 4], "w": 1, "x": 4.5, "y": 1.125 },
+ { "label": "L15", "matrix": [4, 5], "w": 1, "x": 5.5, "y": 1.25 },
+ { "label": "L16", "matrix": [4, 6], "w": 1, "x": 6.5, "y": 1.25, "h": 1.5 },
+
+ { "label": "R16", "matrix": [10, 6], "w": 1, "x": 9.5, "y": 1.25, "h": 1.5 },
+ { "label": "R15", "matrix": [10, 5], "w": 1, "x": 10.5, "y": 1.25 },
+ { "label": "R14", "matrix": [10, 4], "w": 1, "x": 11.5, "y": 1.125 },
+ { "label": "R13", "matrix": [10, 3], "w": 1, "x": 12.5, "y": 1 },
+ { "label": "R12", "matrix": [10, 2], "w": 1, "x": 13.5, "y": 1.125 },
+ { "label": "R11", "matrix": [10, 1], "w": 1, "x": 14.5, "y": 1.375 },
+ { "label": "R10", "matrix": [10, 0], "w": 1.5, "x": 15.5, "y": 1.375 },
+
+ { "label": "L20", "matrix": [3, 0], "w": 1.5, "x": 0, "y": 2.375 },
+ { "label": "L21", "matrix": [3, 1], "w": 1, "x": 1.5, "y": 2.375 },
+ { "label": "L22", "matrix": [3, 2], "w": 1, "x": 2.5, "y": 2.125 },
+ { "label": "L23", "matrix": [3, 3], "w": 1, "x": 3.5, "y": 2 },
+ { "label": "L24", "matrix": [3, 4], "w": 1, "x": 4.5, "y": 2.125 },
+ { "label": "L25", "matrix": [3, 5], "w": 1, "x": 5.5, "y": 2.25 },
+
+ { "label": "R25", "matrix": [9, 5], "w": 1, "x": 10.5, "y": 2.25 },
+ { "label": "R24", "matrix": [9, 4], "w": 1, "x": 11.5, "y": 2.125 },
+ { "label": "R23", "matrix": [9, 3], "w": 1, "x": 12.5, "y": 2 },
+ { "label": "R22", "matrix": [9, 2], "w": 1, "x": 13.5, "y": 2.125 },
+ { "label": "R21", "matrix": [9, 1], "w": 1, "x": 14.5, "y": 2.375 },
+ { "label": "R20", "matrix": [9, 0], "w": 1.5, "x": 15.5, "y": 2.375 },
+
+ { "label": "L30", "matrix": [2, 0], "w": 1.5, "x": 0, "y": 3.375 },
+ { "label": "L31", "matrix": [2, 1], "w": 1, "x": 1.5, "y": 3.375 },
+ { "label": "L32", "matrix": [2, 2], "w": 1, "x": 2.5, "y": 3.125 },
+ { "label": "L33", "matrix": [2, 3], "w": 1, "x": 3.5, "y": 3 },
+ { "label": "L34", "matrix": [2, 4], "w": 1, "x": 4.5, "y": 3.125 },
+ { "label": "L35", "matrix": [2, 5], "w": 1, "x": 5.5, "y": 3.25 },
+ { "label": "L36", "matrix": [2, 6], "w": 1, "x": 6.5, "y": 2.75, "h": 1.5 },
+
+ { "label": "R36", "matrix": [8, 6], "w": 1, "x": 9.5, "y": 2.75, "h": 1.5 },
+ { "label": "R35", "matrix": [8, 5], "w": 1, "x": 10.5, "y": 3.25 },
+ { "label": "R34", "matrix": [8, 4], "w": 1, "x": 11.5, "y": 3.125 },
+ { "label": "R33", "matrix": [8, 3], "w": 1, "x": 12.5, "y": 3 },
+ { "label": "R32", "matrix": [8, 2], "w": 1, "x": 13.5, "y": 3.125 },
+ { "label": "R31", "matrix": [8, 1], "w": 1, "x": 14.5, "y": 3.375 },
+ { "label": "R30", "matrix": [8, 0], "w": 1.5, "x": 15.5, "y": 3.375 },
+
+ { "label": "L40", "matrix": [1, 0], "w": 1, "x": 0.5, "y": 4.375 },
+ { "label": "L41", "matrix": [1, 1], "w": 1, "x": 1.5, "y": 4.375 },
+ { "label": "L42", "matrix": [1, 2], "w": 1, "x": 2.5, "y": 4.125 },
+ { "label": "L43", "matrix": [1, 3], "w": 1, "x": 3.5, "y": 4 },
+ { "label": "L44", "matrix": [1, 4], "w": 1, "x": 4.5, "y": 4.125 },
+
+ { "label": "R44", "matrix": [7, 4], "w": 1, "x": 11.5, "y": 4.125 },
+ { "label": "R43", "matrix": [7, 3], "w": 1, "x": 12.5, "y": 4 },
+ { "label": "R42", "matrix": [7, 2], "w": 1, "x": 13.5, "y": 4.125 },
+ { "label": "R41", "matrix": [7, 1], "w": 1, "x": 14.5, "y": 4.375 },
+ { "label": "R40", "matrix": [7, 0], "w": 1, "x": 15.5, "y": 4.375 },
+
+ { "label": "L55", "matrix": [0, 5], "w": 1, "x": 6, "y": 5 },
+ { "label": "L56", "matrix": [0, 6], "w": 1, "x": 7, "y": 5 },
+
+ { "label": "R56", "matrix": [6, 6], "w": 1, "x": 9, "y": 5 },
+ { "label": "R55", "matrix": [6, 5], "w": 1, "x": 10, "y": 5 },
+
+ { "label": "L54", "matrix": [0, 4], "w": 1, "x": 7, "y": 6 },
+
+ { "label": "R54", "matrix": [6, 4], "w": 1, "x": 9, "y": 6 },
+
+ { "label": "L53", "matrix": [0, 3], "w": 1, "x": 5, "y": 6,"h": 2 },
+ { "label": "L52", "matrix": [0, 2], "w": 1, "x": 6, "y": 6,"h": 2 },
+ { "label": "L51", "matrix": [0, 1], "w": 1, "x": 7, "y": 7 },
+
+ { "label": "R51", "matrix": [6, 1], "w": 1, "x": 9, "y": 7 },
+ { "label": "R52", "matrix": [6, 2], "w": 1, "x": 11, "y": 6, "h": 2 },
+ { "label": "R53", "matrix": [6, 3], "w": 1, "x": 10, "y": 6, "h": 2 }
+ ]
+ }
+ }
+}
diff --git a/keyboards/hotdox76v2/keymaps/default/keymap.c b/keyboards/hotdox76v2/keymaps/default/keymap.c
new file mode 100644
index 0000000000..f6978ac10b
--- /dev/null
+++ b/keyboards/hotdox76v2/keymaps/default/keymap.c
@@ -0,0 +1,35 @@
+// Copyright 2021 JasonRen(biu)
+// Copyright 2022 Drashna Jael're (@Drashna Jael're)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /*
+ * ┌──────┬───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┬───┬───┬───┬──────┐
+ * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ = │ │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │
+ * ├──────┼───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┼──────┤
+ * │ Tab │ Q │ W │ E │ R │ T │ = │ │ Y │ Y │ U │ I │ O │ P │ \ │
+ * ├──────┼───┼───┼───┼───┼───┤ │ │ ├───┼───┼───┼───┼───┼──────┤
+ * │Escape│ A │ S │ D │ F │ G ├───┤ ├───┤ H │ J │ K │ L │ ; │ ' │
+ * ├──────┼───┼───┼───┼───┼───┤ │ │ ├───┼───┼───┼───┼───┼──────┤
+ * │Shift │ Z │ X │ C │ V │ B │ B │ │ N │ N │ M │ , │ . │ / │ Shift│
+ * └──┬───┼───┼───┼───┼───┼───┴───┘ ┌───┬───┐ ┌───┬───┐ └───┴───┼───┼───┼───┼───┼───┬──┘
+ * │Ctl│F4 │F5 │GUI│Alt│ │ C │ V │ │Alt│ A │ │ ← │ ↓ │ ↑ │ → │GUI│
+ * └───┴───┴───┴───┴───┘ ┌───┼───┼───┤ ├───┼───┼───┐ └───┴───┴───┴───┴───┘
+ * │ │ │PgU│ │PgD│ │ │
+ * │Bsp│Bsp├───┤ ├───┤Ent│ │
+ * │ │ │Del│ │Ctl│ │ │
+ * └───┴───┴───┘ └───┴───┴───┘
+ */
+ [0] = LAYOUT_ergodox_pretty(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_EQL, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_EQL, KC_Y, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
+ KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LCTL, KC_F4, KC_F5, KC_LGUI, KC_LALT, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_RGUI,
+ KC_C, KC_V, KC_RALT, KC_A,
+ KC_PGUP, KC_PGDN,
+ KC_BSPC, KC_BSPC, KC_DEL, KC_RCTL, KC_ENT, KC_SPC
+ )
+};
diff --git a/keyboards/hotdox76v2/keymaps/ifohancroft/README.md b/keyboards/hotdox76v2/keymaps/ifohancroft/README.md
new file mode 100644
index 0000000000..d51eda066f
--- /dev/null
+++ b/keyboards/hotdox76v2/keymaps/ifohancroft/README.md
@@ -0,0 +1,20 @@
+![IFo Hancroft HotDox76v2 Layout Image](https://i.imgur.com/AqUHXYXh.png)
+
+# IFo Hancroft's HotDox76v2 Layout
+
+- Layer 0: A QWERTY Layer.
+- Layer 1: A Function Layer.
+- Layer 2: Empty Layer.
+- Layer 3: Empty Layer.
+
+This keymap also does the following:
+
+- Forces NKRO on
+- Enables:
+ - The Command Feature
+ - VIA
+ - The Swap Hands feature
+- Disables:
+ - Mouse Key
+ - Extra Key
+ - RGB Matrix
diff --git a/keyboards/hotdox76v2/keymaps/ifohancroft/config.h b/keyboards/hotdox76v2/keymaps/ifohancroft/config.h
new file mode 100644
index 0000000000..1cd6c6fc2d
--- /dev/null
+++ b/keyboards/hotdox76v2/keymaps/ifohancroft/config.h
@@ -0,0 +1,23 @@
+/* Copyright 2022 IFo Hancroft
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#pragma once
+
+// place overrides here
+#define FORCE_NKRO
+#ifdef TAPPING_TOGGLE
+# undef TAPPING_TOGGLE
+#endif
+#define TAPPING_TOGGLE 3
diff --git a/keyboards/hotdox76v2/keymaps/ifohancroft/keymap.c b/keyboards/hotdox76v2/keymaps/ifohancroft/keymap.c
new file mode 100644
index 0000000000..ed37ea1a4a
--- /dev/null
+++ b/keyboards/hotdox76v2/keymaps/ifohancroft/keymap.c
@@ -0,0 +1,145 @@
+/* Copyright 2022 IFo Hancroft
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ /* Default Layer
+ * *---------------------------------------------------------------------* *---------------------------------------------------------------------*
+ * | ` | 1 | 2 | 3 | 4 | 5 | - | | = | 6 | 7 | 8 | 9 | 0 | Del |
+ * |---------+---------+---------+---------+----