Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions keyboards/keyboardio/model100/board.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// Copyright 2025 QMK
// SPDX-License-Identifier: GPL-2.0-or-later

#pragma once

#include_next <board.h>

/* The GD32F303CG is a high-density part with 1MB flash / 96KB RAM. The
* stm32duino board files default to the medium-density STM32F103xB; select the
* high-density variant so the correct memory map and peripherals are used. */
#undef STM32F103xB
#define STM32F103xE

/* The Model 100 gates its USB D+ pull-up with a GPIO (PA8, active-high,
* push-pull) rather than a fixed resistor — confirmed from Keyboardio's DAPBoot
* config (HAVE_USB_PULLUP_CONTROL, USB_PULLUP_GPIO_PIN GPIO8). The stm32duino
* board default only floats PA12 (assumes a fixed pull-up), so without this the
* host never sees the device. Drive PA8 to (dis)connect from the bus. */
#undef usb_lld_connect_bus
#define usb_lld_connect_bus(usbp) palSetPadMode(GPIOA, 8, PAL_MODE_OUTPUT_PUSHPULL); palSetPad(GPIOA, 8)
#undef usb_lld_disconnect_bus
#define usb_lld_disconnect_bus(usbp) palClearPad(GPIOA, 8)
42 changes: 42 additions & 0 deletions keyboards/keyboardio/model100/config.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/*
Copyright 2018 James Laird-Wah
Copyright 2025 QMK

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

#pragma once

/* key matrix size; rows are doubled for split */
#define MATRIX_ROWS 8
#define MATRIX_COLS 8

/* The two ATtiny key scanners hang off I2C1 (B6/B7). They implement clock
* stretching, so a generous timeout is needed. */
#define I2C1_SCL_PIN B6
#define I2C1_SDA_PIN B7

/* On-die flash EEPROM emulation for the GD32F303 (behaves as an STM32F103
* high-density part). */
#define FEE_PAGE_SIZE 0x800
#define FEE_PAGE_COUNT 4
#define FEE_MCU_FLASH_SIZE_IGNORE_CHECK
#define FEE_MCU_FLASH_SIZE 512

