From 57c35bd8177d975f3a62505e51d531d1f4587215 Mon Sep 17 00:00:00 2001
From: ziptyze <mwcordier@gmail.com>
Date: Thu, 15 Sep 2022 14:16:58 -0400
Subject: [PATCH] [Keyboard] Add pi40 (#18207)

Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
---
 keyboards/1upkeyboards/pi40/config.h          |  99 ++++++
 keyboards/1upkeyboards/pi40/halconf.h         |   7 +
 keyboards/1upkeyboards/pi40/info.json         | 115 +++++++
 .../pi40/keymaps/default/keymap.c             | 124 +++++++
 .../pi40/keymaps/default/rules.mk             |   1 +
 .../1upkeyboards/pi40/keymaps/via/keymap.c    | 268 +++++++++++++++
 .../1upkeyboards/pi40/keymaps/via/rules.mk    |   4 +
 keyboards/1upkeyboards/pi40/lib/glcdfont.c    | 231 +++++++++++++
 keyboards/1upkeyboards/pi40/mcuconf.h         |  10 +
 keyboards/1upkeyboards/pi40/pi40.c            | 312 ++++++++++++++++++
 keyboards/1upkeyboards/pi40/readme.md         |  38 +++
 keyboards/1upkeyboards/pi40/rules.mk          |  26 ++
 12 files changed, 1235 insertions(+)
 create mode 100644 keyboards/1upkeyboards/pi40/config.h
 create mode 100644 keyboards/1upkeyboards/pi40/halconf.h
 create mode 100644 keyboards/1upkeyboards/pi40/info.json
 create mode 100644 keyboards/1upkeyboards/pi40/keymaps/default/keymap.c
 create mode 100644 keyboards/1upkeyboards/pi40/keymaps/default/rules.mk
 create mode 100644 keyboards/1upkeyboards/pi40/keymaps/via/keymap.c
 create mode 100644 keyboards/1upkeyboards/pi40/keymaps/via/rules.mk
 create mode 100644 keyboards/1upkeyboards/pi40/lib/glcdfont.c
 create mode 100644 keyboards/1upkeyboards/pi40/mcuconf.h
 create mode 100644 keyboards/1upkeyboards/pi40/pi40.c
 create mode 100644 keyboards/1upkeyboards/pi40/readme.md
 create mode 100644 keyboards/1upkeyboards/pi40/rules.mk

diff --git a/keyboards/1upkeyboards/pi40/config.h b/keyboards/1upkeyboards/pi40/config.h
new file mode 100644
index 00000000000..5bda238430f
--- /dev/null
+++ b/keyboards/1upkeyboards/pi40/config.h
@@ -0,0 +1,99 @@
+// Copyright 2022 ziptyze (@ziptyze)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "config_common.h"
+
+#define DYNAMIC_KEYMAP_LAYER_COUNT 10
+
+#ifdef OLED_ENABLE
+#    define OLED_DISPLAY_128X32
+#define I2C1_SCL_PIN        GP17
+#define I2C1_SDA_PIN        GP16
+#define I2C_DRIVER I2CD1
+#define OLED_BRIGHTNESS 128
+#define OLED_FONT_H "keyboards/1upkeyboards/pi40/lib/glcdfont.c"
+#endif
+
+/* key matrix size */
+#define MATRIX_ROWS 4
+#define MATRIX_COLS 12
+
+#define DIODE_DIRECTION COL2ROW
+
+#define MATRIX_ROW_PINS { GP21, GP20, GP19, GP18 }
+#define MATRIX_COL_PINS { GP1, GP2, GP3, GP4, GP5, GP6, GP7, GP8, GP9, GP10, GP11, GP12 }
+
+#define ENCODERS_PAD_A { GP14 }
+#define ENCODERS_PAD_B { GP13 }
+
+#define RGB_DI_PIN GP0
+#define DRIVER_LED_TOTAL 47
+#define RGBLED_NUM 47
+#    define RGB_MATRIX_KEYPRESSES // reacts to keypresses
+#    define RGB_MATRIX_FRAMEBUFFER_EFFECTS  
+#    define RGBLIGHT_LIMIT_VAL 150
+#ifdef RGB_MATRIX_ENABLE
+#    define RGB_DISABLE_WHEN_USB_SUSPENDED // turn off effects when suspended
+#    define RGB_MATRIX_MAXIMUM_BRIGHTNESS 150
+// RGB Matrix Animation modes. Explicitly enabled
+// For full list of effects, see:
+// https://docs.qmk.fm/#/feature_rgb_matrix?id=rgb-matrix-effects
+#    define ENABLE_RGB_MATRIX_ALPHAS_MODS
+#    define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN
+#    define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT
+#    define ENABLE_RGB_MATRIX_BREATHING
+#    define ENABLE_RGB_MATRIX_BAND_SAT
+#    define ENABLE_RGB_MATRIX_BAND_VAL
+#    define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT
+#    define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL
+#    define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT
+#    define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL
+#    define ENABLE_RGB_MATRIX_CYCLE_ALL
+#    define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
+#    define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN
+#    define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
+#    define ENABLE_RGB_MATRIX_CYCLE_OUT_IN
+#    define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL
+#    define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL
+#    define ENABLE_RGB_MATRIX_CYCLE_SPIRAL
+#    define ENABLE_RGB_MATRIX_DUAL_BEACON
+#    define ENABLE_RGB_MATRIX_RAINBOW_BEACON
+#    define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS
+#    define ENABLE_RGB_MATRIX_RAINDROPS
+#    define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
+#    define ENABLE_RGB_MATRIX_HUE_BREATHING
+#    define ENABLE_RGB_MATRIX_HUE_PENDULUM
+#    define ENABLE_RGB_MATRIX_HUE_WAVE
+#    define ENABLE_RGB_MATRIX_PIXEL_RAIN
+#    define ENABLE_RGB_MATRIX_PIXEL_FLOW
+#    define ENABLE_RGB_MATRIX_PIXEL_FRACTAL
+// enabled only if RGB_MATRIX_FRAMEBUFFER_EFFECTS is defined
+#    define ENABLE_RGB_MATRIX_TYPING_HEATMAP
+#    define ENABLE_RGB_MATRIX_DIGITAL_RAIN
+// enabled only of RGB_MATRIX_KEYPRESSES or RGB_MATRIX_KEYRELEASES is defined
+#    define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
+#    define ENABLE_RGB_MATRIX_SOLID_REACTIVE
+#    define ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
+#    define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE
+#    define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
+#    define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS
+#    define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
+#    define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS
+#    define ENABLE_RGB_MATRIX_SPLASH
+#    define ENABLE_RGB_MATRIX_MULTISPLASH
+#    define ENABLE_RGB_MATRIX_SOLID_SPLASH
+#    define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH
+#endif
+
+#define DEBOUNCE 5
+
+/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
+#define LOCKING_SUPPORT_ENABLE
+/* Locking resynchronize hack */
+#define LOCKING_RESYNC_ENABLE
+
+/* Bootmagic Lite key configuration */
+#define BOOTMAGIC_LITE_ROW 0
+#define BOOTMAGIC_LITE_COLUMN 0
\ No newline at end of file
diff --git a/keyboards/1upkeyboards/pi40/halconf.h b/keyboards/1upkeyboards/pi40/halconf.h
new file mode 100644
index 00000000000..39fbe3e88c2
--- /dev/null
+++ b/keyboards/1upkeyboards/pi40/halconf.h
@@ -0,0 +1,7 @@
+// Copyright 2022 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#define HAL_USE_I2C TRUE
+
+#include_next <halconf.h>
\ No newline at end of file
diff --git a/keyboards/1upkeyboards/pi40/info.json b/keyboards/1upkeyboards/pi40/info.json
new file mode 100644
index 00000000000..69f95e3be3a
--- /dev/null
+++ b/keyboards/1upkeyboards/pi40/info.json
@@ -0,0 +1,115 @@
+{
+    "keyboard_name": "pi40",
+    "manufacturer": "1upkeyboards",
+    "usb": {
+        "vid": "0x6F75",
+        "pid": "0x5600",
+        "device_version": "0.0.1"
+    },
+    "layouts": {
+        "LAYOUT": {
+            "layout": [
+                { "matrix": [3, 6], "x": 11, "y": 0 },
+                { "matrix": [0, 0], "x": 0, "y": 1 },
+                { "matrix": [0, 1], "x": 1, "y": 1 },
+                { "matrix": [0, 2], "x": 2, "y": 1 },
+                { "matrix": [0, 3], "x": 3, "y": 1 },
+                { "matrix": [0, 4], "x": 4, "y": 1 },
+                { "matrix": [0, 5], "x": 5, "y": 1 },
+                { "matrix": [0, 6], "x": 6, "y": 1 },
+                { "matrix": [0, 7], "x": 7, "y": 1 },
+                { "matrix": [0, 8], "x": 8, "y": 1 },
+                { "matrix": [0, 9], "x": 9, "y": 1 },
+                { "matrix": [0, 10], "x": 10, "y": 1 },
+                { "matrix": [0, 11], "x": 11, "y": 1 },
+                { "matrix": [1, 0], "x": 0, "y": 2 },
+                { "matrix": [1, 1], "x": 1, "y": 2 },
+                { "matrix": [1, 2], "x": 2, "y": 2 },
+                { "matrix": [1, 3], "x": 3, "y": 2 },
+                { "matrix": [1, 4], "x": 4, "y": 2 },
+                { "matrix": [1, 5], "x": 5, "y": 2 },
+                { "matrix": [1, 6], "x": 6, "y": 2 },
+                { "matrix": [1, 7], "x": 7, "y": 2 },
+                { "matrix": [1, 8], "x": 8, "y": 2 },
+                { "matrix": [1, 9], "x": 9, "y": 2 },
+                { "matrix": [1, 10], "x": 10, "y": 2 },
+                { "matrix": [1, 11], "x": 11, "y": 2 },
+                { "matrix": [2, 0], "x": 0, "y": 3 },
+                { "matrix": [2, 1], "x": 1, "y": 3 },
+                { "matrix": [2, 2], "x": 2, "y": 3 },
+                { "matrix": [2, 3], "x": 3, "y": 3 },
+                { "matrix": [2, 4], "x": 4, "y": 3 },
+                { "matrix": [2, 5], "x": 5, "y": 3 },
+                { "matrix": [2, 6], "x": 6, "y": 3 },
+                { "matrix": [2, 7], "x": 7, "y": 3 },
+                { "matrix": [2, 8], "x": 8, "y": 3 },
+                { "matrix": [2, 9], "x": 9, "y": 3 },
+                { "matrix": [2, 10], "x": 10, "y": 3 },
+                { "matrix": [2, 11], "x": 11, "y": 3 },
+                { "matrix": [3, 0], "x": 0, "y": 4 },
+                { "matrix": [3, 1], "x": 1, "y": 4 },
+                { "matrix": [3, 2], "x": 2, "y": 4 },
+                { "matrix": [3, 3], "x": 3, "y": 4 },
+                { "matrix": [3, 4], "x": 4, "y": 4 },
+                { "matrix": [3, 5], "x": 5, "y": 4, "w": 2},
+                { "matrix": [3, 7], "x": 7, "y": 4 },
+                { "matrix": [3, 8], "x": 8, "y": 4 },
+                { "matrix": [3, 9], "x": 9, "y": 4 },
+                { "matrix": [3, 10], "x": 10, "y": 4 },
+                { "matrix": [3, 11], "x": 11, "y": 4 }
+            ]
+        },
+        "LAYOUT_ortho_4x12": {
+            "layout": [
+                { "matrix": [0, 0], "x": 0, "y": 0 },
+                { "matrix": [0, 1], "x": 1, "y": 0 },
+                { "matrix": [0, 2], "x": 2, "y": 0 },
+                { "matrix": [0, 3], "x": 3, "y": 0 },
+                { "matrix": [0, 4], "x": 4, "y": 0 },
+                { "matrix": [0, 5], "x": 5, "y": 0 },
+                { "matrix": [0, 6], "x": 6, "y": 0 },
+                { "matrix": [0, 7], "x": 7, "y": 0 },
+                { "matrix": [0, 8], "x": 8, "y": 0 },
+                { "matrix": [0, 9], "x": 9, "y": 0 },
+                { "matrix": [0, 10], "x": 10, "y": 0 },
+                { "matrix": [0, 11], "x": 11, "y": 0 },
+                { "matrix": [1, 0], "x": 0, "y": 1 },
+                { "matrix": [1, 1], "x": 1, "y": 1 },
+                { "matrix": [1, 2], "x": 2, "y": 1 },
+                { "matrix": [1, 3], "x": 3, "y": 1 },
+                { "matrix": [1, 4], "x": 4, "y": 1 },
+                { "matrix": [1, 5], "x": 5, "y": 1 },
+                { "matrix": [1, 6], "x": 6, "y": 1 },
+                { "matrix": [1, 7], "x": 7, "y": 1 },
+                { "matrix": [1, 8], "x": 8, "y": 1 },
+                { "matrix": [1, 9], "x": 9, "y": 1 },
+                { "matrix": [1, 10], "x": 10, "y": 1 },
+                { "matrix": [1, 11], "x": 11, "y": 1 },
+                { "matrix": [2, 0], "x": 0, "y": 2 },
+                { "matrix": [2, 1], "x": 1, "y": 2 },
+                { "matrix": [2, 2], "x": 2, "y": 2 },
+                { "matrix": [2, 3], "x": 3, "y": 2 },
+                { "matrix": [2, 4], "x": 4, "y": 2 },
+                { "matrix": [2, 5], "x": 5, "y": 2 },
+                { "matrix": [2, 6], "x": 6, "y": 2 },
+                { "matrix": [2, 7], "x": 7, "y": 2 },
+                { "matrix": [2, 8], "x": 8, "y": 2 },
+                { "matrix": [2, 9], "x": 9, "y": 2 },
+                { "matrix": [2, 10], "x": 10, "y": 2 },
+                { "matrix": [2, 11], "x": 11, "y": 2 },
+                { "matrix": [3, 0], "x": 0, "y": 3 },
+                { "matrix": [3, 1], "x": 1, "y": 3 },
+                { "matrix": [3, 2], "x": 2, "y": 3 },
+                { "matrix": [3, 3], "x": 3, "y": 3 },
+                { "matrix": [3, 4], "x": 4, "y": 3 },
+                { "matrix": [3, 5], "x": 5, "y": 3 },
+                { "matrix": [3, 6], "x": 6, "y": 3, "label": "ENC" },
+                { "matrix": [3, 7], "x": 7, "y": 3 },
+                { "matrix": [3, 8], "x": 8, "y": 3 },
+                { "matrix": [3, 9], "x": 9, "y": 3 },
+                { "matrix": [3, 10], "x": 10, "y": 3 },
+                { "matrix": [3, 11], "x": 11, "y": 3 }
+            ]
+        }
+    }
+}
\ No newline at end of file
diff --git a/keyboards/1upkeyboards/pi40/keymaps/default/keymap.c b/keyboards/1upkeyboards/pi40/keymaps/default/keymap.c
new file mode 100644
index 00000000000..e417828f72b
--- /dev/null
+++ b/keyboards/1upkeyboards/pi40/keymaps/default/keymap.c
@@ -0,0 +1,124 @@
+/* Copyright 2022 ziptyze
+ *
+ * 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 layer_names {
+    _ONE = 0,
+    _TWO,
+    _THREE,
+    _FOUR
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+    /* Qwerty
+    *                                                                               ╱⎺⎺⎺⎺╲
+    *                                                                              |RGBTOG|
+    *                                                                              ╲⎽⎽⎽⎽╱ 
+    * ,-----------------------------------------------------------------------------------.
+    * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  |  '   |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Enter |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |Adjust| Ctrl | Alt  | GUI  |Lower |   Space     |Raise | Left | Down |  Up  |Right |
+    * `-----------------------------------------------------------------------------------'
+    */
+    [_ONE] =  LAYOUT (
+                                                                                                           RGB_TOG,
+        KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC,
+        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_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT ,
+        MO(3),   KC_LCTL, KC_LALT, KC_LGUI, MO(1),       KC_SPC,       MO(2),   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT
+    ),
+
+    /* Lower
+    *                                                                               ╱⎺⎺⎺⎺╲
+    *                                                                              | MUTE |
+    *                                                                              ╲⎽⎽⎽⎽╱ 
+    * ,-----------------------------------------------------------------------------------.
+    * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  | Bksp |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   _  |   +  |   {  |   }  |  |   |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO ~ |ISO | | Home | End  |      |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
+    * `-----------------------------------------------------------------------------------'
+    */
+    [_TWO] = LAYOUT (
+                                                                                                                 KC_MUTE,
+        KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR,    KC_ASTR,    KC_LPRN, KC_RPRN, KC_BSPC,
+        KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_UNDS,    KC_PLUS,    KC_LCBR, KC_RCBR, KC_PIPE,
+        _______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END,  _______,
+        _______, _______, _______, _______, _______,       _______,    _______,    KC_MNXT,    KC_VOLD, KC_VOLU, KC_MPLY
+    ),
+
+    /* Raise
+    *                                                                               ╱⎺⎺⎺⎺╲
+    *                                                                              | MUTE |
+    *                                                                              ╲⎽⎽⎽⎽╱ 
+    * ,-----------------------------------------------------------------------------------.
+    * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   -  |   =  |   [  |   ]  |  \   |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO # |ISO / |Pg Up |Pg Dn |      |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |      |      |      |      |      | Mute |      | Next | Vol- | Vol+ | Play |
+    * `-----------------------------------------------------------------------------------'
+    */
+    [_THREE] = LAYOUT (
+                                                                                                           KC_MUTE,
+        KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC,
+        KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS,
+        _______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______,
+        _______, _______, _______, _______, _______,       _______,    _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+    ),
+
+    /* Adjust (Lower + Raise)
+    *                                                                               ╱⎺⎺⎺⎺╲
+    *                                                                              | MUTE |
+    *                       v-----------------------RGB CONTROL------------------v ╲⎽⎽⎽⎽╱ 
+    * ,-----------------------------------------------------------------------------------.
+    * |      | Reset|Debug | RGB  |RGBMOD| HUE+ | HUE- | SAT+ | SAT- |BRGTH+|BRGTH-|  Del |
+    * |------+------+------+------+------+------+------+------+------+------+------+------| 
+    * |      |      |      |      |      |      |      |      |      |      |      |      |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |      |      |      |      |      |      |      |      |      |      |      |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |      |      |      |      |      | Mute |      |      |      |      |      |
+    * `-----------------------------------------------------------------------------------'
+    */
+    [_FOUR] = LAYOUT (
+                                                                                                           KC_MUTE,
+        _______, QK_BOOT,   DEBUG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_DEL ,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______,       _______,    _______, _______, _______, _______, _______
+    )
+};
+
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
+    [_ONE]   =  { ENCODER_CCW_CW(RGB_RMOD, RGB_MOD) },
+    [_TWO]   =  { ENCODER_CCW_CW(KC_VOLD,  KC_VOLU) },
+    [_THREE] =  { ENCODER_CCW_CW(KC_VOLD,  KC_VOLU) },
+    [_FOUR]  =  { ENCODER_CCW_CW(KC_VOLD,  KC_VOLU) }
+};
+#endif
diff --git a/keyboards/1upkeyboards/pi40/keymaps/default/rules.mk b/keyboards/1upkeyboards/pi40/keymaps/default/rules.mk
new file mode 100644
index 00000000000..a40474b4d5c
--- /dev/null
+++ b/keyboards/1upkeyboards/pi40/keymaps/default/rules.mk
@@ -0,0 +1 @@
+ENCODER_MAP_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/1upkeyboards/pi40/keymaps/via/keymap.c b/keyboards/1upkeyboards/pi40/keymaps/via/keymap.c
new file mode 100644
index 00000000000..48c201f0a37
--- /dev/null
+++ b/keyboards/1upkeyboards/pi40/keymaps/via/keymap.c
@@ -0,0 +1,268 @@
+/* Copyright 2022 ziptyze
+ *
+ * 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 layer_names {
+    _ONE = 0,
+    _TWO,
+    _THREE,
+    _FOUR,
+    _FIVE,
+    _SIX,
+    _SEVEN,
+    _EIGHT,
+    _NINE,
+    _TEN
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+    /* Qwerty
+    *                                                                               ╱⎺⎺⎺⎺╲
+    *                                                                              |RGBTOG|
+    *                                                                              ╲⎽⎽⎽⎽╱ 
+    * ,-----------------------------------------------------------------------------------.
+    * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  |  '   |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Enter |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |Adjust| Ctrl | Alt  | GUI  |Lower |   Space     |Raise | Left | Down |  Up  |Right |
+    * `-----------------------------------------------------------------------------------'
+    */
+    [_ONE] =  LAYOUT (
+                                                                                                           RGB_TOG,
+        KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC,
+        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_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT ,
+        MO(3),   KC_LCTL, KC_LALT, KC_LGUI, MO(1),       KC_SPC,       MO(2),   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT
+    ),
+
+    /* Lower
+    *                                                                               ╱⎺⎺⎺⎺╲
+    *                                                                              | MUTE |
+    *                                                                              ╲⎽⎽⎽⎽╱ 
+    * ,-----------------------------------------------------------------------------------.
+    * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  | Bksp |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   _  |   +  |   {  |   }  |  |   |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO ~ |ISO | | Home | End  |      |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
+    * `-----------------------------------------------------------------------------------'
+    */
+    [_TWO] = LAYOUT (
+                                                                                                                 KC_MUTE,
+        KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR,    KC_ASTR,    KC_LPRN, KC_RPRN, KC_BSPC,
+        KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_UNDS,    KC_PLUS,    KC_LCBR, KC_RCBR, KC_PIPE,
+        _______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END,  _______,
+        _______, _______, _______, _______, _______,       _______,    _______,    KC_MNXT,    KC_VOLD, KC_VOLU, KC_MPLY
+    ),
+
+    /* Raise
+    *                                                                               ╱⎺⎺⎺⎺╲
+    *                                                                              | MUTE |
+    *                                                                              ╲⎽⎽⎽⎽╱ 
+    * ,-----------------------------------------------------------------------------------.
+    * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   -  |   =  |   [  |   ]  |  \   |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO # |ISO / |Pg Up |Pg Dn |      |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |      |      |      |      |      | Mute |      | Next | Vol- | Vol+ | Play |
+    * `-----------------------------------------------------------------------------------'
+    */
+    [_THREE] = LAYOUT (
+                                                                                                           KC_MUTE,
+        KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC,
+        KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS,
+        _______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______,
+        _______, _______, _______, _______, _______,       _______,    _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+    ),
+
+    /* Adjust (Lower + Raise)
+    *                                                                               ╱⎺⎺⎺⎺╲
+    *                                                                              | MUTE |
+    *                       v-----------------------RGB CONTROL------------------v ╲⎽⎽⎽⎽╱ 
+    * ,-----------------------------------------------------------------------------------.
+    * |      | Reset|Debug | RGB  |RGBMOD| HUE+ | HUE- | SAT+ | SAT- |BRGTH+|BRGTH-|  Del |
+    * |------+------+------+------+------+------+------+------+------+------+------+------| 
+    * |      |      |      |      |      |      |      |      |      |      |      |      |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |      |      |      |      |      |      |      |      |      |      |      |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |      |      |      |      |      | Mute |      |      |      |      |      |
+    * `-----------------------------------------------------------------------------------'
+    */
+    [_FOUR] = LAYOUT (
+                                                                                                           KC_MUTE,
+        _______, QK_BOOT,   DEBUG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_DEL ,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______,       _______,    _______, _______, _______, _______, _______
+    ),
+
+    /* Placeholder
+    *                                                                               ╱⎺⎺⎺⎺╲
+    *                                                                              |      |
+    *                                                                              ╲⎽⎽⎽⎽╱ 
+    * ,-----------------------------------------------------------------------------------.
+    * |      |      |      |      |      |      |      |      |      |      |      |      |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |      |      |      |      |      |      |      |      |      |      |      |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |      |      |      |      |      |      |      |      |      |      |      |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |      |      |      |      |      |      |      |      |      |      |      |
+    * `-----------------------------------------------------------------------------------'
+    */
+    [_FIVE] = LAYOUT (
+                                                                                                           _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______,       _______,    _______, _______, _______, _______, _______
+    ),
+
+    /* Placeholder
+    *                                                                               ╱⎺⎺⎺⎺╲
+    *                                                                              |      |
+    *                                                                              ╲⎽⎽⎽⎽╱ 
+    * ,-----------------------------------------------------------------------------------.
+    * |      |      |      |      |      |      |      |      |      |      |      |      |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |      |      |      |      |      |      |      |      |      |      |      |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |      |      |      |      |      |      |      |      |      |      |      |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |      |      |      |      |      |      |      |      |      |      |      |
+    * `-----------------------------------------------------------------------------------'
+    */
+    [_SIX] = LAYOUT (
+                                                                                                           _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______,       _______,    _______, _______, _______, _______, _______
+    ),
+
+    /* Placeholder
+    *                                                                               ╱⎺⎺⎺⎺╲
+    *                                                                              |      |
+    *                                                                              ╲⎽⎽⎽⎽╱ 
+    * ,-----------------------------------------------------------------------------------.
+    * |      |      |      |      |      |      |      |      |      |      |      |      |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |      |      |      |      |      |      |      |      |      |      |      |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |      |      |      |      |      |      |      |      |      |      |      |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |      |      |      |      |      |      |      |      |      |      |      |
+    * `-----------------------------------------------------------------------------------'
+    */
+    [_SEVEN] = LAYOUT (
+                                                                                                           _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______,       _______,    _______, _______, _______, _______, _______
+    ),
+
+    /* Placeholder
+    *                                                                               ╱⎺⎺⎺⎺╲
+    *                                                                              |      |
+    *                                                                              ╲⎽⎽⎽⎽╱ 
+    * ,-----------------------------------------------------------------------------------.
+    * |      |      |      |      |      |      |      |      |      |      |      |      |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |      |      |      |      |      |      |      |      |      |      |      |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |      |      |      |      |      |      |      |      |      |      |      |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |      |      |      |      |      |      |      |      |      |      |      |
+    * `-----------------------------------------------------------------------------------'
+    */
+    [_EIGHT] = LAYOUT (
+                                                                                                           _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______,       _______,    _______, _______, _______, _______, _______
+    ),
+
+    /* Placeholder
+    *                                                                               ╱⎺⎺⎺⎺╲
+    *                                                                              |      |
+    *                                                                              ╲⎽⎽⎽⎽╱ 
+    * ,-----------------------------------------------------------------------------------.
+    * |      |      |      |      |      |      |      |      |      |      |      |      |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |      |      |      |      |      |      |      |      |      |      |      |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |      |      |      |      |      |      |      |      |      |      |      |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |      |      |      |      |      |      |      |      |      |      |      |
+    * `-----------------------------------------------------------------------------------'
+    */
+    [_NINE] = LAYOUT (
+                                                                                                           _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______,       _______,    _______, _______, _______, _______, _______
+    ),
+
+    /* Placeholder
+    *                                                                               ╱⎺⎺⎺⎺╲
+    *                                                                              |      |
+    *                                                                              ╲⎽⎽⎽⎽╱ 
+    * ,-----------------------------------------------------------------------------------.
+    * |      |      |      |      |      |      |      |      |      |      |      |      |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |      |      |      |      |      |      |      |      |      |      |      |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |      |      |      |      |      |      |      |      |      |      |      |
+    * |------+------+------+------+------+------+------+------+------+------+------+------|
+    * |      |      |      |      |      |      |      |      |      |      |      |      |
+    * `-----------------------------------------------------------------------------------'
+    */
+    [_TEN] = LAYOUT (
+                                                                                                           _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______,       _______,    _______, _______, _______, _______, _______
+    )
+};
+
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
+    [_ONE]   =  { ENCODER_CCW_CW(RGB_RMOD, RGB_MOD) },
+    [_TWO]   =  { ENCODER_CCW_CW(KC_VOLD,  KC_VOLU) },
+    [_THREE] =  { ENCODER_CCW_CW(KC_VOLD,  KC_VOLU) },
+    [_FOUR]  =  { ENCODER_CCW_CW(KC_VOLD,  KC_VOLU) },
+    [_FIVE]  =  { ENCODER_CCW_CW(_______,  _______) },
+    [_SIX]   =  { ENCODER_CCW_CW(_______,  _______) },
+    [_SEVEN] =  { ENCODER_CCW_CW(_______,  _______) },
+    [_EIGHT] =  { ENCODER_CCW_CW(_______,  _______) },
+    [_NINE]  =  { ENCODER_CCW_CW(_______,  _______) },
+    [_TEN]   =  { ENCODER_CCW_CW(_______,  _______) },
+};
+#endif
diff --git a/keyboards/1upkeyboards/pi40/keymaps/via/rules.mk b/keyboards/1upkeyboards/pi40/keymaps/via/rules.mk
new file mode 100644
index 00000000000..bf70b1f3e09
--- /dev/null
+++ b/keyboards/1upkeyboards/pi40/keymaps/via/rules.mk
@@ -0,0 +1,4 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
+
+ENCODER_MAP_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/1upkeyboards/pi40/lib/glcdfont.c b/keyboards/1upkeyboards/pi40/lib/glcdfont.c
new file mode 100644
index 00000000000..4b354756b60
--- /dev/null
+++ b/keyboards/1upkeyboards/pi40/lib/glcdfont.c
@@ -0,0 +1,231 @@
+// Copyright 2022 @filterpaper
+// SPDX-License-Identifier: GPL-2.0+
+
+#include "progmem.h"
+
+static const unsigned char PROGMEM font[] = {
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00,
+    0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00,
+    0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00,
+    0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00,
+    0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00,
+    0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00,
+    0x00, 0x18, 0x3C, 0x18, 0x00, 0x00,
+    0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00,
+    0x00, 0x18, 0x24, 0x18, 0x00, 0x00,
+    0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00,
+    0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00,
+    0x26, 0x29, 0x79, 0x29, 0x26, 0x00,
+    0x40, 0x7F, 0x05, 0x05, 0x07, 0x00,
+    0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00,
+    0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00,
+    0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00,
+    0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00,
+    0x14, 0x22, 0x7F, 0x22, 0x14, 0x00,
+    0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00,
+    0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00,
+    0x00, 0x66, 0x89, 0x95, 0x6A, 0x00,
+    0x60, 0x60, 0x60, 0x60, 0x60, 0x00,
+    0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00,
+    0x08, 0x04, 0x7E, 0x04, 0x08, 0x00,
+    0x10, 0x20, 0x7E, 0x20, 0x10, 0x00,
+    0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00,
+    0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00,
+    0x1E, 0x10, 0x10, 0x10, 0x10, 0x00,
+    0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00,
+    0x30, 0x38, 0x3E, 0x38, 0x30, 0x00,
+    0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x5F, 0x00, 0x00, 0x00,
+    0x00, 0x07, 0x00, 0x07, 0x00, 0x00,
+    0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00,
+    0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00,
+    0x23, 0x13, 0x08, 0x64, 0x62, 0x00,
+    0x36, 0x49, 0x56, 0x20, 0x50, 0x00,
+    0x00, 0x08, 0x07, 0x03, 0x00, 0x00,
+    0x00, 0x1C, 0x22, 0x41, 0x00, 0x00,
+    0x00, 0x41, 0x22, 0x1C, 0x00, 0x00,
+    0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00,
+    0x08, 0x08, 0x3E, 0x08, 0x08, 0x00,
+    0x00, 0x80, 0x70, 0x30, 0x00, 0x00,
+    0x08, 0x08, 0x08, 0x08, 0x08, 0x00,
+    0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
+    0x20, 0x10, 0x08, 0x04, 0x02, 0x00,
+    0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00,
+    0x00, 0x42, 0x7F, 0x40, 0x00, 0x00,
+    0x72, 0x49, 0x49, 0x49, 0x46, 0x00,
+    0x21, 0x41, 0x49, 0x4D, 0x33, 0x00,
+    0x18, 0x14, 0x12, 0x7F, 0x10, 0x00,
+    0x27, 0x45, 0x45, 0x45, 0x39, 0x00,
+    0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00,
+    0x41, 0x21, 0x11, 0x09, 0x07, 0x00,
+    0x36, 0x49, 0x49, 0x49, 0x36, 0x00,
+    0x46, 0x49, 0x49, 0x29, 0x1E, 0x00,
+    0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
+    0x00, 0x40, 0x34, 0x00, 0x00, 0x00,
+    0x00, 0x08, 0x14, 0x22, 0x41, 0x00,
+    0x14, 0x14, 0x14, 0x14, 0x14, 0x00,
+    0x00, 0x41, 0x22, 0x14, 0x08, 0x00,
+    0x02, 0x01, 0x59, 0x09, 0x06, 0x00,
+    0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00,
+    0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00,
+    0x7F, 0x49, 0x49, 0x49, 0x36, 0x00,
+    0x3E, 0x41, 0x41, 0x41, 0x22, 0x00,
+    0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00,
+    0x7F, 0x49, 0x49, 0x49, 0x41, 0x00,
+    0x7F, 0x09, 0x09, 0x09, 0x01, 0x00,
+    0x3E, 0x41, 0x41, 0x51, 0x73, 0x00,
+    0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00,
+    0x00, 0x41, 0x7F, 0x41, 0x00, 0x00,
+    0x20, 0x40, 0x41, 0x3F, 0x01, 0x00,
+    0x7F, 0x08, 0x14, 0x22, 0x41, 0x00,
+    0x7F, 0x40, 0x40, 0x40, 0x40, 0x00,
+    0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00,
+    0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00,
+    0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00,
+    0x7F, 0x09, 0x09, 0x09, 0x06, 0x00,
+    0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00,
+    0x7F, 0x09, 0x19, 0x29, 0x46, 0x00,
+    0x26, 0x49, 0x49, 0x49, 0x32, 0x00,
+    0x03, 0x01, 0x7F, 0x01, 0x03, 0x00,
+    0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00,
+    0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00,
+    0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00,
+    0x63, 0x14, 0x08, 0x14, 0x63, 0x00,
+    0x03, 0x04, 0x78, 0x04, 0x03, 0x00,
+    0x61, 0x59, 0x49, 0x4D, 0x43, 0x00,
+    0x00, 0x7F, 0x41, 0x41, 0x41, 0x00,
+    0x02, 0x04, 0x08, 0x10, 0x20, 0x00,
+    0x00, 0x41, 0x41, 0x41, 0x7F, 0x00,
+    0x04, 0x02, 0x01, 0x02, 0x04, 0x00,
+    0x40, 0x40, 0x40, 0x40, 0x40, 0x00,
+    0x00, 0x03, 0x07, 0x08, 0x00, 0x00,
+    0x20, 0x54, 0x54, 0x78, 0x40, 0x00,
+    0x7F, 0x28, 0x44, 0x44, 0x38, 0x00,
+    0x38, 0x44, 0x44, 0x44, 0x28, 0x00,
+    0x38, 0x44, 0x44, 0x28, 0x7F, 0x00,
+    0x38, 0x54, 0x54, 0x54, 0x18, 0x00,
+    0x00, 0x08, 0x7E, 0x09, 0x02, 0x00,
+    0x18, 0x24, 0x24, 0x1C, 0x78, 0x00,
+    0x7F, 0x08, 0x04, 0x04, 0x78, 0x00,
+    0x00, 0x44, 0x7D, 0x40, 0x00, 0x00,
+    0x20, 0x40, 0x40, 0x3D, 0x00, 0x00,
+    0x7F, 0x10, 0x28, 0x44, 0x00, 0x00,
+    0x00, 0x41, 0x7F, 0x40, 0x00, 0x00,
+    0x7C, 0x04, 0x78, 0x04, 0x78, 0x00,
+    0x7C, 0x08, 0x04, 0x04, 0x78, 0x00,
+    0x38, 0x44, 0x44, 0x44, 0x38, 0x00,
+    0x7C, 0x18, 0x24, 0x24, 0x18, 0x00,
+    0x18, 0x24, 0x24, 0x18, 0x7C, 0x00,
+    0x7C, 0x08, 0x04, 0x04, 0x08, 0x00,
+    0x48, 0x54, 0x54, 0x54, 0x24, 0x00,
+    0x04, 0x04, 0x3F, 0x44, 0x24, 0x00,
+    0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00,
+    0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00,
+    0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00,
+    0x44, 0x28, 0x10, 0x28, 0x44, 0x00,
+    0x4C, 0x90, 0x90, 0x90, 0x7C, 0x00,
+    0x44, 0x64, 0x54, 0x4C, 0x44, 0x00,
+    0x00, 0x08, 0x36, 0x41, 0x00, 0x00,
+    0x00, 0x00, 0x77, 0x00, 0x00, 0x00,
+    0x00, 0x41, 0x36, 0x08, 0x00, 0x00,
+    0x02, 0x01, 0x02, 0x04, 0x02, 0x00,
+    0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0xE0, 0x18, 0x02,
+    0x00, 0x3C, 0x1E, 0x06, 0x0E, 0x0A,
+    0x1A, 0x0E, 0x26, 0xFF, 0xBF, 0x0D,
+    0x00, 0x80, 0x80, 0x81, 0xFF, 0xFE,
+    0xF8, 0x01, 0x01, 0x03, 0x03, 0x03,
+    0x03, 0x05, 0x05, 0x02, 0x02, 0x0A,
+    0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
+    0x0C, 0x04, 0x10, 0x18, 0x20, 0xC0,
+    0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0xD0, 0x58, 0x78,
+    0x68, 0x2C, 0x24, 0x34, 0xF4, 0xF4,
+    0x3C, 0x3C, 0xFC, 0xF8, 0xF8, 0x70,
+    0xF0, 0xE0, 0xE0, 0xC0, 0xC0, 0x80,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0xC0, 0x7C, 0x07, 0x80, 0xE0,
+    0x60, 0x64, 0xE2, 0x60, 0x10, 0x10,
+    0x20, 0x22, 0x12, 0x17, 0x3F, 0x0B,
+    0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x21,
+    0x6F, 0xFC, 0xE0, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
+    0x60, 0x60, 0x70, 0x70, 0xF0, 0xF0,
+    0xD0, 0xD0, 0xD0, 0xD0, 0x50, 0x50,
+    0x50, 0x70, 0x78, 0x78, 0x78, 0x7C,
+    0x7F, 0x7D, 0x7C, 0x5E, 0x4F, 0x44,
+    0x40, 0x40, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x38, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x58, 0x46, 0x47, 0x41,
+    0x41, 0x01, 0x01, 0x03, 0x03, 0x42,
+    0x42, 0x42, 0x46, 0x46, 0x46, 0x46,
+    0x42, 0x43, 0x43, 0x73, 0x77, 0x72,
+    0x70, 0x60, 0x60, 0x60, 0x60, 0x60,
+    0x60, 0x61, 0x67, 0x6F, 0x7E, 0x78,
+    0x78, 0x70, 0x70, 0x70, 0x70, 0x70,
+    0x60, 0x60, 0x60, 0x60, 0x60, 0x60,
+    0x60, 0x60, 0x60, 0x60, 0x60, 0x60,
+    0x60, 0x60, 0x60, 0x60, 0x60, 0x60,
+    0x40, 0x40, 0x40, 0x48, 0x58, 0x58,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
diff --git a/keyboards/1upkeyboards/pi40/mcuconf.h b/keyboards/1upkeyboards/pi40/mcuconf.h
new file mode 100644
index 00000000000..df94cb03460
--- /dev/null
+++ b/keyboards/1upkeyboards/pi40/mcuconf.h
@@ -0,0 +1,10 @@
+// Copyright 2022 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#include_next <mcuconf.h>
+
+#undef RP_I2C_USE_I2C0
+#undef RP_I2C_USE_I2C1
+#define RP_I2C_USE_I2C0 TRUE
+#define RP_I2C_USE_I2C1 FALSE
\ No newline at end of file
diff --git a/keyboards/1upkeyboards/pi40/pi40.c b/keyboards/1upkeyboards/pi40/pi40.c
new file mode 100644
index 00000000000..8e2fc4c3d3e
--- /dev/null
+++ b/keyboards/1upkeyboards/pi40/pi40.c
@@ -0,0 +1,312 @@
+/* Copyright 2022 ziptyze
+ *
+ * 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
+
+static uint32_t oled_logo_timer = 0;
+static bool clear_logo = true;
+static const char PROGMEM my_logo[] = {
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+        0xf0, 0xf0, 0xf0, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 
+        0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 
+        0x0f, 0x0f, 0x0f, 0x1f, 0xff, 0xff, 0xff, 0x1f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 
+        0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+        0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+        0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 
+        0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 
+        0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+        0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+        0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 
+        0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 
+        0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+        0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 
+        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xfb, 
+        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xff, 
+        0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+    };
+
+#endif
+
+#ifdef RGB_MATRIX_ENABLE
+led_config_t g_led_config = { {
+    // Key Matrix to LED Index
+    {  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11 },
+    { 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12 },
+    { 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35 },
+    { 46, 45, 44, 43, 42, 41, NO_LED, 40, 39, 38, 37, 36 }
+}, {
+    // LED Index to Physical Position
+    {   9,  8 }, {  28,  8 }, {  46,  8 }, {  65,  8 }, {  84,  8 }, { 102,  8 }, { 121,  8 }, { 140,  8 }, { 159,  8 }, { 177,  8 }, { 196,  8 }, { 215,  8 },
+    { 215, 24 }, { 196, 24 }, { 177, 24 }, { 159, 24 }, { 140, 24 }, { 121, 24 }, { 102, 24 }, {  84, 24 }, {  65, 24 }, {  46, 24 }, {  28, 24 }, {   9, 24 },
+    {   9, 40 }, {  28, 40 }, {  46, 40 }, {  65, 40 }, {  84, 40 }, { 102, 40 }, { 121, 40 }, { 140, 40 }, { 159, 40 }, { 177, 40 }, { 196, 40 }, { 215, 40 },
+    { 215, 56 }, { 196, 56 }, { 177, 56 }, { 159, 56 }, { 140, 56 }, { 112, 56 }, {  84, 56 }, {  65, 56 }, {  46, 56 }, {  28, 56 }, {   9, 56 }
+}, {
+    // LED Index to Flag
+    1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
+    1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
+    1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+} };
+#endif
+
+#ifdef OLED_ENABLE
+
+void init_timer(void){
+   oled_logo_timer = timer_read32();
+};
+
+void user_oled_magic(void) {
+    // Host Keyboard Layer Status
+    oled_write_P(PSTR("Layer: "), false);
+
+    switch (get_highest_layer(layer_state)) {
+        case 0:
+            oled_write_P(PSTR("One\n"), false);
+            break;
+        case 1:
+            oled_write_P(PSTR("Two\n"), false);
+            break;
+        case 2:
+            oled_write_P(PSTR("Three\n"), false);
+            break;
+        case 3:
+            oled_write_P(PSTR("Four\n"), false);
+            break;
+        case 4:
+            oled_write_P(PSTR("Five\n"), false);
+            break;
+        case 5:
+            oled_write_P(PSTR("Six\n"), false);
+            break;
+        case 6:
+            oled_write_P(PSTR("Seven\n"), false);
+            break;
+        case 7:
+            oled_write_P(PSTR("Eight\n"), false);
+            break;
+        case 8:
+            oled_write_P(PSTR("Nine\n"), false);
+            break;
+        case 9:
+            oled_write_P(PSTR("Ten\n"), false);
+            break;
+        default:
+            // Or use the write_ln shortcut over adding '\n' to the end of your string
+            oled_write_ln_P(PSTR("Undefined"), false);
+    }
+
+    // Host Keyboard LED Status
+    led_t led_state = host_keyboard_led_state();
+    oled_write_P(led_state.caps_lock ? PSTR("Cap(x) ") : PSTR("Cap( ) "), false);
+    oled_write_P(led_state.num_lock ? PSTR("Num(x) ") : PSTR("Num( ) "), false);
+    oled_write_P(led_state.scroll_lock ? PSTR("Scrl(x)") : PSTR("Scrl( )"), false);
+
+
+    switch (rgb_matrix_get_mode()) {
+        case 1:
+            oled_write_P(PSTR("Solid Color\n                  "), false);
+            break;
+        case 2:
+            oled_write_P(PSTR("Alphas Mods\n                  "), false);
+            break;
+        case 3:
+            oled_write_P(PSTR("Gradient Up Down\n                  "), false);
+            break;
+        case 4:
+            oled_write_P(PSTR("Gradient Left Right\n                  "), false);
+            break;
+        case 5:
+            oled_write_P(PSTR("Breathing\n                  "), false);
+            break;
+        case 6:
+            oled_write_P(PSTR("Band Sat\n                  "), false);
+            break;
+        case 7:
+            oled_write_P(PSTR("Band Val\n                  "), false);
+            break;
+        case 8:
+            oled_write_P(PSTR("Band Pinwheel Sat\n                  "), false);
+            break;
+        case 9:
+            oled_write_P(PSTR("Band Pinwheel Val\n                  "), false);
+            break;
+        case 10:
+            oled_write_P(PSTR("Band Spiral Sat\n                  "), false);
+            break;
+        case 11:
+            oled_write_P(PSTR("Band Spiral Val\n                  "), false);
+            break;
+        case 12:
+            oled_write_P(PSTR("Cycle All\n                  "), false);
+            break;
+        case 13:
+            oled_write_P(PSTR("Cycle Left Right\n                  "), false);
+            break;
+        case 14:
+            oled_write_P(PSTR("Cycle Up Down\n                  "), false);
+            break;
+        case 15:
+            oled_write_P(PSTR("Rainbow\nMoving Chevron    "), false);
+            break;
+        case 16:
+            oled_write_P(PSTR("Cycle Out In\n                  "), false);
+            break;
+        case 17:
+            oled_write_P(PSTR("Cycle Out In Dual\n                  "), false);
+            break;
+        case 18:
+            oled_write_P(PSTR("Cycle Pinwheel\n                  "), false);
+            break;
+        case 19:
+            oled_write_P(PSTR("Cycle Spiral\n                  "), false);
+            break;
+        case 20:
+            oled_write_P(PSTR("Dual Beacon\n                  "), false);
+            break;
+        case 21:
+            oled_write_P(PSTR("Rainbow Beacon\n                  "), false);
+            break;
+        case 22:
+            oled_write_P(PSTR("Rainbow Pinwheels\n                  "), false);
+            break;
+        case 23:
+            oled_write_P(PSTR("Raindrops\n                  "), false);
+            break;
+        case 24:
+            oled_write_P(PSTR("Jellybean Raindrops\n                  "), false);
+            break;
+        case 25:
+            oled_write_P(PSTR("Hue Breathing\n                  "), false);
+            break;
+        case 26:
+            oled_write_P(PSTR("Hue Pendulum\n                  "), false);
+            break;
+        case 27:
+            oled_write_P(PSTR("Hue Wave\n                  "), false);
+            break;
+        case 28:
+            oled_write_P(PSTR("Pixel Rain\n                  "), false);
+            break;
+        case 29:
+            oled_write_P(PSTR("Pixel Flow\n                  "), false);
+            break;
+        case 30:
+            oled_write_P(PSTR("Pixel Fractal\n                  "), false);
+            break;
+        case 31:
+            oled_write_P(PSTR("Typing Heatmap\n                  "), false);
+            break;
+        case 32:
+            oled_write_P(PSTR("Digital Rain\n                  "), false);
+            break;
+        case 33:
+            oled_write_P(PSTR("Solid Reactive\nSimple            "), false);
+            break;
+        case 34:
+            oled_write_P(PSTR("Solid Reactive\n                  "), false);
+            break;
+        case 35:
+            oled_write_P(PSTR("Solid Reactive\nWide              "), false);
+            break;
+        case 36:
+            oled_write_P(PSTR("Solid Reactive\nMultiwide         "), false);
+            break;
+        case 37:
+            oled_write_P(PSTR("Solid Reactive\nCross             "), false);
+            break;
+        case 38:
+            oled_write_P(PSTR("Solid Reactive\nMulticross        "), false);
+            break;
+        case 39:
+            oled_write_P(PSTR("Solid Reactive\nNexus             "), false);
+            break;
+        case 40:
+            oled_write_P(PSTR("Solid Reactive\nMultinexus        "), false);
+            break;
+        case 41:
+            oled_write_P(PSTR("Splash\n                  "), false);
+            break;
+        case 42:
+            oled_write_P(PSTR("Multisplash\n                  "), false);
+            break;
+        case 43:
+            oled_write_P(PSTR("Solid Splash\n                  "), false);
+            break;
+        case 44:
+            oled_write_P(PSTR("Solid Multisplash\n                  "), false);
+            break;
+        default:
+            // Or use the write_ln shortcut over adding '\n' to the end of your string
+            oled_write_ln_P(PSTR("Undefined\n                  "), false);
+    }
+
+}
+
+void render_logo(void) {
+    oled_write_raw_P(my_logo, sizeof(my_logo));
+}
+
+void clear_screen(void) {
+    if (clear_logo){
+      for (uint8_t i = 0; i < OLED_DISPLAY_HEIGHT; ++i) {
+        for (uint8_t j = 0; j < OLED_DISPLAY_WIDTH; ++j) {
+          oled_write_raw_byte(0x0, i*OLED_DISPLAY_WIDTH + j);
+        }
+      }
+      clear_logo = false;
+    }
+}
+
+oled_rotation_t oled_init_kb(oled_rotation_t rotation) {
+    return OLED_ROTATION_180;
+}
+
+void keyboard_post_init_kb(void) {
+    init_timer();
+
+    keyboard_post_init_user();
+}
+
+#    define SHOW_LOGO 5000
+bool oled_task_kb(void) {
+    if (!oled_task_user()) { return false; }
+    if ((timer_elapsed32(oled_logo_timer) < SHOW_LOGO)){
+        render_logo();
+    }else{
+      clear_screen();
+      user_oled_magic();
+    }
+    return false;
+}
+
+#endif
\ No newline at end of file
diff --git a/keyboards/1upkeyboards/pi40/readme.md b/keyboards/1upkeyboards/pi40/readme.md
new file mode 100644
index 00000000000..95ddec43587
--- /dev/null
+++ b/keyboards/1upkeyboards/pi40/readme.md
@@ -0,0 +1,38 @@
+# pi40
+
+![pi40](https://i.imgur.com/ONVtaVZh.jpeg)
+
+The pi40 is a 4x12 ortholinear keyboard with a fixed 2u spacebar using a Raspberry Pi Pico for the controller.
+
+It includes options for a rotary encoder, SSD1306 oled, and per-key in-switch RGB LEDs.
+
+All unused GPIO pins are broken out on the main pcb, as well as the available voltage pins.
+
+This firmware also includes the option for VIA which includes configuration options for the rotary encoder, matrix lighting, and up to 10 layers.
+
+Default oled configuration displays:
+   - current layer
+   - caps lock status
+   - num lock status
+   - scroll lock status
+   - current RGB lighting mode
+
+* Keyboard Maintainer: [ziptyze](https://github.com/ziptyze)
+* Hardware Availability: (https://1upkeyboards.com/shop/keyboard-kits/diy-40-kits/pi40-keyboard-kit/)
+
+Make example for this keyboard (after setting up your build environment):
+
+    make 1upkeyboards/pi40:default
+
+Flashing example for this keyboard:
+
+    make 1upkeyboards/pi40:default:flash
+
+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:
+
+* **Bootmagic reset**: Hold down the key at (0,0) in the matrix, the top left key, and plug in the keyboard
+* **BOOTSEL button**: Hold down the BOOTSEL button on the pico, and plug in the keyboard
diff --git a/keyboards/1upkeyboards/pi40/rules.mk b/keyboards/1upkeyboards/pi40/rules.mk
new file mode 100644
index 00000000000..ecf7a9ce3ad
--- /dev/null
+++ b/keyboards/1upkeyboards/pi40/rules.mk
@@ -0,0 +1,26 @@
+# MCU name
+MCU = RP2040
+BOOTLOADER = rp2040
+BOARD = GENERIC_RP_RP2040
+
+# Build Options
+#   change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes      # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = yes       # Mouse keys
+EXTRAKEY_ENABLE = yes       # Audio control and System control
+CONSOLE_ENABLE = no         # Console for debug
+COMMAND_ENABLE = no         # Commands for debug and configuration
+NKRO_ENABLE = no            # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no        # Enable keyboard RGB underglow
+AUDIO_ENABLE = no           # Audio output
+
+RGB_MATRIX_ENABLE = yes
+RGB_MATRIX_DRIVER = WS2812
+
+WS2812_DRIVER = vendor
+ENCODER_ENABLE = yes
+
+OLED_ENABLE     = yes
+OLED_DRIVER     = SSD1306
\ No newline at end of file