mirror of
https://github.com/qmk/qmk_firmware.git
synced 2026-07-02 06:54:22 -04:00
Compare commits
50 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2ea1a0192f | |||
| 1620390d67 | |||
| 462556f4de | |||
| c20d0a83b5 | |||
| 3c338996f0 | |||
| 3a8ea37a13 | |||
| f8aec1f50c | |||
| 2604a49cda | |||
| c701efbb53 | |||
| d9bf44c7a9 | |||
| 393d3a5b21 | |||
| 5e3985024d | |||
| 12e5b7db97 | |||
| 316fc06d8c | |||
| a033e172b9 | |||
| a187ebeec6 | |||
| ffe57097eb | |||
| 99a67d1172 | |||
| 7e9c4508c8 | |||
| ed0d5fde7b | |||
| 0269eea2c9 | |||
| 1836382f66 | |||
| 504533b3b4 | |||
| ba9642c83d | |||
| c2f7a5b5c5 | |||
| ccc6c6ce0b | |||
| c93ef27143 | |||
| 15e8658e81 | |||
| c6475e0476 | |||
| 3001d81e3d | |||
| 407e6e242e | |||
| 18ed7c6caf | |||
| 92c0e2cee1 | |||
| 6a11370434 | |||
| 2bd8e43256 | |||
| 933cb8cc35 | |||
| 1426eedfc1 | |||
| e4b998ccb0 | |||
| b5af7a3390 | |||
| ed80e21858 | |||
| 9d24bc8a33 | |||
| c7fde3d8cc | |||
| 0fdb5df94d | |||
| bd500ae092 | |||
| fec01edaa4 | |||
| 7619e991cf | |||
| 627ad33233 | |||
| 2cbcd76ef0 | |||
| 322e673bcb | |||
| 4be8880177 |
@@ -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 }}-*
|
||||
|
||||
@@ -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: |
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -8,6 +8,9 @@ on:
|
||||
paths:
|
||||
- 'data/constants/**'
|
||||
- 'lib/python/**'
|
||||
- 'quantum/rgblight/rgblight_breathe_table.h'
|
||||
- 'quantum/keycodes.h'
|
||||
- 'quantum/keymap_extras/**'
|
||||
|
||||
jobs:
|
||||
regen:
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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).
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -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);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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).
|
||||
|
||||
|
||||
@@ -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
@@ -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:
|
||||
|
||||
|
||||
@@ -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. |
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
@@ -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}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
@@ -0,0 +1,26 @@
|
||||
# alatus
|
||||
|
||||

|
||||
|
||||
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.
|
||||
@@ -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"
|
||||
]
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
# MID.1
|
||||
|
||||

|
||||
|
||||
## 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.
|
||||
@@ -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/
|
||||
@@ -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)
|
||||
};
|
||||
@@ -0,0 +1,29 @@
|
||||
# Candy87
|
||||
|
||||

|
||||
|
||||
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
|
||||
|
||||
@@ -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
|
||||
@@ -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.
|
||||
@@ -0,0 +1,35 @@
|
||||
# dj505/picolx
|
||||
|
||||

|
||||
|
||||
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.
|
||||
@@ -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,_______,_______,
|
||||
// ├───────┼───────┼───────┼───────┼───────┼───────┤ ├───────┼───────┼───────┼───────┼───────┼───────┤
|
||||
_______,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,_______,
|
||||
// └───────┼───────┼───────┼───────┼───────┴───────┘ └───────┴───────┼───────┼───────┼───────┼───────┘
|
||||
_______,_______,_______, _______,_______,_______,
|
||||
// └───────┴───────┴───────┘ └───────┴───────┴───────┘
|
||||
// ┌───────┬───────┐ ┌───────┬───────┐
|
||||
_______,_______, _______,_______,
|
||||
// ┌────────┬───────┼───────┼───────┤ ├───────┼───────┼───────┬───────┐
|
||||
_______, _______,_______,_______, _______,_______,_______,_______,
|
||||
// | ├───────┤ ├───────┤ |
|
||||
_______, _______
|
||||
// └────────────────────────┴───────┘ └───────┴───────────────────────┘
|
||||
)
|
||||
};
|
||||
@@ -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
|
||||
|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
@@ -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
|
||||
),
|
||||
};
|
||||
@@ -0,0 +1,27 @@
|
||||
# Dinkey 34
|
||||
|
||||

|
||||
|
||||
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
|
||||
@@ -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),
|
||||
};
|
||||
@@ -0,0 +1,31 @@
|
||||
# Pando58
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
*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
|
||||
@@ -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"
|
||||
]
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
# kbd0/curve0/75_ansi
|
||||
|
||||

|
||||
|
||||
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
|
||||
@@ -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, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
|
||||
)
|
||||
};
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -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>
|
||||
@@ -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}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user