summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNes (Jordan) <jrdn.fish@gmail.com>2025-11-01 17:06:47 -0700
committerGitHub <noreply@github.com>2025-11-02 00:06:47 +0000
commita5fb7cfbc9f8e2eee6dcd46f3d47ec58fd539336 (patch)
tree63494dfdeb2166f829429e3923da25db35732229
parent62d87fa4464d601746343ca750de2ffa8cf4650e (diff)
Sofle pico (#25750)
-rw-r--r--keyboards/sofle_pico/config.h23
-rw-r--r--keyboards/sofle_pico/halconf.h7
-rw-r--r--keyboards/sofle_pico/keyboard.json239
-rw-r--r--keyboards/sofle_pico/keymaps/default/keymap.c53
-rw-r--r--keyboards/sofle_pico/keymaps/default/readme.md10
-rw-r--r--keyboards/sofle_pico/keymaps/default/rules.mk1
-rw-r--r--keyboards/sofle_pico/readme.md31
-rw-r--r--keyboards/sofle_pico/sofle_pico.c32
8 files changed, 396 insertions, 0 deletions
diff --git a/keyboards/sofle_pico/config.h b/keyboards/sofle_pico/config.h
new file mode 100644
index 0000000000..f4f34171fa
--- /dev/null
+++ b/keyboards/sofle_pico/config.h
@@ -0,0 +1,23 @@
1// Copyright 2024 Ryan Neff (@JellyTitan)
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6/* Use full duplex communication (TRRS) */
7#define SERIAL_USART_FULL_DUPLEX
8#define SERIAL_USART_TX_PIN GP16
9#define SERIAL_USART_RX_PIN GP17
10/* Swap TX and RX pins if keyboard is master half. Only available on some MCU's. This _is_ available on the RP2040 */
11#define SERIAL_USART_PIN_SWAP
12
13/* I2C for OLEDs */
14#define I2C_DRIVER I2CD1
15#define I2C1_SDA_PIN GP6
16#define I2C1_SCL_PIN GP7
17
18#define OLED_DISPLAY_128X64
19#define OLED_TIMEOUT 30000
20
21#define ENCODER_MAP_KEY_DELAY 10
22
23#define RGB_MATRIX_TYPING_HEATMAP_DECREASE_DELAY_MS 50
diff --git a/keyboards/sofle_pico/halconf.h b/keyboards/sofle_pico/halconf.h
new file mode 100644
index 0000000000..ed969d9afc
--- /dev/null
+++ b/keyboards/sofle_pico/halconf.h
@@ -0,0 +1,7 @@
1// Copyright 2024 Ryan Neff (@JellyTitan)
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6#define HAL_USE_I2C TRUE
7#include_next <halconf.h>
diff --git a/keyboards/sofle_pico/keyboard.json b/keyboards/sofle_pico/keyboard.json
new file mode 100644
index 0000000000..c57c4e8f9e
--- /dev/null
+++ b/keyboards/sofle_pico/keyboard.json
@@ -0,0 +1,239 @@
1{
2 "manufacturer": "Ryan Neff",
3 "keyboard_name": "Sofle Pico",
4 "maintainer": "Ryan Neff <github@JellyTitan.com>",
5 "bootloader": "rp2040",
6 "bootloader_instructions": "Hold the BOOT button while plugging in the usb cable",
7 "diode_direction": "COL2ROW",
8 "encoder": {
9 "rotary": [
10 {"pin_a": "GP14", "pin_b": "GP15"}
11 ]
12 },
13 "features": {
14 "bootmagic": true,
15 "encoder": true,
16 "extrakey": true,
17 "mousekey": true,
18 "nkro": true,
19 "oled": true,
20 "rgb_matrix": true
21 },
22 "matrix_pins": {
23 "cols": ["GP1", "GP2", "GP3", "GP4", "GP5", "GP8"],
24 "rows": ["GP9", "GP10", "GP11", "GP12", "GP13"]
25 },
26 "processor": "RP2040",
27 "rgb_matrix": {
28 "animations": {
29 "band_pinwheel_sat": true,
30 "band_pinwheel_val": true,
31 "band_sat": true,
32 "band_spiral_sat": true,
33 "band_spiral_val": true,
34 "band_val": true,
35 "breathing": true,
36 "cycle_all": true,
37 "cycle_left_right": true,
38 "cycle_out_in": true,
39 "cycle_out_in_dual": true,
40 "cycle_pinwheel": true,
41 "cycle_spiral": true,
42 "cycle_up_down": true,
43 "digital_rain": true,
44 "dual_beacon": true,
45 "gradient_left_right": true,
46 "gradient_up_down": true,
47 "hue_breathing": true,
48 "hue_pendulum": true,
49 "hue_wave": true,
50 "jellybean_raindrops": true,
51 "multisplash": true,
52 "pixel_flow": true,
53 "pixel_rain": true,
54 "rainbow_beacon": true,
55 "rainbow_moving_chevron": true,
56 "rainbow_pinwheels": true,
57 "raindrops": true,
58 "solid_multisplash": true,
59 "solid_reactive": true,
60 "solid_reactive_cross": true,
61 "solid_reactive_multicross": true,
62 "solid_reactive_multinexus": true,
63 "solid_reactive_multiwide": true,
64 "solid_reactive_nexus": true,
65 "solid_reactive_simple": true,
66 "solid_reactive_wide": true,
67 "solid_splash": true,
68 "splash": true,
69 "typing_heatmap": true
70 },
71 "default": {
72 "animation": "cycle_out_in_dual",
73 "speed": 16
74 },
75 "driver": "ws2812",
76 "layout": [
77 {"matrix": [0, 5], "x": 95, "y": 7, "flags": 4},
78 {"matrix": [1, 5], "x": 95, "y": 21, "flags": 4},
79 {"matrix": [2, 5], "x": 95, "y": 36, "flags": 4},
80 {"matrix": [3, 5], "x": 95, "y": 50, "flags": 4},
81 {"matrix": [4, 4], "x": 115, "y": 64, "flags": 4},
82 {"matrix": [4, 3], "x": 95, "y": 64, "flags": 4},
83 {"matrix": [4, 2], "x": 76, "y": 62, "flags": 4},
84 {"matrix": [3, 4], "x": 76, "y": 48, "flags": 4},
85 {"matrix": [2, 4], "x": 76, "y": 33, "flags": 4},
86 {"matrix": [1, 4], "x": 76, "y": 19, "flags": 4},
87 {"matrix": [0, 4], "x": 76, "y": 5, "flags": 4},
88 {"matrix": [0, 3], "x": 57, "y": 3, "flags": 4},
89 {"matrix": [1, 3], "x": 57, "y": 17, "flags": 4},
90 {"matrix": [2, 3], "x": 57, "y": 31, "flags": 4},
91 {"matrix": [3, 3], "x": 57, "y": 46, "flags": 4},
92 {"matrix": [4, 1], "x": 57, "y": 62, "flags": 4},
93 {"matrix": [4, 0], "x": 38, "y": 64, "flags": 4},
94 {"matrix": [3, 2], "x": 38, "y": 48, "flags": 4},
95 {"matrix": [2, 2], "x": 38, "y": 33, "flags": 4},
96 {"matrix": [1, 2], "x": 38, "y": 19, "flags": 4},
97 {"matrix": [0, 2], "x": 38, "y": 5, "flags": 4},
98 {"matrix": [0, 1], "x": 19, "y": 7, "flags": 4},
99 {"matrix": [1, 1], "x": 19, "y": 21, "flags": 4},
100 {"matrix": [2, 1], "x": 19, "y": 36, "flags": 4},
101 {"matrix": [3, 1], "x": 19, "y": 50, "flags": 4},
102 {"matrix": [3, 0], "x": 0, "y": 50, "flags": 4},
103 {"matrix": [2, 0], "x": 0, "y": 36, "flags": 4},
104 {"matrix": [1, 0], "x": 0, "y": 21, "flags": 4},
105 {"matrix": [0, 0], "x": 0, "y": 7, "flags": 4},
106 {"matrix": [5, 5], "x": 129, "y": 7, "flags": 4},
107 {"matrix": [6, 5], "x": 129, "y": 21, "flags": 4},
108 {"matrix": [7, 5], "x": 129, "y": 36, "flags": 4},
109 {"matrix": [8, 5], "x": 129, "y": 50, "flags": 4},
110 {"matrix": [9, 4], "x": 119, "y": 64, "flags": 4},
111 {"matrix": [9, 3], "x": 129, "y": 64, "flags": 4},
112 {"matrix": [9, 2], "x": 148, "y": 62, "flags": 4},
113 {"matrix": [8, 4], "x": 148, "y": 48, "flags": 4},
114 {"matrix": [7, 4], "x": 148, "y": 33, "flags": 4},
115 {"matrix": [6, 4], "x": 148, "y": 19, "flags": 4},
116 {"matrix": [5, 4], "x": 148, "y": 5, "flags": 4},
117 {"matrix": [5, 3], "x": 167, "y": 3, "flags": 4},
118 {"matrix": [6, 3], "x": 167, "y": 17, "flags": 4},
119 {"matrix": [7, 3], "x": 167, "y": 31, "flags": 4},
120 {"matrix": [8, 3], "x": 167, "y": 46, "flags": 4},
121 {"matrix": [9, 1], "x": 167, "y": 62, "flags": 4},
122 {"matrix": [9, 0], "x": 186, "y": 64, "flags": 4},
123 {"matrix": [8, 2], "x": 186, "y": 48, "flags": 4},
124 {"matrix": [7, 2], "x": 186, "y": 33, "flags": 4},
125 {"matrix": [6, 2], "x": 186, "y": 19, "flags": 4},
126 {"matrix": [5, 2], "x": 186, "y": 5, "flags": 4},
127 {"matrix": [5, 1], "x": 209, "y": 7, "flags": 4},
128 {"matrix": [6, 1], "x": 209, "y": 21, "flags": 4},
129 {"matrix": [7, 1], "x": 209, "y": 36, "flags": 4},
130 {"matrix": [8, 1], "x": 209, "y": 50, "flags": 4},
131 {"matrix": [8, 0], "x": 224, "y": 50, "flags": 4},
132 {"matrix": [7, 0], "x": 224, "y": 36, "flags": 4},
133 {"matrix": [6, 0], "x": 224, "y": 21, "flags": 4},
134 {"matrix": [5, 0], "x": 224, "y": 7, "flags": 4}
135 ],
136 "max_brightness": 127,
137 "sleep": true,
138 "split_count": [29, 29]
139 },
140 "split": {
141 "bootmagic": {
142 "matrix": [5, 0]
143 },
144 "enabled": true,
145 "encoder": {
146 "right": {
147 "rotary": [
148 {"pin_a": "GP14", "pin_b": "GP15"}
149 ]
150 }
151 },
152 "serial": {
153 "driver": "vendor"
154 },
155 "transport": {
156 "sync": {
157 "layer_state": true,
158 "matrix_state": true
159 }
160 }
161 },
162 "tags": ["ortho", "split", "rgb", "encoder", "OLED", "128x64", "tenting_puck"],
163 "url": "https://github.com/JellyTitan/Sofle-Pico",
164 "usb": {
165 "device_version": "3.5.4",
166 "pid": "0x5350",
167 "vid": "0x4A54"
168 },
169 "ws2812": {
170 "driver": "vendor",
171 "pin": "GP0"
172 },
173 "layouts": {
174 "LAYOUT": {
175 "layout": [
176 {"label": "`", "matrix": [0, 0], "x": 0, "y": 0.7},
177 {"label": "1", "matrix": [0, 1], "x": 1, "y": 0.7},
178 {"label": "2", "matrix": [0, 2], "x": 2, "y": 0.3},
179 {"label": "3", "matrix": [0, 3], "x": 3, "y": 0},
180 {"label": "4", "matrix": [0, 4], "x": 4, "y": 0.3},
181 {"label": "5", "matrix": [0, 5], "x": 5, "y": 0.45},
182 {"label": "6", "matrix": [5, 5], "x": 9, "y": 0.45},
183 {"label": "7", "matrix": [5, 4], "x": 10, "y": 0.3},
184 {"label": "8", "matrix": [5, 3], "x": 11, "y": 0},
185 {"label": "9", "matrix": [5, 2], "x": 12, "y": 0.3},
186 {"label": "0", "matrix": [5, 1], "x": 13, "y": 0.7},
187 {"label": "`", "matrix": [5, 0], "x": 14, "y": 0.7},
188 {"label": "Esc", "matrix": [1, 0], "x": 0, "y": 1.7},
189 {"label": "Q", "matrix": [1, 1], "x": 1, "y": 1.7},
190 {"label": "W", "matrix": [1, 2], "x": 2, "y": 1.3},
191 {"label": "E", "matrix": [1, 3], "x": 3, "y": 1},
192 {"label": "R", "matrix": [1, 4], "x": 4, "y": 1.3},
193 {"label": "T", "matrix": [1, 5], "x": 5, "y": 1.45},
194 {"label": "Y", "matrix": [6, 5], "x": 9, "y": 1.45},
195 {"label": "U", "matrix": [6, 4], "x": 10, "y": 1.3},
196 {"label": "I", "matrix": [6, 3], "x": 11, "y": 1},
197 {"label": "O", "matrix": [6, 2], "x": 12, "y": 1.3},
198 {"label": "P", "matrix": [6, 1], "x": 13, "y": 1.7},
199 {"label": "Bspc", "matrix": [6, 0], "x": 14, "y": 1.7},
200 {"label": "Tab", "matrix": [2, 0], "x": 0, "y": 2.7},
201 {"label": "A", "matrix": [2, 1], "x": 1, "y": 2.7},
202 {"label": "S", "matrix": [2, 2], "x": 2, "y": 2.3},
203 {"label": "D", "matrix": [2, 3], "x": 3, "y": 2},
204 {"label": "F", "matrix": [2, 4], "x": 4, "y": 2.3},
205 {"label": "G", "matrix": [2, 5], "x": 5, "y": 2.45},
206 {"label": "H", "matrix": [7, 5], "x": 9, "y": 2.45},
207 {"label": "J", "matrix": [7, 4], "x": 10, "y": 2.3},
208 {"label": "K", "matrix": [7, 3], "x": 11, "y": 2},
209 {"label": "L", "matrix": [7, 2], "x": 12, "y": 2.3},
210 {"label": ";", "matrix": [7, 1], "x": 13, "y": 2.7},
211 {"label": "'", "matrix": [7, 0], "x": 14, "y": 2.7},
212 {"label": "LShift", "matrix": [3, 0], "x": 0, "y": 3.7},
213 {"label": "Z", "matrix": [3, 1], "x": 1, "y": 3.7},
214 {"label": "X", "matrix": [3, 2], "x": 2, "y": 3.3},
215 {"label": "C", "matrix": [3, 3], "x": 3, "y": 3},
216 {"label": "V", "matrix": [3, 4], "x": 4, "y": 3.3},
217 {"label": "B", "matrix": [3, 5], "x": 5, "y": 3.45},
218 {"label": "Mute", "matrix": [4, 5], "x": 6.2, "y": 3.45},
219 {"label": "Pause", "matrix": [9, 5], "x": 7.8, "y": 3.45},
220 {"label": "N", "matrix": [8, 5], "x": 9, "y": 3.45},
221 {"label": "M", "matrix": [8, 4], "x": 10, "y": 3.3},
222 {"label": ",", "matrix": [8, 3], "x": 11, "y": 3},
223 {"label": ".", "matrix": [8, 2], "x": 12, "y": 3.3},
224 {"label": "/", "matrix": [8, 1], "x": 13, "y": 3.7},
225 {"label": "RShift", "matrix": [8, 0], "x": 14, "y": 3.7},
226 {"label": "LCtrl", "matrix": [4, 0], "x": 2, "y": 4.3},
227 {"label": "LGUI", "matrix": [4, 1], "x": 3, "y": 4},
228 {"label": "LCmnd", "matrix": [4, 2], "x": 4, "y": 4.3},
229 {"label": "LAlt", "matrix": [4, 3], "x": 5.1, "y": 4.5, "h": 1.5},
230 {"label": "Enter", "matrix": [4, 4], "x": 6.1, "y": 4.5, "h": 1.5},
231 {"label": "Space", "matrix": [9, 4], "x": 7.9, "y": 4.5, "h": 1.5},
232 {"label": "RAlt", "matrix": [9, 3], "x": 8.9, "y": 4.5, "h": 1.5},
233 {"label": "RCmnd", "matrix": [9, 2], "x": 10, "y": 4.3},
234 {"label": "RGui", "matrix": [9, 1], "x": 11, "y": 4},
235 {"label": "RCtrl", "matrix": [9, 0], "x": 12, "y": 4.3}
236 ]
237 }
238 }
239}
diff --git a/keyboards/sofle_pico/keymaps/default/keymap.c b/keyboards/sofle_pico/keymaps/default/keymap.c
new file mode 100644
index 0000000000..a09f32fc37
--- /dev/null
+++ b/keyboards/sofle_pico/keymaps/default/keymap.c
@@ -0,0 +1,53 @@
1// Copyright 2024 Ryan Neff (@JellyTitan)
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#include QMK_KEYBOARD_H
5
6enum sofle_layers {
7 _QWERTY,
8 _LOWER,
9 _RAISE,
10 _ADJUST,
11};
12
13const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
14 // clang-format off
15 [_QWERTY] = LAYOUT(
16 KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_GRV,
17 KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
18 KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
19 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_MUTE, XXXXXXX, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
20 KC_LGUI, KC_LALT, KC_LCTL, TL_LOWR, KC_ENT, KC_SPC , TL_UPPR, KC_RCTL, KC_RALT, KC_RGUI
21 ),
22 [_LOWER] = LAYOUT(
23 _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
24 KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_F12,
25 _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PIPE,
26 _______, KC_EQL, KC_MINS, KC_PLUS, KC_LCBR, KC_RCBR, _______, _______, KC_LBRC, KC_RBRC, KC_SCLN, KC_COLN, KC_BSLS, _______,
27 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
28 ),
29 [_RAISE] = LAYOUT(
30 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
31 _______, KC_INS, KC_PSCR, KC_APP, XXXXXXX, XXXXXXX, KC_PGUP, XXXXXXX, KC_UP , XXXXXXX, XXXXXXX, KC_BSPC,
32 _______, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_CAPS, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL , KC_BSPC,
33 _______, C(KC_Z), C(KC_X), C(KC_C), C(KC_V), XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
34 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
35 ),
36 [_ADJUST] = LAYOUT(
37 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RM_TOGG, RM_VALU, RM_VALD, XXXXXXX, XXXXXXX, XXXXXXX,
38 QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, CG_TOGG, XXXXXXX, RM_NEXT, RM_PREV, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
39 XXXXXXX, XXXXXXX, CG_TOGG, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, XXXXXXX, XXXXXXX,
40 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX,
41 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
42 )
43 // clang-format on
44};
45
46#ifdef ENCODER_MAP_ENABLE
47const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
48 [0] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU)},
49 [1] = {ENCODER_CCW_CW(KC_PGUP, KC_PGDN)},
50 [2] = {ENCODER_CCW_CW(_______, _______)},
51 [3] = {ENCODER_CCW_CW(_______, _______)},
52};
53#endif
diff --git a/keyboards/sofle_pico/keymaps/default/readme.md b/keyboards/sofle_pico/keymaps/default/readme.md
new file mode 100644
index 0000000000..a15159d07c
--- /dev/null
+++ b/keyboards/sofle_pico/keymaps/default/readme.md
@@ -0,0 +1,10 @@
1![SofleKeyboard default keymap](https://i.imgur.com/MZxVvm9.png)
2![SofleKeyboard adjust layer](https://i.imgur.com/f5sKy0I.png)
3
4
5# Default keymap for Sofle Pico Keyboard
6
7Adapted from the classic Sofle Keyboard by Josef Adamcik.
8Simplified to serve as a starting point for further customizations.
9Layout in [Keyboard Layout Editor](http://www.keyboard-layout-editor.com/#/gists/76efb423a46cbbea75465cb468eef7ff)
10Left encoder controls volume up/down/mute. Right encoder PGUP/PGDOWN.
diff --git a/keyboards/sofle_pico/keymaps/default/rules.mk b/keyboards/sofle_pico/keymaps/default/rules.mk
new file mode 100644
index 0000000000..7c9bf212a6
--- /dev/null
+++ b/keyboards/sofle_pico/keymaps/default/rules.mk
@@ -0,0 +1 @@
TRI_LAYER_ENABLE = yes
diff --git a/keyboards/sofle_pico/readme.md b/keyboards/sofle_pico/readme.md
new file mode 100644
index 0000000000..34498d0c1b
--- /dev/null
+++ b/keyboards/sofle_pico/readme.md
@@ -0,0 +1,31 @@
1# Sofle Pico Keyboard
2
3![Sofle Pico](https://i.imgur.com/9VBj3T5.jpeg)
4![Sofle Pico PCB](https://i.imgur.com/8SDTm4h.jpeg)
5Sofle Pico is a 60% Raspberry Pi Pico powered split keyboard boasting a 4x6 layout with an aggressive columnar stagger. It has 5 "thumb" keys on either side, support for 2-4 rotary encoders, per-key RGB lighting, 128x64 OLEDs and a tenting puck mount.
6
7- Keyboard Maintainer: [Ryan Neff](https://github.com/JellyTitan)
8- Hardware Supported: Sofle Pico PCB v3.5.x, Raspberry Pi Pico
9- Hardware Availability: [PCB, Case, Parts List](https://github.com/JellyTitan/Sofle-Pico)
10
11Remember you have to flash both halves of the keyboard for it to work!
12
13Make example for this keyboard (after setting up your build environment):
14
15 make sofle_pico:default
16
17Flashing example for this keyboard:
18
19 make sofle_pico:default:flash
20
21See 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).
22
23## Bootloader
24
25Enter the bootloader in 3 ways:
26
27- **Bootmagic reset** (works after you have flashed once): Hold down the top far corner key while plugging in the keyboard (`~` left half, `-` right half). This will also clear the EEPROM.
28- **Physical reset button**: Hold the `BOOT` button on the Pico and press the `RST` button on the Pico, release the the `RST` button before the `BOOT` button.
29- **Keycode in layout**: In the default layout, the `Bootloader` keycode is above home row pinky on the right side's adjust layer.
30
31Once you enter the bootloader, the keyboard will show up as a USB device on your computer, you could drag and drop a `.uf2` firmware file to flash it.
diff --git a/keyboards/sofle_pico/sofle_pico.c b/keyboards/sofle_pico/sofle_pico.c
new file mode 100644
index 0000000000..b237dfc599
--- /dev/null
+++ b/keyboards/sofle_pico/sofle_pico.c
@@ -0,0 +1,32 @@
1// Copyright 2024 Ryan Neff (@JellyTitan)
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#include "quantum.h"
5
6#ifdef OLED_ENABLE
7
8oled_rotation_t oled_init_kb(oled_rotation_t rotation) {
9 return OLED_ROTATION_90;
10}
11
12static void render_logo(void) {
13 static const char PROGMEM sofle_pico_logo[] = {
14 0x00, 0x00, 0x00, 0x00, 0xc0, 0xe0, 0xe0, 0xf0, 0xf0, 0xf0, 0x70, 0xf0, 0xf0, 0xe0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xf0, 0xf8, 0xfc, 0x3c, 0x3c, 0x3c, 0x7c, 0xf8, 0xf8, 0xf0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x1f, 0x3f, 0x3f, 0x3f, 0x7c, 0x78, 0xf8, 0xf8, 0xf0, 0xe0, 0x00, 0x00, 0xc0, 0xf0, 0xf8, 0xfc, 0x3c, 0x1c, 0x1e, 0x1e, 0x3c, 0xfc, 0xf8, 0xf0, 0xc0, 0x00, 0x1c, 0x1c, 0xff, 0xff, 0xff, 0xff, 0x1c, 0x1c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xc0, 0xf0, 0xf8, 0xfc, 0xfc, 0xce, 0xce, 0xce, 0xdc, 0xfc, 0xfc, 0xf8, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1e, 0x1e, 0x1e, 0x3c, 0x3c, 0x3c, 0x3e, 0x1f, 0x1f, 0x0f, 0x07, 0x01, 0x00, 0x01, 0x07,
15 0x0f, 0x1f, 0x1e, 0x3c, 0x3c, 0x3c, 0x1e, 0x1f, 0x0f, 0x07, 0x03, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x1f, 0x1f, 0x00, 0x00, 0x01, 0x07, 0x0f, 0x1f, 0x1f, 0x3c, 0x38, 0x38, 0x3c, 0x1c, 0x1c, 0x0c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x06, 0x06, 0x06, 0x0e, 0x9e, 0xfc, 0xf8, 0x00, 0x00, 0x8e, 0x8e, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 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, 0xff, 0xff, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x7c, 0xfe, 0xff, 0x83, 0x01, 0x01, 0x01, 0x83, 0x83, 0x00, 0x00, 0x7e, 0xff, 0xc7, 0x83, 0x01, 0x01, 0x01,
16 0x83, 0xff, 0xff, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xc3, 0xe3, 0xe0, 0xe0, 0xe0, 0xf0, 0x70, 0x70, 0x70, 0x70, 0x30, 0x33, 0x73, 0xe0, 0x60, 0xe0, 0xe0, 0xc0, 0xc1, 0x83, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x80, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0x70, 0x30, 0x70, 0x70, 0x70, 0x70, 0x70, 0xf0, 0xe0, 0xe0, 0xe0, 0xc0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1f, 0xff, 0xf8, 0xd0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x20, 0x40, 0xc0, 0x80, 0x00, 0x01, 0x87, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xff, 0xff, 0x03, 0x01, 0x00, 0x80, 0xc0, 0x40, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
17 0xf0, 0xf8, 0x7f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0f, 0x1c, 0x1c, 0x38, 0x78, 0x60, 0x60, 0x60, 0x60, 0x60, 0x70, 0x38, 0x39, 0xdf, 0xef, 0xf7, 0x7b, 0x39, 0x1c, 0x1c, 0x0e, 0x0e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0e, 0x0e, 0x1e, 0x1c, 0x3c, 0x79, 0xfb, 0xf7, 0xef, 0x9f, 0x38, 0x30, 0x70, 0x60, 0x60, 0x60, 0x60, 0x70, 0x38, 0x3c, 0x1c, 0x0f, 0x0f, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xe0, 0xf8, 0xfc, 0x7e, 0x7f, 0xff, 0xff, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0xff, 0x7f, 0x7f, 0x3f, 0x7c, 0xf8, 0xf0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
18 0x00, 0x00, 0x7f, 0xff, 0x81, 0x00, 0x00, 0x00, 0x00, 0x01, 0xcf, 0xff, 0xfe, 0x7c, 0x78, 0x78, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x38, 0x78, 0x78, 0x7c, 0xfe, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 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, 0x01, 0x03, 0x07, 0x0f, 0x0e, 0x1e, 0x3f, 0x7f, 0xf1, 0xe0, 0xc0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xc0, 0xe1, 0xf3, 0x7f, 0x3f, 0x1f, 0x0f, 0x07, 0x07, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03,
19 0x03, 0x03, 0x03, 0x03, 0x03, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
20 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
21 oled_write_raw_P(sofle_pico_logo, sizeof(sofle_pico_logo));
22}
23
24bool oled_task_kb(void) {
25 if (!oled_task_user()) {
26 return false;
27 }
28 render_logo();
29 return false;
30}
31
32#endif