Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
936c341ef8 |
9876 changed files with 50881 additions and 228621 deletions
9
.github/dependabot.yml
vendored
9
.github/dependabot.yml
vendored
|
|
@ -1,9 +0,0 @@
|
||||||
version: 2
|
|
||||||
updates:
|
|
||||||
- package-ecosystem: "github-actions"
|
|
||||||
directory: "/"
|
|
||||||
labels: CI
|
|
||||||
reviewers:
|
|
||||||
- "qmk/collaborators"
|
|
||||||
schedule:
|
|
||||||
interval: "daily"
|
|
||||||
58
.github/stale.yml
vendored
Normal file
58
.github/stale.yml
vendored
Normal file
|
|
@ -0,0 +1,58 @@
|
||||||
|
# Configuration for probot-stale - https://github.com/probot/stale
|
||||||
|
|
||||||
|
# General configuration
|
||||||
|
|
||||||
|
# Pull request specific configuration
|
||||||
|
pulls:
|
||||||
|
staleLabel: awaiting changes
|
||||||
|
# Number of days of inactivity before an Issue or Pull Request becomes stale
|
||||||
|
daysUntilStale: 45
|
||||||
|
# Number of days of inactivity before a stale Issue or Pull Request is closed.
|
||||||
|
# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale.
|
||||||
|
daysUntilClose: 30
|
||||||
|
# Comment to post when marking as stale. Set to `false` to disable
|
||||||
|
markComment: >
|
||||||
|
Thank you for your contribution!
|
||||||
|
|
||||||
|
This pull request has been automatically marked as stale because it has not had
|
||||||
|
activity in the last 45 days. It will be closed in 30 days if no further activity occurs.
|
||||||
|
Please feel free to give a status update now, or re-open when it's ready.
|
||||||
|
|
||||||
|
For maintainers: Please label with `awaiting review`, `breaking_change`, `in progress`, or `on hold` to prevent
|
||||||
|
the issue from being re-flagged.
|
||||||
|
# Comment to post when closing a stale Issue or Pull Request.
|
||||||
|
closeComment: >
|
||||||
|
Thank you for your contribution!
|
||||||
|
|
||||||
|
This pull request has been automatically closed because it has not had activity in the last 30 days.
|
||||||
|
Please feel free to give a status update now, ping for review, or re-open when it's ready.
|
||||||
|
# Limit the number of actions per hour, from 1-30. Default is 30
|
||||||
|
limitPerRun: 30
|
||||||
|
exemptLabels:
|
||||||
|
- awaiting review
|
||||||
|
- breaking_change
|
||||||
|
- in progress
|
||||||
|
- on hold
|
||||||
|
|
||||||
|
# Issue specific configuration
|
||||||
|
issues:
|
||||||
|
staleLabel: stale
|
||||||
|
limitPerRun: 10
|
||||||
|
daysUntilStale: 90
|
||||||
|
daysUntilClose: 30
|
||||||
|
markComment: >
|
||||||
|
This issue has been automatically marked as stale because it has not had activity in the
|
||||||
|
last 90 days. It will be closed in the next 30 days unless it is tagged properly or other activity
|
||||||
|
occurs.
|
||||||
|
|
||||||
|
For maintainers: Please label with `bug`, `in progress`, `on hold`, `discussion` or `to do` to prevent
|
||||||
|
the issue from being re-flagged.
|
||||||
|
closeComment: >
|
||||||
|
This issue has been automatically closed because it has not had activity in the last 30 days.
|
||||||
|
If this issue is still valid, re-open the issue and let us know.
|
||||||
|
exemptLabels:
|
||||||
|
- bug
|
||||||
|
- in progress
|
||||||
|
- on hold
|
||||||
|
- discussion
|
||||||
|
- to do
|
||||||
4
.github/workflows/api.yml
vendored
4
.github/workflows/api.yml
vendored
|
|
@ -18,7 +18,7 @@ jobs:
|
||||||
if: github.repository == 'qmk/qmk_firmware'
|
if: github.repository == 'qmk/qmk_firmware'
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v2
|
||||||
with:
|
with:
|
||||||
fetch-depth: 1
|
fetch-depth: 1
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
@ -35,4 +35,4 @@ jobs:
|
||||||
AWS_ACCESS_KEY_ID: ${{ secrets.SPACES_ACCESS_KEY }}
|
AWS_ACCESS_KEY_ID: ${{ secrets.SPACES_ACCESS_KEY }}
|
||||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.SPACES_SECRET_KEY }}
|
AWS_SECRET_ACCESS_KEY: ${{ secrets.SPACES_SECRET_KEY }}
|
||||||
AWS_S3_ENDPOINT: https://nyc3.digitaloceanspaces.com
|
AWS_S3_ENDPOINT: https://nyc3.digitaloceanspaces.com
|
||||||
SOURCE_DIR: '.build/api_data'
|
SOURCE_DIR: 'api_data'
|
||||||
|
|
|
||||||
18
.github/workflows/auto_approve.yml
vendored
18
.github/workflows/auto_approve.yml
vendored
|
|
@ -1,18 +0,0 @@
|
||||||
name: Automatic Approve
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: "*/5 * * * *"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
automatic_approve:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
if: github.repository == 'qmk/qmk_firmware'
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: mheap/automatic-approve-action@v1
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.QMK_BOT_TOKEN }}
|
|
||||||
workflows: "format.yml,lint.yml,unit_test.yml"
|
|
||||||
dangerous_files: "lib/python/,Makefile,paths.mk,builddefs/"
|
|
||||||
33
.github/workflows/auto_tag.yaml
vendored
Normal file
33
.github/workflows/auto_tag.yaml
vendored
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
name: Essential files modified
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
paths:
|
||||||
|
- quantum/**/*
|
||||||
|
- tmk_core/**/*
|
||||||
|
- drivers/**/*
|
||||||
|
- tests/**/*
|
||||||
|
- util/**/*
|
||||||
|
- platforms/**/*
|
||||||
|
- Makefile
|
||||||
|
- '*.mk'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
tag:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
# protect against those who develop with their fork on master
|
||||||
|
if: github.repository == 'qmk/qmk_firmware'
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Bump version and push tag
|
||||||
|
uses: anothrNick/github-tag-action@1.26.0
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
DEFAULT_BUMP: 'patch'
|
||||||
33
.github/workflows/auto_tag.yml
vendored
33
.github/workflows/auto_tag.yml
vendored
|
|
@ -1,33 +0,0 @@
|
||||||
name: Essential files modified
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
paths:
|
|
||||||
- quantum/**/*
|
|
||||||
- tmk_core/**/*
|
|
||||||
- drivers/**/*
|
|
||||||
- tests/**/*
|
|
||||||
- util/**/*
|
|
||||||
- platforms/**/*
|
|
||||||
- Makefile
|
|
||||||
- '*.mk'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
tag:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
# protect against those who develop with their fork on master
|
|
||||||
if: github.repository == 'qmk/qmk_firmware'
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Bump version and push tag
|
|
||||||
uses: anothrNick/github-tag-action@1.39.0
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
DEFAULT_BUMP: 'patch'
|
|
||||||
2
.github/workflows/cli.yml
vendored
2
.github/workflows/cli.yml
vendored
|
|
@ -18,7 +18,7 @@ jobs:
|
||||||
container: qmkfm/qmk_cli
|
container: qmkfm/qmk_cli
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v2
|
||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
|
|
|
||||||
8
.github/workflows/develop_api.yml
vendored
8
.github/workflows/develop_api.yml
vendored
|
|
@ -18,15 +18,13 @@ jobs:
|
||||||
if: github.repository == 'qmk/qmk_firmware'
|
if: github.repository == 'qmk/qmk_firmware'
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v2
|
||||||
with:
|
with:
|
||||||
fetch-depth: 1
|
fetch-depth: 1
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
- name: Generate API Data
|
- name: Generate API Data
|
||||||
run: |
|
run: qmk generate-api
|
||||||
python3 -m pip install -r requirements-dev.txt
|
|
||||||
qmk generate-api
|
|
||||||
|
|
||||||
- name: Upload API Data
|
- name: Upload API Data
|
||||||
uses: jakejarvis/s3-sync-action@master
|
uses: jakejarvis/s3-sync-action@master
|
||||||
|
|
@ -37,4 +35,4 @@ jobs:
|
||||||
AWS_ACCESS_KEY_ID: ${{ secrets.SPACES_ACCESS_KEY }}
|
AWS_ACCESS_KEY_ID: ${{ secrets.SPACES_ACCESS_KEY }}
|
||||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.SPACES_SECRET_KEY }}
|
AWS_SECRET_ACCESS_KEY: ${{ secrets.SPACES_SECRET_KEY }}
|
||||||
AWS_S3_ENDPOINT: https://nyc3.digitaloceanspaces.com
|
AWS_S3_ENDPOINT: https://nyc3.digitaloceanspaces.com
|
||||||
SOURCE_DIR: '.build/api_data'
|
SOURCE_DIR: 'api_data'
|
||||||
|
|
|
||||||
11
.github/workflows/develop_update.yml
vendored
11
.github/workflows/develop_update.yml
vendored
|
|
@ -5,6 +5,7 @@ on:
|
||||||
branches:
|
branches:
|
||||||
- master
|
- master
|
||||||
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
develop_update:
|
develop_update:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
@ -12,9 +13,8 @@ jobs:
|
||||||
if: github.repository == 'qmk/qmk_firmware'
|
if: github.repository == 'qmk/qmk_firmware'
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v2
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.QMK_BOT_TOKEN }}
|
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Checkout develop
|
- name: Checkout develop
|
||||||
|
|
@ -22,7 +22,14 @@ jobs:
|
||||||
git fetch origin master develop
|
git fetch origin master develop
|
||||||
git checkout develop
|
git checkout develop
|
||||||
|
|
||||||
|
- name: Check if branch locked
|
||||||
|
id: check_locked
|
||||||
|
uses: andstor/file-existence-action@v1
|
||||||
|
with:
|
||||||
|
files: ".locked"
|
||||||
|
|
||||||
- name: Update develop from master
|
- name: Update develop from master
|
||||||
|
if: steps.check_locked.outputs.files_exists == 'false'
|
||||||
run: |
|
run: |
|
||||||
git config --global user.name "QMK Bot"
|
git config --global user.name "QMK Bot"
|
||||||
git config --global user.email "hello@qmk.fm"
|
git config --global user.email "hello@qmk.fm"
|
||||||
|
|
|
||||||
4
.github/workflows/docs.yml
vendored
4
.github/workflows/docs.yml
vendored
|
|
@ -20,7 +20,7 @@ jobs:
|
||||||
if: github.repository == 'qmk/qmk_firmware'
|
if: github.repository == 'qmk/qmk_firmware'
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v2
|
||||||
with:
|
with:
|
||||||
fetch-depth: 1
|
fetch-depth: 1
|
||||||
|
|
||||||
|
|
@ -34,7 +34,7 @@ jobs:
|
||||||
qmk --verbose generate-docs
|
qmk --verbose generate-docs
|
||||||
|
|
||||||
- name: Deploy
|
- name: Deploy
|
||||||
uses: JamesIves/github-pages-deploy-action@v4.4.0
|
uses: JamesIves/github-pages-deploy-action@3.7.1
|
||||||
with:
|
with:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
BASE_BRANCH: master
|
BASE_BRANCH: master
|
||||||
|
|
|
||||||
35
.github/workflows/feature_branch_update.yml
vendored
35
.github/workflows/feature_branch_update.yml
vendored
|
|
@ -1,35 +0,0 @@
|
||||||
name: Update feature branches after develop merge
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- develop
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
feature_branch_update:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
if: github.repository == 'qmk/qmk_firmware'
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
branch:
|
|
||||||
- xap
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.QMK_BOT_TOKEN }}
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Checkout branch
|
|
||||||
run: |
|
|
||||||
git fetch origin develop ${{ matrix.branch }}
|
|
||||||
git checkout ${{ matrix.branch }}
|
|
||||||
|
|
||||||
- name: Update branch from develop
|
|
||||||
run: |
|
|
||||||
git config --global user.name "QMK Bot"
|
|
||||||
git config --global user.email "hello@qmk.fm"
|
|
||||||
git merge origin/develop
|
|
||||||
git push origin ${{ matrix.branch }}
|
|
||||||
51
.github/workflows/format.yaml
vendored
Normal file
51
.github/workflows/format.yaml
vendored
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
name: PR Lint Format
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- 'drivers/**'
|
||||||
|
- 'lib/arm_atsam/**'
|
||||||
|
- 'lib/lib8tion/**'
|
||||||
|
- 'lib/python/**'
|
||||||
|
- 'platforms/**'
|
||||||
|
- 'quantum/**'
|
||||||
|
- 'tests/**'
|
||||||
|
- 'tmk_core/**'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
container: qmkfm/qmk_cli
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
pip3 install -r requirements-dev.txt
|
||||||
|
|
||||||
|
- uses: trilom/file-changes-action@v1.2.4
|
||||||
|
id: file_changes
|
||||||
|
with:
|
||||||
|
output: ' '
|
||||||
|
fileOutput: ' '
|
||||||
|
|
||||||
|
- name: Run qmk formatters
|
||||||
|
shell: 'bash {0}'
|
||||||
|
run: |
|
||||||
|
cat ~/files_added.txt ~/files_modified.txt > ~/files_changed.txt
|
||||||
|
qmk format-c --core-only $(< ~/files_changed.txt) || true
|
||||||
|
qmk format-python $(< ~/files_changed.txt) || true
|
||||||
|
qmk format-text $(< ~/files_changed.txt) || true
|
||||||
|
|
||||||
|
- name: Fail when formatting required
|
||||||
|
run: |
|
||||||
|
git diff
|
||||||
|
for file in $(git diff --name-only); do
|
||||||
|
echo "File '${file}' Requires Formatting"
|
||||||
|
echo "::error file=${file}::Requires Formatting"
|
||||||
|
done
|
||||||
|
test -z "$(git diff --name-only)"
|
||||||
51
.github/workflows/format.yml
vendored
51
.github/workflows/format.yml
vendored
|
|
@ -1,51 +0,0 @@
|
||||||
name: PR Lint Format
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- 'drivers/**'
|
|
||||||
- 'lib/arm_atsam/**'
|
|
||||||
- 'lib/lib8tion/**'
|
|
||||||
- 'lib/python/**'
|
|
||||||
- 'platforms/**'
|
|
||||||
- 'quantum/**'
|
|
||||||
- 'tests/**'
|
|
||||||
- 'tmk_core/**'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
lint:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
container: qmkfm/qmk_cli
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
pip3 install -r requirements-dev.txt
|
|
||||||
|
|
||||||
- uses: trilom/file-changes-action@v1.2.4
|
|
||||||
id: file_changes
|
|
||||||
with:
|
|
||||||
output: ' '
|
|
||||||
fileOutput: ' '
|
|
||||||
|
|
||||||
- name: Run qmk formatters
|
|
||||||
shell: 'bash {0}'
|
|
||||||
run: |
|
|
||||||
cat ~/files_added.txt ~/files_modified.txt > ~/files_changed.txt
|
|
||||||
qmk format-c --core-only $(< ~/files_changed.txt) || true
|
|
||||||
qmk format-python $(< ~/files_changed.txt) || true
|
|
||||||
qmk format-text $(< ~/files_changed.txt) || true
|
|
||||||
|
|
||||||
- name: Fail when formatting required
|
|
||||||
run: |
|
|
||||||
git diff
|
|
||||||
for file in $(git diff --name-only); do
|
|
||||||
echo "File '${file}' Requires Formatting"
|
|
||||||
echo "::error file=${file}::Requires Formatting"
|
|
||||||
done
|
|
||||||
test -z "$(git diff --name-only)"
|
|
||||||
49
.github/workflows/format_push.yaml
vendored
Normal file
49
.github/workflows/format_push.yaml
vendored
Normal file
|
|
@ -0,0 +1,49 @@
|
||||||
|
name: Lint Format
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
- develop
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
container: qmkfm/qmk_cli
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
pip3 install -r requirements-dev.txt
|
||||||
|
|
||||||
|
- name: Run qmk formatters
|
||||||
|
shell: 'bash {0}'
|
||||||
|
run: |
|
||||||
|
qmk format-c -a
|
||||||
|
qmk format-python -a
|
||||||
|
qmk format-text -a
|
||||||
|
git diff
|
||||||
|
|
||||||
|
- uses: rlespinasse/github-slug-action@v3.x
|
||||||
|
|
||||||
|
- name: Become QMK Bot
|
||||||
|
run: |
|
||||||
|
git config user.name 'QMK Bot'
|
||||||
|
git config user.email 'hello@qmk.fm'
|
||||||
|
|
||||||
|
- name: Create Pull Request
|
||||||
|
uses: peter-evans/create-pull-request@v3
|
||||||
|
if: ${{ github.repository == 'qmk/qmk_firmware'}}
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.QMK_BOT_TOKEN }}
|
||||||
|
delete-branch: true
|
||||||
|
branch: bugfix/format_${{ env.GITHUB_REF_SLUG }}
|
||||||
|
author: QMK Bot <hello@qmk.fm>
|
||||||
|
committer: QMK Bot <hello@qmk.fm>
|
||||||
|
commit-message: Format code according to conventions
|
||||||
|
title: '[CI] Format code according to conventions'
|
||||||
49
.github/workflows/format_push.yml
vendored
49
.github/workflows/format_push.yml
vendored
|
|
@ -1,49 +0,0 @@
|
||||||
name: Lint Format
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
- develop
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
lint:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
container: qmkfm/qmk_cli
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
pip3 install -r requirements-dev.txt
|
|
||||||
|
|
||||||
- name: Run qmk formatters
|
|
||||||
shell: 'bash {0}'
|
|
||||||
run: |
|
|
||||||
qmk format-c -a
|
|
||||||
qmk format-python -a
|
|
||||||
qmk format-text -a
|
|
||||||
git diff
|
|
||||||
|
|
||||||
- uses: rlespinasse/github-slug-action@v3.x
|
|
||||||
|
|
||||||
- name: Become QMK Bot
|
|
||||||
run: |
|
|
||||||
git config user.name 'QMK Bot'
|
|
||||||
git config user.email 'hello@qmk.fm'
|
|
||||||
|
|
||||||
- name: Create Pull Request
|
|
||||||
uses: peter-evans/create-pull-request@v4
|
|
||||||
if: ${{ github.repository == 'qmk/qmk_firmware'}}
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.QMK_BOT_TOKEN }}
|
|
||||||
delete-branch: true
|
|
||||||
branch: bugfix/format_${{ env.GITHUB_REF_SLUG }}
|
|
||||||
author: QMK Bot <hello@qmk.fm>
|
|
||||||
committer: QMK Bot <hello@qmk.fm>
|
|
||||||
commit-message: Format code according to conventions
|
|
||||||
title: '[CI] Format code according to conventions'
|
|
||||||
5
.github/workflows/lint.yml
vendored
5
.github/workflows/lint.yml
vendored
|
|
@ -12,13 +12,10 @@ jobs:
|
||||||
container: qmkfm/qmk_cli
|
container: qmkfm/qmk_cli
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v2
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: pip3 install -r requirements-dev.txt
|
|
||||||
|
|
||||||
- uses: trilom/file-changes-action@v1.2.4
|
- uses: trilom/file-changes-action@v1.2.4
|
||||||
id: file_changes
|
id: file_changes
|
||||||
with:
|
with:
|
||||||
|
|
|
||||||
64
.github/workflows/stale.yml
vendored
64
.github/workflows/stale.yml
vendored
|
|
@ -1,64 +0,0 @@
|
||||||
name: 'Close stale issues and PRs'
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: '30 1 * * *'
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
issues: write
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
stale:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/stale@v5
|
|
||||||
with:
|
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
remove-stale-when-updated: true
|
|
||||||
exempt-draft-pr: true
|
|
||||||
ascending: true
|
|
||||||
operations-per-run: 150
|
|
||||||
|
|
||||||
stale-issue-label: stale
|
|
||||||
days-before-issue-stale: 90
|
|
||||||
days-before-issue-close: 30
|
|
||||||
exempt-issue-labels: bug,in progress,on hold,discussion,to do
|
|
||||||
|
|
||||||
stale-issue-message: >
|
|
||||||
This issue has been automatically marked as stale because it has not had activity in the
|
|
||||||
last 90 days. It will be closed in the next 30 days unless it is tagged properly or other activity
|
|
||||||
occurs.
|
|
||||||
|
|
||||||
For maintainers: Please label with `bug`, `in progress`, `on hold`, `discussion` or `to do` to prevent
|
|
||||||
the issue from being re-flagged.
|
|
||||||
|
|
||||||
close-issue-message: >
|
|
||||||
This issue has been automatically closed because it has not had activity in the last 30 days.
|
|
||||||
If this issue is still valid, re-open the issue and let us know.
|
|
||||||
|
|
||||||
// [stale-action-closed]
|
|
||||||
|
|
||||||
stale-pr-label: stale
|
|
||||||
days-before-pr-stale: 45
|
|
||||||
days-before-pr-close: 30
|
|
||||||
exempt-pr-labels: bug,awaiting review,breaking_change,in progress,on hold
|
|
||||||
|
|
||||||
stale-pr-message: >
|
|
||||||
Thank you for your contribution!
|
|
||||||
|
|
||||||
This pull request has been automatically marked as stale because it has not had
|
|
||||||
activity in the last 45 days. It will be closed in 30 days if no further activity occurs.
|
|
||||||
Please feel free to give a status update now, or re-open when it's ready.
|
|
||||||
|
|
||||||
For maintainers: Please label with `bug`, `awaiting review`, `breaking_change`, `in progress`, or `on hold`
|
|
||||||
to prevent the issue from being re-flagged.
|
|
||||||
|
|
||||||
close-pr-message: >
|
|
||||||
Thank you for your contribution!
|
|
||||||
|
|
||||||
This pull request has been automatically closed because it has not had activity in the last 30 days.
|
|
||||||
Please feel free to give a status update now, ping for review, or re-open when it's ready.
|
|
||||||
|
|
||||||
// [stale-action-closed]
|
|
||||||
6
.github/workflows/unit_test.yml
vendored
6
.github/workflows/unit_test.yml
vendored
|
|
@ -20,13 +20,11 @@ jobs:
|
||||||
test:
|
test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
container: qmkfm/qmk_cli
|
container: qmkfm/base_container
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v2
|
||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
- name: Install dependencies
|
|
||||||
run: pip3 install -r requirements-dev.txt
|
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: make test:all
|
run: make test:all
|
||||||
|
|
|
||||||
26
.gitignore
vendored
26
.gitignore
vendored
|
|
@ -5,10 +5,6 @@
|
||||||
.DS_Store
|
.DS_Store
|
||||||
._*
|
._*
|
||||||
|
|
||||||
# Merge files
|
|
||||||
*.orig
|
|
||||||
*.rej
|
|
||||||
|
|
||||||
# Build artifacts
|
# Build artifacts
|
||||||
.clang_complete
|
.clang_complete
|
||||||
.build/
|
.build/
|
||||||
|
|
@ -31,11 +27,16 @@ quantum/version.h
|
||||||
*.uf2
|
*.uf2
|
||||||
|
|
||||||
# Old-style QMK Makefiles
|
# Old-style QMK Makefiles
|
||||||
/keyboards/**/Makefile
|
/keyboards/*/Makefile
|
||||||
|
/keyboards/*/*/Makefile
|
||||||
# kbfirmware....
|
/keyboards/*/*/*/Makefile
|
||||||
/keyboards/**/kb.h
|
/keyboards/*/*/*/*/Makefile
|
||||||
/keyboards/**/kb.c
|
/keyboards/*/*/*/*/*/Makefile
|
||||||
|
/keyboards/*/keymaps/Makefile
|
||||||
|
/keyboards/*/*/keymaps/Makefile
|
||||||
|
/keyboards/*/*/*/keymaps/Makefile
|
||||||
|
/keyboards/*/*/*/*/keymaps/Makefile
|
||||||
|
/keyboards/*/*/*/*/*/keymaps/Makefile
|
||||||
|
|
||||||
# Eclipse/PyCharm/Other IDE Settings
|
# Eclipse/PyCharm/Other IDE Settings
|
||||||
*.iml
|
*.iml
|
||||||
|
|
@ -66,12 +67,10 @@ CMakeLists.txt
|
||||||
.vscode/temp.sql
|
.vscode/temp.sql
|
||||||
tags
|
tags
|
||||||
|
|
||||||
# Ignore image/font files
|
# Ignore image files
|
||||||
*.gif
|
*.gif
|
||||||
*.jpg
|
*.jpg
|
||||||
*.png
|
*.png
|
||||||
*.ttf
|
|
||||||
*.otf
|
|
||||||
|
|
||||||
# Things Travis sees
|
# Things Travis sees
|
||||||
/.vs
|
/.vs
|
||||||
|
|
@ -92,6 +91,3 @@ user_song_list.h
|
||||||
compile_commands.json
|
compile_commands.json
|
||||||
.clangd/
|
.clangd/
|
||||||
.cache/
|
.cache/
|
||||||
|
|
||||||
# VIA(L) json files that don't belong in QMK repo
|
|
||||||
via*.json
|
|
||||||
|
|
|
||||||
1
api_data/_config.yml
Normal file
1
api_data/_config.yml
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
theme: jekyll-theme-cayman
|
||||||
|
|
@ -97,18 +97,12 @@ ifeq ($(strip $(BOOTLOADER)), halfkay)
|
||||||
OPT_DEFS += -DBOOTLOADER_HALFKAY
|
OPT_DEFS += -DBOOTLOADER_HALFKAY
|
||||||
BOOTLOADER_TYPE = halfkay
|
BOOTLOADER_TYPE = halfkay
|
||||||
|
|
||||||
# Teensy 2.0
|
|
||||||
ifeq ($(strip $(MCU)), atmega32u4)
|
ifeq ($(strip $(MCU)), atmega32u4)
|
||||||
BOOTLOADER_SIZE = 512
|
BOOTLOADER_SIZE = 512
|
||||||
endif
|
endif
|
||||||
# Teensy 2.0++
|
|
||||||
ifeq ($(strip $(MCU)), at90usb1286)
|
ifeq ($(strip $(MCU)), at90usb1286)
|
||||||
BOOTLOADER_SIZE = 1024
|
BOOTLOADER_SIZE = 1024
|
||||||
endif
|
endif
|
||||||
# Teensy LC, 3.x
|
|
||||||
ifneq (,$(filter $(MCU_ORIG), MKL26Z64 MK20DX128 MK20DX256 MK66FX1M0))
|
|
||||||
FIRMWARE_FORMAT = hex
|
|
||||||
endif
|
|
||||||
endif
|
endif
|
||||||
ifeq ($(strip $(BOOTLOADER)), caterina)
|
ifeq ($(strip $(BOOTLOADER)), caterina)
|
||||||
OPT_DEFS += -DBOOTLOADER_CATERINA
|
OPT_DEFS += -DBOOTLOADER_CATERINA
|
||||||
|
|
@ -208,10 +202,6 @@ ifeq ($(strip $(BOOTLOADER)), md-boot)
|
||||||
OPT_DEFS += -DBOOTLOADER_MD_BOOT
|
OPT_DEFS += -DBOOTLOADER_MD_BOOT
|
||||||
BOOTLOADER_TYPE = md_boot
|
BOOTLOADER_TYPE = md_boot
|
||||||
endif
|
endif
|
||||||
ifeq ($(strip $(BOOTLOADER)), wb32-dfu)
|
|
||||||
OPT_DEFS += -DBOOTLOADER_WB32_DFU
|
|
||||||
BOOTLOADER_TYPE = wb32_dfu
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(BOOTLOADER_TYPE)),)
|
ifeq ($(strip $(BOOTLOADER_TYPE)),)
|
||||||
$(call CATASTROPHIC_ERROR,Invalid BOOTLOADER,No bootloader specified. Please set an appropriate 'BOOTLOADER' in your keyboard's 'rules.mk' file.)
|
$(call CATASTROPHIC_ERROR,Invalid BOOTLOADER,No bootloader specified. Please set an appropriate 'BOOTLOADER' in your keyboard's 'rules.mk' file.)
|
||||||
|
|
|
||||||
|
|
@ -159,20 +159,22 @@ ifneq ("$(wildcard $(KEYMAP_JSON))", "")
|
||||||
|
|
||||||
# Add rules to generate the keymap files - indentation here is important
|
# Add rules to generate the keymap files - indentation here is important
|
||||||
$(KEYMAP_OUTPUT)/src/keymap.c: $(KEYMAP_JSON)
|
$(KEYMAP_OUTPUT)/src/keymap.c: $(KEYMAP_JSON)
|
||||||
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
$(QMK_BIN) json2c --quiet --output $(KEYMAP_C) $(KEYMAP_JSON)
|
||||||
$(eval CMD=$(QMK_BIN) json2c --quiet --output $(KEYMAP_C) $(KEYMAP_JSON))
|
|
||||||
@$(BUILD_CMD)
|
|
||||||
|
|
||||||
$(KEYMAP_OUTPUT)/src/config.h: $(KEYMAP_JSON)
|
$(KEYMAP_OUTPUT)/src/config.h: $(KEYMAP_JSON)
|
||||||
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
$(QMK_BIN) generate-config-h --quiet --keyboard $(KEYBOARD) --keymap $(KEYMAP) --output $(KEYMAP_H)
|
||||||
$(eval CMD=$(QMK_BIN) generate-config-h --quiet --keyboard $(KEYBOARD) --keymap $(KEYMAP) --output $(KEYMAP_H))
|
|
||||||
@$(BUILD_CMD)
|
|
||||||
|
|
||||||
generated-files: $(KEYMAP_OUTPUT)/src/config.h $(KEYMAP_OUTPUT)/src/keymap.c
|
generated-files: $(KEYMAP_OUTPUT)/src/config.h $(KEYMAP_OUTPUT)/src/keymap.c
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
include $(BUILDDEFS_PATH)/converters.mk
|
ifeq ($(strip $(CTPC)), yes)
|
||||||
|
CONVERT_TO_PROTON_C=yes
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(CONVERT_TO_PROTON_C)), yes)
|
||||||
|
include platforms/chibios/boards/QMK_PROTON_C/convert_to_proton_c.mk
|
||||||
|
endif
|
||||||
|
|
||||||
include $(BUILDDEFS_PATH)/mcu_selection.mk
|
include $(BUILDDEFS_PATH)/mcu_selection.mk
|
||||||
|
|
||||||
|
|
@ -322,29 +324,17 @@ ifneq ("$(wildcard $(KEYBOARD_PATH_5)/info.json)","")
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CONFIG_H += $(KEYBOARD_OUTPUT)/src/info_config.h $(KEYBOARD_OUTPUT)/src/layouts.h
|
CONFIG_H += $(KEYBOARD_OUTPUT)/src/info_config.h $(KEYBOARD_OUTPUT)/src/layouts.h
|
||||||
KEYBOARD_SRC += $(KEYBOARD_OUTPUT)/src/default_keyboard.c
|
|
||||||
|
|
||||||
$(KEYBOARD_OUTPUT)/src/info_config.h: $(INFO_JSON_FILES)
|
$(KEYBOARD_OUTPUT)/src/info_config.h: $(INFO_JSON_FILES)
|
||||||
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
$(QMK_BIN) generate-config-h --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/info_config.h
|
||||||
$(eval CMD=$(QMK_BIN) generate-config-h --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/info_config.h)
|
|
||||||
@$(BUILD_CMD)
|
|
||||||
|
|
||||||
$(KEYBOARD_OUTPUT)/src/default_keyboard.c: $(INFO_JSON_FILES)
|
|
||||||
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
|
||||||
$(eval CMD=$(QMK_BIN) generate-keyboard-c --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/default_keyboard.c)
|
|
||||||
@$(BUILD_CMD)
|
|
||||||
|
|
||||||
$(KEYBOARD_OUTPUT)/src/default_keyboard.h: $(INFO_JSON_FILES)
|
$(KEYBOARD_OUTPUT)/src/default_keyboard.h: $(INFO_JSON_FILES)
|
||||||
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
$(QMK_BIN) generate-keyboard-h --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/default_keyboard.h
|
||||||
$(eval CMD=$(QMK_BIN) generate-keyboard-h --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/default_keyboard.h)
|
|
||||||
@$(BUILD_CMD)
|
|
||||||
|
|
||||||
$(KEYBOARD_OUTPUT)/src/layouts.h: $(INFO_JSON_FILES)
|
$(KEYBOARD_OUTPUT)/src/layouts.h: $(INFO_JSON_FILES)
|
||||||
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
$(QMK_BIN) generate-layouts --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/layouts.h
|
||||||
$(eval CMD=$(QMK_BIN) generate-layouts --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/layouts.h)
|
|
||||||
@$(BUILD_CMD)
|
|
||||||
|
|
||||||
generated-files: $(KEYBOARD_OUTPUT)/src/info_config.h $(KEYBOARD_OUTPUT)/src/default_keyboard.c $(KEYBOARD_OUTPUT)/src/default_keyboard.h $(KEYBOARD_OUTPUT)/src/layouts.h
|
generated-files: $(KEYBOARD_OUTPUT)/src/info_config.h $(KEYBOARD_OUTPUT)/src/default_keyboard.h $(KEYBOARD_OUTPUT)/src/layouts.h
|
||||||
|
|
||||||
.INTERMEDIATE : generated-files
|
.INTERMEDIATE : generated-files
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,6 @@ endif
|
||||||
|
|
||||||
.DEFAULT_GOAL := all
|
.DEFAULT_GOAL := all
|
||||||
|
|
||||||
OPT = g
|
|
||||||
|
|
||||||
include paths.mk
|
include paths.mk
|
||||||
include $(BUILDDEFS_PATH)/message.mk
|
include $(BUILDDEFS_PATH)/message.mk
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -149,11 +149,6 @@ ifeq ($(strip $(POINTING_DEVICE_ENABLE)), yes)
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
QUANTUM_PAINTER_ENABLE ?= no
|
|
||||||
ifeq ($(strip $(QUANTUM_PAINTER_ENABLE)), yes)
|
|
||||||
include $(QUANTUM_DIR)/painter/rules.mk
|
|
||||||
endif
|
|
||||||
|
|
||||||
VALID_EEPROM_DRIVER_TYPES := vendor custom transient i2c spi
|
VALID_EEPROM_DRIVER_TYPES := vendor custom transient i2c spi
|
||||||
EEPROM_DRIVER ?= vendor
|
EEPROM_DRIVER ?= vendor
|
||||||
ifeq ($(filter $(EEPROM_DRIVER),$(VALID_EEPROM_DRIVER_TYPES)),)
|
ifeq ($(filter $(EEPROM_DRIVER),$(VALID_EEPROM_DRIVER_TYPES)),)
|
||||||
|
|
@ -651,9 +646,8 @@ ifeq ($(strip $(HAPTIC_ENABLE)),yes)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(strip $(HD44780_ENABLE)), yes)
|
ifeq ($(strip $(HD44780_ENABLE)), yes)
|
||||||
|
SRC += platforms/avr/drivers/hd44780.c
|
||||||
OPT_DEFS += -DHD44780_ENABLE
|
OPT_DEFS += -DHD44780_ENABLE
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/lcd
|
|
||||||
SRC += hd44780.c
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
VALID_OLED_DRIVER_TYPES := SSD1306 custom
|
VALID_OLED_DRIVER_TYPES := SSD1306 custom
|
||||||
|
|
@ -701,8 +695,7 @@ endif
|
||||||
|
|
||||||
ifeq ($(strip $(UNICODE_COMMON)), yes)
|
ifeq ($(strip $(UNICODE_COMMON)), yes)
|
||||||
OPT_DEFS += -DUNICODE_COMMON_ENABLE
|
OPT_DEFS += -DUNICODE_COMMON_ENABLE
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_unicode_common.c \
|
SRC += $(QUANTUM_DIR)/process_keycode/process_unicode_common.c
|
||||||
$(QUANTUM_DIR)/utf8.c
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
MAGIC_ENABLE ?= yes
|
MAGIC_ENABLE ?= yes
|
||||||
|
|
|
||||||
|
|
@ -82,8 +82,8 @@ endif
|
||||||
# -Wall...: warning level
|
# -Wall...: warning level
|
||||||
# -Wa,...: tell GCC to pass this to the assembler.
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
ifeq ($(strip $(LTO_ENABLE)), yes)
|
ifeq ($(strip $(LTO_ENABLE)), yes)
|
||||||
ifeq ($(PLATFORM),ARM_ATSAM)
|
ifeq ($(PLATFORM),CHIBIOS)
|
||||||
$(info Enabling LTO on arm_atsam-targeting boards is known to have a high likelihood of failure.)
|
$(info Enabling LTO on ChibiOS-targeting boards is known to have a high likelihood of failure.)
|
||||||
$(info If unsure, set LTO_ENABLE = no.)
|
$(info If unsure, set LTO_ENABLE = no.)
|
||||||
endif
|
endif
|
||||||
CDEFS += -flto
|
CDEFS += -flto
|
||||||
|
|
@ -316,7 +316,7 @@ gccversion :
|
||||||
@$(BUILD_CMD)
|
@$(BUILD_CMD)
|
||||||
|
|
||||||
%.uf2: %.hex
|
%.uf2: %.hex
|
||||||
$(eval CMD=$(UF2CONV) $(BUILD_DIR)/$(TARGET).hex --output $(BUILD_DIR)/$(TARGET).uf2 --convert --family $(UF2_FAMILY) >/dev/null 2>&1)
|
$(eval CMD=$(UF2CONV) $(BUILD_DIR)/$(TARGET).hex -o $(BUILD_DIR)/$(TARGET).uf2 -c -f $(UF2_FAMILY) >/dev/null 2>&1)
|
||||||
#@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
|
#@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
|
||||||
@$(SILENT) || printf "$(MSG_UF2) $@" | $(AWK_CMD)
|
@$(SILENT) || printf "$(MSG_UF2) $@" | $(AWK_CMD)
|
||||||
@$(BUILD_CMD)
|
@$(BUILD_CMD)
|
||||||
|
|
|
||||||
|
|
@ -1,37 +0,0 @@
|
||||||
# Note for new boards -- CTPC and CONVERT_TO_PROTON_C are deprecated terms
|
|
||||||
# and should not be replicated for new boards. These will be removed from
|
|
||||||
# documentation as well as existing keymaps in due course.
|
|
||||||
ifeq ($(strip $(CTPC)), yes)
|
|
||||||
CONVERT_TO_PROTON_C=yes
|
|
||||||
endif
|
|
||||||
ifeq ($(strip $(CONVERT_TO_PROTON_C)), yes)
|
|
||||||
CONVERT_TO=proton_c
|
|
||||||
|
|
||||||
cpfirmware: ctpc_warning
|
|
||||||
.INTERMEDIATE: ctpc_warning
|
|
||||||
ctpc_warning: elf
|
|
||||||
$(info @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)
|
|
||||||
$(info The `CONVERT_TO_PROTON_C` and `CTPC` options are soon to be deprecated.)
|
|
||||||
$(info Boards should be changed to use `CONVERT_TO=proton_c` instead.)
|
|
||||||
$(info @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)
|
|
||||||
endif
|
|
||||||
|
|
||||||
# TODO: opt in rather than assume everything uses a pro micro
|
|
||||||
PIN_COMPATIBLE ?= promicro
|
|
||||||
ifneq ($(CONVERT_TO),)
|
|
||||||
# glob to search each platfrorm and/or check for valid converter
|
|
||||||
CONVERTER := $(wildcard $(PLATFORM_PATH)/*/converters/$(PIN_COMPATIBLE)_to_$(CONVERT_TO)/)
|
|
||||||
ifeq ($(CONVERTER),)
|
|
||||||
$(call CATASTROPHIC_ERROR,Converting from '$(PIN_COMPATIBLE)' to '$(CONVERT_TO)' not possible!)
|
|
||||||
endif
|
|
||||||
|
|
||||||
TARGET := $(TARGET)_$(CONVERT_TO)
|
|
||||||
|
|
||||||
# Configure any defaults
|
|
||||||
OPT_DEFS += -DCONVERT_TO_$(strip $(shell echo $(CONVERT_TO) | tr '[:lower:]' '[:upper:]'))
|
|
||||||
OPT_DEFS += -DCONVERTER_ENABLED
|
|
||||||
VPATH += $(CONVERTER)
|
|
||||||
|
|
||||||
# Finally run any converter specific logic
|
|
||||||
include $(CONVERTER)/converter.mk
|
|
||||||
endif
|
|
||||||
|
|
@ -17,7 +17,6 @@ SPACE_CADET_ENABLE ?= yes
|
||||||
GRAVE_ESC_ENABLE ?= yes
|
GRAVE_ESC_ENABLE ?= yes
|
||||||
|
|
||||||
GENERIC_FEATURES = \
|
GENERIC_FEATURES = \
|
||||||
CAPS_WORD \
|
|
||||||
COMBO \
|
COMBO \
|
||||||
COMMAND \
|
COMMAND \
|
||||||
DEFERRED_EXEC \
|
DEFERRED_EXEC \
|
||||||
|
|
@ -26,14 +25,12 @@ GENERIC_FEATURES = \
|
||||||
DYNAMIC_KEYMAP \
|
DYNAMIC_KEYMAP \
|
||||||
DYNAMIC_MACRO \
|
DYNAMIC_MACRO \
|
||||||
ENCODER \
|
ENCODER \
|
||||||
ENCODER_MAP \
|
|
||||||
GRAVE_ESC \
|
GRAVE_ESC \
|
||||||
HAPTIC \
|
HAPTIC \
|
||||||
KEY_LOCK \
|
KEY_LOCK \
|
||||||
KEY_OVERRIDE \
|
KEY_OVERRIDE \
|
||||||
LEADER \
|
LEADER \
|
||||||
PROGRAMMABLE_BUTTON \
|
PROGRAMMABLE_BUTTON \
|
||||||
SECURE \
|
|
||||||
SPACE_CADET \
|
SPACE_CADET \
|
||||||
SWAP_HANDS \
|
SWAP_HANDS \
|
||||||
TAP_DANCE \
|
TAP_DANCE \
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,7 @@ ifneq ($(findstring MKL26Z64, $(MCU)),)
|
||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
# OR
|
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
|
||||||
MCU_FAMILY = KINETIS
|
MCU_FAMILY = KINETIS
|
||||||
MCU_SERIES = KL2x
|
MCU_SERIES = KL2x
|
||||||
|
|
||||||
|
|
@ -38,9 +36,7 @@ ifneq ($(findstring MK20DX128, $(MCU)),)
|
||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
# OR
|
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
|
||||||
MCU_FAMILY = KINETIS
|
MCU_FAMILY = KINETIS
|
||||||
MCU_SERIES = K20x
|
MCU_SERIES = K20x
|
||||||
|
|
||||||
|
|
@ -67,9 +63,7 @@ ifneq ($(findstring MK20DX256, $(MCU)),)
|
||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
# OR
|
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
|
||||||
MCU_FAMILY = KINETIS
|
MCU_FAMILY = KINETIS
|
||||||
MCU_SERIES = K20x
|
MCU_SERIES = K20x
|
||||||
|
|
||||||
|
|
@ -96,9 +90,7 @@ ifneq ($(findstring MK66FX1M0, $(MCU)),)
|
||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
# OR
|
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
|
||||||
MCU_FAMILY = KINETIS
|
MCU_FAMILY = KINETIS
|
||||||
MCU_SERIES = MK66F18
|
MCU_SERIES = MK66F18
|
||||||
|
|
||||||
|
|
@ -125,9 +117,7 @@ ifneq ($(findstring STM32F042, $(MCU)),)
|
||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
# OR
|
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
|
||||||
MCU_FAMILY = STM32
|
MCU_FAMILY = STM32
|
||||||
MCU_SERIES = STM32F0xx
|
MCU_SERIES = STM32F0xx
|
||||||
|
|
||||||
|
|
@ -167,9 +157,7 @@ ifneq ($(findstring STM32F072, $(MCU)),)
|
||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
# OR
|
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
|
||||||
MCU_FAMILY = STM32
|
MCU_FAMILY = STM32
|
||||||
MCU_SERIES = STM32F0xx
|
MCU_SERIES = STM32F0xx
|
||||||
|
|
||||||
|
|
@ -204,9 +192,7 @@ ifneq ($(findstring STM32F103, $(MCU)),)
|
||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
# OR
|
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
|
||||||
MCU_FAMILY = STM32
|
MCU_FAMILY = STM32
|
||||||
MCU_SERIES = STM32F1xx
|
MCU_SERIES = STM32F1xx
|
||||||
|
|
||||||
|
|
@ -238,9 +224,7 @@ ifneq ($(findstring STM32F303, $(MCU)),)
|
||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
# OR
|
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
|
||||||
MCU_FAMILY = STM32
|
MCU_FAMILY = STM32
|
||||||
MCU_SERIES = STM32F3xx
|
MCU_SERIES = STM32F3xx
|
||||||
|
|
||||||
|
|
@ -275,9 +259,7 @@ ifneq ($(findstring STM32F401, $(MCU)),)
|
||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
# OR
|
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
|
||||||
MCU_FAMILY = STM32
|
MCU_FAMILY = STM32
|
||||||
MCU_SERIES = STM32F4xx
|
MCU_SERIES = STM32F4xx
|
||||||
|
|
||||||
|
|
@ -317,9 +299,7 @@ ifneq ($(findstring STM32F405, $(MCU)),)
|
||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
# OR
|
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
|
||||||
MCU_FAMILY = STM32
|
MCU_FAMILY = STM32
|
||||||
MCU_SERIES = STM32F4xx
|
MCU_SERIES = STM32F4xx
|
||||||
|
|
||||||
|
|
@ -354,9 +334,7 @@ ifneq ($(findstring STM32F407, $(MCU)),)
|
||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
# OR
|
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
|
||||||
MCU_FAMILY = STM32
|
MCU_FAMILY = STM32
|
||||||
MCU_SERIES = STM32F4xx
|
MCU_SERIES = STM32F4xx
|
||||||
|
|
||||||
|
|
@ -391,9 +369,7 @@ ifneq ($(findstring STM32F411, $(MCU)),)
|
||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
# OR
|
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
|
||||||
MCU_FAMILY = STM32
|
MCU_FAMILY = STM32
|
||||||
MCU_SERIES = STM32F4xx
|
MCU_SERIES = STM32F4xx
|
||||||
|
|
||||||
|
|
@ -433,9 +409,7 @@ ifneq ($(findstring STM32F446, $(MCU)),)
|
||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
# OR
|
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
|
||||||
MCU_FAMILY = STM32
|
MCU_FAMILY = STM32
|
||||||
MCU_SERIES = STM32F4xx
|
MCU_SERIES = STM32F4xx
|
||||||
|
|
||||||
|
|
@ -467,9 +441,7 @@ ifneq ($(findstring STM32G431, $(MCU)),)
|
||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
# OR
|
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
|
||||||
MCU_FAMILY = STM32
|
MCU_FAMILY = STM32
|
||||||
MCU_SERIES = STM32G4xx
|
MCU_SERIES = STM32G4xx
|
||||||
|
|
||||||
|
|
@ -504,9 +476,7 @@ ifneq ($(findstring STM32G474, $(MCU)),)
|
||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
# OR
|
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
|
||||||
MCU_FAMILY = STM32
|
MCU_FAMILY = STM32
|
||||||
MCU_SERIES = STM32G4xx
|
MCU_SERIES = STM32G4xx
|
||||||
|
|
||||||
|
|
@ -541,9 +511,7 @@ ifneq (,$(filter $(MCU),STM32L432 STM32L442))
|
||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
# OR
|
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
|
||||||
MCU_FAMILY = STM32
|
MCU_FAMILY = STM32
|
||||||
MCU_SERIES = STM32L4xx
|
MCU_SERIES = STM32L4xx
|
||||||
|
|
||||||
|
|
@ -580,9 +548,7 @@ ifneq (,$(filter $(MCU),STM32L433 STM32L443))
|
||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
# OR
|
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
|
||||||
MCU_FAMILY = STM32
|
MCU_FAMILY = STM32
|
||||||
MCU_SERIES = STM32L4xx
|
MCU_SERIES = STM32L4xx
|
||||||
|
|
||||||
|
|
@ -619,9 +585,7 @@ ifneq (,$(filter $(MCU),STM32L412 STM32L422))
|
||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
# OR
|
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
|
||||||
MCU_FAMILY = STM32
|
MCU_FAMILY = STM32
|
||||||
MCU_SERIES = STM32L4xx
|
MCU_SERIES = STM32L4xx
|
||||||
|
|
||||||
|
|
@ -638,7 +602,7 @@ ifneq (,$(filter $(MCU),STM32L412 STM32L422))
|
||||||
# <keyboard_dir>/boards/, or drivers/boards/
|
# <keyboard_dir>/boards/, or drivers/boards/
|
||||||
BOARD ?= GENERIC_STM32_L412XB
|
BOARD ?= GENERIC_STM32_L412XB
|
||||||
|
|
||||||
PLATFORM_NAME ?= platform_l412_l422
|
PLATFORM_NAME ?= platform_l432
|
||||||
|
|
||||||
USE_FPU ?= yes
|
USE_FPU ?= yes
|
||||||
|
|
||||||
|
|
@ -658,9 +622,7 @@ ifneq ($(findstring WB32F3G71, $(MCU)),)
|
||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
# OR
|
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
|
||||||
MCU_FAMILY = WB32
|
MCU_FAMILY = WB32
|
||||||
MCU_SERIES = WB32F3G71xx
|
MCU_SERIES = WB32F3G71xx
|
||||||
|
|
||||||
|
|
@ -680,40 +642,7 @@ ifneq ($(findstring WB32F3G71, $(MCU)),)
|
||||||
USE_FPU ?= no
|
USE_FPU ?= no
|
||||||
|
|
||||||
# Bootloader address for WB32 DFU
|
# Bootloader address for WB32 DFU
|
||||||
WB32_BOOTLOADER_ADDRESS ?= 0x1FFFE000
|
STM32_BOOTLOADER_ADDRESS ?= 0x1FFFE000
|
||||||
endif
|
|
||||||
|
|
||||||
ifneq ($(findstring WB32FQ95, $(MCU)),)
|
|
||||||
# Cortex version
|
|
||||||
MCU = cortex-m3
|
|
||||||
|
|
||||||
# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
|
|
||||||
ARMV = 7
|
|
||||||
|
|
||||||
## chip/board settings
|
|
||||||
# - the next two should match the directories in
|
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
|
||||||
# OR
|
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
|
||||||
MCU_FAMILY = WB32
|
|
||||||
MCU_SERIES = WB32FQ95xx
|
|
||||||
|
|
||||||
# Linker script to use
|
|
||||||
# - it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
|
|
||||||
# or <keyboard_dir>/ld/
|
|
||||||
MCU_LDSCRIPT ?= WB32FQ95xB
|
|
||||||
|
|
||||||
# Startup code to use
|
|
||||||
# - it should exist in <chibios>/os/common/startup/ARMCMx/compilers/GCC/mk/
|
|
||||||
MCU_STARTUP ?= wb32fq95xx
|
|
||||||
|
|
||||||
# Board: it should exist either in <chibios>/os/hal/boards/,
|
|
||||||
# <keyboard_dir>/boards/, or drivers/boards/
|
|
||||||
BOARD ?= GENERIC_WB32_FQ95XX
|
|
||||||
|
|
||||||
USE_FPU ?= no
|
|
||||||
|
|
||||||
# Bootloader address for WB32 DFU
|
|
||||||
WB32_BOOTLOADER_ADDRESS ?= 0x1FFFE000
|
WB32_BOOTLOADER_ADDRESS ?= 0x1FFFE000
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
@ -728,10 +657,7 @@ ifneq ($(findstring GD32VF103, $(MCU)),)
|
||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
# OR
|
|
||||||
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
|
||||||
MCU_PORT_NAME = GD
|
|
||||||
MCU_FAMILY = GD32V
|
MCU_FAMILY = GD32V
|
||||||
MCU_SERIES = GD32VF103
|
MCU_SERIES = GD32VF103
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,6 @@ MSG_COMPILING_CXX = Compiling:
|
||||||
MSG_ASSEMBLING = Assembling:
|
MSG_ASSEMBLING = Assembling:
|
||||||
MSG_CLEANING = Cleaning project:
|
MSG_CLEANING = Cleaning project:
|
||||||
MSG_CREATING_LIBRARY = Creating library:
|
MSG_CREATING_LIBRARY = Creating library:
|
||||||
MSG_GENERATING = Generating:
|
|
||||||
MSG_SUBMODULE_DIRTY = $(WARN_COLOR)WARNING:$(NO_COLOR) Some git submodules are out of date or modified.\n\
|
MSG_SUBMODULE_DIRTY = $(WARN_COLOR)WARNING:$(NO_COLOR) Some git submodules are out of date or modified.\n\
|
||||||
Please consider running $(BOLD)make git-submodule$(NO_COLOR).\n\n
|
Please consider running $(BOLD)make git-submodule$(NO_COLOR).\n\n
|
||||||
MSG_NO_CMP = $(ERROR_COLOR)Error:$(NO_COLOR)$(BOLD) cmp command not found, please install diffutils\n$(NO_COLOR)
|
MSG_NO_CMP = $(ERROR_COLOR)Error:$(NO_COLOR)$(BOLD) cmp command not found, please install diffutils\n$(NO_COLOR)
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,6 @@ OTHER_OPTION_NAMES = \
|
||||||
HELIX ZINC \
|
HELIX ZINC \
|
||||||
AUTOLOG_ENABLE \
|
AUTOLOG_ENABLE \
|
||||||
DEBUG_ENABLE \
|
DEBUG_ENABLE \
|
||||||
ENCODER_MAP_ENABLE \
|
|
||||||
ENCODER_ENABLE_CUSTOM \
|
ENCODER_ENABLE_CUSTOM \
|
||||||
GERMAN_ENABLE \
|
GERMAN_ENABLE \
|
||||||
HAPTIC_ENABLE \
|
HAPTIC_ENABLE \
|
||||||
|
|
@ -80,9 +79,7 @@ OTHER_OPTION_NAMES = \
|
||||||
LED_MIRRORED \
|
LED_MIRRORED \
|
||||||
RGBLIGHT_FULL_POWER \
|
RGBLIGHT_FULL_POWER \
|
||||||
LTO_ENABLE \
|
LTO_ENABLE \
|
||||||
PROGRAMMABLE_BUTTON_ENABLE \
|
PROGRAMMABLE_BUTTON_ENABLE
|
||||||
SECURE_ENABLE \
|
|
||||||
CAPS_WORD_ENABLE
|
|
||||||
|
|
||||||
define NAME_ECHO
|
define NAME_ECHO
|
||||||
@printf " %-30s = %-16s # %s\\n" "$1" "$($1)" "$(origin $1)"
|
@printf " %-30s = %-16s # %s\\n" "$1" "$($1)" "$(origin $1)"
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ TEST_LIST = $(sort $(patsubst %/test.mk,%, $(shell find $(ROOT_DIR)tests -type f
|
||||||
FULL_TESTS := $(notdir $(TEST_LIST))
|
FULL_TESTS := $(notdir $(TEST_LIST))
|
||||||
|
|
||||||
include $(QUANTUM_PATH)/debounce/tests/testlist.mk
|
include $(QUANTUM_PATH)/debounce/tests/testlist.mk
|
||||||
include $(QUANTUM_PATH)/encoder/tests/testlist.mk
|
|
||||||
include $(QUANTUM_PATH)/sequencer/tests/testlist.mk
|
include $(QUANTUM_PATH)/sequencer/tests/testlist.mk
|
||||||
include $(PLATFORM_PATH)/test/testlist.mk
|
include $(PLATFORM_PATH)/test/testlist.mk
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,35 +0,0 @@
|
||||||
{
|
|
||||||
"development_board": {
|
|
||||||
"promicro": {
|
|
||||||
"processor": "atmega32u4",
|
|
||||||
"bootloader": "caterina",
|
|
||||||
"pin_compatible": "promicro"
|
|
||||||
},
|
|
||||||
"elite_c": {
|
|
||||||
"processor": "atmega32u4",
|
|
||||||
"bootloader": "atmel-dfu",
|
|
||||||
"pin_compatible": "promicro"
|
|
||||||
},
|
|
||||||
"proton_c": {
|
|
||||||
"processor": "STM32F303",
|
|
||||||
"bootloader": "stm32-dfu",
|
|
||||||
"board": "QMK_PROTON_C",
|
|
||||||
"pin_compatible": "promicro"
|
|
||||||
},
|
|
||||||
"bluepill": {
|
|
||||||
"processor": "STM32F103",
|
|
||||||
"bootloader": "stm32duino",
|
|
||||||
"board": "STM32_F103_STM32DUINO"
|
|
||||||
},
|
|
||||||
"blackpill_f401": {
|
|
||||||
"processor": "STM32F401",
|
|
||||||
"bootloader": "stm32-dfu",
|
|
||||||
"board": "BLACKPILL_STM32_F401"
|
|
||||||
},
|
|
||||||
"blackpill_f411": {
|
|
||||||
"processor": "STM32F411",
|
|
||||||
"bootloader": "stm32-dfu",
|
|
||||||
"board": "BLACKPILL_STM32_F411"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -3,26 +3,22 @@
|
||||||
{
|
{
|
||||||
# Format:
|
# Format:
|
||||||
# <config.h key>: {"info_key": <info.json key>, ["value_type": <value_type>], ["to_json": <true/false>], ["to_c": <true/false>]}
|
# <config.h key>: {"info_key": <info.json key>, ["value_type": <value_type>], ["to_json": <true/false>], ["to_c": <true/false>]}
|
||||||
# value_type: one of "array", "array.int", "bool", "int", "hex", "list", "mapping", "str", "raw"
|
# value_type: one of "array", "array.int", "bool", "int", "hex", "list", "mapping"
|
||||||
# to_json: Default `true`. Set to `false` to exclude this mapping from info.json
|
# to_json: Default `true`. Set to `false` to exclude this mapping from info.json
|
||||||
# to_c: Default `true`. Set to `false` to exclude this mapping from config.h
|
# to_c: Default `true`. Set to `false` to exclude this mapping from config.h
|
||||||
# warn_duplicate: Default `true`. Set to `false` to turn off warning when a value exists in both places
|
# warn_duplicate: Default `true`. Set to `false` to turn off warning when a value exists in both places
|
||||||
# deprecated: Default `false`. Set to `true` to turn on warning when a value exists
|
|
||||||
# invalid: Default `false`. Set to `true` to generate errors when a value exists
|
|
||||||
"AUDIO_VOICES": {"info_key": "audio.voices", "value_type": "bool"},
|
"AUDIO_VOICES": {"info_key": "audio.voices", "value_type": "bool"},
|
||||||
"BACKLIGHT_BREATHING": {"info_key": "backlight.breathing", "value_type": "bool"},
|
"BACKLIGHT_BREATHING": {"info_key": "backlight.breathing", "value_type": "bool"},
|
||||||
"BREATHING_PERIOD": {"info_key": "backlight.breathing_period", "value_type": "int"},
|
"BREATHING_PERIOD": {"info_key": "backlight.breathing_period", "value_type": "int"},
|
||||||
"BACKLIGHT_PIN": {"info_key": "backlight.pin"},
|
"BACKLIGHT_PIN": {"info_key": "backlight.pin"},
|
||||||
"BOTH_SHIFTS_TURNS_ON_CAPS_WORD": {"info_key": "caps_word.both_shifts_turns_on", "value_type": "bool"},
|
|
||||||
"CAPS_WORD_IDLE_TIMEOUT": {"info_key": "caps_word.idle_timeout", "value_type": "int"},
|
|
||||||
"COMBO_COUNT": {"info_key": "combo.count", "value_type": "int"},
|
"COMBO_COUNT": {"info_key": "combo.count", "value_type": "int"},
|
||||||
"COMBO_TERM": {"info_key": "combo.term", "value_type": "int"},
|
"COMBO_TERM": {"info_key": "combo.term", "value_type": "int"},
|
||||||
"DEBOUNCE": {"info_key": "debounce", "value_type": "int"},
|
"DEBOUNCE": {"info_key": "debounce", "value_type": "int"},
|
||||||
"DEVICE_VER": {"info_key": "usb.device_ver", "value_type": "hex"},
|
"DEVICE_VER": {"info_key": "usb.device_ver", "value_type": "hex"},
|
||||||
# TODO: Replace ^^^ with vvv
|
# TODO: Replace ^^^ with vvv
|
||||||
#"DEVICE_VER": {"info_key": "usb.device_version", "value_type": "bcd_version"},
|
#"DEVICE_VER": {"info_key": "usb.device_version", "value_type": "bcd_version"},
|
||||||
|
"DESCRIPTION": {"info_key": "keyboard_folder", "to_json": false},
|
||||||
"DIODE_DIRECTION": {"info_key": "diode_direction"},
|
"DIODE_DIRECTION": {"info_key": "diode_direction"},
|
||||||
"DOUBLE_TAP_SHIFT_TURNS_ON_CAPS_WORD": {"info_key": "caps_word.double_tap_shift_turns_on", "value_type": "bool"},
|
|
||||||
"FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "bool"},
|
"FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "bool"},
|
||||||
"DYNAMIC_KEYMAP_EEPROM_MAX_ADDR": {"info_key": "dynamic_keymap.eeprom_max_addr", "value_type": "int"},
|
"DYNAMIC_KEYMAP_EEPROM_MAX_ADDR": {"info_key": "dynamic_keymap.eeprom_max_addr", "value_type": "int"},
|
||||||
"DYNAMIC_KEYMAP_LAYER_COUNT": {"info_key": "dynamic_keymap.layer_count", "value_type": "int"},
|
"DYNAMIC_KEYMAP_LAYER_COUNT": {"info_key": "dynamic_keymap.layer_count", "value_type": "int"},
|
||||||
|
|
@ -82,9 +78,6 @@
|
||||||
"QMK_KEYS_PER_SCAN": {"info_key": "qmk.keys_per_scan", "value_type": "int"},
|
"QMK_KEYS_PER_SCAN": {"info_key": "qmk.keys_per_scan", "value_type": "int"},
|
||||||
"QMK_LED": {"info_key": "qmk_lufa_bootloader.led"},
|
"QMK_LED": {"info_key": "qmk_lufa_bootloader.led"},
|
||||||
"QMK_SPEAKER": {"info_key": "qmk_lufa_bootloader.speaker"},
|
"QMK_SPEAKER": {"info_key": "qmk_lufa_bootloader.speaker"},
|
||||||
"SECURE_UNLOCK_SEQUENCE": {"info_key": "secure.unlock_sequence", "value_type": "array.array.int", "to_json": false},
|
|
||||||
"SECURE_UNLOCK_TIMEOUT": {"info_key": "secure.unlock_timeout", "value_type": "int"},
|
|
||||||
"SECURE_IDLE_TIMEOUT": {"info_key": "secure.idle_timeout", "value_type": "int"},
|
|
||||||
"SENDSTRING_BELL": {"info_key": "audio.macro_beep", "value_type": "bool"},
|
"SENDSTRING_BELL": {"info_key": "audio.macro_beep", "value_type": "bool"},
|
||||||
"SPLIT_MODS_ENABLE": {"info_key": "split.transport.sync_modifiers", "value_type": "bool"},
|
"SPLIT_MODS_ENABLE": {"info_key": "split.transport.sync_modifiers", "value_type": "bool"},
|
||||||
"SPLIT_TRANSPORT_MIRROR": {"info_key": "split.transport.sync_matrix_state", "value_type": "bool"},
|
"SPLIT_TRANSPORT_MIRROR": {"info_key": "split.transport.sync_matrix_state", "value_type": "bool"},
|
||||||
|
|
@ -103,11 +96,4 @@
|
||||||
"USB_MAX_POWER_CONSUMPTION": {"info_key": "usb.max_power", "value_type": "int"},
|
"USB_MAX_POWER_CONSUMPTION": {"info_key": "usb.max_power", "value_type": "int"},
|
||||||
"USB_POLLING_INTERVAL_MS": {"info_key": "usb.polling_interval", "value_type": "int"},
|
"USB_POLLING_INTERVAL_MS": {"info_key": "usb.polling_interval", "value_type": "int"},
|
||||||
"USB_SUSPEND_WAKEUP_DELAY": {"info_key": "usb.suspend_wakeup_delay", "value_type": "int"},
|
"USB_SUSPEND_WAKEUP_DELAY": {"info_key": "usb.suspend_wakeup_delay", "value_type": "int"},
|
||||||
|
|
||||||
# Items we want flagged in lint
|
|
||||||
"NO_ACTION_MACRO": {"info_key": "_invalid.no_action_macro", "invalid": true},
|
|
||||||
"NO_ACTION_FUNCTION": {"info_key": "_invalid.no_action_function", "invalid": true},
|
|
||||||
"DESCRIPTION": {"info_key": "_invalid.usb_description", "invalid": true},
|
|
||||||
"DEBOUNCING_DELAY": {"info_key": "_invalid.debouncing_delay", "invalid": true},
|
|
||||||
"PREVENT_STUCK_MODIFIERS": {"info_key": "_invalid.prevent_stuck_mods", "invalid": true},
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,16 +3,13 @@
|
||||||
{
|
{
|
||||||
# Format:
|
# Format:
|
||||||
# <rules.mk key>: {"info_key": <info.json key>, ["value_type": <value_type>], ["to_json": <true/false>], ["to_c": <true/false>]}
|
# <rules.mk key>: {"info_key": <info.json key>, ["value_type": <value_type>], ["to_json": <true/false>], ["to_c": <true/false>]}
|
||||||
# value_type: one of "array", "array.int", "bool", "int", "list", "hex", "mapping", "str", "raw"
|
# value_type: one of "array", "array.int", "bool", "int", "list", "hex", "mapping"
|
||||||
# to_json: Default `true`. Set to `false` to exclude this mapping from info.json
|
# to_json: Default `true`. Set to `false` to exclude this mapping from info.json
|
||||||
# to_c: Default `true`. Set to `false` to exclude this mapping from rules.mk
|
# to_c: Default `true`. Set to `false` to exclude this mapping from rules.mk
|
||||||
# warn_duplicate: Default `true`. Set to `false` to turn off warning when a value exists in both places
|
# warn_duplicate: Default `true`. Set to `false` to turn off warning when a value exists in both places
|
||||||
# deprecated: Default `false`. Set to `true` to turn on warning when a value exists
|
|
||||||
# invalid: Default `false`. Set to `true` to generate errors when a value exists
|
|
||||||
"BOARD": {"info_key": "board"},
|
"BOARD": {"info_key": "board"},
|
||||||
"BOOTLOADER": {"info_key": "bootloader", "warn_duplicate": false},
|
"BOOTLOADER": {"info_key": "bootloader", "warn_duplicate": false},
|
||||||
"BLUETOOTH": {"info_key": "bluetooth.driver"},
|
"BLUETOOTH": {"info_key": "bluetooth.driver"},
|
||||||
"CAPS_WORD_ENABLE": {"info_key": "caps_word.enabled", "value_type": "bool"},
|
|
||||||
"FIRMWARE_FORMAT": {"info_key": "build.firmware_format"},
|
"FIRMWARE_FORMAT": {"info_key": "build.firmware_format"},
|
||||||
"KEYBOARD_SHARED_EP": {"info_key": "usb.shared_endpoint.keyboard", "value_type": "bool"},
|
"KEYBOARD_SHARED_EP": {"info_key": "usb.shared_endpoint.keyboard", "value_type": "bool"},
|
||||||
"MOUSE_SHARED_EP": {"info_key": "usb.shared_endpoint.mouse", "value_type": "bool"},
|
"MOUSE_SHARED_EP": {"info_key": "usb.shared_endpoint.mouse", "value_type": "bool"},
|
||||||
|
|
@ -22,14 +19,7 @@
|
||||||
"MCU": {"info_key": "processor", "warn_duplicate": false},
|
"MCU": {"info_key": "processor", "warn_duplicate": false},
|
||||||
"MOUSEKEY_ENABLE": {"info_key": "mouse_key.enabled", "value_type": "bool"},
|
"MOUSEKEY_ENABLE": {"info_key": "mouse_key.enabled", "value_type": "bool"},
|
||||||
"NO_USB_STARTUP_CHECK": {"info_key": "usb.no_startup_check", "value_type": "bool"},
|
"NO_USB_STARTUP_CHECK": {"info_key": "usb.no_startup_check", "value_type": "bool"},
|
||||||
"PIN_COMPATIBLE": {"info_key": "pin_compatible"},
|
|
||||||
"SECURE_ENABLE": {"info_key": "secure.enabled", "value_type": "bool"},
|
|
||||||
"SPLIT_KEYBOARD": {"info_key": "split.enabled", "value_type": "bool"},
|
"SPLIT_KEYBOARD": {"info_key": "split.enabled", "value_type": "bool"},
|
||||||
"SPLIT_TRANSPORT": {"info_key": "split.transport.protocol", "to_c": false},
|
"SPLIT_TRANSPORT": {"info_key": "split.transport.protocol", "value_type": "str", "to_c": false},
|
||||||
"WAIT_FOR_USB": {"info_key": "usb.wait_for", "value_type": "bool"},
|
"WAIT_FOR_USB": {"info_key": "usb.wait_for", "value_type": "bool"}
|
||||||
|
|
||||||
# Items we want flagged in lint
|
|
||||||
"CTPC": {"info_key": "_deprecated.ctpc", "deprecated": true},
|
|
||||||
"CONVERT_TO_PROTON_C": {"info_key": "_deprecated.ctpc", "deprecated": true},
|
|
||||||
"VIAL_ENABLE": {"info_key": "_invalid.vial", "invalid": true},
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,9 +11,6 @@
|
||||||
'2_milk': {
|
'2_milk': {
|
||||||
target: 'spaceman/2_milk'
|
target: 'spaceman/2_milk'
|
||||||
},
|
},
|
||||||
'absinthe': {
|
|
||||||
target: 'keyhive/absinthe'
|
|
||||||
},
|
|
||||||
'aeboards/constellation': {
|
'aeboards/constellation': {
|
||||||
target: 'aeboards/constellation/rev1'
|
target: 'aeboards/constellation/rev1'
|
||||||
},
|
},
|
||||||
|
|
@ -29,18 +26,6 @@
|
||||||
alice: {
|
alice: {
|
||||||
target: 'tgr/alice'
|
target: 'tgr/alice'
|
||||||
},
|
},
|
||||||
amj40: {
|
|
||||||
target: 'amjkeyboard/amj40'
|
|
||||||
},
|
|
||||||
amj60: {
|
|
||||||
target: 'amjkeyboard/amj60'
|
|
||||||
},
|
|
||||||
amj96: {
|
|
||||||
target: 'amjkeyboard/amj96'
|
|
||||||
},
|
|
||||||
amjpad: {
|
|
||||||
target: 'amjkeyboard/amjpad'
|
|
||||||
},
|
|
||||||
angel17: {
|
angel17: {
|
||||||
target: 'angel17/alpha'
|
target: 'angel17/alpha'
|
||||||
},
|
},
|
||||||
|
|
@ -48,10 +33,7 @@
|
||||||
target: 'angel64/alpha'
|
target: 'angel64/alpha'
|
||||||
},
|
},
|
||||||
at101_blackheart: {
|
at101_blackheart: {
|
||||||
target: 'viktus/at101_bh'
|
target: 'at101_bh'
|
||||||
},
|
|
||||||
at101_bh: {
|
|
||||||
target: 'viktus/at101_bh'
|
|
||||||
},
|
},
|
||||||
'atom47/rev2': {
|
'atom47/rev2': {
|
||||||
target: 'maartenwut/atom47/rev2'
|
target: 'maartenwut/atom47/rev2'
|
||||||
|
|
@ -176,9 +158,6 @@
|
||||||
ergoinu: {
|
ergoinu: {
|
||||||
target: 'dm9records/ergoinu'
|
target: 'dm9records/ergoinu'
|
||||||
},
|
},
|
||||||
ergosaurus: {
|
|
||||||
target: 'keyhive/ergosaurus'
|
|
||||||
},
|
|
||||||
'exclusive/e85': {
|
'exclusive/e85': {
|
||||||
target: 'exclusive/e85/hotswap'
|
target: 'exclusive/e85/hotswap'
|
||||||
},
|
},
|
||||||
|
|
@ -186,13 +165,7 @@
|
||||||
target: 'gh60/revc'
|
target: 'gh60/revc'
|
||||||
},
|
},
|
||||||
'gmmk/pro': {
|
'gmmk/pro': {
|
||||||
target: 'gmmk/pro/rev1/ansi'
|
target: 'gmmk/pro/ansi'
|
||||||
},
|
|
||||||
'gmmk/pro/ansi': {
|
|
||||||
target: 'gmmk/pro/rev1/ansi'
|
|
||||||
},
|
|
||||||
'gmmk/pro/iso': {
|
|
||||||
target: 'gmmk/pro/rev1/iso'
|
|
||||||
},
|
},
|
||||||
'handwired/ferris': {
|
'handwired/ferris': {
|
||||||
target: 'ferris/0_1'
|
target: 'ferris/0_1'
|
||||||
|
|
@ -239,9 +212,6 @@
|
||||||
'helix/rev2/under/oled': {
|
'helix/rev2/under/oled': {
|
||||||
target: 'helix/rev2/under'
|
target: 'helix/rev2/under'
|
||||||
},
|
},
|
||||||
honeycomb: {
|
|
||||||
target: 'keyhive/honeycomb'
|
|
||||||
},
|
|
||||||
id80: {
|
id80: {
|
||||||
target: 'id80/ansi'
|
target: 'id80/ansi'
|
||||||
},
|
},
|
||||||
|
|
@ -290,9 +260,6 @@
|
||||||
'kyria': {
|
'kyria': {
|
||||||
target: 'splitkb/kyria'
|
target: 'splitkb/kyria'
|
||||||
},
|
},
|
||||||
lattice60: {
|
|
||||||
target: 'keyhive/lattice60'
|
|
||||||
},
|
|
||||||
'lazydesigners/the60': {
|
'lazydesigners/the60': {
|
||||||
target: 'lazydesigners/the60/rev1'
|
target: 'lazydesigners/the60/rev1'
|
||||||
},
|
},
|
||||||
|
|
@ -425,13 +392,7 @@
|
||||||
target: 'oddball/v1'
|
target: 'oddball/v1'
|
||||||
},
|
},
|
||||||
omnikey_blackheart: {
|
omnikey_blackheart: {
|
||||||
target: 'viktus/omnikey_bh'
|
target: 'omnikey_bh'
|
||||||
},
|
|
||||||
omnikey_bh: {
|
|
||||||
target: 'viktus/omnikey_bh'
|
|
||||||
},
|
|
||||||
opus: {
|
|
||||||
target: 'keyhive/opus'
|
|
||||||
},
|
},
|
||||||
'pabile/p20': {
|
'pabile/p20': {
|
||||||
target: 'pabile/p20/ver1'
|
target: 'pabile/p20/ver1'
|
||||||
|
|
@ -528,12 +489,6 @@
|
||||||
skog: {
|
skog: {
|
||||||
target: 'percent/skog'
|
target: 'percent/skog'
|
||||||
},
|
},
|
||||||
smallice: {
|
|
||||||
target: 'keyhive/smallice'
|
|
||||||
},
|
|
||||||
southpole: {
|
|
||||||
target: 'keyhive/southpole'
|
|
||||||
},
|
|
||||||
speedo: {
|
speedo: {
|
||||||
target: 'cozykeys/speedo/v2'
|
target: 'cozykeys/speedo/v2'
|
||||||
},
|
},
|
||||||
|
|
@ -622,10 +577,7 @@
|
||||||
target: 'ymd75/rev1'
|
target: 'ymd75/rev1'
|
||||||
},
|
},
|
||||||
z150_blackheart: {
|
z150_blackheart: {
|
||||||
target: 'viktus/z150_bh'
|
target: 'z150_bh'
|
||||||
},
|
|
||||||
z150_bh:{
|
|
||||||
target: 'viktus/z150_bh'
|
|
||||||
},
|
},
|
||||||
zeal60: {
|
zeal60: {
|
||||||
target: 'wilba_tech/zeal60'
|
target: 'wilba_tech/zeal60'
|
||||||
|
|
@ -952,9 +904,6 @@
|
||||||
meishi2: {
|
meishi2: {
|
||||||
target: 'biacco42/meishi2'
|
target: 'biacco42/meishi2'
|
||||||
},
|
},
|
||||||
melody96: {
|
|
||||||
target: 'ymdk/melody96'
|
|
||||||
},
|
|
||||||
minidox/rev1: {
|
minidox/rev1: {
|
||||||
target: 'maple_computing/minidox/rev1'
|
target: 'maple_computing/minidox/rev1'
|
||||||
},
|
},
|
||||||
|
|
@ -970,18 +919,6 @@
|
||||||
montex: {
|
montex: {
|
||||||
target: 'idobao/montex/v1'
|
target: 'idobao/montex/v1'
|
||||||
},
|
},
|
||||||
mt40: {
|
|
||||||
target: 'mt/mt40'
|
|
||||||
},
|
|
||||||
mt64rgb: {
|
|
||||||
target: 'mt/mt64rgb'
|
|
||||||
},
|
|
||||||
mt84: {
|
|
||||||
target: 'mt/mt84'
|
|
||||||
},
|
|
||||||
mt980: {
|
|
||||||
target: 'mt/mt980'
|
|
||||||
},
|
|
||||||
nafuda: {
|
nafuda: {
|
||||||
target: 'salicylic_acid3/nafuda'
|
target: 'salicylic_acid3/nafuda'
|
||||||
},
|
},
|
||||||
|
|
@ -1006,9 +943,6 @@
|
||||||
namecard2x4: {
|
namecard2x4: {
|
||||||
target: 'takashiski/namecard2x4'
|
target: 'takashiski/namecard2x4'
|
||||||
},
|
},
|
||||||
navi10: {
|
|
||||||
target: 'keyhive/navi10'
|
|
||||||
},
|
|
||||||
nebula12: {
|
nebula12: {
|
||||||
target: 'spaceholdings/nebula12'
|
target: 'spaceholdings/nebula12'
|
||||||
},
|
},
|
||||||
|
|
@ -1210,12 +1144,6 @@
|
||||||
underscore33/rev2: {
|
underscore33/rev2: {
|
||||||
target: 'tominabox1/underscore33/rev2'
|
target: 'tominabox1/underscore33/rev2'
|
||||||
},
|
},
|
||||||
uno: {
|
|
||||||
target: 'keyhive/uno'
|
|
||||||
},
|
|
||||||
ut472: {
|
|
||||||
target: 'keyhive/ut472'
|
|
||||||
},
|
|
||||||
vn66: {
|
vn66: {
|
||||||
target: 'hnahkb/vn66'
|
target: 'hnahkb/vn66'
|
||||||
},
|
},
|
||||||
|
|
@ -1225,12 +1153,6 @@
|
||||||
wanten: {
|
wanten: {
|
||||||
target: 'qpockets/wanten'
|
target: 'qpockets/wanten'
|
||||||
},
|
},
|
||||||
'wheatfield/blocked65': {
|
|
||||||
target: 'mt/blocked65'
|
|
||||||
},
|
|
||||||
'wheatfield/split75': {
|
|
||||||
target: 'mt/split75'
|
|
||||||
},
|
|
||||||
whitefox: {
|
whitefox: {
|
||||||
target: 'input_club/whitefox'
|
target: 'input_club/whitefox'
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,8 @@
|
||||||
"LAYOUT_2x2uC",
|
"LAYOUT_2x2uC",
|
||||||
"LAYOUT_2x3uC",
|
"LAYOUT_2x3uC",
|
||||||
"LAYOUT_625uC",
|
"LAYOUT_625uC",
|
||||||
|
"LAYOUT_ANSI_DEFAULT",
|
||||||
|
"LAYOUT_JP",
|
||||||
"LAYOUT_ortho_3x12_1x2uC",
|
"LAYOUT_ortho_3x12_1x2uC",
|
||||||
"LAYOUT_ortho_4x12_1x2uC",
|
"LAYOUT_ortho_4x12_1x2uC",
|
||||||
"LAYOUT_ortho_4x12_1x2uL",
|
"LAYOUT_ortho_4x12_1x2uL",
|
||||||
|
|
@ -55,7 +57,8 @@
|
||||||
"LAYOUT_planck_1x2uR",
|
"LAYOUT_planck_1x2uR",
|
||||||
"LAYOUT_preonic_1x2uC",
|
"LAYOUT_preonic_1x2uC",
|
||||||
"LAYOUT_preonic_1x2uL",
|
"LAYOUT_preonic_1x2uL",
|
||||||
"LAYOUT_preonic_1x2uR"
|
"LAYOUT_preonic_1x2uR",
|
||||||
|
"LAYOUT_reviung34_2uL"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -68,22 +71,6 @@
|
||||||
"type": "number",
|
"type": "number",
|
||||||
"min": 0.25
|
"min": 0.25
|
||||||
},
|
},
|
||||||
"keyboard": {
|
|
||||||
"oneOf": [
|
|
||||||
{
|
|
||||||
"type": "string",
|
|
||||||
"enum": [
|
|
||||||
"converter/numeric_keypad_IIe",
|
|
||||||
"emptystring/NQG",
|
|
||||||
"maple_computing/christmas_tree/V2017"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "string",
|
|
||||||
"pattern": "^[0-9a-z][0-9a-z_/]*$"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"mcu_pin_array": {
|
"mcu_pin_array": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {"$ref": "#/mcu_pin"}
|
"items": {"$ref": "#/mcu_pin"}
|
||||||
|
|
|
||||||
|
|
@ -5,24 +5,15 @@
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"keyboard_name": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
"keyboard_name": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
||||||
"keyboard_folder": {"$ref": "qmk.definitions.v1#/keyboard"},
|
|
||||||
"maintainer": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
"maintainer": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
||||||
"manufacturer": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
"manufacturer": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
||||||
"url": {
|
"url": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "uri"
|
"format": "uri"
|
||||||
},
|
},
|
||||||
"development_board": {
|
|
||||||
"type": "string",
|
|
||||||
"enum": ["promicro", "elite_c", "proton_c", "bluepill", "blackpill_f401", "blackpill_f411"]
|
|
||||||
},
|
|
||||||
"pin_compatible": {
|
|
||||||
"type": "string",
|
|
||||||
"enum": ["promicro"]
|
|
||||||
},
|
|
||||||
"processor": {
|
"processor": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": ["cortex-m0", "cortex-m0plus", "cortex-m3", "cortex-m4", "MKL26Z64", "MK20DX128", "MK20DX256", "MK66FX1M0", "STM32F042", "STM32F072", "STM32F103", "STM32F303", "STM32F401", "STM32F405", "STM32F407", "STM32F411", "STM32F446", "STM32G431", "STM32G474", "STM32L412", "STM32L422", "STM32L432", "STM32L433", "STM32L442", "STM32L443", "GD32VF103", "WB32F3G71", "WB32FQ95", "atmega16u2", "atmega32u2", "atmega16u4", "atmega32u4", "at90usb162", "at90usb646", "at90usb647", "at90usb1286", "at90usb1287", "atmega32a", "atmega328p", "atmega328", "attiny85", "unknown"]
|
"enum": ["cortex-m0", "cortex-m0plus", "cortex-m3", "cortex-m4", "MKL26Z64", "MK20DX128", "MK20DX256", "MK66FX1M0", "STM32F042", "STM32F072", "STM32F103", "STM32F303", "STM32F401", "STM32F405", "STM32F407", "STM32F411", "STM32F446", "STM32G431", "STM32G474", "STM32L412", "STM32L422", "STM32L432", "STM32L433", "STM32L442", "STM32L443", "GD32VF103", "WB32F3G71", "atmega16u2", "atmega32u2", "atmega16u4", "atmega32u4", "at90usb162", "at90usb646", "at90usb647", "at90usb1286", "at90usb1287", "atmega32a", "atmega328p", "atmega328", "attiny85", "unknown"]
|
||||||
},
|
},
|
||||||
"audio": {
|
"audio": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
|
|
@ -92,16 +83,6 @@
|
||||||
"enum": ["COL2ROW", "ROW2COL"]
|
"enum": ["COL2ROW", "ROW2COL"]
|
||||||
},
|
},
|
||||||
"debounce": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"debounce": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||||
"caps_word": {
|
|
||||||
"type": "object",
|
|
||||||
"additionalProperties": false,
|
|
||||||
"properties": {
|
|
||||||
"enabled": {"type": "boolean"},
|
|
||||||
"both_shifts_turns_on": {"type": "boolean"},
|
|
||||||
"double_tap_shift_turns_on": {"type": "boolean"},
|
|
||||||
"idle_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"combo": {
|
"combo": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
|
|
@ -145,10 +126,7 @@
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"properties": {
|
"properties": {
|
||||||
"label": {
|
"label": {"type": "string"},
|
||||||
"type": "string",
|
|
||||||
"pattern": "^[^\\n]*$"
|
|
||||||
},
|
|
||||||
"matrix": {
|
"matrix": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"minItems": 2,
|
"minItems": 2,
|
||||||
|
|
@ -215,62 +193,6 @@
|
||||||
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"led_matrix": {
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"driver": {"type": "string"},
|
|
||||||
"layout": {
|
|
||||||
"type": "array",
|
|
||||||
"items": {
|
|
||||||
"type": "object",
|
|
||||||
"additionalProperties": false,
|
|
||||||
"properties": {
|
|
||||||
"matrix": {
|
|
||||||
"type": "array",
|
|
||||||
"minItems": 2,
|
|
||||||
"maxItems": 2,
|
|
||||||
"items": {
|
|
||||||
"type": "number",
|
|
||||||
"min": 0,
|
|
||||||
"multipleOf": 1
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"x": {"$ref": "qmk.definitions.v1#/key_unit"},
|
|
||||||
"y": {"$ref": "qmk.definitions.v1#/key_unit"},
|
|
||||||
"flags": {"$ref": "qmk.definitions.v1#/unsigned_decimal"}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"rgb_matrix": {
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"driver": {"type": "string"},
|
|
||||||
"layout": {
|
|
||||||
"type": "array",
|
|
||||||
"items": {
|
|
||||||
"type": "object",
|
|
||||||
"additionalProperties": false,
|
|
||||||
"properties": {
|
|
||||||
"matrix": {
|
|
||||||
"type": "array",
|
|
||||||
"minItems": 2,
|
|
||||||
"maxItems": 2,
|
|
||||||
"items": {
|
|
||||||
"type": "number",
|
|
||||||
"min": 0,
|
|
||||||
"multipleOf": 1
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"x": {"$ref": "qmk.definitions.v1#/key_unit"},
|
|
||||||
"y": {"$ref": "qmk.definitions.v1#/key_unit"},
|
|
||||||
"flags": {"$ref": "qmk.definitions.v1#/unsigned_decimal"}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"rgblight": {
|
"rgblight": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
|
|
@ -313,30 +235,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"secure": {
|
|
||||||
"type": "object",
|
|
||||||
"additionalProperties": false,
|
|
||||||
"properties": {
|
|
||||||
"enabled": {"type": "boolean"},
|
|
||||||
"unlock_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
|
||||||
"idle_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
|
||||||
"unlock_sequence": {
|
|
||||||
"type": "array",
|
|
||||||
"minLength": 1,
|
|
||||||
"maxLength": 5,
|
|
||||||
"items": {
|
|
||||||
"type": "array",
|
|
||||||
"minItems": 2,
|
|
||||||
"maxItems": 2,
|
|
||||||
"items": {
|
|
||||||
"type": "number",
|
|
||||||
"min": 0,
|
|
||||||
"multipleOf": 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"split": {
|
"split": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
|
|
|
||||||
|
|
@ -1,216 +0,0 @@
|
||||||
# QMK Breaking Changes - 2022 May 28 Changelog
|
|
||||||
|
|
||||||
## Notable Features :id=notable-features
|
|
||||||
|
|
||||||
### Caps Word ([#16588](https://github.com/qmk/qmk_firmware/pull/16588)) :id=caps-word
|
|
||||||
|
|
||||||
This is a new feature that allows for capslock-like functionality that turns itself off at the end of the word.
|
|
||||||
|
|
||||||
For instance, if you wish to type "QMK" without holding shift the entire time, you can either tap both left and right shift, or double-tap shift, to turn on _Caps Word_ -- then type `qmk` (lowercase) without holding shift. Once you hit any key other than `a`--`z`, `0`--`9`, `-`, `_`, delete, or backspace, this will go back to normal typing!
|
|
||||||
|
|
||||||
There are other activation mechanisms as well as configurable options like timeout and the like -- see the [Caps Word documentation](feature_caps_word.md) for more information.
|
|
||||||
|
|
||||||
### Quantum Painter ([#10174](https://github.com/qmk/qmk_firmware/pull/10174)) :id=quantum-painter
|
|
||||||
|
|
||||||
QMK has had support for small OLED displays for some time now, but hasn't really gained too much ability to draw to panels other than the SSD1306 or SH1106 panels.
|
|
||||||
|
|
||||||
Quantum Painter is a new drawing subsystem available to suitable ARM and RISC-V boards that is capable of drawing to large panel RGB LCDs and RGB OLEDs. It also allows for a lot more flexibility with a larger set of drawing APIs -- lines, rectangles, circles, ellipses, text, images, and even animations.
|
|
||||||
|
|
||||||
The QMK CLI has new commands added to be able to generate images and fonts for Quantum Painter to digest -- it's even capable of converting animated gifs for display on screen.
|
|
||||||
|
|
||||||
See the [Quantum Painter documentation](quantum_painter.md) for more information on how to set up the displays as well as how to convert images and fonts.
|
|
||||||
|
|
||||||
!> Quantum Painter is not supported on AVR due to complexity and size constraints. Boards based on AVR such as ProMicro or Elite-C builds will not be able to leverage Quantum Painter.
|
|
||||||
|
|
||||||
### Encoder Mapping ([#13286](https://github.com/qmk/qmk_firmware/pull/13286)) :id=encoder-mapping
|
|
||||||
|
|
||||||
One of the long-standing complaints with Encoders is that there has been no easy way to configure them in user keymaps. [#13286](https://github.com/qmk/qmk_firmware/pull/13286) added support for [Encoder Mapping](feature_encoders.md#encoder-map), which allows users to define encoder functionality in a similar way to their normal keymap.
|
|
||||||
|
|
||||||
!> This is not yet supported by QMK Configurator. It is also unlikely to ever be supported by VIA.
|
|
||||||
|
|
||||||
## Changes Requiring User Action :id=changes-requiring-user-action
|
|
||||||
|
|
||||||
### `RESET` => `QK_BOOT` ([#17037](https://github.com/qmk/qmk_firmware/pull/17037)) :id=reset-2-qk_boot
|
|
||||||
|
|
||||||
QMK is always in the process of picking up support for new hardware platforms. One of the side-effects for future integrations has shown that QMK's usage of `RESET` as a keycode is causing naming collisions. As a result, [#17037](https://github.com/qmk/qmk_firmware/pull/17037) changed usages of `RESET` to the new keycode `QK_BOOT` in the majority of default-like keymaps. At this stage the old keycode is still usable but will likely be removed in the next breaking changes cycle. Users with keymaps containing `RESET` should also move to `QK_BOOT`.
|
|
||||||
|
|
||||||
### Sendstring keycode overhaul ([#16941](https://github.com/qmk/qmk_firmware/pull/16941)) :id=sendstring-keycodes
|
|
||||||
|
|
||||||
Some keycodes used with `SEND_STRING` and its relatives have been deprecated and may have their old keycode usages removed at a later date. The list of [deprecated keycodes](https://github.com/qmk/qmk_firmware/blob/ebd402788346aa6e88bde1486b2a835684d40d39/quantum/send_string_keycodes.h#L456-L505) should be consulted to determine if you're using one of the older names (the first identifier after `#define`) -- you should swap to the newer variant (the second identifier on the same line).
|
|
||||||
|
|
||||||
### Pillow Installation ([#17133](https://github.com/qmk/qmk_firmware/pull/17133)) :id=pillow-install
|
|
||||||
|
|
||||||
The merge of Quantum Painter added some new dependencies in the QMK CLI, most notably _Pillow_, which requires some installation in order for the CLI to function. If you've got an existing installation, you'll need to run some commands in order to get things working:
|
|
||||||
|
|
||||||
On Windows, if using _QMK MSYS_ or _msys2_, you'll need to run the following command:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
pacman --needed --noconfirm --disable-download-timeout -S mingw-w64-x86_64-python-pillow
|
|
||||||
python3 -m pip install --upgrade qmk
|
|
||||||
```
|
|
||||||
|
|
||||||
On macOS:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
brew update
|
|
||||||
brew upgrade qmk/qmk/qmk
|
|
||||||
```
|
|
||||||
|
|
||||||
On Linux or WSL:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
python3 -m pip install --user --upgrade qmk
|
|
||||||
```
|
|
||||||
|
|
||||||
### Updated Keyboard Codebases :id=updated-keyboard-codebases
|
|
||||||
|
|
||||||
The following keyboards have had their source moved within QMK:
|
|
||||||
|
|
||||||
| Old Keyboard Name | New Keyboard Name |
|
|
||||||
|----------------------|--------------------|
|
|
||||||
| absinthe | keyhive/absinthe |
|
|
||||||
| amj40 | amjkeyboard/amj40 |
|
|
||||||
| amj60 | amjkeyboard/amj60 |
|
|
||||||
| amj96 | amjkeyboard/amj96 |
|
|
||||||
| amjpad | amjkeyboard/amjpad |
|
|
||||||
| at101_bh | viktus/at101_bh |
|
|
||||||
| ergosaurus | keyhive/ergosaurus |
|
|
||||||
| gmmk/pro/ansi | gmmk/pro/rev1/ansi |
|
|
||||||
| gmmk/pro/iso | gmmk/pro/rev1/iso |
|
|
||||||
| honeycomb | keyhive/honeycomb |
|
|
||||||
| lattice60 | keyhive/lattice60 |
|
|
||||||
| melody96 | ymdk/melody96 |
|
|
||||||
| mt40 | mt/mt40 |
|
|
||||||
| mt64rgb | mt/mt64rgb |
|
|
||||||
| mt84 | mt/mt84 |
|
|
||||||
| mt980 | mt/mt980 |
|
|
||||||
| navi10 | keyhive/navi10 |
|
|
||||||
| omnikey_bh | viktus/omnikey_bh |
|
|
||||||
| opus | keyhive/opus |
|
|
||||||
| smallice | keyhive/smallice |
|
|
||||||
| southpole | keyhive/southpole |
|
|
||||||
| uno | keyhive/uno |
|
|
||||||
| ut472 | keyhive/ut472 |
|
|
||||||
| wheatfield/blocked65 | mt/blocked65 |
|
|
||||||
| wheatfield/split75 | mt/split75 |
|
|
||||||
| z150_bh | viktus/z150_bh |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Full changelist :id=full-changelist
|
|
||||||
|
|
||||||
Core:
|
|
||||||
* Quantum Painter ([#10174](https://github.com/qmk/qmk_firmware/pull/10174))
|
|
||||||
* Add support for encoder mapping. ([#13286](https://github.com/qmk/qmk_firmware/pull/13286))
|
|
||||||
* Add support for multiple switchs/solenoids to Haptic Feedback engine ([#15657](https://github.com/qmk/qmk_firmware/pull/15657))
|
|
||||||
* Add compile/make macro to core ([#15959](https://github.com/qmk/qmk_firmware/pull/15959))
|
|
||||||
* Add Reboot keycode to core ([#15990](https://github.com/qmk/qmk_firmware/pull/15990))
|
|
||||||
* Add support for multiple sensors to pmw3360 ([#15996](https://github.com/qmk/qmk_firmware/pull/15996))
|
|
||||||
* Asymmetric encoders, encoder tests. ([#16068](https://github.com/qmk/qmk_firmware/pull/16068))
|
|
||||||
* Add hacky via support for RGB Matrix ([#16086](https://github.com/qmk/qmk_firmware/pull/16086))
|
|
||||||
* Allow usage of AVRs minimal printf library ([#16266](https://github.com/qmk/qmk_firmware/pull/16266))
|
|
||||||
* Squeeze AVR some more with `-mrelax` and `-mcall-prologues` ([#16269](https://github.com/qmk/qmk_firmware/pull/16269))
|
|
||||||
* Heatmap incorrect matrix effect workaround ([#16315](https://github.com/qmk/qmk_firmware/pull/16315))
|
|
||||||
* Add SN74x154 driver and convert AL1 custom matrix ([#16331](https://github.com/qmk/qmk_firmware/pull/16331))
|
|
||||||
* Add customizable snake and knight animation increments ([#16337](https://github.com/qmk/qmk_firmware/pull/16337))
|
|
||||||
* Chibios USB protocol: allow overriding RAW Capacity ([#16339](https://github.com/qmk/qmk_firmware/pull/16339))
|
|
||||||
* HD44780 driver rework ([#16370](https://github.com/qmk/qmk_firmware/pull/16370))
|
|
||||||
* Update wb32-dfu ([#16438](https://github.com/qmk/qmk_firmware/pull/16438))
|
|
||||||
* Remove `send_unicode_hex_string()` ([#16518](https://github.com/qmk/qmk_firmware/pull/16518))
|
|
||||||
* Add :flash target for UF2 bootloaders ([#16525](https://github.com/qmk/qmk_firmware/pull/16525))
|
|
||||||
* Move `has_mouse_report_changed` function to `report.c` ([#16543](https://github.com/qmk/qmk_firmware/pull/16543))
|
|
||||||
* Move Doxygen docs to subdirectory ([#16561](https://github.com/qmk/qmk_firmware/pull/16561))
|
|
||||||
* Add Caps Word feature to core ([#16588](https://github.com/qmk/qmk_firmware/pull/16588))
|
|
||||||
* Add non blackpill F4x1 config files ([#16600](https://github.com/qmk/qmk_firmware/pull/16600))
|
|
||||||
* Force platform pin defs to be included ([#16611](https://github.com/qmk/qmk_firmware/pull/16611))
|
|
||||||
* Refactor CTPC logic to allow future converters ([#16621](https://github.com/qmk/qmk_firmware/pull/16621))
|
|
||||||
* Use a mutex guard for split shared memory ([#16647](https://github.com/qmk/qmk_firmware/pull/16647))
|
|
||||||
* Rename TICK to TICK_EVENT ([#16649](https://github.com/qmk/qmk_firmware/pull/16649))
|
|
||||||
* Add GET_TAPPING_TERM macro to reduce duplicate code ([#16681](https://github.com/qmk/qmk_firmware/pull/16681))
|
|
||||||
* add the ability to change the pwm frequency for the IS31FL3737B ([#16718](https://github.com/qmk/qmk_firmware/pull/16718))
|
|
||||||
* Joystick feature updates ([#16732](https://github.com/qmk/qmk_firmware/pull/16732))
|
|
||||||
* Add emulated eeprom support for STM32F303xE ([#16737](https://github.com/qmk/qmk_firmware/pull/16737))
|
|
||||||
* Refactor writePin to work with statements ([#16738](https://github.com/qmk/qmk_firmware/pull/16738))
|
|
||||||
* Add mechanism to limit available converters ([#16783](https://github.com/qmk/qmk_firmware/pull/16783))
|
|
||||||
* Implement XAP 'secure' core requirements ([#16843](https://github.com/qmk/qmk_firmware/pull/16843))
|
|
||||||
* rgblight: Add functions to stop blinking one or all but one layer ([#16859](https://github.com/qmk/qmk_firmware/pull/16859))
|
|
||||||
* Expose API for hardware unique ID ([#16869](https://github.com/qmk/qmk_firmware/pull/16869))
|
|
||||||
* Added support for Wb32fq95 ([#16871](https://github.com/qmk/qmk_firmware/pull/16871))
|
|
||||||
* Provide better config defaults for bluepill boards ([#16909](https://github.com/qmk/qmk_firmware/pull/16909))
|
|
||||||
* Joystick: Simplify report descriptor and clean up error messages ([#16926](https://github.com/qmk/qmk_firmware/pull/16926))
|
|
||||||
* Rename keymap_extras headers for consistency ([#16939](https://github.com/qmk/qmk_firmware/pull/16939))
|
|
||||||
* Sendstring keycode overhaul ([#16941](https://github.com/qmk/qmk_firmware/pull/16941))
|
|
||||||
* Move disable_jtag to platforms ([#16960](https://github.com/qmk/qmk_firmware/pull/16960))
|
|
||||||
* Remove ARM pgm_read_word workaround in rgblight ([#16961](https://github.com/qmk/qmk_firmware/pull/16961))
|
|
||||||
* Warn about LTO with arm_atsam, not ChibiOS. ([#17106](https://github.com/qmk/qmk_firmware/pull/17106))
|
|
||||||
|
|
||||||
CLI:
|
|
||||||
* Rework generate-api CLI command to use .build directory ([#16441](https://github.com/qmk/qmk_firmware/pull/16441))
|
|
||||||
* Change data driven "str" type to represent a quoted string literal ([#16516](https://github.com/qmk/qmk_firmware/pull/16516))
|
|
||||||
* Bump the 'jsonschema' version ([#16635](https://github.com/qmk/qmk_firmware/pull/16635))
|
|
||||||
* Add frameworking for development board presets ([#16637](https://github.com/qmk/qmk_firmware/pull/16637))
|
|
||||||
* Extend 'qmk info' to handle keymap level overrides ([#16702](https://github.com/qmk/qmk_firmware/pull/16702))
|
|
||||||
* Data driven `g_led_config` ([#16728](https://github.com/qmk/qmk_firmware/pull/16728))
|
|
||||||
* Allow new-keyboard to use development_board presets ([#16785](https://github.com/qmk/qmk_firmware/pull/16785))
|
|
||||||
* Also format *.hpp files. ([#16997](https://github.com/qmk/qmk_firmware/pull/16997))
|
|
||||||
|
|
||||||
Submodule updates:
|
|
||||||
* ChibiOS 21.11.1 update. ([#16251](https://github.com/qmk/qmk_firmware/pull/16251))
|
|
||||||
* Update ChibiOS-Contrib ([#16915](https://github.com/qmk/qmk_firmware/pull/16915))
|
|
||||||
|
|
||||||
Keyboards:
|
|
||||||
* chore: Add personal GMMK Pro keymap ([#15320](https://github.com/qmk/qmk_firmware/pull/15320))
|
|
||||||
* move melody96 to ymdk vendor folder ([#15680](https://github.com/qmk/qmk_firmware/pull/15680))
|
|
||||||
* move amj keyboards into amjkeyboard vendor folder ([#15733](https://github.com/qmk/qmk_firmware/pull/15733))
|
|
||||||
* move z150_bh at101_bh omnikey_bh to viktus/ ([#16004](https://github.com/qmk/qmk_firmware/pull/16004))
|
|
||||||
* MS Sculpt Mobile refactor ([#16038](https://github.com/qmk/qmk_firmware/pull/16038))
|
|
||||||
* move keyhive exclusive boards into /keyhive ([#16084](https://github.com/qmk/qmk_firmware/pull/16084))
|
|
||||||
* move 麦田 boards into /mt ([#16095](https://github.com/qmk/qmk_firmware/pull/16095))
|
|
||||||
* Convert Wasdat Code custom matrix to SN74x138 driver ([#16257](https://github.com/qmk/qmk_firmware/pull/16257))
|
|
||||||
* Move GMMK Pro to allow for multiple revisions ([#16423](https://github.com/qmk/qmk_firmware/pull/16423))
|
|
||||||
* Updated pin mapping and readme. ([#16505](https://github.com/qmk/qmk_firmware/pull/16505))
|
|
||||||
* Map data driven `DESCRIPTION` as string literal ([#16523](https://github.com/qmk/qmk_firmware/pull/16523))
|
|
||||||
* remove unecessary layers ([#16559](https://github.com/qmk/qmk_firmware/pull/16559))
|
|
||||||
* Helix/rev2 move to split common ([#16723](https://github.com/qmk/qmk_firmware/pull/16723))
|
|
||||||
* Remove some layout exceptions ([#16957](https://github.com/qmk/qmk_firmware/pull/16957))
|
|
||||||
* Refactor legacy quantum keycodes in default-ish keymaps ([#17037](https://github.com/qmk/qmk_firmware/pull/17037))
|
|
||||||
* Refactor legacy quantum keycodes in default-ish keymaps ([#17150](https://github.com/qmk/qmk_firmware/pull/17150))
|
|
||||||
|
|
||||||
Keyboard fixes:
|
|
||||||
* gboards/gergoplex: move `COMBO_ENABLE` to keymap level ([#16667](https://github.com/qmk/qmk_firmware/pull/16667))
|
|
||||||
* usb-usb converter: community layout support ([#16773](https://github.com/qmk/qmk_firmware/pull/16773))
|
|
||||||
* Fix build of `keyhive/uno`. ([#16891](https://github.com/qmk/qmk_firmware/pull/16891))
|
|
||||||
* Fix uno ([#16892](https://github.com/qmk/qmk_firmware/pull/16892))
|
|
||||||
* converter/usb_usb: remove surplus commas ([#17024](https://github.com/qmk/qmk_firmware/pull/17024))
|
|
||||||
* Various fixes for g_led_config lint warnings ([#17104](https://github.com/qmk/qmk_firmware/pull/17104))
|
|
||||||
|
|
||||||
Others:
|
|
||||||
* Add warning for CTPC/CONVERT_TO_PROTON_C. ([#16782](https://github.com/qmk/qmk_firmware/pull/16782))
|
|
||||||
* Add bluepill/blackpill development board presets ([#16806](https://github.com/qmk/qmk_firmware/pull/16806))
|
|
||||||
* Recommend pillow as part of manual MSYS install ([#17133](https://github.com/qmk/qmk_firmware/pull/17133))
|
|
||||||
|
|
||||||
Bugs:
|
|
||||||
* Fix one-shot locked modifiers ([#16114](https://github.com/qmk/qmk_firmware/pull/16114))
|
|
||||||
* Fix missing definition for non-encoder case. ([#16593](https://github.com/qmk/qmk_firmware/pull/16593))
|
|
||||||
* Fixup builds. ([#16596](https://github.com/qmk/qmk_firmware/pull/16596))
|
|
||||||
* Missed some erroneous prints. ([#16597](https://github.com/qmk/qmk_firmware/pull/16597))
|
|
||||||
* Workaround for pin_def errors on KINETIS based builds ([#16614](https://github.com/qmk/qmk_firmware/pull/16614))
|
|
||||||
* Fix flipped logic bug with One Shot `OS_ON` / `OS_OFF` keys ([#16617](https://github.com/qmk/qmk_firmware/pull/16617))
|
|
||||||
* Redo workaround for pin_def errors on KINETIS ([#16620](https://github.com/qmk/qmk_firmware/pull/16620))
|
|
||||||
* Fix oneshot toggle logic ([#16630](https://github.com/qmk/qmk_firmware/pull/16630))
|
|
||||||
* Mousekeys fix ([#16640](https://github.com/qmk/qmk_firmware/pull/16640))
|
|
||||||
* Ignore transport defaults if SPLIT_KEYBOARD is unset ([#16706](https://github.com/qmk/qmk_firmware/pull/16706))
|
|
||||||
* Fixes #16705 : digital rain follows val ([#16716](https://github.com/qmk/qmk_firmware/pull/16716))
|
|
||||||
* Fix AVR backlight breathing: low brightness limit & exceeding breathing table max index ([#16770](https://github.com/qmk/qmk_firmware/pull/16770))
|
|
||||||
* Fixed usb read loops not reading until timeout ([#16827](https://github.com/qmk/qmk_firmware/pull/16827))
|
|
||||||
* [QP] Check BPP capabilities before loading the palette ([#16863](https://github.com/qmk/qmk_firmware/pull/16863))
|
|
||||||
* Fix #16859. ([#16865](https://github.com/qmk/qmk_firmware/pull/16865))
|
|
||||||
* Preinstall python dependencies before executing `qmk`. ([#16874](https://github.com/qmk/qmk_firmware/pull/16874))
|
|
||||||
* Fixup AVR builds. ([#16875](https://github.com/qmk/qmk_firmware/pull/16875))
|
|
||||||
* Fix kinetic mouse mode ([#16951](https://github.com/qmk/qmk_firmware/pull/16951))
|
|
||||||
* Enhancement and fixes of "Secure" feature ([#16958](https://github.com/qmk/qmk_firmware/pull/16958))
|
|
||||||
* Check for ongoing transfers on the OUT endpoint ([#16974](https://github.com/qmk/qmk_firmware/pull/16974))
|
|
||||||
* MSYS2 install: add some Python dependencies through Pacman ([#17025](https://github.com/qmk/qmk_firmware/pull/17025))
|
|
||||||
* Revert "Fix kinetic mouse mode (#16951)" ([#17095](https://github.com/qmk/qmk_firmware/pull/17095))
|
|
||||||
* Workaround for recent -Werror=array-bounds AVR issues ([#17136](https://github.com/qmk/qmk_firmware/pull/17136))
|
|
||||||
* Bug fix: Continue Caps Word when AltGr (right Alt) is held. ([#17156](https://github.com/qmk/qmk_firmware/pull/17156))
|
|
||||||
|
|
@ -75,7 +75,6 @@
|
||||||
|
|
||||||
* Software Features
|
* Software Features
|
||||||
* [Auto Shift](feature_auto_shift.md)
|
* [Auto Shift](feature_auto_shift.md)
|
||||||
* [Caps Word](feature_caps_word.md)
|
|
||||||
* [Combos](feature_combo.md)
|
* [Combos](feature_combo.md)
|
||||||
* [Debounce API](feature_debounce_type.md)
|
* [Debounce API](feature_debounce_type.md)
|
||||||
* [Key Lock](feature_key_lock.md)
|
* [Key Lock](feature_key_lock.md)
|
||||||
|
|
@ -84,7 +83,6 @@
|
||||||
* [One Shot Keys](one_shot_keys.md)
|
* [One Shot Keys](one_shot_keys.md)
|
||||||
* [Pointing Device](feature_pointing_device.md)
|
* [Pointing Device](feature_pointing_device.md)
|
||||||
* [Raw HID](feature_rawhid.md)
|
* [Raw HID](feature_rawhid.md)
|
||||||
* [Secure](feature_secure.md)
|
|
||||||
* [Sequencer](feature_sequencer.md)
|
* [Sequencer](feature_sequencer.md)
|
||||||
* [Swap Hands](feature_swap_hands.md)
|
* [Swap Hands](feature_swap_hands.md)
|
||||||
* [Tap Dance](feature_tap_dance.md)
|
* [Tap Dance](feature_tap_dance.md)
|
||||||
|
|
@ -96,8 +94,7 @@
|
||||||
|
|
||||||
* Hardware Features
|
* Hardware Features
|
||||||
* Displays
|
* Displays
|
||||||
* [Quantum Painter](quantum_painter.md)
|
* [HD44780 LCD Controller](feature_hd44780.md)
|
||||||
* [HD44780 LCD Driver](feature_hd44780.md)
|
|
||||||
* [ST7565 LCD Driver](feature_st7565.md)
|
* [ST7565 LCD Driver](feature_st7565.md)
|
||||||
* [OLED Driver](feature_oled_driver.md)
|
* [OLED Driver](feature_oled_driver.md)
|
||||||
* Lighting
|
* Lighting
|
||||||
|
|
@ -134,7 +131,7 @@
|
||||||
* Breaking Changes
|
* Breaking Changes
|
||||||
* [Overview](breaking_changes.md)
|
* [Overview](breaking_changes.md)
|
||||||
* [My Pull Request Was Flagged](breaking_changes_instructions.md)
|
* [My Pull Request Was Flagged](breaking_changes_instructions.md)
|
||||||
* [Most Recent ChangeLog](ChangeLog/20220528.md "QMK v0.17.0 - 2022 May 28")
|
* [Most Recent ChangeLog](ChangeLog/20220226.md "QMK v0.16.0 - 2022 Feb 26")
|
||||||
* [Past Breaking Changes](breaking_changes_history.md)
|
* [Past Breaking Changes](breaking_changes_history.md)
|
||||||
|
|
||||||
* C Development
|
* C Development
|
||||||
|
|
@ -150,7 +147,7 @@
|
||||||
* [EEPROM Driver](eeprom_driver.md)
|
* [EEPROM Driver](eeprom_driver.md)
|
||||||
* ['serial' Driver](serial_driver.md)
|
* ['serial' Driver](serial_driver.md)
|
||||||
* [UART Driver](uart_driver.md)
|
* [UART Driver](uart_driver.md)
|
||||||
* [GPIO Controls](gpio_control.md)
|
* [GPIO Controls](internals_gpio_control.md)
|
||||||
* [Keyboard Guidelines](hardware_keyboard_guidelines.md)
|
* [Keyboard Guidelines](hardware_keyboard_guidelines.md)
|
||||||
|
|
||||||
* Python Development
|
* Python Development
|
||||||
|
|
@ -166,7 +163,6 @@
|
||||||
* Arm/ChibiOS
|
* Arm/ChibiOS
|
||||||
* [Selecting an MCU](platformdev_selecting_arm_mcu.md)
|
* [Selecting an MCU](platformdev_selecting_arm_mcu.md)
|
||||||
* [Early initialization](platformdev_chibios_earlyinit.md)
|
* [Early initialization](platformdev_chibios_earlyinit.md)
|
||||||
* [WeAct Blackpill F411](platformdev_blackpill_f411.md)
|
|
||||||
|
|
||||||
* QMK Reference
|
* QMK Reference
|
||||||
* [Contributing to QMK](contributing.md)
|
* [Contributing to QMK](contributing.md)
|
||||||
|
|
@ -187,10 +183,10 @@
|
||||||
* [Understanding QMK](understanding_qmk.md)
|
* [Understanding QMK](understanding_qmk.md)
|
||||||
|
|
||||||
* QMK Internals (In Progress)
|
* QMK Internals (In Progress)
|
||||||
* [Defines](internals/defines.md)
|
* [Defines](internals_defines.md)
|
||||||
* [Input Callback Reg](internals/input_callback_reg.md)
|
* [Input Callback Reg](internals_input_callback_reg.md)
|
||||||
* [Midi Device](internals/midi_device.md)
|
* [Midi Device](internals_midi_device.md)
|
||||||
* [Midi Device Setup Process](internals/midi_device_setup_process.md)
|
* [Midi Device Setup Process](internals_midi_device_setup_process.md)
|
||||||
* [Midi Util](internals/midi_util.md)
|
* [Midi Util](internals_midi_util.md)
|
||||||
* [Send Functions](internals/send_functions.md)
|
* [Send Functions](internals_send_functions.md)
|
||||||
* [Sysex Tools](internals/sysex_tools.md)
|
* [Sysex Tools](internals_sysex_tools.md)
|
||||||
|
|
|
||||||
|
|
@ -113,17 +113,15 @@ Additionally, in the board config, you'll want to make changes to enable the DAC
|
||||||
|
|
||||||
### DAC Config
|
### DAC Config
|
||||||
|
|
||||||
| Define | Defaults | Description |
|
| Define | Defaults | Description --------------------------------------------------------------------------------------------- |
|
||||||
| -------------------------------- | -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
||||||
| `AUDIO_DAC_SAMPLE_MAX` | `4095U` | Highest value allowed. Lower value means lower volume. And 4095U is the upper limit, since this is limited to a 12 bit value. Only effects non-pregenerated samples. |
|
| `AUDIO_DAC_SAMPLE_MAX` | `4095U` | Highest value allowed. Lower value means lower volume. And 4095U is the upper limit, since this is limited to a 12 bit value. Only effects non-pregenerated samples. |
|
||||||
| `AUDIO_DAC_OFF_VALUE` | `AUDIO_DAC_SAMPLE_MAX / 2` | The value of the DAC when notplaying anything. Some setups may require a high (`AUDIO_DAC_SAMPLE_MAX`) or low (`0`) value here. |
|
| `AUDIO_DAC_OFF_VALUE` | `AUDIO_DAC_SAMPLE_MAX / 2` | The value of the DAC when notplaying anything. Some setups may require a high (`AUDIO_DAC_SAMPLE_MAX`) or low (`0`) value here. |
|
||||||
| `AUDIO_MAX_SIMULTANEOUS_TONES` | __see next table__ | The number of tones that can be played simultaneously. A value that is too high may freeze the controller or glitch out when too many tones are being played. |
|
| `AUDIO_MAX_SIMULTANEOUS_TONES` | __see next table__ | The number of tones that can be played simultaneously. A value that is too high may freeze the controller or glitch out when too many tones are being played. |
|
||||||
| `AUDIO_DAC_SAMPLE_RATE` | __see next table__ | Effective bit rate of the DAC (in hertz), higher limits simultaneous tones, and lower sacrifices quality. |
|
| `AUDIO_DAC_SAMPLE_RATE` | __see next table__ | Effective bit rate of the DAC (in hertz), higher limits simultaneous tones, and lower sacrifices quality. |
|
||||||
|
|
||||||
There are a number of predefined quality settings that you can use, with "sane minimum" being the default. You can use custom values by simply defining the sample rate and number of simultaneous tones, instead of using one of the listed presets.
|
There are a number of predefined quality settings that you can use, with "sane minimum" being the default. You can use custom values by simply defining the sample rate and number of simultaneous tones, instead of using one of the listed presets.
|
||||||
|
|
||||||
| Define | Sample Rate | Simultaneous tones |
|
| Define | Sample Rate | Simultaneous tones |
|
||||||
| --------------------------------- | ----------- | ------------------- |
|
|
||||||
| `AUDIO_DAC_QUALITY_VERY_LOW` | `11025U` | `8` |
|
| `AUDIO_DAC_QUALITY_VERY_LOW` | `11025U` | `8` |
|
||||||
| `AUDIO_DAC_QUALITY_LOW` | `22040U` | `4` |
|
| `AUDIO_DAC_QUALITY_LOW` | `22040U` | `4` |
|
||||||
| `AUDIO_DAC_QUALITY_HIGH` | `44100U` | `2` |
|
| `AUDIO_DAC_QUALITY_HIGH` | `44100U` | `2` |
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@ The breaking change period is when we will merge PR's that change QMK in dangero
|
||||||
|
|
||||||
## What has been included in past Breaking Changes?
|
## What has been included in past Breaking Changes?
|
||||||
|
|
||||||
* [2022 May 28](ChangeLog/20220528.md)
|
|
||||||
* [2022 Feb 26](ChangeLog/20220226.md)
|
* [2022 Feb 26](ChangeLog/20220226.md)
|
||||||
* [2021 Nov 27](ChangeLog/20211127.md)
|
* [2021 Nov 27](ChangeLog/20211127.md)
|
||||||
* [2021 Aug 28](ChangeLog/20210828.md)
|
* [2021 Aug 28](ChangeLog/20210828.md)
|
||||||
|
|
@ -22,17 +21,17 @@ The breaking change period is when we will merge PR's that change QMK in dangero
|
||||||
|
|
||||||
## When is the next Breaking Change?
|
## When is the next Breaking Change?
|
||||||
|
|
||||||
The next Breaking Change is scheduled for August 27, 2022.
|
The next Breaking Change is scheduled for May 28, 2022.
|
||||||
|
|
||||||
### Important Dates
|
### Important Dates
|
||||||
|
|
||||||
* [x] 2022 May 28 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions.
|
* [x] 2022 Feb 26 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions.
|
||||||
* [ ] 2022 Jul 31 - `develop` closed to new PR's.
|
* [ ] 2022 Apr 31 - `develop` closed to new PR's.
|
||||||
* [ ] 2022 Jul 31 - Call for testers.
|
* [ ] 2022 Apr 31 - Call for testers.
|
||||||
* [ ] 2022 Aug 13 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes
|
* [ ] 2022 May 14 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes
|
||||||
* [ ] 2022 Aug 25 - `master` is locked, no PR's merged.
|
* [ ] 2022 May 26 - `master` is locked, no PR's merged.
|
||||||
* [ ] 2022 Aug 27 - Merge `develop` to `master`.
|
* [ ] 2022 May 28 - Merge `develop` to `master`.
|
||||||
* [ ] 2022 Aug 27 - `master` is unlocked. PR's can be merged again.
|
* [ ] 2022 May 28 - `master` is unlocked. PR's can be merged again.
|
||||||
|
|
||||||
## What changes will be included?
|
## What changes will be included?
|
||||||
|
|
||||||
|
|
@ -43,15 +42,32 @@ If you want your breaking change to be included in this round you need to create
|
||||||
Criteria for acceptance:
|
Criteria for acceptance:
|
||||||
|
|
||||||
* The PR is complete and ready to merge
|
* The PR is complete and ready to merge
|
||||||
* The PR has a ChangeLog file describing the changes under `<qmk_firmware>/docs/Changelog/20220827`.
|
* The PR has a ChangeLog file describing the changes under `<qmk_firmware>/docs/Changelog/20220226`.
|
||||||
* This should be in Markdown format, with a name in the format `PR12345.md`, substituting the digits for your PR's ID.
|
* This should be in Markdown format, with a name in the format `PR12345.md`, substituting the digits for your PR's ID.
|
||||||
* One strong recommendation that the ChangeLog document matches the PR description on GitHub, so as to ensure traceability.
|
* One strong recommendation that the ChangeLog document matches the PR description on GitHub, so as to ensure traceability.
|
||||||
|
|
||||||
## Checklists
|
# Checklists
|
||||||
|
|
||||||
This section documents various processes we use when running the Breaking Changes process.
|
This section documents various processes we use when running the Breaking Changes process.
|
||||||
|
|
||||||
### 4 Weeks Before Merge
|
## Creating the `develop` branch
|
||||||
|
|
||||||
|
This happens immediately after the previous `develop` branch is merged.
|
||||||
|
|
||||||
|
* `qmk_firmware` git commands
|
||||||
|
* [ ] `git checkout master`
|
||||||
|
* [ ] `git pull --ff-only`
|
||||||
|
* [ ] `git checkout -b develop`
|
||||||
|
* [ ] Edit `readme.md`
|
||||||
|
* [ ] Add a big notice at the top that this is a testing branch.
|
||||||
|
* [ ] Include a link to this document
|
||||||
|
* [ ] `git commit -m 'Branch point for <DATE> Breaking Change'`
|
||||||
|
* [ ] `git tag breakpoint_<YYYY>_<MM>_<DD>`
|
||||||
|
* [ ] `git tag <next_version>` # Prevent the breakpoint tag from confusing version incrementing
|
||||||
|
* [ ] `git push upstream develop`
|
||||||
|
* [ ] `git push --tags`
|
||||||
|
|
||||||
|
## 4 Weeks Before Merge
|
||||||
|
|
||||||
* `develop` is now closed to new PR's, only fixes for current PR's may be merged
|
* `develop` is now closed to new PR's, only fixes for current PR's may be merged
|
||||||
* Post call for testers
|
* Post call for testers
|
||||||
|
|
@ -59,7 +75,7 @@ This section documents various processes we use when running the Breaking Change
|
||||||
* [ ] GitHub PR
|
* [ ] GitHub PR
|
||||||
* [ ] https://reddit.com/r/olkb
|
* [ ] https://reddit.com/r/olkb
|
||||||
|
|
||||||
### 2 Weeks Before Merge
|
## 2 Weeks Before Merge
|
||||||
|
|
||||||
* `develop` is now closed to existing PR merges, only bugfixes for previous merges may be included
|
* `develop` is now closed to existing PR merges, only bugfixes for previous merges may be included
|
||||||
* Post call for testers
|
* Post call for testers
|
||||||
|
|
@ -67,21 +83,21 @@ This section documents various processes we use when running the Breaking Change
|
||||||
* [ ] GitHub PR
|
* [ ] GitHub PR
|
||||||
* [ ] https://reddit.com/r/olkb
|
* [ ] https://reddit.com/r/olkb
|
||||||
|
|
||||||
### 1 Week Before Merge
|
## 1 Week Before Merge
|
||||||
|
|
||||||
* Announce that master will be closed from <2 Days Before> to <Day of Merge>
|
* Announce that master will be closed from <2 Days Before> to <Day of Merge>
|
||||||
* [ ] Discord
|
* [ ] Discord
|
||||||
* [ ] GitHub PR
|
* [ ] GitHub PR
|
||||||
* [ ] https://reddit.com/r/olkb
|
* [ ] https://reddit.com/r/olkb
|
||||||
|
|
||||||
### 2 Days Before Merge
|
## 2 Days Before Merge
|
||||||
|
|
||||||
* Announce that master is closed for 2 days
|
* Announce that master is closed for 2 days
|
||||||
* [ ] Discord
|
* [ ] Discord
|
||||||
* [ ] GitHub PR
|
* [ ] GitHub PR
|
||||||
* [ ] https://reddit.com/r/olkb
|
* [ ] https://reddit.com/r/olkb
|
||||||
|
|
||||||
### Day Of Merge
|
## Day Of Merge
|
||||||
|
|
||||||
* `qmk_firmware` git commands
|
* `qmk_firmware` git commands
|
||||||
* [ ] `git checkout develop`
|
* [ ] `git checkout develop`
|
||||||
|
|
@ -98,39 +114,8 @@ This section documents various processes we use when running the Breaking Change
|
||||||
* [ ] `git checkout master`
|
* [ ] `git checkout master`
|
||||||
* [ ] `git pull --ff-only`
|
* [ ] `git pull --ff-only`
|
||||||
* [ ] `git merge --no-ff develop`
|
* [ ] `git merge --no-ff develop`
|
||||||
* [ ] `git tag <next_version>` # Prevent the breakpoint tag from confusing version incrementing
|
|
||||||
* [ ] `git push upstream <next_version>`
|
|
||||||
* [ ] `git push upstream master`
|
* [ ] `git push upstream master`
|
||||||
|
|
||||||
## Post-merge operations
|
## Post-merge operations
|
||||||
|
|
||||||
### Updating the `develop` branch
|
|
||||||
|
|
||||||
This happens immediately after the previous `develop` branch is merged to `master`.
|
|
||||||
|
|
||||||
* `qmk_firmware` git commands
|
|
||||||
* [ ] `git checkout master`
|
|
||||||
* [ ] `git pull --ff-only`
|
|
||||||
* [ ] `git checkout develop`
|
|
||||||
* [ ] `git pull --ff-only`
|
|
||||||
* [ ] `git merge --no-ff master`
|
|
||||||
* [ ] Edit `readme.md`
|
|
||||||
* [ ] Add a big notice at the top that this is a testing branch.
|
|
||||||
* [ ] Include a link to this document
|
|
||||||
* [ ] `git commit -m 'Branch point for <DATE> Breaking Change'`
|
|
||||||
* [ ] `git tag breakpoint_<YYYY>_<MM>_<DD>`
|
|
||||||
* [ ] `git push upstream breakpoint_<YYYY>_<MM>_<DD>`
|
|
||||||
|
|
||||||
* All submodules under `lib` now need to be checked against their QMK-based forks:
|
|
||||||
* [ ] `git submodule foreach git log -n1`
|
|
||||||
* [ ] Validate each submodule SHA1 matches the qmk fork, e.g. for ChibiOS:
|
|
||||||
* Go to [qmk/ChibiOS](https://github.com/qmk/ChibiOS)
|
|
||||||
* Compare the commit hash in the above output to the commit hash in the repository
|
|
||||||
* If there's a mismatch:
|
|
||||||
* [ ] `cd lib/chibios`
|
|
||||||
* [ ] `git fetch --all`
|
|
||||||
* [ ] `git checkout master`
|
|
||||||
* [ ] `git reset --hard <commit hash>`
|
|
||||||
* [ ] `git push origin master --force-with-lease`
|
|
||||||
|
|
||||||
* (Optional) [update ChibiOS + ChibiOS-Contrib on `develop`](chibios_upgrade_instructions.md)
|
* (Optional) [update ChibiOS + ChibiOS-Contrib on `develop`](chibios_upgrade_instructions.md)
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@
|
||||||
|
|
||||||
This page links to all previous changelogs from the QMK Breaking Changes process.
|
This page links to all previous changelogs from the QMK Breaking Changes process.
|
||||||
|
|
||||||
* [2022 May 28](ChangeLog/20220528.md) - version 0.17.0
|
|
||||||
* [2022 Feb 26](ChangeLog/20220226.md) - version 0.16.0
|
* [2022 Feb 26](ChangeLog/20220226.md) - version 0.16.0
|
||||||
* [2021 Nov 27](ChangeLog/20211127.md) - version 0.15.0
|
* [2021 Nov 27](ChangeLog/20211127.md) - version 0.15.0
|
||||||
* [2021 Aug 28](ChangeLog/20210828.md) - version 0.14.0
|
* [2021 Aug 28](ChangeLog/20210828.md) - version 0.14.0
|
||||||
|
|
|
||||||
|
|
@ -335,23 +335,6 @@ This command cleans up the `.build` folder. If `--all` is passed, any .hex or .b
|
||||||
qmk clean [-a]
|
qmk clean [-a]
|
||||||
```
|
```
|
||||||
|
|
||||||
## `qmk via2json`
|
|
||||||
|
|
||||||
This command an generate a keymap.json from a VIA keymap backup. Both the layers and the macros are converted, enabling users to easily move away from a VIA-enabled firmware without writing any code or reimplementing their keymaps in QMK Configurator.
|
|
||||||
|
|
||||||
**Usage**:
|
|
||||||
|
|
||||||
```
|
|
||||||
qmk via2json -kb KEYBOARD [-l LAYOUT] [-km KEYMAP] [-o OUTPUT] filename
|
|
||||||
```
|
|
||||||
|
|
||||||
**Example:**
|
|
||||||
|
|
||||||
```
|
|
||||||
$ qmk via2json -kb ai03/polaris -o polaris_keymap.json polaris_via_backup.json
|
|
||||||
Ψ Wrote keymap to /home/you/qmk_firmware/polaris_keymap.json
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# Developer Commands
|
# Developer Commands
|
||||||
|
|
@ -515,15 +498,3 @@ Run single test:
|
||||||
|
|
||||||
qmk pytest -t qmk.tests.test_cli_commands.test_c2json
|
qmk pytest -t qmk.tests.test_cli_commands.test_c2json
|
||||||
qmk pytest -t qmk.tests.test_qmk_path
|
qmk pytest -t qmk.tests.test_qmk_path
|
||||||
|
|
||||||
## `qmk painter-convert-graphics`
|
|
||||||
|
|
||||||
This command converts images to a format usable by QMK, i.e. the QGF File Format. See the [Quantum Painter](quantum_painter.md?id=quantum-painter-cli) documentation for more information on this command.
|
|
||||||
|
|
||||||
## `qmk painter-make-font-image`
|
|
||||||
|
|
||||||
This command converts a TTF font to an intermediate format for editing, before converting to the QFF File Format. See the [Quantum Painter](quantum_painter.md?id=quantum-painter-cli) documentation for more information on this command.
|
|
||||||
|
|
||||||
## `qmk painter-convert-font-image`
|
|
||||||
|
|
||||||
This command converts an intermediate font image to the QFF File Format. See the [Quantum Painter](quantum_painter.md?id=quantum-painter-cli) documentation for more information on this command.
|
|
||||||
|
|
|
||||||
|
|
@ -14,10 +14,6 @@ Add this to the end of your `.profile` or `.bashrc`:
|
||||||
|
|
||||||
If you put `qmk_firmware` into another location you will need to adjust this path.
|
If you put `qmk_firmware` into another location you will need to adjust this path.
|
||||||
|
|
||||||
Zsh users will need to load `bashcompinit`. The following can be added to `~/.zshrc` file:
|
|
||||||
|
|
||||||
autoload -Uz bashcompinit && bashcompinit
|
|
||||||
|
|
||||||
### System Wide Symlink
|
### System Wide Symlink
|
||||||
|
|
||||||
If you want the tab completion available to all users of the system you can add a symlink to the `qmk_tab_complete.sh` script:
|
If you want the tab completion available to all users of the system you can add a symlink to the `qmk_tab_complete.sh` script:
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,6 @@
|
||||||
|
|
||||||
QMK runs on any USB-capable AVR or ARM microcontroller with enough flash space - generally 32kB+ for AVR, and 64kB+ for ARM. With significant disabling of features, QMK may *just* squeeze into 16kB AVR MCUs.
|
QMK runs on any USB-capable AVR or ARM microcontroller with enough flash space - generally 32kB+ for AVR, and 64kB+ for ARM. With significant disabling of features, QMK may *just* squeeze into 16kB AVR MCUs.
|
||||||
|
|
||||||
Features within QMK may or may not be compatible with every microcontroller.
|
|
||||||
|
|
||||||
## Atmel AVR
|
## Atmel AVR
|
||||||
|
|
||||||
The following use [LUFA](https://www.fourwalledcubicle.com/LUFA.php) as the USB stack:
|
The following use [LUFA](https://www.fourwalledcubicle.com/LUFA.php) as the USB stack:
|
||||||
|
|
@ -53,7 +51,6 @@ You can also use any ARM chip with USB that [ChibiOS](https://www.chibios.org) s
|
||||||
### WestBerryTech (WB32)
|
### WestBerryTech (WB32)
|
||||||
|
|
||||||
* [WB32F3G71xx](http://www.westberrytech.com)
|
* [WB32F3G71xx](http://www.westberrytech.com)
|
||||||
* [WB32FQ95xx](http://www.westberrytech.com)
|
|
||||||
|
|
||||||
### NXP (Kinetis)
|
### NXP (Kinetis)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -131,8 +131,6 @@ If you define these options you will disable the associated feature, which can s
|
||||||
|
|
||||||
If you define these options you will enable the associated feature, which may increase your code size.
|
If you define these options you will enable the associated feature, which may increase your code size.
|
||||||
|
|
||||||
* `#define ENABLE_COMPILE_KEYCODE`
|
|
||||||
* Enables the `QK_MAKE` keycode
|
|
||||||
* `#define FORCE_NKRO`
|
* `#define FORCE_NKRO`
|
||||||
* NKRO by default requires to be turned on, this forces it on during keyboard startup regardless of EEPROM setting. NKRO can still be turned off but will be turned on again if the keyboard reboots.
|
* NKRO by default requires to be turned on, this forces it on during keyboard startup regardless of EEPROM setting. NKRO can still be turned off but will be turned on again if the keyboard reboots.
|
||||||
* `#define STRICT_LAYER_RELEASE`
|
* `#define STRICT_LAYER_RELEASE`
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ In other cases you should group like options together in an `object`. This is pa
|
||||||
In most cases you can add a simple mapping. These are maintained as JSON files in `data/mappings/info_config.json` and `data/mappings/info_rules.json`, and control mapping for `config.h` and `rules.mk`, respectively. Each mapping is keyed by the `config.h` or `rules.mk` variable, and the value is a hash with the following keys:
|
In most cases you can add a simple mapping. These are maintained as JSON files in `data/mappings/info_config.json` and `data/mappings/info_rules.json`, and control mapping for `config.h` and `rules.mk`, respectively. Each mapping is keyed by the `config.h` or `rules.mk` variable, and the value is a hash with the following keys:
|
||||||
|
|
||||||
* `info_key`: (required) The location within `info.json` for this value. See below.
|
* `info_key`: (required) The location within `info.json` for this value. See below.
|
||||||
* `value_type`: (optional) Default `raw`. The format for this variable's value. See below.
|
* `value_type`: (optional) Default `str`. The format for this variable's value. See below.
|
||||||
* `to_json`: (optional) Default `true`. Set to `false` to exclude this mapping from info.json
|
* `to_json`: (optional) Default `true`. Set to `false` to exclude this mapping from info.json
|
||||||
* `to_c`: (optional) Default `true`. Set to `false` to exclude this mapping from config.h
|
* `to_c`: (optional) Default `true`. Set to `false` to exclude this mapping from config.h
|
||||||
* `warn_duplicate`: (optional) Default `true`. Set to `false` to turn off warning when a value exists in both places
|
* `warn_duplicate`: (optional) Default `true`. Set to `false` to turn off warning when a value exists in both places
|
||||||
|
|
@ -57,7 +57,7 @@ Under the hood we use [Dotty Dict](https://dotty-dict.readthedocs.io/en/latest/)
|
||||||
|
|
||||||
#### Value Types
|
#### Value Types
|
||||||
|
|
||||||
By default we treat all values as unquoted "raw" data. If your value is more complex you can use one of these types to intelligently parse the data:
|
By default we treat all values as simple strings. If your value is more complex you can use one of these types to intelligently parse the data:
|
||||||
|
|
||||||
* `array`: A comma separated array of strings
|
* `array`: A comma separated array of strings
|
||||||
* `array.int`: A comma separated array of integers
|
* `array.int`: A comma separated array of integers
|
||||||
|
|
@ -65,7 +65,6 @@ By default we treat all values as unquoted "raw" data. If your value is more com
|
||||||
* `hex`: A number formatted as hex
|
* `hex`: A number formatted as hex
|
||||||
* `list`: A space separate array of strings
|
* `list`: A space separate array of strings
|
||||||
* `mapping`: A hash of key/value pairs
|
* `mapping`: A hash of key/value pairs
|
||||||
* `str`: A quoted string literal
|
|
||||||
|
|
||||||
### Add code to extract it
|
### Add code to extract it
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@
|
||||||
This page covers questions people often have about keymaps. If you haven't you should read [Keymap Overview](keymap.md) first.
|
This page covers questions people often have about keymaps. If you haven't you should read [Keymap Overview](keymap.md) first.
|
||||||
|
|
||||||
## What Keycodes Can I Use?
|
## What Keycodes Can I Use?
|
||||||
|
|
||||||
See [Keycodes](keycodes.md) for an index of keycodes available to you. These link to more extensive documentation when available.
|
See [Keycodes](keycodes.md) for an index of keycodes available to you. These link to more extensive documentation when available.
|
||||||
|
|
||||||
Keycodes are actually defined in [quantum/keycode.h](https://github.com/qmk/qmk_firmware/blob/master/quantum/keycode.h).
|
Keycodes are actually defined in [quantum/keycode.h](https://github.com/qmk/qmk_firmware/blob/master/quantum/keycode.h).
|
||||||
|
|
@ -26,30 +25,25 @@ Sometimes, for readability's sake, it's useful to define custom names for some k
|
||||||
|
|
||||||
This will allow you to use `FN_CAPS` and `ALT_TAB` in your keymap, keeping it more readable.
|
This will allow you to use `FN_CAPS` and `ALT_TAB` in your keymap, keeping it more readable.
|
||||||
|
|
||||||
## My Keymap Doesn't Update When I Flash It
|
|
||||||
|
|
||||||
This is usually due to VIA, and has to do with how it deals with keymaps.
|
|
||||||
|
|
||||||
On first run, the VIA code in the firmware will copy the keymap from flash memory into EEPROM so that it can be rewritten at runtime by the VIA app. From this point QMK will use the keymap stored in EEPROM instead of flash, and so updates to your `keymap.c` will not be reflected.
|
|
||||||
|
|
||||||
The simple fix for this is to clear the EEPROM. You can do this in several ways:
|
|
||||||
|
|
||||||
* Hold the Bootmagic Lite key (usually top left/Escape) while plugging the board in, which will also place the board into bootloader mode; then unplug and replug the board.
|
|
||||||
* Press the `QK_CLEAR_EEPROM`/`EE_CLR` keycode if it is accessible on your keymap.
|
|
||||||
* Place the board into bootloader mode and hit the "Clear EEPROM" button. This may not be available for all bootloaders, and you may need to reflash the board afterwards.
|
|
||||||
|
|
||||||
## Some Of My Keys Are Swapped Or Not Working
|
## Some Of My Keys Are Swapped Or Not Working
|
||||||
|
|
||||||
QMK has a couple of features which allow you to change the behavior of your keyboard on the fly. This includes, but is not limited to, swapping Ctrl/Caps, disabling GUI, swapping Alt/GUI, swapping Backspace/Backslash, disabling all keys, and other behavioral modifications.
|
QMK has two features, Bootmagic and Command, which allow you to change the behavior of your keyboard on the fly. This includes, but is not limited to, swapping Ctrl/Caps, disabling Gui, swapping Alt/Gui, swapping Backspace/Backslash, disabling all keys, and other behavioral modifications.
|
||||||
|
|
||||||
Refer to the EEPROM clearing methods above, which should return those keys to normal operation. If that doesn't work, look here:
|
As a quick fix try holding down `Space`+`Backspace` while you plug in your keyboard. This will reset the stored settings on your keyboard, returning those keys to normal operation. If that doesn't work look here:
|
||||||
|
|
||||||
* [Magic Keycodes](keycodes_magic.md)
|
* [Bootmagic Lite](feature_bootmagic.md)
|
||||||
* [Command](feature_command.md)
|
* [Command](feature_command.md)
|
||||||
|
|
||||||
## The Menu Key Isn't Working
|
## The Menu Key Isn't Working
|
||||||
|
|
||||||
The key found on most modern keyboards that is located between `KC_RGUI` and `KC_RCTL` is actually called `KC_APP`. This is because when the key was invented, there was already a key named "Menu" in the HID specification, so for whatever reason, Microsoft chose to create a new key and call it "Application".
|
The key found on most modern keyboards that is located between `KC_RGUI` and `KC_RCTL` is actually called `KC_APP`. This is because when that key was invented there was already a key named `MENU` in the relevant standards, so MS chose to call that the `APP` key.
|
||||||
|
|
||||||
|
## `KC_SYSTEM_REQUEST` Isn't Working
|
||||||
|
Use keycode for Print Screen (`KC_PRINT_SCREEN`/`KC_PSCR`) instead of `KC_SYSTEM_REQUEST`. Key combination of 'Alt + Print Screen' is recognized as 'System request'.
|
||||||
|
|
||||||
|
See [issue #168](https://github.com/tmk/tmk_keyboard/issues/168) and
|
||||||
|
* https://en.wikipedia.org/wiki/Magic_SysRq_key
|
||||||
|
* https://en.wikipedia.org/wiki/System_request
|
||||||
|
|
||||||
## Power Keys Aren't Working
|
## Power Keys Aren't Working
|
||||||
|
|
||||||
|
|
@ -58,12 +52,10 @@ Somewhat confusingly, there are two "Power" keycodes in QMK: `KC_KB_POWER` in th
|
||||||
The former is only recognized on macOS, while the latter, `KC_SLEP` and `KC_WAKE` are supported by all three major operating systems, so it is recommended to use those instead. Under Windows, these keys take effect immediately, however on macOS they must be held down until a dialog appears.
|
The former is only recognized on macOS, while the latter, `KC_SLEP` and `KC_WAKE` are supported by all three major operating systems, so it is recommended to use those instead. Under Windows, these keys take effect immediately, however on macOS they must be held down until a dialog appears.
|
||||||
|
|
||||||
## One Shot Modifier
|
## One Shot Modifier
|
||||||
|
|
||||||
Solves my personal 'the' problem. I often got 'the' or 'THe' wrongly instead of 'The'. One Shot Shift mitigates this for me.
|
Solves my personal 'the' problem. I often got 'the' or 'THe' wrongly instead of 'The'. One Shot Shift mitigates this for me.
|
||||||
https://github.com/tmk/tmk_keyboard/issues/67
|
https://github.com/tmk/tmk_keyboard/issues/67
|
||||||
|
|
||||||
## Modifier/Layer Stuck
|
## Modifier/Layer Stuck
|
||||||
|
|
||||||
Modifier keys or layers can be stuck unless layer switching is configured properly.
|
Modifier keys or layers can be stuck unless layer switching is configured properly.
|
||||||
For Modifier keys and layer actions you have to place `KC_TRNS` on same position of destination layer to unregister the modifier key or return to previous layer on release event.
|
For Modifier keys and layer actions you have to place `KC_TRNS` on same position of destination layer to unregister the modifier key or return to previous layer on release event.
|
||||||
|
|
||||||
|
|
@ -71,11 +63,12 @@ For Modifier keys and layer actions you have to place `KC_TRNS` on same position
|
||||||
* https://geekhack.org/index.php?topic=57008.msg1492604#msg1492604
|
* https://geekhack.org/index.php?topic=57008.msg1492604#msg1492604
|
||||||
* https://github.com/tmk/tmk_keyboard/issues/248
|
* https://github.com/tmk/tmk_keyboard/issues/248
|
||||||
|
|
||||||
|
|
||||||
## Mechanical Lock Switch Support
|
## Mechanical Lock Switch Support
|
||||||
|
|
||||||
This feature is for *mechanical lock switch* like [this Alps one](https://deskthority.net/wiki/Alps_SKCL_Lock). You can enable it by adding this to your `config.h`:
|
This feature is for *mechanical lock switch* like [this Alps one](https://deskthority.net/wiki/Alps_SKCL_Lock). You can enable it by adding this to your `config.h`:
|
||||||
|
|
||||||
```c
|
```
|
||||||
#define LOCKING_SUPPORT_ENABLE
|
#define LOCKING_SUPPORT_ENABLE
|
||||||
#define LOCKING_RESYNC_ENABLE
|
#define LOCKING_RESYNC_ENABLE
|
||||||
```
|
```
|
||||||
|
|
@ -98,7 +91,6 @@ Even worse, it is not recognized unless the keyboard's VID and PID match that of
|
||||||
See [this issue](https://github.com/qmk/qmk_firmware/issues/2179) for detailed information.
|
See [this issue](https://github.com/qmk/qmk_firmware/issues/2179) for detailed information.
|
||||||
|
|
||||||
## Keys Supported in Mac OSX?
|
## Keys Supported in Mac OSX?
|
||||||
|
|
||||||
You can know which keycodes are supported in OSX from this source code.
|
You can know which keycodes are supported in OSX from this source code.
|
||||||
|
|
||||||
`usb_2_adb_keymap` array maps Keyboard/Keypad Page usages to ADB scancodes(OSX internal keycodes).
|
`usb_2_adb_keymap` array maps Keyboard/Keypad Page usages to ADB scancodes(OSX internal keycodes).
|
||||||
|
|
@ -109,8 +101,8 @@ And `IOHIDConsumer::dispatchConsumerEvent` handles Consumer page usages.
|
||||||
|
|
||||||
https://opensource.apple.com/source/IOHIDFamily/IOHIDFamily-606.1.7/IOHIDFamily/IOHIDConsumer.cpp
|
https://opensource.apple.com/source/IOHIDFamily/IOHIDFamily-606.1.7/IOHIDFamily/IOHIDConsumer.cpp
|
||||||
|
|
||||||
## JIS Keys in Mac OSX
|
|
||||||
|
|
||||||
|
## JIS Keys in Mac OSX
|
||||||
Japanese JIS keyboard specific keys like `無変換(Muhenkan)`, `変換(Henkan)`, `ひらがな(hiragana)` are not recognized on OSX. You can use **Seil** to enable those keys, try following options.
|
Japanese JIS keyboard specific keys like `無変換(Muhenkan)`, `変換(Henkan)`, `ひらがな(hiragana)` are not recognized on OSX. You can use **Seil** to enable those keys, try following options.
|
||||||
|
|
||||||
* Enable NFER Key on PC keyboard
|
* Enable NFER Key on PC keyboard
|
||||||
|
|
@ -119,8 +111,8 @@ Japanese JIS keyboard specific keys like `無変換(Muhenkan)`, `変換(Henkan)`
|
||||||
|
|
||||||
https://pqrs.org/osx/karabiner/seil.html
|
https://pqrs.org/osx/karabiner/seil.html
|
||||||
|
|
||||||
## RN-42 Bluetooth Doesn't Work with Karabiner
|
|
||||||
|
|
||||||
|
## RN-42 Bluetooth Doesn't Work with Karabiner
|
||||||
Karabiner - Keymapping tool on Mac OSX - ignores inputs from RN-42 module by default. You have to enable this option to make Karabiner working with your keyboard.
|
Karabiner - Keymapping tool on Mac OSX - ignores inputs from RN-42 module by default. You have to enable this option to make Karabiner working with your keyboard.
|
||||||
https://github.com/tekezo/Karabiner/issues/403#issuecomment-102559237
|
https://github.com/tekezo/Karabiner/issues/403#issuecomment-102559237
|
||||||
|
|
||||||
|
|
@ -128,24 +120,37 @@ See these for the detail of this problem.
|
||||||
https://github.com/tmk/tmk_keyboard/issues/213
|
https://github.com/tmk/tmk_keyboard/issues/213
|
||||||
https://github.com/tekezo/Karabiner/issues/403
|
https://github.com/tekezo/Karabiner/issues/403
|
||||||
|
|
||||||
|
|
||||||
## Esc and <code>`</code> on a Single Key
|
## Esc and <code>`</code> on a Single Key
|
||||||
|
|
||||||
See the [Grave Escape](feature_grave_esc.md) feature.
|
See the [Grave Escape](feature_grave_esc.md) feature.
|
||||||
|
|
||||||
## Eject on Mac OSX
|
## Eject on Mac OSX
|
||||||
|
|
||||||
`KC_EJCT` keycode works on OSX. https://github.com/tmk/tmk_keyboard/issues/250
|
`KC_EJCT` keycode works on OSX. https://github.com/tmk/tmk_keyboard/issues/250
|
||||||
It seems Windows 10 ignores the code and Linux/Xorg recognizes but has no mapping by default.
|
It seems Windows 10 ignores the code and Linux/Xorg recognizes but has no mapping by default.
|
||||||
|
|
||||||
Not sure what keycode Eject is on genuine Apple keyboard actually. HHKB uses `F20` for Eject key(`Fn+F`) on Mac mode but this is not same as Apple Eject keycode probably.
|
Not sure what keycode Eject is on genuine Apple keyboard actually. HHKB uses `F20` for Eject key(`Fn+f`) on Mac mode but this is not same as Apple Eject keycode probably.
|
||||||
|
|
||||||
## What are "Real" and "Weak" modifiers?
|
|
||||||
|
|
||||||
Real modifiers refer to the state of the real/physical modifier keys, while weak modifiers are the state of "virtual" or temporary modifiers which should not interfere with the internal state of the real modifier keys.
|
## What's `weak_mods` and `real_mods` in `action_util.c`
|
||||||
|
___TO BE IMPROVED___
|
||||||
|
|
||||||
The real and weak modifier states are ORed together when the keyboard report is sent, so if you release a weak modifier while the same real modifier is still held, the report does not change:
|
real_mods is intended to retains state of real/physical modifier key state, while
|
||||||
|
weak_mods retains state of virtual or temporary modifiers which should not affect state real modifier key.
|
||||||
|
|
||||||
1. **Hold down physical Left Shift:** Real mods now contains Left Shift, final state is Left Shift
|
Let's say you hold down physical left shift key and type ACTION_MODS_KEY(LSHIFT, KC_A),
|
||||||
2. **Add weak Left Shift:** Weak mods now contains Left Shift, final state is Left Shift
|
|
||||||
3. **Remove weak Left Shift:** Weak mods now contains nothing, final state is Left Shift
|
with weak_mods,
|
||||||
4. **Release physical Left Shift:** Real mods now contains nothing, final state is nothing
|
* (1) hold down left shift: real_mods |= MOD_BIT(LSHIFT)
|
||||||
|
* (2) press ACTION_MODS_KEY(LSHIFT, KC_A): weak_mods |= MOD_BIT(LSHIFT)
|
||||||
|
* (3) release ACTION_MODS_KEY(LSHIFT, KC_A): weak_mods &= ~MOD_BIT(LSHIFT)
|
||||||
|
real_mods still keeps modifier state.
|
||||||
|
|
||||||
|
without weak mods,
|
||||||
|
* (1) hold down left shift: real_mods |= MOD_BIT(LSHIFT)
|
||||||
|
* (2) press ACTION_MODS_KEY(LSHIFT, KC_A): real_mods |= MOD_BIT(LSHIFT)
|
||||||
|
* (3) release ACTION_MODS_KEY(LSHIFT, KC_A): real_mods &= ~MOD_BIT(LSHIFT)
|
||||||
|
here real_mods lost state for 'physical left shift'.
|
||||||
|
|
||||||
|
weak_mods is ORed with real_mods when keyboard report is sent.
|
||||||
|
https://github.com/tmk/tmk_core/blob/master/common/action_util.c#L57
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ In practice, this means that you can check whether a given modifier is active wi
|
||||||
|
|
||||||
To check that *only* a specific set of mods is active at a time, AND the modifier state and your desired mod mask as explained above and compare the result to the mod mask itself: `get_mods() & <mod mask> == <mod mask>`.
|
To check that *only* a specific set of mods is active at a time, AND the modifier state and your desired mod mask as explained above and compare the result to the mod mask itself: `get_mods() & <mod mask> == <mod mask>`.
|
||||||
|
|
||||||
For example, let's say you want to trigger a piece of custom code if one-shot left control and one-shot left shift are on but every other one-shot mods are off. To do so, you can compose the desired mod mask by combining the mod bits for left control and shift with `(MOD_BIT(KC_LCTL) | MOD_BIT(KC_LSFT))` and then plug it in: `get_oneshot_mods() & (MOD_BIT(KC_LCTL) | MOD_BIT(KC_LSFT)) == (MOD_BIT(KC_LCTL) | MOD_BIT(KC_LSFT))`. Using `MOD_MASK_CS` instead for the mod bitmask would have forced you to press four modifier keys (both versions of control and shift) to fulfill the condition.
|
For example, let's say you want to trigger a piece of custom code if one-shot left control and one-shot left shift are on but every other one-shot mods are off. To do so, you can compose the desired mod mask by combining the mod bits for left control and shift with `(MOD_BIT(KC_LCTL) | MOD_BIT(KC_LSFT))` and then plug it in: `get_oneshot_mods & (MOD_BIT(KC_LCTL) | MOD_BIT(KC_LSFT)) == (MOD_BIT(KC_LCTL) | MOD_BIT(KC_LSFT))`. Using `MOD_MASK_CS` instead for the mod bitmask would have forced you to press four modifier keys (both versions of control and shift) to fulfill the condition.
|
||||||
|
|
||||||
The full list of mod masks is as follows:
|
The full list of mod masks is as follows:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,35 +23,14 @@ And to trigger the bootloader, you hold this key down when plugging the keyboard
|
||||||
|
|
||||||
## Split Keyboards
|
## Split Keyboards
|
||||||
|
|
||||||
When [handedness](feature_split_keyboard.md#setting-handedness) is predetermined via options like `SPLIT_HAND_PIN` or `EE_HANDS`, you might need to configure a different key between halves. To identify the correct key for the right half, examine the split key matrix defined in the `<keyboard>.h` file, e.g.:
|
When handedness is predetermined via an option like `SPLIT_HAND_PIN`, you might need to configure a different key between halves. To do so, add these entries to your `config.h` file:
|
||||||
|
|
||||||
```c
|
|
||||||
#define LAYOUT_split_3x5_2( \
|
|
||||||
L01, L02, L03, L04, L05, R01, R02, R03, R04, R05, \
|
|
||||||
L06, L07, L08, L09, L10, R06, R07, R08, R09, R10, \
|
|
||||||
L11, L12, L13, L14, L15, R11, R12, R13, R14, R15, \
|
|
||||||
L16, L17, R16, R17 \
|
|
||||||
) \
|
|
||||||
{ \
|
|
||||||
{ L01, L02, L03, L04, L05 }, \
|
|
||||||
{ L06, L07, L08, L09, L10 }, \
|
|
||||||
{ L11, L12, L13, L14, L15 }, \
|
|
||||||
{ L16, L17, KC_NO, KC_NO, KC_NO }, \
|
|
||||||
{ R01, R02, R03, R04, R05 }, \
|
|
||||||
{ R06, R07, R08, R09, R10 }, \
|
|
||||||
{ R11, R12, R13, R14, R15 }, \
|
|
||||||
{ R16, R17, KC_NO, KC_NO, KC_NO } \
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
If you pick the top right key for the right half, it is `R05` on the top layout. Within the key matrix below, `R05` is located on row 4 columnn 4. To use that key as the right half's Bootmagic Lite trigger, add these entries to your `config.h` file:
|
|
||||||
|
|
||||||
```c
|
```c
|
||||||
#define BOOTMAGIC_LITE_ROW_RIGHT 4
|
#define BOOTMAGIC_LITE_ROW_RIGHT 4
|
||||||
#define BOOTMAGIC_LITE_COLUMN_RIGHT 4
|
#define BOOTMAGIC_LITE_COLUMN_RIGHT 1
|
||||||
```
|
```
|
||||||
|
|
||||||
?> These values are not set by default.
|
By default, these values are not set.
|
||||||
|
|
||||||
## Advanced Bootmagic Lite
|
## Advanced Bootmagic Lite
|
||||||
|
|
||||||
|
|
@ -72,7 +51,7 @@ void bootmagic_lite(void) {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
You can define additional logic here. For instance, resetting the EEPROM or requiring additional keys to be pressed to trigger Bootmagic Lite. Keep in mind that `bootmagic_lite` is called before a majority of features are initialized in the firmware.
|
You can additional feature here. For instance, resetting the EEPROM or requiring additional keys to be pressed to trigger Bootmagic Lite. Keep in mind that `bootmagic_lite` is called before a majority of features are initialized in the firmware.
|
||||||
|
|
||||||
## Addenda
|
## Addenda
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,156 +0,0 @@
|
||||||
# Caps Word
|
|
||||||
|
|
||||||
It is often useful to type a single word in all capitals, for instance
|
|
||||||
abbreviations like "QMK", or in code, identifiers like `KC_SPC`. "Caps Word" is
|
|
||||||
a modern alternative to Caps Lock:
|
|
||||||
|
|
||||||
* Letters are capitalized while active, and Caps Word automatically disables
|
|
||||||
itself at the end of the word. That is, it stops by default once a space or
|
|
||||||
any key other than `a`--`z`, `0`--`9`, `-`, `_`, delete, or backspace is
|
|
||||||
pressed. Caps Word also disables itself if the keyboard is idle for 5 seconds.
|
|
||||||
This is configurable, see below.
|
|
||||||
|
|
||||||
* To avoid requiring a dedicated key for Caps Word, there is an option
|
|
||||||
(`BOTH_SHIFTS_TURNS_ON_CAPS_WORD`) to activate Caps Word by simultaneously
|
|
||||||
pressing both shift keys. See below for other options.
|
|
||||||
|
|
||||||
* The implementation does not use the Caps Lock (`KC_CAPS`) keycode. Caps Word
|
|
||||||
works even if you're remapping Caps Lock at the OS level to Ctrl or something
|
|
||||||
else, as Emacs and Vim users often do.
|
|
||||||
|
|
||||||
|
|
||||||
## How do I enable Caps Word :id=how-do-i-enable-caps-word
|
|
||||||
|
|
||||||
In your `rules.mk`, add:
|
|
||||||
|
|
||||||
```make
|
|
||||||
CAPS_WORD_ENABLE = yes
|
|
||||||
```
|
|
||||||
|
|
||||||
Next, use one the following methods to activate Caps Word:
|
|
||||||
|
|
||||||
* **Activate by pressing a key**: Use the `CAPS_WORD` keycode (short
|
|
||||||
alias `CAPSWRD`) in your keymap.
|
|
||||||
|
|
||||||
* **Activate by pressing Left Shift + Right Shift**: Add `#define
|
|
||||||
BOTH_SHIFTS_TURNS_ON_CAPS_WORD` to config.h. You may also need to disable or
|
|
||||||
reconfigure Command, details below. Then, simultaneously pressing both left
|
|
||||||
and right shifts turns on Caps Word. This method works with the plain
|
|
||||||
`KC_LSFT` and `KC_RSFT` keycodes as well as one-shot shifts and Space Cadet
|
|
||||||
shifts. If your shift keys are mod-taps, hold both shift mod-tap keys until
|
|
||||||
the tapping term, then release them.
|
|
||||||
|
|
||||||
* **Activate by double tapping Left Shift**: Add `#define
|
|
||||||
DOUBLE_TAP_SHIFT_TURNS_ON_CAPS_WORD` config.h. Then, double tapping Left Shift
|
|
||||||
turns on Caps Word. This method works with `KC_LSFT` or one-shot Left Shift
|
|
||||||
`OSM(MOD_LSFT)`. To count as a double tap, the maximum time in milliseconds
|
|
||||||
between taps is `TAPPING_TERM`, or if using `TAPPING_TERM_PER_KEY`, the time
|
|
||||||
returned by `get_tapping_term()` for the shift keycode being tapped.
|
|
||||||
|
|
||||||
* **Custom activation**: You can activate Caps Word from code by calling
|
|
||||||
`caps_word_on()`. This may be used to activate Caps Word through [a
|
|
||||||
combo](feature_combo.md) or [tap dance](feature_tap_dance.md) or any means
|
|
||||||
you like.
|
|
||||||
|
|
||||||
### Troubleshooting: Command :id=troubleshooting-command
|
|
||||||
|
|
||||||
When using `BOTH_SHIFTS_TURNS_ON_CAPS_WORD`, you might see a compile message
|
|
||||||
**"BOTH_SHIFTS_TURNS_ON_CAPS_WORD and Command should not be enabled at the same
|
|
||||||
time, since both use the Left Shift + Right Shift key combination."**
|
|
||||||
|
|
||||||
Many keyboards enable the [Command feature](feature_command.md), which by
|
|
||||||
default is also activated using the Left Shift + Right Shift key combination. To
|
|
||||||
fix this conflict, please disable Command by adding in rules.mk:
|
|
||||||
|
|
||||||
```make
|
|
||||||
COMMAND_ENABLE = no
|
|
||||||
```
|
|
||||||
|
|
||||||
Or configure Command to use another key combination like Left Ctrl + Right Ctrl
|
|
||||||
by defining `IS_COMMAND()` in config.h:
|
|
||||||
|
|
||||||
```c
|
|
||||||
// Activate Command with Left Ctrl + Right Ctrl.
|
|
||||||
#define IS_COMMAND() (get_mods() == MOD_MASK_CTRL)
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
## Customizing Caps Word :id=customizing-caps-word
|
|
||||||
|
|
||||||
### Idle timeout :id=idle-timeout
|
|
||||||
|
|
||||||
Caps Word turns off automatically if no keys are pressed for
|
|
||||||
`CAPS_WORD_IDLE_TIMEOUT` milliseconds. The default is 5000 (5 seconds).
|
|
||||||
Configure the timeout duration in config.h, for instance
|
|
||||||
|
|
||||||
```c
|
|
||||||
#define CAPS_WORD_IDLE_TIMEOUT 3000 // 3 seconds.
|
|
||||||
```
|
|
||||||
|
|
||||||
Setting `CAPS_WORD_IDLE_TIMEOUT` to 0 configures Caps Word to never time out.
|
|
||||||
Caps Word then remains active indefinitely until a word breaking key is pressed.
|
|
||||||
|
|
||||||
|
|
||||||
### Functions :id=functions
|
|
||||||
|
|
||||||
Functions to manipulate Caps Word:
|
|
||||||
|
|
||||||
| Function | Description |
|
|
||||||
|-------------------------|------------------------------------------------|
|
|
||||||
| `caps_word_on()` | Turns Caps Word on. |
|
|
||||||
| `caps_word_off()` | Turns Caps Word off. |
|
|
||||||
| `caps_word_toggle()` | Toggles Caps Word. |
|
|
||||||
| `is_caps_word_on()` | Returns true if Caps Word is currently on. |
|
|
||||||
|
|
||||||
|
|
||||||
### Configure which keys are "word breaking" :id=configure-which-keys-are-word-breaking
|
|
||||||
|
|
||||||
You can define the `caps_word_press_user(uint16_t keycode)` callback to
|
|
||||||
configure which keys should be shifted and which keys are considered "word
|
|
||||||
breaking" and stop Caps Word.
|
|
||||||
|
|
||||||
The callback is called on every key press while Caps Word is active. When the
|
|
||||||
key should be shifted (that is, a letter key), the callback should call
|
|
||||||
`add_weak_mods(MOD_BIT(KC_LSFT))` to shift the key. Returning true continues the
|
|
||||||
current "word," while returning false is "word breaking" and deactivates Caps
|
|
||||||
Word. The default callback is
|
|
||||||
|
|
||||||
```c
|
|
||||||
bool caps_word_press_user(uint16_t keycode) {
|
|
||||||
switch (keycode) {
|
|
||||||
// Keycodes that continue Caps Word, with shift applied.
|
|
||||||
case KC_A ... KC_Z:
|
|
||||||
case KC_MINS:
|
|
||||||
add_weak_mods(MOD_BIT(KC_LSFT)); // Apply shift to next key.
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// Keycodes that continue Caps Word, without shifting.
|
|
||||||
case KC_1 ... KC_0:
|
|
||||||
case KC_BSPC:
|
|
||||||
case KC_DEL:
|
|
||||||
case KC_UNDS:
|
|
||||||
return true;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return false; // Deactivate Caps Word.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
### Representing Caps Word state :id=representing-caps-word-state
|
|
||||||
|
|
||||||
Define `caps_word_set_user(bool active)` to get callbacks when Caps Word turns
|
|
||||||
on or off. This is useful to represent the current Caps Word state, e.g. by
|
|
||||||
setting an LED or playing a sound. In your keymap, define
|
|
||||||
|
|
||||||
```c
|
|
||||||
void caps_word_set_user(bool active) {
|
|
||||||
if (active) {
|
|
||||||
// Do something when Caps Word activates.
|
|
||||||
} else {
|
|
||||||
// Do something when Caps Word deactivates.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
@ -54,43 +54,9 @@ If you are using different pinouts for the encoders on each half of a split keyb
|
||||||
#define ENCODER_RESOLUTIONS_RIGHT { 2, 4 }
|
#define ENCODER_RESOLUTIONS_RIGHT { 2, 4 }
|
||||||
```
|
```
|
||||||
|
|
||||||
If the `_RIGHT` definitions aren't specified in your `config.h`, then the non-`_RIGHT` versions will be applied to both sides of the split.
|
|
||||||
|
|
||||||
Additionally, if one side does not have an encoder, you can specify `{}` for the pins/resolution -- for example, a split keyboard with only a right-side encoder:
|
|
||||||
|
|
||||||
```c
|
|
||||||
#define ENCODERS_PAD_A { }
|
|
||||||
#define ENCODERS_PAD_B { }
|
|
||||||
#define ENCODER_RESOLUTIONS { }
|
|
||||||
#define ENCODERS_PAD_A_RIGHT { B12 }
|
|
||||||
#define ENCODERS_PAD_B_RIGHT { B13 }
|
|
||||||
#define ENCODER_RESOLUTIONS_RIGHT { 4 }
|
|
||||||
```
|
|
||||||
|
|
||||||
## Encoder map :id=encoder-map
|
|
||||||
|
|
||||||
Encoder mapping may be added to your `keymap.c`, which replicates the normal keyswitch layer handling functionality, but with encoders. Add this to your `rules.mk`:
|
|
||||||
|
|
||||||
```make
|
|
||||||
ENCODER_MAP_ENABLE = yes
|
|
||||||
```
|
|
||||||
|
|
||||||
Your `keymap.c` will then need an encoder mapping defined (for four layers and two encoders):
|
|
||||||
|
|
||||||
```c
|
|
||||||
#if defined(ENCODER_MAP_ENABLE)
|
|
||||||
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
|
|
||||||
[_BASE] = { ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
|
|
||||||
[_LOWER] = { ENCODER_CCW_CW(RGB_HUD, RGB_HUI), ENCODER_CCW_CW(RGB_SAD, RGB_SAI) },
|
|
||||||
[_RAISE] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI), ENCODER_CCW_CW(RGB_SPD, RGB_SPI) },
|
|
||||||
[_ADJUST] = { ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(KC_RIGHT, KC_LEFT) },
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
```
|
|
||||||
|
|
||||||
## Callbacks
|
## Callbacks
|
||||||
|
|
||||||
When not using `ENCODER_MAP_ENABLE = yes`, the callback functions can be inserted into your `<keyboard>.c`:
|
The callback functions can be inserted into your `<keyboard>.c`:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
bool encoder_update_kb(uint8_t index, bool clockwise) {
|
bool encoder_update_kb(uint8_t index, bool clockwise) {
|
||||||
|
|
|
||||||
|
|
@ -50,28 +50,22 @@ Not all keycodes below will work depending on which haptic mechanism you have ch
|
||||||
|
|
||||||
### Solenoids
|
### Solenoids
|
||||||
|
|
||||||
The solenoid code supports relay switches, and similar hardware, as well as solenoids.
|
First you will need a build a circuit to drive the solenoid through a mosfet as most MCU will not be able to provide the current needed to drive the coil in the solenoid.
|
||||||
|
|
||||||
For a regular solenoid, you will need a build a circuit to drive the solenoid through a mosfet as most MCU will not be able to provide the current needed to drive the coil in the solenoid.
|
|
||||||
|
|
||||||
[Wiring diagram provided by Adafruit](https://cdn-shop.adafruit.com/product-files/412/solenoid_driver.pdf)
|
[Wiring diagram provided by Adafruit](https://cdn-shop.adafruit.com/product-files/412/solenoid_driver.pdf)
|
||||||
|
|
||||||
For relay switches, the hardware may already contain all of that ciruitry, and just require VCC, GND and a data pin.
|
|
||||||
|
|
||||||
| Settings | Default | Description |
|
| Settings | Default | Description |
|
||||||
|----------------------------|----------------------|--------------------------------------------------------------|
|
|----------------------------|----------------------|-------------------------------------------------------|
|
||||||
|`SOLENOID_PIN` | *Not defined* |Configures the pin that the switch is connected to. |
|
|`SOLENOID_PIN` | *Not defined* |Configures the pin that the Solenoid is connected to. |
|
||||||
|`SOLENOID_PIN_ACTIVE_LOW` | *Not defined* |If defined then the switch trigger pin is active low. |
|
|`SOLENOID_PIN_ACTIVE_LOW` | *Not defined* |If defined then the solenoid trigger pin is active low.|
|
||||||
|`SOLENOID_PINS` | *Not defined* |Configures an array of pins to be used for switch activation. |
|
|`SOLENOID_DEFAULT_DWELL` | `12` ms |Configures the default dwell time for the solenoid. |
|
||||||
|`SOLENOID_PINS_ACTIVE_LOW` | *Not defined* |Allows you to specify how each pin is pulled for activation. |
|
|`SOLENOID_MIN_DWELL` | `4` ms |Sets the lower limit for the dwell. |
|
||||||
|`SOLENOID_RANDOM_FIRE` | *Not defined* |When there are multiple solenoids, will select a random one to fire.|
|
|`SOLENOID_MAX_DWELL` | `100` ms |Sets the upper limit for the dwell. |
|
||||||
|`SOLENOID_DEFAULT_DWELL` | `12` ms |Configures the default dwell time for the switch. |
|
|`SOLENOID_DWELL_STEP_SIZE` | `1` ms |The step size to use when `HPT_DWL*` keycodes are sent |
|
||||||
|`SOLENOID_MIN_DWELL` | `4` ms |Sets the lower limit for the dwell. |
|
|`SOLENOID_DEFAULT_BUZZ` | `0` (disabled) |On HPT_RST buzz is set "on" if this is "1" |
|
||||||
|`SOLENOID_MAX_DWELL` | `100` ms |Sets the upper limit for the dwell. |
|
|`SOLENOID_BUZZ_ACTUATED` | `SOLENOID_MIN_DWELL` |Actuated-time when the solenoid is in buzz mode |
|
||||||
|`SOLENOID_DWELL_STEP_SIZE` | `1` ms |The step size to use when `HPT_DWL*` keycodes are sent. |
|
|`SOLENOID_BUZZ_NONACTUATED` | `SOLENOID_MIN_DWELL` |Non-Actuated-time when the solenoid is in buzz mode |
|
||||||
|`SOLENOID_DEFAULT_BUZZ` | `0` (disabled) |On HPT_RST buzz is set "on" if this is "1" |
|
|
||||||
|`SOLENOID_BUZZ_ACTUATED` | `SOLENOID_MIN_DWELL` |Actuated-time when the switch is in buzz mode. |
|
|
||||||
|`SOLENOID_BUZZ_NONACTUATED` | `SOLENOID_MIN_DWELL` |Non-Actuated-time when the switch is in buzz mode. |
|
|
||||||
|
|
||||||
* If solenoid buzz is off, then dwell time is how long the "plunger" stays activated. The dwell time changes how the solenoid sounds.
|
* If solenoid buzz is off, then dwell time is how long the "plunger" stays activated. The dwell time changes how the solenoid sounds.
|
||||||
* If solenoid buzz is on, then dwell time sets the length of the buzz, while `SOLENOID_BUZZ_ACTUATED` and `SOLENOID_BUZZ_NONACTUATED` set the (non-)actuation times withing the buzz period.
|
* If solenoid buzz is on, then dwell time sets the length of the buzz, while `SOLENOID_BUZZ_ACTUATED` and `SOLENOID_BUZZ_NONACTUATED` set the (non-)actuation times withing the buzz period.
|
||||||
|
|
|
||||||
|
|
@ -1,298 +1,57 @@
|
||||||
# HD44780 LCD Driver
|
# HD44780 LCD Displays
|
||||||
|
|
||||||
## Supported Hardware
|
This is an integration of Peter Fleury's LCD library. This page will explain the basics. [For in depth documentation visit his page.](http://www.peterfleury.epizy.com/doxygen/avr-gcc-libraries/group__pfleury__lcd.html)
|
||||||
|
|
||||||
LCD modules using [HD44780U](https://www.sparkfun.com/datasheets/LCD/HD44780.pdf) IC or equivalent, communicating in 4-bit mode.
|
You can enable support for HD44780 Displays by setting the `HD44780_ENABLE` flag in your keyboards `rules.mk` to yes.
|
||||||
|
|
||||||
|Module|Size |Notes |
|
## Configuration
|
||||||
|------|--------------|---------------------------------|
|
|
||||||
|1602A |16x2, 5x8 dots| |
|
|
||||||
|2004A |20x4, 5x8 dots|Untested, not currently supported|
|
|
||||||
|
|
||||||
To run these modules at 3.3V, an additional MAX660 voltage converter IC must be soldered on, along with two 10µF capacitors. See [this page](https://www.codrey.com/electronic-circuits/hack-your-16x2-lcd/) for more details.
|
You will need to configure the pins used by your display, and its number of lines and columns in your keyboard's `config.h`.
|
||||||
|
|
||||||
|
|
||||||
|
Uncomment the section labled HD44780 and change the parameters as needed.
|
||||||
|
````
|
||||||
|
/*
|
||||||
|
* HD44780 LCD Display Configuration
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define LCD_LINES 2 //< number of visible lines of the display
|
||||||
|
#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display
|
||||||
|
#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode
|
||||||
|
#if LCD_IO_MODE
|
||||||
|
#define LCD_PORT PORTB //< port for the LCD lines
|
||||||
|
#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0
|
||||||
|
#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1
|
||||||
|
#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2
|
||||||
|
#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3
|
||||||
|
#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0
|
||||||
|
#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1
|
||||||
|
#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2
|
||||||
|
#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3
|
||||||
|
#define LCD_RS_PORT LCD_PORT //< port for RS line
|
||||||
|
#define LCD_RS_PIN 3 //< pin for RS line
|
||||||
|
#define LCD_RW_PORT LCD_PORT //< port for RW line
|
||||||
|
#define LCD_RW_PIN 2 //< pin for RW line
|
||||||
|
#define LCD_E_PORT LCD_PORT //< port for Enable line
|
||||||
|
#define LCD_E_PIN 1 //< pin for Enable line
|
||||||
|
#endif
|
||||||
|
````
|
||||||
|
|
||||||
|
Should you need to configure other properties you can copy them from `quantum/hd44780.h` and set them in your `config.h`
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
Add the following to your `rules.mk`:
|
To initialize your display, call `lcd_init()` with one of these parameters:
|
||||||
|
````
|
||||||
```make
|
LCD_DISP_OFF : display off
|
||||||
HD44780_ENABLE = yes
|
LCD_DISP_ON : display on, cursor off
|
||||||
```
|
LCD_DISP_ON_CURSOR : display on, cursor on
|
||||||
|
LCD_DISP_ON_CURSOR_BLINK : display on, cursor on flashing
|
||||||
## Basic Configuration
|
````
|
||||||
|
This is best done in your keyboards `matrix_init_kb` or your keymaps `matrix_init_user`.
|
||||||
Add the following to your `config.h`:
|
It is advised to clear the display before use.
|
||||||
|
To do so call `lcd_clrscr()`.
|
||||||
|Define |Default |Description |
|
|
||||||
|-----------------------|--------------|-----------------------------------------------------------------------------------------------------|
|
To now print something to your Display you first call `lcd_gotoxy(column, line)`. To go to the start of the first line you would call `lcd_gotoxy(0, 0)` and then print a string with `lcd_puts("example string")`.
|
||||||
|`HD44780_DATA_PINS` |*Not defined* |(Required) An array of four GPIO pins connected to the display's D4-D7 pins, eg. `{ B1, B3, B2, B6 }`|
|
|
||||||
|`HD44780_RS_PIN` |*Not defined* |(Required) The GPIO connected to the display's RS pin |
|
There are more methods available to control the display. [For in depth documentation please visit the linked page.](http://www.peterfleury.epizy.com/doxygen/avr-gcc-libraries/group__pfleury__lcd.html)
|
||||||
|`HD44780_RW_PIN` |*Not defined* |(Required) The GPIO connected to the display's RW pin |
|
|
||||||
|`HD44780_E_PIN` |*Not defined* |(Required) The GPIO connected to the display's E pin |
|
|
||||||
|`HD44780_DISPLAY_COLS` |`16` |The number of visible characters on a single line of the display |
|
|
||||||
|`HD44780_DISPLAY_LINES`|`2` |The number of visible lines on the display |
|
|
||||||
|`HD44780_WRAP_LINES` |*Not defined* |If defined, input characters will wrap to the next line |
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
### Hello World
|
|
||||||
|
|
||||||
Add the following to your `keymap.c`:
|
|
||||||
|
|
||||||
```c
|
|
||||||
void keyboard_post_init_user(void) {
|
|
||||||
hd44780_init(true, true); // Show blinking cursor
|
|
||||||
hd44780_puts_P(PSTR("Hello, world!\n"));
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Custom Character Definition
|
|
||||||
|
|
||||||
Up to eight custom characters can be defined. This data is stored in the Character Generator RAM (CGRAM), and is not persistent across power cycles.
|
|
||||||
|
|
||||||
This example defines the QMK Psi as the first custom character. The first 16 positions in the character set are reserved for the eight custom characters duplicated.
|
|
||||||
|
|
||||||
```
|
|
||||||
Byte | 16 8 4 2 1
|
|
||||||
1 | x x x ■ □ ■ □ ■
|
|
||||||
2 | x x x ■ □ ■ □ ■
|
|
||||||
3 | x x x ■ □ ■ □ ■
|
|
||||||
4 | x x x □ ■ ■ ■ □
|
|
||||||
5 | x x x □ □ ■ □ □
|
|
||||||
6 | x x x □ □ ■ □ □
|
|
||||||
7 | x x x □ □ ■ □ □
|
|
||||||
8 | x x x □ □ □ □ □
|
|
||||||
```
|
|
||||||
|
|
||||||
```c
|
|
||||||
const uint8_t PROGMEM psi[8] = { 0x15, 0x15, 0x15, 0x0E, 0x04, 0x04, 0x04, 0x00 };
|
|
||||||
|
|
||||||
void keyboard_post_init_user(void) {
|
|
||||||
hd44780_init(false, false);
|
|
||||||
hd44780_define_char_P(0, psi);
|
|
||||||
// Cursor is incremented while defining characters so must be reset
|
|
||||||
hd44780_home();
|
|
||||||
// 0x08 to avoid null terminator
|
|
||||||
hd44780_puts_P(PSTR("\x08 QMK Firmware"));
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
### `void hd44780_init(bool cursor, bool blink)`
|
|
||||||
|
|
||||||
Initialize the display.
|
|
||||||
|
|
||||||
This function should be called only once, before any of the other functions can be called.
|
|
||||||
|
|
||||||
#### Arguments
|
|
||||||
|
|
||||||
- `bool cursor`
|
|
||||||
Whether to show the cursor.
|
|
||||||
- `bool blink`
|
|
||||||
Whether to blink the cursor, if shown.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### `void hd44780_clear(void)`
|
|
||||||
|
|
||||||
Clear the display.
|
|
||||||
|
|
||||||
This function is called on init.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### `void hd44780_home(void)`
|
|
||||||
|
|
||||||
Move the cursor to the home position.
|
|
||||||
|
|
||||||
This function is called on init.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### `void hd44780_on(bool cursor, bool blink)`
|
|
||||||
|
|
||||||
Turn the display on, and/or set the cursor properties.
|
|
||||||
|
|
||||||
This function is called on init.
|
|
||||||
|
|
||||||
#### Arguments
|
|
||||||
|
|
||||||
- `bool cursor`
|
|
||||||
Whether to show the cursor.
|
|
||||||
- `bool blink`
|
|
||||||
Whether to blink the cursor, if shown.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### `void hd44780_off(void)`
|
|
||||||
|
|
||||||
Turn the display off.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### `void hd44780_set_cursor(uint8_t col, uint8_t line)`
|
|
||||||
|
|
||||||
Move the cursor to the specified position on the display.
|
|
||||||
|
|
||||||
#### Arguments
|
|
||||||
|
|
||||||
- `uint8_t col`
|
|
||||||
The column number to move to, from 0 to 15 on 16x2 displays.
|
|
||||||
- `bool line`
|
|
||||||
The line number to move to, either 0 or 1 on 16x2 displays.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### `void hd44780_putc(char c)`
|
|
||||||
|
|
||||||
Print a character to the display. The newline character `\n` will move the cursor to the start of the next line.
|
|
||||||
|
|
||||||
The exact character shown may depend on the ROM code of your particular display - refer to the datasheet for the full character set.
|
|
||||||
|
|
||||||
#### Arguments
|
|
||||||
|
|
||||||
- `char c`
|
|
||||||
The character to print.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### `void hd44780_puts(const char *s)`
|
|
||||||
|
|
||||||
Print a string of characters to the display.
|
|
||||||
|
|
||||||
#### Arguments
|
|
||||||
|
|
||||||
- `const char *s`
|
|
||||||
The string to print.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### `void hd44780_puts_P(const char *s)`
|
|
||||||
|
|
||||||
Print a string of characters from PROGMEM to the display.
|
|
||||||
|
|
||||||
On ARM devices, this function is simply an alias of `hd44780_puts()`.
|
|
||||||
|
|
||||||
#### Arguments
|
|
||||||
|
|
||||||
- `const char *s`
|
|
||||||
The PROGMEM string to print (ie. `PSTR("Hello")`).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### `void hd44780_define_char(uint8_t index, uint8_t *data)`
|
|
||||||
|
|
||||||
Define a custom character.
|
|
||||||
|
|
||||||
#### Arguments
|
|
||||||
|
|
||||||
- `uint8_t index`
|
|
||||||
The index of the custom character to define, from 0 to 7.
|
|
||||||
- `uint8_t *data`
|
|
||||||
An array of 8 bytes containing the 5-bit row data of the character, where the first byte is the topmost row, and the least significant bit of each byte is the rightmost column.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### `void hd44780_define_char_P(uint8_t index, const uint8_t *data)`
|
|
||||||
|
|
||||||
Define a custom character from PROGMEM.
|
|
||||||
|
|
||||||
On ARM devices, this function is simply an alias of `hd44780_define_char()`.
|
|
||||||
|
|
||||||
#### Arguments
|
|
||||||
|
|
||||||
- `uint8_t index`
|
|
||||||
The index of the custom character to define, from 0 to 7.
|
|
||||||
- `const uint8_t *data`
|
|
||||||
A PROGMEM array of 8 bytes containing the 5-bit row data of the character, where the first byte is the topmost row, and the least significant bit of each byte is the rightmost column.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### `bool hd44780_busy(void)`
|
|
||||||
|
|
||||||
Indicates whether the display is currently processing, and cannot accept instructions.
|
|
||||||
|
|
||||||
#### Return Value
|
|
||||||
|
|
||||||
`true` if the display is busy.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### `void hd44780_write(uint8_t data, bool isData)`
|
|
||||||
|
|
||||||
Write a byte to the display.
|
|
||||||
|
|
||||||
#### Arguments
|
|
||||||
|
|
||||||
- `uint8_t data`
|
|
||||||
The byte to send to the display.
|
|
||||||
- `bool isData`
|
|
||||||
Whether the byte is an instruction or character data.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### `uint8_t hd44780_read(bool isData)`
|
|
||||||
|
|
||||||
Read a byte from the display.
|
|
||||||
|
|
||||||
#### Arguments
|
|
||||||
|
|
||||||
- `bool isData`
|
|
||||||
Whether to read the current cursor position, or the character at the cursor.
|
|
||||||
|
|
||||||
#### Return Value
|
|
||||||
|
|
||||||
If `isData` is `true`, the returned byte will be the character at the current DDRAM address. Otherwise, it will be the current DDRAM address and the busy flag.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### `void hd44780_command(uint8_t command)`
|
|
||||||
|
|
||||||
Send a command to the display. Refer to the datasheet and `hd44780.h` for the valid commands and defines.
|
|
||||||
|
|
||||||
This function waits for the display to clear the busy flag before sending the command.
|
|
||||||
|
|
||||||
#### Arguments
|
|
||||||
|
|
||||||
- `uint8_t command`
|
|
||||||
The command to send.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### `void hd44780_data(uint8_t data)`
|
|
||||||
|
|
||||||
Send a byte of data to the display.
|
|
||||||
|
|
||||||
This function waits for the display to clear the busy flag before sending the data.
|
|
||||||
|
|
||||||
#### Arguments
|
|
||||||
|
|
||||||
- `uint8_t data`
|
|
||||||
The byte of data to send.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### `void hd44780_set_cgram_address(uint8_t address)`
|
|
||||||
|
|
||||||
Set the CGRAM address.
|
|
||||||
|
|
||||||
This function is used when defining custom characters.
|
|
||||||
|
|
||||||
#### Arguments
|
|
||||||
|
|
||||||
- `uint8_t address`
|
|
||||||
The CGRAM address to move to, from `0x00` to `0x3F`.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### `void hd44780_set_ddram_address(uint8_t address)`
|
|
||||||
|
|
||||||
Set the DDRAM address.
|
|
||||||
|
|
||||||
This function is used when printing characters to the display, and setting the cursor.
|
|
||||||
|
|
||||||
#### Arguments
|
|
||||||
|
|
||||||
- `uint8_t address`
|
|
||||||
The DDRAM address to move to, from `0x00` to `0x7F`.
|
|
||||||
|
|
|
||||||
|
|
@ -150,5 +150,3 @@ Note that the supported AVR MCUs have a 10-bit ADC, and 12-bit for most STM32 MC
|
||||||
|
|
||||||
Joystick buttons are normal Quantum keycodes, defined as `JS_BUTTON0` to `JS_BUTTON31`, depending on the number of buttons you have configured.
|
Joystick buttons are normal Quantum keycodes, defined as `JS_BUTTON0` to `JS_BUTTON31`, depending on the number of buttons you have configured.
|
||||||
To trigger a joystick button, just add the corresponding keycode to your keymap.
|
To trigger a joystick button, just add the corresponding keycode to your keymap.
|
||||||
|
|
||||||
You can also trigger joystick buttons in code with `register_joystick_button(button)` and `unregister_joystick_button(button)`, where `button` is the 0-based button index (0 = button 1).
|
|
||||||
|
|
|
||||||
|
|
@ -11,13 +11,13 @@ QMK provides methods to read 5 of the LEDs defined in the HID spec:
|
||||||
* Kana
|
* Kana
|
||||||
|
|
||||||
There are three ways to get the lock LED state:
|
There are three ways to get the lock LED state:
|
||||||
* Configuration options in `config.h`
|
* by specifying configuration options within `config.h`
|
||||||
* Implement `led_update_*` function
|
* by implementing `bool led_update_kb(led_t led_state)` or `_user(led_t led_state)`; or
|
||||||
* Call `led_t host_keyboard_led_state()`
|
* by calling `led_t host_keyboard_led_state()`
|
||||||
|
|
||||||
!> The `host_keyboard_led_state()` may reflect an updated state before `led_update_user()` is called.
|
!> `host_keyboard_led_state()` may already reflect a new value before `led_update_user()` is called.
|
||||||
|
|
||||||
Two deprecated functions that provide the LED state as `uint8_t`:
|
Two more deprecated functions exist that provide the LED state as a `uint8_t`:
|
||||||
|
|
||||||
* `uint8_t led_set_kb(uint8_t usb_led)` and `_user(uint8_t usb_led)`
|
* `uint8_t led_set_kb(uint8_t usb_led)` and `_user(uint8_t usb_led)`
|
||||||
* `uint8_t host_keyboard_leds()`
|
* `uint8_t host_keyboard_leds()`
|
||||||
|
|
@ -37,20 +37,23 @@ To configure the indicators, `#define` these in your `config.h`:
|
||||||
|
|
||||||
Unless you are designing your own keyboard, you generally should not need to change the above config options.
|
Unless you are designing your own keyboard, you generally should not need to change the above config options.
|
||||||
|
|
||||||
## LED update function
|
## `led_update_*()`
|
||||||
|
|
||||||
When the configuration options do not provide enough flexibility, the following callbacks allow custom control of the LED behavior. These functions will be called when one of those 5 LEDs changes state:
|
When the configuration options do not provide enough flexibility, the API hooks provided allow custom control of the LED behavior. These functions will be called when the state of one of those 5 LEDs changes. It receives the LED state as a struct parameter.
|
||||||
|
|
||||||
* Keyboard/revision: `bool led_update_kb(led_t led_state)`
|
By convention, return `true` from `led_update_user()` to get the `led_update_kb()` hook to run its code, and
|
||||||
* Keymap: `bool led_update_user(led_t led_state)`
|
return `false` when you would prefer not to run the code in `led_update_kb()`.
|
||||||
|
|
||||||
Both receives LED state as a struct parameter. Returning `true` in `led_update_user()` will allow the keyboard level code in `led_update_kb()` to run as well. Returning `false` will override the keyboard level code, depending on how the keyboard level function is set up.
|
Some examples include:
|
||||||
|
|
||||||
?> This boolean return type of `led_update_user` allows for overriding keyboard LED controls, and is thus recommended over the void `led_set_user` function.
|
- overriding the LEDs to use them for something else like layer indication
|
||||||
|
- return `false` because you do not want the `_kb()` function to run, as it would override your layer behavior.
|
||||||
|
- play a sound when an LED turns on or off.
|
||||||
|
- return `true` because you want the `_kb` function to run, and this is in addition to the default LED behavior.
|
||||||
|
|
||||||
### Example of keyboard LED update implementation
|
?> Because the `led_set_*` functions return `void` instead of `bool`, they do not allow for overriding the keyboard LED control, and thus it's recommended to use `led_update_*` instead.
|
||||||
|
|
||||||
This is a template indicator function that can be implemented on keyboard level code:
|
### Example `led_update_kb()` Implementation
|
||||||
|
|
||||||
```c
|
```c
|
||||||
bool led_update_kb(led_t led_state) {
|
bool led_update_kb(led_t led_state) {
|
||||||
|
|
@ -71,9 +74,9 @@ bool led_update_kb(led_t led_state) {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Example of user LED update implementation
|
### Example `led_update_user()` Implementation
|
||||||
|
|
||||||
This is an incomplete example will play a sound if Caps Lock is turned on or off. It returns `true` to allow keyboard LED function to maintain their state.
|
This incomplete example would play a sound if Caps Lock is turned on or off. It returns `true`, because you also want the LEDs to maintain their state.
|
||||||
|
|
||||||
```c
|
```c
|
||||||
#ifdef AUDIO_ENABLE
|
#ifdef AUDIO_ENABLE
|
||||||
|
|
@ -93,17 +96,18 @@ bool led_update_user(led_t led_state) {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Host keyboard LED state
|
### `led_update_*` Function Documentation
|
||||||
|
|
||||||
The `host_keyboard_led_state()` function will report the LED state returned from the host computer as `led_t`. This is useful for reading the LED state outside `led_update_*`. For example, you can get the boolean state of Caps Lock from the host with:
|
* Keyboard/Revision: `bool led_update_kb(led_t led_state)`
|
||||||
|
* Keymap: `bool led_update_user(led_t led_state)`
|
||||||
|
|
||||||
```c
|
## `host_keyboard_led_state()`
|
||||||
bool caps = host_keyboard_led_state().caps_lock;
|
|
||||||
```
|
Call this function to get the last received LED state as a `led_t`. This is useful for reading the LED state outside `led_update_*`, e.g. in [`matrix_scan_user()`](#matrix-scanning-code).
|
||||||
|
|
||||||
## Setting Physical LED State
|
## Setting Physical LED State
|
||||||
|
|
||||||
Some keyboard implementations provide convenient methods for setting the state of the physical LEDs.
|
Some keyboard implementations provide convenience methods for setting the state of the physical LEDs.
|
||||||
|
|
||||||
### Ergodox Boards
|
### Ergodox Boards
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -264,11 +264,11 @@ enum led_matrix_effects {
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
You can enable a single effect by defining `ENABLE_[EFFECT_NAME]` in your `config.h`:
|
You can disable a single effect by defining `DISABLE_[EFFECT_NAME]` in your `config.h`:
|
||||||
|
|
||||||
|
|
||||||
|Define |Description |
|
|Define |Description |
|
||||||
|-------------------------------------------------------|----------------------------------------------|
|
|-------------------------------------------------------|-----------------------------------------------|
|
||||||
|`#define ENABLE_LED_MATRIX_ALPHAS_MODS` |Enables `LED_MATRIX_ALPHAS_MODS` |
|
|`#define ENABLE_LED_MATRIX_ALPHAS_MODS` |Enables `LED_MATRIX_ALPHAS_MODS` |
|
||||||
|`#define ENABLE_LED_MATRIX_BREATHING` |Enables `LED_MATRIX_BREATHING` |
|
|`#define ENABLE_LED_MATRIX_BREATHING` |Enables `LED_MATRIX_BREATHING` |
|
||||||
|`#define ENABLE_LED_MATRIX_BAND` |Enables `LED_MATRIX_BAND` |
|
|`#define ENABLE_LED_MATRIX_BAND` |Enables `LED_MATRIX_BAND` |
|
||||||
|
|
@ -278,13 +278,6 @@ You can enable a single effect by defining `ENABLE_[EFFECT_NAME]` in your `confi
|
||||||
|`#define ENABLE_LED_MATRIX_CYCLE_UP_DOWN` |Enables `LED_MATRIX_CYCLE_UP_DOWN` |
|
|`#define ENABLE_LED_MATRIX_CYCLE_UP_DOWN` |Enables `LED_MATRIX_CYCLE_UP_DOWN` |
|
||||||
|`#define ENABLE_LED_MATRIX_CYCLE_OUT_IN` |Enables `LED_MATRIX_CYCLE_OUT_IN` |
|
|`#define ENABLE_LED_MATRIX_CYCLE_OUT_IN` |Enables `LED_MATRIX_CYCLE_OUT_IN` |
|
||||||
|`#define ENABLE_LED_MATRIX_DUAL_BEACON` |Enables `LED_MATRIX_DUAL_BEACON` |
|
|`#define ENABLE_LED_MATRIX_DUAL_BEACON` |Enables `LED_MATRIX_DUAL_BEACON` |
|
||||||
|`#define ENABLE_LED_MATRIX_WAVE_LEFT_RIGHT` |Enables `LED_MATRIX_WAVE_LEFT_RIGHT` |
|
|
||||||
|`#define ENABLE_LED_MATRIX_WAVE_UP_DOWN` |Enables `LED_MATRIX_WAVE_UP_DOWN` |
|
|
||||||
|
|
||||||
?> These modes don't require any additional defines.
|
|
||||||
|
|
||||||
|Reactive Defines |Description |
|
|
||||||
|-------------------------------------------------------|----------------------------------------------|
|
|
||||||
|`#define ENABLE_LED_MATRIX_SOLID_REACTIVE_SIMPLE` |Enables `LED_MATRIX_SOLID_REACTIVE_SIMPLE` |
|
|`#define ENABLE_LED_MATRIX_SOLID_REACTIVE_SIMPLE` |Enables `LED_MATRIX_SOLID_REACTIVE_SIMPLE` |
|
||||||
|`#define ENABLE_LED_MATRIX_SOLID_REACTIVE_WIDE` |Enables `LED_MATRIX_SOLID_REACTIVE_WIDE` |
|
|`#define ENABLE_LED_MATRIX_SOLID_REACTIVE_WIDE` |Enables `LED_MATRIX_SOLID_REACTIVE_WIDE` |
|
||||||
|`#define ENABLE_LED_MATRIX_SOLID_REACTIVE_MULTIWIDE` |Enables `LED_MATRIX_SOLID_REACTIVE_MULTIWIDE` |
|
|`#define ENABLE_LED_MATRIX_SOLID_REACTIVE_MULTIWIDE` |Enables `LED_MATRIX_SOLID_REACTIVE_MULTIWIDE` |
|
||||||
|
|
@ -294,8 +287,8 @@ You can enable a single effect by defining `ENABLE_[EFFECT_NAME]` in your `confi
|
||||||
|`#define ENABLE_LED_MATRIX_SOLID_REACTIVE_MULTINEXUS` |Enables `LED_MATRIX_SOLID_REACTIVE_MULTINEXUS`|
|
|`#define ENABLE_LED_MATRIX_SOLID_REACTIVE_MULTINEXUS` |Enables `LED_MATRIX_SOLID_REACTIVE_MULTINEXUS`|
|
||||||
|`#define ENABLE_LED_MATRIX_SOLID_SPLASH` |Enables `LED_MATRIX_SOLID_SPLASH` |
|
|`#define ENABLE_LED_MATRIX_SOLID_SPLASH` |Enables `LED_MATRIX_SOLID_SPLASH` |
|
||||||
|`#define ENABLE_LED_MATRIX_SOLID_MULTISPLASH` |Enables `LED_MATRIX_SOLID_MULTISPLASH` |
|
|`#define ENABLE_LED_MATRIX_SOLID_MULTISPLASH` |Enables `LED_MATRIX_SOLID_MULTISPLASH` |
|
||||||
|
|`#define ENABLE_LED_MATRIX_WAVE_LEFT_RIGHT` |Enables `LED_MATRIX_WAVE_LEFT_RIGHT` |
|
||||||
?> These modes also require the `LED_MATRIX_KEYPRESSES` or `LED_MATRIX_KEYRELEASES` define to be available.
|
|`#define ENABLE_LED_MATRIX_WAVE_UP_DOWN` |Enables `LED_MATRIX_WAVE_UP_DOWN` |
|
||||||
|
|
||||||
## Custom LED Matrix Effects :id=custom-led-matrix-effects
|
## Custom LED Matrix Effects :id=custom-led-matrix-effects
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,10 +10,6 @@ MIDI_ENABLE = yes
|
||||||
|
|
||||||
There are two MIDI systems in QMK: basic and advanced. With basic MIDI you will only be able to send Note On and Note Off messages using the note keycodes, meaning that keycodes like `MI_OCTU` and `MI_OCTD` will not work. Advanced MIDI allows you to do things like octave shifts, channel changes, velocity changes, modulation, and more.
|
There are two MIDI systems in QMK: basic and advanced. With basic MIDI you will only be able to send Note On and Note Off messages using the note keycodes, meaning that keycodes like `MI_OCTU` and `MI_OCTD` will not work. Advanced MIDI allows you to do things like octave shifts, channel changes, velocity changes, modulation, and more.
|
||||||
|
|
||||||
### Caveats
|
|
||||||
|
|
||||||
MIDI requires 2 USB endpoints and as such may not work on some hardware such as V-USB controllers.
|
|
||||||
|
|
||||||
### Basic MIDI
|
### Basic MIDI
|
||||||
|
|
||||||
To enable basic MIDI, add the following to your `config.h`:
|
To enable basic MIDI, add the following to your `config.h`:
|
||||||
|
|
@ -258,7 +254,7 @@ For the above, the `MI_C` keycode will produce a C3 (note number 48), and so on.
|
||||||
<!--
|
<!--
|
||||||
#### QMK Internals (Autogenerated)
|
#### QMK Internals (Autogenerated)
|
||||||
|
|
||||||
* [Internals/MIDI Device Setup Process](internals/midi_device_setup_process.md)
|
* [Internals/MIDI Device Setup Process](internals_midi_device_setup_process.md)
|
||||||
* [Internals/MIDI Device](internals/midi_device.md)
|
* [Internals/MIDI Device](internals_midi_device.md)
|
||||||
* [Internals/MIDI Util](internals/midi_util.md)
|
* [Internals/MIDI Util](internals_midi_util.md)
|
||||||
-->
|
-->
|
||||||
|
|
|
||||||
|
|
@ -134,7 +134,6 @@ The Pimoroni Trackball module is a I2C based breakout board with an RGB enable t
|
||||||
|
|
||||||
### PMW 3360 Sensor
|
### PMW 3360 Sensor
|
||||||
|
|
||||||
This drivers supports multiple sensors _per_ controller, so 2 can be attached at the same side for split keyboards (or unsplit keyboards).
|
|
||||||
To use the PMW 3360 sensor, add this to your `rules.mk`
|
To use the PMW 3360 sensor, add this to your `rules.mk`
|
||||||
|
|
||||||
```make
|
```make
|
||||||
|
|
@ -146,7 +145,6 @@ The PMW 3360 is an SPI driven optical sensor, that uses a built in IR LED for su
|
||||||
| Setting | Description | Default |
|
| Setting | Description | Default |
|
||||||
|-----------------------------|--------------------------------------------------------------------------------------------|---------------|
|
|-----------------------------|--------------------------------------------------------------------------------------------|---------------|
|
||||||
|`PMW3360_CS_PIN` | (Required) Sets the Cable Select pin connected to the sensor. | _not defined_ |
|
|`PMW3360_CS_PIN` | (Required) Sets the Cable Select pin connected to the sensor. | _not defined_ |
|
||||||
|`PMW3360_CS_PINS` | (Alternative) Sets the Cable Select pins connected to multiple sensors. | _not defined_ |
|
|
||||||
|`PMW3360_CLOCK_SPEED` | (Optional) Sets the clock speed that the sensor runs at. | `2000000` |
|
|`PMW3360_CLOCK_SPEED` | (Optional) Sets the clock speed that the sensor runs at. | `2000000` |
|
||||||
|`PMW3360_SPI_LSBFIRST` | (Optional) Sets the Least/Most Significant Byte First setting for SPI. | `false` |
|
|`PMW3360_SPI_LSBFIRST` | (Optional) Sets the Least/Most Significant Byte First setting for SPI. | `false` |
|
||||||
|`PMW3360_SPI_MODE` | (Optional) Sets the SPI Mode for the sensor. | `3` |
|
|`PMW3360_SPI_MODE` | (Optional) Sets the SPI Mode for the sensor. | `3` |
|
||||||
|
|
@ -157,36 +155,6 @@ The PMW 3360 is an SPI driven optical sensor, that uses a built in IR LED for su
|
||||||
|
|
||||||
The CPI range is 100-12000, in increments of 100. Defaults to 1600 CPI.
|
The CPI range is 100-12000, in increments of 100. Defaults to 1600 CPI.
|
||||||
|
|
||||||
To use multiple sensors, instead of setting `PMW3360_CS_PIN` you need to set `PMW3360_CS_PINS` and also handle and merge the read from this sensor in user code.
|
|
||||||
Note that different (per sensor) values of CPI, speed liftoff, rotational angle or flipping of X/Y is not currently supported.
|
|
||||||
|
|
||||||
```c
|
|
||||||
// in config.h:
|
|
||||||
#define PMW3360_CS_PINS { B5, B6 }
|
|
||||||
|
|
||||||
// in keyboard.c:
|
|
||||||
#ifdef POINTING_DEVICE_ENABLE
|
|
||||||
void pointing_device_init_kb(void) {
|
|
||||||
pmw3360_init(1); // index 1 is the second device.
|
|
||||||
pointing_device_set_cpi(800); // applies to both sensors
|
|
||||||
pointing_device_init_user();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Contains report from sensor #0 already, need to merge in from sensor #1
|
|
||||||
report_mouse_t pointing_device_task_kb(report_mouse_t mouse_report) {
|
|
||||||
report_pmw3360_t data = pmw3360_read_burst(1);
|
|
||||||
if (data.isOnSurface && data.isMotion) {
|
|
||||||
// From quantum/pointing_device_drivers.c
|
|
||||||
#define constrain_hid(amt) ((amt) < -127 ? -127 : ((amt) > 127 ? 127 : (amt)))
|
|
||||||
mouse_report.x = constrain_hid(mouse_report.x + data.dx);
|
|
||||||
mouse_report.y = constrain_hid(mouse_report.y + data.dy);
|
|
||||||
}
|
|
||||||
return pointing_device_task_user(mouse_report);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
### PMW 3389 Sensor
|
### PMW 3389 Sensor
|
||||||
|
|
||||||
To use the PMW 3389 sensor, add this to your `rules.mk`
|
To use the PMW 3389 sensor, add this to your `rules.mk`
|
||||||
|
|
@ -277,7 +245,7 @@ The following configuration options are only available when using `SPLIT_POINTIN
|
||||||
| `pointing_device_get_report(void)` | Returns the current mouse report (as a `mouse_report_t` data structure). |
|
| `pointing_device_get_report(void)` | Returns the current mouse report (as a `mouse_report_t` data structure). |
|
||||||
| `pointing_device_set_report(mouse_report)` | Sets the mouse report to the assigned `mouse_report_t` data structured passed to the function. |
|
| `pointing_device_set_report(mouse_report)` | Sets the mouse report to the assigned `mouse_report_t` data structured passed to the function. |
|
||||||
| `pointing_device_send(void)` | Sends the current mouse report to the host system. Function can be replaced. |
|
| `pointing_device_send(void)` | Sends the current mouse report to the host system. Function can be replaced. |
|
||||||
| `has_mouse_report_changed(new_report, old_report)` | Compares the old and new `mouse_report_t` data and returns true only if it has changed. |
|
| `has_mouse_report_changed(old, new)` | Compares the old and new `mouse_report_t` data and returns true only if it has changed. |
|
||||||
| `pointing_device_adjust_by_defines(mouse_report)` | Applies rotations and invert configurations to a raw mouse report. |
|
| `pointing_device_adjust_by_defines(mouse_report)` | Applies rotations and invert configurations to a raw mouse report. |
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -308,14 +276,14 @@ The report_mouse_t (here "mouseReport") has the following properties:
|
||||||
To manually manipulate the mouse reports outside of the `pointing_device_task_*` functions, you can use:
|
To manually manipulate the mouse reports outside of the `pointing_device_task_*` functions, you can use:
|
||||||
|
|
||||||
* `pointing_device_get_report()` - Returns the current report_mouse_t that represents the information sent to the host computer
|
* `pointing_device_get_report()` - Returns the current report_mouse_t that represents the information sent to the host computer
|
||||||
* `pointing_device_set_report(report_mouse_t mouse_report)` - Overrides and saves the report_mouse_t to be sent to the host computer
|
* `pointing_device_set_report(report_mouse_t newMouseReport)` - Overrides and saves the report_mouse_t to be sent to the host computer
|
||||||
* `pointing_device_send()` - Sends the mouse report to the host and zeroes out the report.
|
* `pointing_device_send()` - Sends the mouse report to the host and zeroes out the report.
|
||||||
|
|
||||||
When the mouse report is sent, the x, y, v, and h values are set to 0 (this is done in `pointing_device_send()`, which can be overridden to avoid this behavior). This way, button states persist, but movement will only occur once. For further customization, both `pointing_device_init` and `pointing_device_task` can be overridden.
|
When the mouse report is sent, the x, y, v, and h values are set to 0 (this is done in `pointing_device_send()`, which can be overridden to avoid this behavior). This way, button states persist, but movement will only occur once. For further customization, both `pointing_device_init` and `pointing_device_task` can be overridden.
|
||||||
|
|
||||||
Additionally, by default, `pointing_device_send()` will only send a report when the report has actually changed. This prevents it from continuously sending mouse reports, which will keep the host system awake. This behavior can be changed by creating your own `pointing_device_send()` function.
|
Additionally, by default, `pointing_device_send()` will only send a report when the report has actually changed. This prevents it from continuously sending mouse reports, which will keep the host system awake. This behavior can be changed by creating your own `pointing_device_send()` function.
|
||||||
|
|
||||||
Also, you use the `has_mouse_report_changed(new_report, old_report)` function to check to see if the report has changed.
|
Also, you use the `has_mouse_report_changed(new, old)` function to check to see if the report has changed.
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
|
|
@ -357,8 +325,7 @@ report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) {
|
||||||
if (set_scrolling) {
|
if (set_scrolling) {
|
||||||
mouse_report.h = mouse_report.x;
|
mouse_report.h = mouse_report.x;
|
||||||
mouse_report.v = mouse_report.y;
|
mouse_report.v = mouse_report.y;
|
||||||
mouse_report.x = 0;
|
mouse_report.x = mouse_report.y = 0
|
||||||
mouse_report.y = 0;
|
|
||||||
}
|
}
|
||||||
return mouse_report;
|
return mouse_report;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -171,7 +171,6 @@ Configure the hardware via your `config.h`:
|
||||||
|----------|-------------|---------|
|
|----------|-------------|---------|
|
||||||
| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
|
| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
|
||||||
| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
|
| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
|
||||||
| `ISSI_PWM_FREQUENCY` | (Optional) PWM Frequency Setting - IS31FL3737B only | 0 |
|
|
||||||
| `ISSI_SWPULLUP` | (Optional) Set the value of the SWx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
|
| `ISSI_SWPULLUP` | (Optional) Set the value of the SWx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
|
||||||
| `ISSI_CSPULLUP` | (Optional) Set the value of the CSx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
|
| `ISSI_CSPULLUP` | (Optional) Set the value of the CSx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
|
||||||
| `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | |
|
| `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | |
|
||||||
|
|
@ -520,7 +519,7 @@ All RGB keycodes are currently shared with the RGBLIGHT system:
|
||||||
|`RGB_VAD` | |Decrease value (brightness), increase value when Shift is held |
|
|`RGB_VAD` | |Decrease value (brightness), increase value when Shift is held |
|
||||||
|`RGB_SPI` | |Increase effect speed (does not support eeprom yet), decrease speed when Shift is held|
|
|`RGB_SPI` | |Increase effect speed (does not support eeprom yet), decrease speed when Shift is held|
|
||||||
|`RGB_SPD` | |Decrease effect speed (does not support eeprom yet), increase speed when Shift is held|
|
|`RGB_SPD` | |Decrease effect speed (does not support eeprom yet), increase speed when Shift is held|
|
||||||
|`RGB_MODE_PLAIN` |`RGB_M_P` |Static (no animation) mode |
|
|`RGB_MODE_PLAIN` |`RGB_M_P `|Static (no animation) mode |
|
||||||
|`RGB_MODE_BREATHE` |`RGB_M_B` |Breathing animation mode |
|
|`RGB_MODE_BREATHE` |`RGB_M_B` |Breathing animation mode |
|
||||||
|`RGB_MODE_RAINBOW` |`RGB_M_R` |Full gradient scrolling left to right (uses the `RGB_MATRIX_CYCLE_LEFT_RIGHT` mode) |
|
|`RGB_MODE_RAINBOW` |`RGB_M_R` |Full gradient scrolling left to right (uses the `RGB_MATRIX_CYCLE_LEFT_RIGHT` mode) |
|
||||||
|`RGB_MODE_SWIRL` |`RGB_M_SW`|Full gradient spinning pinwheel around center of keyboard (uses `RGB_MATRIX_CYCLE_PINWHEEL` mode) |
|
|`RGB_MODE_SWIRL` |`RGB_M_SW`|Full gradient spinning pinwheel around center of keyboard (uses `RGB_MATRIX_CYCLE_PINWHEEL` mode) |
|
||||||
|
|
@ -657,19 +656,18 @@ You can enable a single effect by defining `ENABLE_[EFFECT_NAME]` in your `confi
|
||||||
|
|
||||||
### RGB Matrix Effect Typing Heatmap :id=rgb-matrix-effect-typing-heatmap
|
### RGB Matrix Effect Typing Heatmap :id=rgb-matrix-effect-typing-heatmap
|
||||||
|
|
||||||
This effect will color the RGB matrix according to a heatmap of recently pressed keys. Whenever a key is pressed its "temperature" increases as well as that of its neighboring keys. The temperature of each key is then decreased automatically every 25 milliseconds by default.
|
This effect will color the RGB matrix according to a heatmap of recently pressed
|
||||||
|
keys. Whenever a key is pressed its "temperature" increases as well as that of
|
||||||
|
its neighboring keys. The temperature of each key is then decreased
|
||||||
|
automatically every 25 milliseconds by default.
|
||||||
|
|
||||||
In order to change the delay of temperature decrease define `RGB_MATRIX_TYPING_HEATMAP_DECREASE_DELAY_MS`:
|
In order to change the delay of temperature decrease define
|
||||||
|
`RGB_MATRIX_TYPING_HEATMAP_DECREASE_DELAY_MS`:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
#define RGB_MATRIX_TYPING_HEATMAP_DECREASE_DELAY_MS 50
|
#define RGB_MATRIX_TYPING_HEATMAP_DECREASE_DELAY_MS 50
|
||||||
```
|
```
|
||||||
|
|
||||||
Heatmap effect may not light up the correct adjacent LEDs for certain key matrix layout such as split keyboards. The following define will limit the effect to pressed keys only:
|
|
||||||
```c
|
|
||||||
#define RGB_MATRIX_TYPING_HEATMAP_SLIM
|
|
||||||
```
|
|
||||||
|
|
||||||
## Custom RGB Matrix Effects :id=custom-rgb-matrix-effects
|
## Custom RGB Matrix Effects :id=custom-rgb-matrix-effects
|
||||||
|
|
||||||
By setting `RGB_MATRIX_CUSTOM_USER = yes` in `rules.mk`, new effects can be defined directly from your keymap or userspace, without having to edit any QMK core files. To declare new effects, create a `rgb_matrix_user.inc` file in the user keymap directory or userspace folder.
|
By setting `RGB_MATRIX_CUSTOM_USER = yes` in `rules.mk`, new effects can be defined directly from your keymap or userspace, without having to edit any QMK core files. To declare new effects, create a `rgb_matrix_user.inc` file in the user keymap directory or userspace folder.
|
||||||
|
|
@ -777,7 +775,6 @@ These are defined in [`color.h`](https://github.com/qmk/qmk_firmware/blob/master
|
||||||
#define RGB_MATRIX_DISABLE_KEYCODES // disables control of rgb matrix by keycodes (must use code functions to control the feature)
|
#define RGB_MATRIX_DISABLE_KEYCODES // disables control of rgb matrix by keycodes (must use code functions to control the feature)
|
||||||
#define RGB_MATRIX_SPLIT { X, Y } // (Optional) For split keyboards, the number of LEDs connected on each half. X = left, Y = Right.
|
#define RGB_MATRIX_SPLIT { X, Y } // (Optional) For split keyboards, the number of LEDs connected on each half. X = left, Y = Right.
|
||||||
// If RGB_MATRIX_KEYPRESSES or RGB_MATRIX_KEYRELEASES is enabled, you also will want to enable SPLIT_TRANSPORT_MIRROR
|
// If RGB_MATRIX_KEYPRESSES or RGB_MATRIX_KEYRELEASES is enabled, you also will want to enable SPLIT_TRANSPORT_MIRROR
|
||||||
#define RGB_TRIGGER_ON_KEYDOWN // Triggers RGB keypress events on key down. This makes RGB control feel more responsive. This may cause RGB to not function properly on some boards
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## EEPROM storage :id=eeprom-storage
|
## EEPROM storage :id=eeprom-storage
|
||||||
|
|
|
||||||
|
|
@ -326,19 +326,6 @@ void post_process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
```
|
```
|
||||||
would turn the layer 0 (or 1) on and off again three times when `DEBUG` is pressed.
|
would turn the layer 0 (or 1) on and off again three times when `DEBUG` is pressed.
|
||||||
|
|
||||||
Blinking accumulates layers so if multiple layers are set blinking at the same time they will all blink for the duration and repeat times of the last layer to be blinked.
|
|
||||||
To stop these other layers from blinking use `rgblight_unblink_layer` or `rgblight_unblink_all_but_layer`:
|
|
||||||
|
|
||||||
```c
|
|
||||||
rgblight_blink_layer(1, 500);
|
|
||||||
rgblight_unblink_all_but_layer(1);
|
|
||||||
```
|
|
||||||
|
|
||||||
```c
|
|
||||||
rgblight_unblink_layer(3);
|
|
||||||
rgblight_blink_layer(2, 500);
|
|
||||||
```
|
|
||||||
|
|
||||||
!> Lighting layers on split keyboards will require layer state synced to the slave half (e.g. `#define SPLIT_LAYER_STATE_ENABLE`). See [data sync options](feature_split_keyboard.md#data-sync-options) for more details.
|
!> Lighting layers on split keyboards will require layer state synced to the slave half (e.g. `#define SPLIT_LAYER_STATE_ENABLE`). See [data sync options](feature_split_keyboard.md#data-sync-options) for more details.
|
||||||
|
|
||||||
### Overriding RGB Lighting on/off status
|
### Overriding RGB Lighting on/off status
|
||||||
|
|
|
||||||
|
|
@ -1,54 +0,0 @@
|
||||||
# Secure
|
|
||||||
|
|
||||||
The secure feature aims to prevent unwanted interaction without user intervention.
|
|
||||||
|
|
||||||
?> Secure does **not** currently implement encryption/decryption/etc and should not be a replacement where a strong hardware/software based solution is required.
|
|
||||||
|
|
||||||
### Unlock sequence
|
|
||||||
|
|
||||||
To unlock, the user must perform a set of actions. This can optionally be configured to be multiple keys.
|
|
||||||
|
|
||||||
* While unlocking all keyboard input is ignored
|
|
||||||
* Incorrect attempts will revert back to the previously locked state
|
|
||||||
|
|
||||||
### Automatic Locking
|
|
||||||
|
|
||||||
Once unlocked, the keyboard will revert back to a locked state after the configured timeout.
|
|
||||||
The timeout can be refreshed by using the `secure_activity_event` function, for example from one of the various [hooks](custom_quantum_functions.md).
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
Add the following to your `rules.mk`:
|
|
||||||
|
|
||||||
```make
|
|
||||||
SECURE_ENABLE = yes
|
|
||||||
```
|
|
||||||
|
|
||||||
## Keycodes
|
|
||||||
|
|
||||||
| Key | Description |
|
|
||||||
|------------------|--------------------------------------------------------------------------------|
|
|
||||||
| `SECURE_LOCK` | Revert back to a locked state |
|
|
||||||
| `SECURE_UNLOCK` | Forces unlock without performing a unlock sequence |
|
|
||||||
| `SECURE_TOGGLE` | Toggle directly between locked and unlock without performing a unlock sequence |
|
|
||||||
| `SECURE_REQUEST` | Request that user perform the unlock sequence |
|
|
||||||
|
|
||||||
## Configuration
|
|
||||||
|
|
||||||
| Define | Default | Description |
|
|
||||||
|-------------------------|----------------|---------------------------------------------------------------------------------|
|
|
||||||
|`SECURE_UNLOCK_TIMEOUT` | `5000` | Timeout for the user to perform the configured unlock sequence - `0` to disable |
|
|
||||||
|`SECURE_IDLE_TIMEOUT` | `60000` | Timeout while unlocked before returning to locked - `0` to disable |
|
|
||||||
|`SECURE_UNLOCK_SEQUENCE` | `{ { 0, 0 } }` | Array of matrix locations describing a sequential sequence of keypresses |
|
|
||||||
|
|
||||||
## Functions
|
|
||||||
|
|
||||||
| Function | Description |
|
|
||||||
|---------------------------|----------------------------------------------------------------------------|
|
|
||||||
| `secure_is_locked()` | Check if the device is currently locked |
|
|
||||||
| `secure_is_unlocking()` | Check if an unlock sequence is currently in progress |
|
|
||||||
| `secure_is_unlocked()` | Check if the device is currently unlocked |
|
|
||||||
| `secure_lock()` | Lock down the device |
|
|
||||||
| `secure_unlock()` | Force unlock the device - bypasses user unlock sequence |
|
|
||||||
| `secure_request_unlock()` | Begin listening for an unlock sequence |
|
|
||||||
| `secure_activity_event()` | Flag that user activity has happened and the device should remain unlocked |
|
|
||||||
|
|
@ -10,8 +10,6 @@ For this, we will mostly be talking about the generic implementation used by the
|
||||||
|
|
||||||
!> ARM split supports most QMK subsystems when using the 'serial' and 'serial_usart' drivers. I2C slave is currently unsupported.
|
!> ARM split supports most QMK subsystems when using the 'serial' and 'serial_usart' drivers. I2C slave is currently unsupported.
|
||||||
|
|
||||||
!> Both sides must use the same MCU family, for eg two Pro Micro-compatible controllers or two Blackpills. Currently, mixing AVR and ARM is not possible as ARM vs AVR uses different method for serial communication, and are not compatible. Moreover Blackpill's uses 3.3v logic, and atmega32u4 uses 5v logic.
|
|
||||||
|
|
||||||
## Compatibility Overview
|
## Compatibility Overview
|
||||||
|
|
||||||
| Transport | AVR | ARM |
|
| Transport | AVR | ARM |
|
||||||
|
|
|
||||||
|
|
@ -115,8 +115,8 @@ As defined in `keymap_steno.h`.
|
||||||
|`STN_E`|`STN_E`| `E` vowel|
|
|`STN_E`|`STN_E`| `E` vowel|
|
||||||
|`STN_U`|`STN_U`| `U` vowel|
|
|`STN_U`|`STN_U`| `U` vowel|
|
||||||
|`STN_FR`|`STN_FR`| `-F`|
|
|`STN_FR`|`STN_FR`| `-F`|
|
||||||
|`STN_RR`|`STN_RR`| `-R`|
|
|
||||||
|`STN_PR`|`STN_PR`| `-P`|
|
|`STN_PR`|`STN_PR`| `-P`|
|
||||||
|
|`STN_RR`|`STN_RR`| `-R`|
|
||||||
|`STN_BR`|`STN_BR`| `-B`|
|
|`STN_BR`|`STN_BR`| `-B`|
|
||||||
|`STN_LR`|`STN_LR`| `-L`|
|
|`STN_LR`|`STN_LR`| `-L`|
|
||||||
|`STN_GR`|`STN_GR`| `-G`|
|
|`STN_GR`|`STN_GR`| `-G`|
|
||||||
|
|
|
||||||
|
|
@ -31,16 +31,3 @@ Note that the array indices are reversed same as the matrix and the values are o
|
||||||
|`SH_OS` |One shot swap hands: toggles while pressed or until next key press. |
|
|`SH_OS` |One shot swap hands: toggles while pressed or until next key press. |
|
||||||
|
|
||||||
`SH_TT` swap-hands tap-toggle key is similar to [layer tap-toggle](feature_layers.md?id=switching-and-toggling-layers). Tapping repeatedly (5 taps by default) will toggle swap-hands on or off, like `SH_TG`. Tap-toggle count can be changed by defining a value for `TAPPING_TOGGLE`.
|
`SH_TT` swap-hands tap-toggle key is similar to [layer tap-toggle](feature_layers.md?id=switching-and-toggling-layers). Tapping repeatedly (5 taps by default) will toggle swap-hands on or off, like `SH_TG`. Tap-toggle count can be changed by defining a value for `TAPPING_TOGGLE`.
|
||||||
|
|
||||||
## Encoder Mapping
|
|
||||||
|
|
||||||
When using an encoder mapping, it's also able to handle swapping encoders between sides, too.
|
|
||||||
|
|
||||||
Encoder indexes are defined as left-to-right, and the extent of the array needs to match the number of encoders on the keyboard.
|
|
||||||
|
|
||||||
As an example, if a split keyboard has a single encoder per side, you can swap the order by using the following code in your keymap:
|
|
||||||
```c
|
|
||||||
#if defined(SWAP_HANDS_ENABLE) && defined(ENCODER_MAP_ENABLE)
|
|
||||||
const uint8_t PROGMEM encoder_hand_swap_config[NUM_ENCODERS] = { 1, 0 };
|
|
||||||
#endif
|
|
||||||
```
|
|
||||||
|
|
|
||||||
|
|
@ -230,6 +230,17 @@ send_unicode_string("(ノಠ痊ಠ)ノ彡┻━┻");
|
||||||
|
|
||||||
Example uses include sending Unicode strings when a key is pressed, as described in [Macros](feature_macros.md).
|
Example uses include sending Unicode strings when a key is pressed, as described in [Macros](feature_macros.md).
|
||||||
|
|
||||||
|
### `send_unicode_hex_string()` (Deprecated)
|
||||||
|
|
||||||
|
Similar to `send_unicode_string()`, but the characters are represented by their Unicode code points, written in hexadecimal and separated by spaces. For example, the table flip above would be achieved with:
|
||||||
|
|
||||||
|
```c
|
||||||
|
send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B");
|
||||||
|
```
|
||||||
|
|
||||||
|
An easy way to convert your Unicode string to this format is to use [this site](https://r12a.github.io/app-conversion/) and take the result in the "Hex/UTF-32" section.
|
||||||
|
|
||||||
|
|
||||||
## Additional Language Support
|
## Additional Language Support
|
||||||
|
|
||||||
In `quantum/keymap_extras`, you'll see various language files — these work the same way as the ones for alternative layouts such as Colemak or BÉPO. When you include one of these language headers, you gain access to keycodes specific to that language / national layout. Such keycodes are defined by a 2-letter country/language code, followed by an underscore and a 4-letter abbreviation of the character to which the key corresponds. For example, including `keymap_french.h` and using `FR_UGRV` in your keymap will output `ù` when typed on a system with a native French AZERTY layout.
|
In `quantum/keymap_extras`, you'll see various language files — these work the same way as the ones for alternative layouts such as Colemak or BÉPO. When you include one of these language headers, you gain access to keycodes specific to that language / national layout. Such keycodes are defined by a 2-letter country/language code, followed by an underscore and a 4-letter abbreviation of the character to which the key corresponds. For example, including `keymap_french.h` and using `FR_UGRV` in your keymap will output `ù` when typed on a system with a native French AZERTY layout.
|
||||||
|
|
|
||||||
|
|
@ -266,7 +266,7 @@ Flashing sequence:
|
||||||
### `make` Targets
|
### `make` Targets
|
||||||
|
|
||||||
* `:dfu-util`: Waits until an STM32 bootloader device is available, and then flashes the firmware.
|
* `:dfu-util`: Waits until an STM32 bootloader device is available, and then flashes the firmware.
|
||||||
* `:dfu-util-split-left` and `:dfu-util-split-right`: Flashes the firmware as with `:dfu-util`, but also sets the handedness setting in EEPROM. This is ideal for Proton-C-based split keyboards.
|
* `:dfu-util-split-left` and `:dfu-util-split-right`: Flashes the firmware as with `:avrdude`, but also sets the handedness setting in EEPROM. This is ideal for Proton-C-based split keyboards.
|
||||||
* `:st-link-cli`: Allows you to flash the firmware via the ST-Link CLI utility, rather than dfu-util. Requires an ST-Link dongle.
|
* `:st-link-cli`: Allows you to flash the firmware via the ST-Link CLI utility, rather than dfu-util. Requires an ST-Link dongle.
|
||||||
* `:st-flash`: Allows you to flash the firmware via the `st-flash` utility from [STLink Tools](https://github.com/stlink-org/stlink), rather than dfu-util. Requires an ST-Link dongle.
|
* `:st-flash`: Allows you to flash the firmware via the `st-flash` utility from [STLink Tools](https://github.com/stlink-org/stlink), rather than dfu-util. Requires an ST-Link dongle.
|
||||||
|
|
||||||
|
|
@ -347,14 +347,3 @@ Flashing sequence:
|
||||||
2. Wait for the OS to detect the device
|
2. Wait for the OS to detect the device
|
||||||
3. Copy the .uf2 file to the new USB disk
|
3. Copy the .uf2 file to the new USB disk
|
||||||
4. Wait for the keyboard to become available
|
4. Wait for the keyboard to become available
|
||||||
|
|
||||||
or
|
|
||||||
|
|
||||||
CLI Flashing sequence:
|
|
||||||
|
|
||||||
1. Enter the bootloader using any of the following methods:
|
|
||||||
* Tap the `RESET` keycode
|
|
||||||
* Double-tap the `nRST` button on the PCB.
|
|
||||||
2. Wait for the OS to detect the device
|
|
||||||
3. Flash via QMK CLI eg. `qmk flash --keyboard handwired/onekey/blackpill_f411_tinyuf2 --keymap default`
|
|
||||||
4. Wait for the keyboard to become available
|
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@ USB for a given key.
|
||||||
|
|
||||||
## 3. What the Event Input/Kernel Does
|
## 3. What the Event Input/Kernel Does
|
||||||
|
|
||||||
The *scancode* is mapped to a *keycode* dependent on the keyboard [60-keyboard.hwdb at Main](https://github.com/systemd/systemd/blob/main/hwdb.d/60-keyboard.hwdb). Without this mapping, the operating system will not receive a valid keycode and will be unable to do anything useful with that key press.
|
The *scancode* is mapped to a *keycode* dependent on the keyboard [60-keyboard.hwdb at Master](https://github.com/systemd/systemd/blob/master/hwdb.d/60-keyboard.hwdb). Without this mapping, the operating system will not receive a valid keycode and will be unable to do anything useful with that key press.
|
||||||
|
|
||||||
## 4. What the Operating System Does
|
## 4. What the Operating System Does
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -166,7 +166,7 @@ Send multiple bytes to the selected I2C device.
|
||||||
|
|
||||||
### `i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout)`
|
### `i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout)`
|
||||||
|
|
||||||
Receive multiple bytes from the selected I2C device.
|
Receive multiple bytes from the selected SPI device.
|
||||||
|
|
||||||
#### Arguments
|
#### Arguments
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@
|
||||||
<meta name="twitter:card" content="summary_large_image">
|
<meta name="twitter:card" content="summary_large_image">
|
||||||
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/buble.css" title="light">
|
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/buble.css" title="light">
|
||||||
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/dark.css" media="(prefers-color-scheme: dark)">
|
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/dark.css" media="(prefers-color-scheme: dark)">
|
||||||
<link rel="stylesheet" href="//unpkg.com/docsify-toc@1.1.0/dist/toc.css">
|
<link rel="stylesheet" href="//unpkg.com/docsify-toc@1.0.0/dist/toc.css">
|
||||||
<link rel="stylesheet" href="qmk_custom_light.css">
|
<link rel="stylesheet" href="qmk_custom_light.css">
|
||||||
<link rel="stylesheet" href="qmk_custom_dark.css" media="(prefers-color-scheme: dark)">
|
<link rel="stylesheet" href="qmk_custom_dark.css" media="(prefers-color-scheme: dark)">
|
||||||
</head>
|
</head>
|
||||||
|
|
@ -130,7 +130,7 @@
|
||||||
<script src="//unpkg.com/docsify/lib/plugins/emoji.min.js"></script>
|
<script src="//unpkg.com/docsify/lib/plugins/emoji.min.js"></script>
|
||||||
<script src="//unpkg.com/docsify-tabs@1"></script>
|
<script src="//unpkg.com/docsify-tabs@1"></script>
|
||||||
<script src="//unpkg.com/docsify-copy-code@2"></script>
|
<script src="//unpkg.com/docsify-copy-code@2"></script>
|
||||||
<script src="//unpkg.com/docsify-toc@1.1.0/dist/toc.js"></script>
|
<script src="//unpkg.com/docsify-toc@1.0.0/dist/toc.js"></script>
|
||||||
<script src="//unpkg.com/prismjs/components/prism-bash.min.js"></script>
|
<script src="//unpkg.com/prismjs/components/prism-bash.min.js"></script>
|
||||||
<script src="//unpkg.com/prismjs/components/prism-c.min.js"></script>
|
<script src="//unpkg.com/prismjs/components/prism-c.min.js"></script>
|
||||||
<script src="//unpkg.com/prismjs/components/prism-cpp.min.js"></script>
|
<script src="//unpkg.com/prismjs/components/prism-cpp.min.js"></script>
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ In order to flash a microcontroller over USB, it needs something called a bootlo
|
||||||
|
|
||||||
However, it can sometimes happen that the bootloader becomes corrupted and needs reflashing, or you may want to change the bootloader to another one. It's not possible to do this with the existing bootloader, because, of course, it is already running, and cannot overwrite itself. Instead, you will need to ISP flash the microcontroller.
|
However, it can sometimes happen that the bootloader becomes corrupted and needs reflashing, or you may want to change the bootloader to another one. It's not possible to do this with the existing bootloader, because, of course, it is already running, and cannot overwrite itself. Instead, you will need to ISP flash the microcontroller.
|
||||||
|
|
||||||
There are several different kinds of bootloaders available for AVR microcontrollers. Most STM32 ARM-based microcontrollers already have a USB-capable bootloader in ROM, so generally do not need to be ISP flashed. The one current exception is the [STM32F103](#flashing-stm32duino-bootloader).
|
There are several different kinds of bootloaders available for AVR microcontrollers. Most STM32 ARM-based microcontrollers already have a USB-capable bootloader in ROM, so generally do not need to be ISP flashed.
|
||||||
|
|
||||||
## Hardware
|
## Hardware
|
||||||
|
|
||||||
|
|
@ -260,93 +260,3 @@ For mass production purposes, it is possible to join the bootloader and QMK firm
|
||||||
4. Save it as a new file, for example `<keyboard>_<keymap>_production.hex`.
|
4. Save it as a new file, for example `<keyboard>_<keymap>_production.hex`.
|
||||||
|
|
||||||
You can then ISP flash this combined firmware instead, which allows you to skip the extra step of flashing the QMK firmware over USB.
|
You can then ISP flash this combined firmware instead, which allows you to skip the extra step of flashing the QMK firmware over USB.
|
||||||
|
|
||||||
## Flashing STM32Duino Bootloader
|
|
||||||
|
|
||||||
As mentioned above, *most* supported STM32 devices already possess a USB DFU bootloader which cannot be overwritten, however the ROM bootloader in the STM32F103 used on the Bluepill is not USB capable. In this case an ST-Link V2 dongle is required to upload the STM32Duino bootloader to the device. These can be readily purchased for relatively cheap on eBay and other places.
|
|
||||||
|
|
||||||
This bootloader is a descendant of the Maple bootloader by Leaflabs, and is compatible with dfu-util.
|
|
||||||
|
|
||||||
### Software
|
|
||||||
|
|
||||||
To communicate with the ST-Link, you must install the following packages:
|
|
||||||
|
|
||||||
* **macOS:** `brew install stlink openocd`
|
|
||||||
* **Windows (MSYS2):** `pacman -S mingw-w64-x86_64-stlink mingw-w64-x86_64-openocd`
|
|
||||||
* **Linux:** will vary by distribution, but will likely be `stlink` and `openocd` through your particular package manager
|
|
||||||
|
|
||||||
Additionally, you may need to update the ST-Link's firmware with the [`STSW-LINK007`](https://www.st.com/en/development-tools/stsw-link007.html) application. Note you will be asked to provide your name and email address if you do not have an ST.com account (this does not create one).
|
|
||||||
|
|
||||||
Finally, the bootloader binary itself can be downloaded from [here](https://github.com/rogerclarkmelbourne/STM32duino-bootloader/blob/master/bootloader_only_binaries/generic_boot20_pc13.bin).
|
|
||||||
|
|
||||||
### Wiring
|
|
||||||
|
|
||||||
Connect the four-pin header on the end of the Bluepill to the matching pins on the ST-Link (the pinout will usually be printed on the side):
|
|
||||||
|
|
||||||
|ST-Link |Bluepill|
|
|
||||||
|-------------|--------|
|
|
||||||
|`GND` (6) |`GND` |
|
|
||||||
|`SWCLK` (2) |`DCLK` |
|
|
||||||
|`SWDIO` (4) |`DIO` |
|
|
||||||
|`3.3V` (8) |`3.3` |
|
|
||||||
|
|
||||||
### Flashing
|
|
||||||
|
|
||||||
Firstly, make sure both jumpers on the Bluepill are set to 0.
|
|
||||||
|
|
||||||
Check that the ST-Link can talk to the Bluepill by running `st-info --probe`:
|
|
||||||
|
|
||||||
```
|
|
||||||
Found 1 stlink programmers
|
|
||||||
version: V2J37S7
|
|
||||||
serial: 2C1219002B135937334D4E00
|
|
||||||
flash: 65536 (pagesize: 1024)
|
|
||||||
sram: 20480
|
|
||||||
chipid: 0x0410
|
|
||||||
descr: F1xx Medium-density
|
|
||||||
```
|
|
||||||
|
|
||||||
If the reported `chipid` is `0x0410`, everything is working. If it is `0x0000`, check your wiring, and try swapping the `SWDIO` and `SWCLK` pins, as some ST-Link dongles may have incorrect pinouts.
|
|
||||||
|
|
||||||
Next, run the following command:
|
|
||||||
|
|
||||||
```
|
|
||||||
st-flash --reset --format binary write <path-to-bootloader> 0x08000000
|
|
||||||
```
|
|
||||||
|
|
||||||
where `<path-to-bootloader>` is the path to the bootloader `.bin` file above. You can run this command from the directory you downloaded it to, so that you can simply pass in the filename.
|
|
||||||
|
|
||||||
If all goes well, you should get output similar to the following:
|
|
||||||
|
|
||||||
```
|
|
||||||
st-flash 1.7.0
|
|
||||||
2022-03-08T12:16:30 INFO common.c: F1xx Medium-density: 20 KiB SRAM, 64 KiB flash in at least 1 KiB pages.
|
|
||||||
file generic_boot20_pc13.bin md5 checksum: 333c30605e739ce9bedee5999fdaf81b, stlink checksum: 0x0008e534
|
|
||||||
2022-03-08T12:16:30 INFO common.c: Attempting to write 7172 (0x1c04) bytes to stm32 address: 134217728 (0x8000000)
|
|
||||||
2022-03-08T12:16:30 INFO common.c: Flash page at addr: 0x08000000 erased
|
|
||||||
2022-03-08T12:16:30 INFO common.c: Flash page at addr: 0x08000400 erased
|
|
||||||
2022-03-08T12:16:31 INFO common.c: Flash page at addr: 0x08000800 erased
|
|
||||||
2022-03-08T12:16:31 INFO common.c: Flash page at addr: 0x08000c00 erased
|
|
||||||
2022-03-08T12:16:31 INFO common.c: Flash page at addr: 0x08001000 erased
|
|
||||||
2022-03-08T12:16:31 INFO common.c: Flash page at addr: 0x08001400 erased
|
|
||||||
2022-03-08T12:16:31 INFO common.c: Flash page at addr: 0x08001800 erased
|
|
||||||
2022-03-08T12:16:31 INFO common.c: Flash page at addr: 0x08001c00 erased
|
|
||||||
2022-03-08T12:16:31 INFO common.c: Finished erasing 8 pages of 1024 (0x400) bytes
|
|
||||||
2022-03-08T12:16:31 INFO common.c: Starting Flash write for VL/F0/F3/F1_XL
|
|
||||||
2022-03-08T12:16:31 INFO flash_loader.c: Successfully loaded flash loader in sram
|
|
||||||
2022-03-08T12:16:31 INFO flash_loader.c: Clear DFSR
|
|
||||||
8/ 8 pages written
|
|
||||||
2022-03-08T12:16:31 INFO common.c: Starting verification of write complete
|
|
||||||
2022-03-08T12:16:31 INFO common.c: Flash written and verified! jolly good!
|
|
||||||
2022-03-08T12:16:31 WARN common.c: NRST is not connected
|
|
||||||
```
|
|
||||||
|
|
||||||
Otherwise, if you receive an `Unknown memory region` error, run the following command to unlock the STM32F103:
|
|
||||||
|
|
||||||
```
|
|
||||||
openocd -f interface/stlink.cfg -f target/stm32f1x.cfg -c "init; reset halt; stm32f1x unlock 0; reset halt; exit"
|
|
||||||
```
|
|
||||||
|
|
||||||
Then re-plug the ST-Link and try again.
|
|
||||||
|
|
||||||
After all of this, unplug the Bluepill from the ST-Link and connect it to USB. It should now be ready to flash using dfu-util, the QMK CLI or Toolbox.
|
|
||||||
|
|
|
||||||
|
|
@ -137,7 +137,7 @@
|
||||||
* [EEPROM ドライバ](ja/eeprom_driver.md)
|
* [EEPROM ドライバ](ja/eeprom_driver.md)
|
||||||
* [シリアル ドライバ](ja/serial_driver.md)
|
* [シリアル ドライバ](ja/serial_driver.md)
|
||||||
* [UART ドライバ](ja/uart_driver.md)
|
* [UART ドライバ](ja/uart_driver.md)
|
||||||
* [GPIO 制御](ja/gpio_control.md)
|
* [GPIO 制御](ja/internals_gpio_control.md)
|
||||||
* [キーボード ガイドライン](ja/hardware_keyboard_guidelines.md)
|
* [キーボード ガイドライン](ja/hardware_keyboard_guidelines.md)
|
||||||
|
|
||||||
* Python 開発
|
* Python 開発
|
||||||
|
|
@ -173,10 +173,10 @@
|
||||||
* [QMK を理解する](ja/understanding_qmk.md)
|
* [QMK を理解する](ja/understanding_qmk.md)
|
||||||
|
|
||||||
* QMK の内部詳細(作成中)
|
* QMK の内部詳細(作成中)
|
||||||
* [定義](ja/internals/defines.md)
|
* [定義](ja/internals_defines.md)
|
||||||
* [入力コールバック登録](ja/internals/input_callback_reg.md)
|
* [入力コールバック登録](ja/internals_input_callback_reg.md)
|
||||||
* [Midi デバイス](ja/internals/midi_device.md)
|
* [Midi デバイス](ja/internals_midi_device.md)
|
||||||
* [Midi デバイスのセットアップ手順](ja/internals/midi_device_setup_process.md)
|
* [Midi デバイスのセットアップ手順](ja/internals_midi_device_setup_process.md)
|
||||||
* [Midi ユーティリティ](ja/internals/midi_util.md)
|
* [Midi ユーティリティ](ja/internals_midi_util.md)
|
||||||
* [Midi 送信関数](ja/internals/send_functions.md)
|
* [Midi 送信関数](ja/internals_send_functions.md)
|
||||||
* [Sysex Tools](ja/internals/sysex_tools.md)
|
* [Sysex Tools](ja/internals_sysex_tools.md)
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ POINTING_DEVICE_ENABLE = yes
|
||||||
マウスレポートを操作するために、以下の関数を使うことができます:
|
マウスレポートを操作するために、以下の関数を使うことができます:
|
||||||
|
|
||||||
* `pointing_device_get_report()` - ホストコンピュータに送信された情報を表す現在の report_mouse_t を返します。
|
* `pointing_device_get_report()` - ホストコンピュータに送信された情報を表す現在の report_mouse_t を返します。
|
||||||
* `pointing_device_set_report(report_mouse_t mouse_report)` - ホストコンピュータに送信される report_mouse_t を上書き保存します。
|
* `pointing_device_set_report(report_mouse_t newMouseReport)` - ホストコンピュータに送信される report_mouse_t を上書き保存します。
|
||||||
|
|
||||||
report_mouse_t (ここでは "mouseReport") が以下のプロパティを持つことを覚えておいてください:
|
report_mouse_t (ここでは "mouseReport") が以下のプロパティを持つことを覚えておいてください:
|
||||||
|
|
||||||
|
|
@ -34,7 +34,7 @@ report_mouse_t (ここでは "mouseReport") が以下のプロパティを持つ
|
||||||
|
|
||||||
さらに、デフォルトでは、`pointing_device_send()` はレポートが実際に変更された場合のみレポートを送信します。これにより、マウスレポートが継続的に送信されてホストシステムが起動されたままになることを防ぎます。この動作は、独自の `pointing_device_send()` 関数を作成することで変更できます。
|
さらに、デフォルトでは、`pointing_device_send()` はレポートが実際に変更された場合のみレポートを送信します。これにより、マウスレポートが継続的に送信されてホストシステムが起動されたままになることを防ぎます。この動作は、独自の `pointing_device_send()` 関数を作成することで変更できます。
|
||||||
|
|
||||||
また、`has_mouse_report_changed(new_report, old_report)` 関数を使って、レポートが変更されたかどうかを確認できます。(訳注:独自の `pointing_device_send()` 関数を作成する場合でも、その中で `has_mouse_report_changed(new_report, old_report)` 関数でチェックして、デフォルトの `pointing_device_send()` と類似の無駄なレポートの抑制をして、ホストシステムがスリープ状態に入れる余地を残すようにしておくのが良いでしょう。)
|
また、`has_mouse_report_changed(new, old)` 関数を使って、レポートが変更されたかどうかを確認できます。(訳注:独自の `pointing_device_send()` 関数を作成する場合でも、その中で `has_mouse_report_changed(new, old)` 関数でチェックして、デフォルトの `pointing_device_send()` と類似の無駄なレポートの抑制をして、ホストシステムがスリープ状態に入れる余地を残すようにしておくのが良いでしょう。)
|
||||||
|
|
||||||
以下の例では、カスタムキーを使ってマウスをクリックし垂直および水平方向に127単位スクロールし、リリースされた時にそれを全て元に戻します - なぜならこれは完全に便利な機能だからです。いいですか、以下はひとつの例です:
|
以下の例では、カスタムキーを使ってマウスをクリックし垂直および水平方向に127単位スクロールし、リリースされた時にそれを全て元に戻します - なぜならこれは完全に便利な機能だからです。いいですか、以下はひとつの例です:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -233,6 +233,17 @@ send_unicode_string("(ノಠ痊ಠ)ノ彡┻━┻");
|
||||||
|
|
||||||
使用例には、[Macros](ja/feature_macros.md) で説明されているように、キーが押された時に Unicode 文字列を送信することが含まれます。
|
使用例には、[Macros](ja/feature_macros.md) で説明されているように、キーが押された時に Unicode 文字列を送信することが含まれます。
|
||||||
|
|
||||||
|
### `send_unicode_hex_string()`
|
||||||
|
|
||||||
|
`send_unicode_string()` に似ていますが、文字は Unicode コードポイントで表され、16進数で記述され、空白で区切られています。例えば、上記のちゃぶ台返しは以下で表されます:
|
||||||
|
|
||||||
|
```c
|
||||||
|
send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B");
|
||||||
|
```
|
||||||
|
|
||||||
|
[このサイト](https://r12a.github.io/app-conversion/)で結果を "Hex/UTF-32" で受け取ることで、Unicode 文字列をこの形式に簡単に変換できます。
|
||||||
|
|
||||||
|
|
||||||
## 追加の言語サポート
|
## 追加の言語サポート
|
||||||
|
|
||||||
`quantum/keymap_extras` には、様々な言語ファイルがあります — これらは Colemak または BÉPO のような代替レイアウトのファイルと同じように動作します。これらの言語ヘッダのいずれかを `#include` すると、その言語/国のレイアウトに固有のキーコードにアクセスできます。このようなキーコードは、2文字の国/言語コードの後に、アンダースコアとキーが対応する4文字の略語が続くことで定義されます。例えば、キーマップに `keymap_french.h` を含め、`FR_UGRV` を使うと、ネイティブのフランス語 AZERTY レイアウトを使うシステムで入力すると、`ù` が出力されます。
|
`quantum/keymap_extras` には、様々な言語ファイルがあります — これらは Colemak または BÉPO のような代替レイアウトのファイルと同じように動作します。これらの言語ヘッダのいずれかを `#include` すると、その言語/国のレイアウトに固有のキーコードにアクセスできます。このようなキーコードは、2文字の国/言語コードの後に、アンダースコアとキーが対応する4文字の略語が続くことで定義されます。例えば、キーマップに `keymap_french.h` を含め、`FR_UGRV` を使うと、ネイティブのフランス語 AZERTY レイアウトを使うシステムで入力すると、`ù` が出力されます。
|
||||||
|
|
|
||||||
|
|
@ -1,47 +0,0 @@
|
||||||
# GPIO 制御 :id=gpio-control
|
|
||||||
|
|
||||||
<!---
|
|
||||||
original document: 0.13.15:docs/gpio_control.md
|
|
||||||
git diff 0.13.15 HEAD -- docs/gpio_control.md | cat
|
|
||||||
-->
|
|
||||||
|
|
||||||
QMK には、マイクロコントローラに依存しない GPIO 制御抽象レイヤーがあります。これは異なるプラットフォーム間でピン制御に簡単にアクセスできるようにするためのものです。
|
|
||||||
|
|
||||||
## 関数 :id=functions
|
|
||||||
|
|
||||||
以下の関数は GPIO の基本的な制御を提供し、`quantum/quantum.h` にあります。
|
|
||||||
|
|
||||||
| 関数 | 説明 | 古い AVR の例 | 古い ChibiOS/ARM の例 |
|
|
||||||
|------------------------|--------------------------------------------------|-------------------------------------------------|-------------------------------------------------|
|
|
||||||
| `setPinInput(pin)` | ピンを高インピーダンス(High-Z)の入力として設定 | `DDRB &= ~(1<<2)` | `palSetLineMode(pin, PAL_MODE_INPUT)` |
|
|
||||||
| `setPinInputHigh(pin)` | ピンを組み込みのプルアップ抵抗付きの入力として設定 | `DDRB &= ~(1<<2); PORTB \|= (1<<2)` | `palSetLineMode(pin, PAL_MODE_INPUT_PULLUP)` |
|
|
||||||
| `setPinInputLow(pin)` | ピンを組み込みのプルダウン抵抗付きの入力として設定 | N/A (AVR ではサポートされません) | `palSetLineMode(pin, PAL_MODE_INPUT_PULLDOWN)` |
|
|
||||||
| `setPinOutput(pin)` | ピンを出力として設定 | `DDRB \|= (1<<2)` | `palSetLineMode(pin, PAL_MODE_OUTPUT_PUSHPULL)` |
|
|
||||||
| `writePinHigh(pin)` | ピンレベルを high に設定 (ピンを出力として設定してあると仮定) | `PORTB \|= (1<<2)` | `palSetLine(pin)` |
|
|
||||||
| `writePinLow(pin)` | ピンレベルを low に設定 (ピンを出力として設定してあると仮定) | `PORTB &= ~(1<<2)` | `palClearLine(pin)` |
|
|
||||||
| `writePin(pin, level)` | ピンレベルを設定 (ピンを出力として設定してあると仮定) | `(level) ? PORTB \|= (1<<2) : PORTB &= ~(1<<2)` | `(level) ? palSetLine(pin) : palClearLine(pin)` |
|
|
||||||
| `readPin(pin)` | ピンのレベルを返す | `_SFR_IO8(pin >> 4) & _BV(pin & 0xF)` | `palReadLine(pin)` |
|
|
||||||
| `togglePin(pin)` | ピンレベルを反転 (ピンを出力として設定してあると仮定) | `PORTB ^= (1<<2)` | `palToggleLine(pin)` |
|
|
||||||
|
|
||||||
## 高度な設定 :id=advanced-settings
|
|
||||||
|
|
||||||
各マイクロコントローラは GPIO に関して複数の高度な設定を持つことができます。この抽象レイヤーは、アーキテクチャー固有の機能の使用法を制限しません。上級ユーザは、目的のデバイスのデータシートを参照し、必要なライブラリを含めてください。AVR については、標準 avr/io.h ライブラリが使われます; STM32 については ChibiOS [PAL ライブラリ](https://chibios.sourceforge.net/docs3/hal/group___p_a_l.html)が使われます。
|
|
||||||
|
|
||||||
## アトミック操作 :id=atomic-operation
|
|
||||||
|
|
||||||
上記の関数は、必ずしもアトミックに動作することが保証されているわけではありません。そのため、上記の関数を複数組み合わせて使用する際に、操作の途中での割り込みを防ぎたい場合は、以下の `ATOMIC_BLOCK_FORCEON` マクロを使用してください。
|
|
||||||
|
|
||||||
例:
|
|
||||||
```c
|
|
||||||
void some_function() {
|
|
||||||
// 通常の処理
|
|
||||||
ATOMIC_BLOCK_FORCEON {
|
|
||||||
// アトミックであることが必要な処理
|
|
||||||
}
|
|
||||||
// 通常の処理
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
`ATOMIC_BLOCK_FORCEON` は、ブロックが実行される前に、割り込みが有効か無効かに関わらず、強制的に割り込みを無効にします。そして、ブロックが実行された後に、割り込みを有効にします。
|
|
||||||
|
|
||||||
したがって、`ATOMIC_BLOCK_FORCEON`は、ブロックの実行前に割り込みが有効になっていることがわかっている場合や、ブロックの完了時に割り込みを有効にしても問題ないことがわかっている場合のみ使用できることに注意してください。
|
|
||||||
78
docs/ja/internals_defines.md
Normal file
78
docs/ja/internals_defines.md
Normal file
|
|
@ -0,0 +1,78 @@
|
||||||
|
# `defines` グループ {#group__defines}
|
||||||
|
|
||||||
|
## 概要
|
||||||
|
|
||||||
|
メンバー | 説明
|
||||||
|
--------------------------------|---------------------------------------------
|
||||||
|
`define `[`SYSEX_BEGIN`](#group__defines_1ga1a3c39bb790dda8a368c4247caabcf79) |
|
||||||
|
`define `[`SYSEX_END`](#group__defines_1ga753706d1d28e6f96d7caf1973e80feed) |
|
||||||
|
`define `[`MIDI_STATUSMASK`](#group__defines_1gab78a1c818a5f5dab7a8946543f126c69) |
|
||||||
|
`define `[`MIDI_CHANMASK`](#group__defines_1ga239edc0a6f8405d3a8f2804f1590b909) |
|
||||||
|
`define `[`MIDI_CC`](#group__defines_1ga45f116a1daab76b3c930c2cecfaef215) |
|
||||||
|
`define `[`MIDI_NOTEON`](#group__defines_1gafd416f27bf3590868c0c1f55c30be4c7) |
|
||||||
|
`define `[`MIDI_NOTEOFF`](#group__defines_1gabed24bea2d989fd655e2ef2ad0765adc) |
|
||||||
|
`define `[`MIDI_AFTERTOUCH`](#group__defines_1ga3a322d8cfd53576a2e167c1840551b0f) |
|
||||||
|
`define `[`MIDI_PITCHBEND`](#group__defines_1gabcc799504e8064679bca03f232223af4) |
|
||||||
|
`define `[`MIDI_PROGCHANGE`](#group__defines_1gaefb3f1595ffbb9db66b46c2c919a3d42) |
|
||||||
|
`define `[`MIDI_CHANPRESSURE`](#group__defines_1gaeb3281cc7fcd0daade8ed3d2dfc33dbe) |
|
||||||
|
`define `[`MIDI_CLOCK`](#group__defines_1gafa5e4e295aafd15ab7893344599b3b89) |
|
||||||
|
`define `[`MIDI_TICK`](#group__defines_1ga3b99408ff864613765d4c3c2ceb52aa7) |
|
||||||
|
`define `[`MIDI_START`](#group__defines_1ga8233631c85823aa546f932ad8975caa4) |
|
||||||
|
`define `[`MIDI_CONTINUE`](#group__defines_1gab24430f0081e27215b0da84dd0ee745c) |
|
||||||
|
`define `[`MIDI_STOP`](#group__defines_1ga3af9271d4b1f0d22904a0b055f48cf62) |
|
||||||
|
`define `[`MIDI_ACTIVESENSE`](#group__defines_1gacd88ed42dba52bb4b2052c5656362677) |
|
||||||
|
`define `[`MIDI_RESET`](#group__defines_1ga02947f30ca62dc332fdeb10c5868323b) |
|
||||||
|
`define `[`MIDI_TC_QUARTERFRAME`](#group__defines_1gaaa072f33590e236d1bfd8f28e833ae31) |
|
||||||
|
`define `[`MIDI_SONGPOSITION`](#group__defines_1ga412f6ed33a2150051374bee334ee1705) |
|
||||||
|
`define `[`MIDI_SONGSELECT`](#group__defines_1gafcab254838b028365ae0259729e72c4e) |
|
||||||
|
`define `[`MIDI_TUNEREQUEST`](#group__defines_1ga8100b907b8c0a84e58b1c53dcd9bd795) |
|
||||||
|
`define `[`SYSEX_EDUMANUFID`](#group__defines_1ga5ef855ed955b00a2239ca16afbeb164f) |
|
||||||
|
|
||||||
|
## メンバー
|
||||||
|
|
||||||
|
#### `define `[`SYSEX_BEGIN`](#group__defines_1ga1a3c39bb790dda8a368c4247caabcf79) {#group__defines_1ga1a3c39bb790dda8a368c4247caabcf79}
|
||||||
|
|
||||||
|
#### `define `[`SYSEX_END`](#group__defines_1ga753706d1d28e6f96d7caf1973e80feed) {#group__defines_1ga753706d1d28e6f96d7caf1973e80feed}
|
||||||
|
|
||||||
|
#### `define `[`MIDI_STATUSMASK`](#group__defines_1gab78a1c818a5f5dab7a8946543f126c69) {#group__defines_1gab78a1c818a5f5dab7a8946543f126c69}
|
||||||
|
|
||||||
|
#### `define `[`MIDI_CHANMASK`](#group__defines_1ga239edc0a6f8405d3a8f2804f1590b909) {#group__defines_1ga239edc0a6f8405d3a8f2804f1590b909}
|
||||||
|
|
||||||
|
#### `define `[`MIDI_CC`](#group__defines_1ga45f116a1daab76b3c930c2cecfaef215) {#group__defines_1ga45f116a1daab76b3c930c2cecfaef215}
|
||||||
|
|
||||||
|
#### `define `[`MIDI_NOTEON`](#group__defines_1gafd416f27bf3590868c0c1f55c30be4c7) {#group__defines_1gafd416f27bf3590868c0c1f55c30be4c7}
|
||||||
|
|
||||||
|
#### `define `[`MIDI_NOTEOFF`](#group__defines_1gabed24bea2d989fd655e2ef2ad0765adc) {#group__defines_1gabed24bea2d989fd655e2ef2ad0765adc}
|
||||||
|
|
||||||
|
#### `define `[`MIDI_AFTERTOUCH`](#group__defines_1ga3a322d8cfd53576a2e167c1840551b0f) {#group__defines_1ga3a322d8cfd53576a2e167c1840551b0f}
|
||||||
|
|
||||||
|
#### `define `[`MIDI_PITCHBEND`](#group__defines_1gabcc799504e8064679bca03f232223af4) {#group__defines_1gabcc799504e8064679bca03f232223af4}
|
||||||
|
|
||||||
|
#### `define `[`MIDI_PROGCHANGE`](#group__defines_1gaefb3f1595ffbb9db66b46c2c919a3d42) {#group__defines_1gaefb3f1595ffbb9db66b46c2c919a3d42}
|
||||||
|
|
||||||
|
#### `define `[`MIDI_CHANPRESSURE`](#group__defines_1gaeb3281cc7fcd0daade8ed3d2dfc33dbe) {#group__defines_1gaeb3281cc7fcd0daade8ed3d2dfc33dbe}
|
||||||
|
|
||||||
|
#### `define `[`MIDI_CLOCK`](#group__defines_1gafa5e4e295aafd15ab7893344599b3b89) {#group__defines_1gafa5e4e295aafd15ab7893344599b3b89}
|
||||||
|
|
||||||
|
#### `define `[`MIDI_TICK`](#group__defines_1ga3b99408ff864613765d4c3c2ceb52aa7) {#group__defines_1ga3b99408ff864613765d4c3c2ceb52aa7}
|
||||||
|
|
||||||
|
#### `define `[`MIDI_START`](#group__defines_1ga8233631c85823aa546f932ad8975caa4) {#group__defines_1ga8233631c85823aa546f932ad8975caa4}
|
||||||
|
|
||||||
|
#### `define `[`MIDI_CONTINUE`](#group__defines_1gab24430f0081e27215b0da84dd0ee745c) {#group__defines_1gab24430f0081e27215b0da84dd0ee745c}
|
||||||
|
|
||||||
|
#### `define `[`MIDI_STOP`](#group__defines_1ga3af9271d4b1f0d22904a0b055f48cf62) {#group__defines_1ga3af9271d4b1f0d22904a0b055f48cf62}
|
||||||
|
|
||||||
|
#### `define `[`MIDI_ACTIVESENSE`](#group__defines_1gacd88ed42dba52bb4b2052c5656362677) {#group__defines_1gacd88ed42dba52bb4b2052c5656362677}
|
||||||
|
|
||||||
|
#### `define `[`MIDI_RESET`](#group__defines_1ga02947f30ca62dc332fdeb10c5868323b) {#group__defines_1ga02947f30ca62dc332fdeb10c5868323b}
|
||||||
|
|
||||||
|
#### `define `[`MIDI_TC_QUARTERFRAME`](#group__defines_1gaaa072f33590e236d1bfd8f28e833ae31) {#group__defines_1gaaa072f33590e236d1bfd8f28e833ae31}
|
||||||
|
|
||||||
|
#### `define `[`MIDI_SONGPOSITION`](#group__defines_1ga412f6ed33a2150051374bee334ee1705) {#group__defines_1ga412f6ed33a2150051374bee334ee1705}
|
||||||
|
|
||||||
|
#### `define `[`MIDI_SONGSELECT`](#group__defines_1gafcab254838b028365ae0259729e72c4e) {#group__defines_1gafcab254838b028365ae0259729e72c4e}
|
||||||
|
|
||||||
|
#### `define `[`MIDI_TUNEREQUEST`](#group__defines_1ga8100b907b8c0a84e58b1c53dcd9bd795) {#group__defines_1ga8100b907b8c0a84e58b1c53dcd9bd795}
|
||||||
|
|
||||||
|
#### `define `[`SYSEX_EDUMANUFID`](#group__defines_1ga5ef855ed955b00a2239ca16afbeb164f) {#group__defines_1ga5ef855ed955b00a2239ca16afbeb164f}
|
||||||
|
|
||||||
47
docs/ja/internals_gpio_control.md
Normal file
47
docs/ja/internals_gpio_control.md
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
# GPIO 制御 :id=gpio-control
|
||||||
|
|
||||||
|
<!---
|
||||||
|
original document: 0.13.15:docs/internals_gpio_control.md
|
||||||
|
git diff 0.13.15 HEAD -- docs/internals_gpio_control.md | cat
|
||||||
|
-->
|
||||||
|
|
||||||
|
QMK には、マイクロコントローラに依存しない GPIO 制御抽象レイヤーがあります。これは異なるプラットフォーム間でピン制御に簡単にアクセスできるようにするためのものです。
|
||||||
|
|
||||||
|
## 関数 :id=functions
|
||||||
|
|
||||||
|
以下の関数は GPIO の基本的な制御を提供し、`quantum/quantum.h` にあります。
|
||||||
|
|
||||||
|
| 関数 | 説明 | 古い AVR の例 | 古い ChibiOS/ARM の例 |
|
||||||
|
|------------------------|--------------------------------------------------|-------------------------------------------------|-------------------------------------------------|
|
||||||
|
| `setPinInput(pin)` | ピンを高インピーダンス(High-Z)の入力として設定 | `DDRB &= ~(1<<2)` | `palSetLineMode(pin, PAL_MODE_INPUT)` |
|
||||||
|
| `setPinInputHigh(pin)` | ピンを組み込みのプルアップ抵抗付きの入力として設定 | `DDRB &= ~(1<<2); PORTB \|= (1<<2)` | `palSetLineMode(pin, PAL_MODE_INPUT_PULLUP)` |
|
||||||
|
| `setPinInputLow(pin)` | ピンを組み込みのプルダウン抵抗付きの入力として設定 | N/A (AVR ではサポートされません) | `palSetLineMode(pin, PAL_MODE_INPUT_PULLDOWN)` |
|
||||||
|
| `setPinOutput(pin)` | ピンを出力として設定 | `DDRB \|= (1<<2)` | `palSetLineMode(pin, PAL_MODE_OUTPUT_PUSHPULL)` |
|
||||||
|
| `writePinHigh(pin)` | ピンレベルを high に設定 (ピンを出力として設定してあると仮定) | `PORTB \|= (1<<2)` | `palSetLine(pin)` |
|
||||||
|
| `writePinLow(pin)` | ピンレベルを low に設定 (ピンを出力として設定してあると仮定) | `PORTB &= ~(1<<2)` | `palClearLine(pin)` |
|
||||||
|
| `writePin(pin, level)` | ピンレベルを設定 (ピンを出力として設定してあると仮定) | `(level) ? PORTB \|= (1<<2) : PORTB &= ~(1<<2)` | `(level) ? palSetLine(pin) : palClearLine(pin)` |
|
||||||
|
| `readPin(pin)` | ピンのレベルを返す | `_SFR_IO8(pin >> 4) & _BV(pin & 0xF)` | `palReadLine(pin)` |
|
||||||
|
| `togglePin(pin)` | ピンレベルを反転 (ピンを出力として設定してあると仮定) | `PORTB ^= (1<<2)` | `palToggleLine(pin)` |
|
||||||
|
|
||||||
|
## 高度な設定 :id=advanced-settings
|
||||||
|
|
||||||
|
各マイクロコントローラは GPIO に関して複数の高度な設定を持つことができます。この抽象レイヤーは、アーキテクチャー固有の機能の使用法を制限しません。上級ユーザは、目的のデバイスのデータシートを参照し、必要なライブラリを含めてください。AVR については、標準 avr/io.h ライブラリが使われます; STM32 については ChibiOS [PAL ライブラリ](https://chibios.sourceforge.net/docs3/hal/group___p_a_l.html)が使われます。
|
||||||
|
|
||||||
|
## アトミック操作 :id=atomic-operation
|
||||||
|
|
||||||
|
上記の関数は、必ずしもアトミックに動作することが保証されているわけではありません。そのため、上記の関数を複数組み合わせて使用する際に、操作の途中での割り込みを防ぎたい場合は、以下の `ATOMIC_BLOCK_FORCEON` マクロを使用してください。
|
||||||
|
|
||||||
|
例:
|
||||||
|
```c
|
||||||
|
void some_function() {
|
||||||
|
// 通常の処理
|
||||||
|
ATOMIC_BLOCK_FORCEON {
|
||||||
|
// アトミックであることが必要な処理
|
||||||
|
}
|
||||||
|
// 通常の処理
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
`ATOMIC_BLOCK_FORCEON` は、ブロックが実行される前に、割り込みが有効か無効かに関わらず、強制的に割り込みを無効にします。そして、ブロックが実行された後に、割り込みを有効にします。
|
||||||
|
|
||||||
|
したがって、`ATOMIC_BLOCK_FORCEON`は、ブロックの実行前に割り込みが有効になっていることがわかっている場合や、ブロックの完了時に割り込みを有効にしても問題ないことがわかっている場合のみ使用できることに注意してください。
|
||||||
173
docs/ja/internals_input_callback_reg.md
Normal file
173
docs/ja/internals_input_callback_reg.md
Normal file
|
|
@ -0,0 +1,173 @@
|
||||||
|
# group `input_callback_reg` {#group__input__callback__reg}
|
||||||
|
|
||||||
|
<!---
|
||||||
|
original document: 0.9.34:docs/internals_input_callback_reg.md
|
||||||
|
git diff 0.9.34 HEAD -- docs/internals_input_callback_reg.md | cat
|
||||||
|
-->
|
||||||
|
|
||||||
|
これらは受信コールバックを登録するために使用する関数です。
|
||||||
|
|
||||||
|
関数は、適切な midi メッセージが関連するデバイスの入力と一致した場合に呼び出されます。
|
||||||
|
|
||||||
|
## 概要
|
||||||
|
|
||||||
|
| メンバー | 説明 |
|
||||||
|
--------------------------------|---------------------------------------------
|
||||||
|
| `public void `[`midi_register_cc_callback`](#group__input__callback__reg_1ga64ab672abbbe393c9c4a83110c8df718)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | コントロールチェンジメッセージ受信コールバックを登録する。 |
|
||||||
|
| `public void `[`midi_register_noteon_callback`](#group__input__callback__reg_1ga3962f276c17618923f1152779552103e)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | ノートオン受信コールバックを登録する。 |
|
||||||
|
| `public void `[`midi_register_noteoff_callback`](#group__input__callback__reg_1gac847b66051bd6d53b762958be0ec4c6d)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | ノートオフ受信コールバックを登録する。 |
|
||||||
|
| `public void `[`midi_register_aftertouch_callback`](#group__input__callback__reg_1gaa95bc901bd9edff956a667c9a69dd01f)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | アフタータッチ受信コールバックを登録する。 |
|
||||||
|
| `public void `[`midi_register_pitchbend_callback`](#group__input__callback__reg_1ga071a28f02ba14f53de219be70ebd9a48)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | ピッチベンド受信コールバックを登録する。 |
|
||||||
|
| `public void `[`midi_register_songposition_callback`](#group__input__callback__reg_1gaf2adfd79637f3553d8f26deb1ca22ed6)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | ソングポジション受信コールバックを登録する。 |
|
||||||
|
| `public void `[`midi_register_progchange_callback`](#group__input__callback__reg_1gae6ba1a35a4cde9bd15dd42f87401d127)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` | プログラムチェンジ受信コールバックを登録する。 |
|
||||||
|
| `public void `[`midi_register_chanpressure_callback`](#group__input__callback__reg_1ga39b31f1f4fb93917ce039b958f21b4f5)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` | チャンネルプレッシャー受信コールバックを登録する。 |
|
||||||
|
| `public void `[`midi_register_songselect_callback`](#group__input__callback__reg_1gaf9aafc76a2dc4b9fdbb4106cbda6ce72)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` | ソングセレクト受信コールバックを登録する。 |
|
||||||
|
| `public void `[`midi_register_tc_quarterframe_callback`](#group__input__callback__reg_1ga0a119fada2becc628cb15d753b257e6e)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` | タイムコードクォータフレーム受信コールバックを登録する。 |
|
||||||
|
| `public void `[`midi_register_realtime_callback`](#group__input__callback__reg_1ga764f440e857b89084b1a07f9da2ff93a)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_one_byte_func_t func)` | リアルタイム受信コールバックを登録する。 |
|
||||||
|
| `public void `[`midi_register_tunerequest_callback`](#group__input__callback__reg_1gae40ff3ce20bda79fef87da24b8321cb1)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_one_byte_func_t func)` | チューンリクエスト受信コールバックを登録する。 |
|
||||||
|
| `public void `[`midi_register_sysex_callback`](#group__input__callback__reg_1ga63ce9631b025785c1848d0122d4c4c48)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_sysex_func_t func)` | システムエクスクルーシブ受信コールバックを登録する。 |
|
||||||
|
| `public void `[`midi_register_fallthrough_callback`](#group__input__callback__reg_1ga7ed189164aa9682862b3181153afbd94)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_var_byte_func_t func)` | フォールスルー受信コールバックを登録する。 |
|
||||||
|
| `public void `[`midi_register_catchall_callback`](#group__input__callback__reg_1ga9dbfed568d047a6cd05708f11fe39e99)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_var_byte_func_t func)` | キャッチオール受信コールバックを登録する。 |
|
||||||
|
|
||||||
|
## メンバー
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_cc_callback`](#group__input__callback__reg_1ga64ab672abbbe393c9c4a83110c8df718)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` {#group__input__callback__reg_1ga64ab672abbbe393c9c4a83110c8df718}
|
||||||
|
|
||||||
|
コントロールチェンジメッセージ受信コールバックを登録する。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_noteon_callback`](#group__input__callback__reg_1ga3962f276c17618923f1152779552103e)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` {#group__input__callback__reg_1ga3962f276c17618923f1152779552103e}
|
||||||
|
|
||||||
|
ノートオン受信コールバックを登録する。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_noteoff_callback`](#group__input__callback__reg_1gac847b66051bd6d53b762958be0ec4c6d)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` {#group__input__callback__reg_1gac847b66051bd6d53b762958be0ec4c6d}
|
||||||
|
|
||||||
|
ノートオフ受信コールバックを登録する。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_aftertouch_callback`](#group__input__callback__reg_1gaa95bc901bd9edff956a667c9a69dd01f)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` {#group__input__callback__reg_1gaa95bc901bd9edff956a667c9a69dd01f}
|
||||||
|
|
||||||
|
アフタータッチ受信コールバックを登録する。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_pitchbend_callback`](#group__input__callback__reg_1ga071a28f02ba14f53de219be70ebd9a48)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` {#group__input__callback__reg_1ga071a28f02ba14f53de219be70ebd9a48}
|
||||||
|
|
||||||
|
ピッチベンド受信コールバックを登録する。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_songposition_callback`](#group__input__callback__reg_1gaf2adfd79637f3553d8f26deb1ca22ed6)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` {#group__input__callback__reg_1gaf2adfd79637f3553d8f26deb1ca22ed6}
|
||||||
|
|
||||||
|
ソングポジション受信コールバックを登録する。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_progchange_callback`](#group__input__callback__reg_1gae6ba1a35a4cde9bd15dd42f87401d127)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` {#group__input__callback__reg_1gae6ba1a35a4cde9bd15dd42f87401d127}
|
||||||
|
|
||||||
|
プログラムチェンジ受信コールバックを登録する。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_chanpressure_callback`](#group__input__callback__reg_1ga39b31f1f4fb93917ce039b958f21b4f5)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` {#group__input__callback__reg_1ga39b31f1f4fb93917ce039b958f21b4f5}
|
||||||
|
|
||||||
|
チャンネルプレッシャー受信コールバックを登録する。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_songselect_callback`](#group__input__callback__reg_1gaf9aafc76a2dc4b9fdbb4106cbda6ce72)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` {#group__input__callback__reg_1gaf9aafc76a2dc4b9fdbb4106cbda6ce72}
|
||||||
|
|
||||||
|
ソングセレクト受信コールバックを登録する。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_tc_quarterframe_callback`](#group__input__callback__reg_1ga0a119fada2becc628cb15d753b257e6e)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` {#group__input__callback__reg_1ga0a119fada2becc628cb15d753b257e6e}
|
||||||
|
|
||||||
|
タイムコードクォータフレーム受信コールバックを登録する。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_realtime_callback`](#group__input__callback__reg_1ga764f440e857b89084b1a07f9da2ff93a)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_one_byte_func_t func)` {#group__input__callback__reg_1ga764f440e857b89084b1a07f9da2ff93a}
|
||||||
|
|
||||||
|
リアルタイム受信コールバックを登録する。
|
||||||
|
|
||||||
|
全てのリアルタイムメッセージ型に対してコールバックが呼ばれます。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_tunerequest_callback`](#group__input__callback__reg_1gae40ff3ce20bda79fef87da24b8321cb1)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_one_byte_func_t func)` {#group__input__callback__reg_1gae40ff3ce20bda79fef87da24b8321cb1}
|
||||||
|
|
||||||
|
チューンリクエスト受信コールバックを登録する。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_sysex_callback`](#group__input__callback__reg_1ga63ce9631b025785c1848d0122d4c4c48)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_sysex_func_t func)` {#group__input__callback__reg_1ga63ce9631b025785c1848d0122d4c4c48}
|
||||||
|
|
||||||
|
システムエクスクルーシブ受信コールバックを登録する。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_fallthrough_callback`](#group__input__callback__reg_1ga7ed189164aa9682862b3181153afbd94)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_var_byte_func_t func)` {#group__input__callback__reg_1ga7ed189164aa9682862b3181153afbd94}
|
||||||
|
|
||||||
|
フォールスルー受信コールバックを登録する。
|
||||||
|
|
||||||
|
より具体的なコールバックが見つからない場合にのみ呼ばれます。例えば、ノートオン受信コールバックを登録していないがノートオンメッセージを受け取った場合、フォールスルー受信コールバックが登録されている場合はそれが呼ばれます。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_catchall_callback`](#group__input__callback__reg_1ga9dbfed568d047a6cd05708f11fe39e99)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_var_byte_func_t func)` {#group__input__callback__reg_1ga9dbfed568d047a6cd05708f11fe39e99}
|
||||||
|
|
||||||
|
キャッチオール受信コールバックを登録する。
|
||||||
|
|
||||||
|
登録されている場合は、より具体的なコールバックあるいはフォールスルー受信コールバックが登録されている場合でも、一致する全てのメッセージに対してキャッチオール受信コールバックが呼ばれます。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
148
docs/ja/internals_midi_device.md
Normal file
148
docs/ja/internals_midi_device.md
Normal file
|
|
@ -0,0 +1,148 @@
|
||||||
|
# `midi_device` グループ {#group__midi__device}
|
||||||
|
|
||||||
|
<!---
|
||||||
|
original document: 0.10.9:docs/internals_midi_device.md
|
||||||
|
git diff 0.10.9 HEAD -- docs/internals_midi_device.md | cat
|
||||||
|
-->
|
||||||
|
|
||||||
|
独自の MIDI デバイスを実装する時に、関数を使います。
|
||||||
|
|
||||||
|
実際にデバイスを介してバイトを送信するために、送信関数を設定します。このメソッドは、このデバイスで例えば midi_send_cc のような送信関数を呼ぶ時に呼ばれます。
|
||||||
|
|
||||||
|
midi_device_input を使ってデバイスからの入力データを処理し、それをデバイスに関連付けられたコールバックで渡します。
|
||||||
|
|
||||||
|
デバイスのプロセス関数の最初に呼び出される関数が必要な場合、midi_device_set_pre_input_process_func を使います。通常、入力をポーリングして midi_device_input に渡します。
|
||||||
|
|
||||||
|
## 概要
|
||||||
|
|
||||||
|
メンバー | 説明
|
||||||
|
--------------------------------|---------------------------------------------
|
||||||
|
`define `[`MIDI_INPUT_QUEUE_LENGTH`](#group__midi__device_1ga4aaa419caebdca2bbdfc1331e79781a8) |
|
||||||
|
`enum `[`input_state_t`](#group__midi__device_1gac203e877d3df4275ceb8e7180a61f621) |
|
||||||
|
`public void `[`midi_device_input`](#group__midi__device_1gad8d3db8eb35d9cfa51ef036a0a9d70db)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t cnt,uint8_t * input)` | 入力バイトを処理します。この関数はバイトを解析し、指定されたデバイスに関連する適切なコールバックを呼びます。この関数は、カスタムデバイスを作成していて、MIDI 入力が必要な場合に使います。
|
||||||
|
`public void `[`midi_device_set_send_func`](#group__midi__device_1ga59f5a46bdd4452f186cc73d9e96d4673)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_var_byte_func_t send_func)` | 出力データバイトの送信に使われるコールバック関数を設定します。これは、カスタムデバイスを作成している場合のみ使われます。ロックを気にすることなく様々な MIDI 送信関数を呼び出すことができるように、コールバック関数で割り込みを無効にすることができます。
|
||||||
|
`public void `[`midi_device_set_pre_input_process_func`](#group__midi__device_1ga4de0841b87c04fc23cb56b6451f33b69)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_no_byte_func_t pre_process_func)` | midi_device_process 呼び出しの最初に呼ばれるコールバックを設定します。これは入力データをポーリングし、midi_device_input 関数を介してデータを送信できます。カスタムデバイスを作成している場合のみ、これを使う可能性があります。
|
||||||
|
`struct `[`_midi_device`](docs/api_midi_device.md#struct__midi__device) | この構造体は、MIDI デバイスの入出力関数と処理データを表します。
|
||||||
|
|
||||||
|
## メンバー
|
||||||
|
|
||||||
|
#### `define `[`MIDI_INPUT_QUEUE_LENGTH`](#group__midi__device_1ga4aaa419caebdca2bbdfc1331e79781a8) {#group__midi__device_1ga4aaa419caebdca2bbdfc1331e79781a8}
|
||||||
|
|
||||||
|
#### `enum `[`input_state_t`](#group__midi__device_1gac203e877d3df4275ceb8e7180a61f621) {#group__midi__device_1gac203e877d3df4275ceb8e7180a61f621}
|
||||||
|
|
||||||
|
値 | 説明
|
||||||
|
--------------------------------|---------------------------------------------
|
||||||
|
IDLE |
|
||||||
|
ONE_BYTE_MESSAGE |
|
||||||
|
TWO_BYTE_MESSAGE |
|
||||||
|
THREE_BYTE_MESSAGE |
|
||||||
|
SYSEX_MESSAGE |
|
||||||
|
|
||||||
|
#### `public void `[`midi_device_input`](#group__midi__device_1gad8d3db8eb35d9cfa51ef036a0a9d70db)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t cnt,uint8_t * input)` {#group__midi__device_1gad8d3db8eb35d9cfa51ef036a0a9d70db}
|
||||||
|
|
||||||
|
入力バイトを処理します。この関数はバイトを解析し、指定されたデバイスに関連する適切なコールバックを呼びます。この関数は、カスタムデバイスを作成していて、MIDI 入力が必要な場合に使います。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 入力を関連付ける MIDI デバイス
|
||||||
|
|
||||||
|
* `cnt` 処理中のバイト数
|
||||||
|
|
||||||
|
* `input` 処理するバイトデータ
|
||||||
|
|
||||||
|
#### `public void `[`midi_device_set_send_func`](#group__midi__device_1ga59f5a46bdd4452f186cc73d9e96d4673)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_var_byte_func_t send_func)` {#group__midi__device_1ga59f5a46bdd4452f186cc73d9e96d4673}
|
||||||
|
|
||||||
|
出力データバイトの送信に使われるコールバック関数を設定します。これは、カスタムデバイスを作成している場合のみ使われます。ロックを気にすることなく様々な MIDI 送信関数を呼び出すことができるように、コールバック関数で割り込みを無効にすることができます。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` このコールバックを関連付ける MIDI デバイス
|
||||||
|
|
||||||
|
* `send_func` 送信を行うコールバック関数
|
||||||
|
|
||||||
|
#### `public void `[`midi_device_set_pre_input_process_func`](#group__midi__device_1ga4de0841b87c04fc23cb56b6451f33b69)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_no_byte_func_t pre_process_func)` {#group__midi__device_1ga4de0841b87c04fc23cb56b6451f33b69}
|
||||||
|
|
||||||
|
midi_device_process 呼び出しの最初に呼ばれるコールバックを設定します。これは入力データをポーリングし、midi_device_input 関数を介してデータを送信できます。カスタムデバイスを作成している場合のみ、これを使う可能性があります。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` このコールバックを関連付ける MIDI デバイス
|
||||||
|
|
||||||
|
* `midi_no_byte_func_t` 実際のコールバック関数
|
||||||
|
|
||||||
|
# `_midi_device` 構造体 {#struct__midi__device}
|
||||||
|
|
||||||
|
この構造体は、MIDI デバイスの入出力関数と処理データを表します。
|
||||||
|
|
||||||
|
デバイスは、実際の物理デバイス [シリアルポート、USB ポート]、または仮想デバイスを表すことができます。この構造体を直接変更する必要はありません。
|
||||||
|
|
||||||
|
## 概要
|
||||||
|
|
||||||
|
| メンバー | 説明
|
||||||
|
--------------------------------|---------------------------------------------
|
||||||
|
`public midi_var_byte_func_t `[`send_func`](docs/api_midi_device.md#struct__midi__device_1a25d4c94b4bbccd5b98f1032b469f3ff9) |
|
||||||
|
`public midi_three_byte_func_t `[`input_cc_callback`](docs/api_midi_device.md#struct__midi__device_1a6da5236c1bc73877728df92d213a78d1) |
|
||||||
|
`public midi_three_byte_func_t `[`input_noteon_callback`](docs/api_midi_device.md#struct__midi__device_1aa10b15cf1a7fb825a5df0d2abbe34a1c) |
|
||||||
|
`public midi_three_byte_func_t `[`input_noteoff_callback`](docs/api_midi_device.md#struct__midi__device_1aaf290043078534d3a5a0ea4c840eba84) |
|
||||||
|
`public midi_three_byte_func_t `[`input_aftertouch_callback`](docs/api_midi_device.md#struct__midi__device_1acb0b4901c545cec4b28b126f2d8c315f) |
|
||||||
|
`public midi_three_byte_func_t `[`input_pitchbend_callback`](docs/api_midi_device.md#struct__midi__device_1a305fea672caeb996f2233bf8cd2bef18) |
|
||||||
|
`public midi_three_byte_func_t `[`input_songposition_callback`](docs/api_midi_device.md#struct__midi__device_1a5f3f13638b3fef3fc561ed1bf301d586) |
|
||||||
|
`public midi_two_byte_func_t `[`input_progchange_callback`](docs/api_midi_device.md#struct__midi__device_1adaf1da617c9a10a9dcad00ab1959d3da) |
|
||||||
|
`public midi_two_byte_func_t `[`input_chanpressure_callback`](docs/api_midi_device.md#struct__midi__device_1ab7ca2925c539915d43974eff604d85f7) |
|
||||||
|
`public midi_two_byte_func_t `[`input_songselect_callback`](docs/api_midi_device.md#struct__midi__device_1a89bed8a5a55376120cfc0a62b42f057f) |
|
||||||
|
`public midi_two_byte_func_t `[`input_tc_quarterframe_callback`](docs/api_midi_device.md#struct__midi__device_1ad9813e75d22e284f9f65a907d20600f0) |
|
||||||
|
`public midi_one_byte_func_t `[`input_realtime_callback`](docs/api_midi_device.md#struct__midi__device_1a9448eba4afb7e43650434748db3777be) |
|
||||||
|
`public midi_one_byte_func_t `[`input_tunerequest_callback`](docs/api_midi_device.md#struct__midi__device_1a0cb8fd53e00cf1d4202d4fa04d038e8d) |
|
||||||
|
`public midi_sysex_func_t `[`input_sysex_callback`](docs/api_midi_device.md#struct__midi__device_1afff9a0ce641762aaef24c1e6953ec9a2) |
|
||||||
|
`public midi_var_byte_func_t `[`input_fallthrough_callback`](docs/api_midi_device.md#struct__midi__device_1abb974ec6d734001b4a0e370f292be503) |
|
||||||
|
`public midi_var_byte_func_t `[`input_catchall_callback`](docs/api_midi_device.md#struct__midi__device_1aae0d535129d4fd650edc98eb3f7584f8) |
|
||||||
|
`public midi_no_byte_func_t `[`pre_input_process_callback`](docs/api_midi_device.md#struct__midi__device_1aeb0bb8923d66c23d874e177dc4265754) |
|
||||||
|
`public uint8_t `[`input_buffer`](docs/api_midi_device.md#struct__midi__device_1a7c5684857d6af4ebc4dc12da27bd6b2a) |
|
||||||
|
`public input_state_t `[`input_state`](docs/api_midi_device.md#struct__midi__device_1a69a687d2d1c449ec15a11c07a5722e39) |
|
||||||
|
`public uint16_t `[`input_count`](docs/api_midi_device.md#struct__midi__device_1a68dea8e7b6151e89c85c95caa612ee5d) |
|
||||||
|
`public uint8_t `[`input_queue_data`](docs/api_midi_device.md#struct__midi__device_1ada41de021135dc423abedcbb30f366ff) |
|
||||||
|
`public `[`byteQueue_t`](#structbyte_queue__t)` `[`input_queue`](#struct__midi__device_1a49c8538a8a02193c58e28a56eb695d8f) |
|
||||||
|
|
||||||
|
## メンバー
|
||||||
|
|
||||||
|
#### `public midi_var_byte_func_t `[`send_func`](docs/api_midi_device.md#struct__midi__device_1a25d4c94b4bbccd5b98f1032b469f3ff9) {#struct__midi__device_1a25d4c94b4bbccd5b98f1032b469f3ff9}
|
||||||
|
|
||||||
|
#### `public midi_three_byte_func_t `[`input_cc_callback`](docs/api_midi_device.md#struct__midi__device_1a6da5236c1bc73877728df92d213a78d1) {#struct__midi__device_1a6da5236c1bc73877728df92d213a78d1}
|
||||||
|
|
||||||
|
#### `public midi_three_byte_func_t `[`input_noteon_callback`](docs/api_midi_device.md#struct__midi__device_1aa10b15cf1a7fb825a5df0d2abbe34a1c) {#struct__midi__device_1aa10b15cf1a7fb825a5df0d2abbe34a1c}
|
||||||
|
|
||||||
|
#### `public midi_three_byte_func_t `[`input_noteoff_callback`](docs/api_midi_device.md#struct__midi__device_1aaf290043078534d3a5a0ea4c840eba84) {#struct__midi__device_1aaf290043078534d3a5a0ea4c840eba84}
|
||||||
|
|
||||||
|
#### `public midi_three_byte_func_t `[`input_aftertouch_callback`](docs/api_midi_device.md#struct__midi__device_1acb0b4901c545cec4b28b126f2d8c315f) {#struct__midi__device_1acb0b4901c545cec4b28b126f2d8c315f}
|
||||||
|
|
||||||
|
#### `public midi_three_byte_func_t `[`input_pitchbend_callback`](docs/api_midi_device.md#struct__midi__device_1a305fea672caeb996f2233bf8cd2bef18) {#struct__midi__device_1a305fea672caeb996f2233bf8cd2bef18}
|
||||||
|
|
||||||
|
#### `public midi_three_byte_func_t `[`input_songposition_callback`](docs/api_midi_device.md#struct__midi__device_1a5f3f13638b3fef3fc561ed1bf301d586) {#struct__midi__device_1a5f3f13638b3fef3fc561ed1bf301d586}
|
||||||
|
|
||||||
|
#### `public midi_two_byte_func_t `[`input_progchange_callback`](docs/api_midi_device.md#struct__midi__device_1adaf1da617c9a10a9dcad00ab1959d3da) {#struct__midi__device_1adaf1da617c9a10a9dcad00ab1959d3da}
|
||||||
|
|
||||||
|
#### `public midi_two_byte_func_t `[`input_chanpressure_callback`](docs/api_midi_device.md#struct__midi__device_1ab7ca2925c539915d43974eff604d85f7) {#struct__midi__device_1ab7ca2925c539915d43974eff604d85f7}
|
||||||
|
|
||||||
|
#### `public midi_two_byte_func_t `[`input_songselect_callback`](docs/api_midi_device.md#struct__midi__device_1a89bed8a5a55376120cfc0a62b42f057f) {#struct__midi__device_1a89bed8a5a55376120cfc0a62b42f057f}
|
||||||
|
|
||||||
|
#### `public midi_two_byte_func_t `[`input_tc_quarterframe_callback`](docs/api_midi_device.md#struct__midi__device_1ad9813e75d22e284f9f65a907d20600f0) {#struct__midi__device_1ad9813e75d22e284f9f65a907d20600f0}
|
||||||
|
|
||||||
|
#### `public midi_one_byte_func_t `[`input_realtime_callback`](docs/api_midi_device.md#struct__midi__device_1a9448eba4afb7e43650434748db3777be) {#struct__midi__device_1a9448eba4afb7e43650434748db3777be}
|
||||||
|
|
||||||
|
#### `public midi_one_byte_func_t `[`input_tunerequest_callback`](docs/api_midi_device.md#struct__midi__device_1a0cb8fd53e00cf1d4202d4fa04d038e8d) {#struct__midi__device_1a0cb8fd53e00cf1d4202d4fa04d038e8d}
|
||||||
|
|
||||||
|
#### `public midi_sysex_func_t `[`input_sysex_callback`](docs/api_midi_device.md#struct__midi__device_1afff9a0ce641762aaef24c1e6953ec9a2) {#struct__midi__device_1afff9a0ce641762aaef24c1e6953ec9a2}
|
||||||
|
|
||||||
|
#### `public midi_var_byte_func_t `[`input_fallthrough_callback`](docs/api_midi_device.md#struct__midi__device_1abb974ec6d734001b4a0e370f292be503) {#struct__midi__device_1abb974ec6d734001b4a0e370f292be503}
|
||||||
|
|
||||||
|
#### `public midi_var_byte_func_t `[`input_catchall_callback`](docs/api_midi_device.md#struct__midi__device_1aae0d535129d4fd650edc98eb3f7584f8) {#struct__midi__device_1aae0d535129d4fd650edc98eb3f7584f8}
|
||||||
|
|
||||||
|
#### `public midi_no_byte_func_t `[`pre_input_process_callback`](docs/api_midi_device.md#struct__midi__device_1aeb0bb8923d66c23d874e177dc4265754) {#struct__midi__device_1aeb0bb8923d66c23d874e177dc4265754}
|
||||||
|
|
||||||
|
#### `public uint8_t `[`input_buffer`](docs/api_midi_device.md#struct__midi__device_1a7c5684857d6af4ebc4dc12da27bd6b2a) {#struct__midi__device_1a7c5684857d6af4ebc4dc12da27bd6b2a}
|
||||||
|
|
||||||
|
#### `public input_state_t `[`input_state`](docs/api_midi_device.md#struct__midi__device_1a69a687d2d1c449ec15a11c07a5722e39) {#struct__midi__device_1a69a687d2d1c449ec15a11c07a5722e39}
|
||||||
|
|
||||||
|
#### `public uint16_t `[`input_count`](docs/api_midi_device.md#struct__midi__device_1a68dea8e7b6151e89c85c95caa612ee5d) {#struct__midi__device_1a68dea8e7b6151e89c85c95caa612ee5d}
|
||||||
|
|
||||||
|
#### `public uint8_t `[`input_queue_data`](docs/api_midi_device.md#struct__midi__device_1ada41de021135dc423abedcbb30f366ff) {#struct__midi__device_1ada41de021135dc423abedcbb30f366ff}
|
||||||
|
|
||||||
|
#### `public `[`byteQueue_t`](#structbyte_queue__t)` `[`input_queue`](#struct__midi__device_1a49c8538a8a02193c58e28a56eb695d8f) {#struct__midi__device_1a49c8538a8a02193c58e28a56eb695d8f}
|
||||||
|
|
||||||
36
docs/ja/internals_midi_device_setup_process.md
Normal file
36
docs/ja/internals_midi_device_setup_process.md
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
# `midi_device_setup_process` グループ {#group__midi__device__setup__process}
|
||||||
|
|
||||||
|
<!---
|
||||||
|
original document: 0.10.9:docs/internals_midi_device_setup_process.md
|
||||||
|
git diff 0.10.9 HEAD -- docs/internals_midi_device_setup_process.md | cat
|
||||||
|
-->
|
||||||
|
|
||||||
|
これらは、デバイスを初期化して実行するために使う必要があるメソッドです。
|
||||||
|
|
||||||
|
## 概要
|
||||||
|
|
||||||
|
メンバー | 説明
|
||||||
|
--------------------------------|---------------------------------------------
|
||||||
|
`public void `[`midi_device_init`](#group__midi__device__setup__process_1gaf29deddc94ea98a59daa0bde1aefd9d9)`(`[`MidiDevice`](#struct__midi__device)` * device)` | デバイスを初期化します。
|
||||||
|
`public void `[`midi_device_process`](#group__midi__device__setup__process_1gaa3d5993d0e998a1b59bbf5ab9c7b492b)`(`[`MidiDevice`](#struct__midi__device)` * device)` | 入力データを処理します。
|
||||||
|
|
||||||
|
## メンバー
|
||||||
|
|
||||||
|
#### `public void `[`midi_device_init`](#group__midi__device__setup__process_1gaf29deddc94ea98a59daa0bde1aefd9d9)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__midi__device__setup__process_1gaf29deddc94ea98a59daa0bde1aefd9d9}
|
||||||
|
|
||||||
|
デバイスを初期化します。
|
||||||
|
|
||||||
|
問題のデバイスを使う前にこれを呼び出す必要があります。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 初期化するデバイス
|
||||||
|
|
||||||
|
#### `public void `[`midi_device_process`](#group__midi__device__setup__process_1gaa3d5993d0e998a1b59bbf5ab9c7b492b)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__midi__device__setup__process_1gaa3d5993d0e998a1b59bbf5ab9c7b492b}
|
||||||
|
|
||||||
|
入力データを処理します。
|
||||||
|
|
||||||
|
このメソッドは入力処理を駆動します。入力コールバックが呼び出されることが予想される場合は、このメソッドを頻繁に呼び出す必要があります。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 処理するデバイス
|
||||||
|
|
||||||
59
docs/ja/internals_midi_util.md
Normal file
59
docs/ja/internals_midi_util.md
Normal file
|
|
@ -0,0 +1,59 @@
|
||||||
|
# `midi_util` グループ {#group__midi__util}
|
||||||
|
|
||||||
|
<!---
|
||||||
|
original document: 0.10.9:docs/internals_midi_util.md
|
||||||
|
git diff 0.10.9 HEAD -- docs/internals_midi_util.md | cat
|
||||||
|
-->
|
||||||
|
|
||||||
|
## 概要
|
||||||
|
|
||||||
|
| メンバー | 説明
|
||||||
|
--------------------------------|---------------------------------------------
|
||||||
|
| `enum `[`midi_packet_length_t`](#group__midi__util_1gae29ff56aee2b430ffe53933b97e5e79e) | 可能なパケット長の値の列挙型。
|
||||||
|
| `public bool `[`midi_is_statusbyte`](#group__midi__util_1ga12e3b42ff9cbb4b4f2bc455fc8743ee5)`(uint8_t theByte)` | 指定されたバイトがステータスバイトであるかどうかを検査します。
|
||||||
|
| `public bool `[`midi_is_realtime`](#group__midi__util_1gad2f52c363e34a8000d80c983c324e2d7)`(uint8_t theByte)` | 指定されたバイトがリアルタイムメッセージであるかどうかを検査します。
|
||||||
|
| `public `[`midi_packet_length_t`](#group__midi__util_1gae29ff56aee2b430ffe53933b97e5e79e)` `[`midi_packet_length`](#group__midi__util_1gaa168b43af6ae9de0debce1625e4b8175)`(uint8_t status)` | 指定されたステータスバイトに関連付けられたパケットの長さを調べます。
|
||||||
|
|
||||||
|
## メンバー
|
||||||
|
|
||||||
|
#### `enum `[`midi_packet_length_t`](#group__midi__util_1gae29ff56aee2b430ffe53933b97e5e79e) {#group__midi__util_1gae29ff56aee2b430ffe53933b97e5e79e}
|
||||||
|
|
||||||
|
| 値 | 説明
|
||||||
|
--------------------------------|---------------------------------------------
|
||||||
|
UNDEFINED |
|
||||||
|
ONE |
|
||||||
|
TWO |
|
||||||
|
THREE |
|
||||||
|
|
||||||
|
可能なパケット長の値の列挙型。
|
||||||
|
|
||||||
|
#### `public bool `[`midi_is_statusbyte`](#group__midi__util_1ga12e3b42ff9cbb4b4f2bc455fc8743ee5)`(uint8_t theByte)` {#group__midi__util_1ga12e3b42ff9cbb4b4f2bc455fc8743ee5}
|
||||||
|
|
||||||
|
指定されたバイトがステータスバイトであるかどうかを検査します。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `theByte` 検査するバイト
|
||||||
|
|
||||||
|
#### 返り値
|
||||||
|
指定されたバイトが MIDI ステータスバイトの場合は true
|
||||||
|
|
||||||
|
#### `public bool `[`midi_is_realtime`](#group__midi__util_1gad2f52c363e34a8000d80c983c324e2d7)`(uint8_t theByte)` {#group__midi__util_1gad2f52c363e34a8000d80c983c324e2d7}
|
||||||
|
|
||||||
|
指定されたバイトがリアルタイムメッセージであるかどうかを検査します。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `theByte` 検査するバイト
|
||||||
|
|
||||||
|
#### 返り値
|
||||||
|
リアルタイムメッセージの場合は true、それ以外の場合は false
|
||||||
|
|
||||||
|
#### `public `[`midi_packet_length_t`](#group__midi__util_1gae29ff56aee2b430ffe53933b97e5e79e)` `[`midi_packet_length`](#group__midi__util_1gaa168b43af6ae9de0debce1625e4b8175)`(uint8_t status)` {#group__midi__util_1gaa168b43af6ae9de0debce1625e4b8175}
|
||||||
|
|
||||||
|
指定されたステータスバイトに関連付けられたパケットの長さを調べます。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `status` ステータスバイト
|
||||||
|
|
||||||
|
#### 返り値
|
||||||
|
パケットの長さ。バイトがステータスバイトではない場合、あるいは sysex ステータスバイトの場合は、UNDEFINED を返します。
|
||||||
|
|
||||||
246
docs/ja/internals_send_functions.md
Normal file
246
docs/ja/internals_send_functions.md
Normal file
|
|
@ -0,0 +1,246 @@
|
||||||
|
# `send_functions` グループ {#group__send__functions}
|
||||||
|
|
||||||
|
<!---
|
||||||
|
original document: 0.10.9:docs/internals_send_functions.md
|
||||||
|
git diff 0.10.9 HEAD -- docs/internals_send_functions.md | cat
|
||||||
|
-->
|
||||||
|
|
||||||
|
これらは、デバイスを介して MIDI データを送信するために使う関数です。
|
||||||
|
|
||||||
|
## 概要
|
||||||
|
|
||||||
|
メンバー | 説明
|
||||||
|
--------------------------------|---------------------------------------------
|
||||||
|
`public void `[`midi_send_cc`](#group__send__functions_1gaaf884811c92df405ca8fe1a00082f960)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num,uint8_t val)` | 指定されたデバイスを介して、コントロールチェンジメッセージを送信します。
|
||||||
|
`public void `[`midi_send_noteon`](#group__send__functions_1ga467bcf46dbf03ec269ce565b46bc2775)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num,uint8_t vel)` | 指定されたデバイスを介してノートオンメッセージを送信します。
|
||||||
|
`public void `[`midi_send_noteoff`](#group__send__functions_1gaedb7d8805425eef5d47d57ddcb4c7a49)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num,uint8_t vel)` | 指定されたデバイスを介してノートオフメッセージを送信します。
|
||||||
|
`public void `[`midi_send_aftertouch`](#group__send__functions_1ga0014847571317a0e34b2ef46a6bc584f)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t note_num,uint8_t amt)` | 指定されたデバイスを介してアフタータッチメッセージを送信します。
|
||||||
|
`public void `[`midi_send_pitchbend`](#group__send__functions_1gae5a4a1e71611e7534be80af9ce3d3491)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,int16_t amt)` | 指定されたデバイスを介してピッチベンドメッセージを送信します。
|
||||||
|
`public void `[`midi_send_programchange`](#group__send__functions_1ga7b15588ef25e5e1ff09c2afc3151ce86)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num)` | 指定されたデバイスを介してプログラムチェンジメッセージを送信します。
|
||||||
|
`public void `[`midi_send_channelpressure`](#group__send__functions_1gaf23e69fdf812e89c0036f51f88ab2e1b)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t amt)` | 指定されたデバイスを介してチャンネルプレッシャーメッセージを送信します。
|
||||||
|
`public void `[`midi_send_clock`](#group__send__functions_1ga4e1b11a7cdb0875f6e03ce7c79c581aa)`(`[`MidiDevice`](#struct__midi__device)` * device)` | 指定されたデバイスを介してクロックメッセージを送信します。
|
||||||
|
`public void `[`midi_send_tick`](#group__send__functions_1ga2b43c7d433d940c5b907595aac947972)`(`[`MidiDevice`](#struct__midi__device)` * device)` | 指定されたデバイスを介してティックメッセージを送信します。
|
||||||
|
`public void `[`midi_send_start`](#group__send__functions_1ga1569749a8d58ccc56789289d7c7245cc)`(`[`MidiDevice`](#struct__midi__device)` * device)` | 指定されたデバイスを介してスタートメッセージを送信します。
|
||||||
|
`public void `[`midi_send_continue`](#group__send__functions_1gaed5dc29d754a27372e89ab8bc20ee120)`(`[`MidiDevice`](#struct__midi__device)` * device)` | 指定されたデバイスを介してコンティニューメッセージを送信します。
|
||||||
|
`public void `[`midi_send_stop`](#group__send__functions_1ga026e1a620276cb653ac501aa0d12a988)`(`[`MidiDevice`](#struct__midi__device)` * device)` | 指定されたデバイスを介してストップメッセージを送信します。
|
||||||
|
`public void `[`midi_send_activesense`](#group__send__functions_1ga9b6e4c6ce4719d2604187b325620db37)`(`[`MidiDevice`](#struct__midi__device)` * device)` | 指定されたデバイスを介してアクティブセンスメッセージを送信します。
|
||||||
|
`public void `[`midi_send_reset`](#group__send__functions_1ga3671e39a6d93ca9568fc493001af1b1b)`(`[`MidiDevice`](#struct__midi__device)` * device)` | 指定されたデバイスを介してリセットメッセージを送信します。
|
||||||
|
`public void `[`midi_send_tcquarterframe`](#group__send__functions_1ga5b85639910eec280bb744c934d0fd45a)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t time)` | 指定されたデバイスを介してタイムコードクォータフレームメッセージを送信します。
|
||||||
|
`public void `[`midi_send_songposition`](#group__send__functions_1gab1c9eeef3b57a8cd2e6128d18e85eb7f)`(`[`MidiDevice`](#struct__midi__device)` * device,uint16_t pos)` | 指定されたデバイスを介してソングポジションメッセージを送信します。
|
||||||
|
`public void `[`midi_send_songselect`](#group__send__functions_1ga42de7838ba70d949af9a50f9facc3c50)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t song)` | 指定されたデバイスを介してソングセレクトメッセージを送信します。
|
||||||
|
`public void `[`midi_send_tunerequest`](#group__send__functions_1ga8db6c7e04d48e4d2266dd59118ca0656)`(`[`MidiDevice`](#struct__midi__device)` * device)` | 指定されたデバイスを介してチューンリクエストメッセージを送信します。
|
||||||
|
`public void `[`midi_send_byte`](#group__send__functions_1ga857e85eb90b288385642d4d991e09881)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t b)` | 指定されたデバイスを介してバイトを送信します。
|
||||||
|
`public void `[`midi_send_data`](#group__send__functions_1ga36e2f2e45369d911b76969361679054b)`(`[`MidiDevice`](#struct__midi__device)` * device,uint16_t count,uint8_t byte0,uint8_t byte1,uint8_t byte2)` | 最大3バイトのデータを送信します。
|
||||||
|
`public void `[`midi_send_array`](#group__send__functions_1ga245243cb1da18d2cea18d4b18d846ead)`(`[`MidiDevice`](#struct__midi__device)` * device,uint16_t count,uint8_t * array)` | フォーマットされた MIDI データの配列を送信します。
|
||||||
|
|
||||||
|
## メンバー
|
||||||
|
|
||||||
|
#### `public void `[`midi_send_cc`](#group__send__functions_1gaaf884811c92df405ca8fe1a00082f960)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num,uint8_t val)` {#group__send__functions_1gaaf884811c92df405ca8fe1a00082f960}
|
||||||
|
|
||||||
|
指定されたデバイスを介して、コントロールチェンジメッセージ(cc)を送信します。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 送信に使うデバイス
|
||||||
|
|
||||||
|
* `chan` 送信するチャンネル、0-15
|
||||||
|
|
||||||
|
* `num` コントロールチェンジナンバー
|
||||||
|
|
||||||
|
* `val` コントロールチェンジナンバーの値
|
||||||
|
|
||||||
|
#### `public void `[`midi_send_noteon`](#group__send__functions_1ga467bcf46dbf03ec269ce565b46bc2775)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num,uint8_t vel)` {#group__send__functions_1ga467bcf46dbf03ec269ce565b46bc2775}
|
||||||
|
|
||||||
|
指定されたデバイスを介してノートオンメッセージを送信します。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 送信に使うデバイス
|
||||||
|
|
||||||
|
* `chan` 送信するチャンネル、0-15
|
||||||
|
|
||||||
|
* `num` ノート番号
|
||||||
|
|
||||||
|
* `vel` ノートベロシティ
|
||||||
|
|
||||||
|
#### `public void `[`midi_send_noteoff`](#group__send__functions_1gaedb7d8805425eef5d47d57ddcb4c7a49)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num,uint8_t vel)` {#group__send__functions_1gaedb7d8805425eef5d47d57ddcb4c7a49}
|
||||||
|
|
||||||
|
指定されたデバイスを介してノートオフメッセージを送信します。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 送信に使うデバイス
|
||||||
|
|
||||||
|
* `chan` 送信するチャンネル、0-15
|
||||||
|
|
||||||
|
* `num` ノート番号
|
||||||
|
|
||||||
|
* `vel` ノートベロシティ
|
||||||
|
|
||||||
|
#### `public void `[`midi_send_aftertouch`](#group__send__functions_1ga0014847571317a0e34b2ef46a6bc584f)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t note_num,uint8_t amt)` {#group__send__functions_1ga0014847571317a0e34b2ef46a6bc584f}
|
||||||
|
|
||||||
|
指定されたデバイスを介してアフタータッチメッセージを送信します。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 送信に使うデバイス
|
||||||
|
|
||||||
|
* `chan` 送信するチャンネル、0-15
|
||||||
|
|
||||||
|
* `note_num` ノート番号
|
||||||
|
|
||||||
|
* `amt` アフタータッチ量
|
||||||
|
|
||||||
|
#### `public void `[`midi_send_pitchbend`](#group__send__functions_1gae5a4a1e71611e7534be80af9ce3d3491)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,int16_t amt)` {#group__send__functions_1gae5a4a1e71611e7534be80af9ce3d3491}
|
||||||
|
|
||||||
|
指定されたデバイスを介してピッチベンドメッセージを送信します。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 送信に使うデバイス
|
||||||
|
|
||||||
|
* `chan` 送信するチャンネル、0-15
|
||||||
|
|
||||||
|
* `amt` ベンド量の範囲: -8192..8191、0 はベンドしないことを意味します
|
||||||
|
|
||||||
|
#### `public void `[`midi_send_programchange`](#group__send__functions_1ga7b15588ef25e5e1ff09c2afc3151ce86)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num)` {#group__send__functions_1ga7b15588ef25e5e1ff09c2afc3151ce86}
|
||||||
|
|
||||||
|
指定されたデバイスを介してプログラムチェンジメッセージを送信します。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 送信に使うデバイス
|
||||||
|
|
||||||
|
* `chan` 送信するチャンネル、0-15
|
||||||
|
|
||||||
|
* `num` 変更先のプログラム
|
||||||
|
|
||||||
|
#### `public void `[`midi_send_channelpressure`](#group__send__functions_1gaf23e69fdf812e89c0036f51f88ab2e1b)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t amt)` {#group__send__functions_1gaf23e69fdf812e89c0036f51f88ab2e1b}
|
||||||
|
|
||||||
|
指定されたデバイスを介してチャンネルプレッシャーメッセージを送信します。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 送信に使うデバイス
|
||||||
|
|
||||||
|
* `chan` 送信するチャンネル、0-15
|
||||||
|
|
||||||
|
* `amt` チャンネルプレッシャーの量
|
||||||
|
|
||||||
|
#### `public void `[`midi_send_clock`](#group__send__functions_1ga4e1b11a7cdb0875f6e03ce7c79c581aa)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1ga4e1b11a7cdb0875f6e03ce7c79c581aa}
|
||||||
|
|
||||||
|
指定されたデバイスを介してクロックメッセージを送信します。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 送信に使うデバイス
|
||||||
|
|
||||||
|
#### `public void `[`midi_send_tick`](#group__send__functions_1ga2b43c7d433d940c5b907595aac947972)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1ga2b43c7d433d940c5b907595aac947972}
|
||||||
|
|
||||||
|
指定されたデバイスを介してティックメッセージを送信します。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 送信に使うデバイス
|
||||||
|
|
||||||
|
#### `public void `[`midi_send_start`](#group__send__functions_1ga1569749a8d58ccc56789289d7c7245cc)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1ga1569749a8d58ccc56789289d7c7245cc}
|
||||||
|
|
||||||
|
指定されたデバイスを介してスタートメッセージを送信します。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 送信に使うデバイス
|
||||||
|
|
||||||
|
#### `public void `[`midi_send_continue`](#group__send__functions_1gaed5dc29d754a27372e89ab8bc20ee120)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1gaed5dc29d754a27372e89ab8bc20ee120}
|
||||||
|
|
||||||
|
指定されたデバイスを介してコンティニューメッセージを送信します。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 送信に使うデバイス
|
||||||
|
|
||||||
|
#### `public void `[`midi_send_stop`](#group__send__functions_1ga026e1a620276cb653ac501aa0d12a988)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1ga026e1a620276cb653ac501aa0d12a988}
|
||||||
|
|
||||||
|
指定されたデバイスを介してストップメッセージを送信します。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 送信に使うデバイス
|
||||||
|
|
||||||
|
#### `public void `[`midi_send_activesense`](#group__send__functions_1ga9b6e4c6ce4719d2604187b325620db37)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1ga9b6e4c6ce4719d2604187b325620db37}
|
||||||
|
|
||||||
|
指定されたデバイスを介してアクティブセンスメッセージを送信します。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 送信に使うデバイス
|
||||||
|
|
||||||
|
#### `public void `[`midi_send_reset`](#group__send__functions_1ga3671e39a6d93ca9568fc493001af1b1b)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1ga3671e39a6d93ca9568fc493001af1b1b}
|
||||||
|
|
||||||
|
指定されたデバイスを介してリセットメッセージを送信します。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 送信に使うデバイス
|
||||||
|
|
||||||
|
#### `public void `[`midi_send_tcquarterframe`](#group__send__functions_1ga5b85639910eec280bb744c934d0fd45a)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t time)` {#group__send__functions_1ga5b85639910eec280bb744c934d0fd45a}
|
||||||
|
|
||||||
|
指定されたデバイスを介してタイムコードクォータフレームメッセージを送信します。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 送信に使うデバイス
|
||||||
|
|
||||||
|
* `time` このクォータフレームの時間。範囲は、0..16383
|
||||||
|
|
||||||
|
#### `public void `[`midi_send_songposition`](#group__send__functions_1gab1c9eeef3b57a8cd2e6128d18e85eb7f)`(`[`MidiDevice`](#struct__midi__device)` * device,uint16_t pos)` {#group__send__functions_1gab1c9eeef3b57a8cd2e6128d18e85eb7f}
|
||||||
|
|
||||||
|
指定されたデバイスを介してソングポジションメッセージを送信します。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 送信に使うデバイス
|
||||||
|
|
||||||
|
* `pos` ソングポジション
|
||||||
|
|
||||||
|
#### `public void `[`midi_send_songselect`](#group__send__functions_1ga42de7838ba70d949af9a50f9facc3c50)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t song)` {#group__send__functions_1ga42de7838ba70d949af9a50f9facc3c50}
|
||||||
|
|
||||||
|
指定されたデバイスを介してソングセレクトメッセージを送信します。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 送信に使うデバイス
|
||||||
|
|
||||||
|
* `song` 選択するソング
|
||||||
|
|
||||||
|
#### `public void `[`midi_send_tunerequest`](#group__send__functions_1ga8db6c7e04d48e4d2266dd59118ca0656)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1ga8db6c7e04d48e4d2266dd59118ca0656}
|
||||||
|
|
||||||
|
指定されたデバイスを介してチューンリクエストメッセージを送信します。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 送信に使うデバイス
|
||||||
|
|
||||||
|
#### `public void `[`midi_send_byte`](#group__send__functions_1ga857e85eb90b288385642d4d991e09881)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t b)` {#group__send__functions_1ga857e85eb90b288385642d4d991e09881}
|
||||||
|
|
||||||
|
指定されたデバイスを介してバイトを送信します。
|
||||||
|
|
||||||
|
これは、指定された MIDI デバイスを介してデータを送信する一般的なメソッドです。これは、この API に実装されていない sysex データまたはメッセージがある場合、それらを送信するのに役立ちます。そのようなものを見つけた場合は、私たちがそれらを追加できるように、作者に連絡してください。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 送信に使うデバイス
|
||||||
|
|
||||||
|
* `b` 送信するバイト
|
||||||
|
|
||||||
|
#### `public void `[`midi_send_data`](#group__send__functions_1ga36e2f2e45369d911b76969361679054b)`(`[`MidiDevice`](#struct__midi__device)` * device,uint16_t count,uint8_t byte0,uint8_t byte1,uint8_t byte2)` {#group__send__functions_1ga36e2f2e45369d911b76969361679054b}
|
||||||
|
|
||||||
|
最大3バイトのデータを送信します。
|
||||||
|
|
||||||
|
これを使って sysex を通過できるように count に4の剰余が適用されます。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 送信に使うデバイス
|
||||||
|
|
||||||
|
* `count` 送信するバイト数、4の剰余が適用されます
|
||||||
|
|
||||||
|
* `byte0` 最初のバイト
|
||||||
|
|
||||||
|
* `byte1` 2番目のバイト。cnt % 4 != 2 の場合は無視されます
|
||||||
|
|
||||||
|
* `byte2` 3番目のバイト。cnt % 4 != 3 の場合は無視されます
|
||||||
|
|
||||||
|
#### `public void `[`midi_send_array`](#group__send__functions_1ga245243cb1da18d2cea18d4b18d846ead)`(`[`MidiDevice`](#struct__midi__device)` * device,uint16_t count,uint8_t * array)` {#group__send__functions_1ga245243cb1da18d2cea18d4b18d846ead}
|
||||||
|
|
||||||
|
フォーマットされた MIDI データの配列を送信します。
|
||||||
|
|
||||||
|
sysex に使うことができます。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 送信に使うデバイス
|
||||||
|
|
||||||
|
* `count` 送信するバイト数
|
||||||
|
|
||||||
|
* `array` バイトの配列
|
||||||
|
|
||||||
66
docs/ja/internals_sysex_tools.md
Normal file
66
docs/ja/internals_sysex_tools.md
Normal file
|
|
@ -0,0 +1,66 @@
|
||||||
|
# `sysex_tools` グループ {#group__sysex__tools}
|
||||||
|
|
||||||
|
<!---
|
||||||
|
original document: 0.10.9:docs/internals_sysex_tools.md
|
||||||
|
git diff 0.10.9 HEAD -- docs/internals_sysex_tools.md | cat
|
||||||
|
-->
|
||||||
|
|
||||||
|
## 概要
|
||||||
|
|
||||||
|
| メンバー | 説明
|
||||||
|
--------------------------------|---------------------------------------------
|
||||||
|
| `public uint16_t `[`sysex_encoded_length`](#group__sysex__tools_1ga061e5607030412d6e62e2390d8013f0a)`(uint16_t decoded_length)` | エンコード後のメッセージの長さを計算します。
|
||||||
|
| `public uint16_t `[`sysex_decoded_length`](#group__sysex__tools_1ga121fc227d3acc1c0ea08c9a5c26fa3b0)`(uint16_t encoded_length)` | デコード後のメッセージの長さを計算します。
|
||||||
|
| `public uint16_t `[`sysex_encode`](#group__sysex__tools_1ga54d77f8d32f92a6f329daefa2b314742)`(uint8_t * encoded,const uint8_t * source,uint16_t length)` | sysex メッセージで安全に送信できるようにデータをエンコードします。
|
||||||
|
| `public uint16_t `[`sysex_decode`](#group__sysex__tools_1gaaad1d9ba2d5eca709a0ab4ba40662229)`(uint8_t * decoded,const uint8_t * source,uint16_t length)` | エンコードされたデータをデコードします。
|
||||||
|
|
||||||
|
## メンバー
|
||||||
|
|
||||||
|
#### `public uint16_t `[`sysex_encoded_length`](#group__sysex__tools_1ga061e5607030412d6e62e2390d8013f0a)`(uint16_t decoded_length)` {#group__sysex__tools_1ga061e5607030412d6e62e2390d8013f0a}
|
||||||
|
|
||||||
|
エンコード後のメッセージの長さを計算します。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `decoded_length` エンコードするメッセージの長さのバイト数。
|
||||||
|
|
||||||
|
#### 返り値
|
||||||
|
エンコード後のメッセージの長さのバイト数。
|
||||||
|
|
||||||
|
#### `public uint16_t `[`sysex_decoded_length`](#group__sysex__tools_1ga121fc227d3acc1c0ea08c9a5c26fa3b0)`(uint16_t encoded_length)` {#group__sysex__tools_1ga121fc227d3acc1c0ea08c9a5c26fa3b0}
|
||||||
|
|
||||||
|
デコード後のメッセージの長さを計算します。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `encoded_length` エンコードされたメッセージの長さのバイト数。
|
||||||
|
|
||||||
|
#### 返り値
|
||||||
|
デコードされた後のメッセージの長さのバイト数。
|
||||||
|
|
||||||
|
#### `public uint16_t `[`sysex_encode`](#group__sysex__tools_1ga54d77f8d32f92a6f329daefa2b314742)`(uint8_t * encoded,const uint8_t * source,uint16_t length)` {#group__sysex__tools_1ga54d77f8d32f92a6f329daefa2b314742}
|
||||||
|
|
||||||
|
sysex メッセージで安全に送信できるようにデータをエンコードします。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `encoded` 出力データバッファは、少なくとも sysex_encoded_length(length) バイトの長さが必要です。
|
||||||
|
|
||||||
|
* `source` エンコードされるデータの入力バッファ。
|
||||||
|
|
||||||
|
* `length` 入力バッファからエンコードするバイト数。
|
||||||
|
|
||||||
|
#### 返り値
|
||||||
|
エンコードされたバイト数。
|
||||||
|
|
||||||
|
#### `public uint16_t `[`sysex_decode`](#group__sysex__tools_1gaaad1d9ba2d5eca709a0ab4ba40662229)`(uint8_t * decoded,const uint8_t * source,uint16_t length)` {#group__sysex__tools_1gaaad1d9ba2d5eca709a0ab4ba40662229}
|
||||||
|
|
||||||
|
エンコードされたデータをデコードします。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `decoded` 出力データバッファは、少なくとも sysex_decoded_length(length) バイトの長さが必要です。
|
||||||
|
|
||||||
|
* `source` デコードされるデータの入力バッファ。
|
||||||
|
|
||||||
|
* `length` 入力バッファからデコードするバイト数。
|
||||||
|
|
||||||
|
#### 返り値
|
||||||
|
デコードされたバイト数。
|
||||||
|
|
||||||
|
|
@ -27,7 +27,7 @@ QMK で現在サポートされているキーボードが Pro Micro(または
|
||||||
#endif
|
#endif
|
||||||
```
|
```
|
||||||
|
|
||||||
`PORTB/DDRB` などが定義されていないというエラーが発生した場合は、ARM と AVR の両方で機能する [GPIO 制御](ja/gpio_control.md) を使用するようにキーボードのコードを変換する必要があります。これは AVR ビルドにまったく影響を与えません。
|
`PORTB/DDRB` などが定義されていないというエラーが発生した場合は、ARM と AVR の両方で機能する [GPIO 制御](ja/internals_gpio_control.md) を使用するようにキーボードのコードを変換する必要があります。これは AVR ビルドにまったく影響を与えません。
|
||||||
|
|
||||||
Proton C には1つのオンボード LED(C13)しかなく、デフォルトでは TXLED(D5) がそれにマップされています。代わりに RXLED(B0) をそれにマッピングしたい場合は、`config.h` に次のように追加してください。
|
Proton C には1つのオンボード LED(C13)しかなく、デフォルトでは TXLED(D5) がそれにマップされています。代わりに RXLED(B0) をそれにマッピングしたい場合は、`config.h` に次のように追加してください。
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -219,13 +219,11 @@ See also: [Basic Keycodes](keycodes_basic.md)
|
||||||
|
|
||||||
See also: [Quantum Keycodes](quantum_keycodes.md#qmk-keycodes)
|
See also: [Quantum Keycodes](quantum_keycodes.md#qmk-keycodes)
|
||||||
|
|
||||||
|Key |Aliases |Description |
|
|Key |Aliases |Description |
|
||||||
|-----------------|---------|---------------------------------------------------------------------------------|
|
|-----------------|---------|-------------------------------------------------------|
|
||||||
|`QK_BOOTLOADER` |`QK_BOOT`|Put the keyboard into bootloader mode for flashing |
|
|`QK_BOOTLOADER` |`QK_BOOT`|Put the keyboard into bootloader mode for flashing |
|
||||||
|`QK_DEBUG_TOGGLE`|`DB_TOGG`|Toggle debug mode |
|
|`QK_DEBUG_TOGGLE`|`DB_TOGG`|Toggle debug mode |
|
||||||
|`QK_CLEAR_EEPROM`|`EE_CLR` |Reinitializes the keyboard's EEPROM (persistent memory) |
|
|`QK_CLEAR_EEPROM`|`EE_CLR` |Reinitializes the keyboard's EEPROM (persistent memory)|
|
||||||
|`QK_MAKE` | |Sends `qmk compile -kb (keyboard) -km (keymap)`, or `qmk flash` if shift is held |
|
|
||||||
|`QK_REBOOT` |`QK_RBT` |Resets the keyboard. Does not load the bootloader |
|
|
||||||
|
|
||||||
## Audio Keys :id=audio-keys
|
## Audio Keys :id=audio-keys
|
||||||
|
|
||||||
|
|
@ -269,14 +267,6 @@ See also: [Bluetooth](feature_bluetooth.md)
|
||||||
|`OUT_USB` |USB only |
|
|`OUT_USB` |USB only |
|
||||||
|`OUT_BT` |Bluetooth only |
|
|`OUT_BT` |Bluetooth only |
|
||||||
|
|
||||||
## Caps Word :id=caps-word
|
|
||||||
|
|
||||||
See also: [Caps Word](feature_caps_word.md)
|
|
||||||
|
|
||||||
|Key |Aliases |Description |
|
|
||||||
|-----------|---------|------------------------------|
|
|
||||||
|`CAPS_WORD`|`CAPSWRD`|Toggles Caps Word |
|
|
||||||
|
|
||||||
## Dynamic Macros :id=dynamic-macros
|
## Dynamic Macros :id=dynamic-macros
|
||||||
|
|
||||||
See also: [Dynamic Macros](feature_dynamic_macros.md)
|
See also: [Dynamic Macros](feature_dynamic_macros.md)
|
||||||
|
|
|
||||||
|
|
@ -108,8 +108,6 @@ However, this does rely on the bootloader being set by the keyboard. If this inf
|
||||||
|
|
||||||
In this case, you'll have to fall back on specifying the bootloader. See the [Flashing Firmware](flashing.md) Guide for more details.
|
In this case, you'll have to fall back on specifying the bootloader. See the [Flashing Firmware](flashing.md) Guide for more details.
|
||||||
|
|
||||||
!> If your bootloader is not detected by `qmk flash`, try running `qmk doctor` for suggestions on how to fix common problems.
|
|
||||||
|
|
||||||
## Test It Out!
|
## Test It Out!
|
||||||
|
|
||||||
Congrats! Your custom firmware has been programmed to your keyboard and you're ready to test it out!
|
Congrats! Your custom firmware has been programmed to your keyboard and you're ready to test it out!
|
||||||
|
|
|
||||||
|
|
@ -27,24 +27,30 @@ QMK maintains a Bundle of MSYS2, the CLI and all necessary dependencies. It also
|
||||||
|
|
||||||
You will need to install [QMK MSYS](https://msys.qmk.fm/). The latest release is available [here](https://github.com/qmk/qmk_distro_msys/releases/latest).
|
You will need to install [QMK MSYS](https://msys.qmk.fm/). The latest release is available [here](https://github.com/qmk/qmk_distro_msys/releases/latest).
|
||||||
|
|
||||||
|
Alternatively, if you'd like to manually install MSYS2, the following section will walk you through the process.
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>Advanced Users</summary>
|
<summary>Manual Install</summary>
|
||||||
|
|
||||||
!> <b style="font-size:150%">This process is not recommended for new users.</b>
|
?> Ignore the following steps if you use `QMK MSYS`.
|
||||||
|
|
||||||
If you'd like to manually install MSYS2, the following sections will walk you through the process.
|
|
||||||
|
|
||||||
#### Prerequisites
|
#### Prerequisites
|
||||||
|
|
||||||
You will need to install [MSYS2](https://www.msys2.org). Once installed, close any open MSYS terminals (purple icon) and open a new MinGW 64-bit terminal (blue icon) from the Start Menu.
|
You will need to install MSYS2, Git and Python. Follow the installation instructions on https://www.msys2.org.
|
||||||
|
|
||||||
|
Once MSYS2 is installed, close any open MSYS terminals and open a new MinGW 64-bit terminal.
|
||||||
|
|
||||||
!> **NOTE:** The MinGW 64-bit terminal is *not* the same as the MSYS terminal that opens when installation is completed. Your prompt should say "MINGW64" in purple text, rather than "MSYS". See [this page](https://www.msys2.org/wiki/MSYS2-introduction/#subsystems) for more information on the differences.
|
!> **NOTE:** The MinGW 64-bit terminal is *not* the same as the MSYS terminal that opens when installation is completed. Your prompt should say "MINGW64" in purple text, rather than "MSYS". See [this page](https://www.msys2.org/wiki/MSYS2-introduction/#subsystems) for more information on the differences.
|
||||||
|
|
||||||
|
Then run the following command:
|
||||||
|
|
||||||
|
pacman --needed --noconfirm --disable-download-timeout -S git mingw-w64-x86_64-toolchain mingw-w64-x86_64-python3-pip
|
||||||
|
|
||||||
#### Installation
|
#### Installation
|
||||||
|
|
||||||
Install the QMK CLI by running:
|
Install the QMK CLI by running:
|
||||||
|
|
||||||
pacman --needed --noconfirm --disable-download-timeout -S git mingw-w64-x86_64-python-qmk
|
python3 -m pip install qmk
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -104,8 +104,10 @@ There are a number of extensions that you may want to install:
|
||||||
* [Git Extension Pack](https://marketplace.visualstudio.com/items?itemName=donjayamanne.git-extension-pack) -
|
* [Git Extension Pack](https://marketplace.visualstudio.com/items?itemName=donjayamanne.git-extension-pack) -
|
||||||
This installs a bunch of Git related tools that may make using Git with QMK Firmware easier.
|
This installs a bunch of Git related tools that may make using Git with QMK Firmware easier.
|
||||||
* [EditorConfig for VS Code](https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig) - _[Optional]_ - Helps to keep the code to the QMK Coding Conventions.
|
* [EditorConfig for VS Code](https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig) - _[Optional]_ - Helps to keep the code to the QMK Coding Conventions.
|
||||||
|
* [Bracket Pair Colorizer 2](https://marketplace.visualstudio.com/items?itemName=CoenraadS.bracket-pair-colorizer-2) - _[Optional]_ - This color codes the brackets in your code, to make it easier to reference nested code.
|
||||||
* [GitHub Markdown Preview](https://marketplace.visualstudio.com/items?itemName=bierner.github-markdown-preview) - _[Optional]_ - Makes the markdown preview in VS Code more like GitHub's.
|
* [GitHub Markdown Preview](https://marketplace.visualstudio.com/items?itemName=bierner.github-markdown-preview) - _[Optional]_ - Makes the markdown preview in VS Code more like GitHub's.
|
||||||
* [VS Live Share Extension Pack](https://marketplace.visualstudio.com/items?itemName=MS-vsliveshare.vsliveshare-pack) - _[Optional]_ - This extension allows somebody else to access your workspace (or you to access somebody else's workspace) and help out. This is great if you're having issues and need some help from somebody.
|
* [VS Live Share Extension Pack](https://marketplace.visualstudio.com/items?itemName=MS-vsliveshare.vsliveshare-pack) - _[Optional]_ - This extension allows somebody else to access your workspace (or you to access somebody else's workspace) and help out. This is great if you're having issues and need some help from somebody.
|
||||||
|
* [VIM Keymap](https://marketplace.visualstudio.com/items?itemName=GiuseppeCesarano.vim-keymap) - _[Optional]_ - For those that prefer VIM style keybindings. There are other options for this, too.
|
||||||
|
|
||||||
Restart once you've installed any extensions
|
Restart once you've installed any extensions
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,48 +0,0 @@
|
||||||
# WeAct Blackpill (STM32F411)
|
|
||||||
|
|
||||||
The WeAct Blackpill is a popular choice for handwired boards, as it offers a powerful micro controller, USB Type C, a good number of pins to use, and a large amount of firmware space. All for a ~$6 USD price tag.
|
|
||||||
|
|
||||||
* [WeAct GitHub for F411 Blackpill](https://github.com/WeActTC/MiniSTM32F4x1)
|
|
||||||
* Unfortunately, due to supply issues official WeAct F411 based blackpills may not be available.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
## Pin Usage Limitations
|
|
||||||
|
|
||||||
While the Blackpill is a great choice to use in your keyboard, there are a number of caveats in regards to using them. The first is that a number of exposed pins cannot be used, or have special considerations/hardware tweaks that are required for proper opertion.
|
|
||||||
|
|
||||||
### Unusable pins
|
|
||||||
* Pins `A11` and `A12` are not useable because they're used for USB connection, and cannot be shared.
|
|
||||||
* In theory, these pins can be used. However, doing so may disable USB connectivity, outright, if used for anything other than a USB port
|
|
||||||
* Pin `B2` is used by `BOOT1` and cannot be used, without causing problems.
|
|
||||||
* `VBAT` is not a usable pin.
|
|
||||||
* `NRST` is not a usable pin.
|
|
||||||
|
|
||||||
### Pins to be avoided
|
|
||||||
* Pin `A9` is meant for VBUS Sense and should not be used, if it can be avoided. It has an internal pull-down resesitor, which may cause issues with usage. However, a pull-up resistor can work (~5.1k), but should be avoided.
|
|
||||||
* Pin `A10` can be used, but should be avoided. Any connection on this pin can prevent the bootloader from entering the proper mode for DFU flashing. A pull-up resistor (~22k) on this pin fixes the bootloader issue.
|
|
||||||
|
|
||||||
### Shared Usage
|
|
||||||
* Pin `A0` is shared with the User Key (button) on the controller. It can be used.
|
|
||||||
* Pin `C13` is shared with the onboard LED indicator, and is connected to +3.3V. This can be used, but may cause the LED to blink intermittently, depending on activity on the pin.
|
|
||||||
*
|
|
||||||
* Pins `A4`, `A5`, `A6` and `A7` are used by the SOI8 footprint on the back of the controller, that can be used for either an SPI Flash chip, or an SPI EEPROM chip. `A4` is the Chip Select pin, and cannot be shared. However, `A5`, `A6`, and `A7` are the `SCK`, `MISO`, and `MOSI` pins, respectively, and can be shared with other SPI devices.
|
|
||||||
|
|
||||||
### Limited Usage
|
|
||||||
* Pins `C13`, `C14`, and `C15` have limits on output current. They should be used only as input. Eg, they should not be used for row pins in COL2ROW matrix configurations, but can be used as column pins.
|
|
||||||
* This is because the column pins (in COL2ROW) are pulled up (the pullup strength is independant of the current sourcing limitation) and the ROW is driven low and sinks current, then we check the state of the COLs to look for keypresses.
|
|
||||||
|
|
||||||
* Pins `A0` and `B5` are not 5V tolerant, and should only be used with 3.3V compatible functionality.
|
|
||||||
|
|
||||||
## Additional Information
|
|
||||||
|
|
||||||
### Bootloader issuse
|
|
||||||
|
|
||||||
Due to the use of a 25MHz crystal, the controller may have issues entering the bootloader. Heating up the controller can help with this issue.
|
|
||||||
|
|
||||||
Also, if pin `A10` is connected to anything at all, it needs to have a pullup resistor (see [Pins to be avoided](#pins-to-be-avoided), above)
|
|
||||||
|
|
||||||
### Tiny UF2 Support
|
|
||||||
|
|
||||||
There is [tinyuf2 support for the WeAct Blackpill](https://github.com/adafruit/tinyuf2/tree/master/ports/stm32f4/boards/stm32f411ce_blackpill). Instructions on how to compile the bootloadr can be found [here](https://github.com/adafruit/tinyuf2#build-and-flash). Setting `BOOTLOADER = tinyuf2` will enable support for this user bootloader, and the correct configuration to prevent it from being overwritten when flashing firmware.
|
|
||||||
|
|
@ -62,7 +62,7 @@ https://github.com/qmk/qmk_firmware/pulls?q=is%3Apr+is%3Aclosed+label%3Akeyboard
|
||||||
- modified `# Enable Bluetooth with the Adafruit EZ-Key HID` -> `# Enable Bluetooth`
|
- modified `# Enable Bluetooth with the Adafruit EZ-Key HID` -> `# Enable Bluetooth`
|
||||||
- no `(-/+size)` comments related to enabling features
|
- no `(-/+size)` comments related to enabling features
|
||||||
- remove the list of alternate bootloaders if one has been specified
|
- remove the list of alternate bootloaders if one has been specified
|
||||||
- no re-definitions of the default MCU parameters if same value, when compared to the equivalent MCU in [mcu_selection.mk](https://github.com/qmk/qmk_firmware/blob/master/builddefs/mcu_selection.mk)
|
- no re-definitions of the default MCU parameters if same value, when compared to the equivalent MCU in [mcu_selection.mk](https://github.com/qmk/qmk_firmware/blob/master/quantum/mcu_selection.mk)
|
||||||
- keyboard `config.h`
|
- keyboard `config.h`
|
||||||
- don't repeat `MANUFACTURER` in the `PRODUCT` value
|
- don't repeat `MANUFACTURER` in the `PRODUCT` value
|
||||||
- no `#define DESCRIPTION`
|
- no `#define DESCRIPTION`
|
||||||
|
|
@ -79,9 +79,6 @@ https://github.com/qmk/qmk_firmware/pulls?q=is%3Apr+is%3Aclosed+label%3Akeyboard
|
||||||
- `matrix_init_board()` etc. migrated to `keyboard_pre_init_kb()`, see: [keyboard_pre_init*](custom_quantum_functions.md?id=keyboard_pre_init_-function-documentation)
|
- `matrix_init_board()` etc. migrated to `keyboard_pre_init_kb()`, see: [keyboard_pre_init*](custom_quantum_functions.md?id=keyboard_pre_init_-function-documentation)
|
||||||
- prefer `CUSTOM_MATRIX = lite` if custom matrix used, allows for standard debounce, see [custom matrix 'lite'](custom_matrix.md?id=lite)
|
- prefer `CUSTOM_MATRIX = lite` if custom matrix used, allows for standard debounce, see [custom matrix 'lite'](custom_matrix.md?id=lite)
|
||||||
- prefer LED indicator [Configuration Options](feature_led_indicators.md?id=configuration-options) to custom `led_update_*()` implementations where possible
|
- prefer LED indicator [Configuration Options](feature_led_indicators.md?id=configuration-options) to custom `led_update_*()` implementations where possible
|
||||||
- Encoder support should not be hacked into the keymap here -- no `tap_code(dynamic_keymap_get_keycode())` or `action_exec()` hacks. The [Encoder Map](feature_encoders.md?id=encoder-map) feature already supports the dynamic keymap feature (what power's VIA's "live keymap updates" capability).
|
|
||||||
- If support is absolutely necessary, it should be implemented exclusively at the keymap level, with none of the implementation bleeding into the keyboard level (no empty rows/columns, no encoder specific layouts, etc.), as those configurations can be redefined at the keymap level. Keymaps can then choose to use the `action_exec` hack. <!-- because people will complain, give them a way to implement it, in the meanwhile. To be removed. -->
|
|
||||||
- [Request for official proper VIA support](https://github.com/the-via/app/issues/26)
|
|
||||||
- `<keyboard>.h`
|
- `<keyboard>.h`
|
||||||
- `#include "quantum.h"` appears at the top
|
- `#include "quantum.h"` appears at the top
|
||||||
- `LAYOUT` macros should use standard definitions if applicable
|
- `LAYOUT` macros should use standard definitions if applicable
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ This exposes the `CONVERT_TO_PROTON_C` flag that you can use in your code with `
|
||||||
#endif
|
#endif
|
||||||
```
|
```
|
||||||
|
|
||||||
If you get errors about `PORTB/DDRB`, etc not being defined, so you'll need to convert the keyboard's code to use the [GPIO Controls](gpio_control.md) that will work for both ARM and AVR. This shouldn't affect the AVR builds at all.
|
If you get errors about `PORTB/DDRB`, etc not being defined, so you'll need to convert the keyboard's code to use the [GPIO Controls](internals_gpio_control.md) that will work for both ARM and AVR. This shouldn't affect the AVR builds at all.
|
||||||
|
|
||||||
The Proton C only has one on-board LED (C13), and by default, the TXLED (D5) is mapped to it. If you want the RXLED (B0) mapped to it instead, add this like to your `config.h`:
|
The Proton C only has one on-board LED (C13), and by default, the TXLED (D5) is mapped to it. If you want the RXLED (B0) mapped to it instead, add this like to your `config.h`:
|
||||||
|
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue