Browse Source

[Keyboard] Add xdboards/recon keyboard (#24135)

Co-authored-by: Drashna Jaelre <drashna@live.com>
Daniel Weeks 1 year ago
parent
commit
3b874ee434

+ 19 - 0
keyboards/xdboards/recon/config.h

@@ -0,0 +1,19 @@
+/* Copyright 2024 XD Boards <copyright@xdboards.xyz>
+*
+* 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
+
+#define OLED_DISPLAY_128X64

+ 201 - 0
keyboards/xdboards/recon/keyboard.json

@@ -0,0 +1,201 @@
+{
+    "manufacturer": "XD Boards",
+    "keyboard_name": "xdboards/recon",
+    "maintainer": "Xanimos",
+    "development_board": "promicro",
+    "diode_direction": "COL2ROW",
+    "features": {
+        "bootmagic": true,
+        "extrakey": true,
+        "nkro": true,
+        "rgb_matrix": true,
+        "oled": true
+    },
+    "matrix_pins": {
+        "cols": ["D4", "C6", "D7", "E6", "B4", "B5"],
+        "rows": ["F4", "F5", "F6", "F7", "B1"]
+    },
+    "url": "https://xdboards.xyz",
+    "tags": ["columnar", "split", "thumb cluster", "rgb", "encoder"],
+    "usb": {
+        "device_version": "1.0.0",
+        "pid": "0x02F7",
+        "vid": "0xFEED"
+    },
+    "encoder": {
+        "rotary": [
+            { "pin_a": "B6","pin_b": "B2" }
+        ]
+    },
+    "split": {
+        "enabled": true,
+        "serial": {
+            "pin": "D3"
+        },
+        "handedness": {
+            "pin": "D2"
+        },
+        "transport": {
+            "sync": {
+                "layer_state": true,
+                "oled": true,
+                "matrix_state": true,
+                "modifiers": true
+            }
+        }
+    },
+    "layouts": {
+        "LAYOUT": {
+            "layout": [
+                {"label": "L01", "matrix": [0, 0], "x": 0, "y": 0.75},
+                {"label": "L02", "matrix": [0, 1], "x": 1, "y": 0.75},
+                {"label": "L03", "matrix": [0, 2], "x": 2, "y": 0.25},
+                {"label": "L04", "matrix": [0, 3], "x": 3, "y": 0},
+                {"label": "L05", "matrix": [0, 4], "x": 4, "y": 0.25},
+                {"label": "L06", "matrix": [0, 5], "x": 5, "y": 0.5},
+
+                {"label": "R06", "matrix": [5, 5], "x": 10.5, "y": 0.5},
+                {"label": "R05", "matrix": [5, 4], "x": 11.5, "y": 0.25},
+                {"label": "R04", "matrix": [5, 3], "x": 12.5, "y": 0},
+                {"label": "R03", "matrix": [5, 2], "x": 13.5, "y": 0.25},
+                {"label": "R02", "matrix": [5, 1], "x": 14.5, "y": 0.75},
+                {"label": "R01", "matrix": [5, 0], "x": 15.5, "y": 0.75},
+
+                {"label": "L07", "matrix": [1, 0], "x": 0, "y": 1.75},
+                {"label": "L08", "matrix": [1, 1], "x": 1, "y": 1.75},
+                {"label": "L09", "matrix": [1, 2], "x": 2, "y": 1.25},
+                {"label": "L10", "matrix": [1, 3], "x": 3, "y": 1},
+                {"label": "L11", "matrix": [1, 4], "x": 4, "y": 1.25},
+                {"label": "L12", "matrix": [1, 5], "x": 5, "y": 1.5},
+
+                {"label": "R12", "matrix": [6, 5], "x": 10.5, "y": 1.5},
+                {"label": "R11", "matrix": [6, 4], "x": 11.5, "y": 1.25},
+                {"label": "R10", "matrix": [6, 3], "x": 12.5, "y": 1},
+                {"label": "R09", "matrix": [6, 2], "x": 13.5, "y": 1.25},
+                {"label": "R08", "matrix": [6, 1], "x": 14.5, "y": 1.75},
+                {"label": "R07", "matrix": [6, 0], "x": 15.5, "y": 1.75},
+
+                {"label": "L13", "matrix": [2, 0], "x": 0, "y": 2.75},
+                {"label": "L14", "matrix": [2, 1], "x": 1, "y": 2.75},
+                {"label": "L15", "matrix": [2, 2], "x": 2, "y": 2.25},
+                {"label": "L16", "matrix": [2, 3], "x": 3, "y": 2},
+                {"label": "L17", "matrix": [2, 4], "x": 4, "y": 2.25},
+                {"label": "L18", "matrix": [2, 5], "x": 5, "y": 2.5},
+
+                {"label": "R18", "matrix": [7, 5], "x": 10.5, "y": 2.5},
+                {"label": "R17", "matrix": [7, 4], "x": 11.5, "y": 2.25},
+                {"label": "R16", "matrix": [7, 3], "x": 12.5, "y": 2},
+                {"label": "R15", "matrix": [7, 2], "x": 13.5, "y": 2.25},
+                {"label": "R14", "matrix": [7, 1], "x": 14.5, "y": 2.75},
+                {"label": "R13", "matrix": [7, 0], "x": 15.5, "y": 2.75},
+
+                {"label": "L27", "encoder": 0, "matrix": [3, 0], "x": 6, "y": 2.7},
+
+                {"label": "R27", "encoder": 1, "matrix": [8, 0], "x": 9.5, "y": 2.7},
+
+                {"label": "L19", "matrix": [3, 2], "x": 4.25, "y": 3.5},
+                {"label": "L20", "matrix": [3, 3], "x": 5.25, "y": 3.75},
+                {"label": "L21", "matrix": [3, 4], "x": 6.25, "y": 4},
+                {"label": "L22", "matrix": [3, 5], "x": 7.25, "y": 4.25},
+
+                {"label": "R22", "matrix": [8, 5], "x": 8, "y": 4.25},
+                {"label": "R21", "matrix": [8, 4], "x": 9, "y": 4},
+                {"label": "R20", "matrix": [8, 3], "x": 10, "y": 3.75},
+                {"label": "R19", "matrix": [8, 2], "x": 11, "y": 3.5},
+
+                {"label": "L23", "matrix": [4, 2], "x": 4.25, "y": 4.5},
+                {"label": "L24", "matrix": [4, 3], "x": 5.25, "y": 4.75},
+                {"label": "L25", "matrix": [4, 4], "x": 6.25, "y": 5},
+                {"label": "L26", "matrix": [4, 5], "x": 7.25, "y": 5.25},
+
+                {"label": "R26", "matrix": [9, 5], "x": 8, "y": 5.25},
+                {"label": "R25", "matrix": [9, 4], "x": 9, "y": 5},
+                {"label": "R24", "matrix": [9, 3], "x": 10, "y": 4.75},
+                {"label": "R23", "matrix": [9, 2], "x": 11, "y": 4.5}
+
+            ]
+        }
+    },
+    "rgb_matrix": {
+        "driver": "ws2812",
+        "layout": [
+
+            {"flags": 4, "matrix": [0, 0], "x": 13, "y": 16},
+            {"flags": 4, "matrix": [0, 1], "x": 21, "y": 16},
+            {"flags": 4, "matrix": [0, 2], "x": 30, "y": 11},
+            {"flags": 4, "matrix": [0, 3], "x": 38, "y": 6},
+            {"flags": 4, "matrix": [0, 4], "x": 46, "y": 11},
+            {"flags": 4, "matrix": [0, 5], "x": 55, "y": 12},
+            {"flags": 4, "matrix": [1, 0], "x": 13, "y": 24},
+            {"flags": 4, "matrix": [1, 1], "x": 21, "y": 24},
+            {"flags": 4, "matrix": [1, 2], "x": 30, "y": 19},
+            {"flags": 4, "matrix": [1, 3], "x": 38, "y": 14},
+            {"flags": 4, "matrix": [1, 4], "x": 46, "y": 19},
+            {"flags": 4, "matrix": [1, 5], "x": 55, "y": 20},
+            {"flags": 4, "matrix": [2, 0], "x": 13, "y": 32},
+            {"flags": 4, "matrix": [2, 1], "x": 21, "y": 32},
+            {"flags": 4, "matrix": [2, 2], "x": 30, "y": 26},
+            {"flags": 4, "matrix": [2, 3], "x": 38, "y": 22},
+            {"flags": 4, "matrix": [2, 4], "x": 46, "y": 27},
+            {"flags": 4, "matrix": [2, 5], "x": 55, "y": 28},
+
+            {"flags": 4, "matrix": [3, 2], "x": 42, "y": 35},
+            {"flags": 4, "matrix": [3, 3], "x": 54, "y": 37},
+            {"flags": 4, "matrix": [3, 4], "x": 65, "y": 40},
+            {"flags": 4, "matrix": [3, 5], "x": 76, "y": 45},
+            {"flags": 4, "matrix": [4, 2], "x": 42, "y": 44},
+            {"flags": 4, "matrix": [4, 3], "x": 52, "y": 45},
+            {"flags": 4, "matrix": [4, 4], "x": 62, "y": 47},
+            {"flags": 4, "matrix": [4, 5], "x": 71, "y": 52},
+
+            {"flags": 2, "x": 68, "y": 36},
+            {"flags": 2, "x": 57, "y": 8},
+            {"flags": 2, "x": 31, "y": 6},
+            {"flags": 2, "x": 14, "y": 12},
+            {"flags": 2, "x": 28, "y": 37},
+
+            {"flags": 4, "matrix": [5, 0], "x": 175, "y": 16},
+            {"flags": 4, "matrix": [5, 1], "x": 166, "y": 16},
+            {"flags": 4, "matrix": [5, 2], "x": 158, "y": 11},
+            {"flags": 4, "matrix": [5, 3], "x": 149, "y": 6},
+            {"flags": 4, "matrix": [5, 4], "x": 141, "y": 11},
+            {"flags": 4, "matrix": [5, 5], "x": 133, "y": 12},
+            {"flags": 4, "matrix": [6, 0], "x": 175, "y": 24},
+            {"flags": 4, "matrix": [6, 1], "x": 166, "y": 24},
+            {"flags": 4, "matrix": [6, 2], "x": 158, "y": 19},
+            {"flags": 4, "matrix": [6, 3], "x": 149, "y": 14},
+            {"flags": 4, "matrix": [6, 4], "x": 141, "y": 19},
+            {"flags": 4, "matrix": [6, 5], "x": 133, "y": 20},
+            {"flags": 4, "matrix": [7, 0], "x": 175, "y": 32},
+            {"flags": 4, "matrix": [7, 1], "x": 166, "y": 32},
+            {"flags": 4, "matrix": [7, 2], "x": 158, "y": 26},
+            {"flags": 4, "matrix": [7, 3], "x": 149, "y": 22},
+            {"flags": 4, "matrix": [7, 4], "x": 141, "y": 27},
+            {"flags": 4, "matrix": [7, 5], "x": 133, "y": 28},
+
+            {"flags": 4, "matrix": [8, 2], "x": 146, "y": 35},
+            {"flags": 4, "matrix": [8, 3], "x": 134, "y": 37},
+            {"flags": 4, "matrix": [8, 4], "x": 123, "y": 40},
+            {"flags": 4, "matrix": [8, 5], "x": 113, "y": 45},
+            {"flags": 4, "matrix": [9, 2], "x": 146, "y": 44},
+            {"flags": 4, "matrix": [9, 3], "x": 136, "y": 45},
+            {"flags": 4, "matrix": [9, 4], "x": 126, "y": 47},
+            {"flags": 4, "matrix": [9, 5], "x": 117, "y": 52},
+
+            {"flags": 2, "x": 121, "y": 36},
+            {"flags": 2, "x": 130, "y": 8},
+            {"flags": 2, "x": 156, "y": 6},
+            {"flags": 2, "x": 172, "y": 12},
+            {"flags": 2, "x": 158, "y": 37}
+        ],
+        "split_count": [31, 31],
+        "animations": {
+            "alphas_mods": true,
+            "solid_reactive": true
+        },
+        "default": {
+            "animation": "solid_reactive",
+            "hue": 126
+        }
+    }
+}

+ 155 - 0
keyboards/xdboards/recon/keymaps/default/keymap.c

@@ -0,0 +1,155 @@
+/* Copyright 2024 XD Boards <copyright@xdboards.xyz>
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 2 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include QMK_KEYBOARD_H
+
+enum layers {
+    _QWERTY,
+    _SYMBOLS,
+    _NUMBERS,
+    _FUNCTION,
+    _RGB
+};
+
+// clang-format off
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+    /*
+    * ┌─────┬─────┬─────┬─────┬─────┬─────┐                                      ┌─────┬─────┬─────┬─────┬─────┬─────┐
+    * │ ESC │  Q  │  W  │  E  │  R  │  T  │                                      │  Y  │  U  │  I  │  O  │  P  │ Bsp │
+    * ├─────┼─────┼─────┼─────┼─────┼─────┤                                      ├─────┼─────┼─────┼─────┼─────┼─────┤
+    * │ Tab │  A  │  S  │  D  │  F  │  G  │                                      │  H  │  J  │  K  │  L  │  ;  │ CTL │
+    * ├─────┼─────┼─────┼─────┼─────┼─────┤                                      ├─────┼─────┼─────┼─────┼─────┼─────┤
+    * │Shift│  Z  │  X  │  C  │  V  │  B  │                                      │  N  │  M  │  ,  │  .  │  /  │Shift│
+    * └─────┴─────┴─────┴─────┴─────┴─────┘    ┌─────┐                 ┌─────┐   └─────┴─────┴─────┴─────┴─────┴─────┘
+    *               ┌─────┐                    │Mute │                 │P Scr│                   ┌─────┐
+    *               │ ALT ├─────┐              └─────┘                 └─────┘             ┌─────┤ Alt │
+    *               ├─────┤  (  ├─────┐                                              ┌─────┤  )  ├─────┤
+    *               │ GUI ├─────┤  {  ├─────┐                                  ┌─────┤  }  ├─────┤ App │
+    *               └─────┤Space├─────┤  [  │                                  │  ]  ├─────┤ Ent ├─────┘
+    *                     └─────┤ Fnc ├─────┤                                  ├─────┤ Sym ├─────┘
+    *                           └─────┤Qwert│                                  │ Num ├─────┘
+    *                                 └─────┘                                  └─────┘
+    */
+    [_QWERTY] = LAYOUT(
+        KC_ESC,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,                               KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC,
+        KC_TAB,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,                               KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_RCTL,
+        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_MUTE,                   KC_PSCR,
+                          KC_LALT, KC_LPRN, KC_LCBR,  KC_LBRC,                        KC_RBRC,  KC_RCBR,  KC_RPRN,  KC_RALT,
+                          KC_LGUI, KC_SPC,TO(_FUNCTION),TO(_QWERTY),                  TO(_NUMBERS),TO(_SYMBOLS),KC_ENT, KC_APP
+    ),
+    /*
+     * ┌─────┬─────┬─────┬─────┬─────┬─────┐                                      ┌─────┬─────┬─────┬─────┬─────┬─────┐
+     * │  `  │  !  │  @  │  #  │  $  │  %  │                                      │  +  │  "  │  '  │  |  │  \  │ Bsp │
+     * ├─────┼─────┼─────┼─────┼─────┼─────┤                                      ├─────┼─────┼─────┼─────┼─────┼─────┤
+     * │ Tab │  ^  │  &  │  *  │  (  │  )  │                                      │  =  │  <  │  >  │  :  │  ;  │ Ctl │
+     * ├─────┼─────┼─────┼─────┼─────┼─────┤                                      ├─────┼─────┼─────┼─────┼─────┼─────┤
+     * │Shift│  _  │  [  │  ]  │  {  │  }  │                                      │  -  │  ~  │  ,  │  .  │  ?  │Shift│
+     * └─────┴─────┴─────┴─────┴─────┴─────┘    ┌─────┐                 ┌─────┐   └─────┴─────┴─────┴─────┴─────┴─────┘
+     *               ┌─────┐                    │Mute │                 │P Scr│                   ┌─────┐
+     *               │ ALT ├─────┐              └─────┘                 └─────┘             ┌─────┤ Alt │
+     *               ├─────┤  (  ├─────┐                                              ┌─────┤  )  ├─────┤
+     *               │ GUI ├─────┤  {  ├─────┐                                  ┌─────┤  }  ├─────┤ App │
+     *               └─────┤Space├─────┤  [  │                                  │  ]  ├─────┤ Ent ├─────┘
+     *                     └─────┤ Fnc ├─────┤                                  ├─────┤ Sym ├─────┘
+     *                           └─────┤Qwert│                                  │ Num ├─────┘
+     *                                 └─────┘                                  └─────┘
+     */
+    [_SYMBOLS] = LAYOUT(
+       KC_GRAVE, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC,                            KC_PLUS, KC_DQUO, KC_QUOTE,KC_PIPE, KC_BSLS, KC_BSPC,
+       KC_TAB,   KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN,                            KC_EQUAL,KC_LT,   KC_GT,   KC_COLN, KC_SCLN, KC_RCTL,
+       KC_LSFT,  KC_UNDS, KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR,                            KC_MINUS,KC_TILD, KC_COMM, KC_DOT,  KC_QUES, KC_NUM,
+                                                       KC_MUTE,                   KC_PSCR,
+                         KC_LALT, KC_LPRN, KC_LCBR, KC_LBRC,                          KC_RBRC,  KC_RCBR,  KC_RPRN,  KC_RALT,
+                         KC_LGUI, KC_SPC,TO(_FUNCTION),TO(_QWERTY),                   TO(_NUMBERS),TO(_SYMBOLS),KC_ENT, KC_APP
+    ),
+    /*
+     * ┌─────┬─────┬─────┬─────┬─────┬─────┐                                      ┌─────┬─────┬─────┬─────┬─────┬─────┐
+     * │ Esc │  1  │  2  │  3  │  4  │  5  │                                      │  +  │  7  │  8  │  9  │  *  │ Bsp │
+     * ├─────┼─────┼─────┼─────┼─────┼─────┤                                      ├─────┼─────┼─────┼─────┼─────┼─────┤
+     * │ Ctl │  6  │  7  │  8  │  9  │  0  │                                      │  =  │  4  │  5  │  6  │  \  │  :  │
+     * ├─────┼─────┼─────┼─────┼─────┼─────┤                                      ├─────┼─────┼─────┼─────┼─────┼─────┤
+     * │Shift│     │     │     │     │     │                                      │  -  │  1  │  2  │  3  │  /  │Nm Lk│
+     * └─────┴─────┴─────┴─────┴─────┴─────┘    ┌─────┐                 ┌─────┐   └─────┴─────┴─────┴─────┴─────┴─────┘
+     *               ┌─────┐                    │Mute │                 │P Scr│                   ┌─────┐
+     *               │ ALT ├─────┐              └─────┘                 └─────┘             ┌─────┤  0  │
+     *               ├─────┤     ├─────┐                                              ┌─────┤  .  ├─────┤
+     *               │ GUI ├─────┤     ├─────┐                                  ┌─────┤  ,  ├─────┤ App │
+     *               └─────┤Space├─────┤     │                                  │     ├─────┤ Ent ├─────┘
+     *                     └─────┤ Fnc ├─────┤                                  ├─────┤ Sym ├─────┘
+     *                           └─────┤Qwert│                                  │ Num ├─────┘
+     *                                 └─────┘                                  └─────┘
+     */
+    [_NUMBERS] = LAYOUT(
+       KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,                               KC_PPLS,  KC_P7,   KC_P8,   KC_P9,   KC_PAST, KC_BSPC,
+       KC_LCTL, KC_6,    KC_7,    KC_8,    KC_9,    KC_0,                               KC_PEQL,  KC_P4,   KC_P5,   KC_P6,   KC_BSLS, KC_COLN,
+       KC_LSFT, KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,                              KC_PMNS,  KC_P1,   KC_P2,   KC_P3,   KC_PSLS, KC_NUM,
+                                                       KC_MUTE,                   KC_PSCR,
+                         KC_LALT, KC_NO,   KC_NO,   KC_NO,                           KC_NO,  KC_PCMM, KC_PDOT,  KC_P0,
+                         KC_LGUI, KC_SPC,TO(_FUNCTION),TO(_QWERTY),                   TO(_NUMBERS),TO(_SYMBOLS),KC_ENT, KC_APP
+    ),
+    /*
+     * ┌─────┬─────┬─────┬─────┬─────┬─────┐                                      ┌─────┬─────┬─────┬─────┬─────┬─────┐
+     * │  F1 │  F2 │  F3 │  F4 │  F5 │  F6 │                                      │  F7 │  F8 │  F9 │ F10 │ F11 │ F12 │
+     * ├─────┼─────┼─────┼─────┼─────┼─────┤                                      ├─────┼─────┼─────┼─────┼─────┼─────┤
+     * │Caps │     │     │  ↑  │     │     │                                      │ Ins │ Home│Pg Up│Pause│     │     │
+     * ├─────┼─────┼─────┼─────┼─────┼─────┤                                      ├─────┼─────┼─────┼─────┼─────┼─────┤
+     * │Shift│     │  ←  │  ↓  │  →  │     │                                      │ Del │ End │Pg Dn│     │     │     │
+     * └─────┴─────┴─────┴─────┴─────┴─────┘    ┌─────┐                 ┌─────┐   └─────┴─────┴─────┴─────┴─────┴─────┘
+     *               ┌─────┐                    │Mute │                 │P Scr│                   ┌─────┐
+     *               │ ALT ├─────┐              └─────┘                 └─────┘             ┌─────┤  0  │
+     *               ├─────┤     ├─────┐                                              ┌─────┤  .  ├─────┤
+     *               │ GUI ├─────┤     ├─────┐                                  ┌─────┤     ├─────┤ App │
+     *               └─────┤Space├─────┤     │                                  │     ├─────┤ Ent ├─────┘
+     *                     └─────┤ RGB ├─────┤                                  ├─────┤ Sym ├─────┘
+     *                           └─────┤Qwert│                                  │ Num ├─────┘
+     *                                 └─────┘                                  └─────┘
+     */
+    [_FUNCTION] = LAYOUT(
+       KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,                              KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,
+       KC_CAPS,   KC_NO,   KC_NO,   KC_UP,   KC_NO,   KC_NO,                              KC_INS,  KC_HOME, KC_PGUP, KC_PAUS, KC_NO,   KC_NO,
+       KC_LSFT, KC_NO,   KC_LEFT, KC_DOWN, KC_RIGHT,KC_NO,                              KC_DEL,  KC_END,  KC_PGDN, KC_NO,   KC_NO,   KC_RSFT,
+                                                       KC_MUTE,                   KC_PSCR,
+                         KC_LALT, KC_NO,   KC_NO,   KC_NO,                           KC_NO,  KC_NO,  KC_DOT,  KC_0,
+                         KC_LGUI, KC_SPC,MO(_RGB),TO(_QWERTY),                   TO(_NUMBERS),TO(_SYMBOLS),KC_ENT, KC_APP
+    ),
+/*
+ * ┌─────┬─────┬─────┬─────┬─────┬─────┐                                      ┌─────┬─────┬─────┬─────┬─────┬─────┐
+ * │     │     │     │     │     │     │                                      │     │     │     │     │     │     │
+ * ├─────┼─────┼─────┼─────┼─────┼─────┤                                      ├─────┼─────┼─────┼─────┼─────┼─────┤
+ * │     │Mode↑│Hue ↑│Sat ↑│Val ↑│Spd ↑│                                      │     │     │     │     │     │     │
+ * ├─────┼─────┼─────┼─────┼─────┼─────┤                                      ├─────┼─────┼─────┼─────┼─────┼─────┤
+ * │OnOff│Mode↓│Hue ↓│Sat ↓│Val ↓│Spd ↓│                                      │     │     │     │     │     │     │
+ * └─────┴─────┴─────┴─────┴─────┴─────┘    ┌─────┐                 ┌─────┐   └─────┴─────┴─────┴─────┴─────┴─────┘
+ *               ┌─────┐                    │     │                 │     │                   ┌─────┐
+ *               │     ├─────┐              └─────┘                 └─────┘             ┌─────┤     │
+ *               ├─────┤     ├─────┐                                              ┌─────┤     ├─────┤
+ *               │     ├─────┤     ├─────┐                                  ┌─────┤     ├─────┤     │
+ *               └─────┤     ├─────┤     │                                  │     ├─────┤     ├─────┘
+ *                     └─────┤     ├─────┤                                  ├─────┤     ├─────┘
+ *                           └─────┤     │                                  │     ├─────┘
+ *                                 └─────┘                                  └─────┘
+ */
+    [_RGB] = LAYOUT(
+       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,   RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI,                            KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,
+       RGB_TOG, RGB_RMOD,RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD,                            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
+    )
+};
+// clang-format on

