forked from mirror/qmk_firmware
Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9c2ca00074 | ||
|
|
594558ec7b | ||
|
|
5e1b1f5023 | ||
|
|
cc567c917b | ||
|
|
81cc69c2dd | ||
|
|
0fde9c9cac | ||
|
|
5bb7476400 | ||
|
|
6242c09f7d | ||
|
|
eb5703d12e | ||
|
|
bb2ca21647 | ||
|
|
ed343ddad4 | ||
|
|
e7ad19bb95 | ||
|
|
024c4ef853 |
2
.github/workflows/api.yml
vendored
2
.github/workflows/api.yml
vendored
@@ -25,7 +25,7 @@ jobs:
|
||||
if: github.repository == 'qmk/qmk_firmware'
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 1
|
||||
persist-credentials: false
|
||||
|
||||
2
.github/workflows/auto_tag.yml
vendored
2
.github/workflows/auto_tag.yml
vendored
@@ -28,7 +28,7 @@ jobs:
|
||||
if: github.repository == 'qmk/qmk_firmware'
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
|
||||
251
.github/workflows/bootstrap_testing.yml
vendored
Normal file
251
.github/workflows/bootstrap_testing.yml
vendored
Normal file
@@ -0,0 +1,251 @@
|
||||
name: Bootstrap Script Testing
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [bootstrap]
|
||||
paths:
|
||||
- "util/env-bootstrap.sh"
|
||||
- ".github/workflows/bootstrap_testing.yml"
|
||||
- "lib/python/**"
|
||||
pull_request:
|
||||
branches: [master, develop, xap]
|
||||
paths:
|
||||
- "util/env-bootstrap.sh"
|
||||
- ".github/workflows/bootstrap_testing.yml"
|
||||
- "lib/python/**"
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
bootstrap-test-linux:
|
||||
name: Bootstrap (Linux)
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
distribution:
|
||||
# Ubuntu/Debian based
|
||||
- debian:11
|
||||
- debian:12
|
||||
- debian:13
|
||||
- ubuntu:20.04
|
||||
- ubuntu:22.04
|
||||
- ubuntu:24.04
|
||||
|
||||
# RHEL/CentOS/Fedora based
|
||||
- fedora:41
|
||||
- fedora:42
|
||||
- fedora:43
|
||||
- rockylinux:8
|
||||
- rockylinux:9
|
||||
- rockylinux/rockylinux:10
|
||||
- almalinux:8
|
||||
- almalinux:9
|
||||
- almalinux:10
|
||||
|
||||
# OpenSUSE based (we skip Tumbleweed as it has issues with package versions between pattern installs and other dependencies preinstalled into the base container)
|
||||
- opensuse/leap:latest
|
||||
|
||||
# Gentoo-based
|
||||
- gentoo/stage3:latest
|
||||
|
||||
# Arch based
|
||||
- archlinux:latest
|
||||
- cachyos/cachyos:latest
|
||||
- manjarolinux/base:latest
|
||||
|
||||
container:
|
||||
image: ${{ matrix.distribution }}
|
||||
options: --privileged
|
||||
|
||||
steps:
|
||||
- name: Install base dependencies
|
||||
run: |
|
||||
# Attempt to run the package installation up to 10 times to mitigate transient network issues
|
||||
for n in $(seq 1 10); do
|
||||
{
|
||||
echo "Attempt #$n of 10 to install base dependencies:"
|
||||
case "${{ matrix.distribution }}" in
|
||||
*ubuntu*|*debian*)
|
||||
apt-get update
|
||||
apt-get install -y sudo git passwd
|
||||
;;
|
||||
*fedora*|*rockylinux*|*almalinux*)
|
||||
dnf install -y sudo git passwd findutils # findutils=xargs
|
||||
;;
|
||||
*suse*)
|
||||
zypper --non-interactive refresh
|
||||
zypper --non-interactive install sudo git shadow findutils # findutils=xargs
|
||||
;;
|
||||
*gentoo*)
|
||||
emerge-webrsync
|
||||
emerge --noreplace --ask=n sudo dev-vcs/git shadow findutils # findutils=xargs
|
||||
;;
|
||||
*archlinux*|*cachyos*|*manjaro*)
|
||||
pacman -Syu --noconfirm
|
||||
pacman -S --noconfirm sudo git
|
||||
;;
|
||||
esac
|
||||
} && break || sleep 10
|
||||
done
|
||||
|
||||
# Fix PAM configuration for sudo in containers
|
||||
# Fix /etc/shadow permissions - common issue in container environments
|
||||
chmod 640 /etc/shadow || chmod 400 /etc/shadow || true
|
||||
|
||||
# Disable problematic PAM modules that commonly fail in RHEL-like containers
|
||||
sed -i 's/^session.*pam_systemd.so/#&/' /etc/pam.d/sudo || true
|
||||
sed -i 's/^session.*pam_loginuid.so/#&/' /etc/pam.d/sudo || true
|
||||
|
||||
# Ensure proper sudoers configuration
|
||||
echo 'Defaults !requiretty' >> /etc/sudoers
|
||||
echo 'Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"' >> /etc/sudoers
|
||||
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 1
|
||||
submodules: recursive
|
||||
path: qmk_firmware
|
||||
|
||||
- name: Create test user
|
||||
run: |
|
||||
# Create a test user for the bootstrap script
|
||||
useradd -m -s /bin/bash -U testuser
|
||||
echo 'testuser:testpassword' | chpasswd || true
|
||||
|
||||
# Configure passwordless sudo
|
||||
echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers # some distros complain about root not being in sudoers
|
||||
echo "testuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
|
||||
|
||||
# Test sudo functionality
|
||||
sudo -u testuser whoami || echo "Sudo test failed, but continuing..."
|
||||
|
||||
- name: Move QMK repository to test user home
|
||||
run: |
|
||||
# Add upstream remote to the cloned repository so `qmk doctor` doesn't flag a warning
|
||||
git -C qmk_firmware remote add upstream https://github.com/qmk/qmk_firmware.git
|
||||
# Move the QMK repository to the test user's home directory
|
||||
mv qmk_firmware /home/testuser/qmk_firmware
|
||||
chown -R testuser:testuser /home/testuser/qmk_firmware
|
||||
|
||||
- name: Run bootstrap script
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
# Ensure the bootstrap script can access sudo
|
||||
sudo -u testuser --preserve-env=GITHUB_TOKEN bash -c "
|
||||
export CONFIRM=1
|
||||
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
cd /home/testuser
|
||||
bash /home/testuser/qmk_firmware/util/env-bootstrap.sh
|
||||
"
|
||||
|
||||
- name: Test QMK CLI
|
||||
run: |
|
||||
sudo -u testuser bash -c "
|
||||
export PATH=/home/testuser/.local/bin:\$PATH
|
||||
cd /home/testuser
|
||||
qmk setup -y -H /home/testuser/qmk_firmware # setup implies doctor, no need to run it separately
|
||||
cd /home/testuser/qmk_firmware
|
||||
qmk mass-compile -j $(nproc) -e DUMP_CI_METADATA=yes -f 'keyboard_name==*onekey*' -km reset -p || touch .failed # Compile a bunch of different platforms
|
||||
"
|
||||
|
||||
cd /home/testuser/qmk_firmware
|
||||
./util/ci/generate_failure_markdown.sh > $GITHUB_STEP_SUMMARY || true
|
||||
[ ! -e .failed ] || exit 1
|
||||
|
||||
bootstrap-test-macos:
|
||||
name: Bootstrap (macOS)
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os:
|
||||
- macos-13 # Intel x64
|
||||
- macos-14 # Apple Silicon ARM64
|
||||
- macos-15 # Apple Silicon ARM64
|
||||
- macos-15-intel # Intel x64
|
||||
- macos-26 # Apple Silicon ARM64
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 1
|
||||
submodules: recursive
|
||||
|
||||
- name: Run bootstrap script
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
# Add upstream remote to the cloned repository so `qmk doctor` doesn't flag a warning
|
||||
git remote add upstream https://github.com/qmk/qmk_firmware.git
|
||||
# Run the bootstrap script
|
||||
export CONFIRM=1
|
||||
sh ./util/env-bootstrap.sh
|
||||
|
||||
- name: Test QMK CLI
|
||||
run: |
|
||||
# Add QMK CLI to PATH (bootstrap script installs it to ~/.local/bin on macOS)
|
||||
export PATH="$HOME/.local/bin:$PATH"
|
||||
qmk setup -y -H . # setup implies doctor, no need to run it separately
|
||||
qmk mass-compile -j $(sysctl -n hw.ncpu) -e DUMP_CI_METADATA=yes -f 'keyboard_name==*onekey*' -km reset || touch .failed # Compile a bunch of different platforms
|
||||
|
||||
./util/ci/generate_failure_markdown.sh > $GITHUB_STEP_SUMMARY || true
|
||||
[ ! -e .failed ] || exit 1
|
||||
|
||||
bootstrap-test-windows:
|
||||
name: Bootstrap (Windows)
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
msys-variant:
|
||||
- mingw64
|
||||
- clang64
|
||||
- ucrt64
|
||||
|
||||
runs-on: windows-latest
|
||||
defaults:
|
||||
run:
|
||||
shell: msys2 {0}
|
||||
|
||||
steps:
|
||||
- name: Install MSYS2
|
||||
uses: msys2/setup-msys2@v2
|
||||
with:
|
||||
msystem: ${{ matrix.msys-variant }}
|
||||
pacboy: >-
|
||||
git:
|
||||
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 1
|
||||
submodules: recursive
|
||||
|
||||
- name: Run bootstrap script
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
# Add upstream remote to the cloned repository so `qmk doctor` doesn't flag a warning
|
||||
git remote add upstream https://github.com/qmk/qmk_firmware.git
|
||||
# Run the bootstrap script
|
||||
export CONFIRM=1
|
||||
sh ./util/env-bootstrap.sh
|
||||
|
||||
- name: Test QMK CLI
|
||||
run: |
|
||||
# Add QMK CLI to PATH (bootstrap script installs it to /opt/uv/tools/bin on Windows MSYS2)
|
||||
export PATH="/opt/uv/tools/bin:$PATH"
|
||||
qmk setup -y -H . # setup implies doctor, no need to run it separately
|
||||
qmk mass-compile -j $(nproc) -e DUMP_CI_METADATA=yes -f 'keyboard_name==*onekey*' -km reset || touch .failed # Compile a bunch of different platforms
|
||||
|
||||
./util/ci/generate_failure_markdown.sh > $GITHUB_STEP_SUMMARY || true
|
||||
[ ! -e .failed ] || exit 1
|
||||
|
||||
4
.github/workflows/ci_build_major_branch.yml
vendored
4
.github/workflows/ci_build_major_branch.yml
vendored
@@ -45,7 +45,7 @@ jobs:
|
||||
git config --global --add safe.directory '*'
|
||||
|
||||
- name: Checkout QMK Firmware
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Determine concurrency
|
||||
id: generate_slice_length
|
||||
@@ -82,7 +82,7 @@ jobs:
|
||||
git config --global --add safe.directory '*'
|
||||
|
||||
- name: Checkout QMK Firmware
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ jobs:
|
||||
git config --global --add safe.directory '*'
|
||||
|
||||
- name: Checkout QMK Firmware
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Generate build targets
|
||||
id: generate_targets
|
||||
@@ -89,7 +89,7 @@ jobs:
|
||||
git config --global --add safe.directory '*'
|
||||
|
||||
- name: Checkout QMK Firmware
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Get target definitions
|
||||
uses: actions/download-artifact@v6
|
||||
@@ -136,7 +136,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout QMK Firmware
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Download firmwares
|
||||
uses: actions/download-artifact@v6
|
||||
|
||||
2
.github/workflows/cli.yml
vendored
2
.github/workflows/cli.yml
vendored
@@ -24,7 +24,7 @@ jobs:
|
||||
- name: Disable safe.directory check
|
||||
run : git config --global --add safe.directory '*'
|
||||
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
|
||||
2
.github/workflows/develop_update.yml
vendored
2
.github/workflows/develop_update.yml
vendored
@@ -15,7 +15,7 @@ jobs:
|
||||
if: github.repository == 'qmk/qmk_firmware'
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
token: ${{ secrets.QMK_BOT_TOKEN }}
|
||||
fetch-depth: 0
|
||||
|
||||
2
.github/workflows/docs.yml
vendored
2
.github/workflows/docs.yml
vendored
@@ -30,7 +30,7 @@ jobs:
|
||||
container: ghcr.io/qmk/qmk_cli
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 1
|
||||
|
||||
|
||||
2
.github/workflows/feature_branch_update.yml
vendored
2
.github/workflows/feature_branch_update.yml
vendored
@@ -21,7 +21,7 @@ jobs:
|
||||
- riot
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
token: ${{ secrets.QMK_BOT_TOKEN }}
|
||||
fetch-depth: 0
|
||||
|
||||
2
.github/workflows/format.yml
vendored
2
.github/workflows/format.yml
vendored
@@ -26,7 +26,7 @@ jobs:
|
||||
- name: Disable safe.directory check
|
||||
run : git config --global --add safe.directory '*'
|
||||
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
|
||||
2
.github/workflows/format_push.yml
vendored
2
.github/workflows/format_push.yml
vendored
@@ -19,7 +19,7 @@ jobs:
|
||||
- name: Disable safe.directory check
|
||||
run : git config --global --add safe.directory '*'
|
||||
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
|
||||
2
.github/workflows/lint.yml
vendored
2
.github/workflows/lint.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
||||
- name: Disable safe.directory check
|
||||
run : git config --global --add safe.directory '*'
|
||||
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
|
||||
2
.github/workflows/regen.yml
vendored
2
.github/workflows/regen.yml
vendored
@@ -19,7 +19,7 @@ jobs:
|
||||
- name: Disable safe.directory check
|
||||
run : git config --global --add safe.directory '*'
|
||||
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/checkout@v6
|
||||
|
||||
- name: Run qmk generators
|
||||
run: |
|
||||
|
||||
2
.github/workflows/regen_push.yml
vendored
2
.github/workflows/regen_push.yml
vendored
@@ -19,7 +19,7 @@ jobs:
|
||||
- name: Disable safe.directory check
|
||||
run : git config --global --add safe.directory '*'
|
||||
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/checkout@v6
|
||||
|
||||
- name: Run qmk generators
|
||||
run: |
|
||||
|
||||
2
.github/workflows/unit_test.yml
vendored
2
.github/workflows/unit_test.yml
vendored
@@ -26,7 +26,7 @@ jobs:
|
||||
container: ghcr.io/qmk/qmk_cli
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Install dependencies
|
||||
|
||||
@@ -4,7 +4,7 @@ QMK presents itself to the host as a regular HID keyboard device, and as such re
|
||||
|
||||
There are two notable exceptions: the Caterina bootloader, usually seen on Pro Micros, and the HalfKay bootloader shipped with PJRC Teensys, appear as a serial port and a generic HID device respectively, and so do not require a driver.
|
||||
|
||||
We recommend the use of the [Zadig](https://zadig.akeo.ie/) utility. If you have set up the development environment with MSYS2, the `qmk_install.sh` script will have already installed the drivers for you.
|
||||
We recommend the use of the [Zadig](https://zadig.akeo.ie/) utility. If you have set up the development environment with MSYS2, the QMK CLI installation script will have already installed the drivers for you.
|
||||
|
||||
## Installation
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ Pro Micro (Atmega32u4), make sure to include `CONFIG_USB_ACM=y`. Other devices m
|
||||
|
||||
Issues encountered when flashing keyboards on Windows are most often due to having the wrong drivers installed for the bootloader, or none at all.
|
||||
|
||||
Re-running the QMK installation script (`./util/qmk_install.sh` from the `qmk_firmware` directory in MSYS2 or WSL) or reinstalling the QMK Toolbox may fix the issue. Alternatively, you can download and run the [`qmk_driver_installer`](https://github.com/qmk/qmk_driver_installer) package manually.
|
||||
Re-running the QMK installation script (`curl -fsSL https://install.qmk.fm | sh`) or reinstalling the QMK Toolbox may fix the issue. Alternatively, you can download and run the [`qmk_driver_installer`](https://github.com/qmk/qmk_driver_installer) package manually.
|
||||
|
||||
If that doesn't work, then you may need to download and run Zadig. See [Bootloader Driver Installation with Zadig](driver_installation_zadig) for more detailed information.
|
||||
|
||||
|
||||
@@ -50,90 +50,64 @@ You will need to install [MSYS2](https://www.msys2.org). Once installed, close a
|
||||
Install the QMK CLI by running:
|
||||
|
||||
```sh
|
||||
pacman --needed --noconfirm --disable-download-timeout -S git mingw-w64-x86_64-python-qmk
|
||||
curl -fsSL https://install.qmk.fm | sh
|
||||
```
|
||||
|
||||
::::
|
||||
|
||||
==== macOS
|
||||
|
||||
QMK maintains a Homebrew tap and formula which will automatically install the CLI and all necessary dependencies.
|
||||
|
||||
#### Prerequisites
|
||||
|
||||
You will need to install Homebrew. Follow the instructions on https://brew.sh.
|
||||
|
||||
::: tip
|
||||
If you are using an Apple Silicon machine, the installation process will take significantly longer because GitHub actions do not have native runners to build binary packages for the ARM and AVR toolchains.
|
||||
:::
|
||||
|
||||
#### Installation
|
||||
|
||||
Install the QMK CLI by running:
|
||||
|
||||
```sh
|
||||
brew install qmk/qmk/qmk
|
||||
curl -fsSL https://install.qmk.fm | sh
|
||||
```
|
||||
|
||||
==== Linux/WSL
|
||||
|
||||
#### Installation
|
||||
|
||||
::: info
|
||||
Many Linux distributions are supported, but not all. Mainstream distributions will have best success -- if possible, choose either Debian or its derivatives (such as Ubuntu, or Mint), CentOS or its derivatives (such as Fedora, or Rocky Linux), and Arch or its derivatives (such as Manjaro, or CachyOS).
|
||||
:::
|
||||
|
||||
Install the QMK CLI by running:
|
||||
|
||||
```sh
|
||||
curl -fsSL https://install.qmk.fm | sh
|
||||
```
|
||||
|
||||
::: tip
|
||||
**Note for WSL users**: By default, the installation process will clone the QMK repository into your WSL home directory, but if you have cloned manually, ensure that it is located inside the WSL instance instead of the Windows filesystem (ie. not in `/mnt`), as accessing it is currently [extremely slow](https://github.com/microsoft/WSL/issues/4197).
|
||||
:::
|
||||
|
||||
#### Prerequisites
|
||||
|
||||
You will need to install Git and Python. It's very likely that you already have both, but if not, one of the following commands should install them:
|
||||
|
||||
* Debian / Ubuntu / Devuan: `sudo apt install -y git python3-pip`
|
||||
* Fedora / Red Hat / CentOS: `sudo yum -y install git python3-pip`
|
||||
* Arch / Manjaro: `sudo pacman --needed --noconfirm -S git python-pip libffi`
|
||||
* Void: `sudo xbps-install -y git python3-pip`
|
||||
* Solus: `sudo eopkg -y install git python3`
|
||||
* Sabayon: `sudo equo install dev-vcs/git dev-python/pip`
|
||||
* Gentoo: `sudo emerge dev-vcs/git dev-python/pip`
|
||||
|
||||
#### Installation
|
||||
|
||||
Install the QMK CLI by running:
|
||||
|
||||
```sh
|
||||
python3 -m pip install --user qmk
|
||||
```
|
||||
|
||||
Alternatively, install the QMK CLI as a [uv](https://docs.astral.sh/uv/) managed tool, kept isolated in a virtual environment (requires uv to be installed):
|
||||
|
||||
```sh
|
||||
uv tool install qmk
|
||||
```
|
||||
|
||||
#### Community Packages
|
||||
|
||||
These packages are maintained by community members, so may not be up to date or completely functional. If you encounter problems, please report them to their respective maintainers.
|
||||
|
||||
On Arch-based distros you can install the CLI from the official repositories (NOTE: at the time of writing this package marks some dependencies as optional that should not be):
|
||||
|
||||
```sh
|
||||
sudo pacman -S qmk
|
||||
```
|
||||
|
||||
You can also try the `qmk-git` package from AUR:
|
||||
|
||||
```sh
|
||||
yay -S qmk-git
|
||||
```
|
||||
::: warning
|
||||
Any QMK packages provided by your distribution's package manager are almost certainly out of date. It is strongly suggested the installation script above is used instead.
|
||||
:::
|
||||
|
||||
==== FreeBSD
|
||||
|
||||
#### Installation
|
||||
|
||||
::: warning
|
||||
FreeBSD support is provided on a best-effort basis by the community instead of the QMK maintainers. It is strongly suggested that you use either Windows, macOS, or a supported distribution of Linux instead.
|
||||
:::
|
||||
|
||||
Install the FreeBSD package for QMK CLI by running:
|
||||
|
||||
```sh
|
||||
pkg install -g "py*-qmk"
|
||||
```
|
||||
|
||||
NOTE: remember to follow the instructions printed at the end of installation (use `pkg info -Dg "py*-qmk"` to show them again).
|
||||
::: info NOTE
|
||||
Remember to follow the instructions printed at the end of installation (use `pkg info -Dg "py*-qmk"` to show them again).
|
||||
:::
|
||||
|
||||
:::::
|
||||
|
||||
|
||||
@@ -15,8 +15,9 @@ static bool dummy_comms_start(painter_device_t device) {
|
||||
return true;
|
||||
}
|
||||
|
||||
static void dummy_comms_stop(painter_device_t device) {
|
||||
static bool dummy_comms_stop(painter_device_t device) {
|
||||
// No-op.
|
||||
return true;
|
||||
}
|
||||
|
||||
uint32_t dummy_comms_send(painter_device_t device, const void *data, uint32_t byte_count) {
|
||||
|
||||
@@ -35,7 +35,9 @@ uint32_t qp_comms_i2c_send_data(painter_device_t device, const void *data, uint3
|
||||
return qp_comms_i2c_send_raw(device, data, byte_count);
|
||||
}
|
||||
|
||||
void qp_comms_i2c_stop(painter_device_t device) {}
|
||||
bool qp_comms_i2c_stop(painter_device_t device) {
|
||||
return true;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Command+Data I2C support
|
||||
@@ -43,9 +45,9 @@ void qp_comms_i2c_stop(painter_device_t device) {}
|
||||
static const uint8_t cmd_byte = 0x00;
|
||||
static const uint8_t data_byte = 0x40;
|
||||
|
||||
void qp_comms_i2c_cmddata_send_command(painter_device_t device, uint8_t cmd) {
|
||||
bool qp_comms_i2c_cmddata_send_command(painter_device_t device, uint8_t cmd) {
|
||||
uint8_t buf[2] = {cmd_byte, cmd};
|
||||
qp_comms_i2c_send_raw(device, &buf, 2);
|
||||
return qp_comms_i2c_send_raw(device, &buf, 2);
|
||||
}
|
||||
|
||||
uint32_t qp_comms_i2c_cmddata_send_data(painter_device_t device, const void *data, uint32_t byte_count) {
|
||||
@@ -58,7 +60,7 @@ uint32_t qp_comms_i2c_cmddata_send_data(painter_device_t device, const void *dat
|
||||
return byte_count;
|
||||
}
|
||||
|
||||
void qp_comms_i2c_bulk_command_sequence(painter_device_t device, const uint8_t *sequence, size_t sequence_len) {
|
||||
bool qp_comms_i2c_bulk_command_sequence(painter_device_t device, const uint8_t *sequence, size_t sequence_len) {
|
||||
uint8_t buf[32];
|
||||
for (size_t i = 0; i < sequence_len;) {
|
||||
uint8_t command = sequence[i];
|
||||
@@ -67,12 +69,17 @@ void qp_comms_i2c_bulk_command_sequence(painter_device_t device, const uint8_t *
|
||||
buf[0] = cmd_byte;
|
||||
buf[1] = command;
|
||||
memcpy(&buf[2], &sequence[i + 3], num_bytes);
|
||||
qp_comms_i2c_send_raw(device, buf, num_bytes + 2);
|
||||
if (!qp_comms_i2c_send_raw(device, buf, num_bytes + 2)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (delay > 0) {
|
||||
wait_ms(delay);
|
||||
}
|
||||
i += (3 + num_bytes);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
const painter_comms_with_command_vtable_t i2c_comms_cmddata_vtable = {
|
||||
|
||||
@@ -19,7 +19,7 @@ typedef struct qp_comms_i2c_config_t {
|
||||
bool qp_comms_i2c_init(painter_device_t device);
|
||||
bool qp_comms_i2c_start(painter_device_t device);
|
||||
uint32_t qp_comms_i2c_send_data(painter_device_t device, const void* data, uint32_t byte_count);
|
||||
void qp_comms_i2c_stop(painter_device_t device);
|
||||
bool qp_comms_i2c_stop(painter_device_t device);
|
||||
|
||||
extern const painter_comms_with_command_vtable_t i2c_comms_cmddata_vtable;
|
||||
|
||||
|
||||
@@ -45,11 +45,12 @@ uint32_t qp_comms_spi_send_data(painter_device_t device, const void *data, uint3
|
||||
return byte_count - bytes_remaining;
|
||||
}
|
||||
|
||||
void qp_comms_spi_stop(painter_device_t device) {
|
||||
bool qp_comms_spi_stop(painter_device_t device) {
|
||||
painter_driver_t * driver = (painter_driver_t *)device;
|
||||
qp_comms_spi_config_t *comms_config = (qp_comms_spi_config_t *)driver->comms_config;
|
||||
spi_stop();
|
||||
gpio_write_pin_high(comms_config->chip_select_pin);
|
||||
return true;
|
||||
}
|
||||
|
||||
const painter_comms_vtable_t spi_comms_vtable = {
|
||||
@@ -97,14 +98,15 @@ uint32_t qp_comms_spi_dc_reset_send_data(painter_device_t device, const void *da
|
||||
return qp_comms_spi_send_data(device, data, byte_count);
|
||||
}
|
||||
|
||||
void qp_comms_spi_dc_reset_send_command(painter_device_t device, uint8_t cmd) {
|
||||
bool qp_comms_spi_dc_reset_send_command(painter_device_t device, uint8_t cmd) {
|
||||
painter_driver_t * driver = (painter_driver_t *)device;
|
||||
qp_comms_spi_dc_reset_config_t *comms_config = (qp_comms_spi_dc_reset_config_t *)driver->comms_config;
|
||||
gpio_write_pin_low(comms_config->dc_pin);
|
||||
spi_write(cmd);
|
||||
return true;
|
||||
}
|
||||
|
||||
void qp_comms_spi_dc_reset_bulk_command_sequence(painter_device_t device, const uint8_t *sequence, size_t sequence_len) {
|
||||
bool qp_comms_spi_dc_reset_bulk_command_sequence(painter_device_t device, const uint8_t *sequence, size_t sequence_len) {
|
||||
painter_driver_t * driver = (painter_driver_t *)device;
|
||||
qp_comms_spi_dc_reset_config_t *comms_config = (qp_comms_spi_dc_reset_config_t *)driver->comms_config;
|
||||
for (size_t i = 0; i < sequence_len;) {
|
||||
@@ -126,6 +128,8 @@ void qp_comms_spi_dc_reset_bulk_command_sequence(painter_device_t device, const
|
||||
}
|
||||
i += (3 + num_bytes);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
const painter_comms_with_command_vtable_t spi_comms_with_dc_vtable = {
|
||||
|
||||
@@ -22,7 +22,7 @@ typedef struct qp_comms_spi_config_t {
|
||||
bool qp_comms_spi_init(painter_device_t device);
|
||||
bool qp_comms_spi_start(painter_device_t device);
|
||||
uint32_t qp_comms_spi_send_data(painter_device_t device, const void* data, uint32_t byte_count);
|
||||
void qp_comms_spi_stop(painter_device_t device);
|
||||
bool qp_comms_spi_stop(painter_device_t device);
|
||||
|
||||
extern const painter_comms_vtable_t spi_comms_vtable;
|
||||
|
||||
@@ -39,9 +39,9 @@ typedef struct qp_comms_spi_dc_reset_config_t {
|
||||
} qp_comms_spi_dc_reset_config_t;
|
||||
|
||||
bool qp_comms_spi_dc_reset_init(painter_device_t device);
|
||||
void qp_comms_spi_dc_reset_send_command(painter_device_t device, uint8_t cmd);
|
||||
bool qp_comms_spi_dc_reset_send_command(painter_device_t device, uint8_t cmd);
|
||||
uint32_t qp_comms_spi_dc_reset_send_data(painter_device_t device, const void* data, uint32_t byte_count);
|
||||
void qp_comms_spi_dc_reset_bulk_command_sequence(painter_device_t device, const uint8_t* sequence, size_t sequence_len);
|
||||
bool qp_comms_spi_dc_reset_bulk_command_sequence(painter_device_t device, const uint8_t* sequence, size_t sequence_len);
|
||||
|
||||
extern const painter_comms_with_command_vtable_t spi_comms_with_dc_vtable;
|
||||
|
||||
|
||||
@@ -32,7 +32,9 @@ __attribute__((weak)) bool qp_gc9107_init(painter_device_t device, painter_rotat
|
||||
};
|
||||
|
||||
// clang-format on
|
||||
qp_comms_bulk_command_sequence(device, gc9107_init_sequence, sizeof(gc9107_init_sequence));
|
||||
if (!qp_comms_bulk_command_sequence(device, gc9107_init_sequence, sizeof(gc9107_init_sequence))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Configure the rotation (i.e. the ordering and direction of memory writes in GRAM)
|
||||
const uint8_t madctl[] = {
|
||||
@@ -41,9 +43,7 @@ __attribute__((weak)) bool qp_gc9107_init(painter_device_t device, painter_rotat
|
||||
[QP_ROTATION_180] = GC9XXX_MADCTL_BGR | GC9XXX_MADCTL_MX | GC9XXX_MADCTL_MY,
|
||||
[QP_ROTATION_270] = GC9XXX_MADCTL_BGR | GC9XXX_MADCTL_MV | GC9XXX_MADCTL_MY,
|
||||
};
|
||||
qp_comms_command_databyte(device, GC9XXX_SET_MEM_ACS_CTL, madctl[rotation]);
|
||||
|
||||
return true;
|
||||
return qp_comms_command_databyte(device, GC9XXX_SET_MEM_ACS_CTL, madctl[rotation]);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -45,7 +45,9 @@ __attribute__((weak)) bool qp_gc9a01_init(painter_device_t device, painter_rotat
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
qp_comms_bulk_command_sequence(device, gc9a01_init_sequence, sizeof(gc9a01_init_sequence));
|
||||
if (!qp_comms_bulk_command_sequence(device, gc9a01_init_sequence, sizeof(gc9a01_init_sequence))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Configure the rotation (i.e. the ordering and direction of memory writes in GRAM)
|
||||
const uint8_t madctl[] = {
|
||||
@@ -54,9 +56,7 @@ __attribute__((weak)) bool qp_gc9a01_init(painter_device_t device, painter_rotat
|
||||
[QP_ROTATION_180] = GC9XXX_MADCTL_BGR | GC9XXX_MADCTL_MX | GC9XXX_MADCTL_MY,
|
||||
[QP_ROTATION_270] = GC9XXX_MADCTL_BGR | GC9XXX_MADCTL_MV | GC9XXX_MADCTL_MY,
|
||||
};
|
||||
qp_comms_command_databyte(device, GC9XXX_SET_MEM_ACS_CTL, madctl[rotation]);
|
||||
|
||||
return true;
|
||||
return qp_comms_command_databyte(device, GC9XXX_SET_MEM_ACS_CTL, madctl[rotation]);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -41,7 +41,9 @@ __attribute__((weak)) bool qp_ili9163_init(painter_device_t device, painter_rota
|
||||
ILI9XXX_CMD_DISPLAY_ON, 20, 0
|
||||
};
|
||||
// clang-format on
|
||||
qp_comms_bulk_command_sequence(device, ili9163_init_sequence, sizeof(ili9163_init_sequence));
|
||||
if (!qp_comms_bulk_command_sequence(device, ili9163_init_sequence, sizeof(ili9163_init_sequence))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Configure the rotation (i.e. the ordering and direction of memory writes in GRAM)
|
||||
const uint8_t madctl[] = {
|
||||
@@ -50,9 +52,7 @@ __attribute__((weak)) bool qp_ili9163_init(painter_device_t device, painter_rota
|
||||
[QP_ROTATION_180] = ILI9XXX_MADCTL_BGR | ILI9XXX_MADCTL_MX | ILI9XXX_MADCTL_MY,
|
||||
[QP_ROTATION_270] = ILI9XXX_MADCTL_BGR | ILI9XXX_MADCTL_MV | ILI9XXX_MADCTL_MY,
|
||||
};
|
||||
qp_comms_command_databyte(device, ILI9XXX_SET_MEM_ACS_CTL, madctl[rotation]);
|
||||
|
||||
return true;
|
||||
return qp_comms_command_databyte(device, ILI9XXX_SET_MEM_ACS_CTL, madctl[rotation]);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -48,7 +48,9 @@ __attribute__((weak)) bool qp_ili9341_init(painter_device_t device, painter_rota
|
||||
ILI9XXX_CMD_DISPLAY_ON, 20, 0
|
||||
};
|
||||
// clang-format on
|
||||
qp_comms_bulk_command_sequence(device, ili9341_init_sequence, sizeof(ili9341_init_sequence));
|
||||
if (!qp_comms_bulk_command_sequence(device, ili9341_init_sequence, sizeof(ili9341_init_sequence))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Configure the rotation (i.e. the ordering and direction of memory writes in GRAM)
|
||||
const uint8_t madctl[] = {
|
||||
@@ -57,9 +59,7 @@ __attribute__((weak)) bool qp_ili9341_init(painter_device_t device, painter_rota
|
||||
[QP_ROTATION_180] = ILI9XXX_MADCTL_BGR | ILI9XXX_MADCTL_MX | ILI9XXX_MADCTL_MY,
|
||||
[QP_ROTATION_270] = ILI9XXX_MADCTL_BGR | ILI9XXX_MADCTL_MV | ILI9XXX_MADCTL_MY,
|
||||
};
|
||||
qp_comms_command_databyte(device, ILI9XXX_SET_MEM_ACS_CTL, madctl[rotation]);
|
||||
|
||||
return true;
|
||||
return qp_comms_command_databyte(device, ILI9XXX_SET_MEM_ACS_CTL, madctl[rotation]);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -37,7 +37,9 @@ bool qp_ili9486_init(painter_device_t device, painter_rotation_t rotation) {
|
||||
ILI9XXX_SET_INVERSION_CTL, 0, 1, 0x02,
|
||||
};
|
||||
// clang-format on
|
||||
qp_comms_bulk_command_sequence(device, ili9486_init_sequence, sizeof(ili9486_init_sequence));
|
||||
if (!qp_comms_bulk_command_sequence(device, ili9486_init_sequence, sizeof(ili9486_init_sequence))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Configure the rotation (i.e. the ordering and direction of memory writes in GRAM)
|
||||
const uint8_t madctl[] = {
|
||||
@@ -62,22 +64,22 @@ bool qp_ili9486_init(painter_device_t device, painter_rotation_t rotation) {
|
||||
ILI9XXX_CMD_DISPLAY_ON, 5, 0,
|
||||
};
|
||||
// clang-format on
|
||||
qp_comms_bulk_command_sequence(device, rotation_sequence, sizeof(rotation_sequence));
|
||||
|
||||
return true;
|
||||
return qp_comms_bulk_command_sequence(device, rotation_sequence, sizeof(rotation_sequence));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Driver vtable
|
||||
|
||||
// waveshare variant needs some tweaks due to shift registers
|
||||
static void qp_comms_spi_dc_reset_send_command_odd_cs_pulse(painter_device_t device, uint8_t cmd) {
|
||||
static bool qp_comms_spi_dc_reset_send_command_odd_cs_pulse(painter_device_t device, uint8_t cmd) {
|
||||
painter_driver_t * driver = (painter_driver_t *)device;
|
||||
qp_comms_spi_dc_reset_config_t *comms_config = (qp_comms_spi_dc_reset_config_t *)driver->comms_config;
|
||||
|
||||
gpio_write_pin_low(comms_config->spi_config.chip_select_pin);
|
||||
qp_comms_spi_dc_reset_send_command(device, cmd);
|
||||
gpio_write_pin_high(comms_config->spi_config.chip_select_pin);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static uint32_t qp_comms_spi_send_data_odd_cs_pulse(painter_device_t device, const void *data, uint32_t byte_count) {
|
||||
@@ -124,7 +126,7 @@ static uint32_t qp_ili9486_send_data_toggling(painter_device_t device, const uin
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void qp_comms_spi_send_command_sequence_odd_cs_pulse(painter_device_t device, const uint8_t *sequence, size_t sequence_len) {
|
||||
static bool qp_comms_spi_send_command_sequence_odd_cs_pulse(painter_device_t device, const uint8_t *sequence, size_t sequence_len) {
|
||||
for (size_t i = 0; i < sequence_len;) {
|
||||
uint8_t command = sequence[i];
|
||||
uint8_t delay = sequence[i + 1];
|
||||
@@ -140,6 +142,8 @@ static void qp_comms_spi_send_command_sequence_odd_cs_pulse(painter_device_t dev
|
||||
}
|
||||
i += (3 + num_bytes);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool qp_ili9486_viewport(painter_device_t device, uint16_t left, uint16_t top, uint16_t right, uint16_t bottom) {
|
||||
|
||||
@@ -41,7 +41,9 @@ __attribute__((weak)) bool qp_ili9488_init(painter_device_t device, painter_rota
|
||||
ILI9XXX_CMD_DISPLAY_ON, 20, 0
|
||||
};
|
||||
// clang-format on
|
||||
qp_comms_bulk_command_sequence(device, ili9488_init_sequence, sizeof(ili9488_init_sequence));
|
||||
if (!qp_comms_bulk_command_sequence(device, ili9488_init_sequence, sizeof(ili9488_init_sequence))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Configure the rotation (i.e. the ordering and direction of memory writes in GRAM)
|
||||
const uint8_t madctl[] = {
|
||||
@@ -50,9 +52,7 @@ __attribute__((weak)) bool qp_ili9488_init(painter_device_t device, painter_rota
|
||||
[QP_ROTATION_180] = ILI9XXX_MADCTL_BGR | ILI9XXX_MADCTL_MX,
|
||||
[QP_ROTATION_270] = ILI9XXX_MADCTL_BGR | ILI9XXX_MADCTL_MV,
|
||||
};
|
||||
qp_comms_command_databyte(device, ILI9XXX_SET_MEM_ACS_CTL, madctl[rotation]);
|
||||
|
||||
return true;
|
||||
return qp_comms_command_databyte(device, ILI9XXX_SET_MEM_ACS_CTL, madctl[rotation]);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
#include "qp_surface.h"
|
||||
#include "qp_surface_internal.h"
|
||||
|
||||
typedef void (*ld7032_driver_comms_send_command_and_data_func)(painter_device_t device, uint8_t cmd, uint8_t data);
|
||||
typedef bool (*ld7032_driver_comms_send_command_and_data_func)(painter_device_t device, uint8_t cmd, uint8_t data);
|
||||
typedef uint32_t (*ld7032_driver_comms_send_command_and_databuf_func)(painter_device_t device, uint8_t cmd, const void *data, uint32_t byte_count);
|
||||
|
||||
typedef struct ld7032_comms_with_command_vtable_t {
|
||||
@@ -25,12 +25,13 @@ typedef struct ld7032_comms_with_command_vtable_t {
|
||||
// LD7032 Internal API
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void ld7032_comms_i2c_send_command_and_data(painter_device_t device, uint8_t cmd, uint8_t data) {
|
||||
#ifdef QUANTUM_PAINTER_LD7032_I2C_ENABLE
|
||||
bool ld7032_comms_i2c_send_command_and_data(painter_device_t device, uint8_t cmd, uint8_t data) {
|
||||
uint8_t buf[2] = {cmd, data};
|
||||
qp_comms_i2c_send_data(device, buf, 2);
|
||||
return qp_comms_i2c_send_data(device, buf, 2);
|
||||
}
|
||||
|
||||
void ld7032_comms_i2c_bulk_command_sequence(painter_device_t device, const uint8_t *sequence, size_t sequence_len) {
|
||||
bool ld7032_comms_i2c_bulk_command_sequence(painter_device_t device, const uint8_t *sequence, size_t sequence_len) {
|
||||
uint8_t buf[32];
|
||||
for (size_t i = 0; i < sequence_len;) {
|
||||
uint8_t command = sequence[i];
|
||||
@@ -38,12 +39,16 @@ void ld7032_comms_i2c_bulk_command_sequence(painter_device_t device, const uint8
|
||||
uint8_t num_bytes = sequence[i + 2];
|
||||
buf[0] = command;
|
||||
memcpy(&buf[1], &sequence[i + 3], num_bytes);
|
||||
qp_comms_i2c_send_data(device, buf, num_bytes + 1);
|
||||
if (!qp_comms_i2c_send_data(device, buf, num_bytes + 1)) {
|
||||
return false;
|
||||
}
|
||||
if (delay > 0) {
|
||||
wait_ms(delay);
|
||||
}
|
||||
i += (3 + num_bytes);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
uint32_t ld7032_comms_i2c_send_command_and_databuf(painter_device_t device, uint8_t cmd, const void *data, uint32_t byte_count) {
|
||||
@@ -53,6 +58,7 @@ uint32_t ld7032_comms_i2c_send_command_and_databuf(painter_device_t device, uint
|
||||
memcpy(&buf[1], data, byte_count);
|
||||
return qp_comms_send(device, buf, byte_count + 1);
|
||||
}
|
||||
#endif // QUANTUM_PAINTER_LD7032_I2C_ENABLE
|
||||
|
||||
// Power control
|
||||
bool qp_ld7032_power(painter_device_t device, bool power_on) {
|
||||
@@ -201,7 +207,9 @@ __attribute__((weak)) bool qp_ld7032_init(painter_device_t device, painter_rotat
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
qp_comms_bulk_command_sequence(device, ld7032_init_sequence, sizeof(ld7032_init_sequence));
|
||||
if (!qp_comms_bulk_command_sequence(device, ld7032_init_sequence, sizeof(ld7032_init_sequence))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
uint8_t display_y_start = 40 - driver->oled.base.panel_height;
|
||||
uint8_t display_x_start = (128 - driver->oled.base.panel_width) / 2;
|
||||
@@ -223,7 +231,9 @@ __attribute__((weak)) bool qp_ld7032_init(painter_device_t device, painter_rotat
|
||||
ld7032_memory_setup[13] = ld7032_memory_setup[4] + 1;
|
||||
ld7032_memory_setup[17] = driver->oled.base.panel_height;
|
||||
|
||||
qp_comms_bulk_command_sequence(device, ld7032_memory_setup, sizeof(ld7032_memory_setup));
|
||||
if (!qp_comms_bulk_command_sequence(device, ld7032_memory_setup, sizeof(ld7032_memory_setup))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
uint8_t write_direction = 0;
|
||||
switch (rotation) {
|
||||
@@ -245,7 +255,9 @@ __attribute__((weak)) bool qp_ld7032_init(painter_device_t device, painter_rotat
|
||||
painter_driver_t * pdriver = (painter_driver_t *)device;
|
||||
ld7032_comms_with_command_vtable_t *comms_vtable = (ld7032_comms_with_command_vtable_t *)pdriver->comms_vtable;
|
||||
|
||||
comms_vtable->send_command_data(device, LD7032_WRITE_DIRECTION, write_direction);
|
||||
if (!comms_vtable->send_command_data(device, LD7032_WRITE_DIRECTION, write_direction)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
qp_ld7032_power(device, true);
|
||||
|
||||
|
||||
@@ -71,8 +71,7 @@ __attribute__((weak)) bool qp_sh1106_init(painter_device_t device, painter_rotat
|
||||
sh1106_init_sequence[20] = 0x02;
|
||||
}
|
||||
|
||||
qp_comms_bulk_command_sequence(device, sh1106_init_sequence, sizeof(sh1106_init_sequence));
|
||||
return true;
|
||||
return qp_comms_bulk_command_sequence(device, sh1106_init_sequence, sizeof(sh1106_init_sequence));
|
||||
}
|
||||
|
||||
// Screen flush
|
||||
|
||||
@@ -73,8 +73,7 @@ __attribute__((weak)) bool qp_sh1107_init(painter_device_t device, painter_rotat
|
||||
sh1107_init_sequence[20] = 0x02;
|
||||
}
|
||||
|
||||
qp_comms_bulk_command_sequence(device, sh1107_init_sequence, sizeof(sh1107_init_sequence));
|
||||
return true;
|
||||
return qp_comms_bulk_command_sequence(device, sh1107_init_sequence, sizeof(sh1107_init_sequence));
|
||||
}
|
||||
|
||||
// Screen flush
|
||||
|
||||
@@ -44,7 +44,9 @@ __attribute__((weak)) bool qp_ssd1351_init(painter_device_t device, painter_rota
|
||||
SSD1351_DISPLAYON, 5, 0,
|
||||
};
|
||||
// clang-format on
|
||||
qp_comms_bulk_command_sequence(device, ssd1351_init_sequence, sizeof(ssd1351_init_sequence));
|
||||
if (!qp_comms_bulk_command_sequence(device, ssd1351_init_sequence, sizeof(ssd1351_init_sequence))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Configure the rotation (i.e. the ordering and direction of memory writes in GRAM)
|
||||
const uint8_t madctl[] = {
|
||||
@@ -53,10 +55,10 @@ __attribute__((weak)) bool qp_ssd1351_init(painter_device_t device, painter_rota
|
||||
[QP_ROTATION_180] = SSD1351_MADCTL_BGR | SSD1351_MADCTL_MX,
|
||||
[QP_ROTATION_270] = SSD1351_MADCTL_BGR | SSD1351_MADCTL_MV,
|
||||
};
|
||||
qp_comms_command_databyte(device, SSD1351_SETREMAP, madctl[rotation]);
|
||||
qp_comms_command_databyte(device, SSD1351_STARTLINE, (rotation == QP_ROTATION_0 || rotation == QP_ROTATION_90) ? driver->base.panel_height : 0);
|
||||
|
||||
return true;
|
||||
if (!qp_comms_command_databyte(device, SSD1351_SETREMAP, madctl[rotation])) {
|
||||
return false;
|
||||
}
|
||||
return qp_comms_command_databyte(device, SSD1351_STARTLINE, (rotation == QP_ROTATION_0 || rotation == QP_ROTATION_90) ? driver->base.panel_height : 0);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -63,7 +63,9 @@ __attribute__((weak)) bool qp_st7735_init(painter_device_t device, painter_rotat
|
||||
ST77XX_CMD_DISPLAY_ON, 20, 0
|
||||
};
|
||||
// clang-format on
|
||||
qp_comms_bulk_command_sequence(device, st7735_init_sequence, sizeof(st7735_init_sequence));
|
||||
if (!qp_comms_bulk_command_sequence(device, st7735_init_sequence, sizeof(st7735_init_sequence))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Configure the rotation (i.e. the ordering and direction of memory writes in GRAM)
|
||||
const uint8_t madctl[] = {
|
||||
@@ -72,7 +74,9 @@ __attribute__((weak)) bool qp_st7735_init(painter_device_t device, painter_rotat
|
||||
[QP_ROTATION_180] = ST77XX_MADCTL_BGR | ST77XX_MADCTL_MX | ST77XX_MADCTL_MY,
|
||||
[QP_ROTATION_270] = ST77XX_MADCTL_BGR | ST77XX_MADCTL_MV | ST77XX_MADCTL_MY,
|
||||
};
|
||||
qp_comms_command_databyte(device, ST77XX_SET_MADCTL, madctl[rotation]);
|
||||
if (!qp_comms_command_databyte(device, ST77XX_SET_MADCTL, madctl[rotation])) {
|
||||
return false;
|
||||
}
|
||||
|
||||
#ifndef ST7735_NO_AUTOMATIC_VIEWPORT_OFFSETS
|
||||
st7735_automatic_viewport_offsets(device, rotation);
|
||||
|
||||
@@ -60,7 +60,9 @@ __attribute__((weak)) bool qp_st7789_init(painter_device_t device, painter_rotat
|
||||
ST77XX_CMD_DISPLAY_ON, 20, 0
|
||||
};
|
||||
// clang-format on
|
||||
qp_comms_bulk_command_sequence(device, st7789_init_sequence, sizeof(st7789_init_sequence));
|
||||
if (!qp_comms_bulk_command_sequence(device, st7789_init_sequence, sizeof(st7789_init_sequence))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Configure the rotation (i.e. the ordering and direction of memory writes in GRAM)
|
||||
const uint8_t madctl[] = {
|
||||
@@ -69,7 +71,9 @@ __attribute__((weak)) bool qp_st7789_init(painter_device_t device, painter_rotat
|
||||
[QP_ROTATION_180] = ST77XX_MADCTL_RGB | ST77XX_MADCTL_MX | ST77XX_MADCTL_MY,
|
||||
[QP_ROTATION_270] = ST77XX_MADCTL_RGB | ST77XX_MADCTL_MV | ST77XX_MADCTL_MY,
|
||||
};
|
||||
qp_comms_command_databyte(device, ST77XX_SET_MADCTL, madctl[rotation]);
|
||||
if (!qp_comms_command_databyte(device, ST77XX_SET_MADCTL, madctl[rotation])) {
|
||||
return false;
|
||||
}
|
||||
|
||||
#ifndef ST7789_NO_AUTOMATIC_VIEWPORT_OFFSETS
|
||||
st7789_automatic_viewport_offsets(device, rotation);
|
||||
|
||||
174
keyboards/cbkbd/acai/keyboard.json
Normal file
174
keyboards/cbkbd/acai/keyboard.json
Normal file
@@ -0,0 +1,174 @@
|
||||
{
|
||||
"manufacturer": "CoffeeBreakKeyboards",
|
||||
"keyboard_name": "Acai",
|
||||
"maintainer": "CoffeeBreakKeyboards",
|
||||
"bootloader": "rp2040",
|
||||
"diode_direction": "COL2ROW",
|
||||
"dynamic_keymap": {
|
||||
"layer_count": 6
|
||||
},
|
||||
"features": {
|
||||
"bootmagic": true,
|
||||
"extrakey": true,
|
||||
"mousekey": true,
|
||||
"nkro": true,
|
||||
"rgb_matrix": true
|
||||
},
|
||||
"matrix_pins": {
|
||||
"cols": ["GP25", "GP24", "GP23", "GP20", "GP18", "GP7", "GP6", "GP5", "GP4", "GP3"],
|
||||
"rows": ["GP27", "GP28", "GP19", "GP26"]
|
||||
},
|
||||
"processor": "RP2040",
|
||||
"rgb_matrix": {
|
||||
"animations": {
|
||||
"alphas_mods": true,
|
||||
"band_pinwheel_sat": true,
|
||||
"band_pinwheel_val": true,
|
||||
"band_sat": true,
|
||||
"band_spiral_sat": true,
|
||||
"band_spiral_val": true,
|
||||
"band_val": true,
|
||||
"breathing": true,
|
||||
"cycle_all": true,
|
||||
"cycle_left_right": true,
|
||||
"cycle_out_in": true,
|
||||
"cycle_out_in_dual": true,
|
||||
"cycle_pinwheel": true,
|
||||
"cycle_spiral": true,
|
||||
"cycle_up_down": true,
|
||||
"digital_rain": true,
|
||||
"dual_beacon": true,
|
||||
"flower_blooming": 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,
|
||||
"riverflow": true,
|
||||
"solid_multisplash": true,
|
||||
"solid_reactive": true,
|
||||
"solid_reactive_cross": true,
|
||||
"solid_reactive_multicross": true,
|
||||
"solid_reactive_multinexus": true,
|
||||
"solid_reactive_multiwide": true,
|
||||
"solid_reactive_nexus": true,
|
||||
"solid_reactive_simple": true,
|
||||
"solid_reactive_wide": true,
|
||||
"solid_splash": true,
|
||||
"splash": true,
|
||||
"starlight": true,
|
||||
"starlight_dual_hue": true,
|
||||
"starlight_dual_sat": true,
|
||||
"typing_heatmap": true
|
||||
},
|
||||
"driver": "ws2812",
|
||||
"layout": [
|
||||
{"matrix": [0, 4], "x": 100, "y": 0, "flags": 4},
|
||||
{"matrix": [0, 3], "x": 75, "y": 0, "flags": 4},
|
||||
{"matrix": [0, 2], "x": 50, "y": 0, "flags": 4},
|
||||
{"matrix": [0, 1], "x": 25, "y": 0, "flags": 4},
|
||||
{"matrix": [0, 0], "x": 0, "y": 0, "flags": 4},
|
||||
{"matrix": [1, 0], "x": 0, "y": 21, "flags": 4},
|
||||
{"matrix": [1, 1], "x": 25, "y": 21, "flags": 4},
|
||||
{"matrix": [1, 2], "x": 50, "y": 21, "flags": 4},
|
||||
{"matrix": [1, 3], "x": 75, "y": 21, "flags": 4},
|
||||
{"matrix": [1, 4], "x": 100, "y": 21, "flags": 4},
|
||||
{"matrix": [2, 4], "x": 100, "y": 43, "flags": 4},
|
||||
{"matrix": [2, 3], "x": 75, "y": 43, "flags": 4},
|
||||
{"matrix": [2, 2], "x": 50, "y": 43, "flags": 4},
|
||||
{"matrix": [2, 1], "x": 25, "y": 43, "flags": 4},
|
||||
{"matrix": [2, 0], "x": 0, "y": 43, "flags": 4},
|
||||
{"matrix": [3, 0], "x": 0, "y": 64, "flags": 4},
|
||||
{"matrix": [3, 1], "x": 25, "y": 64, "flags": 4},
|
||||
{"matrix": [3, 2], "x": 50, "y": 64, "flags": 4},
|
||||
{"matrix": [3, 3], "x": 75, "y": 64, "flags": 4},
|
||||
{"matrix": [3, 4], "x": 100, "y": 64, "flags": 4},
|
||||
{"matrix": [3, 5], "x": 125, "y": 64, "flags": 4},
|
||||
{"matrix": [3, 6], "x": 150, "y": 64, "flags": 4},
|
||||
{"matrix": [3, 7], "x": 175, "y": 64, "flags": 4},
|
||||
{"matrix": [3, 8], "x": 200, "y": 64, "flags": 4},
|
||||
{"matrix": [3, 9], "x": 224, "y": 64, "flags": 4},
|
||||
{"matrix": [2, 9], "x": 224, "y": 43, "flags": 4},
|
||||
{"matrix": [2, 8], "x": 200, "y": 43, "flags": 4},
|
||||
{"matrix": [2, 7], "x": 175, "y": 43, "flags": 4},
|
||||
{"matrix": [2, 6], "x": 150, "y": 43, "flags": 4},
|
||||
{"matrix": [2, 5], "x": 125, "y": 43, "flags": 4},
|
||||
{"matrix": [1, 5], "x": 125, "y": 21, "flags": 4},
|
||||
{"matrix": [1, 6], "x": 150, "y": 21, "flags": 4},
|
||||
{"matrix": [1, 7], "x": 175, "y": 21, "flags": 4},
|
||||
{"matrix": [1, 8], "x": 200, "y": 21, "flags": 4},
|
||||
{"matrix": [1, 9], "x": 224, "y": 21, "flags": 4},
|
||||
{"matrix": [0, 9], "x": 224, "y": 0, "flags": 4},
|
||||
{"matrix": [0, 8], "x": 200, "y": 0, "flags": 4},
|
||||
{"matrix": [0, 7], "x": 175, "y": 0, "flags": 4},
|
||||
{"matrix": [0, 6], "x": 150, "y": 0, "flags": 4},
|
||||
{"matrix": [0, 5], "x": 125, "y": 0, "flags": 4}
|
||||
],
|
||||
"max_brightness": 125,
|
||||
"sleep": true
|
||||
},
|
||||
"usb": {
|
||||
"device_version": "0.0.1",
|
||||
"pid": "0x1075",
|
||||
"vid": "0x4342"
|
||||
},
|
||||
"ws2812": {
|
||||
"driver": "vendor",
|
||||
"pin": "GP29"
|
||||
},
|
||||
"layouts": {
|
||||
"LAYOUT": {
|
||||
"layout": [
|
||||
{"matrix": [0, 0], "x": 0, "y": 0},
|
||||
{"matrix": [0, 1], "x": 1, "y": 0},
|
||||
{"matrix": [0, 2], "x": 2, "y": 0},
|
||||
{"matrix": [0, 3], "x": 3, "y": 0},
|
||||
{"matrix": [0, 4], "x": 4, "y": 0},
|
||||
{"matrix": [0, 5], "x": 5, "y": 0},
|
||||
{"matrix": [0, 6], "x": 6, "y": 0},
|
||||
{"matrix": [0, 7], "x": 7, "y": 0},
|
||||
{"matrix": [0, 8], "x": 8, "y": 0},
|
||||
{"matrix": [0, 9], "x": 9, "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": [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": [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}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
29
keyboards/cbkbd/acai/keymaps/default/keymap.c
Normal file
29
keyboards/cbkbd/acai/keymaps/default/keymap.c
Normal file
@@ -0,0 +1,29 @@
|
||||
// Copyright 2025 QMK
|
||||
// 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_ENTER,
|
||||
LSFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, RSFT_T(KC_SLSH),
|
||||
KC_LCTL, KC_LGUI, KC_LALT, LT(1,KC_BSPC), KC_DEL, KC_ENT, LT(2,KC_SPACE), KC_RALT, KC_RGUI, KC_RCTL
|
||||
),
|
||||
|
||||
[1] = LAYOUT(
|
||||
KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, 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
|
||||
),
|
||||
|
||||
[2] = LAYOUT(
|
||||
RM_TOGG, RM_NEXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
|
||||
),
|
||||
|
||||
};
|
||||
26
keyboards/cbkbd/acai/readme.md
Normal file
26
keyboards/cbkbd/acai/readme.md
Normal file
@@ -0,0 +1,26 @@
|
||||
# Acai
|
||||
|
||||

|
||||
|
||||
A 10x4 ortholinear keyboard made and sold by Coffee Break Keyboards. PCB designed by Snipeye. Case designed by Rain and Obabo. [More info on cbkbd.com](https://www.cbkbd.com/product/acai)
|
||||
|
||||
* Hardware Supported: Acai PCB
|
||||
* Hardware Availability: [cbkbd.com](https://www.cbkbd.com/product/acai-pcb)
|
||||
|
||||
Make example for this keyboard (after setting up your build environment):
|
||||
|
||||
make cbkbd/acai:default
|
||||
|
||||
Flashing example for this keyboard:
|
||||
|
||||
make cbkbd/acai: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
|
||||
193
keyboards/cbkbd/coffeevan/keyboard.json
Normal file
193
keyboards/cbkbd/coffeevan/keyboard.json
Normal file
@@ -0,0 +1,193 @@
|
||||
{
|
||||
"manufacturer": "CoffeeBreakKeyboards",
|
||||
"keyboard_name": "Coffeevan",
|
||||
"maintainer": "CoffeeBreakKeyboards",
|
||||
"bootloader": "rp2040",
|
||||
"diode_direction": "COL2ROW",
|
||||
"dynamic_keymap": {
|
||||
"layer_count": 6
|
||||
},
|
||||
"features": {
|
||||
"bootmagic": true,
|
||||
"extrakey": true,
|
||||
"mousekey": true,
|
||||
"nkro": true,
|
||||
"rgblight": true
|
||||
},
|
||||
"matrix_pins": {
|
||||
"cols": ["GP13", "GP12", "GP11", "GP10", "GP24", "GP9", "GP8", "GP28", "GP4", "GP3", "GP2", "GP1"],
|
||||
"rows": ["GP27", "GP26", "GP25", "GP14"]
|
||||
},
|
||||
"processor": "RP2040",
|
||||
"rgblight": {
|
||||
"animations": {
|
||||
"alternating": true,
|
||||
"breathing": true,
|
||||
"christmas": true,
|
||||
"knight": true,
|
||||
"rainbow_mood": true,
|
||||
"rainbow_swirl": true,
|
||||
"snake": true,
|
||||
"static_gradient": true,
|
||||
"twinkle": true
|
||||
},
|
||||
"led_count": 20
|
||||
},
|
||||
"usb": {
|
||||
"device_version": "1.0.1",
|
||||
"pid": "0x4356",
|
||||
"vid": "0x4342"
|
||||
},
|
||||
"ws2812": {
|
||||
"driver": "vendor",
|
||||
"pin": "GP16"
|
||||
},
|
||||
"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, "w": 1.75},
|
||||
{"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},
|
||||
{"matrix": [1, 11], "x": 11.25, "y": 1, "w": 1.5},
|
||||
{"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},
|
||||
{"matrix": [2, 11], "x": 11.75, "y": 2},
|
||||
{"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, 3], "x": 3.5, "y": 3, "w": 2.75},
|
||||
{"matrix": [3, 6], "x": 3.5, "y": 4, "w": 6.25},
|
||||
{"matrix": [3, 5], "x": 6.25, "y": 3, "w": 2.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},
|
||||
{"matrix": [3, 11], "x": 11.75, "y": 3}
|
||||
]
|
||||
},
|
||||
"LAYOUT_single_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": [0, 10], "x": 10, "y": 0},
|
||||
{"matrix": [0, 11], "x": 11, "y": 0, "w": 1.75},
|
||||
{"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},
|
||||
{"matrix": [1, 11], "x": 11.25, "y": 1, "w": 1.5},
|
||||
{"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},
|
||||
{"matrix": [2, 11], "x": 11.75, "y": 2},
|
||||
{"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, 6], "x": 3.5, "y": 3, "w": 6.25},
|
||||
{"matrix": [3, 9], "x": 9.75, "y": 3},
|
||||
{"matrix": [3, 10], "x": 10.75, "y": 3},
|
||||
{"matrix": [3, 11], "x": 11.75, "y": 3}
|
||||
]
|
||||
},
|
||||
"LAYOUT_split_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": [0, 10], "x": 10, "y": 0},
|
||||
{"matrix": [0, 11], "x": 11, "y": 0, "w": 1.75},
|
||||
{"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},
|
||||
{"matrix": [1, 11], "x": 11.25, "y": 1, "w": 1.5},
|
||||
{"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},
|
||||
{"matrix": [2, 11], "x": 11.75, "y": 2},
|
||||
{"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, 3], "x": 3.5, "y": 3, "w": 2.75},
|
||||
{"matrix": [3, 5], "x": 6.25, "y": 3, "w": 2.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},
|
||||
{"matrix": [3, 11], "x": 11.75, "y": 3}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
20
keyboards/cbkbd/coffeevan/keymaps/default/keymap.c
Normal file
20
keyboards/cbkbd/coffeevan/keymaps/default/keymap.c
Normal file
@@ -0,0 +1,20 @@
|
||||
// Copyright 2023 QMK
|
||||
// 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_SCLN, 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,
|
||||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, MO(1), KC_RALT, KC_RGUI, KC_RCTL
|
||||
),
|
||||
|
||||
[1] = LAYOUT_all(
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, UG_TOGG, UG_NEXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
|
||||
),
|
||||
};
|
||||
18
keyboards/cbkbd/coffeevan/matrix_diagram.md
Normal file
18
keyboards/cbkbd/coffeevan/matrix_diagram.md
Normal file
@@ -0,0 +1,18 @@
|
||||
# Matrix Diagram for Coffeevan
|
||||
```
|
||||
Minisub style split-space
|
||||
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬──────┐
|
||||
│00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0A │0B │
|
||||
├───┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬─────┤
|
||||
│10 │11 │12 │13 │14 │15 │16 │17 │18 │19 │1A │1B │
|
||||
├────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
|
||||
│20 │21 │22 │23 │24 │25 │26 │27 │28 │29 │2A │2B │
|
||||
├────┬─┴─┬─┴──┬┴───┴───┴─┬─┴───┴──┬┴───┼───┼───┼───┤
|
||||
│30 │31 │32 │33 │35 │38 │39 │3A │3B │
|
||||
└────┴───┴────┴──────────┴────────┴────┴───┴───┴───┘
|
||||
|
||||
JetVan style 6.25u
|
||||
┌────┬───┬────┬────────────────────────┬───┬───┬───┐
|
||||
│30 │31 │32 │36 │39 │3A │3B │
|
||||
└────┴───┴────┴────────────────────────┴───┴───┴───┘
|
||||
```
|
||||
27
keyboards/cbkbd/coffeevan/readme.md
Normal file
27
keyboards/cbkbd/coffeevan/readme.md
Normal file
@@ -0,0 +1,27 @@
|
||||
# Coffeevan
|
||||
|
||||

|
||||
|
||||
Coffeevan is a drop-in replacement PCB for MiniVan cases. Coffeevan supports the Minisub split-space and JetVan 6.25u spacebar layout.
|
||||
|
||||
* Keyboard Maintainer: [Coffee Break Keyboards](https://github.com/CoffeeBreakKeyboards)
|
||||
* Hardware Supported: Coffeevan
|
||||
* Hardware Availability: [Coffee Break Keyboards](https://www.cbkbd.com/product/minivan-kits)
|
||||
|
||||
Make example for this keyboard (after setting up your build environment):
|
||||
|
||||
make cbkbd/coffeevan:default
|
||||
|
||||
Flashing example for this keyboard:
|
||||
|
||||
make cbkbd/coffeevan: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
|
||||
@@ -6,7 +6,7 @@ The Dactyl uses the [Teensy Loader](https://www.pjrc.com/teensy/loader.html).
|
||||
|
||||
Linux users need to modify udev rules as described on the [Teensy
|
||||
Linux page]. Some distributions provide a binary, maybe called
|
||||
`teensy-loader-cli`.
|
||||
`teensy_loader_cli`.
|
||||
|
||||
[Teensy Linux page]: https://www.pjrc.com/teensy/loader_linux.html
|
||||
|
||||
@@ -26,7 +26,7 @@ To flash the firmware:
|
||||
|
||||
- Click the button in the Teensy app to download the firmware.
|
||||
|
||||
To flash with ´teensy-loader-cli´:
|
||||
To flash with ´teensy_loader_cli´:
|
||||
|
||||
- Build the firmware as above
|
||||
|
||||
|
||||
8
keyboards/keebio/demod_lm/info.json
Normal file
8
keyboards/keebio/demod_lm/info.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"manufacturer": "Keebio",
|
||||
"maintainer": "Keebio",
|
||||
"url": "https://keeb.io",
|
||||
"usb": {
|
||||
"vid": "0xCB10"
|
||||
}
|
||||
}
|
||||
12
keyboards/keebio/demod_lm/keymaps/default/keymap.json
Normal file
12
keyboards/keebio/demod_lm/keymaps/default/keymap.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"keyboard": "keebio/demod_lm/rev1",
|
||||
"keymap": "default",
|
||||
"layout": "LAYOUT_numpad_5x4",
|
||||
"layers": [
|
||||
["RM_NEXT", "KC_PSLS", "KC_PAST", "KC_PMNS",
|
||||
"KC_P7", "KC_P8", "KC_P9",
|
||||
"KC_P4", "KC_P5", "KC_P6", "KC_PPLS",
|
||||
"KC_P1", "KC_P2", "KC_P3",
|
||||
"KC_P0", "KC_PDOT", "KC_PENT" ]
|
||||
]
|
||||
}
|
||||
24
keyboards/keebio/demod_lm/readme.md
Normal file
24
keyboards/keebio/demod_lm/readme.md
Normal file
@@ -0,0 +1,24 @@
|
||||
# Demod LM
|
||||
|
||||
A low-profile number pad and sold by Keebio. [More info at Keebio](https://keeb.io).
|
||||
|
||||
* Keyboard Maintainer: [Bakingpy/nooges](https://github.com/nooges)
|
||||
* Hardware Supported: Demod LM PCB with STM32G431 microcontroller
|
||||
* Hardware Availability: [Keebio](https://keeb.io)
|
||||
|
||||
Make example for this keyboard (after setting up your build environment):
|
||||
|
||||
make keebio/demod_lm/rev1:default
|
||||
|
||||
Example of flashing this keyboard:
|
||||
|
||||
make keebio/demod_lm/rev1: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 one of two ways:
|
||||
|
||||
* **Physical reset button**: Press and hold the button on the back of the PCB for at least 1 second and let go
|
||||
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
|
||||
12
keyboards/keebio/demod_lm/rev1/config.h
Normal file
12
keyboards/keebio/demod_lm/rev1/config.h
Normal file
@@ -0,0 +1,12 @@
|
||||
// Copyright 2025 Danny Nguyen (@nooges)
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
/* Defines for the RGB matrix */
|
||||
#define WS2812_PWM_DRIVER PWMD3
|
||||
#define WS2812_PWM_CHANNEL 3
|
||||
#define WS2812_PWM_PAL_MODE 2
|
||||
#define WS2812_DMA_STREAM STM32_DMA1_STREAM2
|
||||
#define WS2812_DMA_CHANNEL 2
|
||||
#define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM3_UP
|
||||
8
keyboards/keebio/demod_lm/rev1/halconf.h
Normal file
8
keyboards/keebio/demod_lm/rev1/halconf.h
Normal file
@@ -0,0 +1,8 @@
|
||||
// Copyright 2024 Danny Nguyen (@nooges)
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#define HAL_USE_PWM TRUE
|
||||
|
||||
#include_next <halconf.h>
|
||||
117
keyboards/keebio/demod_lm/rev1/keyboard.json
Normal file
117
keyboards/keebio/demod_lm/rev1/keyboard.json
Normal file
@@ -0,0 +1,117 @@
|
||||
{
|
||||
"keyboard_name": "Demod LM Rev. 1",
|
||||
"bootloader": "stm32-dfu",
|
||||
"diode_direction": "COL2ROW",
|
||||
"features": {
|
||||
"bootmagic": true,
|
||||
"extrakey": true,
|
||||
"mousekey": true,
|
||||
"rgb_matrix": true
|
||||
},
|
||||
"matrix_pins": {
|
||||
"cols": ["A1", "A0", "B3", "B6"],
|
||||
"rows": ["A15", "F0", "B4", "B5", "F1"]
|
||||
},
|
||||
"processor": "STM32G431",
|
||||
"rgb_matrix": {
|
||||
"animations": {
|
||||
"alphas_mods": true,
|
||||
"band_pinwheel_sat": true,
|
||||
"band_pinwheel_val": true,
|
||||
"band_sat": true,
|
||||
"band_spiral_sat": true,
|
||||
"band_spiral_val": true,
|
||||
"band_val": true,
|
||||
"breathing": true,
|
||||
"cycle_all": true,
|
||||
"cycle_left_right": true,
|
||||
"cycle_out_in": true,
|
||||
"cycle_out_in_dual": true,
|
||||
"cycle_pinwheel": true,
|
||||
"cycle_spiral": true,
|
||||
"cycle_up_down": true,
|
||||
"digital_rain": true,
|
||||
"dual_beacon": true,
|
||||
"gradient_left_right": true,
|
||||
"gradient_up_down": true,
|
||||
"hue_breathing": true,
|
||||
"hue_pendulum": true,
|
||||
"hue_wave": true,
|
||||
"jellybean_raindrops": true,
|
||||
"multisplash": true,
|
||||
"pixel_flow": true,
|
||||
"pixel_fractal": true,
|
||||
"pixel_rain": true,
|
||||
"rainbow_beacon": true,
|
||||
"rainbow_moving_chevron": true,
|
||||
"rainbow_pinwheels": true,
|
||||
"raindrops": true,
|
||||
"solid_multisplash": true,
|
||||
"solid_reactive": true,
|
||||
"solid_reactive_cross": true,
|
||||
"solid_reactive_multicross": true,
|
||||
"solid_reactive_multinexus": true,
|
||||
"solid_reactive_multiwide": true,
|
||||
"solid_reactive_nexus": true,
|
||||
"solid_reactive_simple": true,
|
||||
"solid_reactive_wide": true,
|
||||
"solid_splash": true,
|
||||
"splash": true,
|
||||
"typing_heatmap": true
|
||||
},
|
||||
"driver": "ws2812",
|
||||
"layout": [
|
||||
{"matrix": [0, 0], "x": 88, "y": 0, "flags": 4},
|
||||
{"matrix": [0, 1], "x": 104, "y": 0, "flags": 4},
|
||||
{"matrix": [0, 2], "x": 120, "y": 0, "flags": 4},
|
||||
{"matrix": [0, 3], "x": 136, "y": 0, "flags": 4},
|
||||
{"matrix": [1, 3], "x": 136, "y": 24, "flags": 4},
|
||||
{"matrix": [1, 2], "x": 120, "y": 16, "flags": 4},
|
||||
{"matrix": [1, 1], "x": 104, "y": 16, "flags": 4},
|
||||
{"matrix": [1, 0], "x": 88, "y": 16, "flags": 4},
|
||||
{"matrix": [2, 0], "x": 88, "y": 32, "flags": 4},
|
||||
{"matrix": [2, 1], "x": 104, "y": 32, "flags": 4},
|
||||
{"matrix": [2, 2], "x": 120, "y": 32, "flags": 4},
|
||||
{"matrix": [3, 2], "x": 120, "y": 48, "flags": 4},
|
||||
{"matrix": [3, 1], "x": 104, "y": 48, "flags": 4},
|
||||
{"matrix": [3, 0], "x": 88, "y": 48, "flags": 4},
|
||||
{"matrix": [4, 0], "x": 96, "y": 64, "flags": 4},
|
||||
{"matrix": [4, 2], "x": 120, "y": 64, "flags": 4},
|
||||
{"matrix": [3, 3], "x": 136, "y": 56, "flags": 4}
|
||||
],
|
||||
"max_brightness": 200,
|
||||
"sleep": true
|
||||
},
|
||||
"usb": {
|
||||
"device_version": "1.0.0",
|
||||
"pid": "0x1654"
|
||||
},
|
||||
"ws2812": {
|
||||
"driver": "pwm",
|
||||
"pin": "B0"
|
||||
},
|
||||
"community_layouts": ["numpad_5x4"],
|
||||
"layouts": {
|
||||
"LAYOUT_numpad_5x4": {
|
||||
"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": [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},
|
||||
{"matrix": [1, 3], "x": 3, "y": 1, "h": 2},
|
||||
{"matrix": [3, 0], "x": 0, "y": 3},
|
||||
{"matrix": [3, 1], "x": 1, "y": 3},
|
||||
{"matrix": [3, 2], "x": 2, "y": 3},
|
||||
{"matrix": [4, 0], "x": 0, "y": 4, "w": 2},
|
||||
{"matrix": [4, 2], "x": 2, "y": 4},
|
||||
{"matrix": [3, 3], "x": 3, "y": 3, "h": 2}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
10
keyboards/keebio/demod_lm/rev1/mcuconf.h
Normal file
10
keyboards/keebio/demod_lm/rev1/mcuconf.h
Normal file
@@ -0,0 +1,10 @@
|
||||
// Copyright 2024 Danny Nguyen (@nooges)
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include_next <mcuconf.h>
|
||||
|
||||
/* enable TIM3, used for RGB LED PWM driver */
|
||||
#undef STM32_PWM_USE_TIM3
|
||||
#define STM32_PWM_USE_TIM3 TRUE
|
||||
11
keyboards/keebio/demod_lm/rev1/rev1.c
Normal file
11
keyboards/keebio/demod_lm/rev1/rev1.c
Normal file
@@ -0,0 +1,11 @@
|
||||
// Copyright 2024 Danny Nguyen (@nooges)
|
||||
// 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 (B4, B6) 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();
|
||||
}
|
||||
131
keyboards/keenome_keys/the_grid_v2/keyboard.json
Normal file
131
keyboards/keenome_keys/the_grid_v2/keyboard.json
Normal file
@@ -0,0 +1,131 @@
|
||||
{
|
||||
"manufacturer": "Keenome Keys",
|
||||
"keyboard_name": "The Grid v2",
|
||||
"maintainer": "Keenome Keys",
|
||||
"bootloader": "rp2040",
|
||||
"features": {
|
||||
"bootmagic": true,
|
||||
"extrakey": true,
|
||||
"mousekey": true,
|
||||
"nkro": true,
|
||||
"rgb_matrix": true
|
||||
},
|
||||
"matrix_pins": {
|
||||
"direct": [
|
||||
["GP25", "GP24", "GP23", "GP22"],
|
||||
["GP21", "GP20", "GP19", "GP18"],
|
||||
["GP17", "GP16", "GP15", "GP14"],
|
||||
["GP13", "GP12", "GP11", "GP10"]
|
||||
]
|
||||
},
|
||||
"processor": "RP2040",
|
||||
"rgb_matrix": {
|
||||
"animations": {
|
||||
"alpha_mods": true,
|
||||
"band_pinwheel_sat": true,
|
||||
"band_pinwheel_val": true,
|
||||
"band_sat": true,
|
||||
"band_spiral_sat": true,
|
||||
"band_spiral_val": true,
|
||||
"band_val": true,
|
||||
"breathing": true,
|
||||
"cycle_all": true,
|
||||
"cycle_left_right": true,
|
||||
"cycle_out_in": true,
|
||||
"cycle_out_in_dual": true,
|
||||
"cycle_pinwheel": true,
|
||||
"cycle_spiral": true,
|
||||
"cycle_up_down": true,
|
||||
"digital_rain": true,
|
||||
"dual_beacon": true,
|
||||
"flower_blooming": 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,
|
||||
"riverflow": true,
|
||||
"solid_multisplash": true,
|
||||
"solid_reactive": true,
|
||||
"solid_reactive_cross": true,
|
||||
"solid_reactive_multicross": true,
|
||||
"solid_reactive_multinexus": true,
|
||||
"solid_reactive_multiwide": true,
|
||||
"solid_reactive_nexus": true,
|
||||
"solid_reactive_simple": true,
|
||||
"solid_reactive_wide": true,
|
||||
"solid_splash": true,
|
||||
"splash": true,
|
||||
"starlight": true,
|
||||
"starlight_dual_hue": true,
|
||||
"starlight_dual_sat": true,
|
||||
"starlight_smooth": true,
|
||||
"typing_heatmap": true
|
||||
},
|
||||
"default": {
|
||||
"animation": "cycle_spiral",
|
||||
"speed": 32,
|
||||
"val": 144
|
||||
},
|
||||
"driver": "ws2812",
|
||||
"layout": [
|
||||
{"matrix": [0, 0], "x": 0, "y": 0, "flags": 4},
|
||||
{"matrix": [0, 1], "x": 75, "y": 0, "flags": 4},
|
||||
{"matrix": [0, 2], "x": 149, "y": 0, "flags": 4},
|
||||
{"matrix": [0, 3], "x": 224, "y": 0, "flags": 4},
|
||||
{"matrix": [1, 3], "x": 224, "y": 21, "flags": 4},
|
||||
{"matrix": [1, 2], "x": 149, "y": 21, "flags": 4},
|
||||
{"matrix": [1, 1], "x": 75, "y": 21, "flags": 4},
|
||||
{"matrix": [1, 0], "x": 0, "y": 21, "flags": 4},
|
||||
{"matrix": [2, 0], "x": 0, "y": 43, "flags": 4},
|
||||
{"matrix": [2, 1], "x": 75, "y": 43, "flags": 4},
|
||||
{"matrix": [2, 2], "x": 149, "y": 43, "flags": 4},
|
||||
{"matrix": [2, 3], "x": 224, "y": 43, "flags": 4},
|
||||
{"matrix": [3, 3], "x": 224, "y": 64, "flags": 4},
|
||||
{"matrix": [3, 2], "x": 149, "y": 64, "flags": 4},
|
||||
{"matrix": [3, 1], "x": 75, "y": 64, "flags": 4},
|
||||
{"matrix": [3, 0], "x": 0, "y": 64, "flags": 4}
|
||||
],
|
||||
"sleep": true
|
||||
},
|
||||
"usb": {
|
||||
"device_version": "1.0.0",
|
||||
"pid": "0x0001",
|
||||
"vid": "0x6167"
|
||||
},
|
||||
"ws2812": {
|
||||
"driver": "vendor",
|
||||
"pin": "GP26"
|
||||
},
|
||||
"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": [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": [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": [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}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
13
keyboards/keenome_keys/the_grid_v2/keymaps/default/keymap.c
Normal file
13
keyboards/keenome_keys/the_grid_v2/keymaps/default/keymap.c
Normal file
@@ -0,0 +1,13 @@
|
||||
// Copyright 2025 Nathan Sunday (@PoctorDepper)
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
[0] = LAYOUT(
|
||||
KC_P7, KC_P8, KC_P9, KC_PSLS,
|
||||
KC_P4, KC_P5, KC_P6, KC_PAST,
|
||||
KC_P1, KC_P2, KC_P3, KC_PMNS,
|
||||
KC_P0, KC_PDOT, KC_PENT, KC_PPLS
|
||||
)
|
||||
};
|
||||
22
keyboards/keenome_keys/the_grid_v2/readme.md
Normal file
22
keyboards/keenome_keys/the_grid_v2/readme.md
Normal file
@@ -0,0 +1,22 @@
|
||||
# The Grid v2
|
||||
|
||||
* Keyboard Maintainer: [PoctorDepper](https://github.com/PoctorDepper)
|
||||
* Hardware Supported: Custom PCB using RP2040
|
||||
|
||||
Make example for this keyboard (after setting up your build environment):
|
||||
|
||||
make keenome_keys/the_grid_v2:default
|
||||
|
||||
Flashing example for this keyboard:
|
||||
|
||||
make keenome_keys/the_grid_v2: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**: 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
|
||||
292
keyboards/keyten/imi60_hs/keyboard.json
Normal file
292
keyboards/keyten/imi60_hs/keyboard.json
Normal file
@@ -0,0 +1,292 @@
|
||||
{
|
||||
"manufacturer": "La-Versa x keyten",
|
||||
"keyboard_name": "imi60-HS",
|
||||
"maintainer": "key10iq",
|
||||
"processor": "STM32F072",
|
||||
"bootloader": "stm32-dfu",
|
||||
"usb": {
|
||||
"vid": "0xEB69",
|
||||
"pid": "0x6009",
|
||||
"device_version": "0.0.1"
|
||||
},
|
||||
"features": {
|
||||
"bootmagic": true,
|
||||
"extrakey": true,
|
||||
"mousekey": true,
|
||||
"nkro": true
|
||||
},
|
||||
"diode_direction": "COL2ROW",
|
||||
"matrix_pins": {
|
||||
"rows": ["B1", "B0", "A6", "A5", "B11"],
|
||||
"cols": ["A3", "A4", "A7", "B2", "B10", "B9", "B8", "B7", "B6", "B5", "B4", "B3", "A15", "A14"]
|
||||
},
|
||||
"community_layouts": [
|
||||
"60_ansi_wkl_split_bs_rshift",
|
||||
"60_hhkb",
|
||||
"60_ansi_tsangan_split_bs_rshift"
|
||||
],
|
||||
"layout_aliases": {
|
||||
"LAYOUT_all": "LAYOUT_60_ansi_tsangan_split_bs_rshift"
|
||||
},
|
||||
"layouts": {
|
||||
"LAYOUT_60_ansi_wkl_split_bs_rshift": {
|
||||
"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": [2, 13], "x": 14, "y": 0},
|
||||
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
|
||||
{"matrix": [1, 1], "x": 1.5, "y": 1},
|
||||
{"matrix": [1, 2], "x": 2.5, "y": 1},
|
||||
{"matrix": [1, 3], "x": 3.5, "y": 1},
|
||||
{"matrix": [1, 4], "x": 4.5, "y": 1},
|
||||
{"matrix": [1, 5], "x": 5.5, "y": 1},
|
||||
{"matrix": [1, 6], "x": 6.5, "y": 1},
|
||||
{"matrix": [1, 7], "x": 7.5, "y": 1},
|
||||
{"matrix": [1, 8], "x": 8.5, "y": 1},
|
||||
{"matrix": [1, 9], "x": 9.5, "y": 1},
|
||||
{"matrix": [1, 10], "x": 10.5, "y": 1},
|
||||
{"matrix": [1, 11], "x": 11.5, "y": 1},
|
||||
{"matrix": [1, 12], "x": 12.5, "y": 1},
|
||||
{"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
|
||||
{"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},
|
||||
{"matrix": [2, 11], "x": 11.75, "y": 2},
|
||||
{"matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25},
|
||||
{"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
|
||||
{"matrix": [3, 1], "x": 2.25, "y": 3},
|
||||
{"matrix": [3, 2], "x": 3.25, "y": 3},
|
||||
{"matrix": [3, 3], "x": 4.25, "y": 3},
|
||||
{"matrix": [3, 4], "x": 5.25, "y": 3},
|
||||
{"matrix": [3, 5], "x": 6.25, "y": 3},
|
||||
{"matrix": [3, 6], "x": 7.25, "y": 3},
|
||||
{"matrix": [3, 7], "x": 8.25, "y": 3},
|
||||
{"matrix": [3, 8], "x": 9.25, "y": 3},
|
||||
{"matrix": [3, 9], "x": 10.25, "y": 3},
|
||||
{"matrix": [3, 10], "x": 11.25, "y": 3},
|
||||
{"matrix": [4, 12], "x": 12.25, "y": 3, "w": 1.75},
|
||||
{"matrix": [3, 13], "x": 14, "y": 3},
|
||||
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
|
||||
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
|
||||
{"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
|
||||
{"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5},
|
||||
{"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
|
||||
]
|
||||
},
|
||||
"LAYOUT_60_hhkb": {
|
||||
"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": [2, 13], "x": 14, "y": 0},
|
||||
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
|
||||
{"matrix": [1, 1], "x": 1.5, "y": 1},
|
||||
{"matrix": [1, 2], "x": 2.5, "y": 1},
|
||||
{"matrix": [1, 3], "x": 3.5, "y": 1},
|
||||
{"matrix": [1, 4], "x": 4.5, "y": 1},
|
||||
{"matrix": [1, 5], "x": 5.5, "y": 1},
|
||||
{"matrix": [1, 6], "x": 6.5, "y": 1},
|
||||
{"matrix": [1, 7], "x": 7.5, "y": 1},
|
||||
{"matrix": [1, 8], "x": 8.5, "y": 1},
|
||||
{"matrix": [1, 9], "x": 9.5, "y": 1},
|
||||
{"matrix": [1, 10], "x": 10.5, "y": 1},
|
||||
{"matrix": [1, 11], "x": 11.5, "y": 1},
|
||||
{"matrix": [1, 12], "x": 12.5, "y": 1},
|
||||
{"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
|
||||
{"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},
|
||||
{"matrix": [2, 11], "x": 11.75, "y": 2},
|
||||
{"matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25},
|
||||
{"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
|
||||
{"matrix": [3, 1], "x": 2.25, "y": 3},
|
||||
{"matrix": [3, 2], "x": 3.25, "y": 3},
|
||||
{"matrix": [3, 3], "x": 4.25, "y": 3},
|
||||
{"matrix": [3, 4], "x": 5.25, "y": 3},
|
||||
{"matrix": [3, 5], "x": 6.25, "y": 3},
|
||||
{"matrix": [3, 6], "x": 7.25, "y": 3},
|
||||
{"matrix": [3, 7], "x": 8.25, "y": 3},
|
||||
{"matrix": [3, 8], "x": 9.25, "y": 3},
|
||||
{"matrix": [3, 9], "x": 10.25, "y": 3},
|
||||
{"matrix": [3, 10], "x": 11.25, "y": 3},
|
||||
{"matrix": [4, 12], "x": 12.25, "y": 3, "w": 1.75},
|
||||
{"matrix": [3, 13], "x": 14, "y": 3},
|
||||
{"matrix": [4, 1], "x": 1.5, "y": 4},
|
||||
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
|
||||
{"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
|
||||
{"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5},
|
||||
{"matrix": [4, 11], "x": 12.5, "y": 4}
|
||||
]
|
||||
},
|
||||
"LAYOUT_60_ansi_tsangan_split_bs_rshift": {
|
||||
"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": [2, 13], "x": 14, "y": 0},
|
||||
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
|
||||
{"matrix": [1, 1], "x": 1.5, "y": 1},
|
||||
{"matrix": [1, 2], "x": 2.5, "y": 1},
|
||||
{"matrix": [1, 3], "x": 3.5, "y": 1},
|
||||
{"matrix": [1, 4], "x": 4.5, "y": 1},
|
||||
{"matrix": [1, 5], "x": 5.5, "y": 1},
|
||||
{"matrix": [1, 6], "x": 6.5, "y": 1},
|
||||
{"matrix": [1, 7], "x": 7.5, "y": 1},
|
||||
{"matrix": [1, 8], "x": 8.5, "y": 1},
|
||||
{"matrix": [1, 9], "x": 9.5, "y": 1},
|
||||
{"matrix": [1, 10], "x": 10.5, "y": 1},
|
||||
{"matrix": [1, 11], "x": 11.5, "y": 1},
|
||||
{"matrix": [1, 12], "x": 12.5, "y": 1},
|
||||
{"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
|
||||
{"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},
|
||||
{"matrix": [2, 11], "x": 11.75, "y": 2},
|
||||
{"matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25},
|
||||
{"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
|
||||
{"matrix": [3, 1], "x": 2.25, "y": 3},
|
||||
{"matrix": [3, 2], "x": 3.25, "y": 3},
|
||||
{"matrix": [3, 3], "x": 4.25, "y": 3},
|
||||
{"matrix": [3, 4], "x": 5.25, "y": 3},
|
||||
{"matrix": [3, 5], "x": 6.25, "y": 3},
|
||||
{"matrix": [3, 6], "x": 7.25, "y": 3},
|
||||
{"matrix": [3, 7], "x": 8.25, "y": 3},
|
||||
{"matrix": [3, 8], "x": 9.25, "y": 3},
|
||||
{"matrix": [3, 9], "x": 10.25, "y": 3},
|
||||
{"matrix": [3, 10], "x": 11.25, "y": 3},
|
||||
{"matrix": [4, 12], "x": 12.25, "y": 3, "w": 1.75},
|
||||
{"matrix": [3, 13], "x": 14, "y": 3},
|
||||
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
|
||||
{"matrix": [4, 1], "x": 1.5, "y": 4},
|
||||
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
|
||||
{"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
|
||||
{"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5},
|
||||
{"matrix": [4, 11], "x": 12.5, "y": 4},
|
||||
{"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
|
||||
]
|
||||
},
|
||||
"LAYOUT_60_ansi_tsangan_split_rshift": {
|
||||
"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": [2, 13], "x": 13, "y": 0, "w": 2},
|
||||
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
|
||||
{"matrix": [1, 1], "x": 1.5, "y": 1},
|
||||
{"matrix": [1, 2], "x": 2.5, "y": 1},
|
||||
{"matrix": [1, 3], "x": 3.5, "y": 1},
|
||||
{"matrix": [1, 4], "x": 4.5, "y": 1},
|
||||
{"matrix": [1, 5], "x": 5.5, "y": 1},
|
||||
{"matrix": [1, 6], "x": 6.5, "y": 1},
|
||||
{"matrix": [1, 7], "x": 7.5, "y": 1},
|
||||
{"matrix": [1, 8], "x": 8.5, "y": 1},
|
||||
{"matrix": [1, 9], "x": 9.5, "y": 1},
|
||||
{"matrix": [1, 10], "x": 10.5, "y": 1},
|
||||
{"matrix": [1, 11], "x": 11.5, "y": 1},
|
||||
{"matrix": [1, 12], "x": 12.5, "y": 1},
|
||||
{"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
|
||||
{"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},
|
||||
{"matrix": [2, 11], "x": 11.75, "y": 2},
|
||||
{"matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25},
|
||||
{"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
|
||||
{"matrix": [3, 1], "x": 2.25, "y": 3},
|
||||
{"matrix": [3, 2], "x": 3.25, "y": 3},
|
||||
{"matrix": [3, 3], "x": 4.25, "y": 3},
|
||||
{"matrix": [3, 4], "x": 5.25, "y": 3},
|
||||
{"matrix": [3, 5], "x": 6.25, "y": 3},
|
||||
{"matrix": [3, 6], "x": 7.25, "y": 3},
|
||||
{"matrix": [3, 7], "x": 8.25, "y": 3},
|
||||
{"matrix": [3, 8], "x": 9.25, "y": 3},
|
||||
{"matrix": [3, 9], "x": 10.25, "y": 3},
|
||||
{"matrix": [3, 10], "x": 11.25, "y": 3},
|
||||
{"matrix": [4, 12], "x": 12.25, "y": 3, "w": 1.75},
|
||||
{"matrix": [3, 13], "x": 14, "y": 3},
|
||||
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
|
||||
{"matrix": [4, 1], "x": 1.5, "y": 4},
|
||||
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
|
||||
{"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
|
||||
{"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5},
|
||||
{"matrix": [4, 11], "x": 12.5, "y": 4},
|
||||
{"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
23
keyboards/keyten/imi60_hs/keymaps/default/keymap.c
Normal file
23
keyboards/keyten/imi60_hs/keymaps/default/keymap.c
Normal file
@@ -0,0 +1,23 @@
|
||||
// Copyright 2025 key10iq
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
|
||||
[0] = LAYOUT_60_ansi_tsangan_split_bs_rshift(
|
||||
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_EQL, KC_GRV, KC_BSPC,
|
||||
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_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_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL
|
||||
),
|
||||
|
||||
[1] = LAYOUT_60_ansi_tsangan_split_bs_rshift(
|
||||
QK_BOOT, 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_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
|
||||
)
|
||||
};
|
||||
27
keyboards/keyten/imi60_hs/readme.md
Normal file
27
keyboards/keyten/imi60_hs/readme.md
Normal file
@@ -0,0 +1,27 @@
|
||||
# keyten imi60-HS
|
||||
|
||||
imi60-HS - 60% Hot-Swap PCB compatible with keyboards by La-Versa: Animi, Mirimi, Otsukimi and Abyss
|
||||
|
||||

|
||||
|
||||
* Keyboard Maintainer: [keyten](https://github.com/key10iq)
|
||||
* Hardware Supported: keyten imi60-HS
|
||||
* Hardware Availability: private GB
|
||||
|
||||
Make example for this keyboard (after setting up your build environment):
|
||||
|
||||
make keyten/imi60_hs:default
|
||||
|
||||
Flashing example for this keyboard:
|
||||
|
||||
make keyten/imi60_hs: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
|
||||
* Keycode in layout: Press the key mapped to `QK_BOOT` if it is available
|
||||
* Physical reset button: Hold the button on the back of the PCB
|
||||
5
keyboards/yiancardesigns/hyper7/v4/config.h
Normal file
5
keyboards/yiancardesigns/hyper7/v4/config.h
Normal file
@@ -0,0 +1,5 @@
|
||||
// Copyright 2025 Yiancar-Designs, Bit-Shifter
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
#pragma once
|
||||
|
||||
#define DYNAMIC_KEYMAP_MACRO_COUNT 30
|
||||
429
keyboards/yiancardesigns/hyper7/v4/keyboard.json
Normal file
429
keyboards/yiancardesigns/hyper7/v4/keyboard.json
Normal file
@@ -0,0 +1,429 @@
|
||||
{
|
||||
"manufacturer": "Yiancar-Designs",
|
||||
"keyboard_name": "Hyper7 v4",
|
||||
"maintainer": "Yiancar-Designs",
|
||||
"bootloader": "stm32-dfu",
|
||||
"bootmagic": {
|
||||
"matrix": [3, 0]
|
||||
},
|
||||
"diode_direction": "COL2ROW",
|
||||
"features": {
|
||||
"bootmagic": true,
|
||||
"extrakey": true,
|
||||
"mousekey": true,
|
||||
"nkro": true
|
||||
},
|
||||
"matrix_pins": {
|
||||
"cols": ["B11", "B10", "B2", "B1", "B0", "C5", "C4", "A7", "A6", "A5", "A4", "A3", "A2", "A1", "A0", "B12", "B13", "B14", "B15", "A8", "C9", "C8", "C7", "C6", "C11", "C10", "A15", "A14"],
|
||||
"rows": ["C1", "C2", "C3", "A13", "C12", "B3", "B4", "B5"]
|
||||
},
|
||||
"processor": "STM32F072",
|
||||
"url": "https://yiancar-designs.com",
|
||||
"usb": {
|
||||
"device_version": "0.0.1",
|
||||
"pid": "0x6837",
|
||||
"vid": "0x8968"
|
||||
},
|
||||
"layouts": {
|
||||
"LAYOUT_modern": {
|
||||
"layout": [
|
||||
{"matrix": [0, 0], "x": 0, "y": 0, "w":2},
|
||||
{"matrix": [0, 2], "x": 2, "y": 0, "w":2},
|
||||
{"matrix": [0, 4], "x": 4.5, "y": 0, "w":2},
|
||||
{"matrix": [0, 6], "x": 6.5, "y": 0, "w":2},
|
||||
{"matrix": [0, 8], "x": 8.5, "y": 0, "w":2},
|
||||
{"matrix": [0, 10], "x": 10.5, "y": 0, "w":2},
|
||||
{"matrix": [0, 12], "x": 12.5, "y": 0, "w":2},
|
||||
{"matrix": [0, 14], "x": 14.5, "y": 0, "w":2},
|
||||
{"matrix": [0, 16], "x": 16.5, "y": 0, "w":2},
|
||||
{"matrix": [0, 18], "x": 18.5, "y": 0, "w":2},
|
||||
{"matrix": [0, 20], "x": 20.5, "y": 0, "w":2},
|
||||
{"matrix": [0, 22], "x": 22.5, "y": 0, "w":2},
|
||||
{"matrix": [0, 24], "x": 25, "y": 0, "w":2},
|
||||
{"matrix": [0, 26], "x": 27, "y": 0, "w":2},
|
||||
{"matrix": [1, 0], "x": 0, "y": 1, "w":2},
|
||||
{"matrix": [1, 2], "x": 2, "y": 1, "w":2},
|
||||
{"matrix": [1, 4], "x": 4.5, "y": 1, "w":2},
|
||||
{"matrix": [1, 6], "x": 6.5, "y": 1, "w":2},
|
||||
{"matrix": [1, 8], "x": 8.5, "y": 1, "w":2},
|
||||
{"matrix": [1, 10], "x": 10.5, "y": 1, "w":2},
|
||||
{"matrix": [1, 12], "x": 12.5, "y": 1, "w":2},
|
||||
{"matrix": [1, 14], "x": 14.5, "y": 1, "w":2},
|
||||
{"matrix": [1, 16], "x": 16.5, "y": 1, "w":2},
|
||||
{"matrix": [1, 18], "x": 18.5, "y": 1, "w":2},
|
||||
{"matrix": [1, 20], "x": 20.5, "y": 1, "w":2},
|
||||
{"matrix": [1, 22], "x": 22.5, "y": 1, "w":2},
|
||||
{"matrix": [1, 24], "x": 25, "y": 1, "w":2},
|
||||
{"matrix": [1, 26], "x": 27, "y": 1, "w":2},
|
||||
{"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.5, "y": 2, "w":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},
|
||||
{"matrix": [2, 14], "x": 14.5, "y": 2},
|
||||
{"matrix": [2, 15], "x": 15.5, "y": 2},
|
||||
{"matrix": [2, 16], "x": 16.5, "y": 2},
|
||||
{"matrix": [2, 17], "x": 17.5, "y": 2},
|
||||
{"matrix": [2, 18], "x": 18.5, "y": 2},
|
||||
{"matrix": [2, 19], "x": 19.5, "y": 2},
|
||||
{"matrix": [2, 20], "x": 20.5, "y": 2},
|
||||
{"matrix": [2, 21], "x": 21.5, "y": 2},
|
||||
{"matrix": [2, 22], "x": 22.5, "y": 2, "w":2},
|
||||
{"matrix": [2, 24], "x": 25, "y": 2},
|
||||
{"matrix": [2, 25], "x": 26, "y": 2},
|
||||
{"matrix": [2, 26], "x": 27, "y": 2},
|
||||
{"matrix": [2, 27], "x": 28, "y": 2},
|
||||
{"matrix": [3, 0], "x": 0, "y": 3.5},
|
||||
{"matrix": [3, 1], "x": 1, "y": 3.5},
|
||||
{"matrix": [3, 2], "x": 2, "y": 3.5},
|
||||
{"matrix": [3, 3], "x": 3, "y": 3.5},
|
||||
{"matrix": [3, 4], "x": 4.5, "y": 3.5, "w": 1.5},
|
||||
{"matrix": [3, 6], "x": 6, "y": 3.5},
|
||||
{"matrix": [3, 7], "x": 7, "y": 3.5},
|
||||
{"matrix": [3, 8], "x": 8, "y": 3.5},
|
||||
{"matrix": [3, 9], "x": 9, "y": 3.5},
|
||||
{"matrix": [3, 10], "x": 10, "y": 3.5},
|
||||
{"matrix": [3, 11], "x": 11, "y": 3.5},
|
||||
{"matrix": [3, 12], "x": 12, "y": 3.5},
|
||||
{"matrix": [3, 13], "x": 13, "y": 3.5},
|
||||
{"matrix": [3, 14], "x": 14, "y": 3.5},
|
||||
{"matrix": [3, 15], "x": 15, "y": 3.5},
|
||||
{"matrix": [3, 16], "x": 16, "y": 3.5},
|
||||
{"matrix": [3, 17], "x": 17, "y": 3.5},
|
||||
{"matrix": [3, 18], "x": 18, "y": 3.5},
|
||||
{"matrix": [3, 19], "x": 19, "y": 3.5},
|
||||
{"matrix": [3, 20], "x": 20, "y": 3.5},
|
||||
{"matrix": [3, 21], "x": 21, "y": 3.5},
|
||||
{"matrix": [3, 22], "x": 22, "y": 3.5},
|
||||
{"matrix": [3, 23], "x": 23, "y": 3.5, "w": 1.5},
|
||||
{"matrix": [3, 24], "x": 25, "y": 3.5},
|
||||
{"matrix": [3, 25], "x": 26, "y": 3.5},
|
||||
{"matrix": [3, 26], "x": 27, "y": 3.5},
|
||||
{"matrix": [3, 27], "x": 28, "y": 3.5},
|
||||
{"matrix": [4, 0], "x": 0, "y": 4.5},
|
||||
{"matrix": [4, 1], "x": 1, "y": 4.5},
|
||||
{"matrix": [4, 2], "x": 2, "y": 4.5},
|
||||
{"matrix": [4, 3], "x": 3, "y": 4.5},
|
||||
{"matrix": [4, 4], "x": 4.5, "y": 4.5},
|
||||
{"matrix": [4, 5], "x": 5.5, "y": 4.5, "w": 1.5},
|
||||
{"matrix": [4, 7], "x": 7, "y": 4.5, "w": 1.5},
|
||||
{"matrix": [4, 8], "x": 8.5, "y": 4.5},
|
||||
{"matrix": [4, 9], "x": 9.5, "y": 4.5},
|
||||
{"matrix": [4, 10], "x": 10.5, "y": 4.5},
|
||||
{"matrix": [4, 11], "x": 11.5, "y": 4.5},
|
||||
{"matrix": [4, 12], "x": 12.5, "y": 4.5},
|
||||
{"matrix": [4, 13], "x": 13.5, "y": 4.5},
|
||||
{"matrix": [4, 14], "x": 14.5, "y": 4.5},
|
||||
{"matrix": [4, 15], "x": 15.5, "y": 4.5},
|
||||
{"matrix": [4, 16], "x": 16.5, "y": 4.5},
|
||||
{"matrix": [4, 17], "x": 17.5, "y": 4.5},
|
||||
{"matrix": [4, 18], "x": 18.5, "y": 4.5},
|
||||
{"matrix": [4, 19], "x": 19.5, "y": 4.5},
|
||||
{"matrix": [4, 20], "x": 20.5, "y": 4.5, "w": 1.5},
|
||||
{"matrix": [4, 22], "x": 22, "y": 4.5, "w": 1.5},
|
||||
{"matrix": [4, 23], "x": 23.5, "y": 4.5},
|
||||
{"matrix": [4, 24], "x": 25, "y": 4.5},
|
||||
{"matrix": [4, 25], "x": 26, "y": 4.5},
|
||||
{"matrix": [4, 26], "x": 27, "y": 4.5},
|
||||
{"matrix": [4, 27], "x": 28, "y": 4.5},
|
||||
{"matrix": [5, 0], "x": 0, "y": 5.5},
|
||||
{"matrix": [5, 1], "x": 1, "y": 5.5},
|
||||
{"matrix": [5, 2], "x": 2, "y": 5.5},
|
||||
{"matrix": [5, 3], "x": 3, "y": 5.5},
|
||||
{"matrix": [5, 4], "x": 4.5, "y": 5.5, "w": 1.5},
|
||||
{"matrix": [5, 6], "x": 6, "y": 5.5, "w": 1.5},
|
||||
{"matrix": [5, 7], "x": 7.5, "y": 5.5, "w": 1.5},
|
||||
{"matrix": [5, 9], "x": 9, "y": 5.5},
|
||||
{"matrix": [5, 10], "x": 10, "y": 5.5},
|
||||
{"matrix": [5, 11], "x": 11, "y": 5.5},
|
||||
{"matrix": [5, 12], "x": 12, "y": 5.5},
|
||||
{"matrix": [5, 13], "x": 13, "y": 5.5},
|
||||
{"matrix": [5, 14], "x": 14, "y": 5.5},
|
||||
{"matrix": [5, 15], "x": 15, "y": 5.5},
|
||||
{"matrix": [5, 16], "x": 16, "y": 5.5},
|
||||
{"matrix": [5, 17], "x": 17, "y": 5.5},
|
||||
{"matrix": [5, 18], "x": 18, "y": 5.5},
|
||||
{"matrix": [5, 19], "x": 19, "y": 5.5},
|
||||
{"matrix": [5, 20], "x": 20, "y": 5.5, "w": 1.5},
|
||||
{"matrix": [5, 21], "x": 21.5, "y": 5.5, "w": 1.5},
|
||||
{"matrix": [5, 23], "x": 23, "y": 5.5, "w": 1.5},
|
||||
{"matrix": [5, 24], "x": 25, "y": 5.5},
|
||||
{"matrix": [5, 25], "x": 26, "y": 5.5},
|
||||
{"matrix": [5, 26], "x": 27, "y": 5.5},
|
||||
{"matrix": [5, 27], "x": 28, "y": 5.5},
|
||||
{"matrix": [6, 0], "x": 0, "y": 6.5},
|
||||
{"matrix": [6, 1], "x": 1, "y": 6.5},
|
||||
{"matrix": [6, 2], "x": 2, "y": 6.5},
|
||||
{"matrix": [6, 3], "x": 3, "y": 6.5},
|
||||
{"matrix": [6, 4], "x": 4.5, "y": 6.5},
|
||||
{"matrix": [6, 5], "x": 5.5, "y": 6.5},
|
||||
{"matrix": [6, 6], "x": 6.5, "y": 6.5, "w": 1.5},
|
||||
{"matrix": [6, 8], "x": 8, "y": 6.5, "w": 1.5},
|
||||
{"matrix": [6, 9], "x": 9.5, "y": 6.5},
|
||||
{"matrix": [6, 10], "x": 10.5, "y": 6.5},
|
||||
{"matrix": [6, 11], "x": 11.5, "y": 6.5},
|
||||
{"matrix": [6, 12], "x": 12.5, "y": 6.5},
|
||||
{"matrix": [6, 13], "x": 13.5, "y": 6.5},
|
||||
{"matrix": [6, 14], "x": 14.5, "y": 6.5},
|
||||
{"matrix": [6, 15], "x": 15.5, "y": 6.5},
|
||||
{"matrix": [6, 16], "x": 16.5, "y": 6.5},
|
||||
{"matrix": [6, 17], "x": 17.5, "y": 6.5},
|
||||
{"matrix": [6, 18], "x": 18.5, "y": 6.5},
|
||||
{"matrix": [6, 19], "x": 19.5, "y": 6.5, "w": 1.5},
|
||||
{"matrix": [6, 21], "x": 21, "y": 6.5, "w": 1.5},
|
||||
{"matrix": [6, 22], "x": 22.5, "y": 6.5},
|
||||
{"matrix": [6, 23], "x": 23.5, "y": 6.5},
|
||||
{"matrix": [6, 24], "x": 25, "y": 6.5},
|
||||
{"matrix": [6, 25], "x": 26, "y": 6.5},
|
||||
{"matrix": [6, 26], "x": 27, "y": 6.5},
|
||||
{"matrix": [6, 27], "x": 28, "y": 6.5},
|
||||
{"matrix": [7, 0], "x": 0, "y": 7.5},
|
||||
{"matrix": [7, 1], "x": 1, "y": 7.5},
|
||||
{"matrix": [7, 2], "x": 2, "y": 7.5},
|
||||
{"matrix": [7, 3], "x": 3, "y": 7.5},
|
||||
{"matrix": [7, 4], "x": 4.5, "y": 7.5},
|
||||
{"matrix": [7, 5], "x": 5.5, "y": 7.5},
|
||||
{"matrix": [7, 6], "x": 6.5, "y": 7.5},
|
||||
{"matrix": [7, 7], "x": 7.5, "y": 7.5, "w": 1.5},
|
||||
{"matrix": [7, 8], "x": 9, "y": 7.5, "w": 1.5},
|
||||
{"matrix": [7, 13], "x": 10.5, "y": 7.5, "w": 7},
|
||||
{"matrix": [7, 18], "x": 17.5, "y": 7.5},
|
||||
{"matrix": [7, 19], "x": 18.5, "y": 7.5, "w": 1.5},
|
||||
{"matrix": [7, 20], "x": 20, "y": 7.5, "w": 1.5},
|
||||
{"matrix": [7, 21], "x": 21.5, "y": 7.5},
|
||||
{"matrix": [7, 22], "x": 22.5, "y": 7.5},
|
||||
{"matrix": [7, 23], "x": 23.5, "y": 7.5},
|
||||
{"matrix": [7, 24], "x": 25, "y": 7.5},
|
||||
{"matrix": [7, 25], "x": 26, "y": 7.5},
|
||||
{"matrix": [7, 26], "x": 27, "y": 7.5},
|
||||
{"matrix": [7, 27], "x": 28, "y": 7.5}
|
||||
]
|
||||
},
|
||||
"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.5, "y": 0},
|
||||
{"matrix": [0, 5], "x": 5.5, "y": 0},
|
||||
{"matrix": [0, 6], "x": 6.5, "y": 0},
|
||||
{"matrix": [0, 7], "x": 7.5, "y": 0},
|
||||
{"matrix": [0, 8], "x": 8.5, "y": 0},
|
||||
{"matrix": [0, 9], "x": 9.5, "y": 0},
|
||||
{"matrix": [0, 10], "x": 10.5, "y": 0},
|
||||
{"matrix": [0, 11], "x": 11.5, "y": 0},
|
||||
{"matrix": [0, 12], "x": 12.5, "y": 0},
|
||||
{"matrix": [0, 13], "x": 13.5, "y": 0},
|
||||
{"matrix": [0, 14], "x": 14.5, "y": 0},
|
||||
{"matrix": [0, 15], "x": 15.5, "y": 0},
|
||||
{"matrix": [0, 16], "x": 16.5, "y": 0},
|
||||
{"matrix": [0, 17], "x": 17.5, "y": 0},
|
||||
{"matrix": [0, 18], "x": 18.5, "y": 0},
|
||||
{"matrix": [0, 19], "x": 19.5, "y": 0},
|
||||
{"matrix": [0, 20], "x": 20.5, "y": 0},
|
||||
{"matrix": [0, 21], "x": 21.5, "y": 0},
|
||||
{"matrix": [0, 22], "x": 22.5, "y": 0},
|
||||
{"matrix": [0, 23], "x": 23.5, "y": 0},
|
||||
{"matrix": [0, 24], "x": 25, "y": 0},
|
||||
{"matrix": [0, 25], "x": 26, "y": 0},
|
||||
{"matrix": [0, 26], "x": 27, "y": 0},
|
||||
{"matrix": [0, 27], "x": 28, "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.5, "y": 1},
|
||||
{"matrix": [1, 5], "x": 5.5, "y": 1},
|
||||
{"matrix": [1, 6], "x": 6.5, "y": 1},
|
||||
{"matrix": [1, 7], "x": 7.5, "y": 1},
|
||||
{"matrix": [1, 8], "x": 8.5, "y": 1},
|
||||
{"matrix": [1, 9], "x": 9.5, "y": 1},
|
||||
{"matrix": [1, 10], "x": 10.5, "y": 1},
|
||||
{"matrix": [1, 11], "x": 11.5, "y": 1},
|
||||
{"matrix": [1, 12], "x": 12.5, "y": 1},
|
||||
{"matrix": [1, 13], "x": 13.5, "y": 1},
|
||||
{"matrix": [1, 14], "x": 14.5, "y": 1},
|
||||
{"matrix": [1, 15], "x": 15.5, "y": 1},
|
||||
{"matrix": [1, 16], "x": 16.5, "y": 1},
|
||||
{"matrix": [1, 17], "x": 17.5, "y": 1},
|
||||
{"matrix": [1, 18], "x": 18.5, "y": 1},
|
||||
{"matrix": [1, 19], "x": 19.5, "y": 1},
|
||||
{"matrix": [1, 20], "x": 20.5, "y": 1},
|
||||
{"matrix": [1, 21], "x": 21.5, "y": 1},
|
||||
{"matrix": [1, 22], "x": 22.5, "y": 1},
|
||||
{"matrix": [1, 23], "x": 23.5, "y": 1},
|
||||
{"matrix": [1, 24], "x": 25, "y": 1},
|
||||
{"matrix": [1, 25], "x": 26, "y": 1},
|
||||
{"matrix": [1, 26], "x": 27, "y": 1},
|
||||
{"matrix": [1, 27], "x": 28, "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.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},
|
||||
{"matrix": [2, 14], "x": 14.5, "y": 2},
|
||||
{"matrix": [2, 15], "x": 15.5, "y": 2},
|
||||
{"matrix": [2, 16], "x": 16.5, "y": 2},
|
||||
{"matrix": [2, 17], "x": 17.5, "y": 2},
|
||||
{"matrix": [2, 18], "x": 18.5, "y": 2},
|
||||
{"matrix": [2, 19], "x": 19.5, "y": 2},
|
||||
{"matrix": [2, 20], "x": 20.5, "y": 2},
|
||||
{"matrix": [2, 21], "x": 21.5, "y": 2},
|
||||
{"matrix": [2, 22], "x": 22.5, "y": 2},
|
||||
{"matrix": [2, 23], "x": 23.5, "y": 2},
|
||||
{"matrix": [2, 24], "x": 25, "y": 2},
|
||||
{"matrix": [2, 25], "x": 26, "y": 2},
|
||||
{"matrix": [2, 26], "x": 27, "y": 2},
|
||||
{"matrix": [2, 27], "x": 28, "y": 2},
|
||||
{"matrix": [3, 0], "x": 0, "y": 3.5},
|
||||
{"matrix": [3, 1], "x": 1, "y": 3.5},
|
||||
{"matrix": [3, 2], "x": 2, "y": 3.5},
|
||||
{"matrix": [3, 3], "x": 3, "y": 3.5},
|
||||
{"matrix": [3, 4], "x": 4.5, "y": 3.5, "w": 1.5},
|
||||
{"matrix": [3, 6], "x": 6, "y": 3.5},
|
||||
{"matrix": [3, 7], "x": 7, "y": 3.5},
|
||||
{"matrix": [3, 8], "x": 8, "y": 3.5},
|
||||
{"matrix": [3, 9], "x": 9, "y": 3.5},
|
||||
{"matrix": [3, 10], "x": 10, "y": 3.5},
|
||||
{"matrix": [3, 11], "x": 11, "y": 3.5},
|
||||
{"matrix": [3, 12], "x": 12, "y": 3.5},
|
||||
{"matrix": [3, 13], "x": 13, "y": 3.5},
|
||||
{"matrix": [3, 14], "x": 14, "y": 3.5},
|
||||
{"matrix": [3, 15], "x": 15, "y": 3.5},
|
||||
{"matrix": [3, 16], "x": 16, "y": 3.5},
|
||||
{"matrix": [3, 17], "x": 17, "y": 3.5},
|
||||
{"matrix": [3, 18], "x": 18, "y": 3.5},
|
||||
{"matrix": [3, 19], "x": 19, "y": 3.5},
|
||||
{"matrix": [3, 20], "x": 20, "y": 3.5},
|
||||
{"matrix": [3, 21], "x": 21, "y": 3.5},
|
||||
{"matrix": [3, 22], "x": 22, "y": 3.5},
|
||||
{"matrix": [3, 23], "x": 23, "y": 3.5, "w": 1.5},
|
||||
{"matrix": [3, 24], "x": 25, "y": 3.5},
|
||||
{"matrix": [3, 25], "x": 26, "y": 3.5},
|
||||
{"matrix": [3, 26], "x": 27, "y": 3.5},
|
||||
{"matrix": [3, 27], "x": 28, "y": 3.5},
|
||||
{"matrix": [4, 0], "x": 0, "y": 4.5},
|
||||
{"matrix": [4, 1], "x": 1, "y": 4.5},
|
||||
{"matrix": [4, 2], "x": 2, "y": 4.5},
|
||||
{"matrix": [4, 3], "x": 3, "y": 4.5},
|
||||
{"matrix": [4, 4], "x": 4.5, "y": 4.5},
|
||||
{"matrix": [4, 5], "x": 5.5, "y": 4.5, "w": 1.5},
|
||||
{"matrix": [4, 7], "x": 7, "y": 4.5, "w": 1.5},
|
||||
{"matrix": [4, 8], "x": 8.5, "y": 4.5},
|
||||
{"matrix": [4, 9], "x": 9.5, "y": 4.5},
|
||||
{"matrix": [4, 10], "x": 10.5, "y": 4.5},
|
||||
{"matrix": [4, 11], "x": 11.5, "y": 4.5},
|
||||
{"matrix": [4, 12], "x": 12.5, "y": 4.5},
|
||||
{"matrix": [4, 13], "x": 13.5, "y": 4.5},
|
||||
{"matrix": [4, 14], "x": 14.5, "y": 4.5},
|
||||
{"matrix": [4, 15], "x": 15.5, "y": 4.5},
|
||||
{"matrix": [4, 16], "x": 16.5, "y": 4.5},
|
||||
{"matrix": [4, 17], "x": 17.5, "y": 4.5},
|
||||
{"matrix": [4, 18], "x": 18.5, "y": 4.5},
|
||||
{"matrix": [4, 19], "x": 19.5, "y": 4.5},
|
||||
{"matrix": [4, 20], "x": 20.5, "y": 4.5, "w": 1.5},
|
||||
{"matrix": [4, 22], "x": 22, "y": 4.5, "w": 1.5},
|
||||
{"matrix": [4, 23], "x": 23.5, "y": 4.5},
|
||||
{"matrix": [4, 24], "x": 25, "y": 4.5},
|
||||
{"matrix": [4, 25], "x": 26, "y": 4.5},
|
||||
{"matrix": [4, 26], "x": 27, "y": 4.5},
|
||||
{"matrix": [4, 27], "x": 28, "y": 4.5},
|
||||
{"matrix": [5, 0], "x": 0, "y": 5.5},
|
||||
{"matrix": [5, 1], "x": 1, "y": 5.5},
|
||||
{"matrix": [5, 2], "x": 2, "y": 5.5},
|
||||
{"matrix": [5, 3], "x": 3, "y": 5.5},
|
||||
{"matrix": [5, 4], "x": 4.5, "y": 5.5, "w": 1.5},
|
||||
{"matrix": [5, 6], "x": 6, "y": 5.5, "w": 1.5},
|
||||
{"matrix": [5, 7], "x": 7.5, "y": 5.5, "w": 1.5},
|
||||
{"matrix": [5, 9], "x": 9, "y": 5.5},
|
||||
{"matrix": [5, 10], "x": 10, "y": 5.5},
|
||||
{"matrix": [5, 11], "x": 11, "y": 5.5},
|
||||
{"matrix": [5, 12], "x": 12, "y": 5.5},
|
||||
{"matrix": [5, 13], "x": 13, "y": 5.5},
|
||||
{"matrix": [5, 14], "x": 14, "y": 5.5},
|
||||
{"matrix": [5, 15], "x": 15, "y": 5.5},
|
||||
{"matrix": [5, 16], "x": 16, "y": 5.5},
|
||||
{"matrix": [5, 17], "x": 17, "y": 5.5},
|
||||
{"matrix": [5, 18], "x": 18, "y": 5.5},
|
||||
{"matrix": [5, 19], "x": 19, "y": 5.5},
|
||||
{"matrix": [5, 20], "x": 20, "y": 5.5, "w": 1.5},
|
||||
{"matrix": [5, 21], "x": 21.5, "y": 5.5, "w": 1.5},
|
||||
{"matrix": [5, 23], "x": 23, "y": 5.5, "w": 1.5},
|
||||
{"matrix": [5, 24], "x": 25, "y": 5.5},
|
||||
{"matrix": [5, 25], "x": 26, "y": 5.5},
|
||||
{"matrix": [5, 26], "x": 27, "y": 5.5},
|
||||
{"matrix": [5, 27], "x": 28, "y": 5.5},
|
||||
{"matrix": [6, 0], "x": 0, "y": 6.5},
|
||||
{"matrix": [6, 1], "x": 1, "y": 6.5},
|
||||
{"matrix": [6, 2], "x": 2, "y": 6.5},
|
||||
{"matrix": [6, 3], "x": 3, "y": 6.5},
|
||||
{"matrix": [6, 4], "x": 4.5, "y": 6.5},
|
||||
{"matrix": [6, 5], "x": 5.5, "y": 6.5},
|
||||
{"matrix": [6, 6], "x": 6.5, "y": 6.5, "w": 1.5},
|
||||
{"matrix": [6, 8], "x": 8, "y": 6.5, "w": 1.5},
|
||||
{"matrix": [6, 9], "x": 9.5, "y": 6.5},
|
||||
{"matrix": [6, 10], "x": 10.5, "y": 6.5},
|
||||
{"matrix": [6, 11], "x": 11.5, "y": 6.5},
|
||||
{"matrix": [6, 12], "x": 12.5, "y": 6.5},
|
||||
{"matrix": [6, 13], "x": 13.5, "y": 6.5},
|
||||
{"matrix": [6, 14], "x": 14.5, "y": 6.5},
|
||||
{"matrix": [6, 15], "x": 15.5, "y": 6.5},
|
||||
{"matrix": [6, 16], "x": 16.5, "y": 6.5},
|
||||
{"matrix": [6, 17], "x": 17.5, "y": 6.5},
|
||||
{"matrix": [6, 18], "x": 18.5, "y": 6.5},
|
||||
{"matrix": [6, 19], "x": 19.5, "y": 6.5, "w": 1.5},
|
||||
{"matrix": [6, 21], "x": 21, "y": 6.5, "w": 1.5},
|
||||
{"matrix": [6, 22], "x": 22.5, "y": 6.5},
|
||||
{"matrix": [6, 23], "x": 23.5, "y": 6.5},
|
||||
{"matrix": [6, 24], "x": 25, "y": 6.5},
|
||||
{"matrix": [6, 25], "x": 26, "y": 6.5},
|
||||
{"matrix": [6, 26], "x": 27, "y": 6.5},
|
||||
{"matrix": [6, 27], "x": 28, "y": 6.5},
|
||||
{"matrix": [7, 0], "x": 0, "y": 7.5},
|
||||
{"matrix": [7, 1], "x": 1, "y": 7.5},
|
||||
{"matrix": [7, 2], "x": 2, "y": 7.5},
|
||||
{"matrix": [7, 3], "x": 3, "y": 7.5},
|
||||
{"matrix": [7, 4], "x": 4.5, "y": 7.5},
|
||||
{"matrix": [7, 5], "x": 5.5, "y": 7.5},
|
||||
{"matrix": [7, 6], "x": 6.5, "y": 7.5},
|
||||
{"matrix": [7, 7], "x": 7.5, "y": 7.5},
|
||||
{"matrix": [7, 8], "x": 8.5, "y": 7.5, "w": 1.5},
|
||||
{"matrix": [7, 10], "x": 10, "y": 7.5},
|
||||
{"matrix": [7, 11], "x": 11, "y": 7.5, "w": 1.5},
|
||||
{"matrix": [7, 12], "x": 12.5, "y": 7.5, "w": 1.5},
|
||||
{"matrix": [7, 14], "x": 14, "y": 7.5},
|
||||
{"matrix": [7, 15], "x": 15, "y": 7.5, "w": 1.5},
|
||||
{"matrix": [7, 16], "x": 16.5, "y": 7.5, "w": 1.5},
|
||||
{"matrix": [7, 18], "x": 18, "y": 7.5},
|
||||
{"matrix": [7, 19], "x": 19, "y": 7.5, "w": 1.5},
|
||||
{"matrix": [7, 20], "x": 20.5, "y": 7.5},
|
||||
{"matrix": [7, 21], "x": 21.5, "y": 7.5},
|
||||
{"matrix": [7, 22], "x": 22.5, "y": 7.5},
|
||||
{"matrix": [7, 23], "x": 23.5, "y": 7.5},
|
||||
{"matrix": [7, 24], "x": 25, "y": 7.5},
|
||||
{"matrix": [7, 25], "x": 26, "y": 7.5},
|
||||
{"matrix": [7, 26], "x": 27, "y": 7.5},
|
||||
{"matrix": [7, 27], "x": 28, "y": 7.5},
|
||||
{"matrix": [7, 13], "x": 11, "y": 8.5, "w": 7}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
111
keyboards/yiancardesigns/hyper7/v4/keymaps/default/keymap.c
Normal file
111
keyboards/yiancardesigns/hyper7/v4/keymaps/default/keymap.c
Normal file
@@ -0,0 +1,111 @@
|
||||
// Copyright 2025 Yiancar-Designs, Bit-Shifter
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
enum my_keycodes {
|
||||
MACRO = QK_USER_0,
|
||||
QUOTE,
|
||||
CLRIN,
|
||||
SQUAR,
|
||||
CIRCL,
|
||||
TRIAN,
|
||||
DIAMO,
|
||||
WRITE,
|
||||
TTY,
|
||||
PLUSM,
|
||||
MODE,
|
||||
};
|
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
switch (keycode) {
|
||||
case MACRO:
|
||||
if (record->event.pressed) {
|
||||
// when keycode MACRO is pressed
|
||||
SEND_STRING("Hyper7 is the best thing ever!");
|
||||
}
|
||||
break;
|
||||
case QUOTE:
|
||||
if (record->event.pressed) {
|
||||
// when keycode QUOTE is pressed
|
||||
SEND_STRING("\"\"" SS_TAP(X_LEFT));
|
||||
}
|
||||
break;
|
||||
case CLRIN:
|
||||
if (record->event.pressed) {
|
||||
// when keycode CLRIN is pressed
|
||||
SEND_STRING(SS_LCTL("a") SS_TAP(X_DEL));
|
||||
}
|
||||
break;
|
||||
case SQUAR:
|
||||
if (record->event.pressed) {
|
||||
// when keycode SQUAR is pressed
|
||||
SEND_STRING("I like squares");
|
||||
}
|
||||
break;
|
||||
case CIRCL:
|
||||
if (record->event.pressed) {
|
||||
// when keycode CIRCL is pressed
|
||||
SEND_STRING("I like circles");
|
||||
}
|
||||
break;
|
||||
case TRIAN:
|
||||
if (record->event.pressed) {
|
||||
// when keycode TRIAN is pressed
|
||||
SEND_STRING("I like the illuminati");
|
||||
}
|
||||
break;
|
||||
case DIAMO:
|
||||
if (record->event.pressed) {
|
||||
// when keycode DIAMO is pressed
|
||||
SEND_STRING("Everyone likes diamonds");
|
||||
}
|
||||
break;
|
||||
case WRITE:
|
||||
if (record->event.pressed) {
|
||||
// when keycode WRITE is pressed
|
||||
SEND_STRING(SS_LGUI("x") "notepad" SS_TAP(X_ENT));
|
||||
}
|
||||
break;
|
||||
case TTY:
|
||||
if (record->event.pressed) {
|
||||
// when keycode TTY is pressed
|
||||
SEND_STRING(SS_LGUI("x") "cmd" SS_TAP(X_ENT));
|
||||
}
|
||||
break;
|
||||
case PLUSM:
|
||||
if (record->event.pressed) {
|
||||
// when keycode PLUSM is pressed
|
||||
SEND_STRING("+-");
|
||||
}
|
||||
case MODE:
|
||||
if (record->event.pressed) {
|
||||
// when keycode MODE is pressed
|
||||
SEND_STRING("Mode");
|
||||
}
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
[0] = LAYOUT_modern(
|
||||
G(KC_F1), MACRO, RCS(KC_ESC), QUOTE, KC_INS, CLRIN, G(KC_D), C(KC_S), C(KC_C), A(KC_F4), KC_PAUS, C(KC_P), G(C(KC_Q)), LCA(KC_DEL),
|
||||
G(KC_X), KC_WHOM, G(KC_PAUS), C(KC_R), A(KC_TAB), SQUAR, CIRCL, TRIAN, DIAMO, C(KC_Y), LAG(KC_R), RCS(KC_ESC), G(KC_L), KC_CAPS,
|
||||
KC_F1, KC_F2, A(KC_F4), G(KC_R), KC_ESC, KC_QUES, KC_EXLM, KC_AT, KC_AT, KC_AT, KC_AT, KC_GRV, KC_GRV, KC_GRV, KC_GRV, KC_UNDS, KC_LABK, KC_RABK, KC_PIPE, KC_LCBR, KC_RCBR, C(KC_ENT), KC_CIRC, KC_PERC, KC_HASH, KC_DLR,
|
||||
KC_F3, KC_F4, C(KC_F), WRITE, LSFT(KC_N), PLUSM, KC_TILD, 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_NUBS, KC_LBRC, KC_RBRC, C(KC_Z), KC_PMNS, KC_PSLS, KC_PAST, KC_PMNS,
|
||||
KC_F5, KC_F6, C(KC_M), C(KC_Z), C(KC_V), C(KC_X), KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LCBR, KC_RCBR, KC_BSPC, KC_CLEAR, C(KC_HOME),KC_P7, KC_P8, KC_P9, KC_PPLS,
|
||||
KC_F7, KC_F8, C(KC_A), KC_F12, MO(1), MODE, KC_PGUP, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_COLN, KC_QUOT, KC_ENT, KC_HOME, KC_PGDN, KC_P4, KC_P5, KC_P6, KC_AMPR,
|
||||
KC_F9, KC_F10, TTY, G(KC_L), C(KC_HOME),KC_END, G(KC_DOT), KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, G(KC_DOT), KC_UP, KC_LGUI, KC_P1, KC_P2, KC_P3, KC_EQL,
|
||||
KC_F11, KC_F12, KC_HOME, C(KC_END), C(KC_LEFT),C(KC_RGHT),G(KC_DOWN),KC_HYPR, KC_LALT, KC_SPC, KC_RGUI, KC_HYPR, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL, KC_P0, KC_PDOT, KC_ENTER
|
||||
),
|
||||
[1] = LAYOUT_modern(
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
|
||||
),
|
||||
};
|
||||
25
keyboards/yiancardesigns/hyper7/v4/readme.md
Normal file
25
keyboards/yiancardesigns/hyper7/v4/readme.md
Normal file
@@ -0,0 +1,25 @@
|
||||
# Hyper7 v4
|
||||
|
||||
This is a very big pcb... It supports VIA.
|
||||
|
||||
* Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar)
|
||||
* Hardware Supported: A very big keyboard with STM32F072RB
|
||||
* Hardware Availability: https://mechboards.co.uk/
|
||||
|
||||
Make example for this keyboard (after setting up your build environment):
|
||||
|
||||
make yiancardesigns/hyper7/v4:default
|
||||
|
||||
Flashing example for this keyboard:
|
||||
|
||||
make yiancardesigns/hyper7/v4: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 (3,0) in the matrix (F3) 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
|
||||
20
keyboards/zeix/singa/rubrehaku/config.h
Normal file
20
keyboards/zeix/singa/rubrehaku/config.h
Normal file
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
Copyright 2024 zeix (@itsme-zeix)
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
|
||||
#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 500U
|
||||
694
keyboards/zeix/singa/rubrehaku/keyboard.json
Normal file
694
keyboards/zeix/singa/rubrehaku/keyboard.json
Normal file
@@ -0,0 +1,694 @@
|
||||
{
|
||||
"manufacturer": "KLC",
|
||||
"keyboard_name": "Rubrehaku",
|
||||
"maintainer": "itsme-zeix",
|
||||
"bootloader": "rp2040",
|
||||
"diode_direction": "COL2ROW",
|
||||
"features": {
|
||||
"bootmagic": true,
|
||||
"extrakey": true,
|
||||
"mousekey": true,
|
||||
"nkro": true,
|
||||
"rgblight": true
|
||||
},
|
||||
"indicators": {
|
||||
"caps_lock": "GP29"
|
||||
},
|
||||
"matrix_pins": {
|
||||
"cols": ["GP7", "GP6", "GP5", "GP4", "GP3", "GP2", "GP1", "GP0"],
|
||||
"rows": ["GP27", "GP28", "GP10", "GP11", "GP18", "GP19", "GP23", "GP24", "GP25", "GP26"]
|
||||
},
|
||||
"processor": "RP2040",
|
||||
"rgblight": {
|
||||
"animations": {
|
||||
"alternating": true,
|
||||
"breathing": true,
|
||||
"christmas": true,
|
||||
"knight": true,
|
||||
"rainbow_mood": true,
|
||||
"rainbow_swirl": true,
|
||||
"snake": true,
|
||||
"static_gradient": true,
|
||||
"twinkle": true
|
||||
},
|
||||
"default": {
|
||||
"hue": 210,
|
||||
"sat": 100,
|
||||
"val": 8
|
||||
},
|
||||
"driver": "ws2812",
|
||||
"led_count": 16,
|
||||
"sleep": true
|
||||
},
|
||||
"url": "https://klc-playground.com",
|
||||
"usb": {
|
||||
"device_version": "0.0.1",
|
||||
"pid": "0x8889",
|
||||
"vid": "0x4C27"
|
||||
},
|
||||
"ws2812": {
|
||||
"driver": "vendor",
|
||||
"pin": "GP20"
|
||||
},
|
||||
"layouts": {
|
||||
"LAYOUT_all": {
|
||||
"layout": [
|
||||
{"matrix": [0, 0], "x": 0, "y": 0},
|
||||
{"matrix": [1, 0], "x": 1, "y": 0},
|
||||
{"matrix": [0, 1], "x": 2, "y": 0},
|
||||
{"matrix": [1, 1], "x": 3, "y": 0},
|
||||
{"matrix": [0, 2], "x": 4, "y": 0},
|
||||
{"matrix": [1, 2], "x": 5, "y": 0},
|
||||
{"matrix": [0, 3], "x": 6, "y": 0},
|
||||
{"matrix": [1, 3], "x": 7, "y": 0},
|
||||
{"matrix": [0, 4], "x": 8, "y": 0},
|
||||
{"matrix": [1, 4], "x": 9, "y": 0},
|
||||
{"matrix": [0, 5], "x": 10, "y": 0},
|
||||
{"matrix": [1, 5], "x": 11, "y": 0},
|
||||
{"matrix": [0, 6], "x": 12, "y": 0},
|
||||
{"matrix": [1, 6], "x": 13, "y": 0},
|
||||
{"matrix": [0, 7], "x": 14, "y": 0},
|
||||
{"matrix": [2, 0], "x": 0, "y": 1, "w": 1.5},
|
||||
{"matrix": [3, 0], "x": 1.5, "y": 1},
|
||||
{"matrix": [2, 1], "x": 2.5, "y": 1},
|
||||
{"matrix": [3, 1], "x": 3.5, "y": 1},
|
||||
{"matrix": [2, 2], "x": 4.5, "y": 1},
|
||||
{"matrix": [3, 2], "x": 5.5, "y": 1},
|
||||
{"matrix": [2, 3], "x": 6.5, "y": 1},
|
||||
{"matrix": [3, 3], "x": 7.5, "y": 1},
|
||||
{"matrix": [2, 4], "x": 8.5, "y": 1},
|
||||
{"matrix": [3, 4], "x": 9.5, "y": 1},
|
||||
{"matrix": [2, 5], "x": 10.5, "y": 1},
|
||||
{"matrix": [3, 5], "x": 11.5, "y": 1},
|
||||
{"matrix": [2, 6], "x": 12.5, "y": 1},
|
||||
{"matrix": [3, 6], "x": 13.5, "y": 1, "w": 1.5},
|
||||
{"matrix": [3, 7], "x": 15, "y": 1},
|
||||
{"matrix": [4, 0], "x": 0, "y": 2, "w": 1.75},
|
||||
{"matrix": [5, 0], "x": 1.75, "y": 2},
|
||||
{"matrix": [4, 1], "x": 2.75, "y": 2},
|
||||
{"matrix": [5, 1], "x": 3.75, "y": 2},
|
||||
{"matrix": [4, 2], "x": 4.75, "y": 2},
|
||||
{"matrix": [5, 2], "x": 5.75, "y": 2},
|
||||
{"matrix": [4, 3], "x": 6.75, "y": 2},
|
||||
{"matrix": [5, 3], "x": 7.75, "y": 2},
|
||||
{"matrix": [4, 4], "x": 8.75, "y": 2},
|
||||
{"matrix": [5, 4], "x": 9.75, "y": 2},
|
||||
{"matrix": [4, 5], "x": 10.75, "y": 2},
|
||||
{"matrix": [5, 5], "x": 11.75, "y": 2},
|
||||
{"matrix": [4, 6], "x": 12.75, "y": 2},
|
||||
{"matrix": [5, 6], "x": 13.75, "y": 2, "w": 1.25},
|
||||
{"matrix": [5, 7], "x": 15, "y": 2},
|
||||
{"matrix": [6, 0], "x": 0, "y": 3, "w": 1.25},
|
||||
{"matrix": [7, 0], "x": 1.25, "y": 3},
|
||||
{"matrix": [6, 1], "x": 2.25, "y": 3},
|
||||
{"matrix": [7, 1], "x": 3.25, "y": 3},
|
||||
{"matrix": [6, 2], "x": 4.25, "y": 3},
|
||||
{"matrix": [7, 2], "x": 5.25, "y": 3},
|
||||
{"matrix": [6, 3], "x": 6.25, "y": 3},
|
||||
{"matrix": [7, 3], "x": 7.25, "y": 3},
|
||||
{"matrix": [6, 4], "x": 8.25, "y": 3},
|
||||
{"matrix": [7, 4], "x": 9.25, "y": 3},
|
||||
{"matrix": [6, 5], "x": 10.25, "y": 3},
|
||||
{"matrix": [7, 5], "x": 11.25, "y": 3},
|
||||
{"matrix": [6, 6], "x": 12.25, "y": 3, "w": 1.75},
|
||||
{"matrix": [7, 6], "x": 14, "y": 3},
|
||||
{"matrix": [7, 7], "x": 15, "y": 3},
|
||||
{"matrix": [8, 0], "x": 0, "y": 4, "w": 1.25},
|
||||
{"matrix": [9, 0], "x": 1.25, "y": 4, "w": 1.25},
|
||||
{"matrix": [8, 1], "x": 2.5, "y": 4, "w": 1.25},
|
||||
{"matrix": [9, 2], "x": 3.75, "y": 4, "w": 2.75},
|
||||
{"matrix": [8, 3], "x": 6.5, "y": 4, "w": 1.25},
|
||||
{"matrix": [9, 4], "x": 7.75, "y": 4, "w": 2.25},
|
||||
{"matrix": [8, 5], "x": 10, "y": 4, "w": 1.25},
|
||||
{"matrix": [9, 5], "x": 11.25, "y": 4, "w": 1.25},
|
||||
{"matrix": [8, 6], "x": 13, "y": 4},
|
||||
{"matrix": [9, 6], "x": 14, "y": 4},
|
||||
{"matrix": [9, 7], "x": 15, "y": 4}
|
||||
]
|
||||
},
|
||||
"LAYOUT_ansi": {
|
||||
"layout": [
|
||||
{"matrix": [0, 0], "x": 0, "y": 0},
|
||||
{"matrix": [1, 0], "x": 1, "y": 0},
|
||||
{"matrix": [0, 1], "x": 2, "y": 0},
|
||||
{"matrix": [1, 1], "x": 3, "y": 0},
|
||||
{"matrix": [0, 2], "x": 4, "y": 0},
|
||||
{"matrix": [1, 2], "x": 5, "y": 0},
|
||||
{"matrix": [0, 3], "x": 6, "y": 0},
|
||||
{"matrix": [1, 3], "x": 7, "y": 0},
|
||||
{"matrix": [0, 4], "x": 8, "y": 0},
|
||||
{"matrix": [1, 4], "x": 9, "y": 0},
|
||||
{"matrix": [0, 5], "x": 10, "y": 0},
|
||||
{"matrix": [1, 5], "x": 11, "y": 0},
|
||||
{"matrix": [0, 6], "x": 12, "y": 0},
|
||||
{"matrix": [0, 7], "x": 13, "y": 0, "w": 2},
|
||||
{"matrix": [2, 0], "x": 0, "y": 1, "w": 1.5},
|
||||
{"matrix": [3, 0], "x": 1.5, "y": 1},
|
||||
{"matrix": [2, 1], "x": 2.5, "y": 1},
|
||||
{"matrix": [3, 1], "x": 3.5, "y": 1},
|
||||
{"matrix": [2, 2], "x": 4.5, "y": 1},
|
||||
{"matrix": [3, 2], "x": 5.5, "y": 1},
|
||||
{"matrix": [2, 3], "x": 6.5, "y": 1},
|
||||
{"matrix": [3, 3], "x": 7.5, "y": 1},
|
||||
{"matrix": [2, 4], "x": 8.5, "y": 1},
|
||||
{"matrix": [3, 4], "x": 9.5, "y": 1},
|
||||
{"matrix": [2, 5], "x": 10.5, "y": 1},
|
||||
{"matrix": [3, 5], "x": 11.5, "y": 1},
|
||||
{"matrix": [2, 6], "x": 12.5, "y": 1},
|
||||
{"matrix": [3, 6], "x": 13.5, "y": 1, "w": 1.5},
|
||||
{"matrix": [3, 7], "x": 15, "y": 1},
|
||||
{"matrix": [4, 0], "x": 0, "y": 2, "w": 1.75},
|
||||
{"matrix": [5, 0], "x": 1.75, "y": 2},
|
||||
{"matrix": [4, 1], "x": 2.75, "y": 2},
|
||||
{"matrix": [5, 1], "x": 3.75, "y": 2},
|
||||
{"matrix": [4, 2], "x": 4.75, "y": 2},
|
||||
{"matrix": [5, 2], "x": 5.75, "y": 2},
|
||||
{"matrix": [4, 3], "x": 6.75, "y": 2},
|
||||
{"matrix": [5, 3], "x": 7.75, "y": 2},
|
||||
{"matrix": [4, 4], "x": 8.75, "y": 2},
|
||||
{"matrix": [5, 4], "x": 9.75, "y": 2},
|
||||
{"matrix": [4, 5], "x": 10.75, "y": 2},
|
||||
{"matrix": [5, 5], "x": 11.75, "y": 2},
|
||||
{"matrix": [5, 6], "x": 12.75, "y": 2, "w": 2.25},
|
||||
{"matrix": [5, 7], "x": 15, "y": 2},
|
||||
{"matrix": [6, 0], "x": 0, "y": 3, "w": 2.25},
|
||||
{"matrix": [6, 1], "x": 2.25, "y": 3},
|
||||
{"matrix": [7, 1], "x": 3.25, "y": 3},
|
||||
{"matrix": [6, 2], "x": 4.25, "y": 3},
|
||||
{"matrix": [7, 2], "x": 5.25, "y": 3},
|
||||
{"matrix": [6, 3], "x": 6.25, "y": 3},
|
||||
{"matrix": [7, 3], "x": 7.25, "y": 3},
|
||||
{"matrix": [6, 4], "x": 8.25, "y": 3},
|
||||
{"matrix": [7, 4], "x": 9.25, "y": 3},
|
||||
{"matrix": [6, 5], "x": 10.25, "y": 3},
|
||||
{"matrix": [7, 5], "x": 11.25, "y": 3},
|
||||
{"matrix": [6, 6], "x": 12.25, "y": 3, "w": 1.75},
|
||||
{"matrix": [7, 6], "x": 14, "y": 3},
|
||||
{"matrix": [7, 7], "x": 15, "y": 3},
|
||||
{"matrix": [8, 0], "x": 0, "y": 4, "w": 1.25},
|
||||
{"matrix": [9, 0], "x": 1.25, "y": 4, "w": 1.25},
|
||||
{"matrix": [8, 1], "x": 2.5, "y": 4, "w": 1.25},
|
||||
{"matrix": [8, 3], "x": 3.75, "y": 4, "w": 6.25},
|
||||
{"matrix": [8, 5], "x": 10, "y": 4, "w": 1.25},
|
||||
{"matrix": [9, 5], "x": 11.25, "y": 4, "w": 1.25},
|
||||
{"matrix": [8, 6], "x": 13, "y": 4},
|
||||
{"matrix": [9, 6], "x": 14, "y": 4},
|
||||
{"matrix": [9, 7], "x": 15, "y": 4}
|
||||
]
|
||||
},
|
||||
"LAYOUT_ansi_split_bs": {
|
||||
"layout": [
|
||||
{"matrix": [0, 0], "x": 0, "y": 0},
|
||||
{"matrix": [1, 0], "x": 1, "y": 0},
|
||||
{"matrix": [0, 1], "x": 2, "y": 0},
|
||||
{"matrix": [1, 1], "x": 3, "y": 0},
|
||||
{"matrix": [0, 2], "x": 4, "y": 0},
|
||||
{"matrix": [1, 2], "x": 5, "y": 0},
|
||||
{"matrix": [0, 3], "x": 6, "y": 0},
|
||||
{"matrix": [1, 3], "x": 7, "y": 0},
|
||||
{"matrix": [0, 4], "x": 8, "y": 0},
|
||||
{"matrix": [1, 4], "x": 9, "y": 0},
|
||||
{"matrix": [0, 5], "x": 10, "y": 0},
|
||||
{"matrix": [1, 5], "x": 11, "y": 0},
|
||||
{"matrix": [0, 6], "x": 12, "y": 0},
|
||||
{"matrix": [1, 6], "x": 13, "y": 0},
|
||||
{"matrix": [0, 7], "x": 14, "y": 0},
|
||||
{"matrix": [2, 0], "x": 0, "y": 1, "w": 1.5},
|
||||
{"matrix": [3, 0], "x": 1.5, "y": 1},
|
||||
{"matrix": [2, 1], "x": 2.5, "y": 1},
|
||||
{"matrix": [3, 1], "x": 3.5, "y": 1},
|
||||
{"matrix": [2, 2], "x": 4.5, "y": 1},
|
||||
{"matrix": [3, 2], "x": 5.5, "y": 1},
|
||||
{"matrix": [2, 3], "x": 6.5, "y": 1},
|
||||
{"matrix": [3, 3], "x": 7.5, "y": 1},
|
||||
{"matrix": [2, 4], "x": 8.5, "y": 1},
|
||||
{"matrix": [3, 4], "x": 9.5, "y": 1},
|
||||
{"matrix": [2, 5], "x": 10.5, "y": 1},
|
||||
{"matrix": [3, 5], "x": 11.5, "y": 1},
|
||||
{"matrix": [2, 6], "x": 12.5, "y": 1},
|
||||
{"matrix": [3, 6], "x": 13.5, "y": 1, "w": 1.5},
|
||||
{"matrix": [3, 7], "x": 15, "y": 1},
|
||||
{"matrix": [4, 0], "x": 0, "y": 2, "w": 1.75},
|
||||
{"matrix": [5, 0], "x": 1.75, "y": 2},
|
||||
{"matrix": [4, 1], "x": 2.75, "y": 2},
|
||||
{"matrix": [5, 1], "x": 3.75, "y": 2},
|
||||
{"matrix": [4, 2], "x": 4.75, "y": 2},
|
||||
{"matrix": [5, 2], "x": 5.75, "y": 2},
|
||||
{"matrix": [4, 3], "x": 6.75, "y": 2},
|
||||
{"matrix": [5, 3], "x": 7.75, "y": 2},
|
||||
{"matrix": [4, 4], "x": 8.75, "y": 2},
|
||||
{"matrix": [5, 4], "x": 9.75, "y": 2},
|
||||
{"matrix": [4, 5], "x": 10.75, "y": 2},
|
||||
{"matrix": [5, 5], "x": 11.75, "y": 2},
|
||||
{"matrix": [5, 6], "x": 12.75, "y": 2, "w": 2.25},
|
||||
{"matrix": [5, 7], "x": 15, "y": 2},
|
||||
{"matrix": [6, 0], "x": 0, "y": 3, "w": 2.25},
|
||||
{"matrix": [6, 1], "x": 2.25, "y": 3},
|
||||
{"matrix": [7, 1], "x": 3.25, "y": 3},
|
||||
{"matrix": [6, 2], "x": 4.25, "y": 3},
|
||||
{"matrix": [7, 2], "x": 5.25, "y": 3},
|
||||
{"matrix": [6, 3], "x": 6.25, "y": 3},
|
||||
{"matrix": [7, 3], "x": 7.25, "y": 3},
|
||||
{"matrix": [6, 4], "x": 8.25, "y": 3},
|
||||
{"matrix": [7, 4], "x": 9.25, "y": 3},
|
||||
{"matrix": [6, 5], "x": 10.25, "y": 3},
|
||||
{"matrix": [7, 5], "x": 11.25, "y": 3},
|
||||
{"matrix": [6, 6], "x": 12.25, "y": 3, "w": 1.75},
|
||||
{"matrix": [7, 6], "x": 14, "y": 3},
|
||||
{"matrix": [7, 7], "x": 15, "y": 3},
|
||||
{"matrix": [8, 0], "x": 0, "y": 4, "w": 1.25},
|
||||
{"matrix": [9, 0], "x": 1.25, "y": 4, "w": 1.25},
|
||||
{"matrix": [8, 1], "x": 2.5, "y": 4, "w": 1.25},
|
||||
{"matrix": [8, 3], "x": 3.75, "y": 4, "w": 6.25},
|
||||
{"matrix": [8, 5], "x": 10, "y": 4, "w": 1.25},
|
||||
{"matrix": [9, 5], "x": 11.25, "y": 4, "w": 1.25},
|
||||
{"matrix": [8, 6], "x": 13, "y": 4},
|
||||
{"matrix": [9, 6], "x": 14, "y": 4},
|
||||
{"matrix": [9, 7], "x": 15, "y": 4}
|
||||
]
|
||||
},
|
||||
"LAYOUT_ansi_tsangan": {
|
||||
"layout": [
|
||||
{"matrix": [0, 0], "x": 0, "y": 0},
|
||||
{"matrix": [1, 0], "x": 1, "y": 0},
|
||||
{"matrix": [0, 1], "x": 2, "y": 0},
|
||||
{"matrix": [1, 1], "x": 3, "y": 0},
|
||||
{"matrix": [0, 2], "x": 4, "y": 0},
|
||||
{"matrix": [1, 2], "x": 5, "y": 0},
|
||||
{"matrix": [0, 3], "x": 6, "y": 0},
|
||||
{"matrix": [1, 3], "x": 7, "y": 0},
|
||||
{"matrix": [0, 4], "x": 8, "y": 0},
|
||||
{"matrix": [1, 4], "x": 9, "y": 0},
|
||||
{"matrix": [0, 5], "x": 10, "y": 0},
|
||||
{"matrix": [1, 5], "x": 11, "y": 0},
|
||||
{"matrix": [0, 6], "x": 12, "y": 0},
|
||||
{"matrix": [0, 7], "x": 13, "y": 0, "w": 2},
|
||||
{"matrix": [2, 0], "x": 0, "y": 1, "w": 1.5},
|
||||
{"matrix": [3, 0], "x": 1.5, "y": 1},
|
||||
{"matrix": [2, 1], "x": 2.5, "y": 1},
|
||||
{"matrix": [3, 1], "x": 3.5, "y": 1},
|
||||
{"matrix": [2, 2], "x": 4.5, "y": 1},
|
||||
{"matrix": [3, 2], "x": 5.5, "y": 1},
|
||||
{"matrix": [2, 3], "x": 6.5, "y": 1},
|
||||
{"matrix": [3, 3], "x": 7.5, "y": 1},
|
||||
{"matrix": [2, 4], "x": 8.5, "y": 1},
|
||||
{"matrix": [3, 4], "x": 9.5, "y": 1},
|
||||
{"matrix": [2, 5], "x": 10.5, "y": 1},
|
||||
{"matrix": [3, 5], "x": 11.5, "y": 1},
|
||||
{"matrix": [2, 6], "x": 12.5, "y": 1},
|
||||
{"matrix": [3, 6], "x": 13.5, "y": 1, "w": 1.5},
|
||||
{"matrix": [3, 7], "x": 15, "y": 1},
|
||||
{"matrix": [4, 0], "x": 0, "y": 2, "w": 1.75},
|
||||
{"matrix": [5, 0], "x": 1.75, "y": 2},
|
||||
{"matrix": [4, 1], "x": 2.75, "y": 2},
|
||||
{"matrix": [5, 1], "x": 3.75, "y": 2},
|
||||
{"matrix": [4, 2], "x": 4.75, "y": 2},
|
||||
{"matrix": [5, 2], "x": 5.75, "y": 2},
|
||||
{"matrix": [4, 3], "x": 6.75, "y": 2},
|
||||
{"matrix": [5, 3], "x": 7.75, "y": 2},
|
||||
{"matrix": [4, 4], "x": 8.75, "y": 2},
|
||||
{"matrix": [5, 4], "x": 9.75, "y": 2},
|
||||
{"matrix": [4, 5], "x": 10.75, "y": 2},
|
||||
{"matrix": [5, 5], "x": 11.75, "y": 2},
|
||||
{"matrix": [5, 6], "x": 12.75, "y": 2, "w": 2.25},
|
||||
{"matrix": [5, 7], "x": 15, "y": 2},
|
||||
{"matrix": [6, 0], "x": 0, "y": 3, "w": 2.25},
|
||||
{"matrix": [6, 1], "x": 2.25, "y": 3},
|
||||
{"matrix": [7, 1], "x": 3.25, "y": 3},
|
||||
{"matrix": [6, 2], "x": 4.25, "y": 3},
|
||||
{"matrix": [7, 2], "x": 5.25, "y": 3},
|
||||
{"matrix": [6, 3], "x": 6.25, "y": 3},
|
||||
{"matrix": [7, 3], "x": 7.25, "y": 3},
|
||||
{"matrix": [6, 4], "x": 8.25, "y": 3},
|
||||
{"matrix": [7, 4], "x": 9.25, "y": 3},
|
||||
{"matrix": [6, 5], "x": 10.25, "y": 3},
|
||||
{"matrix": [7, 5], "x": 11.25, "y": 3},
|
||||
{"matrix": [6, 6], "x": 12.25, "y": 3, "w": 1.75},
|
||||
{"matrix": [7, 6], "x": 14, "y": 3},
|
||||
{"matrix": [7, 7], "x": 15, "y": 3},
|
||||
{"matrix": [8, 0], "x": 0, "y": 4, "w": 1.5},
|
||||
{"matrix": [9, 0], "x": 1.5, "y": 4},
|
||||
{"matrix": [8, 1], "x": 2.5, "y": 4, "w": 1.5},
|
||||
{"matrix": [8, 3], "x": 4, "y": 4, "w": 7},
|
||||
{"matrix": [8, 5], "x": 11, "y": 4, "w": 1.5},
|
||||
{"matrix": [8, 6], "x": 13, "y": 4},
|
||||
{"matrix": [9, 6], "x": 14, "y": 4},
|
||||
{"matrix": [9, 7], "x": 15, "y": 4}
|
||||
]
|
||||
},
|
||||
"LAYOUT_ansi_tsangan_split_bs": {
|
||||
"layout": [
|
||||
{"matrix": [0, 0], "x": 0, "y": 0},
|
||||
{"matrix": [1, 0], "x": 1, "y": 0},
|
||||
{"matrix": [0, 1], "x": 2, "y": 0},
|
||||
{"matrix": [1, 1], "x": 3, "y": 0},
|
||||
{"matrix": [0, 2], "x": 4, "y": 0},
|
||||
{"matrix": [1, 2], "x": 5, "y": 0},
|
||||
{"matrix": [0, 3], "x": 6, "y": 0},
|
||||
{"matrix": [1, 3], "x": 7, "y": 0},
|
||||
{"matrix": [0, 4], "x": 8, "y": 0},
|
||||
{"matrix": [1, 4], "x": 9, "y": 0},
|
||||
{"matrix": [0, 5], "x": 10, "y": 0},
|
||||
{"matrix": [1, 5], "x": 11, "y": 0},
|
||||
{"matrix": [0, 6], "x": 12, "y": 0},
|
||||
{"matrix": [1, 6], "x": 13, "y": 0},
|
||||
{"matrix": [0, 7], "x": 14, "y": 0},
|
||||
{"matrix": [2, 0], "x": 0, "y": 1, "w": 1.5},
|
||||
{"matrix": [3, 0], "x": 1.5, "y": 1},
|
||||
{"matrix": [2, 1], "x": 2.5, "y": 1},
|
||||
{"matrix": [3, 1], "x": 3.5, "y": 1},
|
||||
{"matrix": [2, 2], "x": 4.5, "y": 1},
|
||||
{"matrix": [3, 2], "x": 5.5, "y": 1},
|
||||
{"matrix": [2, 3], "x": 6.5, "y": 1},
|
||||
{"matrix": [3, 3], "x": 7.5, "y": 1},
|
||||
{"matrix": [2, 4], "x": 8.5, "y": 1},
|
||||
{"matrix": [3, 4], "x": 9.5, "y": 1},
|
||||
{"matrix": [2, 5], "x": 10.5, "y": 1},
|
||||
{"matrix": [3, 5], "x": 11.5, "y": 1},
|
||||
{"matrix": [2, 6], "x": 12.5, "y": 1},
|
||||
{"matrix": [3, 6], "x": 13.5, "y": 1, "w": 1.5},
|
||||
{"matrix": [3, 7], "x": 15, "y": 1},
|
||||
{"matrix": [4, 0], "x": 0, "y": 2, "w": 1.75},
|
||||
{"matrix": [5, 0], "x": 1.75, "y": 2},
|
||||
{"matrix": [4, 1], "x": 2.75, "y": 2},
|
||||
{"matrix": [5, 1], "x": 3.75, "y": 2},
|
||||
{"matrix": [4, 2], "x": 4.75, "y": 2},
|
||||
{"matrix": [5, 2], "x": 5.75, "y": 2},
|
||||
{"matrix": [4, 3], "x": 6.75, "y": 2},
|
||||
{"matrix": [5, 3], "x": 7.75, "y": 2},
|
||||
{"matrix": [4, 4], "x": 8.75, "y": 2},
|
||||
{"matrix": [5, 4], "x": 9.75, "y": 2},
|
||||
{"matrix": [4, 5], "x": 10.75, "y": 2},
|
||||
{"matrix": [5, 5], "x": 11.75, "y": 2},
|
||||
{"matrix": [5, 6], "x": 12.75, "y": 2, "w": 2.25},
|
||||
{"matrix": [5, 7], "x": 15, "y": 2},
|
||||
{"matrix": [6, 0], "x": 0, "y": 3, "w": 2.25},
|
||||
{"matrix": [6, 1], "x": 2.25, "y": 3},
|
||||
{"matrix": [7, 1], "x": 3.25, "y": 3},
|
||||
{"matrix": [6, 2], "x": 4.25, "y": 3},
|
||||
{"matrix": [7, 2], "x": 5.25, "y": 3},
|
||||
{"matrix": [6, 3], "x": 6.25, "y": 3},
|
||||
{"matrix": [7, 3], "x": 7.25, "y": 3},
|
||||
{"matrix": [6, 4], "x": 8.25, "y": 3},
|
||||
{"matrix": [7, 4], "x": 9.25, "y": 3},
|
||||
{"matrix": [6, 5], "x": 10.25, "y": 3},
|
||||
{"matrix": [7, 5], "x": 11.25, "y": 3},
|
||||
{"matrix": [6, 6], "x": 12.25, "y": 3, "w": 1.75},
|
||||
{"matrix": [7, 6], "x": 14, "y": 3},
|
||||
{"matrix": [7, 7], "x": 15, "y": 3},
|
||||
{"matrix": [8, 0], "x": 0, "y": 4, "w": 1.5},
|
||||
{"matrix": [9, 0], "x": 1.5, "y": 4},
|
||||
{"matrix": [8, 1], "x": 2.5, "y": 4, "w": 1.5},
|
||||
{"matrix": [8, 3], "x": 4, "y": 4, "w": 7},
|
||||
{"matrix": [8, 5], "x": 11, "y": 4, "w": 1.5},
|
||||
{"matrix": [8, 6], "x": 13, "y": 4},
|
||||
{"matrix": [9, 6], "x": 14, "y": 4},
|
||||
{"matrix": [9, 7], "x": 15, "y": 4}
|
||||
]
|
||||
},
|
||||
"LAYOUT_iso": {
|
||||
"layout": [
|
||||
{"matrix": [0, 0], "x": 0, "y": 0},
|
||||
{"matrix": [1, 0], "x": 1, "y": 0},
|
||||
{"matrix": [0, 1], "x": 2, "y": 0},
|
||||
{"matrix": [1, 1], "x": 3, "y": 0},
|
||||
{"matrix": [0, 2], "x": 4, "y": 0},
|
||||
{"matrix": [1, 2], "x": 5, "y": 0},
|
||||
{"matrix": [0, 3], "x": 6, "y": 0},
|
||||
{"matrix": [1, 3], "x": 7, "y": 0},
|
||||
{"matrix": [0, 4], "x": 8, "y": 0},
|
||||
{"matrix": [1, 4], "x": 9, "y": 0},
|
||||
{"matrix": [0, 5], "x": 10, "y": 0},
|
||||
{"matrix": [1, 5], "x": 11, "y": 0},
|
||||
{"matrix": [0, 6], "x": 12, "y": 0},
|
||||
{"matrix": [0, 7], "x": 13, "y": 0, "w": 2},
|
||||
{"matrix": [2, 0], "x": 0, "y": 1, "w": 1.5},
|
||||
{"matrix": [3, 0], "x": 1.5, "y": 1},
|
||||
{"matrix": [2, 1], "x": 2.5, "y": 1},
|
||||
{"matrix": [3, 1], "x": 3.5, "y": 1},
|
||||
{"matrix": [2, 2], "x": 4.5, "y": 1},
|
||||
{"matrix": [3, 2], "x": 5.5, "y": 1},
|
||||
{"matrix": [2, 3], "x": 6.5, "y": 1},
|
||||
{"matrix": [3, 3], "x": 7.5, "y": 1},
|
||||
{"matrix": [2, 4], "x": 8.5, "y": 1},
|
||||
{"matrix": [3, 4], "x": 9.5, "y": 1},
|
||||
{"matrix": [2, 5], "x": 10.5, "y": 1},
|
||||
{"matrix": [3, 5], "x": 11.5, "y": 1},
|
||||
{"matrix": [2, 6], "x": 12.5, "y": 1},
|
||||
{"matrix": [3, 7], "x": 15, "y": 1},
|
||||
{"matrix": [4, 0], "x": 0, "y": 2, "w": 1.75},
|
||||
{"matrix": [5, 0], "x": 1.75, "y": 2},
|
||||
{"matrix": [4, 1], "x": 2.75, "y": 2},
|
||||
{"matrix": [5, 1], "x": 3.75, "y": 2},
|
||||
{"matrix": [4, 2], "x": 4.75, "y": 2},
|
||||
{"matrix": [5, 2], "x": 5.75, "y": 2},
|
||||
{"matrix": [4, 3], "x": 6.75, "y": 2},
|
||||
{"matrix": [5, 3], "x": 7.75, "y": 2},
|
||||
{"matrix": [4, 4], "x": 8.75, "y": 2},
|
||||
{"matrix": [5, 4], "x": 9.75, "y": 2},
|
||||
{"matrix": [4, 5], "x": 10.75, "y": 2},
|
||||
{"matrix": [5, 5], "x": 11.75, "y": 2},
|
||||
{"matrix": [4, 6], "x": 12.75, "y": 2},
|
||||
{"matrix": [5, 6], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
|
||||
{"matrix": [5, 7], "x": 15, "y": 2},
|
||||
{"matrix": [6, 0], "x": 0, "y": 3, "w": 1.25},
|
||||
{"matrix": [7, 0], "x": 1.25, "y": 3},
|
||||
{"matrix": [6, 1], "x": 2.25, "y": 3},
|
||||
{"matrix": [7, 1], "x": 3.25, "y": 3},
|
||||
{"matrix": [6, 2], "x": 4.25, "y": 3},
|
||||
{"matrix": [7, 2], "x": 5.25, "y": 3},
|
||||
{"matrix": [6, 3], "x": 6.25, "y": 3},
|
||||
{"matrix": [7, 3], "x": 7.25, "y": 3},
|
||||
{"matrix": [6, 4], "x": 8.25, "y": 3},
|
||||
{"matrix": [7, 4], "x": 9.25, "y": 3},
|
||||
{"matrix": [6, 5], "x": 10.25, "y": 3},
|
||||
{"matrix": [7, 5], "x": 11.25, "y": 3},
|
||||
{"matrix": [6, 6], "x": 12.25, "y": 3, "w": 1.75},
|
||||
{"matrix": [7, 6], "x": 14, "y": 3},
|
||||
{"matrix": [7, 7], "x": 15, "y": 3},
|
||||
{"matrix": [8, 0], "x": 0, "y": 4, "w": 1.25},
|
||||
{"matrix": [9, 0], "x": 1.25, "y": 4, "w": 1.25},
|
||||
{"matrix": [8, 1], "x": 2.5, "y": 4, "w": 1.25},
|
||||
{"matrix": [8, 3], "x": 3.75, "y": 4, "w": 6.25},
|
||||
{"matrix": [8, 5], "x": 10, "y": 4, "w": 1.25},
|
||||
{"matrix": [9, 5], "x": 11.25, "y": 4, "w": 1.25},
|
||||
{"matrix": [8, 6], "x": 13, "y": 4},
|
||||
{"matrix": [9, 6], "x": 14, "y": 4},
|
||||
{"matrix": [9, 7], "x": 15, "y": 4}
|
||||
]
|
||||
},
|
||||
"LAYOUT_iso_split_bs": {
|
||||
"layout": [
|
||||
{"matrix": [0, 0], "x": 0, "y": 0},
|
||||
{"matrix": [1, 0], "x": 1, "y": 0},
|
||||
{"matrix": [0, 1], "x": 2, "y": 0},
|
||||
{"matrix": [1, 1], "x": 3, "y": 0},
|
||||
{"matrix": [0, 2], "x": 4, "y": 0},
|
||||
{"matrix": [1, 2], "x": 5, "y": 0},
|
||||
{"matrix": [0, 3], "x": 6, "y": 0},
|
||||
{"matrix": [1, 3], "x": 7, "y": 0},
|
||||
{"matrix": [0, 4], "x": 8, "y": 0},
|
||||
{"matrix": [1, 4], "x": 9, "y": 0},
|
||||
{"matrix": [0, 5], "x": 10, "y": 0},
|
||||
{"matrix": [1, 5], "x": 11, "y": 0},
|
||||
{"matrix": [0, 6], "x": 12, "y": 0},
|
||||
{"matrix": [1, 6], "x": 13, "y": 0},
|
||||
{"matrix": [0, 7], "x": 14, "y": 0},
|
||||
{"matrix": [2, 0], "x": 0, "y": 1, "w": 1.5},
|
||||
{"matrix": [3, 0], "x": 1.5, "y": 1},
|
||||
{"matrix": [2, 1], "x": 2.5, "y": 1},
|
||||
{"matrix": [3, 1], "x": 3.5, "y": 1},
|
||||
{"matrix": [2, 2], "x": 4.5, "y": 1},
|
||||
{"matrix": [3, 2], "x": 5.5, "y": 1},
|
||||
{"matrix": [2, 3], "x": 6.5, "y": 1},
|
||||
{"matrix": [3, 3], "x": 7.5, "y": 1},
|
||||
{"matrix": [2, 4], "x": 8.5, "y": 1},
|
||||
{"matrix": [3, 4], "x": 9.5, "y": 1},
|
||||
{"matrix": [2, 5], "x": 10.5, "y": 1},
|
||||
{"matrix": [3, 5], "x": 11.5, "y": 1},
|
||||
{"matrix": [2, 6], "x": 12.5, "y": 1},
|
||||
{"matrix": [3, 7], "x": 15, "y": 1},
|
||||
{"matrix": [4, 0], "x": 0, "y": 2, "w": 1.75},
|
||||
{"matrix": [5, 0], "x": 1.75, "y": 2},
|
||||
{"matrix": [4, 1], "x": 2.75, "y": 2},
|
||||
{"matrix": [5, 1], "x": 3.75, "y": 2},
|
||||
{"matrix": [4, 2], "x": 4.75, "y": 2},
|
||||
{"matrix": [5, 2], "x": 5.75, "y": 2},
|
||||
{"matrix": [4, 3], "x": 6.75, "y": 2},
|
||||
{"matrix": [5, 3], "x": 7.75, "y": 2},
|
||||
{"matrix": [4, 4], "x": 8.75, "y": 2},
|
||||
{"matrix": [5, 4], "x": 9.75, "y": 2},
|
||||
{"matrix": [4, 5], "x": 10.75, "y": 2},
|
||||
{"matrix": [5, 5], "x": 11.75, "y": 2},
|
||||
{"matrix": [4, 6], "x": 12.75, "y": 2},
|
||||
{"matrix": [5, 6], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
|
||||
{"matrix": [5, 7], "x": 15, "y": 2},
|
||||
{"matrix": [6, 0], "x": 0, "y": 3, "w": 1.25},
|
||||
{"matrix": [7, 0], "x": 1.25, "y": 3},
|
||||
{"matrix": [6, 1], "x": 2.25, "y": 3},
|
||||
{"matrix": [7, 1], "x": 3.25, "y": 3},
|
||||
{"matrix": [6, 2], "x": 4.25, "y": 3},
|
||||
{"matrix": [7, 2], "x": 5.25, "y": 3},
|
||||
{"matrix": [6, 3], "x": 6.25, "y": 3},
|
||||
{"matrix": [7, 3], "x": 7.25, "y": 3},
|
||||
{"matrix": [6, 4], "x": 8.25, "y": 3},
|
||||
{"matrix": [7, 4], "x": 9.25, "y": 3},
|
||||
{"matrix": [6, 5], "x": 10.25, "y": 3},
|
||||
{"matrix": [7, 5], "x": 11.25, "y": 3},
|
||||
{"matrix": [6, 6], "x": 12.25, "y": 3, "w": 1.75},
|
||||
{"matrix": [7, 6], "x": 14, "y": 3},
|
||||
{"matrix": [7, 7], "x": 15, "y": 3},
|
||||
{"matrix": [8, 0], "x": 0, "y": 4, "w": 1.25},
|
||||
{"matrix": [9, 0], "x": 1.25, "y": 4, "w": 1.25},
|
||||
{"matrix": [8, 1], "x": 2.5, "y": 4, "w": 1.25},
|
||||
{"matrix": [8, 3], "x": 3.75, "y": 4, "w": 6.25},
|
||||
{"matrix": [8, 5], "x": 10, "y": 4, "w": 1.25},
|
||||
{"matrix": [9, 5], "x": 11.25, "y": 4, "w": 1.25},
|
||||
{"matrix": [8, 6], "x": 13, "y": 4},
|
||||
{"matrix": [9, 6], "x": 14, "y": 4},
|
||||
{"matrix": [9, 7], "x": 15, "y": 4}
|
||||
]
|
||||
},
|
||||
"LAYOUT_iso_tsangan": {
|
||||
"layout": [
|
||||
{"matrix": [0, 0], "x": 0, "y": 0},
|
||||
{"matrix": [1, 0], "x": 1, "y": 0},
|
||||
{"matrix": [0, 1], "x": 2, "y": 0},
|
||||
{"matrix": [1, 1], "x": 3, "y": 0},
|
||||
{"matrix": [0, 2], "x": 4, "y": 0},
|
||||
{"matrix": [1, 2], "x": 5, "y": 0},
|
||||
{"matrix": [0, 3], "x": 6, "y": 0},
|
||||
{"matrix": [1, 3], "x": 7, "y": 0},
|
||||
{"matrix": [0, 4], "x": 8, "y": 0},
|
||||
{"matrix": [1, 4], "x": 9, "y": 0},
|
||||
{"matrix": [0, 5], "x": 10, "y": 0},
|
||||
{"matrix": [1, 5], "x": 11, "y": 0},
|
||||
{"matrix": [0, 6], "x": 12, "y": 0},
|
||||
{"matrix": [0, 7], "x": 13, "y": 0, "w": 2},
|
||||
{"matrix": [2, 0], "x": 0, "y": 1, "w": 1.5},
|
||||
{"matrix": [3, 0], "x": 1.5, "y": 1},
|
||||
{"matrix": [2, 1], "x": 2.5, "y": 1},
|
||||
{"matrix": [3, 1], "x": 3.5, "y": 1},
|
||||
{"matrix": [2, 2], "x": 4.5, "y": 1},
|
||||
{"matrix": [3, 2], "x": 5.5, "y": 1},
|
||||
{"matrix": [2, 3], "x": 6.5, "y": 1},
|
||||
{"matrix": [3, 3], "x": 7.5, "y": 1},
|
||||
{"matrix": [2, 4], "x": 8.5, "y": 1},
|
||||
{"matrix": [3, 4], "x": 9.5, "y": 1},
|
||||
{"matrix": [2, 5], "x": 10.5, "y": 1},
|
||||
{"matrix": [3, 5], "x": 11.5, "y": 1},
|
||||
{"matrix": [2, 6], "x": 12.5, "y": 1},
|
||||
{"matrix": [3, 7], "x": 15, "y": 1},
|
||||
{"matrix": [4, 0], "x": 0, "y": 2, "w": 1.75},
|
||||
{"matrix": [5, 0], "x": 1.75, "y": 2},
|
||||
{"matrix": [4, 1], "x": 2.75, "y": 2},
|
||||
{"matrix": [5, 1], "x": 3.75, "y": 2},
|
||||
{"matrix": [4, 2], "x": 4.75, "y": 2},
|
||||
{"matrix": [5, 2], "x": 5.75, "y": 2},
|
||||
{"matrix": [4, 3], "x": 6.75, "y": 2},
|
||||
{"matrix": [5, 3], "x": 7.75, "y": 2},
|
||||
{"matrix": [4, 4], "x": 8.75, "y": 2},
|
||||
{"matrix": [5, 4], "x": 9.75, "y": 2},
|
||||
{"matrix": [4, 5], "x": 10.75, "y": 2},
|
||||
{"matrix": [5, 5], "x": 11.75, "y": 2},
|
||||
{"matrix": [4, 6], "x": 12.75, "y": 2},
|
||||
{"matrix": [5, 6], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
|
||||
{"matrix": [5, 7], "x": 15, "y": 2},
|
||||
{"matrix": [6, 0], "x": 0, "y": 3, "w": 1.25},
|
||||
{"matrix": [7, 0], "x": 1.25, "y": 3},
|
||||
{"matrix": [6, 1], "x": 2.25, "y": 3},
|
||||
{"matrix": [7, 1], "x": 3.25, "y": 3},
|
||||
{"matrix": [6, 2], "x": 4.25, "y": 3},
|
||||
{"matrix": [7, 2], "x": 5.25, "y": 3},
|
||||
{"matrix": [6, 3], "x": 6.25, "y": 3},
|
||||
{"matrix": [7, 3], "x": 7.25, "y": 3},
|
||||
{"matrix": [6, 4], "x": 8.25, "y": 3},
|
||||
{"matrix": [7, 4], "x": 9.25, "y": 3},
|
||||
{"matrix": [6, 5], "x": 10.25, "y": 3},
|
||||
{"matrix": [7, 5], "x": 11.25, "y": 3},
|
||||
{"matrix": [6, 6], "x": 12.25, "y": 3, "w": 1.75},
|
||||
{"matrix": [7, 6], "x": 14, "y": 3},
|
||||
{"matrix": [7, 7], "x": 15, "y": 3},
|
||||
{"matrix": [8, 0], "x": 0, "y": 4, "w": 1.5},
|
||||
{"matrix": [9, 0], "x": 1.5, "y": 4},
|
||||
{"matrix": [8, 1], "x": 2.5, "y": 4, "w": 1.5},
|
||||
{"matrix": [8, 3], "x": 4, "y": 4, "w": 7},
|
||||
{"matrix": [8, 5], "x": 11, "y": 4, "w": 1.5},
|
||||
{"matrix": [8, 6], "x": 13, "y": 4},
|
||||
{"matrix": [9, 6], "x": 14, "y": 4},
|
||||
{"matrix": [9, 7], "x": 15, "y": 4}
|
||||
]
|
||||
},
|
||||
"LAYOUT_iso_tsangan_split_bs": {
|
||||
"layout": [
|
||||
{"matrix": [0, 0], "x": 0, "y": 0},
|
||||
{"matrix": [1, 0], "x": 1, "y": 0},
|
||||
{"matrix": [0, 1], "x": 2, "y": 0},
|
||||
{"matrix": [1, 1], "x": 3, "y": 0},
|
||||
{"matrix": [0, 2], "x": 4, "y": 0},
|
||||
{"matrix": [1, 2], "x": 5, "y": 0},
|
||||
{"matrix": [0, 3], "x": 6, "y": 0},
|
||||
{"matrix": [1, 3], "x": 7, "y": 0},
|
||||
{"matrix": [0, 4], "x": 8, "y": 0},
|
||||
{"matrix": [1, 4], "x": 9, "y": 0},
|
||||
{"matrix": [0, 5], "x": 10, "y": 0},
|
||||
{"matrix": [1, 5], "x": 11, "y": 0},
|
||||
{"matrix": [0, 6], "x": 12, "y": 0},
|
||||
{"matrix": [1, 6], "x": 13, "y": 0},
|
||||
{"matrix": [0, 7], "x": 14, "y": 0},
|
||||
{"matrix": [2, 0], "x": 0, "y": 1, "w": 1.5},
|
||||
{"matrix": [3, 0], "x": 1.5, "y": 1},
|
||||
{"matrix": [2, 1], "x": 2.5, "y": 1},
|
||||
{"matrix": [3, 1], "x": 3.5, "y": 1},
|
||||
{"matrix": [2, 2], "x": 4.5, "y": 1},
|
||||
{"matrix": [3, 2], "x": 5.5, "y": 1},
|
||||
{"matrix": [2, 3], "x": 6.5, "y": 1},
|
||||
{"matrix": [3, 3], "x": 7.5, "y": 1},
|
||||
{"matrix": [2, 4], "x": 8.5, "y": 1},
|
||||
{"matrix": [3, 4], "x": 9.5, "y": 1},
|
||||
{"matrix": [2, 5], "x": 10.5, "y": 1},
|
||||
{"matrix": [3, 5], "x": 11.5, "y": 1},
|
||||
{"matrix": [2, 6], "x": 12.5, "y": 1},
|
||||
{"matrix": [3, 7], "x": 15, "y": 1},
|
||||
{"matrix": [4, 0], "x": 0, "y": 2, "w": 1.75},
|
||||
{"matrix": [5, 0], "x": 1.75, "y": 2},
|
||||
{"matrix": [4, 1], "x": 2.75, "y": 2},
|
||||
{"matrix": [5, 1], "x": 3.75, "y": 2},
|
||||
{"matrix": [4, 2], "x": 4.75, "y": 2},
|
||||
{"matrix": [5, 2], "x": 5.75, "y": 2},
|
||||
{"matrix": [4, 3], "x": 6.75, "y": 2},
|
||||
{"matrix": [5, 3], "x": 7.75, "y": 2},
|
||||
{"matrix": [4, 4], "x": 8.75, "y": 2},
|
||||
{"matrix": [5, 4], "x": 9.75, "y": 2},
|
||||
{"matrix": [4, 5], "x": 10.75, "y": 2},
|
||||
{"matrix": [5, 5], "x": 11.75, "y": 2},
|
||||
{"matrix": [4, 6], "x": 12.75, "y": 2},
|
||||
{"matrix": [5, 6], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
|
||||
{"matrix": [5, 7], "x": 15, "y": 2},
|
||||
{"matrix": [6, 0], "x": 0, "y": 3, "w": 1.25},
|
||||
{"matrix": [7, 0], "x": 1.25, "y": 3},
|
||||
{"matrix": [6, 1], "x": 2.25, "y": 3},
|
||||
{"matrix": [7, 1], "x": 3.25, "y": 3},
|
||||
{"matrix": [6, 2], "x": 4.25, "y": 3},
|
||||
{"matrix": [7, 2], "x": 5.25, "y": 3},
|
||||
{"matrix": [6, 3], "x": 6.25, "y": 3},
|
||||
{"matrix": [7, 3], "x": 7.25, "y": 3},
|
||||
{"matrix": [6, 4], "x": 8.25, "y": 3},
|
||||
{"matrix": [7, 4], "x": 9.25, "y": 3},
|
||||
{"matrix": [6, 5], "x": 10.25, "y": 3},
|
||||
{"matrix": [7, 5], "x": 11.25, "y": 3},
|
||||
{"matrix": [6, 6], "x": 12.25, "y": 3, "w": 1.75},
|
||||
{"matrix": [7, 6], "x": 14, "y": 3},
|
||||
{"matrix": [7, 7], "x": 15, "y": 3},
|
||||
{"matrix": [8, 0], "x": 0, "y": 4, "w": 1.5},
|
||||
{"matrix": [9, 0], "x": 1.5, "y": 4},
|
||||
{"matrix": [8, 1], "x": 2.5, "y": 4, "w": 1.5},
|
||||
{"matrix": [8, 3], "x": 4, "y": 4, "w": 7},
|
||||
{"matrix": [8, 5], "x": 11, "y": 4, "w": 1.5},
|
||||
{"matrix": [8, 6], "x": 13, "y": 4},
|
||||
{"matrix": [9, 6], "x": 14, "y": 4},
|
||||
{"matrix": [9, 7], "x": 15, "y": 4}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
35
keyboards/zeix/singa/rubrehaku/keymaps/default/keymap.c
Normal file
35
keyboards/zeix/singa/rubrehaku/keymaps/default/keymap.c
Normal file
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
Copyright 2024 zeix (@itsme-zeix)
|
||||
|
||||
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_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_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_PGUP,
|
||||
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_NUHS, KC_ENT, KC_PGDN,
|
||||
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, MO(1),
|
||||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT
|
||||
),
|
||||
|
||||
[1] = LAYOUT_all(
|
||||
KC_TRNS, 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_TRNS, KC_DEL,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
|
||||
),
|
||||
};
|
||||
30
keyboards/zeix/singa/rubrehaku/matrix_diagram.md
Normal file
30
keyboards/zeix/singa/rubrehaku/matrix_diagram.md
Normal file
@@ -0,0 +1,30 @@
|
||||
# Matrix Diagram for Rubrehaku
|
||||
|
||||
```
|
||||
┌───┬───┐
|
||||
Split Backspace │16 │07 │
|
||||
└───┴───┘
|
||||
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
|
||||
│00 │10 │01 │11 │02 │12 │03 │13 │04 │14 │05 │15 │06 │07 │
|
||||
├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┼───┐ ┌─────┐
|
||||
│20 │30 │21 │31 │22 │32 │23 │33 │24 │34 │25 │35 │26 │36 │37 │ │ │
|
||||
├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤ ┌──┴┐56 │ ISO Enter
|
||||
│40 │50 │41 │51 │42 │52 │43 │53 │44 │54 │45 │55 │56 │57 │ │46 │ │
|
||||
├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤ └───┴────┘
|
||||
│60 │61 │71 │62 │72 │63 │73 │64 │74 │65 │75 │66 │76 │77 │
|
||||
├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬─┬───┼───┼───┤
|
||||
│80 │90 │81 │83 │95 │ │86 │96 │97 │
|
||||
└─────┴───┴─────┴───────────────────────────┴─────┘ └───┴───┴───┘
|
||||
┌────┬───┐
|
||||
│60 │70 │ Split Left Shift
|
||||
└────┴───┘
|
||||
┌────┬────┬────┬────────────────────────┬────┬────┐
|
||||
│80 │90 │81 │83 │85 │95 │ 6.25u
|
||||
└────┴────┴────┴────────────────────────┴────┴────┘
|
||||
┌────┬────┬────┬───────────┬────┬───────┬────┬────┐
|
||||
│80 │90 │81 │92 │83 │94 │85 │95 │ Split Space (Left 2.75u)
|
||||
└────┴────┴────┴───────────┴────┴───────┴────┴────┘
|
||||
┌────┬────┬────┬───────┬────┬───────────┬────┬────┐
|
||||
│80 │90 │81 │92 │83 │94 │85 │95 │ Split Space (Left 2.25u)
|
||||
└────┴────┴────┴───────┴────┴───────────┴────┴────┘
|
||||
```
|
||||
27
keyboards/zeix/singa/rubrehaku/readme.md
Normal file
27
keyboards/zeix/singa/rubrehaku/readme.md
Normal file
@@ -0,0 +1,27 @@
|
||||
# SINGA Rubrehaku (PCB designed by Zeix)
|
||||
|
||||

|
||||
|
||||
65% PCB designed to support Rubrehaku
|
||||
|
||||
* Keyboard Maintainer: [Zeix](https://github.com/itsme-zeix)
|
||||
* Hardware Supported: KLC x SINGA x Rubrehose Rubrehaku
|
||||
* Hardware Availability: https://klc-playground.com/
|
||||
|
||||
Make example for this keyboard (after setting up your build environment):
|
||||
|
||||
make zeix/singa/rubrehaku:default
|
||||
|
||||
Flashing example for this keyboard:
|
||||
|
||||
make zeix/singa/rubrehaku:default:flash
|
||||
|
||||
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
|
||||
|
||||
## Bootloader
|
||||
|
||||
Enter the bootloader in 3 ways:
|
||||
|
||||
* **Bootmagic reset**: Hold down the top left key and plug in the keyboard.
|
||||
* **Physical reset button**: Briefly press the `RESET` button twice or short the 'USB_BOOT' and `GND` pads and plug in the keyboard.
|
||||
* **Keycode in layout**: Press the key mapped to `QK_BOOT`.
|
||||
@@ -3,6 +3,8 @@
|
||||
We list each subcommand here explicitly because all the reliable ways of searching for modules are slow and delay startup.
|
||||
"""
|
||||
import os
|
||||
import platform
|
||||
import platformdirs
|
||||
import shlex
|
||||
import sys
|
||||
from importlib.util import find_spec
|
||||
@@ -12,6 +14,28 @@ from subprocess import run
|
||||
from milc import cli, __VERSION__
|
||||
from milc.questions import yesno
|
||||
|
||||
|
||||
def _get_default_distrib_path():
|
||||
if 'windows' in platform.platform().lower():
|
||||
try:
|
||||
result = cli.run(['cygpath', '-w', '/opt/qmk'])
|
||||
if result.returncode == 0:
|
||||
return result.stdout.strip()
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
return platformdirs.user_data_dir('qmk')
|
||||
|
||||
|
||||
# Ensure the QMK distribution is on the `$PATH` if present. This must be kept in sync with qmk/qmk_cli.
|
||||
QMK_DISTRIB_DIR = Path(os.environ.get('QMK_DISTRIB_DIR', _get_default_distrib_path()))
|
||||
if QMK_DISTRIB_DIR.exists():
|
||||
os.environ['PATH'] = str(QMK_DISTRIB_DIR / 'bin') + os.pathsep + os.environ['PATH']
|
||||
|
||||
# Prepend any user-defined path prefix
|
||||
if 'QMK_PATH_PREFIX' in os.environ:
|
||||
os.environ['PATH'] = os.environ['QMK_PATH_PREFIX'] + os.pathsep + os.environ['PATH']
|
||||
|
||||
import_names = {
|
||||
# A mapping of package name to importable name
|
||||
'pep8-naming': 'pep8ext_naming',
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
"""Check for specific programs.
|
||||
"""
|
||||
from enum import Enum
|
||||
import re
|
||||
import shutil
|
||||
from subprocess import DEVNULL, TimeoutExpired
|
||||
from tempfile import TemporaryDirectory
|
||||
@@ -9,6 +8,7 @@ from pathlib import Path
|
||||
|
||||
from milc import cli
|
||||
from qmk import submodules
|
||||
from qmk.commands import find_make
|
||||
|
||||
|
||||
class CheckStatus(Enum):
|
||||
@@ -17,7 +17,13 @@ class CheckStatus(Enum):
|
||||
ERROR = 3
|
||||
|
||||
|
||||
WHICH_MAKE = Path(find_make()).name
|
||||
|
||||
ESSENTIAL_BINARIES = {
|
||||
WHICH_MAKE: {},
|
||||
'git': {},
|
||||
'dos2unix': {},
|
||||
'diff': {},
|
||||
'dfu-programmer': {},
|
||||
'avrdude': {},
|
||||
'dfu-util': {},
|
||||
@@ -30,14 +36,39 @@ ESSENTIAL_BINARIES = {
|
||||
}
|
||||
|
||||
|
||||
def _parse_gcc_version(version):
|
||||
m = re.match(r"(\d+)(?:\.(\d+))?(?:\.(\d+))?", version)
|
||||
def _check_make_version():
|
||||
last_line = ESSENTIAL_BINARIES[WHICH_MAKE]['output'].split('\n')[0]
|
||||
version_number = last_line.split()[2]
|
||||
cli.log.info('Found %s version %s', WHICH_MAKE, version_number)
|
||||
|
||||
return {
|
||||
'major': int(m.group(1)),
|
||||
'minor': int(m.group(2)) if m.group(2) else 0,
|
||||
'patch': int(m.group(3)) if m.group(3) else 0,
|
||||
}
|
||||
return CheckStatus.OK
|
||||
|
||||
|
||||
def _check_git_version():
|
||||
last_line = ESSENTIAL_BINARIES['git']['output'].split('\n')[0]
|
||||
version_number = last_line.split()[2]
|
||||
cli.log.info('Found git version %s', version_number)
|
||||
|
||||
return CheckStatus.OK
|
||||
|
||||
|
||||
def _check_dos2unix_version():
|
||||
last_line = ESSENTIAL_BINARIES['dos2unix']['output'].split('\n')[0]
|
||||
version_number = last_line.split()[1]
|
||||
cli.log.info('Found dos2unix version %s', version_number)
|
||||
|
||||
return CheckStatus.OK
|
||||
|
||||
|
||||
def _check_diff_version():
|
||||
last_line = ESSENTIAL_BINARIES['diff']['output'].split('\n')[0]
|
||||
if 'Apple diff' in last_line:
|
||||
version_number = last_line
|
||||
else:
|
||||
version_number = last_line.split()[3]
|
||||
cli.log.info('Found diff version %s', version_number)
|
||||
|
||||
return CheckStatus.OK
|
||||
|
||||
|
||||
def _check_arm_gcc_version():
|
||||
@@ -148,16 +179,24 @@ def check_binaries():
|
||||
"""Iterates through ESSENTIAL_BINARIES and tests them.
|
||||
"""
|
||||
ok = CheckStatus.OK
|
||||
missing_from_path = []
|
||||
|
||||
for binary in sorted(ESSENTIAL_BINARIES):
|
||||
try:
|
||||
if not is_executable(binary):
|
||||
if not is_in_path(binary):
|
||||
ok = CheckStatus.ERROR
|
||||
missing_from_path.append(binary)
|
||||
elif not is_executable(binary):
|
||||
ok = CheckStatus.ERROR
|
||||
except TimeoutExpired:
|
||||
cli.log.debug('Timeout checking %s', binary)
|
||||
if ok != CheckStatus.ERROR:
|
||||
ok = CheckStatus.WARNING
|
||||
|
||||
if missing_from_path:
|
||||
location_noun = 'its location' if len(missing_from_path) == 1 else 'their locations'
|
||||
cli.log.error('{fg_red}' + ', '.join(missing_from_path) + f' may need to be installed, or {location_noun} added to your path.')
|
||||
|
||||
return ok
|
||||
|
||||
|
||||
@@ -165,6 +204,10 @@ def check_binary_versions():
|
||||
"""Check the versions of ESSENTIAL_BINARIES
|
||||
"""
|
||||
checks = {
|
||||
WHICH_MAKE: _check_make_version,
|
||||
'git': _check_git_version,
|
||||
'dos2unix': _check_dos2unix_version,
|
||||
'diff': _check_diff_version,
|
||||
'arm-none-eabi-gcc': _check_arm_gcc_version,
|
||||
'avr-gcc': _check_avr_gcc_version,
|
||||
'avrdude': _check_avrdude_version,
|
||||
@@ -196,15 +239,18 @@ def check_submodules():
|
||||
return CheckStatus.OK
|
||||
|
||||
|
||||
def is_executable(command):
|
||||
"""Returns True if command exists and can be executed.
|
||||
def is_in_path(command):
|
||||
"""Returns True if command is found in the path.
|
||||
"""
|
||||
# Make sure the command is in the path.
|
||||
res = shutil.which(command)
|
||||
if res is None:
|
||||
if shutil.which(command) is None:
|
||||
cli.log.error("{fg_red}Can't find %s in your path.", command)
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def is_executable(command):
|
||||
"""Returns True if command can be executed.
|
||||
"""
|
||||
# Make sure the command can be executed
|
||||
version_arg = ESSENTIAL_BINARIES[command].get('version_arg', '--version')
|
||||
check = cli.run([command, version_arg], combined_output=True, stdin=DEVNULL, timeout=5)
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
Check out the user's QMK environment and make sure it's ready to compile.
|
||||
"""
|
||||
import platform
|
||||
from subprocess import DEVNULL
|
||||
|
||||
from milc import cli
|
||||
from milc.questions import yesno
|
||||
@@ -16,6 +15,60 @@ from qmk.commands import in_virtualenv
|
||||
from qmk.userspace import qmk_userspace_paths, qmk_userspace_validate, UserspaceValidationError
|
||||
|
||||
|
||||
def distrib_tests():
|
||||
def _load_kvp_file(file):
|
||||
"""Load a simple key=value file into a dictionary
|
||||
"""
|
||||
vars = {}
|
||||
with open(file, 'r') as f:
|
||||
for line in f:
|
||||
if '=' in line:
|
||||
key, value = line.split('=', 1)
|
||||
vars[key.strip()] = value.strip()
|
||||
return vars
|
||||
|
||||
def _parse_toolchain_release_file(file):
|
||||
"""Parse the QMK toolchain release info file
|
||||
"""
|
||||
try:
|
||||
vars = _load_kvp_file(file)
|
||||
return f'{vars.get("TOOLCHAIN_HOST", "unknown")}:{vars.get("TOOLCHAIN_TARGET", "unknown")}:{vars.get("COMMIT_HASH", "unknown")}'
|
||||
except Exception as e:
|
||||
cli.log.warning('Error reading QMK toolchain release info file: %s', e)
|
||||
return f'Unknown toolchain release info file: {file}'
|
||||
|
||||
def _parse_flashutils_release_file(file):
|
||||
"""Parse the QMK flashutils release info file
|
||||
"""
|
||||
try:
|
||||
vars = _load_kvp_file(file)
|
||||
return f'{vars.get("FLASHUTILS_HOST", "unknown")}:{vars.get("COMMIT_HASH", "unknown")}'
|
||||
except Exception as e:
|
||||
cli.log.warning('Error reading QMK flashutils release info file: %s', e)
|
||||
return f'Unknown flashutils release info file: {file}'
|
||||
|
||||
try:
|
||||
from qmk.cli import QMK_DISTRIB_DIR
|
||||
if (QMK_DISTRIB_DIR / 'etc').exists():
|
||||
cli.log.info('Found QMK tools distribution directory: {fg_cyan}%s', QMK_DISTRIB_DIR)
|
||||
|
||||
toolchains = [_parse_toolchain_release_file(file) for file in (QMK_DISTRIB_DIR / 'etc').glob('toolchain_release_*')]
|
||||
if len(toolchains) > 0:
|
||||
cli.log.info('Found QMK toolchains: {fg_cyan}%s', ', '.join(toolchains))
|
||||
else:
|
||||
cli.log.warning('No QMK toolchains manifest found.')
|
||||
|
||||
flashutils = [_parse_flashutils_release_file(file) for file in (QMK_DISTRIB_DIR / 'etc').glob('flashutils_release_*')]
|
||||
if len(flashutils) > 0:
|
||||
cli.log.info('Found QMK flashutils: {fg_cyan}%s', ', '.join(flashutils))
|
||||
else:
|
||||
cli.log.warning('No QMK flashutils manifest found.')
|
||||
except ImportError:
|
||||
cli.log.info('QMK tools distribution not found.')
|
||||
|
||||
return CheckStatus.OK
|
||||
|
||||
|
||||
def os_tests():
|
||||
"""Determine our OS and run platform specific tests
|
||||
"""
|
||||
@@ -124,10 +177,12 @@ def doctor(cli):
|
||||
* [ ] Compile a trivial program with each compiler
|
||||
"""
|
||||
cli.log.info('QMK Doctor is checking your environment.')
|
||||
cli.log.info('Python version: %s', platform.python_version())
|
||||
cli.log.info('CLI version: %s', cli.version)
|
||||
cli.log.info('QMK home: {fg_cyan}%s', QMK_FIRMWARE)
|
||||
|
||||
status = os_status = os_tests()
|
||||
distrib_tests()
|
||||
|
||||
userspace_tests(None)
|
||||
|
||||
@@ -141,12 +196,6 @@ def doctor(cli):
|
||||
|
||||
# Make sure the basic CLI tools we need are available and can be executed.
|
||||
bin_ok = check_binaries()
|
||||
|
||||
if bin_ok == CheckStatus.ERROR:
|
||||
if yesno('Would you like to install dependencies?', default=True):
|
||||
cli.run(['util/qmk_install.sh', '-y'], stdin=DEVNULL, capture_output=False)
|
||||
bin_ok = check_binaries()
|
||||
|
||||
if bin_ok == CheckStatus.OK:
|
||||
cli.log.info('All dependencies are installed.')
|
||||
elif bin_ok == CheckStatus.WARNING:
|
||||
@@ -163,7 +212,6 @@ def doctor(cli):
|
||||
|
||||
# Check out the QMK submodules
|
||||
sub_ok = check_submodules()
|
||||
|
||||
if sub_ok == CheckStatus.OK:
|
||||
cli.log.info('Submodules are up to date.')
|
||||
else:
|
||||
@@ -186,6 +234,7 @@ def doctor(cli):
|
||||
cli.log.info('{fg_yellow}QMK is ready to go, but minor problems were found')
|
||||
return 1
|
||||
else:
|
||||
cli.log.info('{fg_red}Major problems detected, please fix these problems before proceeding.')
|
||||
cli.log.info('{fg_blue}Check out the FAQ (https://docs.qmk.fm/#/faq_build) or join the QMK Discord (https://discord.gg/qmk) for help.')
|
||||
cli.log.info('{fg_red}Major problems detected, please fix these problems before proceeding.{fg_reset}')
|
||||
cli.log.info('{fg_blue}If you\'re missing dependencies, try following the instructions on: https://docs.qmk.fm/newbs_getting_started{fg_reset}')
|
||||
cli.log.info('{fg_blue}Additionally, check out the FAQ (https://docs.qmk.fm/#/faq_build) or join the QMK Discord (https://discord.gg/qmk) for help.{fg_reset}')
|
||||
return 2
|
||||
|
||||
@@ -47,6 +47,7 @@ def userspace_add(cli):
|
||||
from qmk.cli.new.keymap import new_keymap
|
||||
cli.config.new_keymap.keyboard = cli.args.keyboard
|
||||
cli.config.new_keymap.keymap = cli.args.keymap
|
||||
cli.args.skip_converter = True
|
||||
if new_keymap(cli) is not False:
|
||||
userspace.add_target(keyboard=cli.args.keyboard, keymap=cli.args.keymap, build_env=build_env)
|
||||
else:
|
||||
|
||||
@@ -153,11 +153,12 @@ def _flash_atmel_dfu(mcu, file):
|
||||
|
||||
|
||||
def _flash_hid_bootloader(mcu, details, file):
|
||||
cmd = None
|
||||
if details == 'halfkay':
|
||||
if shutil.which('teensy-loader-cli'):
|
||||
cmd = 'teensy-loader-cli'
|
||||
elif shutil.which('teensy_loader_cli'):
|
||||
if shutil.which('teensy_loader_cli'):
|
||||
cmd = 'teensy_loader_cli'
|
||||
elif shutil.which('teensy-loader-cli'):
|
||||
cmd = 'teensy-loader-cli'
|
||||
|
||||
# Use 'hid_bootloader_cli' for QMK HID and as a fallback for HalfKay
|
||||
if not cmd:
|
||||
|
||||
@@ -14,7 +14,7 @@ from qmk.json_schema import deep_update, json_load, validate
|
||||
from qmk.keyboard import config_h, rules_mk
|
||||
from qmk.commands import parse_configurator_json
|
||||
from qmk.makefile import parse_rules_mk_file
|
||||
from qmk.math import compute
|
||||
from qmk.math_ops import compute
|
||||
from qmk.util import maybe_exit, truthy
|
||||
|
||||
true_values = ['1', 'on', 'yes']
|
||||
|
||||
@@ -175,8 +175,9 @@ def keyboard_completer(prefix, action, parser, parsed_args):
|
||||
return list_keyboards()
|
||||
|
||||
|
||||
@lru_cache(maxsize=None)
|
||||
def list_keyboards():
|
||||
"""Returns a list of all keyboards
|
||||
"""Returns a list of all keyboards.
|
||||
"""
|
||||
# We avoid pathlib here because this is performance critical code.
|
||||
kb_wildcard = os.path.join(base_path, "**", 'keyboard.json')
|
||||
@@ -184,6 +185,9 @@ def list_keyboards():
|
||||
|
||||
found = map(_find_name, paths)
|
||||
|
||||
# Convert to posix paths for consistency
|
||||
found = map(lambda x: str(Path(x).as_posix()), found)
|
||||
|
||||
return sorted(set(found))
|
||||
|
||||
|
||||
|
||||
@@ -23,8 +23,8 @@ def compute(expr):
|
||||
|
||||
|
||||
def _eval(node):
|
||||
if isinstance(node, ast.Num): # <number>
|
||||
return node.n
|
||||
if isinstance(node, ast.Constant): # <number>
|
||||
return node.value
|
||||
elif isinstance(node, ast.BinOp): # <left> <operator> <right>
|
||||
return operators[type(node.op)](_eval(node.left), _eval(node.right))
|
||||
elif isinstance(node, ast.UnaryOp): # <operator> <operand> e.g., -1
|
||||
@@ -5,10 +5,10 @@
|
||||
|
||||
# Autodetect teensy loader
|
||||
ifndef TEENSY_LOADER_CLI
|
||||
ifneq (, $(shell which teensy-loader-cli 2>/dev/null))
|
||||
TEENSY_LOADER_CLI ?= teensy-loader-cli
|
||||
else
|
||||
ifneq (, $(shell which teensy_loader_cli 2>/dev/null))
|
||||
TEENSY_LOADER_CLI ?= teensy_loader_cli
|
||||
else
|
||||
TEENSY_LOADER_CLI ?= teensy-loader-cli
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
@@ -77,10 +77,10 @@ st-flash: $(BUILD_DIR)/$(TARGET).hex sizeafter
|
||||
|
||||
# Autodetect teensy loader
|
||||
ifndef TEENSY_LOADER_CLI
|
||||
ifneq (, $(shell which teensy-loader-cli 2>/dev/null))
|
||||
TEENSY_LOADER_CLI ?= teensy-loader-cli
|
||||
else
|
||||
ifneq (, $(shell which teensy_loader_cli 2>/dev/null))
|
||||
TEENSY_LOADER_CLI ?= teensy_loader_cli
|
||||
else
|
||||
TEENSY_LOADER_CLI ?= teensy-loader-cli
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
@@ -49,15 +49,15 @@ uint32_t qp_comms_send(painter_device_t device, const void *data, uint32_t byte_
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Comms APIs that use a D/C pin
|
||||
|
||||
void qp_comms_command(painter_device_t device, uint8_t cmd) {
|
||||
bool qp_comms_command(painter_device_t device, uint8_t cmd) {
|
||||
painter_driver_t * driver = (painter_driver_t *)device;
|
||||
painter_comms_with_command_vtable_t *comms_vtable = (painter_comms_with_command_vtable_t *)driver->comms_vtable;
|
||||
comms_vtable->send_command(device, cmd);
|
||||
return comms_vtable->send_command(device, cmd);
|
||||
}
|
||||
|
||||
void qp_comms_command_databyte(painter_device_t device, uint8_t cmd, uint8_t data) {
|
||||
bool qp_comms_command_databyte(painter_device_t device, uint8_t cmd, uint8_t data) {
|
||||
qp_comms_command(device, cmd);
|
||||
qp_comms_send(device, &data, sizeof(data));
|
||||
return qp_comms_send(device, &data, sizeof(data));
|
||||
}
|
||||
|
||||
uint32_t qp_comms_command_databuf(painter_device_t device, uint8_t cmd, const void *data, uint32_t byte_count) {
|
||||
@@ -65,8 +65,8 @@ uint32_t qp_comms_command_databuf(painter_device_t device, uint8_t cmd, const vo
|
||||
return qp_comms_send(device, data, byte_count);
|
||||
}
|
||||
|
||||
void qp_comms_bulk_command_sequence(painter_device_t device, const uint8_t *sequence, size_t sequence_len) {
|
||||
bool qp_comms_bulk_command_sequence(painter_device_t device, const uint8_t *sequence, size_t sequence_len) {
|
||||
painter_driver_t * driver = (painter_driver_t *)device;
|
||||
painter_comms_with_command_vtable_t *comms_vtable = (painter_comms_with_command_vtable_t *)driver->comms_vtable;
|
||||
comms_vtable->bulk_command_sequence(device, sequence, sequence_len);
|
||||
return comms_vtable->bulk_command_sequence(device, sequence, sequence_len);
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ uint32_t qp_comms_send(painter_device_t device, const void* data, uint32_t byte_
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Comms APIs that use a D/C pin
|
||||
|
||||
void qp_comms_command(painter_device_t device, uint8_t cmd);
|
||||
void qp_comms_command_databyte(painter_device_t device, uint8_t cmd, uint8_t data);
|
||||
bool qp_comms_command(painter_device_t device, uint8_t cmd);
|
||||
bool qp_comms_command_databyte(painter_device_t device, uint8_t cmd, uint8_t data);
|
||||
uint32_t qp_comms_command_databuf(painter_device_t device, uint8_t cmd, const void* data, uint32_t byte_count);
|
||||
void qp_comms_bulk_command_sequence(painter_device_t device, const uint8_t* sequence, size_t sequence_len);
|
||||
bool qp_comms_bulk_command_sequence(painter_device_t device, const uint8_t* sequence, size_t sequence_len);
|
||||
|
||||
@@ -36,7 +36,7 @@ typedef struct painter_driver_vtable_t {
|
||||
|
||||
typedef bool (*painter_driver_comms_init_func)(painter_device_t device);
|
||||
typedef bool (*painter_driver_comms_start_func)(painter_device_t device);
|
||||
typedef void (*painter_driver_comms_stop_func)(painter_device_t device);
|
||||
typedef bool (*painter_driver_comms_stop_func)(painter_device_t device);
|
||||
typedef uint32_t (*painter_driver_comms_send_func)(painter_device_t device, const void *data, uint32_t byte_count);
|
||||
|
||||
typedef struct painter_comms_vtable_t {
|
||||
@@ -46,8 +46,8 @@ typedef struct painter_comms_vtable_t {
|
||||
painter_driver_comms_send_func comms_send;
|
||||
} painter_comms_vtable_t;
|
||||
|
||||
typedef void (*painter_driver_comms_send_command_func)(painter_device_t device, uint8_t cmd);
|
||||
typedef void (*painter_driver_comms_bulk_command_sequence)(painter_device_t device, const uint8_t *sequence, size_t sequence_len);
|
||||
typedef bool (*painter_driver_comms_send_command_func)(painter_device_t device, uint8_t cmd);
|
||||
typedef bool (*painter_driver_comms_bulk_command_sequence)(painter_device_t device, const uint8_t *sequence, size_t sequence_len);
|
||||
|
||||
typedef struct painter_comms_with_command_vtable_t {
|
||||
painter_comms_vtable_t base; // must be first, so this object can be cast from the painter_comms_vtable_t* type
|
||||
|
||||
@@ -37,6 +37,10 @@
|
||||
#include "version.h" // for QMK_BUILDDATE used in EEPROM magic
|
||||
#include "nvm_via.h"
|
||||
|
||||
#if defined(SECURE_ENABLE)
|
||||
# include "secure.h"
|
||||
#endif
|
||||
|
||||
#if defined(AUDIO_ENABLE)
|
||||
# include "audio.h"
|
||||
#endif
|
||||
@@ -322,8 +326,13 @@ void raw_hid_receive(uint8_t *data, uint8_t length) {
|
||||
uint8_t rows = 28 / ((MATRIX_COLS + 7) / 8);
|
||||
uint8_t i = 2;
|
||||
for (uint8_t row = 0; row < rows && row + offset < MATRIX_ROWS; row++) {
|
||||
#ifdef VIA_INSECURE
|
||||
#if defined(VIA_INSECURE)
|
||||
matrix_row_t value = matrix_get_row(row + offset);
|
||||
#elif defined(SECURE_ENABLE)
|
||||
matrix_row_t value = 0;
|
||||
if (secure_is_unlocked()) {
|
||||
value = matrix_get_row(row + offset);
|
||||
}
|
||||
#else
|
||||
matrix_row_t value = 0;
|
||||
#endif
|
||||
|
||||
594
util/env-bootstrap.sh
Executable file
594
util/env-bootstrap.sh
Executable file
@@ -0,0 +1,594 @@
|
||||
#!/usr/bin/env sh
|
||||
# Copyright 2025 Nick Brassel (@tzarc)
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
################################################################################
|
||||
# This script will install the QMK CLI, toolchains, and flashing utilities.
|
||||
################################################################################
|
||||
# Environment variables:
|
||||
# CONFIRM: Skip the pre-install delay. (or: --confirm)
|
||||
# QMK_DISTRIB_DIR: The directory to install the QMK distribution to. (or: --qmk-distrib-dir=...)
|
||||
# UV_INSTALL_DIR: The directory to install `uv` to. (or: --uv-install-dir=...)
|
||||
# UV_TOOL_DIR: The directory to install `uv` tools to. (or: --uv-tool-dir=...)
|
||||
# SKIP_CLEAN: Skip cleaning the distribution directory. (or: --skip-clean)
|
||||
# SKIP_PACKAGE_MANAGER: Skip installing the necessary packages for the package manager. (or: --skip-package-manager)
|
||||
# SKIP_UV: Skip installing `uv`. (or: --skip-uv)
|
||||
# SKIP_QMK_CLI: Skip installing the QMK CLI. (or: --skip-qmk-cli)
|
||||
# SKIP_QMK_TOOLCHAINS: Skip installing the QMK toolchains. (or: --skip-qmk-toolchains)
|
||||
# SKIP_QMK_FLASHUTILS: Skip installing the QMK flashing utilities. (or: --skip-qmk-flashutils)
|
||||
# SKIP_UDEV_RULES: Skip installing the udev rules for Linux. (or: --skip-udev-rules)
|
||||
# SKIP_WINDOWS_DRIVERS: Skip installing the Windows drivers for the flashing utilities. (or: --skip-windows-drivers)
|
||||
#
|
||||
# Arguments above may be negated by prefixing with `--no-` instead (e.g. `--no-skip-clean`).
|
||||
################################################################################
|
||||
# Usage:
|
||||
# curl -fsSL https://raw.githubusercontent.com/qmk/qmk_firmware/master/util/env-bootstrap.sh | sh
|
||||
#
|
||||
# Help:
|
||||
# curl -fsSL https://raw.githubusercontent.com/qmk/qmk_firmware/master/util/env-bootstrap.sh | sh -s -- --help
|
||||
#
|
||||
# An example which skips installing `uv` using environment variables:
|
||||
# curl -fsSL https://raw.githubusercontent.com/qmk/qmk_firmware/master/util/env-bootstrap.sh | SKIP_UV=1 sh
|
||||
#
|
||||
# ...or by using command line arguments:
|
||||
# curl -fsSL https://raw.githubusercontent.com/qmk/qmk_firmware/master/util/env-bootstrap.sh | sh -s -- --skip-uv
|
||||
#
|
||||
# Any other configurable items listed above may be specified in the same way.
|
||||
################################################################################
|
||||
|
||||
{ # this ensures the entire script is downloaded #
|
||||
set -eu
|
||||
|
||||
BOOTSTRAP_TMPDIR="$(mktemp -d /tmp/qmk-bootstrap-failure.XXXXXX)"
|
||||
trap 'rm -rf "$BOOTSTRAP_TMPDIR" >/dev/null 2>&1 || true' EXIT
|
||||
FAILURE_FILE="${BOOTSTRAP_TMPDIR}/fail"
|
||||
|
||||
# Work out which `sed` to use
|
||||
command -v gsed >/dev/null 2>&1 && SED=gsed || SED=sed
|
||||
|
||||
script_args() {
|
||||
cat <<__EOT__
|
||||
--help -- Shows this help text
|
||||
--confirm -- Skips the delay before installation
|
||||
--uv-install-dir={path} -- The directory to install \`uv\` into
|
||||
--uv-tool-dir={path} -- The directory to install \`uv\` tools into
|
||||
--qmk-distrib-dir={path} -- The directory to install the QMK distribution into
|
||||
--skip-clean -- Skip cleaning the QMK distribution directory
|
||||
--skip-package-manager -- Skip installing the necessary packages for the package manager
|
||||
--skip-uv -- Skip installing \`uv\`
|
||||
--skip-qmk-cli -- Skip installing the QMK CLI
|
||||
--skip-qmk-toolchains -- Skip installing the QMK toolchains
|
||||
--skip-qmk-flashutils -- Skip installing the QMK flashing utilities
|
||||
--skip-udev-rules -- Skip installing the udev rules for Linux
|
||||
--skip-windows-drivers -- Skip installing the Windows drivers for the flashing utilities
|
||||
__EOT__
|
||||
# Hidden:
|
||||
# --wsl-install -- Installs the WSL variant of qmk_flashutils
|
||||
}
|
||||
|
||||
signal_execution_failure() {
|
||||
touch "$FAILURE_FILE" >/dev/null 2>&1 || true
|
||||
}
|
||||
|
||||
exit_if_execution_failed() {
|
||||
if [ -e "$FAILURE_FILE" ]; then
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
script_help() {
|
||||
echo "$(basename ${this_script:-qmk-install.sh}) $(script_args | sort | ${SED} -e 's@^\s*@@g' -e 's@\s\+--.*@@g' -e 's@^@[@' -e 's@$@]@' | tr '\n' ' ')"
|
||||
echo
|
||||
echo "Arguments:"
|
||||
script_args
|
||||
echo
|
||||
echo "Switch arguments may be negated by prefixing with '--no-' (e.g. '--no-skip-clean')."
|
||||
}
|
||||
|
||||
script_parse_args() {
|
||||
local N
|
||||
local V
|
||||
while [ ! -z "${1:-}" ]; do
|
||||
case "$1" in
|
||||
--help)
|
||||
script_help
|
||||
exit 0
|
||||
;;
|
||||
--*=*)
|
||||
N=${1%%=*}
|
||||
N=${N##--}
|
||||
N=$(echo $N | tr '-' '_' | tr 'a-z' 'A-Z')
|
||||
V=${1##*=}
|
||||
export $N="$V"
|
||||
;;
|
||||
--no-*)
|
||||
N=${1##--no-}
|
||||
N=$(echo $N | tr '-' '_' | tr 'a-z' 'A-Z')
|
||||
unset $N
|
||||
;;
|
||||
--*)
|
||||
N=${1##--}
|
||||
N=$(echo $N | tr '-' '_' | tr 'a-z' 'A-Z')
|
||||
export $N=true
|
||||
;;
|
||||
*)
|
||||
echo "Unknown argument: '$1'" >&2
|
||||
echo
|
||||
script_help >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
unset N
|
||||
unset V
|
||||
done
|
||||
}
|
||||
|
||||
nsudo() {
|
||||
if [ "$(fn_os)" = "windows" ]; then
|
||||
# No need for sudo under QMK MSYS
|
||||
return
|
||||
elif [ $(id -u) -ne 0 ]; then
|
||||
if [ -n "$(command -v sudo 2>/dev/null || true)" ]; then
|
||||
echo "sudo"
|
||||
elif [ -n "$(command -v doas 2>/dev/null || true)" ]; then
|
||||
echo "doas"
|
||||
else
|
||||
echo "Please install 'sudo' or 'doas' to continue." >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
true
|
||||
}
|
||||
|
||||
download_url() {
|
||||
local url=$1
|
||||
local filename=${2:-$(basename "$url")}
|
||||
local quiet=''
|
||||
if [ -n "$(command -v curl 2>/dev/null || true)" ]; then
|
||||
[ "$filename" = "-" ] && quiet='-s' || echo "Downloading '$url' => '$filename'" >&2
|
||||
curl -LSf $quiet -o "$filename" "$url"
|
||||
elif [ -n "$(command -v wget 2>/dev/null || true)" ]; then
|
||||
[ "$filename" = "-" ] && quiet='-q' || echo "Downloading '$url' => '$filename'" >&2
|
||||
wget $quiet "-O$filename" "$url"
|
||||
else
|
||||
echo "Please install 'curl' to continue." >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
github_api_call() {
|
||||
local url="$1"
|
||||
local token="${GITHUB_TOKEN:-${GH_TOKEN:-}}"
|
||||
if [ -n "${token:-}" ]; then
|
||||
if [ -n "$(command -v curl 2>/dev/null || true)" ]; then
|
||||
curl -fsSL -H "Authorization: token $token" -H "Accept: application/vnd.github.v3+json" "https://api.github.com/$url"
|
||||
elif [ -n "$(command -v wget 2>/dev/null || true)" ]; then
|
||||
wget -q --header="Authorization: token $token" --header="Accept: application/vnd.github.v3+json" "https://api.github.com/$url" -O -
|
||||
fi
|
||||
else
|
||||
download_url "https://api.github.com/$url" -
|
||||
fi
|
||||
}
|
||||
|
||||
fn_os() {
|
||||
local os_name=$(echo ${1:-} | tr 'A-Z' 'a-z')
|
||||
if [ -z "$os_name" ]; then
|
||||
os_name=$(uname -s | tr 'A-Z' 'a-z')
|
||||
fi
|
||||
case "$os_name" in
|
||||
*darwin* | *macos* | *apple*)
|
||||
echo macos
|
||||
;;
|
||||
*windows* | *mingw* | *msys*)
|
||||
echo windows
|
||||
;;
|
||||
*linux*)
|
||||
echo linux
|
||||
;;
|
||||
*)
|
||||
echo unknown
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
fn_arch() {
|
||||
local arch_name=$(echo ${1:-} | tr 'A-Z' 'a-z')
|
||||
if [ -z "$arch_name" ]; then
|
||||
arch_name=$(uname -m | tr 'A-Z' 'a-z')
|
||||
fi
|
||||
case "$arch_name" in
|
||||
*arm64* | *aarch64*)
|
||||
echo ARM64
|
||||
;;
|
||||
*riscv64*)
|
||||
echo RV64
|
||||
;;
|
||||
*x86_64* | *x64*)
|
||||
echo X64
|
||||
;;
|
||||
*)
|
||||
echo unknown
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
preinstall_delay() {
|
||||
[ -z "${CONFIRM:-}" ] || return 0
|
||||
echo >&2
|
||||
echo "Waiting 10 seconds before proceeding. Press Ctrl+C to cancel installation." >&2
|
||||
sleep 10
|
||||
}
|
||||
|
||||
get_package_manager_deps() {
|
||||
case $(fn_os) in
|
||||
macos) echo "zstd clang-format make hidapi libusb dos2unix git" ;;
|
||||
windows) echo "base-devel: zstd:p toolchain:p clang:p hidapi:p dos2unix: git: unzip:" ;;
|
||||
linux)
|
||||
case $(grep ID /etc/os-release) in
|
||||
*arch* | *manjaro* | *cachyos*) echo "zstd base-devel clang diffutils wget unzip zip hidapi dos2unix git" ;;
|
||||
*debian* | *ubuntu*) echo "zstd build-essential clang-format diffutils wget unzip zip libhidapi-hidraw0 dos2unix git" ;;
|
||||
*fedora*) echo "zstd clang diffutils which gcc git wget unzip zip hidapi dos2unix libusb-devel libusb1-devel libusb-compat-0.1-devel libusb0-devel git epel-release" ;;
|
||||
*suse*) echo "zstd clang diffutils wget unzip zip libhidapi-hidraw0 dos2unix git libusb-1_0-devel gzip which" ;;
|
||||
*gentoo*) echo "zstd diffutils wget unzip zip dev-libs/hidapi dos2unix dev-vcs/git dev-libs/libusb app-arch/gzip which" ;;
|
||||
*)
|
||||
echo >&2
|
||||
echo "Sorry, we don't recognize your distribution." >&2
|
||||
echo >&2
|
||||
echo "Proceeding with the installation, however you will need to install at least the following tools manually:" >&2
|
||||
echo " - make, git, curl, zstd, unzip, [lib]hidapi" >&2
|
||||
echo "Other tools may be required depending on your distribution." >&2
|
||||
echo >&2
|
||||
echo "Alternatively, if you prefer Docker, try using the docker image instead:" >&2
|
||||
echo " - https://docs.qmk.fm/#/getting_started_docker" >&2
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
# We can only really support macOS, Windows, and Linux at this time due to `uv` requirements.
|
||||
echo >&2
|
||||
echo "Sorry, we don't recognize your OS. Try using a compatible OS instead:" >&2
|
||||
echo " - https://docs.qmk.fm/newbs_getting_started#set-up-your-environment" >&2
|
||||
echo >&2
|
||||
echo "If you cannot use a compatible OS, you can try installing the \`qmk\` Python package manually using \`pip\`, most likely requiring a virtual environment:" >&2
|
||||
echo " % python3 -m pip install qmk" >&2
|
||||
echo >&2
|
||||
echo "All other dependencies will need to be installed manually, such as make, git, AVR and ARM toolchains, and associated flashing utilities." >&2
|
||||
echo >&2
|
||||
echo "**NOTE**: QMK does not provide official support for your environment. Here be dragons, you are on your own." >&2
|
||||
signal_execution_failure
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
print_package_manager_deps_and_delay() {
|
||||
get_package_manager_deps | tr ' ' '\n' | sort | xargs -I'{}' echo " - {}" >&2
|
||||
exit_if_execution_failed
|
||||
preinstall_delay || exit 1
|
||||
}
|
||||
|
||||
install_package_manager_deps() {
|
||||
# Install the necessary packages for the package manager
|
||||
case $(fn_os) in
|
||||
macos)
|
||||
if [ -n "$(command -v brew 2>/dev/null || true)" ]; then
|
||||
echo "It will also install the following system packages using 'brew':" >&2
|
||||
print_package_manager_deps_and_delay
|
||||
|
||||
brew update
|
||||
|
||||
local existing=""
|
||||
local new=""
|
||||
for dep in $(get_package_manager_deps); do
|
||||
if brew list --formula | grep -q "^${dep}\$"; then
|
||||
existing="${existing:-} $dep"
|
||||
else
|
||||
new="${new:-} $dep"
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -n "${existing:-}" ]; then
|
||||
brew upgrade $existing
|
||||
fi
|
||||
if [ -n "${new:-}" ]; then
|
||||
brew install $new
|
||||
fi
|
||||
else
|
||||
echo "Please install 'brew' to continue. See https://brew.sh/ for more information." >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
windows)
|
||||
echo "It will also install the following packages using 'pacman'/'pacboy':" >&2
|
||||
print_package_manager_deps_and_delay
|
||||
$(nsudo) pacman --needed --noconfirm --disable-download-timeout -S pactoys
|
||||
$(nsudo) pacboy sync --needed --noconfirm --disable-download-timeout $(get_package_manager_deps)
|
||||
;;
|
||||
linux)
|
||||
case $(grep ID /etc/os-release) in
|
||||
*arch* | *manjaro* | *cachyos*)
|
||||
echo "It will also install the following system packages using 'pacman':" >&2
|
||||
print_package_manager_deps_and_delay
|
||||
$(nsudo) pacman --needed --noconfirm -S $(get_package_manager_deps)
|
||||
;;
|
||||
*debian* | *ubuntu*)
|
||||
echo "It will also install the following system packages using 'apt':" >&2
|
||||
print_package_manager_deps_and_delay
|
||||
$(nsudo) apt-get update
|
||||
DEBIAN_FRONTEND=noninteractive \
|
||||
$(nsudo) apt-get --quiet --yes install $(get_package_manager_deps)
|
||||
;;
|
||||
*fedora*)
|
||||
echo "It will also install the following system packages using 'dnf':" >&2
|
||||
print_package_manager_deps_and_delay
|
||||
# Some RHEL-likes need EPEL for hidapi
|
||||
$(nsudo) dnf -y install epel-release 2>/dev/null || true
|
||||
# RHEL-likes have some naming differences in libusb packages, so manually handle those
|
||||
$(nsudo) dnf -y install $(get_package_manager_deps | tr ' ' '\n' | grep -v 'epel-release' | grep -v libusb | tr '\n' ' ')
|
||||
for pkg in $(get_package_manager_deps | tr ' ' '\n' | grep libusb); do
|
||||
$(nsudo) dnf -y install "$pkg" 2>/dev/null || true
|
||||
done
|
||||
;;
|
||||
*opensuse* | *suse*)
|
||||
echo "It will also install development tools as well as the following system packages using 'zypper':" >&2
|
||||
print_package_manager_deps_and_delay
|
||||
$(nsudo) zypper --non-interactive refresh
|
||||
$(nsudo) zypper --non-interactive install -t pattern devel_basis devel_C_C++
|
||||
$(nsudo) zypper --non-interactive install $(get_package_manager_deps)
|
||||
;;
|
||||
*gentoo*)
|
||||
echo "It will also install the following system packages using 'emerge':" >&2
|
||||
print_package_manager_deps_and_delay
|
||||
$(nsudo) emerge --sync
|
||||
$(nsudo) emerge --noreplace --ask=n $(get_package_manager_deps | tr ' ' '\n') || signal_execution_failure
|
||||
exit_if_execution_failed
|
||||
;;
|
||||
*)
|
||||
print_package_manager_deps_and_delay
|
||||
echo "Proceeding with the installation, you will need to ensure prerequisites are installed." >&2
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
print_package_manager_deps_and_delay
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
install_uv() {
|
||||
# Install `uv` (or update as necessary)
|
||||
download_url https://astral.sh/uv/install.sh - | TMPDIR="$(windows_ish_path "${TMPDIR:-}")" UV_INSTALL_DIR="$(windows_ish_path "${UV_INSTALL_DIR:-}")" sh
|
||||
}
|
||||
|
||||
setup_paths() {
|
||||
# Set up the paths for any of the locations `uv` expects
|
||||
if [ -n "${XDG_BIN_HOME:-}" ]; then
|
||||
export PATH="$XDG_BIN_HOME:$PATH"
|
||||
fi
|
||||
if [ -n "${XDG_DATA_HOME:-}" ]; then
|
||||
export PATH="$XDG_DATA_HOME/../bin:$PATH"
|
||||
fi
|
||||
[ ! -d "$HOME/.local/bin" ] || export PATH="$HOME/.local/bin:$PATH"
|
||||
|
||||
if [ -n "${UV_INSTALL_DIR:-}" ]; then
|
||||
export PATH="$UV_INSTALL_DIR/bin:$UV_INSTALL_DIR:$PATH" # cater for both "flat" and "hierarchical" installs of `uv`
|
||||
fi
|
||||
|
||||
if [ -n "${UV_TOOL_BIN_DIR:-}" ]; then
|
||||
export PATH="$UV_TOOL_BIN_DIR:$PATH"
|
||||
fi
|
||||
}
|
||||
|
||||
uv_command() {
|
||||
if [ "$(fn_os)" = "windows" ]; then
|
||||
UV_TOOL_DIR="$(windows_ish_path "${UV_TOOL_DIR:-}")" \
|
||||
UV_TOOL_BIN_DIR="$(windows_ish_path "${UV_TOOL_BIN_DIR:-}")" \
|
||||
uv "$@"
|
||||
else
|
||||
uv "$@"
|
||||
fi
|
||||
}
|
||||
|
||||
install_qmk_cli() {
|
||||
# Install the QMK CLI
|
||||
uv_command tool install --force --with pip --upgrade --python $PYTHON_TARGET_VERSION qmk
|
||||
|
||||
# QMK is installed to...
|
||||
local qmk_tooldir="$(posix_ish_path "$(uv_command tool dir)/qmk")"
|
||||
|
||||
# Activate the environment
|
||||
if [ -e "$qmk_tooldir/bin" ]; then
|
||||
. "$qmk_tooldir/bin/activate"
|
||||
elif [ -e "$qmk_tooldir/Scripts" ]; then
|
||||
. "$qmk_tooldir/Scripts/activate"
|
||||
else
|
||||
echo "Could not find the QMK environment to activate." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Install the QMK dependencies
|
||||
uv_command pip install --upgrade -r https://raw.githubusercontent.com/qmk/qmk_firmware/refs/heads/master/requirements.txt
|
||||
uv_command pip install --upgrade -r https://raw.githubusercontent.com/qmk/qmk_firmware/refs/heads/master/requirements-dev.txt
|
||||
|
||||
# Deactivate the environment
|
||||
deactivate
|
||||
}
|
||||
|
||||
install_toolchains() {
|
||||
# Get the latest toolchain release from https://github.com/qmk/qmk_toolchains
|
||||
local latest_toolchains_release=$(github_api_call repos/qmk/qmk_toolchains/releases/latest - | grep -oE '"tag_name": "[^"]+' | grep -oE '[^"]+$')
|
||||
# Download the specific release asset with a matching keyword
|
||||
local toolchain_url=$(github_api_call repos/qmk/qmk_toolchains/releases/tags/$latest_toolchains_release - | grep -oE '"browser_download_url": "[^"]+"' | grep -oE 'https://[^"]+' | grep $(fn_os)$(fn_arch))
|
||||
if [ -z "$toolchain_url" ]; then
|
||||
echo "No toolchain found for this OS/Arch combination." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Download the toolchain release to the toolchains location
|
||||
echo "Downloading compiler toolchains..." >&2
|
||||
local target_file="$QMK_DISTRIB_DIR/$(basename "$toolchain_url")"
|
||||
download_url "$toolchain_url" "$target_file"
|
||||
|
||||
# Extract the toolchain
|
||||
echo "Extracting compiler toolchains to '$QMK_DISTRIB_DIR'..." >&2
|
||||
zstdcat "$target_file" | tar xf - -C "$QMK_DISTRIB_DIR" --strip-components=1
|
||||
}
|
||||
|
||||
install_flashing_tools() {
|
||||
local osarchvariant="$(fn_os)$(fn_arch)"
|
||||
|
||||
# Special case for WSL
|
||||
if [ -n "${WSL_INSTALL:-}" ] || [ -n "${WSL_DISTRO_NAME:-}" ] || [ -f /proc/sys/fs/binfmt_misc/WSLInterop ]; then
|
||||
osarchvariant="windowsWSL"
|
||||
fi
|
||||
|
||||
# Get the latest flashing tools release from https://github.com/qmk/qmk_flashutils
|
||||
local latest_flashutils_release=$(github_api_call repos/qmk/qmk_flashutils/releases/latest - | grep -oE '"tag_name": "[^"]+' | grep -oE '[^"]+$')
|
||||
# Download the specific release asset with a matching keyword
|
||||
local flashutils_url=$(github_api_call repos/qmk/qmk_flashutils/releases/tags/$latest_flashutils_release - | grep -oE '"browser_download_url": "[^"]+"' | grep -oE 'https://[^"]+' | grep "$osarchvariant")
|
||||
if [ -z "$flashutils_url" ]; then
|
||||
echo "No flashing tools found for this OS/Arch combination." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Download the flashing tools release to the toolchains location
|
||||
echo "Downloading flashing tools..." >&2
|
||||
local target_file="$QMK_DISTRIB_DIR/$(basename "$flashutils_url")"
|
||||
download_url "$flashutils_url" "$target_file"
|
||||
|
||||
# Extract the flashing tools
|
||||
echo "Extracting flashing tools to '$QMK_DISTRIB_DIR'..." >&2
|
||||
zstdcat "$target_file" | tar xf - -C "$QMK_DISTRIB_DIR/bin"
|
||||
# Move the release file to etc
|
||||
mv "$QMK_DISTRIB_DIR/bin/flashutils_release"* "$QMK_DISTRIB_DIR/etc"
|
||||
}
|
||||
|
||||
install_linux_udev_rules() {
|
||||
# Download the udev rules to the toolchains location
|
||||
echo "Downloading QMK udev rules file..." >&2
|
||||
local qmk_rules_target_file="$QMK_DISTRIB_DIR/50-qmk.rules"
|
||||
download_url "https://raw.githubusercontent.com/qmk/qmk_firmware/refs/heads/master/util/udev/50-qmk.rules" "$qmk_rules_target_file"
|
||||
|
||||
# Install the udev rules -- path list is aligned with qmk doctor's linux.py
|
||||
local udev_rules_paths="
|
||||
/usr/lib/udev/rules.d
|
||||
/usr/local/lib/udev/rules.d
|
||||
/run/udev/rules.d
|
||||
/etc/udev/rules.d
|
||||
"
|
||||
for udev_rules_dir in $udev_rules_paths; do
|
||||
if [ -d "$udev_rules_dir" ]; then
|
||||
echo "Installing udev rules to $udev_rules_dir/50-qmk.rules ..." >&2
|
||||
$(nsudo) mv "$qmk_rules_target_file" "$udev_rules_dir"
|
||||
$(nsudo) chown 0:0 "$udev_rules_dir/50-qmk.rules"
|
||||
$(nsudo) chmod 644 "$udev_rules_dir/50-qmk.rules"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
# Reload udev rules
|
||||
if command -v udevadm >/dev/null 2>&1; then
|
||||
echo "Reloading udev rules..." >&2
|
||||
$(nsudo) udevadm control --reload-rules || true
|
||||
$(nsudo) udevadm trigger || true
|
||||
else
|
||||
echo "udevadm not found, skipping udev rules reload." >&2
|
||||
fi
|
||||
}
|
||||
|
||||
install_windows_drivers() {
|
||||
# Get the latest driver installer release from https://github.com/qmk/qmk_driver_installer
|
||||
local latest_driver_installer_release=$(github_api_call repos/qmk/qmk_driver_installer/releases/latest - | grep -oE '"tag_name": "[^"]+' | grep -oE '[^"]+$')
|
||||
# Download the specific release asset
|
||||
local driver_installer_url=$(github_api_call repos/qmk/qmk_driver_installer/releases/tags/$latest_driver_installer_release - | grep -oE '"browser_download_url": "[^"]+"' | grep -oE 'https://[^"]+' | grep '\.exe')
|
||||
if [ -z "$driver_installer_url" ]; then
|
||||
echo "No driver installer found." >&2
|
||||
exit 1
|
||||
fi
|
||||
# Download the driver installer release to the toolchains location
|
||||
echo "Downloading driver installer..." >&2
|
||||
local target_file="$QMK_DISTRIB_DIR/$(basename "$driver_installer_url")"
|
||||
download_url "$driver_installer_url" "$target_file"
|
||||
# Download the drivers list
|
||||
download_url "https://raw.githubusercontent.com/qmk/qmk_firmware/refs/heads/master/util/drivers.txt" "$QMK_DISTRIB_DIR/drivers.txt"
|
||||
# Execute the driver installer
|
||||
cd "$QMK_DISTRIB_DIR"
|
||||
cmd.exe //c "qmk_driver_installer.exe --all --force drivers.txt"
|
||||
cd -
|
||||
# Remove the temporary files
|
||||
rm -f "$QMK_DISTRIB_DIR/qmk_driver_installer.exe" "$QMK_DISTRIB_DIR/drivers.txt" || true
|
||||
}
|
||||
|
||||
clean_tarballs() {
|
||||
# Clean up the tarballs
|
||||
rm -f "$QMK_DISTRIB_DIR"/*.tar.zst || true
|
||||
}
|
||||
|
||||
windows_ish_path() {
|
||||
[ -n "$1" ] || return 0
|
||||
[ "$(uname -o 2>/dev/null || true)" = "Msys" ] && cygpath -w "$1" || echo "$1"
|
||||
}
|
||||
|
||||
posix_ish_path() {
|
||||
[ -n "$1" ] || return 0
|
||||
[ "$(uname -o 2>/dev/null || true)" = "Msys" ] && cygpath -u "$1" || echo "$1"
|
||||
}
|
||||
|
||||
# Set the Python version we want to use with the QMK CLI
|
||||
export PYTHON_TARGET_VERSION=${PYTHON_TARGET_VERSION:-3.14}
|
||||
|
||||
# Windows/MSYS doesn't like `/tmp` so we need to set a different temporary directory.
|
||||
# Also set the default `UV_INSTALL_DIR` and `QMK_DISTRIB_DIR` to locations which don't pollute the user's home directory, keeping the installation internal to MSYS.
|
||||
if [ "$(uname -o 2>/dev/null || true)" = "Msys" ]; then
|
||||
export TMPDIR="$(posix_ish_path "$TMP")"
|
||||
export UV_INSTALL_DIR="$(posix_ish_path "${UV_INSTALL_DIR:-/opt/uv}")"
|
||||
export QMK_DISTRIB_DIR="$(posix_ish_path "${QMK_DISTRIB_DIR:-/opt/qmk}")"
|
||||
export UV_TOOL_DIR="$(posix_ish_path "${UV_TOOL_DIR:-"$UV_INSTALL_DIR/tools"}")"
|
||||
export UV_TOOL_BIN_DIR="$(posix_ish_path "$UV_TOOL_DIR/bin")"
|
||||
fi
|
||||
|
||||
script_parse_args "$@"
|
||||
|
||||
echo "This QMK CLI installation script will install \`uv\`, the QMK CLI, as well as QMK-supplied toolchains and flashing utilities." >&2
|
||||
[ -z "${SKIP_PACKAGE_MANAGER:-}" ] || { preinstall_delay || exit 1; }
|
||||
[ -n "${SKIP_PACKAGE_MANAGER:-}" ] || install_package_manager_deps
|
||||
[ -n "${SKIP_UV:-}" ] || install_uv
|
||||
|
||||
# Make sure the usual `uv` and other associated directories are on the $PATH
|
||||
setup_paths
|
||||
|
||||
# Work out where we want to install the distribution and tools now that `uv` is installed
|
||||
export QMK_DISTRIB_DIR="$(posix_ish_path "${QMK_DISTRIB_DIR:-$(printf 'import platformdirs\nprint(platformdirs.user_data_dir("qmk"))' | uv_command run --quiet --python $PYTHON_TARGET_VERSION --with platformdirs -)}")"
|
||||
|
||||
# Clear out the distrib directory if necessary
|
||||
if [ -z "${SKIP_CLEAN:-}" ] || [ -z "${SKIP_QMK_TOOLCHAINS:-}" -a -z "${SKIP_QMK_FLASHUTILS:-}" ]; then
|
||||
if [ -d "$QMK_DISTRIB_DIR" ]; then
|
||||
echo "Removing old QMK distribution..." >&2
|
||||
rm -rf "$QMK_DISTRIB_DIR"
|
||||
fi
|
||||
fi
|
||||
mkdir -p "$QMK_DISTRIB_DIR"
|
||||
|
||||
[ -n "${SKIP_QMK_CLI:-}" ] || install_qmk_cli
|
||||
[ -n "${SKIP_QMK_TOOLCHAINS:-}" ] || install_toolchains
|
||||
[ -n "${SKIP_QMK_FLASHUTILS:-}" ] || install_flashing_tools
|
||||
if [ "$(uname -s 2>/dev/null || true)" = "Linux" ]; then
|
||||
[ -n "${SKIP_UDEV_RULES:-}" ] || install_linux_udev_rules
|
||||
fi
|
||||
if [ "$(uname -o 2>/dev/null || true)" = "Msys" ]; then
|
||||
[ -n "${SKIP_WINDOWS_DRIVERS:-}" ] || install_windows_drivers
|
||||
fi
|
||||
clean_tarballs
|
||||
|
||||
# Notify the user that they may need to restart their shell to get the `qmk` command
|
||||
echo >&2
|
||||
echo "QMK CLI installation complete." >&2
|
||||
echo "The QMK CLI has been installed to '$(posix_ish_path "$(dirname "$(command -v qmk)")")'." >&2
|
||||
echo "The QMK CLI venv has been created at '$(posix_ish_path "$(uv_command tool dir)/qmk")'." >&2
|
||||
echo "Toolchains and flashing utilities have been installed to '$QMK_DISTRIB_DIR'." >&2
|
||||
echo >&2
|
||||
echo "You may need to restart your shell to gain access to the 'qmk' command." >&2
|
||||
echo "Alternatively, add "$(posix_ish_path "$(dirname "$(command -v qmk)")")" to your \$PATH:" >&2
|
||||
echo " export PATH=\"$(posix_ish_path "$(dirname "$(command -v qmk)")"):\$PATH\"" >&2
|
||||
|
||||
} # this ensures the entire script is downloaded #
|
||||
Reference in New Issue
Block a user