/* RGB matrix: a coloured animation at a visible brightness on a fresh EEPROM.
* (on/hue/sat are left at their defaults — true/0/255 — since setting them
* explicitly duplicates the built-ins and the strict linter rejects that.) */
#define RGB_MATRIX_DEFAULT_MODE RGB_MATRIX_CYCLE_LEFT_RIGHT
#define RGB_MATRIX_DEFAULT_VAL 128
#define RGB_MATRIX_MAXIMUM_BRIGHTNESS 200
21 changes: 21 additions & 0 deletions keyboards/keyboardio/model100/halconf.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/* Copyright 2025 QMK
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

#pragma once

#define HAL_USE_I2C TRUE

#include_next <halconf.h>
282 changes: 282 additions & 0 deletions keyboards/keyboardio/model100/keyboard.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,282 @@
{
"keyboard_name": "Model 100",
"manufacturer": "Keyboardio",
"url": "https://keyboard.io",
"maintainer": "qmk",
"usb": {
"vid": "0x3496",
"pid": "0x0006",
"device_version": "0.0.1"
},
"rgb_matrix": {
"animations": {
"alphas_mods": true,
"gradient_up_down": true,
"gradient_left_right": true,
"breathing": true,
"band_sat": true,
"band_val": true,
"band_pinwheel_sat": true,
"band_pinwheel_val": true,
"band_spiral_sat": true,
"band_spiral_val": true,
"cycle_all": true,
"cycle_left_right": true,
"cycle_up_down": true,
"rainbow_moving_chevron": true,
"cycle_out_in": true,
"cycle_out_in_dual": true,
"cycle_pinwheel": true,
"cycle_spiral": true,
"dual_beacon": true,
"rainbow_beacon": true,
"rainbow_pinwheels": true,
"raindrops": true,
"jellybean_raindrops": true,
"hue_breathing": true,
"hue_pendulum": true,
"hue_wave": true,
"pixel_rain": true,
"pixel_flow": true,
"pixel_fractal": true
},
"driver": "custom",
"layout": [
{"matrix": [3, 7], "x": 3, "y": 35, "flags": 4},
{"matrix": [2, 7], "x": 0, "y": 26, "flags": 4},
{"matrix": [1, 7], "x": 0, "y": 17, "flags": 4},
{"matrix": [0, 7], "x": 0, "y": 6, "flags": 4},
{"matrix": [0, 6], "x": 14, "y": 5, "flags": 4},
{"matrix": [1, 6], "x": 15, "y": 16, "flags": 4},
{"matrix": [2, 6], "x": 16, "y": 25, "flags": 4},
{"matrix": [3, 6], "x": 17, "y": 34, "flags": 4},
{"matrix": [3, 5], "x": 31, "y": 29, "flags": 4},
{"matrix": [2, 5], "x": 31, "y": 19, "flags": 4},
{"matrix": [1, 5], "x": 30, "y": 11, "flags": 4},
{"matrix": [0, 5], "x": 30, "y": 1, "flags": 4},
{"matrix": [0, 4], "x": 45, "y": 0, "flags": 4},
{"matrix": [1, 4], "x": 45, "y": 8, "flags": 4},
{"matrix": [2, 4], "x": 46, "y": 17, "flags": 4},
{"matrix": [3, 4], "x": 46, "y": 27, "flags": 4},
{"matrix": [3, 3], "x": 60, "y": 27, "flags": 4},
{"matrix": [2, 3], "x": 60, "y": 18, "flags": 4},
{"matrix": [1, 3], "x": 60, "y": 9, "flags": 4},
{"matrix": [0, 3], "x": 60, "y": 0, "flags": 4},
{"matrix": [0, 2], "x": 74, "y": 2, "flags": 4},
{"matrix": [1, 2], "x": 74, "y": 11, "flags": 4},
{"matrix": [2, 2], "x": 75, "y": 20, "flags": 4},
{"matrix": [3, 2], "x": 74, "y": 28, "flags": 4},
{"matrix": [2, 1], "x": 89, "y": 30, "flags": 4},
{"matrix": [1, 1], "x": 89, "y": 19, "flags": 4},
{"matrix": [0, 1], "x": 89, "y": 7, "flags": 4},
{"matrix": [0, 0], "x": 70, "y": 38, "flags": 1},
{"matrix": [1, 0], "x": 82, "y": 41, "flags": 1},
{"matrix": [2, 0], "x": 93, "y": 45, "flags": 1},
{"matrix": [3, 0], "x": 104, "y": 50, "flags": 1},
{"matrix": [3, 1], "x": 74, "y": 64, "flags": 1},
{"matrix": [7, 6], "x": 149, "y": 64, "flags": 1},
{"matrix": [7, 7], "x": 119, "y": 50, "flags": 1},
{"matrix": [6, 7], "x": 130, "y": 45, "flags": 1},
{"matrix": [5, 7], "x": 141, "y": 41, "flags": 1},
{"matrix": [4, 7], "x": 153, "y": 38, "flags": 1},
{"matrix": [4, 6], "x": 134, "y": 7, "flags": 4},
{"matrix": [5, 6], "x": 134, "y": 19, "flags": 4},
{"matrix": [6, 6], "x": 134, "y": 30, "flags": 4},
{"matrix": [7, 5], "x": 149, "y": 28, "flags": 4},
{"matrix": [6, 5], "x": 148, "y": 20, "flags": 4},
{"matrix": [5, 5], "x": 149, "y": 11, "flags": 4},
{"matrix": [4, 5], "x": 149, "y": 2, "flags": 4},
{"matrix": [4, 4], "x": 163, "y": 0, "flags": 4},
{"matrix": [5, 4], "x": 163, "y": 9, "flags": 4},
{"matrix": [6, 4], "x": 163, "y": 18, "flags": 4},
{"matrix": [7, 4], "x": 163, "y": 27, "flags": 4},
{"matrix": [7, 3], "x": 177, "y": 27, "flags": 4},
{"matrix": [6, 3], "x": 177, "y": 17, "flags": 4},
{"matrix": [5, 3], "x": 178, "y": 8, "flags": 4},
{"matrix": [4, 3], "x": 178, "y": 0, "flags": 4},
{"matrix": [4, 2], "x": 193, "y": 1, "flags": 4},
{"matrix": [5, 2], "x": 193, "y": 11, "flags": 4},
{"matrix": [6, 2], "x": 192, "y": 19, "flags": 4},
{"matrix": [7, 2], "x": 192, "y": 29, "flags": 4},
{"matrix": [7, 1], "x": 206, "y": 34, "flags": 4},
{"matrix": [6, 1], "x": 207, "y": 25, "flags": 4},
{"matrix": [5, 1], "x": 208, "y": 16, "flags": 4},
{"matrix": [4, 1], "x": 209, "y": 5, "flags": 4},
{"matrix": [4, 0], "x": 224, "y": 6, "flags": 4},
{"matrix": [5, 0], "x": 223, "y": 17, "flags": 4},
{"matrix": [6, 0], "x": 223, "y": 26, "flags": 4},
{"matrix": [7, 0], "x": 220, "y": 35, "flags": 4}
]
},
"processor": "STM32F103",
"board": "STM32_F103_STM32DUINO",
"features": {
"bootmagic": false,
"mousekey": true,
"extrakey": true,
"console": true,
"rgb_matrix": true
},
"debounce": 0,
"layouts": {
"LAYOUT": {
"layout": [
{"matrix": [0, 7], "x": 0, "y": 0.4, "h": 1.3},
{"matrix": [0, 6], "x": 1, "y": 0.2, "h": 1.5},
{"matrix": [0, 5], "x": 2, "y": 0.1, "h": 1.1},
{"matrix": [0, 4], "x": 3, "y": 0},
{"matrix": [0, 3], "x": 4, "y": 0.1},
{"matrix": [0, 2], "x": 5, "y": 0.3},

{"matrix": [4, 5], "x": 12.5, "y": 0.3},
{"matrix": [4, 4], "x": 13.5, "y": 0.1},
{"matrix": [4, 3], "x": 14.5, "y": 0},
{"matrix": [4, 2], "x": 15.5, "y": 0.1, "h": 1.1},
{"matrix": [4, 1], "x": 16.5, "y": 0.2, "h": 1.5},
{"matrix": [4, 0], "x": 17.5, "y": 0.4, "h": 1.3},

{"matrix": [1, 7], "x": 0, "y": 1.7},
{"matrix": [1, 6], "x": 1, "y": 1.7},
{"matrix": [1, 5], "x": 2, "y": 1.2},
{"matrix": [1, 4], "x": 3, "y": 1},
{"matrix": [1, 3], "x": 4, "y": 1.1},
{"matrix": [1, 2], "x": 5, "y": 1.3},
{"matrix": [0, 1], "x": 6, "y": 0.6, "h": 1.5},

{"matrix": [4, 6], "x": 11.5, "y": 0.6, "h": 1.5},
{"matrix": [5, 5], "x": 12.5, "y": 1.3},
{"matrix": [5, 4], "x": 13.5, "y": 1.1},
{"matrix": [5, 3], "x": 14.5, "y": 1},
{"matrix": [5, 2], "x": 15.5, "y": 1.2},
{"matrix": [5, 1], "x": 16.5, "y": 1.7},
{"matrix": [5, 0], "x": 17.5, "y": 1.7},

{"matrix": [2, 7], "x": 0, "y": 2.7},
{"matrix": [2, 6], "x": 1, "y": 2.7},
{"matrix": [2, 5], "x": 2, "y": 2.2},
{"matrix": [2, 4], "x": 3, "y": 2},
{"matrix": [2, 3], "x": 4, "y": 2.1},
{"matrix": [2, 2], "x": 5, "y": 2.3},
{"matrix": [1, 1], "x": 6, "y": 2.1, "h": 1.3},

{"matrix": [5, 6], "x": 11.5, "y": 2.1, "h": 1.3},
{"matrix": [6, 5], "x": 12.5, "y": 2.3},
{"matrix": [6, 4], "x": 13.5, "y": 2.1},
{"matrix": [6, 3], "x": 14.5, "y": 2},
{"matrix": [6, 2], "x": 15.5, "y": 2.2},
{"matrix": [6, 1], "x": 16.5, "y": 2.7},
{"matrix": [6, 0], "x": 17.5, "y": 2.7},

{"matrix": [3, 7], "x": 0, "y": 3.7, "h": 1.2},
{"matrix": [3, 6], "x": 1, "y": 3.7},
{"matrix": [3, 5], "x": 2, "y": 3.2, "h": 1.15},
{"matrix": [3, 4], "x": 3, "y": 3},
{"matrix": [3, 3], "x": 4, "y": 3.1},
{"matrix": [3, 2], "x": 5, "y": 3.3},
{"matrix": [2, 1], "x": 6, "y": 3.4, "h": 1.1},

{"matrix": [6, 6], "x": 11.5, "y": 3.4, "h": 1.1},
{"matrix": [7, 5], "x": 12.5, "y": 3.3},
{"matrix": [7, 4], "x": 13.5, "y": 3.1},
{"matrix": [7, 3], "x": 14.5, "y": 3},
{"matrix": [7, 2], "x": 15.5, "y": 3.2, "h": 1.15},
{"matrix": [7, 1], "x": 16.5, "y": 3.7},
{"matrix": [7, 0], "x": 17.5, "y": 3.7, "h": 1.2},

{"matrix": [0, 0], "x": 4.75, "y": 4.3},
{"matrix": [4, 7], "x": 12.75, "y": 4.3},

{"matrix": [1, 0], "x": 5.75, "y": 4.5},
{"matrix": [5, 7], "x": 11.75, "y": 4.5},

{"matrix": [2, 0], "x": 6.75, "y": 4.7},
{"matrix": [6, 7], "x": 10.75, "y": 4.7},

{"matrix": [3, 0], "x": 7.75, "y": 5.1},
{"matrix": [7, 7], "x": 9.75, "y": 5.1},

{"matrix": [3, 1], "x": 6.25, "y": 6.1, "h": 1.4},
{"matrix": [7, 6], "x": 11.25, "y": 6.1, "h": 1.4}
]
},
"LAYOUT_thumb_row": {
"layout": [
{"matrix": [0, 7], "x": 0, "y": 0.4, "h": 1.3},
{"matrix": [0, 6], "x": 1, "y": 0.2, "h": 1.5},
{"matrix": [0, 5], "x": 2, "y": 0.1, "h": 1.1},
{"matrix": [0, 4], "x": 3, "y": 0},
{"matrix": [0, 3], "x": 4, "y": 0.1},
{"matrix": [0, 2], "x": 5, "y": 0.3},

{"matrix": [4, 5], "x": 12.5, "y": 0.3},
{"matrix": [4, 4], "x": 13.5, "y": 0.1},
{"matrix": [4, 3], "x": 14.5, "y": 0},
{"matrix": [4, 2], "x": 15.5, "y": 0.1, "h": 1.1},
{"matrix": [4, 1], "x": 16.5, "y": 0.2, "h": 1.5},
{"matrix": [4, 0], "x": 17.5, "y": 0.4, "h": 1.3},

{"matrix": [1, 7], "x": 0, "y": 1.7},
{"matrix": [1, 6], "x": 1, "y": 1.7},
{"matrix": [1, 5], "x": 2, "y": 1.2},
{"matrix": [1, 4], "x": 3, "y": 1},
{"matrix": [1, 3], "x": 4, "y": 1.1},
{"matrix": [1, 2], "x": 5, "y": 1.3},
{"matrix": [0, 1], "x": 6, "y": 0.6, "h": 1.5},

{"matrix": [4, 6], "x": 11.5, "y": 0.6, "h": 1.5},
{"matrix": [5, 5], "x": 12.5, "y": 1.3},
{"matrix": [5, 4], "x": 13.5, "y": 1.1},
{"matrix": [5, 3], "x": 14.5, "y": 1},
{"matrix": [5, 2], "x": 15.5, "y": 1.2},
{"matrix": [5, 1], "x": 16.5, "y": 1.7},
{"matrix": [5, 0], "x": 17.5, "y": 1.7},

{"matrix": [2, 7], "x": 0, "y": 2.7},
{"matrix": [2, 6], "x": 1, "y": 2.7},
{"matrix": [2, 5], "x": 2, "y": 2.2},
{"matrix": [2, 4], "x": 3, "y": 2},
{"matrix": [2, 3], "x": 4, "y": 2.1},
{"matrix": [2, 2], "x": 5, "y": 2.3},
{"matrix": [1, 1], "x": 6, "y": 2.1, "h": 1.3},

{"matrix": [5, 6], "x": 11.5, "y": 2.1, "h": 1.3},
{"matrix": [6, 5], "x": 12.5, "y": 2.3},
{"matrix": [6, 4], "x": 13.5, "y": 2.1},
{"matrix": [6, 3], "x": 14.5, "y": 2},
{"matrix": [6, 2], "x": 15.5, "y": 2.2},
{"matrix": [6, 1], "x": 16.5, "y": 2.7},
{"matrix": [6, 0], "x": 17.5, "y": 2.7},

{"matrix": [3, 7], "x": 0, "y": 3.7, "h": 1.2},
{"matrix": [3, 6], "x": 1, "y": 3.7},
{"matrix": [3, 5], "x": 2, "y": 3.2, "h": 1.15},
{"matrix": [3, 4], "x": 3, "y": 3},
{"matrix": [3, 3], "x": 4, "y": 3.1},
{"matrix": [3, 2], "x": 5, "y": 3.3},
{"matrix": [2, 1], "x": 6, "y": 3.4, "h": 1.1},

{"matrix": [6, 6], "x": 11.5, "y": 3.4, "h": 1.1},
{"matrix": [7, 5], "x": 12.5, "y": 3.3},
{"matrix": [7, 4], "x": 13.5, "y": 3.1},
{"matrix": [7, 3], "x": 14.5, "y": 3},
{"matrix": [7, 2], "x": 15.5, "y": 3.2, "h": 1.15},
{"matrix": [7, 1], "x": 16.5, "y": 3.7},
{"matrix": [7, 0], "x": 17.5, "y": 3.7, "h": 1.2},

{"matrix": [0, 0], "x": 4.75, "y": 4.3},
{"matrix": [1, 0], "x": 5.75, "y": 4.5},
{"matrix": [2, 0], "x": 6.75, "y": 4.7},
{"matrix": [3, 0], "x": 7.75, "y": 5.1},

{"matrix": [7, 7], "x": 9.75, "y": 5.1},
{"matrix": [6, 7], "x": 10.75, "y": 4.7},
{"matrix": [5, 7], "x": 11.75, "y": 4.5},
{"matrix": [4, 7], "x": 12.75, "y": 4.3},

{"matrix": [3, 1], "x": 6.25, "y": 6.1, "h": 1.4},

{"matrix": [7, 6], "x": 11.25, "y": 6.1, "h": 1.4}
]
}
}
}
Loading