aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndré Cruz <[email protected]>2025-03-13 21:04:32 +0000
committerGitHub <[email protected]>2025-03-13 14:04:32 -0700
commit65aef7be95025a8a26fa8fe0c4af3ce0d36f47f4 (patch)
treed642d8d8812b9d5a6266df478713b5b65113b4e4
parent8ae5d34c0db1cabe2a8de9aa5213a769b1d4ef8d (diff)
downloadqmk_firmware-65aef7be95025a8a26fa8fe0c4af3ce0d36f47f4.tar.gz
qmk_firmware-65aef7be95025a8a26fa8fe0c4af3ce0d36f47f4.zip
[Keyboard] Add Sofle Choc Prog from keebart (#24974)
-rw-r--r--keyboards/keebart/sofle_choc_pro/config.h10
-rw-r--r--keyboards/keebart/sofle_choc_pro/keyboard.json235
-rw-r--r--keyboards/keebart/sofle_choc_pro/keymaps/default/keymap.c49
-rw-r--r--keyboards/keebart/sofle_choc_pro/keymaps/default/rules.mk1
-rw-r--r--keyboards/keebart/sofle_choc_pro/readme.md28
5 files changed, 323 insertions, 0 deletions
diff --git a/keyboards/keebart/sofle_choc_pro/config.h b/keyboards/keebart/sofle_choc_pro/config.h
new file mode 100644
index 0000000000..5c9b6ff8f1
--- /dev/null
+++ b/keyboards/keebart/sofle_choc_pro/config.h
@@ -0,0 +1,10 @@
+// Copyright 2023 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#define USB_VBUS_PIN GP13
+
+/* RP2040- and hardware-specific config */
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 500U
+#define PICO_XOSC_STARTUP_DELAY_MULTIPLIER 64
diff --git a/keyboards/keebart/sofle_choc_pro/keyboard.json b/keyboards/keebart/sofle_choc_pro/keyboard.json
new file mode 100644
index 0000000000..a1ba222388
--- /dev/null
+++ b/keyboards/keebart/sofle_choc_pro/keyboard.json
@@ -0,0 +1,235 @@
+{
+ "manufacturer": "Keebart",
+ "keyboard_name": "sofle_choc_pro",
+ "maintainer": "Keebart",
+ "bootloader": "rp2040",
+ "diode_direction": "COL2ROW",
+ "encoder": {
+ "rotary": [
+ {"pin_a": "GP23", "pin_b": "GP22"}
+ ]
+ },
+ "features": {
+ "bootmagic": true,
+ "encoder": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgb_matrix": true
+ },
+ "matrix_pins": {
+ "cols": ["GP27", "GP26", "GP25", "GP24", "GP19", "GP18"],
+ "rows": ["GP0", "GP1", "GP2", "GP3", "GP4"]
+ },
+ "processor": "RP2040",
+ "rgb_matrix": {
+ "animations": {
+ "alphas_mods": true,
+ "band_pinwheel_sat": true,
+ "band_pinwheel_val": true,
+ "band_sat": true,
+ "band_spiral_sat": true,
+ "band_spiral_val": true,
+ "band_val": true,
+ "breathing": true,
+ "cycle_all": true,
+ "cycle_left_right": true,
+ "cycle_out_in": true,
+ "cycle_out_in_dual": true,
+ "cycle_pinwheel": true,
+ "cycle_spiral": true,
+ "cycle_up_down": true,
+ "digital_rain": true,
+ "dual_beacon": true,
+ "gradient_left_right": true,
+ "gradient_up_down": true,
+ "hue_breathing": true,
+ "hue_pendulum": true,
+ "hue_wave": true,
+ "jellybean_raindrops": true,
+ "multisplash": true,
+ "pixel_flow": true,
+ "pixel_fractal": true,
+ "pixel_rain": true,
+ "rainbow_beacon": true,
+ "rainbow_moving_chevron": true,
+ "rainbow_pinwheels": true,
+ "raindrops": true,
+ "solid_multisplash": true,
+ "solid_reactive": true,
+ "solid_reactive_cross": true,
+ "solid_reactive_multicross": true,
+ "solid_reactive_multinexus": true,
+ "solid_reactive_multiwide": true,
+ "solid_reactive_nexus": true,
+ "solid_reactive_simple": true,
+ "solid_reactive_wide": true,
+ "solid_splash": true,
+ "splash": true,
+ "typing_heatmap": true
+ },
+ "driver": "ws2812",
+ "layout": [
+ {"matrix": [4, 5], "x": 99, "y": 38, "flags": 4},
+ {"matrix": [4, 4], "x": 91, "y": 64, "flags": 4},
+ {"matrix": [4, 3], "x": 77, "y": 60, "flags": 4},
+ {"matrix": [3, 5], "x": 82, "y": 45, "flags": 4},
+ {"matrix": [2, 5], "x": 82, "y": 31, "flags": 4},
+ {"matrix": [1, 5], "x": 82, "y": 17, "flags": 4},
+ {"matrix": [0, 5], "x": 82, "y": 3, "flags": 4},
+ {"matrix": [0, 4], "x": 66, "y": 2, "flags": 4},
+ {"matrix": [1, 4], "x": 66, "y": 16, "flags": 4},
+ {"matrix": [2, 4], "x": 66, "y": 29, "flags": 4},
+ {"matrix": [3, 4], "x": 66, "y": 43, "flags": 4},
+ {"matrix": [4, 2], "x": 58, "y": 59, "flags": 4},
+ {"matrix": [4, 1], "x": 41, "y": 59, "flags": 4},
+ {"matrix": [3, 3], "x": 49, "y": 41, "flags": 4},
+ {"matrix": [2, 3], "x": 49, "y": 28, "flags": 4},
+ {"matrix": [1, 3], "x": 49, "y": 16, "flags": 4},
+ {"matrix": [0, 3], "x": 49, "y": 0, "flags": 4},
+ {"matrix": [0, 2], "x": 33, "y": 2, "flags": 4},
+ {"matrix": [1, 2], "x": 33, "y": 16, "flags": 4},
+ {"matrix": [2, 2], "x": 33, "y": 29, "flags": 4},
+ {"matrix": [3, 2], "x": 33, "y": 43, "flags": 4},
+ {"matrix": [4, 0], "x": 25, "y": 60, "flags": 4},
+ {"matrix": [3, 1], "x": 16, "y": 47, "flags": 4},
+ {"matrix": [2, 1], "x": 16, "y": 33, "flags": 4},
+ {"matrix": [1, 1], "x": 16, "y": 19, "flags": 4},
+ {"matrix": [0, 1], "x": 16, "y": 5, "flags": 4},
+ {"matrix": [0, 0], "x": 0, "y": 5, "flags": 4},
+ {"matrix": [1, 0], "x": 0, "y": 19, "flags": 4},
+ {"matrix": [2, 0], "x": 0, "y": 33, "flags": 4},
+ {"matrix": [3, 0], "x": 0, "y": 47, "flags": 4},
+ {"matrix": [9, 5], "x": 125, "y": 38, "flags": 4},
+ {"matrix": [9, 4], "x": 134, "y": 64, "flags": 4},
+ {"matrix": [9, 3], "x": 147, "y": 60, "flags": 4},
+ {"matrix": [8, 5], "x": 142, "y": 45, "flags": 4},
+ {"matrix": [7, 5], "x": 142, "y": 31, "flags": 4},
+ {"matrix": [6, 5], "x": 142, "y": 17, "flags": 4},
+ {"matrix": [5, 5], "x": 142, "y": 3, "flags": 4},
+ {"matrix": [5, 4], "x": 158, "y": 2, "flags": 4},
+ {"matrix": [6, 4], "x": 158, "y": 16, "flags": 4},
+ {"matrix": [7, 4], "x": 158, "y": 29, "flags": 4},
+ {"matrix": [8, 4], "x": 158, "y": 43, "flags": 4},
+ {"matrix": [9, 2], "x": 166, "y": 59, "flags": 4},
+ {"matrix": [9, 1], "x": 183, "y": 59, "flags": 4},
+ {"matrix": [8, 3], "x": 175, "y": 41, "flags": 4},
+ {"matrix": [7, 3], "x": 175, "y": 28, "flags": 4},
+ {"matrix": [6, 3], "x": 175, "y": 16, "flags": 4},
+ {"matrix": [5, 3], "x": 175, "y": 0, "flags": 4},
+ {"matrix": [5, 2], "x": 191, "y": 2, "flags": 4},
+ {"matrix": [6, 2], "x": 191, "y": 16, "flags": 4},
+ {"matrix": [7, 2], "x": 191, "y": 29, "flags": 4},
+ {"matrix": [8, 2], "x": 191, "y": 43, "flags": 4},
+ {"matrix": [9, 0], "x": 199, "y": 60, "flags": 4},
+ {"matrix": [8, 1], "x": 208, "y": 47, "flags": 4},
+ {"matrix": [7, 1], "x": 208, "y": 33, "flags": 4},
+ {"matrix": [6, 1], "x": 208, "y": 19, "flags": 4},
+ {"matrix": [5, 1], "x": 208, "y": 5, "flags": 4},
+ {"matrix": [5, 0], "x": 224, "y": 5, "flags": 4},
+ {"matrix": [6, 0], "x": 224, "y": 19, "flags": 4},
+ {"matrix": [7, 0], "x": 224, "y": 33, "flags": 4},
+ {"matrix": [8, 0], "x": 224, "y": 47, "flags": 4}
+ ],
+ "max_brightness": 50,
+ "sleep": true,
+ "split_count": [30, 30]
+ },
+ "split": {
+ "bootmagic": {
+ "matrix": [5, 0]
+ },
+ "enabled": true,
+ "handedness": {
+ "pin": "GP21"
+ },
+ "serial": {
+ "driver": "vendor",
+ "pin": "GP12"
+ },
+ "transport": {
+ "sync": {
+ "indicators": true,
+ "layer_state": true,
+ "matrix_state": true
+ }
+ }
+ },
+ "url": "https://keebart.com/products/sofle",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x0000",
+ "suspend_wakeup_delay": 200,
+ "vid": "0xFEED"
+ },
+ "ws2812": {
+ "driver": "vendor",
+ "pin": "GP10"
+ },
+ "layouts": {
+ "LAYOUT_split_4x6_5": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0.375},
+ {"matrix": [0, 1], "x": 1, "y": 0.375},
+ {"matrix": [0, 2], "x": 2, "y": 0.125},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0.125},
+ {"matrix": [0, 5], "x": 5, "y": 0.25},
+ {"matrix": [5, 5], "x": 9, "y": 0.25},
+ {"matrix": [5, 4], "x": 10, "y": 0.125},
+ {"matrix": [5, 3], "x": 11, "y": 0},
+ {"matrix": [5, 2], "x": 12, "y": 0.125},
+ {"matrix": [5, 1], "x": 13, "y": 0.375},
+ {"matrix": [5, 0], "x": 14, "y": 0.375},
+ {"matrix": [1, 0], "x": 0, "y": 1.375},
+ {"matrix": [1, 1], "x": 1, "y": 1.375},
+ {"matrix": [1, 2], "x": 2, "y": 1.125},
+ {"matrix": [1, 3], "x": 3, "y": 1},
+ {"matrix": [1, 4], "x": 4, "y": 1.125},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [6, 5], "x": 9, "y": 1.25},
+ {"matrix": [6, 4], "x": 10, "y": 1.125},
+ {"matrix": [6, 3], "x": 11, "y": 1},
+ {"matrix": [6, 2], "x": 12, "y": 1.125},
+ {"matrix": [6, 1], "x": 13, "y": 1.375},
+ {"matrix": [6, 0], "x": 14, "y": 1.375},
+ {"matrix": [2, 0], "x": 0, "y": 2.375},
+ {"matrix": [2, 1], "x": 1, "y": 2.375},
+ {"matrix": [2, 2], "x": 2, "y": 2.125},
+ {"matrix": [2, 3], "x": 3, "y": 2},
+ {"matrix": [2, 4], "x": 4, "y": 2.125},
+ {"matrix": [2, 5], "x": 5, "y": 2.25},
+ {"matrix": [7, 5], "x": 9, "y": 2.25},
+ {"matrix": [7, 4], "x": 10, "y": 2.125},
+ {"matrix": [7, 3], "x": 11, "y": 2},
+ {"matrix": [7, 2], "x": 12, "y": 2.125},
+ {"matrix": [7, 1], "x": 13, "y": 2.375},
+ {"matrix": [7, 0], "x": 14, "y": 2.375},
+ {"matrix": [3, 0], "x": 0, "y": 3.375},
+ {"matrix": [3, 1], "x": 1, "y": 3.375},
+ {"matrix": [3, 2], "x": 2, "y": 3.125},
+ {"matrix": [3, 3], "x": 3, "y": 3},
+ {"matrix": [3, 4], "x": 4, "y": 3.125},
+ {"matrix": [3, 5], "x": 5, "y": 3.25},
+ {"matrix": [4, 5], "x": 6, "y": 2.75},
+ {"matrix": [9, 5], "x": 8, "y": 2.75},
+ {"matrix": [8, 5], "x": 9, "y": 3.25},
+ {"matrix": [8, 4], "x": 10, "y": 3.125},
+ {"matrix": [8, 3], "x": 11, "y": 3},
+ {"matrix": [8, 2], "x": 12, "y": 3.125},
+ {"matrix": [8, 1], "x": 13, "y": 3.375},
+ {"matrix": [8, 0], "x": 14, "y": 3.375},
+ {"matrix": [4, 0], "x": 1.5, "y": 4.375},
+ {"matrix": [4, 1], "x": 2.5, "y": 4.25},
+ {"matrix": [4, 2], "x": 3.5, "y": 4.25},
+ {"matrix": [4, 3], "x": 4.5, "y": 4.375},
+ {"matrix": [4, 4], "x": 6, "y": 4.375, "h": 1.5},
+ {"matrix": [9, 4], "x": 8, "y": 4.375, "h": 1.5},
+ {"matrix": [9, 3], "x": 9.5, "y": 4.375},
+ {"matrix": [9, 2], "x": 10.5, "y": 4.25},
+ {"matrix": [9, 1], "x": 11.5, "y": 4.25},
+ {"matrix": [9, 0], "x": 12.5, "y": 4.375}
+ ]
+ }
+ }
+}
diff --git a/keyboards/keebart/sofle_choc_pro/keymaps/default/keymap.c b/keyboards/keebart/sofle_choc_pro/keymaps/default/keymap.c
new file mode 100644
index 0000000000..c6f33d9c56
--- /dev/null
+++ b/keyboards/keebart/sofle_choc_pro/keymaps/default/keymap.c
@@ -0,0 +1,49 @@
+// Copyright 2023 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+enum layers {
+ BASE, // default layer
+ MDIA, // media keys
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/*
+ * QWERTY
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bspc |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | CAPS | A | S | D | F | G |-------. ,-------| H | J | K | L | ; | ' |
+ * |------+------+------+------+------+------| Mute | | Pause |------+------+------+------+------+------|
+ * |LShift| Z | X | C | V | B |-------| |-------| N | M | , | . | / |RShift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LCTL | LALT | LCMD | LGUI | /Enter / \Space \ | RGUI | DEL | RALT | RCTL |
+ * | | | | LT1 |/ / \ \ | LT1 | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+
+[BASE] = LAYOUT_split_4x6_5(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_GRV,
+ 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_CAPS, 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_MUTE, KC_MPLY, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LCTL, KC_LALT, KC_LCMD, LT(MDIA,KC_LGUI), KC_ENT, KC_SPC, LT(MDIA,KC_RGUI), KC_DEL, KC_RALT, KC_RCTL
+),
+[MDIA] = LAYOUT_split_4x6_5(
+ KC_MUTE,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,_______,
+ RM_TOGG,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,_______,
+ RM_NEXT,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,_______,
+ RM_HUEU,_______,_______,_______,_______,_______, _______, _______, _______,_______,_______,_______,_______,_______,
+ _______,_______,_______,_______, _______, _______, _______,_______,_______,_______
+)
+};
+
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
+ [BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_MPRV, KC_MNXT) },
+ [MDIA] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) }
+};
+#endif
diff --git a/keyboards/keebart/sofle_choc_pro/keymaps/default/rules.mk b/keyboards/keebart/sofle_choc_pro/keymaps/default/rules.mk
new file mode 100644
index 0000000000..ee32568148
--- /dev/null
+++ b/keyboards/keebart/sofle_choc_pro/keymaps/default/rules.mk
@@ -0,0 +1 @@
+ENCODER_MAP_ENABLE = yes
diff --git a/keyboards/keebart/sofle_choc_pro/readme.md b/keyboards/keebart/sofle_choc_pro/readme.md
new file mode 100644
index 0000000000..8f0e797be0
--- /dev/null
+++ b/keyboards/keebart/sofle_choc_pro/readme.md
@@ -0,0 +1,28 @@
+# Sofle Choc Pro
+
+![sofle_choc_pro](https://i.imgur.com/q9A2HMe.jpeg)
+
+A complete remake of the Sofle Choc Keyboard by Josef Adamčík. Featuring an onboard RP2040 with 128 MB flash
+memory and choc-spaced keys for a more compact keyboard.
+
+- Keyboard Maintainer: [Keebart](https://github.com/Keebart)
+- Hardware Supported: RP2040
+- Hardware Availability: [Keebart Shop](https://keebart.com/products/sofle)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make keebart/sofle_choc_pro:default
+
+Flashing example for this keyboard:
+
+ make keebart/sofle_choc_pro: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 3 ways:
+
+- **Bootmagic reset**: Hold down the top left key of the left side of the keyboard while connecting the left side to the computer. Similarly, hold down the top right key of the right side of the keyboard while connecting the right side to the computer.
+- **Physical reset button**: Briefly press the button on the back of the PCB
+- **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available