Compare commits

...

50 Commits

Author SHA1 Message Date
Joel Challis 2ea1a0192f Fix qmk compile -km <keyboard> -km all (#26234)
Pass required print_failures argument to mass compile commands.
2026-05-28 03:05:01 +01:00
Julian Yap 1620390d67 Add new keyboard - Pando58 (#26148) 2026-05-27 03:31:34 +01:00
tom-royle 462556f4de Add the Troyle/macro keys dual keyboard to QMK (#25806) 2026-05-27 00:42:50 +01:00
blindassassin111 c20d0a83b5 Adding support for the KHS-01 (#26101) 2026-05-26 23:29:08 +01:00
Jubakuba 3c338996f0 Adding Volt 80 Custom PCB Support (#26158)
* Adding Volt 80 Custom PCB Support

* update license

* lint fix

* requested changes

* requested changes 2

* requested changes 3 because I'm incompetent

* requested changes

* drashna recommends

* Update keyboards/percent_studio_aftermarket/keyboard.json

Co-authored-by: Drashna Jaelre <drashna@live.com>

* Update keyboards/percent_studio_aftermarket/keymaps/default/keymap.c

Co-authored-by: Joel Challis <git@zvecr.com>

* Update keyboards/percent_studio_aftermarket/keyboard.json

Co-authored-by: Joel Challis <git@zvecr.com>

* Update keyboards/percent_studio_aftermarket/percent_studio_aftermarket.c

Co-authored-by: Joel Challis <git@zvecr.com>

* Update keyboards/percent_studio_aftermarket/percent_studio_aftermarket.c

Co-authored-by: Joel Challis <git@zvecr.com>

* Fix JSON formatting by removing extra lines

---------

Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Joel Challis <git@zvecr.com>
2026-05-26 13:21:19 -07:00
Andrew Kannan 3a8ea37a13 Add Minimi40 to QMK (#25575) 2026-05-26 03:17:19 +01:00
Klesh Wong f8aec1f50c fix(input): Resolve lost mouse clicks in PS/2 streaming mode (#25942) 2026-05-26 01:42:44 +01:00
Simon 2604a49cda Candy87 PCB Firmware (#24298) 2026-05-26 01:37:24 +01:00
X-Bows Tech c701efbb53 Add Numpad_V2 (#26164) 2026-05-25 02:50:28 +01:00
sizezero d9bf44c7a9 [Keyboard] add aokay/mid1 (#26004) 2026-05-25 02:48:02 +01:00
Idle Builds 393d3a5b21 Add Idle Builds Dinkey 32|30 keyboard (#26175) 2026-05-24 00:03:49 +01:00
Idle Builds 5e3985024d Add Idle Builds Dinkey 34 keyboard (#26176) 2026-05-24 00:03:31 +01:00
Jon Colverson 12e5b7db97 [Keyboard] Add PicoLX (#26220) 2026-05-23 23:45:12 +01:00
Dominic 316fc06d8c Support for Alatus PCB (#26116) 2026-05-23 23:33:44 +01:00
Erick Bazán a033e172b9 [Keyboard] Add Wolf Singa Kohaku Solder, Solder RGB, and Hotswap (#26105) 2026-05-23 06:03:58 +01:00
diegorodriguezv a187ebeec6 Add szr35 keyboard (#25662) 2026-05-23 05:53:07 +01:00
VPavliashvili ffe57097eb Add ergo-v-1 keyboard (#25908) 2026-05-23 05:40:28 +01:00
sigman 99a67d1172 Changing VID for Southpaw65ext (#26104)
* fix: assign vid instead of generic

* fix: add copyright clause in keymaps

* review: 0x1209 -> vid

* change: vid 0x7f00

* fix: hex number case
2026-05-23 11:07:15 +08:00
Yoichi NAKAYAMA 7e9c4508c8 [Docs][MouseKeys] Document the effect of the acceleration key in default mode. (#26213)
* Document the effect of the acceleration key in default mode.

* Move description into TIPS

Co-authored-by: フィルターペーパー <76888457+filterpaper@users.noreply.github.com>

---------

Co-authored-by: フィルターペーパー <76888457+filterpaper@users.noreply.github.com>
2026-05-23 08:38:40 +08:00
Chris West ed0d5fde7b Fix spelling error in feature_layers.md (#26227)
Corrected spelling of 'tricker' to 'trickier' in the Advanced Users section.
2026-05-22 22:38:37 +01:00
Joel Challis 0269eea2c9 Add EECONFIG_{KB,USER}_DATA_SIZE docs (#26200) 2026-05-19 02:58:50 +01:00
Nick Brassel 1836382f66 GCC 16.1 compatibility fix. (#26216)
Co-authored-by: Joel Challis <git@zvecr.com>
2026-05-17 13:06:47 +10:00
prkrln 504533b3b4 Add pad9 keyboard (#26051) 2026-05-03 04:02:11 +01:00
Sinopoli Mauro ba9642c83d Add sector245/s245_streamdeck keyboard (#26013) 2026-05-01 00:26:54 +01:00
Joel Challis c2f7a5b5c5 Fix config.h bool parsing (#26166) 2026-04-30 23:57:08 +01:00
Isaac Rex ccc6c6ce0b [Keyboard] Added Nifty Numpad (#23019)
* Initial commit of Nifty Numpad keyboard

* Initial commit of Nifty Numpad keyboard

* Fixed double repo

* Updated available effects

* Added a default and VIA keymap, moved cadence to its own keymap

* Fixed qmk_firmware submodule issue

* Updated Nifty Numpad readme

Updated Cadence keymap

Updated vscode settings to match QMK master

* Added Nifty Numpad

* Added config.h to idle_rgb_example

* renamed info.json, removed rules.mk

* Updated to conform with most recent PR checklist

- Removed VIA keymap
- Formatted keyboard.json with qmk format-json
- Updated custom keycodes in nifty_numpad.h to start at QK_USER

* Address review feedback

- Remove the config.h file from the idle_rgb_example keymap as the only
  settings was equal to the default
- Added empty endline to the end of idle_rgb_example/rules.mk and post_rules.mk
- Updated RGB_DEF custom keycode to QK_KB

* Removed commented layout visuals

* Updated RGB Matrix keycodes

* Updated use of eeconfig_update_kb_datablock to new signature
2026-04-17 20:55:09 -07:00
kbd0 c93ef27143 [Keyboard] Add Kbd0 Curve0 75% ANSI (#25997) 2026-04-14 11:17:28 +01:00
Nick Brassel 15e8658e81 Deploy qmk_udev during bootstrap, updated CLI bootstrap docs (#26147) 2026-04-14 11:02:31 +01:00
Toast c6475e0476 Implement num lock light for Keychron V5 (#26019) 2026-04-13 22:49:27 +01:00
Danny 3001d81e3d Add Sinc LM Rev. 1 (#26134) 2026-04-13 16:28:59 -04:00
dependabot[bot] 407e6e242e Bump actions/github-script from 8 to 9 (#26142)
Bumps [actions/github-script](https://github.com/actions/github-script) from 8 to 9.
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](https://github.com/actions/github-script/compare/v8...v9)

---
updated-dependencies:
- dependency-name: actions/github-script
  dependency-version: '9'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-11 10:15:09 +01:00
QMK Bot 18ed7c6caf [CI] Format code according to conventions (#26138)
Format code according to conventions
2026-04-09 13:26:08 +01:00
Joel Challis 92c0e2cee1 Align C formatting extensions (#26137) 2026-04-09 12:03:53 +01:00
Joel Challis 6a11370434 Avoid BrokenPipeError errors in qmk clean 2026-04-09 11:30:33 +01:00
Joel Challis 2bd8e43256 Enhance checks for invalid keyboard build targets (#26122)
Co-authored-by: フィルターペーパー <76888457+filterpaper@users.noreply.github.com>
2026-04-05 15:38:40 +10:00
Joel Challis 933cb8cc35 Update CI workflow to dynamically set keymaps (#26120) 2026-04-05 15:37:41 +10:00
Joel Challis 1426eedfc1 Fix cache list command in CI workflow 2026-04-02 08:23:41 +01:00
Joel Challis e4b998ccb0 Only attempt cache deletion if exists (#26124) 2026-04-02 16:00:00 +11:00
Joel Challis b5af7a3390 Enable ccache within CI (#26121) 2026-04-01 19:41:19 +11:00
Joel Challis ed80e21858 Resolve 'using serial compilation of 2 LTRANS jobs' warning (#26113) 2026-03-30 15:25:29 +11:00
Joel Challis 9d24bc8a33 Fix userspace detection in Makefile (#26117) 2026-03-30 11:24:32 +08:00
QMK Bot c7fde3d8cc [CI] Format code according to conventions (#26108)
Format code according to conventions
2026-03-27 03:56:53 +00:00
Sebastian Morgenstern 0fdb5df94d Added new pttbutton keyboard (#25952) 2026-03-27 03:15:28 +00:00
Joel Challis bd500ae092 Detect PRs bypassing DD changes (#26094) 2026-03-20 06:27:49 +11:00
Peter Cock fec01edaa4 Explain how to use STORE_SETUPS and PRINT_SETUPS (#26070)
* Explain how to use STORE_SETUPS and PRINT_SETUPS

I found the instructions a little terse, but managed.

This also adds a note about PRINT_SETUPS reporting random numbers if STORE_SETUPS hasn't been used.

* Remove line breaks

Existing docs seem to use a mix of hard line breaks at sentence
ends, or 80 chars-ish, versus no line breaks in paragraphs.

* Suggestion during review

Co-authored-by: フィルターペーパー <76888457+filterpaper@users.noreply.github.com>

---------

Co-authored-by: フィルターペーパー <76888457+filterpaper@users.noreply.github.com>
2026-03-19 11:40:49 +08:00
Peter Cock 7619e991cf QMK avoids raw line breaks within paragraphs in Markdown (#26080)
* QMK avoids raw line breaks within paragraphs in Markdown

Mentioned in passing during a few of my recent documentation pull requests, eg #26070.

* Suggestion during review

Co-authored-by: フィルターペーパー <76888457+filterpaper@users.noreply.github.com>

---------

Co-authored-by: フィルターペーパー <76888457+filterpaper@users.noreply.github.com>
2026-03-19 10:16:35 +08:00
Dasky 627ad33233 Fix pointing device driver typo (#26091)
fix typo
2026-03-18 18:50:33 -07:00
フィルターペーパー 2cbcd76ef0 License violations updates. (#26076) 2026-03-16 03:12:18 +00:00
Joel Challis 322e673bcb Remove use of andstor/file-existence-action (#26078) 2026-03-16 03:12:04 +00:00
dependabot[bot] 4be8880177 Bump geekyeggo/delete-artifact from 5 to 6 (#26077)
Bumps [geekyeggo/delete-artifact](https://github.com/geekyeggo/delete-artifact) from 5 to 6.
- [Release notes](https://github.com/geekyeggo/delete-artifact/releases)
- [Changelog](https://github.com/GeekyEggo/delete-artifact/blob/main/CHANGELOG.md)
- [Commits](https://github.com/geekyeggo/delete-artifact/compare/v5...v6)

---
updated-dependencies:
- dependency-name: geekyeggo/delete-artifact
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-16 02:23:53 +00:00
168 changed files with 10192 additions and 373 deletions
+15 -13
View File
@@ -32,6 +32,7 @@ jobs:
container: ghcr.io/qmk/qmk_cli
outputs:
keymaps: ${{ steps.generate_slice_length.outputs.keymaps }}
slice_length: ${{ steps.generate_slice_length.outputs.slice_length }}
steps:
@@ -47,12 +48,20 @@ jobs:
- name: Determine concurrency
id: generate_slice_length
shell: 'bash {0}'
run: |
target_count=$( {
qmk find -km default 2>/dev/null
qmk find -km xap 2>/dev/null
} | sort | uniq | wc -l)
targets=()
target_count=0
for target in "default" "xap"; do
count=$(qmk find -km $target 2>/dev/null | wc -l)
if [ $count -gt 0 ]; then
target_count=$(($target_count + $count))
targets+=($target)
fi
done
keymaps=$(jq -c -n '$ARGS.positional' --args "${targets[@]}")
slice_length=$((target_count / ($CONCURRENT_JOBS - 1))) # Err on the side of caution
echo "keymaps=$keymaps" >> $GITHUB_OUTPUT
echo "slice_length=$slice_length" >> $GITHUB_OUTPUT
build_targets:
@@ -61,7 +70,7 @@ jobs:
strategy:
fail-fast: false
matrix:
keymap: [default, xap]
keymap: ${{ fromJson(needs.determine_concurrency.outputs.keymaps) }}
uses: ./.github/workflows/ci_build_major_branch_keymap.yml
with:
branch: ${{ inputs.branch || github.ref_name }}
@@ -123,14 +132,7 @@ jobs:
SOURCE_DIR: .
DEST_DIR: ${{ inputs.branch || github.ref_name }}/latest
- name: Check if failure marker file exists
id: check_failure_marker
uses: andstor/file-existence-action@v3
with:
files: ./.failed
- name: Fail build if needed
if: steps.check_failure_marker.outputs.files_exists == 'true'
run: |
# Exit with failure if the compilation stage failed
exit 1
[ ! -e .failed ] || exit 1
@@ -38,17 +38,18 @@ jobs:
run: pip3 install -r requirements-dev.txt
- name: Generate build targets
shell: 'bash {0}'
id: generate_targets
run: |
{ # Intentionally use `shuf` here so that we share manufacturers across all build groups -- some have a lot of ARM-based boards which inherently take longer
counter=0
echo -n '{'
qmk find -km ${{ inputs.keymap }} 2>/dev/null | sort | uniq | shuf | xargs -L${{ inputs.slice_length }} | while IFS=$'\n' read target ; do
qmk find -km ${{ inputs.keymap }} 2>/dev/null | sort | uniq | shuf --random-source=<(openssl enc -aes-256-ctr -pass pass:qmk -nosalt </dev/zero 2>/dev/null) | xargs -L${{ inputs.slice_length }} | while IFS=$'\n' read target ; do
if [ $counter -gt 0 ]; then
echo -n ','
fi
counter=$((counter+1))
printf "\"group %02d\":{" $counter
printf "\"group-%02d\":{" $counter
echo -n '"targets":"'
echo $target | tr ' ' '\n' | sort | uniq | xargs echo -n
echo -n '"}'
@@ -72,6 +73,9 @@ jobs:
container: ghcr.io/qmk/qmk_cli
continue-on-error: true
env:
CCACHE_CONFIGPATH: ~/.cache
strategy:
matrix:
target: ${{ fromJson(needs.generate_targets.outputs.targets) }}
@@ -83,6 +87,8 @@ jobs:
- name: Checkout QMK Firmware
uses: actions/checkout@v6
with:
submodules: recursive
- name: Install dependencies
run: pip3 install -r requirements-dev.txt
@@ -93,24 +99,47 @@ jobs:
name: targets-${{ inputs.keymap }}
path: .
- name: Deploy submodules
run: |
qmk git-submodule -f
- name: Dump targets
run: |
jq -r '.["${{ matrix.target }}"].targets' targets.json | tr ' ' '\n' | sort
- name: Restore Cache
id: cache
uses: actions/cache/restore@v5
with:
path: ${{ env.CCACHE_CONFIGPATH }}
key: compile-${{ inputs.keymap }}-${{ matrix.target }}
- name: Build targets
continue-on-error: true
run: |
export NCPUS=$(( $(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || getconf _NPROCESSORS_ONLN 2>/dev/null) -1 ))
targets=$(jq -r '.["${{ matrix.target }}"].targets' targets.json | tr ' ' '\n' | sort)
if [ -z "${targets}" ]; then
echo "Zero build targets detected"
exit 0
fi
qmk mass-compile -t -j $NCPUS -e DUMP_CI_METADATA=yes $targets || touch .failed
qmk mass-compile -t -j $(nproc) -e DUMP_CI_METADATA=yes -e USE_CCACHE=yes $targets || touch .failed
- name: Dump ccache stats
run: |
ccache -s
# Delete the old cache on hit to emulate a cache update. See https://github.com/actions/cache/issues/342.
- name: Delete old cache
env:
GH_TOKEN: ${{ github.token }}
if: steps.cache.outputs.cache-hit
run: |
count=$(gh cache list --ref ${{ github.ref }} --key ${{ steps.cache.outputs.cache-primary-key }} --json id | jq length)
if [ $count -gt 0 ]; then
gh cache delete --ref ${{ github.ref }} ${{ steps.cache.outputs.cache-primary-key }}
fi
- name: Save Cache
uses: actions/cache/save@v5
with:
path: ${{ env.CCACHE_CONFIGPATH }}
key: compile-${{ inputs.keymap }}-${{ matrix.target }}
- name: Upload binaries
uses: actions/upload-artifact@v7
@@ -166,7 +195,7 @@ jobs:
truncate --size='<960K' $GITHUB_STEP_SUMMARY || true
- name: Delete temporary build artifacts
uses: geekyeggo/delete-artifact@v5
uses: geekyeggo/delete-artifact@v6
with:
name: |
firmware-${{ inputs.keymap }}-*
+1 -1
View File
@@ -22,7 +22,7 @@ jobs:
steps:
- name: Deploy Develop
if: ${{ github.repository == 'qmk/qmk_firmware' }}
uses: actions/github-script@v8
uses: actions/github-script@v9
with:
github-token: ${{ secrets.QMK_BOT_TOKEN }}
script: |
+1 -17
View File
@@ -89,23 +89,7 @@ jobs:
if: always()
shell: 'bash {0}'
run: |
exit_code=0
for file in $(find keyboards/ -name rules.mk | grep -v /keymaps/ | grep -v /common/ | grep -v /lib/); do
dir=$(dirname $file)
$(find $dir -name keyboard.json -exec false {} +)
if [[ $? == 0 ]]; then
echo "$dir::Legacy target detected"
((++exit_code))
fi
done
if [[ $exit_code -gt 255 ]]; then
exit 255
fi
exit $exit_code
qmk ci-validate-keyboard-targets
- name: Verify keyboard aliases
if: always()
+3
View File
@@ -8,6 +8,9 @@ on:
paths:
- 'data/constants/**'
- 'lib/python/**'
- 'quantum/rgblight/rgblight_breathe_table.h'
- 'quantum/keycodes.h'
- 'quantum/keymap_extras/**'
jobs:
regen:
+8 -5
View File
@@ -38,14 +38,17 @@ $(info QMK Firmware $(QMK_VERSION))
endif
endif
# Try to determine userspace from qmk config, if set.
ifeq ($(QMK_USERSPACE),)
QMK_USERSPACE = $(shell qmk config -ro user.overlay_dir | cut -d= -f2 | sed -e 's@^None$$@@g')
endif
# Determine which qmk cli to use
QMK_BIN := qmk
# Try to determine userspace from qmk config, if set. Handle direct query on qmk_cli>=1.1.7
# falling back to legacy method of only supporting user.overlay_dir config
# sort is used to buffer 'qmk env' output and avoid BrokenPipeError errors
export override QMK_USERSPACE := $(shell \
$(QMK_BIN) env | sort | grep -q QMK_USERSPACE \
&& $(QMK_BIN) env QMK_USERSPACE \
|| $(QMK_BIN) config -ro user.overlay_dir | cut -d= -f2 | sed -e 's@^None$$@@g')
# avoid 'Entering|Leaving directory' messages
MAKEFLAGS += --no-print-directory
+5 -2
View File
@@ -58,7 +58,7 @@ endif
#---------------- C Compiler Options ----------------
ifeq ($(strip $(LTO_ENABLE)), yes)
CDEFS += -flto
CDEFS += -flto=auto
CDEFS += -DLTO_ENABLE
endif
@@ -72,6 +72,8 @@ endif
endif
CFLAGS += -Wall
CFLAGS += -Wstrict-prototypes
CFLAGS += $(call cc-option,-Wunused-but-set-variable=1,-Wunused-but-set-variable)
CFLAGS += $(call cc-option,-Wunused-but-set-parameter=1,-Wunused-but-set-parameter)
ifneq ($(strip $(ALLOW_WARNINGS)), yes)
CFLAGS += -Werror
endif
@@ -89,7 +91,8 @@ CXXFLAGS += -O$(OPT)
CXXFLAGS += -w
CXXFLAGS += -Wall
CXXFLAGS += -Wundef
CXXFLAGS += $(call cc-option,-Wunused-but-set-variable=1,-Wunused-but-set-variable)
CXXFLAGS += $(call cc-option,-Wunused-but-set-parameter=1,-Wunused-but-set-parameter)
ifneq ($(strip $(ALLOW_WARNINGS)), yes)
CXXFLAGS += -Werror
endif
+1 -1
View File
@@ -4,7 +4,7 @@
# $(2) = option to use if $(1) is not supported
# $(3) = additional arguments to pass to the compiler during the test, but aren't contained in the output
cc-option = $(shell \
if { echo 'int main(){return 0;}' | $(CC) $(1) $(3) -o /dev/null -x c /dev/null >/dev/null 2>&1; }; \
if { echo 'int main(){return 0;}' | $(CC) $(1) $(3) -Wl,--unresolved-symbols=ignore-all -o /dev/null -x c /dev/null >/dev/null 2>&1; }; \
then echo "$(1)"; else echo "$(2)"; fi)
# Helper to pass comma character to make functions (use with `$(,)` to pass in `$(call ...)` arguments)
+6 -35
View File
@@ -4,47 +4,18 @@
The QMK CLI (command line interface) makes building and working with QMK keyboards easier. We have provided a number of commands to simplify and streamline tasks such as obtaining and compiling the QMK firmware, creating keymaps, and more.
### Requirements {#requirements}
### Installation {#installation}
QMK requires Python 3.9 or greater. We try to keep the number of requirements small but you will also need to install the packages listed in [`requirements.txt`](https://github.com/qmk/qmk_firmware/blob/master/requirements.txt). These are installed automatically when you install the QMK CLI.
### Install Using Homebrew (macOS, some Linux) {#install-using-homebrew}
If you have installed [Homebrew](https://brew.sh) you can tap and install QMK:
The recommended way to install the QMK CLI and all necessary dependencies (toolchains, flashing utilities, udev rules on Linux) is to use the bootstrapper script:
```
brew install qmk/qmk/qmk
export QMK_HOME='~/qmk_firmware' # Optional, set the location for `qmk_firmware`
qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment
curl -fsSL https://install.qmk.fm | sh
```
### Install Using uv {#install-using-uv}
If you have installed [uv](https://docs.astral.sh/uv/), the QMK CLI can be installed and managed as a uv tool:
For more options, run:
```
uv tool install qmk
export QMK_HOME='~/qmk_firmware' # Optional, set the location for `qmk_firmware`
qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment
curl -fsSL https://install.qmk.fm | sh -s -- --help
```
This installation can be updated via `uv tool upgrade qmk`. See [Upgrading tools](https://docs.astral.sh/uv/guides/tools/#upgrading-tools) for more information.
### Install Using pip {#install-using-easy_install-or-pip}
If your system is not listed above you can install QMK manually. First ensure that you have Python 3.9 (or later) installed and have installed pip. Then install QMK with this command:
```
python3 -m pip install qmk
export QMK_HOME='~/qmk_firmware' # Optional, set the location for `qmk_firmware`
qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment
```
### Packaging For Other Operating Systems {#packaging-for-other-operating-systems}
We are looking for people to create and maintain a `qmk` package for more operating systems. If you would like to create a package for your OS please follow these guidelines:
* Follow best practices for your OS when they conflict with these guidelines
* Document why in a comment when you do deviate
* Install using a virtualenv
* Instruct the user to set the environment variable `QMK_HOME` to have the firmware source checked out somewhere other than `~/qmk_firmware`.
For detailed setup instructions, see [Setting Up Your QMK Environment](newbs_getting_started#set-up-your-environment).
+5 -5
View File
@@ -12,11 +12,11 @@ If you intend to maintain keyboards and/or contribute to QMK, you can enable the
`qmk config user.developer=True`
This will allow you to see all available subcommands.
**Note:** You will have to install additional requirements:
```
python3 -m pip install -r requirements-dev.txt
```
This will allow you to see all available subcommands.
::: tip
If you installed QMK using the bootstrapper (`curl -fsSL https://install.qmk.fm | sh`), the development requirements are already installed.
:::
# Subcommands
+4
View File
@@ -14,6 +14,10 @@ Example:
This page covers my super cool feature. You can use this feature to make coffee, squeeze fresh oj, and have an egg mcmuffin and hashbrowns delivered from your local macca's by drone.
```
# Paragraphs
Do not use hard line breaks within the raw Markdown for each paragraph. These are optional in Markdown, and have no effect on the rendered output. This means each raw paragraph will be a single long line in your editor (best viewed with line wrapping enabled).
# Headings
Your page should generally have multiple "H1" headings. Only H1 and H2 headings will included in the Table of Contents, so plan them out appropriately. Excess width should be avoided in H1 and H2 headings to prevent the Table of Contents from getting too wide.
+2 -5
View File
@@ -19,13 +19,10 @@ Note that running `make` with `sudo` is generally ***not*** a good idea, and you
### Linux `udev` Rules {#linux-udev-rules}
On Linux, you'll need proper privileges to communicate with the bootloader device. You can either use `sudo` when flashing firmware (not recommended), or place [this file](https://github.com/qmk/qmk_firmware/tree/master/util/udev/50-qmk.rules) into `/etc/udev/rules.d/`.
Once added, run the following:
On Linux, you'll need proper privileges to communicate with the bootloader device. You can either use `sudo` when flashing firmware (not recommended), or install the udev rules from the [qmk_udev](https://github.com/qmk/qmk_udev) repository by running:
```
sudo udevadm control --reload-rules
sudo udevadm trigger
util/install_udev.sh
```
**Note:** With older versions of ModemManager (< 1.12), filtering only works when not in strict mode. The following commands can update that setting:
+114 -6
View File
@@ -1,14 +1,20 @@
# Persistent Configuration (EEPROM)
This allows you to configure persistent settings for your keyboard. These settings are stored in the EEPROM of your controller, and are retained even after power loss. The settings can be read with `eeconfig_read_kb` and `eeconfig_read_user`, and can be written to using `eeconfig_update_kb` and `eeconfig_update_user`. This is useful for features that you want to be able to toggle (like toggling rgb layer indication). Additionally, you can use `eeconfig_init_kb` and `eeconfig_init_user` to set the default values for the EEPROM.
The complicated part here, is that there are a bunch of ways that you can store and access data via EEPROM, and there is no "correct" way to do this. However, you only have a DWORD (4 bytes) for each function.
This allows you to configure persistent settings for your keyboard. These settings are stored in the EEPROM of your controller, and are retained even after power loss.
Keep in mind that EEPROM has a limited number of writes. While this is very high, it's not the only thing writing to the EEPROM, and if you write too often, you can potentially drastically shorten the life of your MCU.
* If you don't understand the example, then you may want to avoid using this feature, as it is rather complicated.
::: tip
If you don't understand the examples, then you may want to avoid using this feature, as it is rather complicated.
:::
## Example Implementation
## Basic
The settings can be read with `eeconfig_read_kb` and `eeconfig_read_user`, and can be written to using `eeconfig_update_kb` and `eeconfig_update_user`. This is useful for features that you want to be able to toggle (like toggling rgb layer indication). Additionally, you can use `eeconfig_init_kb` and `eeconfig_init_user` to set the default values for the EEPROM.
The complicated part here, is that there are a bunch of ways that you can store and access data via EEPROM, and there is no "correct" way to do this. However, you only have a DWORD (4 bytes) for each function.
### Example Implementation
This is an example of how to add settings, and read and write it. We're using the user keymap for the example here. This is a complex function, and has a lot going on. In fact, it uses a lot of the above functions to work!
@@ -126,9 +132,111 @@ void eeconfig_init_user(void) { // EEPROM is getting reset!
And you're done. The RGB layer indication will only work if you want it to. And it will be saved, even after unplugging the board. And if you use any of the RGB codes, it will disable the layer indication, so that it stays on the mode and color that you set it to.
## 'EECONFIG' Function Documentation
### Basic API
* Keyboard/Revision: `void eeconfig_init_kb(void)`, `uint32_t eeconfig_read_kb(void)` and `void eeconfig_update_kb(uint32_t val)`
* Keymap: `void eeconfig_init_user(void)`, `uint32_t eeconfig_read_user(void)` and `void eeconfig_update_user(uint32_t val)`
The `val` is the value of the data that you want to write to EEPROM. And the `eeconfig_read_*` function return a 32 bit (DWORD) value from the EEPROM.
## Datablock {#datablock}
An extended form exists that allows larger blocks of data to be allocated.
::: info
When using datablock, the [basic API](#eeconfig-function-documentation) is unavailable.
:::
:::::tabs
==== keyboard
In `config.h`, define the size required, and optionally a version number:
| Define | Default | Description |
|------------------------------|---------------------------|------------------------------------------------------------------|
| `EECONFIG_KB_DATA_SIZE` | `0` | Size in bytes for the persistent block of data |
| `EECONFIG_KB_DATA_VERSION` | `EECONFIG_KB_DATA_SIZE` | Version number that can be incremented to invalidate stored data |
Which exposes the following API:
```c
bool eeconfig_is_kb_datablock_valid(void);
uint32_t eeconfig_read_kb_datablock(void *data, uint32_t offset, uint32_t length) __attribute__((nonnull));
uint32_t eeconfig_update_kb_datablock(const void *data, uint32_t offset, uint32_t length) __attribute__((nonnull));
void eeconfig_init_kb_datablock(void);
# define eeconfig_read_kb_datablock_field(__object, __field) eeconfig_read_kb_datablock(&(__object.__field), offsetof(typeof(__object), __field), sizeof(__object.__field))
# define eeconfig_update_kb_datablock_field(__object, __field) eeconfig_update_kb_datablock(&(__object.__field), offsetof(typeof(__object), __field), sizeof(__object.__field))
```
==== keymap
In `config.h`, define the size required, and optionally a version number:
| Define | Default | Description |
|------------------------------|---------------------------|------------------------------------------------------------------|
| `EECONFIG_USER_DATA_SIZE` | `0` | Size in bytes for the persistent block of data |
| `EECONFIG_USER_DATA_VERSION` | `EECONFIG_USER_DATA_SIZE` | Version number that can be incremented to invalidate stored data |
Which exposes the following API:
```c
bool eeconfig_is_user_datablock_valid(void);
uint32_t eeconfig_read_user_datablock(void *data, uint32_t offset, uint32_t length) __attribute__((nonnull));
uint32_t eeconfig_update_user_datablock(const void *data, uint32_t offset, uint32_t length) __attribute__((nonnull));
void eeconfig_init_user_datablock(void);
# define eeconfig_read_user_datablock_field(__object, __field) eeconfig_read_user_datablock(&(__object.__field), offsetof(typeof(__object), __field), sizeof(__object.__field))
# define eeconfig_update_user_datablock_field(__object, __field) eeconfig_update_user_datablock(&(__object.__field), offsetof(typeof(__object), __field), sizeof(__object.__field))
```
:::::
### Example
This is an example of how to add settings, and read and write it. We're using the user keymap for the example here.
In your `config.h` add:
```c
#define EECONFIG_USER_DATA_SIZE 8
```
In your keymap.c file, add:
```c
#include "debug.h"
#include "timer.h"
#include "eeconfig.h"
typedef struct my_config_t {
uint64_t data;
} my_config_t;
static my_config_t config;
void keyboard_post_init_user(void) {
if (!eeconfig_is_user_datablock_valid()) {
eeconfig_init_user_datablock();
}
eeconfig_read_user_datablock(&config, 0, sizeof(my_config_t));
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (!record->event.pressed) {
config.data += 1;
eeconfig_update_user_datablock(&config, 0, sizeof(my_config_t));
}
return true;
}
void housekeeping_task_user(void) {
static uint32_t last_sync = 0;
if (timer_elapsed32(last_sync) > 1000) {
last_sync = timer_read32();
dprintf("Config: %ld\n", config.data);
}
}
```
+1 -1
View File
@@ -51,7 +51,7 @@ Sometimes you need more than one base layer. For example, if you want to switch
### Advanced Users {#advanced-users}
Once you have a good feel for how layers work and what you can do, you can get more creative. The rules listed in the beginner section will help you be successful by avoiding some of the tricker details but they can be constraining, especially for ultra-compact keyboard users. Understanding how layers work will allow you to use them in more advanced ways.
Once you have a good feel for how layers work and what you can do, you can get more creative. The rules listed in the beginner section will help you be successful by avoiding some of the trickier details but they can be constraining, especially for ultra-compact keyboard users. Understanding how layers work will allow you to use them in more advanced ways.
Layers stack on top of each other in numerical order. When determining what a keypress does, QMK scans the layers from the top down, stopping when it reaches the first active layer that is not set to `KC_TRNS`. As a result if you activate a layer that is numerically lower than your current layer, and your current layer (or another layer that is active and higher than your target layer) has something other than `KC_TRNS`, that is the key that will be sent, not the key on the layer you just activated. This is the cause of most people's "why doesn't my layer get switched" problem.
+1
View File
@@ -77,6 +77,7 @@ Tips:
* For smoother cursor movements, lower the value of `MOUSEKEY_INTERVAL`. If the refresh rate of your display is 60Hz, you could set it to `16` (1/60). As this raises the cursor speed significantly, you may want to lower `MOUSEKEY_MAX_SPEED`.
* Setting `MOUSEKEY_TIME_TO_MAX` or `MOUSEKEY_WHEEL_TIME_TO_MAX` to `0` will disable acceleration for the cursor or scrolling respectively. This way you can make one of them constant while keeping the other accelerated, which is not possible in constant speed mode.
* Setting `MOUSEKEY_WHEEL_INTERVAL` too low will make scrolling too fast. Setting it too high will make scrolling too slow when the wheel key is held down.
* `MS_ACL0`, `MS_ACL1` and `MS_ACL2` change the cursor and scroll speed to 1/4, 1/2, and the maximum speed, respectively.
Cursor acceleration uses the same algorithm as the X Window System MouseKeysAccel feature. You can read more about it [on Wikipedia](https://en.wikipedia.org/wiki/Mouse_keys).
+6 -1
View File
@@ -142,8 +142,13 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
}
```
Then please open an issue on Github with this information and tell what OS was not detected correctly and if you have any intermediate devices between keyboard and your computer.
Add both `STORE_SETUPS` and `PRINT_SETUPS` to your keyboard's keymap. Connect the keyboard to the device where the OS was not recognised, and press the `STORE_SETUPS` key to capture and store the fingerprint. On your development computer, run one of the suggested [console debugging tools](/faq_debug#debugging-tools), connect the keyboard, and press the `PRINT_SETUPS` key. The console should display multiple lines of data from the most recent `STORE_SETUPS` run.
Open an issue on GitHub and paste the console output into the issue. Also tell us which OS (including the version, if possible) was not detected correctly and whether any intermediate devices, such as a USB hub, were used between the keyboard and the target device.
::: tip
If `STORE_SETUPS` has not been used previously, `PRINT_SETUPS` will report whatever values are already present in the controller's EEPROM. These may appear as random numbers.
:::
## Credits
+2 -2
View File
@@ -217,8 +217,8 @@ To generate this bootloader, use the `bootloader` target, eg. `make planck/rev4:
Compatible flashers:
* TBD
* Currently, you need to either use the [Python script](https://github.com/qmk/lufa/tree/master/Bootloaders/HID/HostLoaderApp_python), or compile [`hid_bootloader_cli`](https://github.com/qmk/lufa/tree/master/Bootloaders/HID/HostLoaderApp), from the LUFA repo. Homebrew may (will) have support for this directly (via `brew install qmk/qmk/hid_bootloader_cli`).
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI)
* [hid_bootloader_cli](https://github.com/qmk/lufa/tree/master/Bootloaders/HID/HostLoaderApp) / `:qmk-hid` target in QMK (recommended command line)
Flashing sequence:
+2
View File
@@ -33,11 +33,13 @@ If you own a board from one of the following vendors already, consider asking th
| iLovBee | Official 30-day copyright source code request issued Sep 11 2024 due to deception on PR, no response received. Ambiguity on PRs -- marketing says wireless, PR author said wired-only, then included wireless code anyway. Seemingly intentionally deceptive. |
| KiiBOOM | Seems to use the same OEM as Epomaker, same problems. |
| kprepublic | Makes no attempt to release source code, all boards in QMK are reverse-engineered, created, and supported by the community. New board variants magically appear without telling customers they're incompatible with existing QMK versions, in some cases bricking boards or requiring ISP flashing. |
| Lofree | Selling tri-mode boards based on QMK without sources, just `via.json` provided. |
| Luminkey | Selling tri-mode boards based on QMK without sources, just `via.json` provided. |
| Meletrix | Selling tri-mode boards based on QMK without sources, just `via.json` provided. |
| mmd / Smartmmd / i-game.tech | Ambiguity on PRs -- marketing says wireless, PR author said wired-only, then included wireless code anyway. Seemingly intentionally deceptive. |
| MyKeyClub | Community-supported JRIS75, vendor was contacted by community members and refused to cooperate. |
| owlab | Selling wired based on QMK without sources, just `via.json` provided. Ambiguous as to whether or not wireless firmware is based on QMK, given that their configuration tool looks very similar to VIA. |
| PMO Lab | Selling tri-mode boards based on QMK without sources, just `via.json` provided. |
| pressplayid | Selling wired and tri-mode boards based on QMK without sources, just `via.json` provided |
| qwertykeys | Selling wired and tri-mode boards based on QMK without sources, just `via.json` provided. |
| Redragon | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. |
+52 -49
View File
@@ -2,65 +2,68 @@
// A simple ringbuffer holding Size elements of type T
template <typename T, uint8_t Size>
class RingBuffer {
protected:
T buf_[Size];
uint8_t head_{0}, tail_{0};
public:
inline uint8_t nextPosition(uint8_t position) {
return (position + 1) % Size;
}
protected:
T buf_[Size];
uint8_t head_{0}, tail_{0};
inline uint8_t prevPosition(uint8_t position) {
if (position == 0) {
return Size - 1;
}
return position - 1;
}
inline bool enqueue(const T &item) {
static_assert(Size > 1, "RingBuffer size must be > 1");
uint8_t next = nextPosition(head_);
if (next == tail_) {
// Full
return false;
public:
inline uint8_t nextPosition(uint8_t position) {
return (position + 1) % Size;
}
buf_[head_] = item;
head_ = next;
return true;
}
inline bool get(T &dest, bool commit = true) {
auto tail = tail_;
if (tail == head_) {
// No more data
return false;
inline uint8_t prevPosition(uint8_t position) {
if (position == 0) {
return Size - 1;
}
return position - 1;
}
dest = buf_[tail];
tail = nextPosition(tail);
inline bool enqueue(const T &item) {
static_assert(Size > 1, "RingBuffer size must be > 1");
uint8_t next = nextPosition(head_);
if (next == tail_) {
// Full
return false;
}
if (commit) {
tail_ = tail;
buf_[head_] = item;
head_ = next;
return true;
}
return true;
}
inline bool empty() const { return head_ == tail_; }
inline bool get(T &dest, bool commit = true) {
auto tail = tail_;
if (tail == head_) {
// No more data
return false;
}
inline uint8_t size() const {
int diff = head_ - tail_;
if (diff >= 0) {
return diff;
dest = buf_[tail];
tail = nextPosition(tail);
if (commit) {
tail_ = tail;
}
return true;
}
return Size + diff;
}
inline T& front() {
return buf_[tail_];
}
inline bool empty() const {
return head_ == tail_;
}
inline bool peek(T &item) {
return get(item, false);
}
inline uint8_t size() const {
int diff = head_ - tail_;
if (diff >= 0) {
return diff;
}
return Size + diff;
}
inline T &front() {
return buf_[tail_];
}
inline bool peek(T &item) {
return get(item, false);
}
};
+1 -2
View File
@@ -101,8 +101,7 @@ void ps2_mouse_task(void) {
# endif
} else {
if (debug_mouse) print("ps2_mouse: fail to get mouse packet\n");
/* return here to avoid updating the mouse button state */
return;
// Continue processing anyway to ensure mouse button state is still updated
}
#endif
+1 -1
View File
@@ -23,7 +23,7 @@
#include "gpio.h"
#include "pointing_device_internal.h"
const pointing_device_driver_t pmw3320_pointing_device_drivera = {
const pointing_device_driver_t pmw3320_pointing_device_driver = {
.init = pmw3320_init,
.get_report = pmw3320_get_report,
.set_cpi = pmw3320_set_cpi,
+7
View File
@@ -0,0 +1,7 @@
// Copyright 2026 Dominic Yeap-Holliday <DoomishGuy>
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
// Trackpoint
#define PS2_PIO_USE_PIO1
+170
View File
@@ -0,0 +1,170 @@
{
"manufacturer": "NA",
"keyboard_name": "Alatus",
"maintainer": "DoomishGuy",
"bootmagic": {
"matrix": [0, 4]
},
"development_board": "promicro_rp2040",
"diode_direction": "COL2ROW",
"encoder": {
"rotary": [
{"pin_a": "GP22", "pin_b": "GP26"}
]
},
"features": {
"bootmagic": true,
"encoder": true,
"extrakey": true,
"mousekey": true,
"nkro": true,
"rgb_matrix": true
},
"matrix_pins": {
"cols": ["GP8", "GP9", "GP21", "GP23", "GP20"],
"rows": ["GP4", "GP5", "GP6", "GP7"]
},
"ps2": {
"clock_pin": "GP28",
"data_pin": "GP27",
"driver": "vendor",
"enabled": true,
"mouse_enabled": true
},
"rgb_matrix": {
"driver": "ws2812",
"layout": [
{"x": 90, "y": 33, "flags": 8},
{"x": 90, "y": 49, "flags": 8},
{"matrix": [3, 4], "x": 85, "y": 51, "flags": 4},
{"matrix": [3, 3], "x": 64, "y": 46, "flags": 4},
{"matrix": [3, 2], "x": 44, "y": 43, "flags": 4},
{"matrix": [3, 1], "x": 26, "y": 43, "flags": 4},
{"matrix": [2, 4], "x": 72, "y": 31, "flags": 4},
{"matrix": [2, 3], "x": 54, "y": 29, "flags": 4},
{"matrix": [2, 2], "x": 36, "y": 24, "flags": 4},
{"matrix": [2, 1], "x": 18, "y": 28, "flags": 4},
{"matrix": [2, 0], "x": 0, "y": 36, "flags": 4},
{"matrix": [1, 4], "x": 72, "y": 19, "flags": 4},
{"matrix": [1, 3], "x": 54, "y": 17, "flags": 4},
{"matrix": [1, 2], "x": 36, "y": 12, "flags": 4},
{"matrix": [1, 1], "x": 18, "y": 16, "flags": 4},
{"matrix": [1, 0], "x": 0, "y": 24, "flags": 4},
{"matrix": [0, 4], "x": 72, "y": 7, "flags": 4},
{"matrix": [0, 3], "x": 54, "y": 5, "flags": 4},
{"matrix": [0, 2], "x": 36, "y": 0, "flags": 4},
{"matrix": [0, 1], "x": 18, "y": 4, "flags": 4},
{"matrix": [0, 0], "x": 0, "y": 12, "flags": 4},
{"x": 0, "y": 9, "flags": 2},
{"x": 45, "y": 0, "flags": 2},
{"x": 80, "y": 11, "flags": 2},
{"x": 75, "y": 48, "flags": 2},
{"x": 54, "y": 44, "flags": 2},
{"x": 17, "y": 45, "flags": 2},
{"x": 134, "y": 33, "flags": 8},
{"x": 134, "y": 49, "flags": 8},
{"matrix": [7, 4], "x": 139, "y": 51, "flags": 4},
{"matrix": [7, 3], "x": 160, "y": 46, "flags": 4},
{"matrix": [7, 2], "x": 180, "y": 43, "flags": 4},
{"matrix": [7, 1], "x": 198, "y": 43, "flags": 4},
{"matrix": [6, 4], "x": 152, "y": 31, "flags": 4},
{"matrix": [6, 3], "x": 170, "y": 29, "flags": 4},
{"matrix": [6, 2], "x": 188, "y": 24, "flags": 4},
{"matrix": [6, 1], "x": 206, "y": 28, "flags": 4},
{"matrix": [6, 0], "x": 224, "y": 36, "flags": 4},
{"matrix": [5, 4], "x": 152, "y": 19, "flags": 4},
{"matrix": [5, 3], "x": 170, "y": 17, "flags": 4},
{"matrix": [5, 2], "x": 188, "y": 12, "flags": 4},
{"matrix": [5, 1], "x": 206, "y": 16, "flags": 4},
{"matrix": [5, 0], "x": 224, "y": 24, "flags": 4},
{"matrix": [4, 4], "x": 152, "y": 7, "flags": 4},
{"matrix": [4, 3], "x": 170, "y": 5, "flags": 4},
{"matrix": [4, 2], "x": 188, "y": 0, "flags": 4},
{"matrix": [4, 1], "x": 206, "y": 4, "flags": 4},
{"matrix": [4, 0], "x": 224, "y": 12, "flags": 4},
{"x": 224, "y": 9, "flags": 2},
{"x": 179, "y": 0, "flags": 2},
{"x": 144, "y": 11, "flags": 2},
{"x": 149, "y": 48, "flags": 2},
{"x": 170, "y": 44, "flags": 2},
{"x": 207, "y": 45, "flags": 2}
],
"max_brightness": 128,
"split_count": [27, 27]
},
"split": {
"bootmagic": {
"matrix": [4, 4]
},
"enabled": true,
"encoder": {
"right": {
"rotary": [
{"pin_a": "GP26", "pin_b": "GP22"}
]
}
},
"handedness": {
"pin": "GP29"
},
"serial": {
"driver": "vendor",
"pin": "GP1"
}
},
"tags": ["columnar", "split", "encoder", "choc v1", "choc spaced", "RP2040"],
"url": "https://codeberg.org/DoomishGuy/alatus",
"usb": {
"device_version": "1.0.0",
"pid": "0x0000",
"vid": "0xFEED"
},
"ws2812": {
"driver": "vendor",
"pin": "GP0"
},
"layouts": {
"LAYOUT": {
"layout": [
{"label": "L04", "matrix": [0, 0], "x": 0, "y": 1.1},
{"label": "L03", "matrix": [0, 1], "x": 1, "y": 0.35},
{"label": "L02", "matrix": [0, 2], "x": 2, "y": 0},
{"label": "L01", "matrix": [0, 3], "x": 3, "y": 0.38},
{"label": "L00", "matrix": [0, 4], "x": 4, "y": 0.53},
{"label": "R00", "matrix": [4, 4], "x": 10, "y": 0.53},
{"label": "R01", "matrix": [4, 3], "x": 11, "y": 0.38},
{"label": "R02", "matrix": [4, 2], "x": 12, "y": 0},
{"label": "R03", "matrix": [4, 1], "x": 13, "y": 0.35},
{"label": "R04", "matrix": [4, 0], "x": 14, "y": 1.1},
{"label": "L09", "matrix": [1, 0], "x": 0, "y": 2.1},
{"label": "L08", "matrix": [1, 1], "x": 1, "y": 1.35},
{"label": "L07", "matrix": [1, 2], "x": 2, "y": 1},
{"label": "L06", "matrix": [1, 3], "x": 3, "y": 1.38},
{"label": "L05", "matrix": [1, 4], "x": 4, "y": 1.53},
{"label": "R05", "matrix": [5, 4], "x": 10, "y": 1.53},
{"label": "R06", "matrix": [5, 3], "x": 11, "y": 1.38},
{"label": "R07", "matrix": [5, 2], "x": 12, "y": 1},
{"label": "R08", "matrix": [5, 1], "x": 13, "y": 1.35},
{"label": "R09", "matrix": [5, 0], "x": 14, "y": 2.1},
{"label": "L14", "matrix": [2, 0], "x": 0, "y": 3.1},
{"label": "L13", "matrix": [2, 1], "x": 1, "y": 2.35},
{"label": "L12", "matrix": [2, 2], "x": 2, "y": 2},
{"label": "L11", "matrix": [2, 3], "x": 3, "y": 2.38},
{"label": "L10", "matrix": [2, 4], "x": 4, "y": 2.53},
{"label": "R10", "matrix": [6, 4], "x": 10, "y": 2.53},
{"label": "R11", "matrix": [6, 3], "x": 11, "y": 2.38},
{"label": "R12", "matrix": [6, 2], "x": 12, "y": 2},
{"label": "R13", "matrix": [6, 1], "x": 13, "y": 2.35},
{"label": "R14", "matrix": [6, 0], "x": 14, "y": 3.1},
{"label": "L18", "matrix": [3, 1], "x": 1, "y": 4},
{"label": "L17", "matrix": [3, 2], "x": 2, "y": 4},
{"label": "L16", "matrix": [3, 3], "x": 3, "y": 4.25},
{"label": "L15", "matrix": [3, 4], "x": 4, "y": 4.5},
{"label": "R15", "matrix": [7, 4], "x": 10, "y": 4.5},
{"label": "R16", "matrix": [7, 3], "x": 11, "y": 4.25},
{"label": "R17", "matrix": [7, 2], "x": 12, "y": 4},
{"label": "R18", "matrix": [7, 1], "x": 13, "y": 4}
]
}
}
}
+25
View File
@@ -0,0 +1,25 @@
// Copyright 2026 Dominic Yeap-Holliday <DoomishGuy>
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
enum layers {
_QWERTY,
};
// clang-format off
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = LAYOUT(
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,
KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,
KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLASH,
KC_LCTL, KC_LGUI, KC_SPACE, KC_ENTER, KC_TAB, KC_BSPC, KC_RSFT, KC_RALT
)
};
// clang-format on
#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
[_QWERTY] = {ENCODER_CCW_CW(KC_L, KC_R), ENCODER_CCW_CW(KC_U, KC_D)},
};
#endif
@@ -0,0 +1,4 @@
# Alatus's Default Keymap
The default keymap is intentionally Spartan, and is not intended for long term use.
The provided `rules.mk` enables encoder mapping to test encoder functionality.
@@ -0,0 +1 @@
ENCODER_MAP_ENABLE = yes
+26
View File
@@ -0,0 +1,26 @@
# alatus
![alatus](https://i.imgur.com/kVrFpSJ.jpeg)
A low profile 38 key split keyboard featuring rotary encoder and trackpoint support.
* Keyboard Maintainer: [DoomishGuy](https://codeberg.org/DoomishGuy)
* Hardware Supported: RP2040 Pro Micro and compatible
* Hardware Availability: [DoomishGuy/alatus](https://codeberg.org/DoomishGuy/alatus)
Make example for this keyboard (after setting up your build environment):
make alatus:default
Flashing example for this keyboard:
make alatus: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:
* **Bootmagic reset**: Hold down the top left/right key (for the left/right splits respectively) and plug in the keyboard.
* **Physical reset button**: Press the reset button below the microcontroller twice in quick succession.
+245
View File
@@ -0,0 +1,245 @@
{
"manufacturer": "A.Okay!",
"keyboard_name": "MID.1",
"maintainer": "sizezero",
"bootloader": "atmel-dfu",
"diode_direction": "COL2ROW",
"encoder": {
"rotary": [
{"pin_a": "D1", "pin_b": "D2"},
{"pin_a": "D3", "pin_b": "D5"}
]
},
"features": {
"bootmagic": true,
"encoder": true,
"extrakey": true,
"mousekey": true,
"nkro": true,
"rgblight": true
},
"matrix_pins": {
"cols": ["E6", "B0", "F0", "F1", "F4", "F5", "F6", "F7", "C7", "C6", "B6", "B5"],
"rows": ["B4", "D7", "D6", "D4"]
},
"processor": "atmega32u4",
"qmk": {
"locking": {
"enabled": true,
"resync": true
}
},
"rgblight": {
"animations": {
"breathing": true,
"knight": true,
"rainbow_mood": true,
"rainbow_swirl": true
},
"brightness_steps": 8,
"default": {
"hue": 15,
"val": 128
},
"hue_steps": 5,
"led_count": 8,
"max_brightness": 200,
"saturation_steps": 8,
"sleep": true
},
"url": "https://www.aokay.cool/mid-1",
"usb": {
"device_version": "0.1.0",
"pid": "0x414F",
"vid": "0x1001"
},
"ws2812": {
"pin": "D0"
},
"layouts": {
"LAYOUT_all": {
"layout": [
{"label": "sw1", "matrix": [0, 0], "x": 0, "y": 0},
{"label": "sw2", "matrix": [0, 1], "x": 1, "y": 0},
{"label": "sw3", "matrix": [0, 2], "x": 2, "y": 0},
{"label": "sw4", "matrix": [0, 3], "x": 3, "y": 0},
{"label": "sw5", "matrix": [0, 4], "x": 4, "y": 0},
{"label": "sw6", "matrix": [0, 5], "x": 5, "y": 0},
{"label": "sw7", "matrix": [0, 6], "x": 6, "y": 0},
{"label": "sw8", "matrix": [0, 7], "x": 7, "y": 0},
{"label": "sw9", "matrix": [0, 8], "x": 8, "y": 0},
{"label": "sw10", "matrix": [0, 9], "x": 9, "y": 0},
{"label": "sw11", "matrix": [0, 10], "x": 10, "y": 0},
{"label": "sw12", "matrix": [0, 11], "x": 11, "y": 0},
{"label": "sw13", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.25},
{"label": "sw14", "matrix": [1, 1], "x": 1.25, "y": 1},
{"label": "sw15", "matrix": [1, 2], "x": 2.25, "y": 1},
{"label": "sw16", "matrix": [1, 3], "x": 3.25, "y": 1},
{"label": "sw17", "matrix": [1, 4], "x": 4.25, "y": 1},
{"label": "sw18", "matrix": [1, 5], "x": 5.25, "y": 1},
{"label": "sw19", "matrix": [1, 6], "x": 6.25, "y": 1},
{"label": "sw20", "matrix": [1, 7], "x": 7.25, "y": 1},
{"label": "sw21", "matrix": [1, 8], "x": 8.25, "y": 1},
{"label": "sw22", "matrix": [1, 9], "x": 9.25, "y": 1},
{"label": "sw23", "matrix": [1, 10], "x": 10.25, "y": 1, "w": 1.75},
{"label": "sw24", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"label": "sw25", "matrix": [2, 1], "x": 1.75, "y": 2},
{"label": "sw26", "matrix": [2, 2], "x": 2.75, "y": 2},
{"label": "sw27", "matrix": [2, 3], "x": 3.75, "y": 2},
{"label": "sw28", "matrix": [2, 4], "x": 4.75, "y": 2},
{"label": "sw29", "matrix": [2, 5], "x": 5.75, "y": 2},
{"label": "sw30", "matrix": [2, 6], "x": 6.75, "y": 2},
{"label": "sw31", "matrix": [2, 7], "x": 7.75, "y": 2},
{"label": "sw32", "matrix": [2, 8], "x": 8.75, "y": 2},
{"label": "sw33", "matrix": [2, 9], "x": 9.75, "y": 2},
{"label": "sw34", "matrix": [2, 10], "x": 10.75, "y": 2, "w": 1.25},
{"label": "sw35", "matrix": [3, 0], "x": 0, "y": 3, "w": 1.5},
{"label": "sw36", "matrix": [3, 1], "x": 1.5, "y": 3},
{"label": "sw37", "matrix": [3, 2], "x": 2.5, "y": 3},
{"label": "sw38", "matrix": [3, 3], "x": 3.5, "y": 5, "w": 2.25},
{"label": "sw39", "matrix": [3, 4], "x": 3.5, "y": 3, "w": 2.75},
{"label": "sw40", "matrix": [3, 5], "x": 2.5, "y": 4, "w": 7},
{"label": "sw41", "matrix": [3, 6], "x": 6.25, "y": 3, "w": 2.25},
{"label": "sw42", "matrix": [3, 7], "x": 6.75, "y": 5, "w": 2.75},
{"label": "sw43", "matrix": [3, 8], "x": 8.5, "y": 3},
{"label": "sw44", "matrix": [3, 9], "x": 9.5, "y": 3},
{"label": "sw45", "matrix": [3, 10], "x": 10.5, "y": 3, "w": 1.5}
]
},
"LAYOUT_275u_225u": {
"layout": [
{"label": "sw1", "matrix": [0, 0], "x": 0, "y": 0},
{"label": "sw2", "matrix": [0, 1], "x": 1, "y": 0},
{"label": "sw3", "matrix": [0, 2], "x": 2, "y": 0},
{"label": "sw4", "matrix": [0, 3], "x": 3, "y": 0},
{"label": "sw5", "matrix": [0, 4], "x": 4, "y": 0},
{"label": "sw6", "matrix": [0, 5], "x": 5, "y": 0},
{"label": "sw7", "matrix": [0, 6], "x": 6, "y": 0},
{"label": "sw8", "matrix": [0, 7], "x": 7, "y": 0},
{"label": "sw9", "matrix": [0, 8], "x": 8, "y": 0},
{"label": "sw10", "matrix": [0, 9], "x": 9, "y": 0},
{"label": "sw11", "matrix": [0, 10], "x": 10, "y": 0},
{"label": "sw12", "matrix": [0, 11], "x": 11, "y": 0},
{"label": "sw13", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.25},
{"label": "sw14", "matrix": [1, 1], "x": 1.25, "y": 1},
{"label": "sw15", "matrix": [1, 2], "x": 2.25, "y": 1},
{"label": "sw16", "matrix": [1, 3], "x": 3.25, "y": 1},
{"label": "sw17", "matrix": [1, 4], "x": 4.25, "y": 1},
{"label": "sw18", "matrix": [1, 5], "x": 5.25, "y": 1},
{"label": "sw19", "matrix": [1, 6], "x": 6.25, "y": 1},
{"label": "sw20", "matrix": [1, 7], "x": 7.25, "y": 1},
{"label": "sw21", "matrix": [1, 8], "x": 8.25, "y": 1},
{"label": "sw22", "matrix": [1, 9], "x": 9.25, "y": 1},
{"label": "sw23", "matrix": [1, 10], "x": 10.25, "y": 1, "w": 1.75},
{"label": "sw24", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"label": "sw25", "matrix": [2, 1], "x": 1.75, "y": 2},
{"label": "sw26", "matrix": [2, 2], "x": 2.75, "y": 2},
{"label": "sw27", "matrix": [2, 3], "x": 3.75, "y": 2},
{"label": "sw28", "matrix": [2, 4], "x": 4.75, "y": 2},
{"label": "sw29", "matrix": [2, 5], "x": 5.75, "y": 2},
{"label": "sw30", "matrix": [2, 6], "x": 6.75, "y": 2},
{"label": "sw31", "matrix": [2, 7], "x": 7.75, "y": 2},
{"label": "sw32", "matrix": [2, 8], "x": 8.75, "y": 2},
{"label": "sw33", "matrix": [2, 9], "x": 9.75, "y": 2},
{"label": "sw34", "matrix": [2, 10], "x": 10.75, "y": 2, "w": 1.25},
{"label": "sw35", "matrix": [3, 0], "x": 0, "y": 3, "w": 1.5},
{"label": "sw36", "matrix": [3, 1], "x": 1.5, "y": 3},
{"label": "sw37", "matrix": [3, 2], "x": 2.5, "y": 3},
{"label": "sw39", "matrix": [3, 4], "x": 3.5, "y": 3, "w": 2.75},
{"label": "sw41", "matrix": [3, 6], "x": 6.25, "y": 3, "w": 2.25},
{"label": "sw43", "matrix": [3, 8], "x": 8.5, "y": 3},
{"label": "sw44", "matrix": [3, 9], "x": 9.5, "y": 3},
{"label": "sw45", "matrix": [3, 10], "x": 10.5, "y": 3, "w": 1.5}
]
},
"LAYOUT_7u": {
"layout": [
{"label": "sw1", "matrix": [0, 0], "x": 0, "y": 0},
{"label": "sw2", "matrix": [0, 1], "x": 1, "y": 0},
{"label": "sw3", "matrix": [0, 2], "x": 2, "y": 0},
{"label": "sw4", "matrix": [0, 3], "x": 3, "y": 0},
{"label": "sw5", "matrix": [0, 4], "x": 4, "y": 0},
{"label": "sw6", "matrix": [0, 5], "x": 5, "y": 0},
{"label": "sw7", "matrix": [0, 6], "x": 6, "y": 0},
{"label": "sw8", "matrix": [0, 7], "x": 7, "y": 0},
{"label": "sw9", "matrix": [0, 8], "x": 8, "y": 0},
{"label": "sw10", "matrix": [0, 9], "x": 9, "y": 0},
{"label": "sw11", "matrix": [0, 10], "x": 10, "y": 0},
{"label": "sw12", "matrix": [0, 11], "x": 11, "y": 0},
{"label": "sw13", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.25},
{"label": "sw14", "matrix": [1, 1], "x": 1.25, "y": 1},
{"label": "sw15", "matrix": [1, 2], "x": 2.25, "y": 1},
{"label": "sw16", "matrix": [1, 3], "x": 3.25, "y": 1},
{"label": "sw17", "matrix": [1, 4], "x": 4.25, "y": 1},
{"label": "sw18", "matrix": [1, 5], "x": 5.25, "y": 1},
{"label": "sw19", "matrix": [1, 6], "x": 6.25, "y": 1},
{"label": "sw20", "matrix": [1, 7], "x": 7.25, "y": 1},
{"label": "sw21", "matrix": [1, 8], "x": 8.25, "y": 1},
{"label": "sw22", "matrix": [1, 9], "x": 9.25, "y": 1},
{"label": "sw23", "matrix": [1, 10], "x": 10.25, "y": 1, "w": 1.75},
{"label": "sw24", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"label": "sw25", "matrix": [2, 1], "x": 1.75, "y": 2},
{"label": "sw26", "matrix": [2, 2], "x": 2.75, "y": 2},
{"label": "sw27", "matrix": [2, 3], "x": 3.75, "y": 2},
{"label": "sw28", "matrix": [2, 4], "x": 4.75, "y": 2},
{"label": "sw29", "matrix": [2, 5], "x": 5.75, "y": 2},
{"label": "sw30", "matrix": [2, 6], "x": 6.75, "y": 2},
{"label": "sw31", "matrix": [2, 7], "x": 7.75, "y": 2},
{"label": "sw32", "matrix": [2, 8], "x": 8.75, "y": 2},
{"label": "sw33", "matrix": [2, 9], "x": 9.75, "y": 2},
{"label": "sw34", "matrix": [2, 10], "x": 10.75, "y": 2, "w": 1.25},
{"label": "sw35", "matrix": [3, 0], "x": 0, "y": 3, "w": 1.5},
{"label": "sw36", "matrix": [3, 1], "x": 1.5, "y": 3},
{"label": "sw40", "matrix": [3, 5], "x": 2.5, "y": 3, "w": 7},
{"label": "sw44", "matrix": [3, 9], "x": 9.5, "y": 3},
{"label": "sw45", "matrix": [3, 10], "x": 10.5, "y": 3, "w": 1.5}
]
},
"LAYOUT_225u_1u_275u": {
"layout": [
{"label": "sw1", "matrix": [0, 0], "x": 0, "y": 0},
{"label": "sw2", "matrix": [0, 1], "x": 1, "y": 0},
{"label": "sw3", "matrix": [0, 2], "x": 2, "y": 0},
{"label": "sw4", "matrix": [0, 3], "x": 3, "y": 0},
{"label": "sw5", "matrix": [0, 4], "x": 4, "y": 0},
{"label": "sw6", "matrix": [0, 5], "x": 5, "y": 0},
{"label": "sw7", "matrix": [0, 6], "x": 6, "y": 0},
{"label": "sw8", "matrix": [0, 7], "x": 7, "y": 0},
{"label": "sw9", "matrix": [0, 8], "x": 8, "y": 0},
{"label": "sw10", "matrix": [0, 9], "x": 9, "y": 0},
{"label": "sw11", "matrix": [0, 10], "x": 10, "y": 0},
{"label": "sw12", "matrix": [0, 11], "x": 11, "y": 0},
{"label": "sw13", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.25},
{"label": "sw14", "matrix": [1, 1], "x": 1.25, "y": 1},
{"label": "sw15", "matrix": [1, 2], "x": 2.25, "y": 1},
{"label": "sw16", "matrix": [1, 3], "x": 3.25, "y": 1},
{"label": "sw17", "matrix": [1, 4], "x": 4.25, "y": 1},
{"label": "sw18", "matrix": [1, 5], "x": 5.25, "y": 1},
{"label": "sw19", "matrix": [1, 6], "x": 6.25, "y": 1},
{"label": "sw20", "matrix": [1, 7], "x": 7.25, "y": 1},
{"label": "sw21", "matrix": [1, 8], "x": 8.25, "y": 1},
{"label": "sw22", "matrix": [1, 9], "x": 9.25, "y": 1},
{"label": "sw23", "matrix": [1, 10], "x": 10.25, "y": 1, "w": 1.75},
{"label": "sw24", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"label": "sw25", "matrix": [2, 1], "x": 1.75, "y": 2},
{"label": "sw26", "matrix": [2, 2], "x": 2.75, "y": 2},
{"label": "sw27", "matrix": [2, 3], "x": 3.75, "y": 2},
{"label": "sw28", "matrix": [2, 4], "x": 4.75, "y": 2},
{"label": "sw29", "matrix": [2, 5], "x": 5.75, "y": 2},
{"label": "sw30", "matrix": [2, 6], "x": 6.75, "y": 2},
{"label": "sw31", "matrix": [2, 7], "x": 7.75, "y": 2},
{"label": "sw32", "matrix": [2, 8], "x": 8.75, "y": 2},
{"label": "sw33", "matrix": [2, 9], "x": 9.75, "y": 2},
{"label": "sw34", "matrix": [2, 10], "x": 10.75, "y": 2, "w": 1.25},
{"label": "sw35", "matrix": [3, 0], "x": 0, "y": 3, "w": 1.5},
{"label": "sw36", "matrix": [3, 1], "x": 1.5, "y": 3},
{"label": "sw37", "matrix": [3, 2], "x": 2.5, "y": 3},
{"label": "sw38", "matrix": [3, 3], "x": 3.5, "y": 3, "w": 2.25},
{"label": "sw40", "matrix": [3, 5], "x": 5.75, "y": 3},
{"label": "sw42", "matrix": [3, 7], "x": 6.75, "y": 3, "w": 2.75},
{"label": "sw44", "matrix": [3, 9], "x": 9.5, "y": 3},
{"label": "sw45", "matrix": [3, 10], "x": 10.5, "y": 3, "w": 1.5}
]
}
}
}
@@ -0,0 +1,80 @@
{
"config": {
"features": {
"encoder_map": true
}
},
"encoders": [
[
{
"ccw": "KC_VOLD",
"cw": "KC_VOLU"
},
{
"ccw": "KC_PGUP",
"cw": "KC_PGDN"
}
],
[
{
"ccw": "UG_VALD",
"cw": "UG_VALU"
},
{
"ccw": "UG_HUED",
"cw": "UG_HUEU"
}
],
[
{
"ccw": "UG_PREV",
"cw": "UG_NEXT"
},
{
"ccw": "UG_SATD",
"cw": "UG_SATU"
}
]
],
"keyboard": "aokay/mid1",
"keymap": "default",
"layout": "LAYOUT_all",
"layers": [
[
"KC_ESC", "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", "KC_BSPC"
"KC_TAB", "KC_A", "KC_S", "KC_D", "KC_F", "KC_G", "KC_H", "KC_J", "KC_K", "KC_L", "KC_SCLN"
"KC_LSFT", "KC_Z", "KC_X", "KC_C", "KC_V", "KC_B", "KC_N", "KC_M", "KC_COMM", "KC_DOT", "KC_SLSH"
"KC_LCTL", "KC_LGUI", "KC_LALT"
"KC_ENT"
"KC_ENT"
"MO(1)"
"KC_SPC"
"KC_SPC"
"MO(1)", "MO(2)", "KC_RCTL"
],
[
"QK_BOOT", "KC_TRNS", "KC_7", "KC_8", "KC_9", "KC_0", "KC_PAST", "KC_HOME", "KC_UP", "KC_END", "KC_TRNS", "KC_DEL"
"KC_CAPS", "KC_TRNS", "KC_4", "KC_5", "KC_6", "KC_MINS", "KC_SLSH", "KC_LEFT", "KC_DOWN", "KC_RGHT", "KC_QUOT"
"KC_COMM", "KC_DOT", "KC_1", "KC_2", "KC_3", "KC_EQL", "KC_PPLS", "KC_LBRC", "KC_RBRC", "KC_BSLS", "KC_TRNS"
"UG_TOGG", "KC_TRNS", "KC_TRNS"
"KC_0"
"KC_0"
"KC_TRNS"
"KC_TRNS"
"KC_TRNS"
"KC_TRNS", "KC_TRNS", "KC_TRNS"
],
[
"KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS"
"KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS"
"KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS"
"KC_TRNS", "KC_TRNS", "KC_TRNS"
"KC_TRNS"
"KC_TRNS"
"KC_TRNS"
"KC_TRNS"
"KC_TRNS"
"KC_TRNS", "KC_TRNS", "KC_TRNS"
]
]
}
+31
View File
@@ -0,0 +1,31 @@
# MID.1
![MID.1 photo](https://i.imgur.com/aPsvygY.jpeg)
## Description
A 40% keyboard with a staggered 4x12 layout and hotswap PCB.
* Keyboard Maintainer: [Sean O'Neill](https://github.com/oneillseanm)
* Hardware Supported: MID.1
* Hardware Availability: [MID.1 product page](https://www.aokay.cool/mid-1)
## Setup
Make example for this keyboard (after setting up your build environment):
make aokay/mid1:default
Flashing example for this keyboard:
make aokay/mid1: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 three ways:
* **Bootmagic reset**: Hold down `Esc` and plug in the keyboard. `Esc` is assigned to the top left key in the default keymap.
* **Keycode in layout**: Press `Fn+ESC` for `QK_BOOT`. `Fn` is assigned to the key to the right of the spacebar/split spacebar in the default keymap.
* **Physical reset button**: Briefly press the button on the back of the PCB, accessible through the bottom case.
+7
View File
@@ -0,0 +1,7 @@
# A.Okay!
This directory contains keyboards designed by **A.Okay!**, a small independent studio focused on thoughtfuly-designed physical products.
Based in Seattle, Washington.
**Website:** https://www.aokay.cool/
+34
View File
@@ -0,0 +1,34 @@
/* Copyright 2024 RarePotato8DE
*
* 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"
bool rgb_matrix_indicators_kb(void) {
if (!rgb_matrix_indicators_user()) {
return false;
}
if (host_keyboard_led_state().scroll_lock) {
rgb_matrix_set_color(0, 0, 255, 0);
} else {
rgb_matrix_set_color(0, 0, 0, 0);
}
if (host_keyboard_led_state().caps_lock) {
rgb_matrix_set_color(1, 0, 255, 0);
} else {
rgb_matrix_set_color(1, 0, 0, 0);
}
return false;
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,35 @@
/* Copyright 2024 RarePotato8DE
*
* 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 QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_all(
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_F13, 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_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_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1), KC_UP,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_APP, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
[1] = LAYOUT_all(
QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_TOGG,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUEU, RM_SATU, RM_VALU,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUED, RM_SATD, RM_VALD,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_SPDU,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_PREV, RM_SPDD, RM_NEXT)
};
@@ -0,0 +1,35 @@
/* Copyright 2024 RarePotato8DE
*
* 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 QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_tkl_ansi_split_bs_rshift(
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_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, MO(1), KC_UP,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_APP, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
[1] = LAYOUT_tkl_ansi_split_bs_rshift(
QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_TOGG,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUEU, RM_SATU, RM_VALU,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUED, RM_SATD, RM_VALD,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_SPDU,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_PREV, RM_SPDD, RM_NEXT)
};
@@ -0,0 +1,35 @@
/* Copyright 2024 RarePotato8DE
*
* 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 QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_tkl_ansi_tsangan_split_bs_rshift(
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_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, MO(1), KC_UP,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
[1] = LAYOUT_tkl_ansi_tsangan_split_bs_rshift(
QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_TOGG,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUEU, RM_SATU, RM_VALU,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUED, RM_SATD, RM_VALD,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_SPDU,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_PREV, RM_SPDD, RM_NEXT)
};
@@ -0,0 +1,35 @@
/* Copyright 2024 RarePotato8DE
*
* 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 QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_tkl_iso_split_bs_rshift(
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_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_ENT, 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_BSLS,
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1), KC_UP,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_APP, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
[1] = LAYOUT_tkl_iso_split_bs_rshift(
QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_TOGG,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUEU, RM_SATU, RM_VALU,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUED, RM_SATD, RM_VALD,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_SPDU,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_PREV, RM_SPDD, RM_NEXT)
};
@@ -0,0 +1,35 @@
/* Copyright 2024 RarePotato8DE
*
* 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 QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_tkl_iso_tsangan_split_bs_rshift(
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_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_ENT, 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_BSLS,
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1), KC_UP,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
[1] = LAYOUT_tkl_iso_tsangan_split_bs_rshift(
QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_TOGG,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUEU, RM_SATU, RM_VALU,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUED, RM_SATD, RM_VALD,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_SPDU,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_PREV, RM_SPDD, RM_NEXT)
};
@@ -0,0 +1,35 @@
/* Copyright 2024 RarePotato8DE
*
* 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 QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_tkl_f13_ansi_split_bs_rshift(
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_F13, 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_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, MO(1), KC_UP,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_APP, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
[1] = LAYOUT_tkl_f13_ansi_split_bs_rshift(
QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_TOGG,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUEU, RM_SATU, RM_VALU,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUED, RM_SATD, RM_VALD,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_SPDU,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_PREV, RM_SPDD, RM_NEXT)
};
@@ -0,0 +1,35 @@
/* Copyright 2024 RarePotato8DE
*
* 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 QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_tkl_f13_ansi_tsangan_split_bs_rshift(
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_F13, 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_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, MO(1), KC_UP,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
[1] = LAYOUT_tkl_f13_ansi_tsangan_split_bs_rshift(
QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_TOGG,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUEU, RM_SATU, RM_VALU,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUED, RM_SATD, RM_VALD,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_SPDU,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_PREV, RM_SPDD, RM_NEXT)
};
@@ -0,0 +1,35 @@
/* Copyright 2024 RarePotato8DE
*
* 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 QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_tkl_f13_iso_split_bs_rshift(
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_F13, 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_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_ENT, 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_BSLS,
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1), KC_UP,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_APP, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
[1] = LAYOUT_tkl_f13_iso_split_bs_rshift(
QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_TOGG,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUEU, RM_SATU, RM_VALU,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUED, RM_SATD, RM_VALD,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_SPDU,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_PREV, RM_SPDD, RM_NEXT)
};
@@ -0,0 +1,35 @@
/* Copyright 2024 RarePotato8DE
*
* 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 QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_tkl_f13_iso_tsangan_split_bs_rshift(
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_F13, 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_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_ENT, 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_BSLS,
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1), KC_UP,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
[1] = LAYOUT_tkl_f13_iso_tsangan_split_bs_rshift(
QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_TOGG,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUEU, RM_SATU, RM_VALU,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUED, RM_SATD, RM_VALD,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_SPDU,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_PREV, RM_SPDD, RM_NEXT)
};
+29
View File
@@ -0,0 +1,29 @@
# Candy87
![Candy87](https://i.imgur.com/HeCz1u8.png)
The Candy87 Hotswap PCB is a universal TKL PCB by Candykeys.
It supports ISO Hotswap by default (ANSI possible with desolering two hotswap sockets) and many layout options.
It was mainly made for the F1-8X V2, but fits similar keyboards as well.
* Keyboard Maintainer: [RarePotato8DE](https://github.com/rarepotato8de)
* Hardware Supported: Candy87 PCB for F1-8X V2 and similar
* Hardware Availability: [Buy on Candykeys](https://candykeys.com/product/candy87-hotswap-pcb-iso)
Make example for this keyboard (after setting up your build environment):
make candykeys/candy87:default
Flashing example for this keyboard:
make candykeys/candy87: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 key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
* **Physical reset button**: Hold down the "BOOT" button on the back and double press "RESET". Release "BOOT" after
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
@@ -0,0 +1,180 @@
{
"manufacturer": "CannonKeys",
"keyboard_name": "Minimi40 Ortho",
"maintainer": "awkannan",
"bootloader": "stm32-dfu",
"diode_direction": "COL2ROW",
"features": {
"bootmagic": true,
"extrakey": true,
"mousekey": true,
"nkro": true
},
"matrix_pins": {
"cols": ["B11", "B10", "B2", "B1", "B0", "A4", "C14", "B6", "B5", "B4", "B3", "A15"],
"rows": ["A5", "A7", "A3", "B7"]
},
"processor": "STM32F072",
"url": "https://cannonkeys.com",
"usb": {
"device_version": "0.0.1",
"pid": "0x0037",
"vid": "0xCA04"
},
"community_layouts": ["ortho_4x12"],
"layouts": {
"LAYOUT_ortho_4x12": {
"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},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "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": 1},
{"matrix": [1, 9], "x": 9, "y": 1},
{"matrix": [1, 10], "x": 10, "y": 1},
{"matrix": [1, 11], "x": 11, "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": 2},
{"matrix": [2, 9], "x": 9, "y": 2},
{"matrix": [2, 10], "x": 10, "y": 2},
{"matrix": [2, 11], "x": 11, "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": 7, "y": 3},
{"matrix": [3, 8], "x": 8, "y": 3},
{"matrix": [3, 9], "x": 9, "y": 3},
{"matrix": [3, 10], "x": 10, "y": 3},
{"matrix": [3, 11], "x": 11, "y": 3}
]
},
"LAYOUT_ortho_4x12_2x2bar": {
"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},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "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": 1},
{"matrix": [1, 9], "x": 9, "y": 1},
{"matrix": [1, 10], "x": 10, "y": 1},
{"matrix": [1, 11], "x": 11, "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": 2},
{"matrix": [2, 9], "x": 9, "y": 2},
{"matrix": [2, 10], "x": 10, "y": 2},
{"matrix": [2, 11], "x": 11, "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, 5], "x": 4, "y": 3, "w": 2},
{"matrix": [3, 7], "x": 6, "y": 3, "w": 2},
{"matrix": [3, 8], "x": 8, "y": 3},
{"matrix": [3, 9], "x": 9, "y": 3},
{"matrix": [3, 10], "x": 10, "y": 3},
{"matrix": [3, 11], "x": 11, "y": 3}
]
},
"LAYOUT_planck_mit": {
"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},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "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": 1},
{"matrix": [1, 9], "x": 9, "y": 1},
{"matrix": [1, 10], "x": 10, "y": 1},
{"matrix": [1, 11], "x": 11, "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": 2},
{"matrix": [2, 9], "x": 9, "y": 2},
{"matrix": [2, 10], "x": 10, "y": 2},
{"matrix": [2, 11], "x": 11, "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, 6], "x": 5, "y": 3, "w": 2},
{"matrix": [3, 7], "x": 7, "y": 3},
{"matrix": [3, 8], "x": 8, "y": 3},
{"matrix": [3, 9], "x": 9, "y": 3},
{"matrix": [3, 10], "x": 10, "y": 3},
{"matrix": [3, 11], "x": 11, "y": 3}
]
}
}
}
@@ -0,0 +1,66 @@
// Copyright 2024 Andrew Kannan
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
enum custom_layers {
_BASE,
_RAISE,
_LOWER,
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Qwerty
* ,-----------------------------------------------------------------------------------.
* | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | Esc | A | S | D | F | G | H | J | K | L | ; | " |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | ` | Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
* `-----------------------------------------------------------------------------------'
*/
[_BASE] = LAYOUT_ortho_4x12(
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_ESC, 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_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT ,
KC_GRV, KC_LCTL, KC_LALT, KC_LGUI, MO(_LOWER), KC_SPC, KC_SPC, MO(_RAISE), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
),
/* Lower
* ,-----------------------------------------------------------------------------------.
* | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | Home | End | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | | | | Next | Vol- | Vol+ | Play |
* `-----------------------------------------------------------------------------------'
*/
[_LOWER] = LAYOUT_ortho_4x12(
KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC,
KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE,
_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, _______,
QK_BOOT, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
),
/* Raise
* ,-----------------------------------------------------------------------------------.
* | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / |Pg Up |Pg Dn | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | | | | Next | Vol- | Vol+ | Play |
* `-----------------------------------------------------------------------------------'
*/
[_RAISE] = LAYOUT_ortho_4x12(
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______,
_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
),
};
@@ -0,0 +1,21 @@
# Minimi40 Ortho
* Hardware Supported: STM32F072CBT6/APM32F072CBT6
Make example for this keyboard (after setting up your build environment):
make cannonkeys/minimi40/ortho:default
Flashing example for this keyboard:
make cannonkeys/minimi40/ortho: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 key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
* **Physical reset button**: Toggle the switch on the back of the pcb to "1" and briefly press the button on the back of the PCB
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
@@ -0,0 +1,3 @@
# Wildcard to allow APM32 MCU
DFU_SUFFIX_ARGS = -v FFFF -p FFFF
+11
View File
@@ -0,0 +1,11 @@
# Minimi40
This has both the ortho and staggered versions of the wired Minimi40 PCBs
The hotswap and solderable versions use the same firmware.
This firmware can also be used on the GEON F1-40
Please check each folder's README for more details.
* Keyboard Maintainer: [Andrew Kannan](https://github.com/awkannan)
* Hardware Availability: [CannonKeys](https://cannonkeys.com)
@@ -0,0 +1,9 @@
// Copyright 2024 Andrew Kannan
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 500U
#define PICO_XOSC_STARTUP_DELAY_MULTIPLIER 64
@@ -0,0 +1,116 @@
{
"manufacturer": "CannonKeys",
"keyboard_name": "Minimi40 Staggered",
"maintainer": "awkannan",
"bootloader": "rp2040",
"diode_direction": "COL2ROW",
"features": {
"bootmagic": true,
"extrakey": true,
"mousekey": true,
"nkro": true
},
"matrix_pins": {
"cols": ["GP28", "GP8", "GP10", "GP7", "GP6", "GP5", "GP4", "GP3", "GP2", "GP1", "GP0"],
"rows": ["GP17", "GP27", "GP11", "GP12"]
},
"processor": "RP2040",
"url": "https://cannonkeys.com",
"usb": {
"device_version": "0.0.1",
"pid": "0x0036",
"vid": "0xCA04"
},
"layouts": {
"LAYOUT_all": {
"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},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [3, 7], "x": 10, "y": 0},
{"matrix": [0, 10], "x": 11, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.25},
{"matrix": [1, 1], "x": 1.25, "y": 1},
{"matrix": [1, 2], "x": 2.25, "y": 1},
{"matrix": [1, 3], "x": 3.25, "y": 1},
{"matrix": [1, 4], "x": 4.25, "y": 1},
{"matrix": [1, 5], "x": 5.25, "y": 1},
{"matrix": [1, 6], "x": 6.25, "y": 1},
{"matrix": [1, 7], "x": 7.25, "y": 1},
{"matrix": [1, 8], "x": 8.25, "y": 1},
{"matrix": [1, 9], "x": 9.25, "y": 1},
{"matrix": [1, 10], "x": 10.25, "y": 1, "w": 1.75},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2, "w": 1.25},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
{"matrix": [3, 1], "x": 1.25, "y": 3},
{"matrix": [3, 2], "x": 2.25, "y": 3, "w": 1.25},
{"matrix": [3, 4], "x": 3.5, "y": 3, "w": 2.25},
{"matrix": [3, 6], "x": 5.75, "y": 3, "w": 2.75},
{"matrix": [3, 8], "x": 8.5, "y": 3, "w": 1.25},
{"matrix": [3, 9], "x": 9.75, "y": 3},
{"matrix": [3, 10], "x": 10.75, "y": 3, "w": 1.25}
]
},
"LAYOUT_full_space": {
"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},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [3, 7], "x": 10, "y": 0},
{"matrix": [0, 10], "x": 11, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.25},
{"matrix": [1, 1], "x": 1.25, "y": 1},
{"matrix": [1, 2], "x": 2.25, "y": 1},
{"matrix": [1, 3], "x": 3.25, "y": 1},
{"matrix": [1, 4], "x": 4.25, "y": 1},
{"matrix": [1, 5], "x": 5.25, "y": 1},
{"matrix": [1, 6], "x": 6.25, "y": 1},
{"matrix": [1, 7], "x": 7.25, "y": 1},
{"matrix": [1, 8], "x": 8.25, "y": 1},
{"matrix": [1, 9], "x": 9.25, "y": 1},
{"matrix": [1, 10], "x": 10.25, "y": 1, "w": 1.75},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2, "w": 1.25},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
{"matrix": [3, 1], "x": 1.25, "y": 3},
{"matrix": [3, 4], "x": 2.25, "y": 3, "w": 6.25},
{"matrix": [3, 8], "x": 8.5, "y": 3, "w": 1.25},
{"matrix": [3, 9], "x": 9.75, "y": 3},
{"matrix": [3, 10], "x": 10.75, "y": 3, "w": 1.25}
]
}
}
}
@@ -0,0 +1,25 @@
// Copyright 2024 Andrew Kannan
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_all(
KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_RSFT, MO(2),
KC_LCTL, KC_LGUI, KC_LALT, LT(1, KC_SPC), KC_SPC, KC_RALT, MO(1), KC_RCTL
),
[1] = LAYOUT_all(
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL,
_______, _______, _______, _______, _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, _______,
_______, _______, _______, _______, _______, KC_SLSH, KC_SCLN, KC_QUOT, KC_DOT, KC_UP, _______,
_______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RIGHT
),
[2] = LAYOUT_all(
_______, KC_F1, KC_F2, KC_F3, KC_F4, _______, _______, _______, _______, _______, _______, KC_DEL,
_______, KC_F5, KC_F6, KC_F7, KC_F8, _______, _______, _______, _______, _______, _______,
KC_CAPS, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, KC_PGUP, _______, KC_PGDN
)
};
@@ -0,0 +1,21 @@
# Minimi40 Staggered
* Hardware Supported: RP2040
Make example for this keyboard (after setting up your build environment):
make cannonkeys/minimi40/staggered:default
Flashing example for this keyboard:
make cannonkeys/minimi40/staggered: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 key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
* **Physical reset button**: Hold the "BOOTMODE" button on the back of the PCB and briefly press the "RESET" button on the back of the PCB
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
+115
View File
@@ -0,0 +1,115 @@
{
"manufacturer": "dj505",
"keyboard_name": "PicoLX",
"maintainer": "jjc1138",
"bootloader": "rp2040",
"bootloader_instructions": "Hold down the BOOTSEL button on the underside of the PCB when connecting the USB cable",
"features": {
"bootmagic": true,
"extrakey": true,
"rgb_matrix": true
},
"matrix_pins": {
"direct": [
["GP24", null, "GP22", "GP4", null, "GP0"],
[null, "GP23", null, null, "GP3", null],
["GP19", null, "GP18", "GP2", null, "GP1"],
["GP12", "GP13", null, null, null, null]
]
},
"processor": "RP2040",
"rgb_matrix": {
"animations": {
"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_splash": true,
"splash": true
},
"default": {
"animation": "gradient_up_down",
"hue": 176,
"speed": 254,
"val": 64
},
"driver": "ws2812",
"layout": [
{"x": 112, "y": 0, "flags": 2},
{"x": 0, "y": 0, "flags": 2},
{"x": 0, "y": 64, "flags": 2},
{"x": 112, "y": 64, "flags": 2},
{"x": 224, "y": 64, "flags": 2},
{"x": 224, "y": 0, "flags": 2},
{"matrix": [0, 5], "x": 212, "y": 18, "flags": 4},
{"matrix": [2, 5], "x": 212, "y": 57, "flags": 4},
{"matrix": [1, 4], "x": 174, "y": 37, "flags": 4},
{"matrix": [2, 3], "x": 136, "y": 57, "flags": 4},
{"matrix": [0, 3], "x": 136, "y": 18, "flags": 4},
{"matrix": [0, 2], "x": 88, "y": 18, "flags": 4},
{"matrix": [2, 2], "x": 88, "y": 57, "flags": 4},
{"matrix": [1, 1], "x": 50, "y": 37, "flags": 4},
{"matrix": [2, 0], "x": 12, "y": 57, "flags": 4},
{"matrix": [0, 0], "x": 12, "y": 18, "flags": 4},
{"x": 131, "y": 32, "flags": 2},
{"x": 112, "y": 32, "flags": 2},
{"x": 94, "y": 32, "flags": 2}
],
"sleep": true
},
"url": "https://github.com/dj505/PicoLX",
"usb": {
"device_version": "1.0.0",
"pid": "0x4C58",
"vid": "0xFEED"
},
"ws2812": {
"driver": "vendor",
"pin": "GP21"
},
"layouts": {
"LAYOUT": {
"layout": [
{"label": "P1 UL", "matrix": [0, 0], "x": 0, "y": 0},
{"label": "P1 UR", "matrix": [0, 2], "x": 2, "y": 0},
{"label": "P2 UL", "matrix": [0, 3], "x": 3, "y": 0},
{"label": "P2 UR", "matrix": [0, 5], "x": 5, "y": 0},
{"label": "P1 CN", "matrix": [1, 1], "x": 1, "y": 1},
{"label": "P2 CN", "matrix": [1, 4], "x": 4, "y": 1},
{"label": "P1 DL", "matrix": [2, 0], "x": 0, "y": 2},
{"label": "P1 DR", "matrix": [2, 2], "x": 2, "y": 2},
{"label": "P2 DL", "matrix": [2, 3], "x": 3, "y": 2},
{"label": "P2 DR", "matrix": [2, 5], "x": 5, "y": 2},
{"label": "Service", "matrix": [3, 0], "x": 6.5, "y": 0.5},
{"label": "Test", "matrix": [3, 1], "x": 6.5, "y": 1.5}
]
}
}
}
@@ -0,0 +1,26 @@
{
"keyboard": "dj505/picolx",
"keymap": "allinone",
"layout": "LAYOUT",
"layers": [
[
"KC_Q", "KC_E", "KC_TAB", "KC_UP",
"KC_X", "KC_G",
"KC_A", "KC_D", "KC_SPC", "KC_DOWN",
"LT(1,KC_ESC)", "KC_ENT"
],
[
"KC_F1", "KC_F2", "KC_F5", "KC_F6",
"KC_TRNS", "KC_TRNS",
"KC_F3", "KC_F4", "KC_F7", "KC_F8",
"KC_TRNS", "QK_BOOT"
]
]
}
@@ -0,0 +1,21 @@
# PicoLX All-in-one Keymap
The 'allinone' keymap puts most of the buttons that you need for navigating the Pump It Up Rise menus in the main mode. If you configure the game to use those buttons for gameplay as well, then you can play the game and navigate most of the menus without having to switch modes.
```
Q E Tab Up
X G
A D Space Down
Service: Esc when tapped, or temporarily activates the mode below when held
Test: Enter
```
When Service is held the buttons have these meanings instead:
```
F1 F2 F5 F6
- -
F3 F4 F7 F8
Test: Bootloader mode
```
@@ -0,0 +1,16 @@
{
"keyboard": "dj505/picolx",
"keymap": "default",
"layout": "LAYOUT",
"layers": [
[
"KC_Q", "KC_E", "KC_R", "KC_Y",
"KC_S", "KC_G",
"KC_Z", "KC_C", "KC_V", "KC_N",
"KC_ESC", "KC_ENT"
]
]
}
@@ -0,0 +1,12 @@
# PicoLX Default Keymap
The default keymap matches the 'Basic 2' preset in Pump It Up Rise. In the game's options menu, navigate to the keyboard settings and press '2' (on your normal computer keyboard) to apply the matching preset.
```
Q E R Y
S G
Z C V N
Service: Escape
Test: Enter
```
@@ -0,0 +1,36 @@
{
"keyboard": "dj505/picolx",
"keymap": "default",
"layout": "LAYOUT",
"layers": [
[
"KC_Q", "KC_E", "KC_R", "KC_Y",
"KC_S", "KC_G",
"KC_Z", "KC_C", "KC_V", "KC_N",
"MO(2)", "TG(1)"
],
[
"KC_Q", "KC_E", "KC_TAB", "KC_UP",
"KC_ESC", "KC_ENT",
"KC_LEFT", "KC_RGHT", "KC_SPC", "KC_DOWN",
"LT(2,KC_F1)", "KC_TRNS"
],
[
"KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS",
"KC_TRNS", "KC_TRNS",
"KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS",
"KC_TRNS", "QK_BOOT"
]
]
}
@@ -0,0 +1,28 @@
# PicoLX Menu Mode Keymap
The 'menumode' keymap is like the 'default' keymap in that it matches the 'Basic 2' preset in Pump It Up Rise, but it also includes the ability the toggle into a menu mode that provides most of the keys you need to navigate the game's menus.
In the game's options menu, navigate to the keyboard settings and press '2' (on your normal computer keyboard) to apply the 'Basic 2' preset.
The keymap in normal mode:
```
Q E R Y
S G
Z C V N
Test: Toggle to menu mode
```
And when in menu mode:
```
Q E Tab Up
Esc Enter
Left Right Space Down
Service: F1
Test: Toggle back to game mode
```
It might take a little bit of practice to remember where everything is in menu mode. The rule of thumb is that the layout roughly corresponds to where those controls appear on the game's song selection screen.
In either mode, holding the Service button and pressing the Test button will put the controller into bootloader mode for installing new firmware versions.
@@ -0,0 +1,36 @@
{
"keyboard": "dj505/picolx",
"keymap": "default",
"layout": "LAYOUT",
"layers": [
[
"KC_Q", "KC_E", "KC_R", "KC_Y",
"KC_S", "KC_G",
"KC_Z", "KC_C", "KC_V", "KC_N",
"MO(2)", "TG(1)"
],
[
"RM_HUEU", "RM_SATU", "RM_VALU", "RM_SPDU",
"RM_PREV", "RM_NEXT",
"RM_HUED", "RM_SATD", "RM_VALD", "RM_SPDD",
"KC_TRNS", "KC_TRNS"
],
[
"KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS",
"KC_TRNS", "KC_TRNS",
"KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS",
"KC_TRNS", "QK_BOOT"
]
]
}
@@ -0,0 +1,24 @@
# PicoLX RGB Mode Keymap
The 'rgbmode' keymap is like the 'default' keymap, but with a mode for experimenting with RGB settings. Your RGB settings will be retained if you use the keyboard shortcut described below to enter bootloader mode and install a different firmware version. If you hold down the top-left key when plugging in the USB cable, then that will reset your RGB settings.
The keymap in normal mode:
```
Q E R Y
S G
Z C V N
Test: Toggle to RGB mode
```
And when in RGB mode:
```
Hue ↑ Saturation ↑ Value ↑ Speed ↑
Previous Next
Animation Animation
Hue ↓ Saturation ↓ Value ↓ Speed ↓
Test: Toggle back to game mode
```
In either mode, holding the Service button and pressing the Test button will put the controller into bootloader mode for installing new firmware versions.
+35
View File
@@ -0,0 +1,35 @@
# dj505/picolx
![PicoLX controller](https://i.imgur.com/BHRRYl3.jpeg)
PicoLX: A compact keyboard-style controller for the *Pump It Up* rhythm game series. This firmware is intended for using the controller with the [Pump It Up Rise](https://store.steampowered.com/app/2756930/PUMP_IT_UP_RISE/) home version of the game.
* Hardware Supported: [PicoLX](https://github.com/dj505/PicoLX)
* Keyboard Maintainer: [jjc1138](https://github.com/jjc1138)
Make example for this keyboard (after setting up your build environment):
make dj505/picolx:default
Flashing example for this keyboard:
make dj505/picolx: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).
## Keymaps
There are four keymaps provided.
* [default](keymaps/default/readme.md)
* [menumode](keymaps/menumode/readme.md)
* [allinone](keymaps/allinone/readme.md)
* [rgbmode](keymaps/rgbmode/readme.md)
### Bootloader
Put the controller in bootloader mode in one of three ways:
* **Physical reset button**: Hold down the BOOTSEL button on the underside of the PCB (by poking something through the hole on the bottom of the case) when connecting the USB cable.
* **Bootmagic reset**: If a version of this firmware is already installed, hold down the top-left button on the keyboard when connecting the USB cable.
* **Keycode in keymap**: If a version of this firmware is already installed with the 'menumode', 'rgbmode', or 'allinone' keymap, hold down the Service button and press the Test button. Or press a button mapped to `QK_BOOT` in your own keymap.
+122
View File
@@ -0,0 +1,122 @@
{
"keyboard_name": "Ergo-V-1",
"manufacturer": "wizardkeyboards",
"url": "https://wizardkeyboards.com/",
"maintainer": "qmk",
"usb": {
"vid": "0xFEED",
"pid": "0x97C4",
"device_version": "0.0.1"
},
"features": {
"bootmagic": true,
"extrakey": true,
"mousekey": true
},
"qmk": {
"locking": {
"enabled": true,
"resync": true
}
},
"matrix_pins": {
"cols": ["D4", "C6", "D7", "E6", "B4", "B5"],
"rows": ["F6", "F7", "B1", "B3", "B2", "B6"]
},
"diode_direction": "COL2ROW",
"split": {
"enabled": true,
"serial": {
"pin": "D0"
}
},
"development_board": "promicro",
"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": [6, 0], "x": 11, "y": 0},
{"matrix": [6, 1], "x": 12, "y": 0},
{"matrix": [6, 2], "x": 13, "y": 0},
{"matrix": [6, 3], "x": 14, "y": 0},
{"matrix": [6, 4], "x": 15, "y": 0},
{"matrix": [6, 5], "x": 16, "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": [7, 0], "x": 11, "y": 1},
{"matrix": [7, 1], "x": 12, "y": 1},
{"matrix": [7, 2], "x": 13, "y": 1},
{"matrix": [7, 3], "x": 14, "y": 1},
{"matrix": [7, 4], "x": 15, "y": 1},
{"matrix": [7, 5], "x": 16, "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": [8, 0], "x": 11, "y": 2},
{"matrix": [8, 1], "x": 12, "y": 2},
{"matrix": [8, 2], "x": 13, "y": 2},
{"matrix": [8, 3], "x": 14, "y": 2},
{"matrix": [8, 4], "x": 15, "y": 2},
{"matrix": [8, 5], "x": 16, "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": [9, 0], "x": 11, "y": 3},
{"matrix": [9, 1], "x": 12, "y": 3},
{"matrix": [9, 2], "x": 13, "y": 3},
{"matrix": [9, 3], "x": 14, "y": 3},
{"matrix": [9, 4], "x": 15, "y": 3},
{"matrix": [9, 5], "x": 16, "y": 3},
{"matrix": [4, 1], "x": 1, "y": 4},
{"matrix": [4, 2], "x": 2, "y": 4},
{"matrix": [4, 3], "x": 3, "y": 4},
{"matrix": [10, 2], "x": 13, "y": 4},
{"matrix": [10, 3], "x": 14, "y": 4},
{"matrix": [10, 4], "x": 15, "y": 4},
{"matrix": [4, 5], "x": 4, "y": 5},
{"matrix": [5, 5], "x": 5, "y": 5},
{"matrix": [11, 0], "x": 11, "y": 5},
{"matrix": [10, 0], "x": 12, "y": 5},
{"matrix": [4, 4], "x": 4, "y": 4},
{"matrix": [5, 4], "x": 6, "y": 7},
{"matrix": [5, 3], "x": 6, "y": 6},
{"matrix": [5, 1], "x": 7, "y": 6},
{"matrix": [11, 4], "x": 9, "y": 6}
{"matrix": [11, 2], "x": 10, "y": 6},
{"matrix": [11, 1], "x": 10, "y": 7},
{"matrix": [10, 1], "x": 12, "y": 4},
{"matrix": [5, 2], "x": 7, "y": 7},
{"matrix": [11, 3], "x": 9, "y": 7},
]
}
}
}
@@ -0,0 +1,74 @@
// Copyright 2025 https://github.com/wizarddata
// Copyright 2025 https://github.com/VPavliashvili
// SPDX-License-Identifier: GPL-2.0+
#include QMK_KEYBOARD_H
enum layers {
_MN, // main
_FN, // fn
_MS, // mouse movements
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_MN] = LAYOUT(
// ┌───────┬───────┬───────┬───────┬───────┬───────┐ ┌───────┬───────┬───────┬───────┬───────┬───────┐
KC_GRV ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_BSLS,
// ├───────┼───────┼───────┼───────┼───────┼───────┤ ├───────┼───────┼───────┼───────┼───────┼───────┤
KC_TAB ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T , KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,KC_ENT ,
// ├───────┼───────┼───────┼───────┼───────┼───────┤ ├───────┼───────┼───────┼───────┼───────┼───────┤
KC_ESC ,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_N ,KC_M ,KC_COMM,KC_DOT ,KC_SLSH,KC_RSFT,
// └───────┼───────┼───────┼───────┼───────┴───────┘ └───────┴───────┼───────┼───────┼───────┼───────┘
XXXXXXX,KC_PGDN,KC_PGUP, KC_HOME,KC_END ,XXXXXXX,
// └───────┴───────┴───────┘ └───────┴───────┴───────┘
// ┌───────┬───────┐ ┌───────┬───────┐
KC_PSCR,KC_EQL , KC_MINS,KC_INS ,
// ┌────────┬───────┼───────┼───────┤ ├───────┼───────┼───────┬───────┐
KC_LGUI, KC_SPC ,KC_LCTL,KC_DEL , KC_SCRL,MO(_FN),KC_BSPC,KC_RGUI,
// | ├───────┤ ├───────┤ |
KC_LALT, MO(_MS)
// └────────────────────────┴───────┘ └───────┴───────────────────────┘
),
[_FN] = LAYOUT(
// ┌───────┬───────┬───────┬───────┬───────┬───────┐ ┌───────┬───────┬───────┬───────┬───────┬───────┐
XXXXXXX,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 , KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,KC_F11 ,
// ├───────┼───────┼───────┼───────┼───────┼───────┤ ├───────┼───────┼───────┼───────┼───────┼───────┤
_______,_______,KC_VOLD,KC_MUTE,KC_VOLU,_______, KC_F12 ,KC_MPRV,KC_MPLY,KC_MNXT,_______,_______,
// ├───────┼───────┼───────┼───────┼───────┼───────┤ ├───────┼───────┼───────┼───────┼───────┼───────┤
_______,_______,_______,_______,_______,_______, KC_LEFT,KC_DOWN,KC_UP ,KC_RGHT,_______,_______,
// ├───────┼───────┼───────┼───────┼───────┼───────┤ ├───────┼───────┼───────┼───────┼───────┼───────┤
_______,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,_______,
// └───────┼───────┼───────┼───────┼───────┴───────┘ └───────┴───────┼───────┼───────┼───────┼───────┘
_______,_______,_______, _______,_______,_______,
// └───────┴───────┴───────┘ └───────┴───────┴───────┘
// ┌───────┬───────┐ ┌───────┬───────┐
_______,_______, _______,_______,
// ┌────────┬───────┼───────┼───────┤ ├───────┼───────┼───────┬───────┐
_______, _______,_______,_______, _______,_______,_______,_______,
// | ├───────┤ ├───────┤ |
_______, _______
// └────────────────────────┴───────┘ └───────┴───────────────────────┘
),
[_MS] = LAYOUT(
// ┌───────┬───────┬───────┬───────┬───────┬───────┐ ┌───────┬───────┬───────┬───────┬───────┬───────┐
XXXXXXX,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,_______,
// ├───────┼───────┼───────┼───────┼───────┼───────┤ ├───────┼───────┼───────┼───────┼───────┼───────┤
_______,_______,MS_WHLU,_______,_______,_______, _______,_______,_______,_______,_______,_______,
// ├───────┼───────┼───────┼───────┼───────┼───────┤ ├───────┼───────┼───────┼───────┼───────┼───────┤
_______,_______,MS_WHLD,_______,MS_BTN1,MS_BTN2, MS_LEFT,MS_DOWN,MS_UP ,MS_RGHT,_______,_______,
// ├───────┼───────┼───────┼───────┼───────┼───────┤ ├───────┼───────┼───────┼───────┼───────┼───────┤
_______,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,_______,
// └───────┼───────┼───────┼───────┼───────┴───────┘ └───────┴───────┼───────┼───────┼───────┼───────┘
_______,_______,_______, _______,_______,_______,
// └───────┴───────┴───────┘ └───────┴───────┴───────┘
// ┌───────┬───────┐ ┌───────┬───────┐
_______,_______, _______,_______,
// ┌────────┬───────┼───────┼───────┤ ├───────┼───────┼───────┬───────┐
_______, _______,_______,_______, _______,_______,_______,_______,
// | ├───────┤ ├───────┤ |
_______, _______
// └────────────────────────┴───────┘ └───────┴───────────────────────┘
)
};
+29
View File
@@ -0,0 +1,29 @@
# Ergo-V-1
Fork of [Ergo-S-1](https://github.com/wizarddata/Ergo-S-1) from WizardKeyboards
Ergo-S-1 on its part is heavily inspired from Kinesis Advantage
![Ergo-V-1](https://i.imgur.com/eE1l5IV.jpeg)
This keyboard is practically identical to the orignal one with some differences
* Modified thumb cluster with one extra key
* Improved switch cutouts, compatible with kailh style switches
* unlike Ergo-S-1 this is a wired keyboard based on qmk
Make example for this keyboard (after setting up your build environment):
make handwired/ergo_v_1:default
Flashing example for this keyboard:
make handwired/ergo_v_1: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:
* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
@@ -0,0 +1,50 @@
{
"keyboard_name": "S245 Streamdeck",
"manufacturer": "sector245",
"maintainer": "sector245",
"processor": "RP2040",
"bootloader": "rp2040",
"debounce": 20,
"usb": {
"vid": "0x5345",
"pid": "0x0001",
"device_version": "1.0.0"
},
"features": {
"bootmagic": true,
"extrakey": true,
"encoder": true
},
"matrix_pins": {
"direct": [
["GP2", "GP3", "GP13"],
["GP4", "GP5", "GP6"],
["GP7", "GP8", "GP9"]
]
},
"encoder": {
"rotary": [
{
"pin_a": "GP10",
"pin_b": "GP11",
"resolution": 2
}
]
},
"community_layouts": ["ortho_3x3"],
"layouts": {
"LAYOUT_ortho_3x3": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0, "encoder": 0},
{"matrix": [1, 0], "x": 0, "y": 1},
{"matrix": [1, 1], "x": 1, "y": 1},
{"matrix": [1, 2], "x": 2, "y": 1},
{"matrix": [2, 0], "x": 0, "y": 2},
{"matrix": [2, 1], "x": 1, "y": 2},
{"matrix": [2, 2], "x": 2, "y": 2}
]
}
}
}
@@ -0,0 +1,18 @@
// Copyright 2025 sector245 (@sector245)
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_ortho_3x3(
KC_A, KC_B, KC_C,
KC_D, KC_E, KC_F,
KC_G, KC_H, KC_I
)
};
#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
[0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }
};
#endif
@@ -0,0 +1 @@
ENCODER_MAP_ENABLE = yes
@@ -0,0 +1,24 @@
# S245 Streamdeck
A 3x3 macropad with rotary encoder.
* Keyboard Maintainer: [sector245](https://github.com/sinomau)
* Hardware Supported: S245 Streamdeck PCB, RP2040
Make example for this keyboard (after setting up your build environment):
make handwired/sector245/s245:default
Flashing example for this keyboard:
make handwired/sector245/s245: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 key at (0,0) in the matrix (top left key) and plug in the keyboard
* **Physical reset button**: Hold the BOOTSEL button on the Pico and plug in the keyboard
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
@@ -0,0 +1,26 @@
// Copyright 2023 Idle Builds (@IdleBuilds)
// SPDX-License-Identifier: GPL-2.0-or-later
#include "quantum.h"
#ifdef OLED_ENABLE
oled_rotation_t oled_init_kb(oled_rotation_t rotation) {
return OLED_ROTATION_180;
}
bool oled_task_kb(void) {
if (!oled_task_user()) {
return false;
}
if (is_keyboard_master()) {
static const char PROGMEM idle_builds_logo[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x80, 0x80, 0x80, 0xc0, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0xf3, 0xf3, 0xf3, 0xf3, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x39, 0x3d, 0x3d, 0x3d, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xf8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xf8, 0x88, 0x88, 0x88, 0x88, 0x88, 0xd8, 0x78, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xf8, 0xf8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xf8, 0xf8, 0xa8, 0xa8, 0xa8, 0xa8, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xf8, 0xa8, 0xa8, 0xa8, 0xa8, 0xf8, 0xf8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xf8, 0xc0, 0x80, 0x80, 0x80, 0x80, 0xf8, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xf8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xf8, 0x88, 0x88, 0x88, 0x88, 0x88, 0xd8, 0x78, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0xb8, 0xa8, 0xa8, 0xa8, 0xe8, 0xe8, 0x40};
oled_write_raw_P(idle_builds_logo, sizeof(idle_builds_logo));
} else {
oled_write_P(PSTR("\n\nDINKEY 32|30"), false);
}
return true;
}
#endif
@@ -0,0 +1,107 @@
{
"keyboard_name": "dinkey32_30",
"manufacturer": "Idle Builds",
"maintainer": "IdleBuilds",
"url": "https://github.com/IdleBuilds/Dinkey",
"bootloader": "atmel-dfu",
"processor": "atmega32u4",
"usb": {
"device_version": "1.0.0",
"pid": "0x3230",
"vid": "0xFEED"
},
"features": {
"bootmagic": true,
"extrakey": true,
"nkro": true,
"oled": true
},
"split": {
"enabled": true,
"serial": {
"pin": "D2"
},
"transport": {
"sync": {
"modifiers": true
}
}
},
"diode_direction": "COL2ROW",
"matrix_pins": {
"cols": ["E6", "D7", "C6", "D4", "F6"],
"rows": ["F4", "F5", "B4", "B5"]
},
"layouts": {
"LAYOUT_32": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0.93},
{"matrix": [0, 1], "x": 1, "y": 0.31},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0.28},
{"matrix": [0, 4], "x": 4, "y": 0.42},
{"matrix": [4, 4], "x": 7, "y": 0.42},
{"matrix": [4, 3], "x": 8, "y": 0.28},
{"matrix": [4, 2], "x": 9, "y": 0},
{"matrix": [4, 1], "x": 10, "y": 0.31},
{"matrix": [4, 0], "x": 11, "y": 0.93},
{"matrix": [1, 1], "x": 1, "y": 1.31},
{"matrix": [1, 2], "x": 2, "y": 1},
{"matrix": [1, 3], "x": 3, "y": 1.28},
{"matrix": [1, 4], "x": 4, "y": 1.42},
{"matrix": [5, 4], "x": 7, "y": 1.42},
{"matrix": [5, 3], "x": 8, "y": 1.28},
{"matrix": [5, 2], "x": 9, "y": 1},
{"matrix": [5, 1], "x": 10, "y": 1.31},
{"matrix": [2, 0], "x": 0, "y": 2.93},
{"matrix": [2, 1], "x": 1, "y": 2.31},
{"matrix": [2, 2], "x": 2, "y": 2},
{"matrix": [2, 3], "x": 3, "y": 2.28},
{"matrix": [2, 4], "x": 4, "y": 2.42},
{"matrix": [6, 4], "x": 7, "y": 2.42},
{"matrix": [6, 3], "x": 8, "y": 2.28},
{"matrix": [6, 2], "x": 9, "y": 2},
{"matrix": [6, 1], "x": 10, "y": 2.31},
{"matrix": [6, 0], "x": 11, "y": 2.93},
{"matrix": [3, 3], "x": 3.5, "y": 3.75},
{"matrix": [3, 4], "x": 4.5, "y": 4},
{"matrix": [7, 4], "x": 6.5, "y": 4},
{"matrix": [7, 3], "x": 7.5, "y": 3.75}
]
},
"LAYOUT_30": {
"layout": [
{"matrix": [1, 0], "x": 0, "y": 1.93},
{"matrix": [0, 1], "x": 1, "y": 0.31},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0.28},
{"matrix": [0, 4], "x": 4, "y": 0.42},
{"matrix": [4, 4], "x": 7, "y": 0.42},
{"matrix": [4, 3], "x": 8, "y": 0.28},
{"matrix": [4, 2], "x": 9, "y": 0},
{"matrix": [4, 1], "x": 10, "y": 0.31},
{"matrix": [5, 0], "x": 11, "y": 1.93},
{"matrix": [1, 1], "x": 1, "y": 1.31},
{"matrix": [1, 2], "x": 2, "y": 1},
{"matrix": [1, 3], "x": 3, "y": 1.28},
{"matrix": [1, 4], "x": 4, "y": 1.42},
{"matrix": [5, 4], "x": 7, "y": 1.42},
{"matrix": [5, 3], "x": 8, "y": 1.28},
{"matrix": [5, 2], "x": 9, "y": 1},
{"matrix": [5, 1], "x": 10, "y": 1.31},
{"matrix": [2, 1], "x": 1, "y": 2.31},
{"matrix": [2, 2], "x": 2, "y": 2},
{"matrix": [2, 3], "x": 3, "y": 2.28},
{"matrix": [2, 4], "x": 4, "y": 2.42},
{"matrix": [6, 4], "x": 7, "y": 2.42},
{"matrix": [6, 3], "x": 8, "y": 2.28},
{"matrix": [6, 2], "x": 9, "y": 2},
{"matrix": [6, 1], "x": 10, "y": 2.31},
{"matrix": [3, 3], "x": 3.5, "y": 3.75},
{"matrix": [3, 4], "x": 4.5, "y": 4},
{"matrix": [7, 4], "x": 6.5, "y": 4},
{"matrix": [7, 3], "x": 7.5, "y": 3.75}
]
}
}
}
@@ -0,0 +1,14 @@
// Copyright 2023 Idle Builds (@IdleBuilds)
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_30(
KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O,
KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_P,
KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT,
KC_BSPC, KC_TAB, KC_SPC, KC_ENT
)
};
@@ -0,0 +1,28 @@
# Dinkey 32|30
![Dinkey 32|30 — 30 key config](https://i.imgur.com/L7e2yfP.jpeg)
![Dinkey 32|30 — 32 key config](https://i.imgur.com/iEurnyP.jpeg)
A low-profile split keyboard with 30 or 32 key configuration. Part of the Dinkey keyboard series by Idle Builds.
* Keyboard Maintainer: [IdleBuilds](https://github.com/IdleBuilds)
* Hardware Supported: Dinkey 32|30 PCB, ATmega32U4
* Hardware Availability: [Store](https://www.idlebuilds.com), [Idle Builds GitHub](https://github.com/IdleBuilds/Dinkey)
Make example for this keyboard (after setting up your build environment):
make idlebuilds/dinkey32_30:default
Flashing example for this keyboard:
make idlebuilds/dinkey32_30: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 key at (0,0) in the matrix (top left key on left half) and plug in the keyboard
* **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
+42
View File
@@ -0,0 +1,42 @@
// Copyright 2023 Idle Builds (@IdleBuilds)
// SPDX-License-Identifier: GPL-2.0-or-later
#include "quantum.h"
#ifdef OLED_ENABLE
oled_rotation_t oled_init_kb(oled_rotation_t rotation) {
return OLED_ROTATION_180;
}
bool oled_task_kb(void) {
if (!oled_task_user()) {
return false;
}
if (is_keyboard_master()) {
oled_write_P(PSTR("LAYER:\n\n"), false);
switch (get_highest_layer(layer_state)) {
case 0:
oled_write_P(PSTR("BASE\n"), false);
break;
case 1:
oled_write_P(PSTR("LAYER 1\n"), false);
break;
case 2:
oled_write_P(PSTR("LAYER 2\n"), false);
break;
case 3:
oled_write_P(PSTR("LAYER 3\n"), false);
break;
default:
oled_write_P(PSTR("UNKNOWN\n"), false);
}
} else {
static const char PROGMEM my_logo[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0xff, 0x3f, 0x03, 0x03, 0x03, 0x03, 0x07, 0xce, 0xfc, 0x10, 0x00, 0x80, 0xfe, 0x3f, 0x00, 0x00, 0x00, 0xf8, 0x7e, 0x1e, 0x78, 0xe0, 0x80, 0x00, 0xc0, 0xfe, 0x1f, 0x00, 0x00, 0x80, 0xfe, 0xff, 0xe0, 0xb0, 0x18, 0x1c, 0x0e, 0x02, 0x00, 0x00, 0x00, 0xc0, 0xfe, 0xfe, 0xe2, 0xe2, 0x63, 0x63, 0x63, 0x03, 0x00, 0x03, 0x06, 0x1c, 0x38, 0xf0, 0xf0, 0x38, 0x1c, 0x0e, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0e, 0xcc, 0xe4, 0xf4, 0xde, 0xde, 0xce, 0x80, 0x00, 0x00, 0xc0, 0xe0, 0xf0, 0xd8, 0xcc, 0xcc, 0xfe, 0xdf, 0xc0, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0c, 0x04, 0x06, 0x06, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x07, 0x0f, 0x00, 0x00, 0x00, 0x0e, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0f, 0x07, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x01, 0x03, 0x07, 0x06, 0x0c, 0x0c, 0x00, 0x00, 0x0f, 0x0f, 0x08, 0x08, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x08, 0x08, 0x08, 0x0c, 0x0c, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
oled_write_raw_P(my_logo, sizeof(my_logo));
}
return true;
}
#endif
@@ -0,0 +1,82 @@
{
"keyboard_name": "dinkey34",
"manufacturer": "Idle Builds",
"maintainer": "IdleBuilds",
"url": "https://github.com/IdleBuilds/Dinkey",
"bootloader": "atmel-dfu",
"processor": "atmega32u4",
"usb": {
"device_version": "1.0.0",
"pid": "0x3400",
"vid": "0xFEED"
},
"features": {
"bootmagic": true,
"extrakey": true,
"nkro": true,
"oled": true
},
"split": {
"enabled": true,
"serial": {
"pin": "D2"
},
"transport": {
"sync": {
"modifiers": true
}
}
},
"diode_direction": "COL2ROW",
"matrix_pins": {
"cols": ["E6", "D7", "C6", "D4", "F6"],
"rows": ["F4", "F5", "B4", "B5"]
},
"layouts": {
"LAYOUT": {
"layout": [
{"x": 0, "y": 0.93, "matrix": [0, 0]},
{"x": 1, "y": 0.31, "matrix": [0, 1]},
{"x": 2, "y": 0, "matrix": [0, 2]},
{"x": 3, "y": 0.28, "matrix": [0, 3]},
{"x": 4, "y": 0.42, "matrix": [0, 4]},
{"x": 7, "y": 0.42, "matrix": [4, 4]},
{"x": 8, "y": 0.28, "matrix": [4, 3]},
{"x": 9, "y": 0, "matrix": [4, 2]},
{"x": 10, "y": 0.31, "matrix": [4, 1]},
{"x": 11, "y": 0.93, "matrix": [4, 0]},
{"x": 0, "y": 1.93, "matrix": [1, 0]},
{"x": 1, "y": 1.31, "matrix": [1, 1]},
{"x": 2, "y": 1, "matrix": [1, 2]},
{"x": 3, "y": 1.28, "matrix": [1, 3]},
{"x": 4, "y": 1.42, "matrix": [1, 4]},
{"x": 7, "y": 1.42, "matrix": [5, 4]},
{"x": 8, "y": 1.28, "matrix": [5, 3]},
{"x": 9, "y": 1, "matrix": [5, 2]},
{"x": 10, "y": 1.31, "matrix": [5, 1]},
{"x": 11, "y": 1.93, "matrix": [5, 0]},
{"x": 0, "y": 2.93, "matrix": [2, 0]},
{"x": 1, "y": 2.31, "matrix": [2, 1]},
{"x": 2, "y": 2, "matrix": [2, 2]},
{"x": 3, "y": 2.28, "matrix": [2, 3]},
{"x": 4, "y": 2.42, "matrix": [2, 4]},
{"x": 7, "y": 2.42, "matrix": [6, 4]},
{"x": 8, "y": 2.28, "matrix": [6, 3]},
{"x": 9, "y": 2, "matrix": [6, 2]},
{"x": 10, "y": 2.31, "matrix": [6, 1]},
{"x": 11, "y": 2.93, "matrix": [6, 0]},
{"matrix": [3, 0], "x": 3.5, "y": 3.75},
{"matrix": [3, 1], "x": 4.5, "y": 4},
{"matrix": [7, 1], "x": 6.5, "y": 4},
{"matrix": [7, 0], "x": 7.5, "y": 3.75}
]
}
}
}
@@ -0,0 +1,13 @@
// Copyright 2023 Idle Builds (@IdleBuilds)
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT(
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,
KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,
KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH,
KC_BSPC, KC_TAB, KC_SPC, KC_ENT
),
};
+27
View File
@@ -0,0 +1,27 @@
# Dinkey 34
![Dinkey 34](https://i.imgur.com/MhrvYzo.jpeg)
A low-profile split keyboard with 34 keys. Part of the Dinkey keyboard series by Idle Builds.
* Keyboard Maintainer: [IdleBuilds](https://github.com/IdleBuilds)
* Hardware Supported: Dinkey 34 PCB, ATmega32U4
* Hardware Availability: [Store](https://www.idlebuilds.com), [Idle Builds GitHub](https://github.com/IdleBuilds/Dinkey)
Make example for this keyboard (after setting up your build environment):
make idlebuilds/dinkey34:default
Flashing example for this keyboard:
make idlebuilds/dinkey34: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 key at (0,0) in the matrix (top left key on left half) and plug in the keyboard
* **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
+106
View File
@@ -0,0 +1,106 @@
{
"keyboard_name": "Pando58",
"manufacturer": "jyap808",
"maintainer": "jyap808",
"bootloader": "rp2040",
"processor": "RP2040",
"usb": {
"vid": "0x4A59",
"pid": "0x3538",
"device_version": "1.2.0"
},
"features": {
"bootmagic": true,
"extrakey": true,
"mousekey": true,
"nkro": true
},
"matrix_pins": {
"cols": ["GP2", "GP3", "GP4", "GP5", "GP6", "GP7"],
"rows": ["GP14", "GP15", "GP26", "GP27", "GP28"]
},
"diode_direction": "COL2ROW",
"split": {
"enabled": true,
"serial": {
"driver": "vendor",
"pin": "GP0"
},
"transport": {
"watchdog": true
}
},
"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": [5, 5], "x": 11, "y": 0},
{"matrix": [5, 4], "x": 12, "y": 0},
{"matrix": [5, 3], "x": 13, "y": 0},
{"matrix": [5, 2], "x": 14, "y": 0},
{"matrix": [5, 1], "x": 15, "y": 0},
{"matrix": [5, 0], "x": 16, "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": [6, 5], "x": 11, "y": 1},
{"matrix": [6, 4], "x": 12, "y": 1},
{"matrix": [6, 3], "x": 13, "y": 1},
{"matrix": [6, 2], "x": 14, "y": 1},
{"matrix": [6, 1], "x": 15, "y": 1},
{"matrix": [6, 0], "x": 16, "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": [7, 5], "x": 11, "y": 2},
{"matrix": [7, 4], "x": 12, "y": 2},
{"matrix": [7, 3], "x": 13, "y": 2},
{"matrix": [7, 2], "x": 14, "y": 2},
{"matrix": [7, 1], "x": 15, "y": 2},
{"matrix": [7, 0], "x": 16, "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": [8, 5], "x": 11, "y": 3},
{"matrix": [8, 4], "x": 12, "y": 3},
{"matrix": [8, 3], "x": 13, "y": 3},
{"matrix": [8, 2], "x": 14, "y": 3},
{"matrix": [8, 1], "x": 15, "y": 3},
{"matrix": [8, 0], "x": 16, "y": 3},
{"matrix": [4, 1], "x": 2, "y": 4},
{"matrix": [4, 2], "x": 3, "y": 4},
{"matrix": [4, 3], "x": 4, "y": 4},
{"matrix": [4, 4], "x": 6, "y": 4},
{"matrix": [4, 5], "x": 7, "y": 4},
{"matrix": [9, 5], "x": 9, "y": 4},
{"matrix": [9, 4], "x": 10, "y": 4},
{"matrix": [9, 3], "x": 12, "y": 4},
{"matrix": [9, 2], "x": 13, "y": 4},
{"matrix": [9, 1], "x": 14, "y": 4}
]
}
}
}
@@ -0,0 +1,21 @@
// Copyright 2026 Julian Yap (@jyap808)
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT(
KC_ESC ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_MINS,
KC_TAB ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T , KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,KC_BSLS,
KC_LGUI,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_N ,KC_M ,KC_COMM,KC_DOT ,KC_SLSH,KC_RSFT,
KC_LEFT,KC_RGHT,KC_BSPC,KC_LCTL,KC_LALT, KC_ENT ,KC_SPC ,TL_LOWR,KC_UP ,KC_DOWN),
[1] = LAYOUT(
KC_GRV ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 , KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,KC_EQL ,
KC_CAPS,_______,_______,_______,_______,_______, KC_VOLD,KC_VOLU,KC_MUTE,_______,KC_PSCR,_______,
_______,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______, _______,_______,KC_LBRC,KC_RBRC,_______,_______,
KC_HOME,KC_END ,KC_DEL ,_______,_______, _______,_______,_______,KC_PGUP,KC_PGDN),
};
+31
View File
@@ -0,0 +1,31 @@
# Pando58
![Pando58 - 3D printed case](https://i.imgur.com/e01JcXL.jpeg)
![Pando58 - Layered build](https://i.imgur.com/JyufNvG.jpeg)
*58-key columnar split keyboard driven by RP2040 Zero controllers, utilizing RJ45 sockets for interconnect.*
[Build guide](https://jyap808.github.io/pando58)
* Keyboard Maintainer: [jyap808](https://github.com/jyap808)
* Hardware Availability: [github/jyap808/pando58](https://github.com/jyap808/pando58)
* Hardware Supported: RP2040 Zero
Make example for this keyboard (after setting up your build environment):
make jyap808/pando58:default
Flashing example for this keyboard:
make jyap808/pando58:default:flash
See the [build environment setup](getting_started_build_tools) and the [make instructions](getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](newbs).
## Bootloader
Enter the bootloader in 3 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
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
+206
View File
@@ -0,0 +1,206 @@
{
"manufacturer": "kbd0",
"keyboard_name": "kbd0/curve0/75_ansi",
"maintainer": "kbd0",
"bootloader": "rp2040",
"bootloader_instructions": "Hold the little button on the main PCB (inside the keyboard, near the spacebar) while plugging in the keyboard to enter bootloader.",
"diode_direction": "COL2ROW",
"features": {
"bootmagic": true,
"extrakey": true,
"mousekey": true,
"nkro": true
},
"matrix_pins": {
"cols": ["GP6", "GP5", "GP4", "GP7", "GP10", "GP9", "GP11", "GP12", "GP13", "GP14", "GP25", "GP20", "GP19", "GP18", "GP16", "GP3"],
"rows": ["GP2", "GP23", "GP22", "GP21", "GP24", "GP17"]
},
"processor": "RP2040",
"url": "https://kbd0.com/item/curve0",
"usb": {
"device_version": "1.0.0",
"pid": "0xC001",
"vid": "0xCBD0"
},
"community_layouts": ["75_ansi"],
"layouts": {
"LAYOUT_all": {
"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},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "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, "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": 1},
{"matrix": [1, 9], "x": 9, "y": 1},
{"matrix": [1, 10], "x": 10, "y": 1},
{"matrix": [1, 11], "x": 11, "y": 1},
{"matrix": [1, 12], "x": 12, "y": 1},
{"matrix": [1, 13], "x": 13, "y": 1},
{"matrix": [1, 14], "x": 14, "y": 1},
{"matrix": [1, 15], "x": 15, "y": 1},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.5},
{"matrix": [2, 1], "x": 1.5, "y": 2},
{"matrix": [2, 2], "x": 2.5, "y": 2},
{"matrix": [2, 3], "x": 3.5, "y": 2},
{"matrix": [2, 4], "x": 4.5, "y": 2},
{"matrix": [2, 5], "x": 5.5, "y": 2},
{"matrix": [2, 6], "x": 6.5, "y": 2},
{"matrix": [2, 7], "x": 7.5, "y": 2},
{"matrix": [2, 8], "x": 8.5, "y": 2},
{"matrix": [2, 9], "x": 9.5, "y": 2},
{"matrix": [2, 10], "x": 10.5, "y": 2},
{"matrix": [2, 11], "x": 11.5, "y": 2},
{"matrix": [2, 12], "x": 12.5, "y": 2},
{"matrix": [2, 13], "x": 13.5, "y": 2, "w": 1.5},
{"matrix": [2, 15], "x": 15, "y": 2},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 1.75},
{"matrix": [3, 1], "x": 1.75, "y": 3},
{"matrix": [3, 2], "x": 2.75, "y": 3},
{"matrix": [3, 3], "x": 3.75, "y": 3},
{"matrix": [3, 4], "x": 4.75, "y": 3},
{"matrix": [3, 5], "x": 5.75, "y": 3},
{"matrix": [3, 6], "x": 6.75, "y": 3},
{"matrix": [3, 7], "x": 7.75, "y": 3},
{"matrix": [3, 8], "x": 8.75, "y": 3},
{"matrix": [3, 9], "x": 9.75, "y": 3},
{"matrix": [3, 10], "x": 10.75, "y": 3},
{"matrix": [3, 11], "x": 11.75, "y": 3},
{"matrix": [3, 12], "x": 12.75, "y": 3, "w": 2.25},
{"matrix": [3, 15], "x": 15, "y": 3},
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
{"matrix": [4, 1], "x": 1.25, "y": 4},
{"matrix": [4, 2], "x": 2.25, "y": 4},
{"matrix": [4, 3], "x": 3.25, "y": 4},
{"matrix": [4, 4], "x": 4.25, "y": 4},
{"matrix": [4, 5], "x": 5.25, "y": 4},
{"matrix": [4, 6], "x": 6.25, "y": 4},
{"matrix": [4, 7], "x": 7.25, "y": 4},
{"matrix": [4, 8], "x": 8.25, "y": 4},
{"matrix": [4, 9], "x": 9.25, "y": 4},
{"matrix": [4, 10], "x": 10.25, "y": 4},
{"matrix": [4, 11], "x": 11.25, "y": 4},
{"matrix": [4, 12], "x": 12.25, "y": 4, "w": 1.75},
{"matrix": [4, 14], "x": 14, "y": 4},
{"matrix": [4, 15], "x": 15, "y": 4},
{"matrix": [5, 0], "x": 0, "y": 5, "w": 1.25},
{"matrix": [5, 1], "x": 1.25, "y": 5, "w": 1.25},
{"matrix": [5, 2], "x": 2.5, "y": 5, "w": 1.25},
{"matrix": [5, 6], "x": 3.75, "y": 5, "w": 6.25},
{"matrix": [5, 10], "x": 10, "y": 5},
{"matrix": [5, 11], "x": 11, "y": 5},
{"matrix": [5, 12], "x": 12, "y": 5},
{"matrix": [5, 13], "x": 13, "y": 5},
{"matrix": [5, 14], "x": 14, "y": 5},
{"matrix": [5, 15], "x": 15, "y": 5}
]
},
"LAYOUT_75_ansi": {
"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},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "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, "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": 1},
{"matrix": [1, 9], "x": 9, "y": 1},
{"matrix": [1, 10], "x": 10, "y": 1},
{"matrix": [1, 11], "x": 11, "y": 1},
{"matrix": [1, 12], "x": 12, "y": 1},
{"matrix": [1, 14], "x": 13, "y": 1, "w": 2},
{"matrix": [1, 15], "x": 15, "y": 1},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.5},
{"matrix": [2, 1], "x": 1.5, "y": 2},
{"matrix": [2, 2], "x": 2.5, "y": 2},
{"matrix": [2, 3], "x": 3.5, "y": 2},
{"matrix": [2, 4], "x": 4.5, "y": 2},
{"matrix": [2, 5], "x": 5.5, "y": 2},
{"matrix": [2, 6], "x": 6.5, "y": 2},
{"matrix": [2, 7], "x": 7.5, "y": 2},
{"matrix": [2, 8], "x": 8.5, "y": 2},
{"matrix": [2, 9], "x": 9.5, "y": 2},
{"matrix": [2, 10], "x": 10.5, "y": 2},
{"matrix": [2, 11], "x": 11.5, "y": 2},
{"matrix": [2, 12], "x": 12.5, "y": 2},
{"matrix": [2, 13], "x": 13.5, "y": 2, "w": 1.5},
{"matrix": [2, 15], "x": 15, "y": 2},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 1.75},
{"matrix": [3, 1], "x": 1.75, "y": 3},
{"matrix": [3, 2], "x": 2.75, "y": 3},
{"matrix": [3, 3], "x": 3.75, "y": 3},
{"matrix": [3, 4], "x": 4.75, "y": 3},
{"matrix": [3, 5], "x": 5.75, "y": 3},
{"matrix": [3, 6], "x": 6.75, "y": 3},
{"matrix": [3, 7], "x": 7.75, "y": 3},
{"matrix": [3, 8], "x": 8.75, "y": 3},
{"matrix": [3, 9], "x": 9.75, "y": 3},
{"matrix": [3, 10], "x": 10.75, "y": 3},
{"matrix": [3, 11], "x": 11.75, "y": 3},
{"matrix": [3, 12], "x": 12.75, "y": 3, "w": 2.25},
{"matrix": [3, 15], "x": 15, "y": 3},
{"matrix": [4, 0], "x": 0, "y": 4, "w": 2.25},
{"matrix": [4, 2], "x": 2.25, "y": 4},
{"matrix": [4, 3], "x": 3.25, "y": 4},
{"matrix": [4, 4], "x": 4.25, "y": 4},
{"matrix": [4, 5], "x": 5.25, "y": 4},
{"matrix": [4, 6], "x": 6.25, "y": 4},
{"matrix": [4, 7], "x": 7.25, "y": 4},
{"matrix": [4, 8], "x": 8.25, "y": 4},
{"matrix": [4, 9], "x": 9.25, "y": 4},
{"matrix": [4, 10], "x": 10.25, "y": 4},
{"matrix": [4, 11], "x": 11.25, "y": 4},
{"matrix": [4, 12], "x": 12.25, "y": 4, "w": 1.75},
{"matrix": [4, 14], "x": 14, "y": 4},
{"matrix": [4, 15], "x": 15, "y": 4},
{"matrix": [5, 0], "x": 0, "y": 5, "w": 1.25},
{"matrix": [5, 1], "x": 1.25, "y": 5, "w": 1.25},
{"matrix": [5, 2], "x": 2.5, "y": 5, "w": 1.25},
{"matrix": [5, 6], "x": 3.75, "y": 5, "w": 6.25},
{"matrix": [5, 10], "x": 10, "y": 5},
{"matrix": [5, 11], "x": 11, "y": 5},
{"matrix": [5, 12], "x": 12, "y": 5},
{"matrix": [5, 13], "x": 13, "y": 5},
{"matrix": [5, 14], "x": 14, "y": 5},
{"matrix": [5, 15], "x": 15, "y": 5}
]
}
}
}
@@ -0,0 +1,16 @@
{
"author": "kbd0",
"keyboard": "kbd0/curve0/75_ansi",
"keymap": "75_ansi",
"layout": "LAYOUT_75_ansi",
"layers": [
[
"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_PRINT_SCREEN", "KC_DELETE", "KC_INSERT",
"KC_GRAVE", "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_HOME",
"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_END",
"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_PGUP",
"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_PGDN",
"KC_LCTL", "KC_LGUI", "KC_LALT", "KC_SPC", "KC_RALT", "KC_APP", "KC_RCTL", "KC_LEFT", "KC_DOWN", "KC_RIGHT"
]
]
}
@@ -0,0 +1,16 @@
{
"author": "kbd0",
"keyboard": "kbd0/curve0/75_ansi",
"keymap": "default",
"layout": "LAYOUT_all",
"layers": [
[
"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_PRINT_SCREEN", "KC_DELETE", "KC_INSERT",
"KC_GRAVE", "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_BSLS", "KC_BSPC", "KC_HOME",
"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_END",
"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_PGUP",
"KC_LSFT", "KC_NUBS", "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_PGDN",
"KC_LCTL", "KC_LGUI", "KC_LALT", "KC_SPC", "KC_RALT", "KC_APP", "KC_RCTL", "KC_LEFT", "KC_DOWN", "KC_RIGHT"
]
]
}
+27
View File
@@ -0,0 +1,27 @@
# kbd0/curve0/75_ansi
![Curve0](https://i.imgur.com/0YOTmsk.jpeg)
Curve0 - Curved stainless steel keyboard by Kbd0
* Keyboard Maintainer: [kbd0](https://github.com/kbd0)
* Hardware Supported: Curve0 PCB
* Hardware Availability: [kbd0.com](https://kbd0.com/item/curve0)
Make example for this keyboard (after setting up your build environment):
make kbd0/curve0/75_ansi:default
Flashing example for this keyboard:
make kbd0/curve0/75_ansi: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 the top left key of the keyboard while plugging in the keyboard
* **Physical reset button**: Hold the little button on the main PCB (inside the keyboard, near the spacebar) while plugging in the keyboard
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
+21
View File
@@ -0,0 +1,21 @@
{
"manufacturer": "Keebio",
"url": "https://keeb.io",
"maintainer": "nooges",
"usb": {
"vid": "0xCB10"
},
"features": {
"bootmagic": true,
"console": true,
"extrakey": true,
"mousekey": true,
"nkro": false
},
"split": {
"enabled": true
},
"build": {
"lto": true
}
}
@@ -0,0 +1,23 @@
// Copyright 2026 Keebio (@keebio)
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT(
KC_MUTE, RM_NEXT, 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_VOLD, KC_VOLU,
KC_F1, KC_F2, 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_DEL,
KC_F3, KC_F4, 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_HOME,
KC_F5, KC_F6, 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_PGUP,
KC_F7, KC_F8, 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_PGDN,
KC_F9, KC_F10, MO(1), KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_SPC, MO(1), KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
),
[1] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
RM_HUEU, RM_HUED, KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______,
RM_SATU, RM_SATD, RM_TOGG, RM_NEXT, KC_UP, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END,
RM_VALU, RM_VALD, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
RM_SPDU, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
)
};
+27
View File
@@ -0,0 +1,27 @@
# Sinc LM
A split 75%/TKL staggered low-profile keyboard made and sold by Keebio. [More info at Keebio](https://keeb.io).
* Keyboard Maintainer: [Bakingpy/nooges](https://github.com/nooges)
* Hardware Availability: [Keebio](https://keeb.io/)
Make example for this keyboard (after setting up your build environment):
make keebio/sinc_lm/rev1:default
Example of flashing this keyboard:
make keebio/sinc_lm/rev1:default:flash
Handedness detection is already hardwired onto the PCB, so no need to deal with `EE_HANDS` or flashing .eep files.
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 one of these ways:
* **Physical reset button**: Press and hold the button on the back of the PCB for at least 2 seconds and let go, or double-press the button
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
A build guide for this keyboard can be found here: [Keebio Build Guides](https://docs.keeb.io)
+23
View File
@@ -0,0 +1,23 @@
// Copyright 2026 Keebio (@keebio)
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
/* Defines for the split keyboard setup */
#define SERIAL_USART_DRIVER SD3 // USART 3
#define SERIAL_USART_TX_PIN B10
#define SERIAL_USART_RX_PIN B11
#define SERIAL_USART_TX_PAL_MODE 7
#define SERIAL_USART_RX_PAL_MODE 7
#define SERIAL_USART_FULL_DUPLEX
#define SERIAL_USART_PIN_SWAP
#define USB_VBUS_PIN C6
/* Defines for the RGB matrix */
#define WS2812_PWM_DRIVER PWMD3
#define WS2812_PWM_CHANNEL 4
#define WS2812_PWM_PAL_MODE 10
#define WS2812_DMA_STREAM STM32_DMA1_STREAM2
#define WS2812_DMA_CHANNEL 2
#define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM3_UP
+10
View File
@@ -0,0 +1,10 @@
// Copyright 2026 Keebio (@keebio)
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#define HAL_USE_SERIAL TRUE
#define HAL_USE_PWM TRUE
#include_next <halconf.h>
+358
View File
@@ -0,0 +1,358 @@
{
"manufacturer": "Keebio",
"keyboard_name": "Sinc LM Rev. 1",
"maintainer": "nooges",
"bootloader": "stm32-dfu",
"bootmagic": {
"matrix": [0, 2]
},
"diode_direction": "COL2ROW",
"features": {
"bootmagic": true,
"extrakey": true,
"mousekey": true,
"rgb_matrix": true
},
"matrix_pins": {
"cols": ["B13", "B14", "B2", "F0", "C10", "B6", "C13", "C14", "C15"],
"rows": ["B4", "C11", "B12", "B5", "F1", "B1"]
},
"processor": "STM32G431",
"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,
"cycle_out_in": true,
"cycle_out_in_dual": true,
"rainbow_moving_chevron": true,
"cycle_pinwheel": true,
"cycle_spiral": true,
"dual_beacon": true,
"rainbow_beacon": true,
"rainbow_pinwheels": true,
"flower_blooming": true,
"raindrops": true,
"jellybean_raindrops": true,
"hue_breathing": true,
"hue_pendulum": true,
"hue_wave": true,
"pixel_fractal": true,
"pixel_flow": true,
"pixel_rain": true,
"typing_heatmap": true,
"digital_rain": true,
"solid_reactive_simple": true,
"solid_reactive": true,
"solid_reactive_wide": true,
"solid_reactive_multiwide": true,
"solid_reactive_cross": true,
"solid_reactive_multicross": true,
"solid_reactive_nexus": true,
"solid_reactive_multinexus": true,
"splash": true,
"multisplash": true,
"solid_splash": true,
"solid_multisplash": true,
"starlight": true,
"starlight_smooth": true,
"starlight_dual_hue": true,
"starlight_dual_sat": true,
"riverflow": true
},
"driver": "ws2812",
"layout": [
{ "matrix": [5, 2], "x": 30, "y": 4, "flags": 4 },
{ "x": 32, "y": 10, "flags": 2 },
{ "matrix": [5, 3], "x": 45, "y": 4, "flags": 4 },
{ "matrix": [5, 4], "x": 58, "y": 4, "flags": 4 },
{ "matrix": [5, 5], "x": 70, "y": 4, "flags": 4 },
{ "x": 76, "y": 2, "flags": 2 },
{ "matrix": [5, 6], "x": 82, "y": 4, "flags": 4 },
{ "matrix": [5, 7], "x": 97, "y": 4, "flags": 4 },
{ "matrix": [5, 8], "x": 109, "y": 4, "flags": 4 },
{ "x": 103, "y": 10, "flags": 2 },
{ "matrix": [0, 8], "x": 103, "y": 18, "flags": 4 },
{ "matrix": [0, 7], "x": 91, "y": 18, "flags": 4 },
{ "matrix": [0, 6], "x": 79, "y": 18, "flags": 4 },
{ "matrix": [0, 5], "x": 67, "y": 18, "flags": 4 },
{ "matrix": [0, 4], "x": 54, "y": 18, "flags": 4 },
{ "matrix": [0, 3], "x": 42, "y": 18, "flags": 4 },
{ "matrix": [0, 2], "x": 30, "y": 18, "flags": 4 },
{ "matrix": [1, 2], "x": 33, "y": 30, "flags": 4 },
{ "matrix": [1, 3], "x": 48, "y": 30, "flags": 4 },
{ "matrix": [1, 4], "x": 61, "y": 30, "flags": 4 },
{ "matrix": [1, 5], "x": 73, "y": 30, "flags": 4 },
{ "matrix": [1, 6], "x": 85, "y": 30, "flags": 4 },
{ "matrix": [1, 7], "x": 97, "y": 30, "flags": 4 },
{ "matrix": [2, 7], "x": 100, "y": 41, "flags": 4 },
{ "matrix": [2, 6], "x": 88, "y": 41, "flags": 4 },
{ "matrix": [2, 5], "x": 76, "y": 41, "flags": 4 },
{ "matrix": [2, 4], "x": 64, "y": 41, "flags": 4 },
{ "matrix": [2, 3], "x": 51, "y": 41, "flags": 4 },
{ "matrix": [2, 2], "x": 35, "y": 41, "flags": 4 },
{ "matrix": [3, 2], "x": 38, "y": 53, "flags": 4 },
{ "matrix": [3, 4], "x": 58, "y": 53, "flags": 4 },
{ "matrix": [3, 5], "x": 70, "y": 53, "flags": 4 },
{ "matrix": [3, 6], "x": 82, "y": 53, "flags": 4 },
{ "matrix": [3, 7], "x": 94, "y": 53, "flags": 4 },
{ "x": 100, "y": 46, "flags": 2 },
{ "matrix": [3, 8], "x": 106, "y": 53, "flags": 4 },
{ "matrix": [4, 7], "x": 98, "y": 64, "flags": 4 },
{ "x": 85, "y": 64, "flags": 2 },
{ "matrix": [4, 5], "x": 77, "y": 64, "flags": 4 },
{ "matrix": [4, 4], "x": 62, "y": 64, "flags": 4 },
{ "matrix": [4, 3], "x": 47, "y": 64, "flags": 4 },
{ "x": 39, "y": 60, "flags": 4 },
{ "matrix": [4, 2], "x": 32, "y": 64, "flags": 4 },
{ "matrix": [4, 1], "x": 12, "y": 64, "flags": 4 },
{ "x": 6, "y": 60, "flags": 2 },
{ "matrix": [4, 0], "x": 0, "y": 64, "flags": 4 },
{ "matrix": [3, 0], "x": 0, "y": 53, "flags": 4 },
{ "matrix": [3, 1], "x": 12, "y": 53, "flags": 4 },
{ "matrix": [2, 1], "x": 12, "y": 41, "flags": 4 },
{ "matrix": [2, 0], "x": 0, "y": 41, "flags": 4 },
{ "matrix": [1, 0], "x": 0, "y": 30, "flags": 4 },
{ "matrix": [1, 1], "x": 12, "y": 30, "flags": 4 },
{ "matrix": [0, 1], "x": 12, "y": 18, "flags": 4 },
{ "matrix": [0, 0], "x": 0, "y": 18, "flags": 4 },
{ "matrix": [5, 0], "x": 0, "y": 4, "flags": 4 },
{ "x": 6, "y": 2, "flags": 2 },
{ "matrix": [5, 1], "x": 12, "y": 4, "flags": 4 },
{ "x": 224, "y": 10, "flags": 2 },
{ "matrix": [11, 8], "x": 224, "y": 4, "flags": 4 },
{ "matrix": [11, 7], "x": 212, "y": 4, "flags": 4 },
{ "matrix": [11, 6], "x": 197, "y": 4, "flags": 4 },
{ "x": 191, "y": 10, "flags": 2 },
{ "matrix": [11, 5], "x": 185, "y": 4, "flags": 4 },
{ "matrix": [11, 4], "x": 173, "y": 4, "flags": 4 },
{ "x": 166, "y": 10, "flags": 2 },
{ "matrix": [11, 3], "x": 160, "y": 4, "flags": 4 },
{ "matrix": [11, 2], "x": 145, "y": 4, "flags": 4 },
{ "x": 139, "y": 10, "flags": 2 },
{ "matrix": [11, 1], "x": 133, "y": 4, "flags": 4 },
{ "matrix": [6, 0], "x": 127, "y": 18, "flags": 4 },
{ "matrix": [6, 1], "x": 139, "y": 18, "flags": 4 },
{ "matrix": [6, 2], "x": 151, "y": 18, "flags": 4 },
{ "matrix": [6, 3], "x": 163, "y": 18, "flags": 4 },
{ "matrix": [6, 4], "x": 176, "y": 18, "flags": 4 },
{ "matrix": [6, 5], "x": 188, "y": 18, "flags": 4 },
{ "matrix": [6, 7], "x": 206, "y": 18, "flags": 4 },
{ "matrix": [6, 8], "x": 224, "y": 18, "flags": 4 },
{ "matrix": [7, 8], "x": 224, "y": 30, "flags": 4 },
{ "matrix": [7, 7], "x": 209, "y": 30, "flags": 4 },
{ "matrix": [7, 6], "x": 194, "y": 30, "flags": 4 },
{ "matrix": [7, 5], "x": 182, "y": 30, "flags": 4 },
{ "matrix": [7, 4], "x": 170, "y": 30, "flags": 4 },
{ "matrix": [7, 3], "x": 157, "y": 30, "flags": 4 },
{ "matrix": [7, 2], "x": 145, "y": 30, "flags": 4 },
{ "matrix": [7, 1], "x": 133, "y": 30, "flags": 4 },
{ "matrix": [7, 0], "x": 121, "y": 30, "flags": 4 },
{ "matrix": [8, 0], "x": 124, "y": 41, "flags": 4 },
{ "matrix": [8, 1], "x": 136, "y": 41, "flags": 4 },
{ "matrix": [8, 2], "x": 148, "y": 41, "flags": 4 },
{ "matrix": [8, 3], "x": 160, "y": 41, "flags": 4 },
{ "matrix": [8, 4], "x": 173, "y": 41, "flags": 4 },
{ "matrix": [8, 5], "x": 185, "y": 41, "flags": 4 },
{ "matrix": [8, 7], "x": 204, "y": 41, "flags": 4 },
{ "matrix": [8, 8], "x": 224, "y": 41, "flags": 4 },
{ "matrix": [9, 8], "x": 224, "y": 53, "flags": 4 },
{ "matrix": [9, 7], "x": 212, "y": 53, "flags": 4 },
{ "matrix": [9, 6], "x": 195, "y": 53, "flags": 4 },
{ "matrix": [9, 4], "x": 179, "y": 53, "flags": 4 },
{ "matrix": [9, 3], "x": 166, "y": 53, "flags": 4 },
{ "matrix": [9, 2], "x": 154, "y": 53, "flags": 4 },
{ "matrix": [9, 1], "x": 142, "y": 53, "flags": 4 },
{ "matrix": [9, 0], "x": 130, "y": 53, "flags": 4 },
{ "x": 127, "y": 64, "flags": 2 },
{ "matrix": [10, 1], "x": 141, "y": 64, "flags": 4 },
{ "x": 157, "y": 64, "flags": 2 },
{ "matrix": [10, 2], "x": 163, "y": 64, "flags": 4 },
{ "matrix": [10, 3], "x": 176, "y": 64, "flags": 4 },
{ "matrix": [10, 4], "x": 188, "y": 64, "flags": 4 },
{ "x": 194, "y": 64, "flags": 2 },
{ "matrix": [10, 6], "x": 200, "y": 64, "flags": 4 },
{ "matrix": [10, 7], "x": 212, "y": 64, "flags": 4 },
{ "x": 218, "y": 64, "flags": 2 },
{ "matrix": [10, 8], "x": 224, "y": 64, "flags": 4 }
],
"max_brightness": 120,
"sleep": true,
"split_count": [57, 56]
},
"split": {
"bootmagic": {
"matrix": [11, 8]
},
"enabled": true,
"handedness": {
"pin": "A0"
},
"matrix_pins": {
"right": {
"cols": ["B2", "A15", "A2", "A1", "A4", "B15", "B6", "C13", "C14"],
"rows": ["B12", "B13", "B14", "B5", "F1", "B1"]
}
},
"serial": {
"driver": "usart"
},
"transport": {
"sync": {
"matrix_state": true
}
}
},
"url": "https://keeb.io",
"usb": {
"device_version": "1.0.0",
"pid": "0x1667",
"vid": "0xCB10"
},
"ws2812": {
"driver": "pwm",
"pin": "B7"
},
"layouts": {
"LAYOUT": {
"layout": [
{"label": "Mute", "matrix": [5, 0], "x": 0, "y": 0},
{"label": "Play", "matrix": [5, 1], "x": 1, "y": 0},
{"label": "Esc", "matrix": [5, 2], "x": 2.25, "y": 0},
{"label": "F1", "matrix": [5, 3], "x": 3.5, "y": 0},
{"label": "F2", "matrix": [5, 4], "x": 4.5, "y": 0},
{"label": "F3", "matrix": [5, 5], "x": 5.5, "y": 0},
{"label": "F4", "matrix": [5, 6], "x": 6.5, "y": 0},
{"label": "F5", "matrix": [5, 7], "x": 7.75, "y": 0},
{"label": "F6", "matrix": [5, 8], "x": 8.75, "y": 0},
{"label": "F7", "matrix": [11, 1], "x": 10.75, "y": 0},
{"label": "F8", "matrix": [11, 2], "x": 11.75, "y": 0},
{"label": "F9", "matrix": [11, 3], "x": 13, "y": 0},
{"label": "F10", "matrix": [11, 4], "x": 14, "y": 0},
{"label": "F11", "matrix": [11, 5], "x": 15, "y": 0},
{"label": "F12", "matrix": [11, 6], "x": 16, "y": 0},
{"label": "Volume Up", "matrix": [11, 7], "x": 17.25, "y": 0},
{"label": "Volume Down", "matrix": [11, 8], "x": 18.25, "y": 0},
{"label": "F1", "matrix": [0, 0], "x": 0, "y": 1.25},
{"label": "F2", "matrix": [0, 1], "x": 1, "y": 1.25},
{"label": "Grave", "matrix": [0, 2], "x": 2.25, "y": 1.25},
{"label": "1", "matrix": [0, 3], "x": 3.25, "y": 1.25},
{"label": "2", "matrix": [0, 4], "x": 4.25, "y": 1.25},
{"label": "3", "matrix": [0, 5], "x": 5.25, "y": 1.25},
{"label": "4", "matrix": [0, 6], "x": 6.25, "y": 1.25},
{"label": "5", "matrix": [0, 7], "x": 7.25, "y": 1.25},
{"label": "6", "matrix": [0, 8], "x": 8.25, "y": 1.25},
{"label": "7", "matrix": [6, 0], "x": 10.25, "y": 1.25},
{"label": "8", "matrix": [6, 1], "x": 11.25, "y": 1.25},
{"label": "9", "matrix": [6, 2], "x": 12.25, "y": 1.25},
{"label": "0", "matrix": [6, 3], "x": 13.25, "y": 1.25},
{"label": "-", "matrix": [6, 4], "x": 14.25, "y": 1.25},
{"label": "=", "matrix": [6, 5], "x": 15.25, "y": 1.25},
{"label": "Bksp", "matrix": [6, 7], "x": 16.25, "y": 1.25, "w": 2},
{"label": "Del", "matrix": [6, 8], "x": 18.25, "y": 1.25},
{"label": "F3", "matrix": [1, 0], "x": 0, "y": 2.25},
{"label": "F4", "matrix": [1, 1], "x": 1, "y": 2.25},
{"label": "Tab", "matrix": [1, 2], "x": 2.25, "y": 2.25, "w": 1.5},
{"label": "Q", "matrix": [1, 3], "x": 3.75, "y": 2.25},
{"label": "W", "matrix": [1, 4], "x": 4.75, "y": 2.25},
{"label": "E", "matrix": [1, 5], "x": 5.75, "y": 2.25},
{"label": "R", "matrix": [1, 6], "x": 6.75, "y": 2.25},
{"label": "T", "matrix": [1, 7], "x": 7.75, "y": 2.25},
{"label": "Y", "matrix": [7, 0], "x": 9.75, "y": 2.25},
{"label": "U", "matrix": [7, 1], "x": 10.75, "y": 2.25},
{"label": "I", "matrix": [7, 2], "x": 11.75, "y": 2.25},
{"label": "O", "matrix": [7, 3], "x": 12.75, "y": 2.25},
{"label": "P", "matrix": [7, 4], "x": 13.75, "y": 2.25},
{"label": "{", "matrix": [7, 5], "x": 14.75, "y": 2.25},
{"label": "}", "matrix": [7, 6], "x": 15.75, "y": 2.25},
{"label": "|", "matrix": [7, 7], "x": 16.75, "y": 2.25, "w": 1.5},
{"label": "Home", "matrix": [7, 8], "x": 18.25, "y": 2.25},
{"label": "F5", "matrix": [2, 0], "x": 0, "y": 3.25},
{"label": "F6", "matrix": [2, 1], "x": 1, "y": 3.25},
{"label": "Caps Lock", "matrix": [2, 2], "x": 2.25, "y": 3.25, "w": 1.75},
{"label": "A", "matrix": [2, 3], "x": 4, "y": 3.25},
{"label": "S", "matrix": [2, 4], "x": 5, "y": 3.25},
{"label": "D", "matrix": [2, 5], "x": 6, "y": 3.25},
{"label": "F", "matrix": [2, 6], "x": 7, "y": 3.25},
{"label": "G", "matrix": [2, 7], "x": 8, "y": 3.25},
{"label": "H", "matrix": [8, 0], "x": 10, "y": 3.25},
{"label": "J", "matrix": [8, 1], "x": 11, "y": 3.25},
{"label": "K", "matrix": [8, 2], "x": 12, "y": 3.25},
{"label": "L", "matrix": [8, 3], "x": 13, "y": 3.25},
{"label": ":", "matrix": [8, 4], "x": 14, "y": 3.25},
{"label": "\"", "matrix": [8, 5], "x": 15, "y": 3.25},
{"label": "Enter", "matrix": [8, 7], "x": 16, "y": 3.25, "w": 2.25},
{"label": "PgUp", "matrix": [8, 8], "x": 18.25, "y": 3.25},
{"label": "F7", "matrix": [3, 0], "x": 0, "y": 4.25},
{"label": "F8", "matrix": [3, 1], "x": 1, "y": 4.25},
{"label": "Shift", "matrix": [3, 2], "x": 2.25, "y": 4.25, "w": 2.25},
{"label": "Z", "matrix": [3, 4], "x": 4.5, "y": 4.25},
{"label": "X", "matrix": [3, 5], "x": 5.5, "y": 4.25},
{"label": "C", "matrix": [3, 6], "x": 6.5, "y": 4.25},
{"label": "V", "matrix": [3, 7], "x": 7.5, "y": 4.25},
{"label": "B", "matrix": [3, 8], "x": 8.5, "y": 4.25},
{"label": "N", "matrix": [9, 0], "x": 10.5, "y": 4.25},
{"label": "M", "matrix": [9, 1], "x": 11.5, "y": 4.25},
{"label": ",", "matrix": [9, 2], "x": 12.5, "y": 4.25},
{"label": ".", "matrix": [9, 3], "x": 13.5, "y": 4.25},
{"label": "/", "matrix": [9, 4], "x": 14.5, "y": 4.25},
{"label": "Shift", "matrix": [9, 6], "x": 15.5, "y": 4.25, "w": 1.75},
{"label": "Up", "matrix": [9, 7], "x": 17.25, "y": 4.25},
{"label": "PgDn", "matrix": [9, 8], "x": 18.25, "y": 4.25},
{"label": "F9", "matrix": [4, 0], "x": 0, "y": 5.25},
{"label": "F10", "matrix": [4, 1], "x": 1, "y": 5.25},
{"label": "Fn", "matrix": [4, 2], "x": 2.25, "y": 5.25, "w": 1.25},
{"label": "Ctrl", "matrix": [4, 3], "x": 3.5, "y": 5.25, "w": 1.25},
{"label": "Alt", "matrix": [4, 4], "x": 4.75, "y": 5.25, "w": 1.25},
{"label": "Win", "matrix": [4, 5], "x": 6, "y": 5.25, "w": 1.25},
{"label": "Space", "matrix": [4, 7], "x": 7.25, "y": 5.25, "w": 2.25},
{"label": "Space", "matrix": [10, 1], "x": 10.5, "y": 5.25, "w": 2.75},
{"label": "Fn", "matrix": [10, 2], "x": 13.25, "y": 5.25},
{"label": "Alt", "matrix": [10, 3], "x": 14.25, "y": 5.25},
{"label": "Ctrl", "matrix": [10, 4], "x": 15.25, "y": 5.25},
{"label": "Left", "matrix": [10, 6], "x": 16.25, "y": 5.25},
{"label": "Down", "matrix": [10, 7], "x": 17.25, "y": 5.25},
{"label": "Right", "matrix": [10, 8], "x": 18.25, "y": 5.25}
]
}
}
}
+14
View File
@@ -0,0 +1,14 @@
// Copyright 2026 Keebio (@keebio)
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include_next <mcuconf.h>
/* enable USART3, used for split comms */
#undef STM32_SERIAL_USE_USART3
#define STM32_SERIAL_USE_USART3 TRUE
/* enable TIM3, used for RGB LED PWM driver */
#undef STM32_PWM_USE_TIM3
#define STM32_PWM_USE_TIM3 TRUE
+11
View File
@@ -0,0 +1,11 @@
// Copyright 2026 Keebio (@keebio)
// SPDX-License-Identifier: GPL-2.0-or-later
#include "quantum.h"
void keyboard_pre_init_kb(void) {
// Disable the PD peripheral in pre-init because its pins are being used in the matrix:
PWR->CR3 |= PWR_CR3_UCPD_DBDIS;
// Call the corresponding _user() function (see https://docs.qmk.fm/#/custom_quantum_functions)
keyboard_pre_init_user();
}
+3
View File
@@ -18,3 +18,6 @@
/* Enable caps-lock LED */
#define CAPS_LOCK_LED_INDEX 54
/* Enable num-lock LED */
#define NUM_LOCK_LED_INDEX 33
@@ -21,3 +21,6 @@
/* Enable caps-lock LED */
#define CAPS_LOCK_LED_INDEX 52
/* Enable num-lock LED */
#define NUM_LOCK_LED_INDEX 31
+3
View File
@@ -18,3 +18,6 @@
/* Enable caps-lock LED */
#define CAPS_LOCK_LED_INDEX 53
/* Enable num-lock LED */
#define NUM_LOCK_LED_INDEX 33
@@ -21,3 +21,6 @@
/* Enable caps-lock LED */
#define CAPS_LOCK_LED_INDEX 51
/* Enable num-lock LED */
#define NUM_LOCK_LED_INDEX 31
+10 -1
View File
@@ -30,7 +30,7 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#endif // DIP_SWITCH_ENABLE
#if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX)
#if defined(RGB_MATRIX_ENABLE) && (defined(CAPS_LOCK_LED_INDEX) || defined(NUM_LOCK_LED_INDEX))
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) { return false; }
@@ -69,6 +69,15 @@ bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
RGB_MATRIX_INDICATOR_SET_COLOR(CAPS_LOCK_LED_INDEX, 0, 0, 0);
}
}
#ifdef NUM_LOCK_LED_INDEX
if (host_keyboard_led_state().num_lock) {
RGB_MATRIX_INDICATOR_SET_COLOR(NUM_LOCK_LED_INDEX, 255, 255, 255);
} else {
if (!rgb_matrix_get_flags()) {
RGB_MATRIX_INDICATOR_SET_COLOR(NUM_LOCK_LED_INDEX, 0, 0, 0);
}
}
#endif
return true;
}
@@ -0,0 +1,28 @@
{
"manufacturer": "Sebastian Morgenstern",
"keyboard_name": "pttbutton",
"maintainer": "morningstar1",
"bootloader": "stm32-dfu",
"diode_direction": "COL2ROW",
"features": {
"extrakey": true
},
"matrix_pins": {
"cols": ["B0"],
"rows": ["A0"]
},
"processor": "STM32F042",
"url": "https://github.com/morningstar1/pttbutton",
"usb": {
"device_version": "1.0.0",
"vid": "0x736D",
"pid": "0xAFFE"
},
"layouts": {
"LAYOUT": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0}
]
}
}
}
@@ -0,0 +1,10 @@
// Copyright 2026 SEbastian Morgenstern
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT(
KC_F14
)
};
@@ -0,0 +1,42 @@
/* Copyright 2026 Sebastian Morgenstern
*
* 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"
#include "hal.h"
void board_init(void) {
// Remap PA11->PA9 and PA12->PA10 for USB
SYSCFG->CFGR1 |= SYSCFG_CFGR1_PA11_PA12_RMP;
}
void keyboard_pre_init_kb(void) {
// Immediately set the LED pin as an output and set it ON
gpio_set_pin_output(A15);
gpio_write_pin_high(A15);
keyboard_pre_init_user();
}
void keyboard_post_init_kb(void) {
// Blink the LED so we know everything is running OK
// Finish with LED OFF
gpio_write_pin_low(A15);
wait_ms(100);
gpio_write_pin_high(A15);
wait_ms(100);
gpio_write_pin_low(A15);
keyboard_post_init_user();
}

Some files were not shown because too many files have changed in this diff Show More