+ 24 - 0
keyboards/xdboards/recon/post_config.h

@@ -0,0 +1,24 @@
+/* Copyright 2024 XD Boards <copyright@xdboards.xyz>
+*
+* 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
+
+#ifdef USE_SEA_PICRO_RGB_PIN
+    // Dedicated 5V RGB signal pin on sea-picro
+#   define WS2812_DI_PIN 25U
+#else
+#   define WS2812_DI_PIN B3
+#endif

+ 3 - 0
keyboards/xdboards/recon/post_rules.mk

@@ -0,0 +1,3 @@
+ifeq ($(strip $(USE_SEA_PICRO_RGB_PIN)), yes)
+	OPT_DEFS += -DUSE_SEA_PICRO_RGB_PIN
+endif

+ 57 - 0
keyboards/xdboards/recon/readme.md

@@ -0,0 +1,57 @@
+# xdboards/recon
+
+![xdboards/recon](https://imgur.com/a/HcjT4yq)
+
+A split low profile keyboard with hotswap sockets that is built around the Sea-Picro microcontroller for it's dedicated RGB pin.
+
+* Keyboard Maintainer: [Daniel Weeks](https://github.com/Xanimos)
+* Hardware Supported: Recon PCB, Sea-Picro, backwards compatibility with ProMicro pin layout.
+* Hardware Availability: [xdboards.xyz shop](https://www.xdboards.xyz)
+
+Make example for this keyboard (after setting up your build environment):
+
+    make xdboards/recon:default
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+## Bootloader
+
+Enter the bootloader in 2 ways:
+
+* **Physical reset button**: Briefly press the button on the side of the PCB
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
+* **Boot Magic**: Hold down the boot magic key while plugging in the USB cable
+
+## Setup for Sea-Picro microcontrollers
+
+To take advantage of the dedicated 5v RGB pin on the sea-picro you must create your keymap
+and then add a `rules.mk` file and copy and paste the following:
+```
+CONVERT_TO = rp2040_ce
+USE_SEA_PICRO_RGB_PIN = yes
+```
+
+If you do not want to use the dedicated 5v RGB header then follow the Setup for non Sea-Picro microcontrollers.
+
+## Setup for non Sea-Picro microcontrollers
+
+Solder the "Pro-Micro Compatibility" jumper on the bottom of both boards.
+
+In your keymap directory:
+  - add/modify a `rules.mk` file
+    - Remove or set `CONVERT_TO` to desired converter see [QMK Documentation](https://docs.qmk.fm/#/feature_converters)
+    - Remove or set `USE_SEA_PICRO_RGB_PIN` to `no`
+
+
+## Setup for Underglow rgb only
+
+
+Solder the "Per-Key RGB Skip" jumper on the bottom of both boards. Do not install per key RGBs.
+
+In your keymap directory:
+  - add/modify a `config.h` file and insert 
+    ```
+    #define RGB_MATRIX_SPLIT { 5, 5 }
+    #define RGB_MATRIX_LED_COUNT 10
+    ```
+  

+ 118 - 0
keyboards/xdboards/recon/recon.c

@@ -0,0 +1,118 @@
+/* Copyright 2024 XD Boards <copyright@xdboards.xyz>
+*
+* 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 "quantum.h"
+
+#ifdef OLED_ENABLE
+oled_rotation_t oled_init_kb(oled_rotation_t rotation) {
+   return OLED_ROTATION_180;
+}
+
+bool oled_task_kb(void) {
+    if (!oled_task_user()) {
+       return false;
+    }
+    if (is_keyboard_master()) {
+        // Host Keyboard Layer Status
+        oled_write_P(PSTR("Layer: "), false);
+        switch (get_highest_layer(layer_state | default_layer_state)) {
+            case 0:
+                oled_write_P(PSTR("QWERTY\n"), false);
+                break;
+            case 1:
+                oled_write_P(PSTR("Symbols\n"), false);
+                break;
+            case 2:
+                oled_write_P(PSTR("Numbers\n"), false);
+                break;
+            case 3:
+                oled_write_P(PSTR("Function\n"), false);
+                break;
+            case 4:
+                oled_write_P(PSTR("RGB\n"), false);
+                break;
+            default:
+                oled_write_P(PSTR("Undefined\n"), false);
+        }
+        // Host Keyboard LED Status
+        led_t led_usb_state = host_keyboard_led_state();
+        oled_write_P(PSTR("CAPSLCK"), led_usb_state.caps_lock);
+        oled_write_P(PSTR(" "), false);
+        oled_write_P(PSTR("NUMLCK"), led_usb_state.num_lock);
+        oled_write_P(PSTR(" "), false);
+        oled_write_P(PSTR("SCRLCK"), led_usb_state.scroll_lock);
+        oled_write_P(PSTR("\n"), false);
+
+        oled_write_P(PSTR("\n"), false);
+
+        static const char PROGMEM qmk_logo[] = {
+            0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94,
+            0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4,
+            0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0x00
+        };
+
+        oled_write_P(qmk_logo, false);
+
+    } else {
+        // clang-format off
+        static const char PROGMEM recon_logo[] = {
+            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,254,254,254,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+            0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,192,224,240,240,248,252,124,126, 62, 62, 31, 31, 31,  0,  0,  0,255,255,255,  0,  0, 31, 31, 31, 62, 62, 62,124,252,248,248,240,224,192,192,  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,  0,  0,  0,128,224,248,252,255,127, 31, 15,  7,  3,  1,  0,  0,  0,  0,128,192,224,224,240,240,240,115,115,115,240,240,224,224,192,192,128,  0,  0,  0,  0,  1,  3,  7, 15, 63,255,254,252,240,192,  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,
+          192,192,192,192,192,192,192,204,207,207,207,207,193,192,192,192,192,  0,  0,224,248,254,255, 15,  7,  3,  1,  0,192,224,224,224,224,192,  0,  1,  1,  3,  7, 63,255,252,240,  0,  0,192,192,192,192,192,199,207,207,207,207,192,192,192,192,192,192,192,128,  0,254,254,254,254,254,  0,134,254,254,252,124, 48,  0,  0,254,254,254,254,254,252,134,230,222, 62,  0,224,248,252,252,254,  6,  2,  6, 14, 62,126,  0,224,248,252,254,254,  6,  6,254,254,252,248,240,  0,  6,238,254,126,254,254,252,240,224,134,254, 14,  6,  0,
+            3,  3,  3,  3,  3,  3,  3, 51,243,243,243,243,131,  3,  3,  3,  3,  0,  0,  7, 31,127,255,240,224,192,128,  0,  1,  7,  7,  7,  7,  3,  0,128,128,192,224,252,255, 63, 15,  0,  0,  3,  3,  3,  3,  3,227,243,243,243,243,  3,  3,  3,  3,  3,  3,  3,  1, 64,127,127,127,127,127, 97,  3,127,127,127,126,120, 48,  0,127,127,127,127,127, 63, 97,103,119,124, 48, 15, 31, 63,127,127, 96, 64, 96, 96, 48, 24,  0, 15, 31, 63,127,127, 64, 64,127,127, 63, 63, 15,  0, 64,127,127, 96,  1,  7, 15, 63,127,127,127,  0,  0,  0,
+            0,  0,  0,  0,  0,  0,  0,  0,  1,  7, 31, 63,255,254,248,240,224,192,128,  0,  0,  0,  0,  1,  3,  7,  7,  7, 15, 15,207,206,207, 15, 15,  7,  7,  3,  3,  1,  0,  0,  0,  0,128,192,224,248,252,255,127, 63, 15,  7,  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,  0,  0,  0,  1,  3,  7, 15, 15, 31, 63, 62,126,124,124,248,248,248,  0,  0,  0,255,255,255,  0,  0,248,248,248,124,124,124, 62, 63, 31, 15, 15,  7,  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,  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,127,127,127,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+        };
+        // clang-format on
+        oled_write_raw_P(recon_logo, sizeof(recon_logo));
+    }
+    return false;
+}
+#endif
+#ifdef ENCODER_ENABLE
+bool encoder_update_kb(uint8_t index, bool clockwise) {
+    if (!encoder_update_user(index, clockwise)) {
+       return false;
+    }
+
+    if (index == 0) {
+        // Volume control
+        if (clockwise) {
+            tap_code(KC_VOLU);
+        } else {
+            tap_code(KC_VOLD);
+        }
+    } else if (index == 1) {
+       // Page up/Page down
+        if (clockwise) {
+#ifdef MOUSEKEY_ENABLE
+            tap_code(KC_WH_U);
+#else
+            tap_code(KC_PGUP);
+#endif
+        } else {
+#ifdef MOUSEKEY_ENABLE
+            tap_code(KC_WH_D);
+#else
+            tap_code(KC_PGDN);
+#endif
+        }
+    }
+    return true;
+}
+#endif