Skip to content
Open
Show file tree
Hide file tree
Changes from 17 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
5 changes: 5 additions & 0 deletions keyboards/tsc/tiwaz/config.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// Copyright 2026 Timo Strube (@tstrube)
// SPDX-License-Identifier: GPL-3.0-or-later

#pragma once
#define SPLIT_TRANSACTION_IDS_KB RPC_JOYSTICK_AXES, RPC_KB_CONFIG
265 changes: 265 additions & 0 deletions keyboards/tsc/tiwaz/keyboard.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,265 @@
{
"manufacturer": "TSC",
"keyboard_name": "Tiwaz",
"maintainer": "tstrube",
"bootloader": "rp2040",
"bootloader_instructions": "Hold boot button on back of PCB, then plug in keyboard.",
"diode_direction": "COL2ROW",
"features": {
"extrakey": true,
"joystick": true,
"mousekey": true,
"nkro": true,
"rgb_matrix": true
},
"joystick": {
"axes": {
"rx": "virtual",
"x": "virtual",
"y": "virtual",
"z": "virtual"
},
"button_count": 2
},
"keycodes": [
{"key": "MD_JOYL", "label": "Change left joystick mode"},
{"key": "MD_JOYR", "label": "Change right joystick mode"}
],
"matrix_pins": {
"cols": ["GP2", "GP3", "GP4", "GP5", "GP6", "GP7", "GP12", "GP13", "GP24"],
"rows": ["GP16", "GP17", "GP18", "GP19", "GP20"]
},
"processor": "RP2040",
"rgb_matrix": {
"animations": {
"breathing": true,
"cycle_all": true,
"solid_reactive_multiwide": true
},
"default": {
"sat": 0
Comment thread
tstrube marked this conversation as resolved.
},
"driver": "ws2812",
"layout": [
Comment thread
drashna marked this conversation as resolved.
{"matrix": [0, 8], "x": 104, "y": 0, "flags": 12},
{"matrix": [1, 8], "x": 104, "y": 8, "flags": 12},
{"matrix": [2, 8], "x": 104, "y": 16, "flags": 12},
{"matrix": [3, 8], "x": 104, "y": 24, "flags": 12},
{"matrix": [4, 8], "x": 104, "y": 32, "flags": 12},
{"matrix": [3, 7], "x": 104, "y": 40, "flags": 12},
{"matrix": [2, 7], "x": 91, "y": 32, "flags": 4},
{"matrix": [1, 7], "x": 91, "y": 16, "flags": 4},
{"matrix": [0, 7], "x": 91, "y": 0, "flags": 4},
{"matrix": [0, 6], "x": 78, "y": 0, "flags": 4},
{"matrix": [0, 5], "x": 65, "y": 0, "flags": 4},
{"matrix": [0, 4], "x": 52, "y": 0, "flags": 4},
{"matrix": [0, 3], "x": 39, "y": 0, "flags": 4},
{"matrix": [0, 2], "x": 26, "y": 0, "flags": 4},
{"matrix": [0, 1], "x": 13, "y": 0, "flags": 4},
{"matrix": [0, 0], "x": 0, "y": 0, "flags": 4},
{"matrix": [1, 0], "x": 0, "y": 16, "flags": 4},
{"matrix": [1, 1], "x": 13, "y": 16, "flags": 4},
{"matrix": [1, 2], "x": 26, "y": 16, "flags": 4},
{"matrix": [1, 3], "x": 39, "y": 16, "flags": 4},
{"matrix": [1, 4], "x": 52, "y": 16, "flags": 4},
{"matrix": [1, 5], "x": 65, "y": 16, "flags": 4},
{"matrix": [1, 6], "x": 78, "y": 16, "flags": 4},
{"matrix": [2, 6], "x": 78, "y": 32, "flags": 4},
{"matrix": [2, 5], "x": 65, "y": 32, "flags": 4},
{"matrix": [2, 4], "x": 52, "y": 32, "flags": 4},
{"matrix": [2, 3], "x": 39, "y": 32, "flags": 4},
{"matrix": [2, 2], "x": 26, "y": 32, "flags": 4},
{"matrix": [2, 1], "x": 13, "y": 32, "flags": 5},
{"matrix": [2, 0], "x": 0, "y": 32, "flags": 4},
{"matrix": [3, 0], "x": 0, "y": 48, "flags": 4},
{"matrix": [3, 1], "x": 13, "y": 48, "flags": 5},
{"matrix": [3, 2], "x": 26, "y": 48, "flags": 4},
{"matrix": [3, 3], "x": 39, "y": 48, "flags": 4},
{"matrix": [3, 4], "x": 52, "y": 48, "flags": 4},
{"matrix": [3, 5], "x": 65, "y": 48, "flags": 4},
{"matrix": [3, 6], "x": 78, "y": 48, "flags": 4},
{"matrix": [4, 6], "x": 78, "y": 64, "flags": 4},
{"matrix": [4, 5], "x": 65, "y": 64, "flags": 5},
{"matrix": [4, 4], "x": 52, "y": 64, "flags": 5},
{"matrix": [4, 3], "x": 39, "y": 64, "flags": 5},
{"matrix": [4, 2], "x": 26, "y": 64, "flags": 5},
{"matrix": [4, 1], "x": 13, "y": 64, "flags": 5},
{"matrix": [4, 0], "x": 0, "y": 64, "flags": 4},
{"matrix": [5, 0], "x": 120, "y": 0, "flags": 12},
{"matrix": [6, 0], "x": 120, "y": 8, "flags": 12},
{"matrix": [7, 0], "x": 120, "y": 16, "flags": 12},
{"matrix": [8, 0], "x": 120, "y": 24, "flags": 12},
{"matrix": [9, 0], "x": 120, "y": 32, "flags": 12},
{"matrix": [8, 1], "x": 120, "y": 48, "flags": 12},
{"matrix": [7, 1], "x": 133, "y": 32, "flags": 4},
{"matrix": [6, 1], "x": 133, "y": 16, "flags": 4},
{"matrix": [5, 1], "x": 133, "y": 0, "flags": 4},
{"matrix": [5, 2], "x": 146, "y": 0, "flags": 4},
{"matrix": [5, 3], "x": 159, "y": 0, "flags": 4},
{"matrix": [5, 4], "x": 172, "y": 0, "flags": 4},
{"matrix": [5, 5], "x": 185, "y": 0, "flags": 4},
{"matrix": [5, 6], "x": 198, "y": 0, "flags": 4},
{"matrix": [5, 7], "x": 211, "y": 0, "flags": 4},
{"matrix": [5, 8], "x": 224, "y": 0, "flags": 4},
{"matrix": [6, 8], "x": 224, "y": 16, "flags": 4},
{"matrix": [6, 7], "x": 211, "y": 16, "flags": 4},
{"matrix": [6, 6], "x": 198, "y": 16, "flags": 4},
{"matrix": [6, 5], "x": 185, "y": 16, "flags": 4},
{"matrix": [6, 4], "x": 172, "y": 16, "flags": 4},
{"matrix": [6, 3], "x": 159, "y": 16, "flags": 4},
{"matrix": [6, 2], "x": 146, "y": 16, "flags": 4},
{"matrix": [7, 2], "x": 146, "y": 32, "flags": 4},
{"matrix": [7, 3], "x": 159, "y": 32, "flags": 4},
{"matrix": [7, 4], "x": 172, "y": 32, "flags": 4},
{"matrix": [7, 5], "x": 185, "y": 32, "flags": 4},
{"matrix": [7, 6], "x": 198, "y": 32, "flags": 4},
{"matrix": [7, 7], "x": 211, "y": 32, "flags": 4},
{"matrix": [7, 8], "x": 224, "y": 32, "flags": 4},
{"matrix": [8, 8], "x": 224, "y": 48, "flags": 5},
{"matrix": [8, 7], "x": 211, "y": 48, "flags": 4},
{"matrix": [8, 6], "x": 198, "y": 48, "flags": 4},
{"matrix": [8, 5], "x": 185, "y": 48, "flags": 4},
{"matrix": [8, 4], "x": 172, "y": 48, "flags": 4},
{"matrix": [8, 3], "x": 159, "y": 48, "flags": 4},
{"matrix": [8, 2], "x": 146, "y": 48, "flags": 4},
{"matrix": [9, 2], "x": 146, "y": 64, "flags": 4},
{"matrix": [9, 3], "x": 159, "y": 64, "flags": 4},
{"matrix": [9, 4], "x": 172, "y": 64, "flags": 4},
{"matrix": [9, 5], "x": 185, "y": 64, "flags": 4},
{"matrix": [9, 6], "x": 198, "y": 64, "flags": 4},
{"matrix": [9, 7], "x": 211, "y": 64, "flags": 4},
{"matrix": [9, 8], "x": 224, "y": 64, "flags": 4}
],
"max_brightness": 192,
"sleep": true,
"split_count": [44, 44]
},
"split": {
"enabled": true,
"handedness": {
"pin": "GP14"
},
"matrix_pins": {
"right": {
"cols": ["GP24", "GP13", "GP12", "GP7", "GP6", "GP5", "GP4", "GP3", "GP2"]
}
},
"serial": {
"driver": "vendor",
"pin": "GP0"
},
"transport": {
"sync": {
"layer_state": true,
"matrix_state": true,
"modifiers": true
},
"watchdog": true
}
},
"url": "https://github.com/tstrube/Tiwaz",
"usb": {
"device_version": "1.0.0",
"pid": "0x5449",
"vid": "0x5453",
"suspend_wakeup_delay": 5000
},
"ws2812": {
"driver": "vendor",
"pin": "GP1"
},
"layouts": {
"LAYOUT": {
"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, "h": 0.5},
{"matrix": [5, 0], "x": 11, "y": 0, "h": 0.5},
{"matrix": [5, 1], "x": 12, "y": 0},
{"matrix": [5, 2], "x": 13, "y": 0},
{"matrix": [5, 3], "x": 14, "y": 0},
{"matrix": [5, 4], "x": 15, "y": 0},
{"matrix": [5, 5], "x": 16, "y": 0},
{"matrix": [5, 6], "x": 17, "y": 0},
{"matrix": [5, 7], "x": 18, "y": 0},
{"matrix": [5, 8], "x": 19, "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": 0.5, "h": 0.5},
{"matrix": [6, 0], "x": 11, "y": 0.5, "h": 0.5},
{"matrix": [6, 1], "x": 12, "y": 1},
{"matrix": [6, 2], "x": 13, "y": 1},
{"matrix": [6, 3], "x": 14, "y": 1},
{"matrix": [6, 4], "x": 15, "y": 1},
{"matrix": [6, 5], "x": 16, "y": 1},
{"matrix": [6, 6], "x": 17, "y": 1},
{"matrix": [6, 7], "x": 18, "y": 1},
{"matrix": [6, 8], "x": 19, "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": 1, "h": 0.5},
{"matrix": [7, 0], "x": 11, "y": 1, "h": 0.5},
{"matrix": [7, 1], "x": 12, "y": 2},
{"matrix": [7, 2], "x": 13, "y": 2},
{"matrix": [7, 3], "x": 14, "y": 2},
{"matrix": [7, 4], "x": 15, "y": 2},
{"matrix": [7, 5], "x": 16, "y": 2},
{"matrix": [7, 6], "x": 17, "y": 2},
{"matrix": [7, 7], "x": 18, "y": 2},
{"matrix": [7, 8], "x": 19, "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},
{"matrix": [3, 7], "x": 8, "y": 2.5, "h": 0.5},
{"matrix": [3, 8], "x": 8, "y": 1.5, "h": 0.5},
{"matrix": [8, 0], "x": 11, "y": 1.5, "h": 0.5},
{"matrix": [8, 1], "x": 11, "y": 2.5, "h": 0.5},
{"matrix": [8, 2], "x": 13, "y": 3},
{"matrix": [8, 3], "x": 14, "y": 3},
{"matrix": [8, 4], "x": 15, "y": 3},
{"matrix": [8, 5], "x": 16, "y": 3},
{"matrix": [8, 6], "x": 17, "y": 3},
{"matrix": [8, 7], "x": 18, "y": 3},
{"matrix": [8, 8], "x": 19, "y": 3},
{"matrix": [4, 0], "x": 0, "y": 4},
{"matrix": [4, 1], "x": 1, "y": 4},
{"matrix": [4, 2], "x": 2, "y": 4},
{"matrix": [4, 3], "x": 3, "y": 4},
{"matrix": [4, 4], "x": 4, "y": 4},
{"matrix": [4, 5], "x": 5, "y": 4},
{"matrix": [4, 6], "x": 6, "y": 4},
{"matrix": [4, 8], "x": 8, "y": 2, "h": 0.5},
{"matrix": [9, 0], "x": 11, "y": 2, "h": 0.5},
{"matrix": [9, 2], "x": 13, "y": 4},
{"matrix": [9, 3], "x": 14, "y": 4},
{"matrix": [9, 4], "x": 15, "y": 4},
{"matrix": [9, 5], "x": 16, "y": 4},
{"matrix": [9, 6], "x": 17, "y": 4},
{"matrix": [9, 7], "x": 18, "y": 4},
{"matrix": [9, 8], "x": 19, "y": 4}
]
}
}
}
21 changes: 21 additions & 0 deletions keyboards/tsc/tiwaz/keymaps/default/keymap.c
Comment thread
tstrube marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// Copyright 2026 Timo Strube (@tstrube)
// SPDX-License-Identifier: GPL-3.0-or-later

