aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustine Smithies <justine@smithies.me.uk>2023-12-09 17:27:00 +0000
committerJustine Smithies <justine@smithies.me.uk>2023-12-09 17:27:00 +0000
commit59f5f57d524173ece07c50400f54bbb20edffc08 (patch)
tree03f317974010aaecf7d61161c4f2ab724d1e0dd1
Initial commit
-rw-r--r--config.h30
-rw-r--r--halconf.h7
-rw-r--r--info.json120
-rw-r--r--jmspicotkl.c111
-rw-r--r--keymaps/default/keymap.c42
-rw-r--r--mcuconf.h10
-rw-r--r--readme.md47
-rw-r--r--rules.mk2
8 files changed, 369 insertions, 0 deletions
diff --git a/config.h b/config.h
new file mode 100644
index 0000000..5307073
--- /dev/null
+++ b/config.h
@@ -0,0 +1,30 @@
+// Copyright 2023 Justine Smithies (@JustineSmithies)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define I2C1_SCL_PIN GP1
+#define I2C1_SDA_PIN GP0
+#define I2C_DRIVER I2CD0
+
+#define OLED_DISPLAY_128X64
+#define OLED_IC OLED_IC_SSD1306
+#define OLED_DISPLAY_ADDRESS 0x3C
+#define OLED_BRIGHTNESS 255
+#define OLED_TIMEOUT 0 // 60000ms is default
+
+/*
+ * Feature disable options
+ * These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+//#define NO_DEBUG
+
+/* disable print */
+//#define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
diff --git a/halconf.h b/halconf.h
new file mode 100644
index 0000000..39fbe3e
--- /dev/null
+++ b/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/info.json b/info.json
new file mode 100644
index 0000000..5856944
--- /dev/null
+++ b/info.json
@@ -0,0 +1,120 @@
+{
+ "manufacturer": "Justine Smithies",
+ "keyboard_name": "jmspicotkl",
+ "maintainer": "JustineSmithies",
+ "bootloader": "rp2040",
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": true,
+ "oled": true,
+ "nkro": true
+ },
+ "matrix_pins": {
+ "cols": ["GP2", "GP3", "GP4", "GP5", "GP6", "GP7", "GP8", "GP9", "GP10", "GP11", "GP12", "GP13", "GP14", "GP15", "GP16", "GP17", "GP18", "GP19"],
+ "rows": ["GP20", "GP21", "GP22", "GP26", "GP27", "GP28"]
+ },
+ "processor": "RP2040",
+ "url": "",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x0000",
+ "vid": "0xFEED"
+ },
+ "layouts": {
+ "LAYOUT_tkl_ansi": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "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, 7], "x": 6.5, "y": 0},
+ {"matrix": [0, 8], "x": 7.5, "y": 0},
+ {"matrix": [0, 9], "x": 8.5, "y": 0},
+ {"matrix": [0, 10], "x": 9.5, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15.25, "y": 0},
+ {"matrix": [0, 16], "x": 16.25, "y": 0},
+ {"matrix": [0, 17], "x": 17.25, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.25},
+ {"matrix": [1, 3], "x": 3, "y": 1.25},
+ {"matrix": [1, 4], "x": 4, "y": 1.25},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [1, 6], "x": 6, "y": 1.25},
+ {"matrix": [1, 7], "x": 7, "y": 1.25},
+ {"matrix": [1, 8], "x": 8, "y": 1.25},
+ {"matrix": [1, 9], "x": 9, "y": 1.25},
+ {"matrix": [1, 10], "x": 10, "y": 1.25},
+ {"matrix": [1, 11], "x": 11, "y": 1.25},
+ {"matrix": [1, 12], "x": 12, "y": 1.25},
+ {"matrix": [1, 14], "x": 13, "y": 1.25, "w": 2},
+ {"matrix": [1, 15], "x": 15.25, "y": 1.25},
+ {"matrix": [1, 16], "x": 16.25, "y": 1.25},
+ {"matrix": [1, 17], "x": 17.25, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 2], "x": 1.5, "y": 2.25},
+ {"matrix": [2, 3], "x": 2.5, "y": 2.25},
+ {"matrix": [2, 4], "x": 3.5, "y": 2.25},
+ {"matrix": [2, 5], "x": 4.5, "y": 2.25},
+ {"matrix": [2, 6], "x": 5.5, "y": 2.25},
+ {"matrix": [2, 7], "x": 6.5, "y": 2.25},
+ {"matrix": [2, 8], "x": 7.5, "y": 2.25},
+ {"matrix": [2, 9], "x": 8.5, "y": 2.25},
+ {"matrix": [2, 10], "x": 9.5, "y": 2.25},
+ {"matrix": [2, 11], "x": 10.5, "y": 2.25},
+ {"matrix": [2, 12], "x": 11.5, "y": 2.25},
+ {"matrix": [2, 13], "x": 12.5, "y": 2.25},
+ {"matrix": [2, 14], "x": 13.5, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 15], "x": 15.25, "y": 2.25},
+ {"matrix": [2, 16], "x": 16.25, "y": 2.25},
+ {"matrix": [2, 17], "x": 17.25, "y": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
+ {"matrix": [3, 2], "x": 1.75, "y": 3.25},
+ {"matrix": [3, 3], "x": 2.75, "y": 3.25},
+ {"matrix": [3, 4], "x": 3.75, "y": 3.25},
+ {"matrix": [3, 5], "x": 4.75, "y": 3.25},
+ {"matrix": [3, 6], "x": 5.75, "y": 3.25},
+ {"matrix": [3, 7], "x": 6.75, "y": 3.25},
+ {"matrix": [3, 8], "x": 7.75, "y": 3.25},
+ {"matrix": [3, 9], "x": 8.75, "y": 3.25},
+ {"matrix": [3, 10], "x": 9.75, "y": 3.25},
+ {"matrix": [3, 11], "x": 10.75, "y": 3.25},
+ {"matrix": [3, 12], "x": 11.75, "y": 3.25},
+ {"matrix": [3, 14], "x": 12.75, "y": 3.25, "w": 2.25},
+ {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4.25},
+ {"matrix": [4, 3], "x": 3.25, "y": 4.25},
+ {"matrix": [4, 4], "x": 4.25, "y": 4.25},
+ {"matrix": [4, 5], "x": 5.25, "y": 4.25},
+ {"matrix": [4, 6], "x": 6.25, "y": 4.25},
+ {"matrix": [4, 7], "x": 7.25, "y": 4.25},
+ {"matrix": [4, 8], "x": 8.25, "y": 4.25},
+ {"matrix": [4, 9], "x": 9.25, "y": 4.25},
+ {"matrix": [4, 10], "x": 10.25, "y": 4.25},
+ {"matrix": [4, 11], "x": 11.25, "y": 4.25},
+ {"matrix": [4, 13], "x": 12.25, "y": 4.25, "w": 2.75},
+ {"matrix": [4, 16], "x": 16.25, "y": 4.25},
+ {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 1], "x": 1.25, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 3], "x": 2.5, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 6], "x": 3.75, "y": 5.25, "w": 6.25},
+ {"matrix": [5, 10], "x": 10, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 11], "x": 11.25, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 13], "x": 12.5, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 14], "x": 13.75, "y": 5.25, "w": 1.25},
+ {"matrix": [5, 15], "x": 15.25, "y": 5.25},
+ {"matrix": [5, 16], "x": 16.25, "y": 5.25},
+ {"matrix": [5, 17], "x": 17.25, "y": 5.25}
+ ]
+ }
+ }
+}
diff --git a/jmspicotkl.c b/jmspicotkl.c
new file mode 100644
index 0000000..77870f9
--- /dev/null
+++ b/jmspicotkl.c
@@ -0,0 +1,111 @@
+/* Copyright 2023 Justine Smithies
+ *
+ * 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[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,193,193, 1, 1,193,193, 1, 1, 1, 1, 1, 1,193,193, 1, 1, 1, 1,193,193,193,193,193,193, 1, 1, 1, 1,255, 0, 0, 0, 0,192,192,192,192,192,192, 0, 0, 0, 0,192,192,192,192,192,192, 0, 0, 0, 0,192,192,192,192, 0, 0, 0, 0, 0, 0,192,192,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,255, 0, 0, 0, 0, 48, 48,192,192,192,192, 63, 63, 0, 0,255,255, 3, 3, 12, 12, 3, 3,255,255, 0, 0,195,195,204,204,204,204, 48, 48, 0, 0, 0, 0,255, 0, 0, 0, 0,255,255, 12, 12, 12, 12, 3, 3, 0, 0,192,192,255,255,192,192, 0, 0, 63, 63,192,192,192,192, 51, 51, 0, 0, 63, 63,192,192,192,192, 63, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 12, 12, 12, 12,252,252, 12, 12, 12, 12, 0, 0,252,252,192,192, 48, 48, 12, 12, 0, 0,252,252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, 0,252,252,204,204,204,204, 48, 48, 0, 0,240,240, 12, 12, 12, 12,240,240, 0, 0,252,252, 0, 0,192,192, 0, 0,252,252, 0, 0,252,252,204,204,204,204, 12, 12, 0, 0,252,252,204,204,204,204, 48, 48, 0, 0,252,252,204,204,204,204, 12, 12, 0, 0,252,252, 12, 12, 12, 12,240,240, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 0, 0, 0, 0, 0, 0, 15, 15, 0, 0, 3, 3, 12, 12, 0, 0, 15, 15, 12, 12, 12, 12, 12, 12, 0, 0, 0, 0,255, 0, 0, 0, 0, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 12, 12, 12, 12, 3, 3, 0, 0, 15, 15, 3, 3, 0, 0, 3, 3, 15, 15, 0, 0, 15, 15, 12, 12, 12, 12, 12, 12, 0, 0, 15, 15, 0, 0, 3, 3, 12, 12, 0, 0, 15, 15, 12, 12, 12, 12, 12, 12, 0, 0, 15, 15, 12, 12, 12, 12, 3, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+#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("0\n"), false);
+ break;
+ case 1:
+ oled_write_P(PSTR("1\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);
+ }
+
+ oled_write_P(PSTR("\n"), false);
+ // Host Keyboard LED Status
+ led_t led_state = host_keyboard_led_state();
+ //oled_write_P(led_state.num_lock ? PSTR("NUM ") : PSTR(" "), false);
+ oled_write_P(PSTR("Caps lock: "), false);
+ oled_write_P(led_state.caps_lock ? PSTR("On ") : PSTR("Off"), false);
+ oled_write_P(PSTR("\n"), false);
+ oled_write_P(PSTR("Scroll lock: "), false);
+ oled_write_P(led_state.scroll_lock ? PSTR("On ") : PSTR("Off"), false);
+
+ #ifdef WPM_ENABLE
+ static char wpm_str[10];
+ // Write WPM
+ oled_write_P(PSTR("\n"), false);
+ sprintf(wpm_str, "WPM: %03d", get_current_wpm());
+ oled_write_P(PSTR("\n"), false);
+ oled_write(wpm_str, false);
+ #endif
+}
+
+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;
+ }
+}
+
+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
diff --git a/keymaps/default/keymap.c b/keymaps/default/keymap.c
new file mode 100644
index 0000000..d7ff6ca
--- /dev/null
+++ b/keymaps/default/keymap.c
@@ -0,0 +1,42 @@
+// Copyright 2023 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /*
+ * ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
+ * │Esc│ │F1 │F2 │F3 │F4 │ │F5 │F6 │F7 │F8 │ │F9 │F10│F11│F12│ │PSc│Scr│Pse│
+ * └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐
+ * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Backsp│ │Ins│Hom│PgU│
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤
+ * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │ │Del│End│PgD│
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘
+ * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ ┌───┐
+ * │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift │ │ ↑ │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐
+ * │Ctrl│GUI │Alt │ │ Alt│ GUI│Menu│Ctrl│ │ ← │ ↓ │ → │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘
+ */
+ [0] = LAYOUT_tkl_ansi(
+ KC_ESC, 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_PSCR, KC_SCRL, KC_PAUS,
+
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, LT(1,KC_APP), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ [1] = LAYOUT_tkl_ansi(
+ QK_REBOOT, 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_MUTE, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP,
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO
+ )
+};
+
diff --git a/mcuconf.h b/mcuconf.h
new file mode 100644
index 0000000..98b9a28
--- /dev/null
+++ b/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
diff --git a/readme.md b/readme.md
new file mode 100644
index 0000000..d7220e1
--- /dev/null
+++ b/readme.md
@@ -0,0 +1,47 @@
+# jmspicotkl
+
+*Raspberry Pi Pico TKL keyboard with oled status display powered by QMK*
+
+* Keyboard Maintainer: [Justine Smithies](https://fosstodon.org/@JustineSmithies)
+
+## **BOM**
+|Item |Count|Example|
+|:--- |:---:|:---:|
+|Micro 5Pin Male to USB 2.0 A Female With Screw Panel Mount Cable |1|[Link](https://www.ebay.co.uk/itm/231984473033?hash=item36035a23c9:g:ppYAAOSweBFaqoEh)|
+|Raspberry Pi Pico |1|[Link](https://thepihut.com/collections/pico/products/raspberry-pi-pico)|
+|0.96" SSD1306 128x64 Blue |1|[Link](https://www.ebay.co.uk/itm/313603433645?hash=item490438a4ad:g:7cIAAOSwFxlgFY5O)|
+|1N4148 Diodes |100|[Link](https://www.ebay.co.uk/itm/313646674409?_trkparms=ispr%3D1&hash=item4906cc71e9:g:kZ8AAOSwxhNhIR6I&amdata=enc%3AAQAGAAAA4HNlZhtmMFCOq5AkzQH0g1bp9XaWKNkLGLOiWFiZxlmCq9DjLAMrg2mvwAyB2RHHrE3dDniqW%2BobKu4v26C3tfEyxvQ2PFxOeH2b29ldf5OfLvKByZQTxMN6oRU2uo9crlDv12TqKz3%2Fgx8%2Bp7mJj1xhxXUTjohUxtKXcReOvlKYzMl0mm8w2Ee9CNXhOk6dhgVcm%2FXnX7wU%2BQSw8NeLLqB1UowcjkWe20YgPIaIAmb9q9IOY5xcMTRZiXKsU77FcZD4aGHLpsCFzptt7cWOkYZCqHfl4BTQDhImGcBxoyI%2B%7Ctkp%3ABFBMgMuwqf1f)|
+|Kailh Box Thick Click Jade or your own preference |90|[Link](https://mechbox.co.uk/collections/switches-packs-of-10/products/novelkeys-x-kailh-box-thick-click-jade-switch-10-switches?variant=40657871274146)|
+|MX Keycaps of your choice but I recommend WASD --> |87|[Link](https://www.wasdkeyboards.com/87-key-custom-cherry-mx-keycap-set.html)|
+|Custom made stainless steel plate |1|See the remarks below for info
+|Everglide Panda GH60 stablizers |1 pack|[Link](https://www.amazon.co.uk/Everglide-Mounted-Stabilizer-Mechanical-Keyboard/dp/B09C4WRLHK/ref=sr_1_6?crid=B1RT91QW1W2F&keywords=Everglide%2BPanda%2BBlack%2BWhite%2BGold%2BPlated%2BPlate%2BMounted&qid=1648913546&sprefix=everglide%2Bpanda%2Bblack%2Bwhite%2Bgold%2Bplated%2Bplate%2Bmounted%2B%2Caps%2C85&sr=8-6&th=1)|
+
+On top of that you'll be needing:
+* Soldering iron
+* Solder wire (anything between 0.5mm to 1.2mm, preferable with lead 'Pb')
+* Sharp craft knife or wire stripper for cutting sections of insulation out of the wires
+* Shapie marker
+
+### **Remarks**
+
+* My plate was made by using the [Keyboard Layout Editor](http://www.keyboard-layout-editor.com/) to make my layout then copied and pasted the raw data into the [Builder](http://www.builder.swillkb.com/) so that I could then order my custom made stainless steel plate from Lasergist.
+* I used wire from cat7 cable to wire the switch matrix and used a sharp craft knife to cut them to length for the rows and the columns. I then placed and marked the sections to have the insultation removed with a shapie marker where they are to be soldered to the switches. Using the knife remove the marked insulation being careful not to cut through the wire. This part can take a while and is quite laborious to be honest so you may want to do this over a few days.
+
+# **Build guide**
+
+Make example for this keyboard (after setting up your build environment):
+
+ make jmspicotkl:default
+
+Flashing example for this keyboard:
+
+ just copy the newly created uf2 file onto your Pico once it's in the bootloader.
+
+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 (usually the top left key or Escape) and plug in the keyboard
+* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead
diff --git a/rules.mk b/rules.mk
new file mode 100644
index 0000000..132ed66
--- /dev/null
+++ b/rules.mk
@@ -0,0 +1,2 @@
+WPM_ENABLE = yes
+NO_USB_STARTUP_CHECK = yes