#include QMK_KEYBOARD_H

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT(
KC_ESC ,KC_GRV ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 ,KC_6 ,KC_MPLY,KC_MPLY,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_MINS,KC_EQL ,KC_BSPC,KC_DEL ,
KC_CUT ,KC_TAB ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,KC_HOME,KC_MNXT,KC_MNXT,KC_PGUP,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,KC_LBRC,KC_RBRC,
KC_COPY,KC_CAPS,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,KC_END ,KC_MPRV,KC_MPRV,KC_PGDN,KC_H ,KC_J ,KC_K ,KC_L ,KC_SCLN,KC_QUOT,KC_ENT ,
KC_PSTE,KC_LSFT,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,KC_MUTE,KC_VOLU,KC_VOLU,KC_MUTE,KC_N ,KC_M ,KC_COMM,KC_DOT ,KC_SLSH,KC_UP ,KC_RSFT,
KC_UNDO,KC_LCTL,MO(1) ,KC_MENU,KC_LGUI,KC_LALT,KC_SPC ,KC_VOLD,KC_VOLD ,KC_BSPC,KC_PSCR,TG(1) ,KC_BSLS,KC_LEFT,KC_DOWN,KC_RGHT
),
[1] = LAYOUT(
RM_TOGG,XXXXXXX,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_F6 ,QK_BOOT,QK_BOOT,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,KC_F11 ,KC_F12 ,KC_PMNS,KC_PSLS,
XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,KC_P7 ,KC_P8 ,KC_P9 ,KC_PPLS,KC_PSLS,
RM_NEXT,RM_SPDU,RM_HUEU,RM_SATU,RM_VALU,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,KC_P4 ,KC_P5 ,KC_P6 ,KC_PPLS,KC_PAST,
RM_PREV,RM_SPDD,RM_HUED,RM_SATD,RM_VALD,XXXXXXX,XXXXXXX,MD_JOYL,XXXXXXX,XXXXXXX,MD_JOYR,XXXXXXX,XXXXXXX,KC_P1 ,KC_P2 ,KC_P3 ,KC_PENT,KC_PAST,
KC_AGIN,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX ,XXXXXXX,XXXXXXX ,XXXXXXX,XXXXXXX,TG(1) ,KC_P0 ,KC_PDOT,KC_PENT,KC_NUM
)
};
26 changes: 26 additions & 0 deletions keyboards/tsc/tiwaz/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Tiwaz

Split gaming keyboard with multiple joystick options. Either half can be used independently.

* Keyboard Maintainer: [Timo Strube](https://timostrube.de)
* Hardware Supported: Tiwaz - RP2040
* Hardware Availability: [Tiwaz](https://github.com/tstrube/Tiwaz)

![Real](https://github.com/tstrube/Tiwaz/blob/main/Images/Tiwaz.jpg)

Make example for this keyboard (after setting up your build environment):

make tsc/tiwaz:default

Flashing example for this keyboard:

make tsc/tiwaz: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:

* **Physical boot button**: Hold boot button on back of PCB, then plug in keyboard.
* **Keycode in layout**: Press the key mapped to `QK_BOOT` (FN + PLAY (top media key))
Loading