forked from forks/qmk_firmware
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
e7f4d56592
|
@ -16,6 +16,10 @@ insert_final_newline = true
|
||||||
trim_trailing_whitespace = false
|
trim_trailing_whitespace = false
|
||||||
indent_size = 4
|
indent_size = 4
|
||||||
|
|
||||||
|
[{qmk,*.py}]
|
||||||
|
charset = utf-8
|
||||||
|
max_line_length = 200
|
||||||
|
|
||||||
# Make these match what we have in .gitattributes
|
# Make these match what we have in .gitattributes
|
||||||
[*.mk]
|
[*.mk]
|
||||||
end_of_line = lf
|
end_of_line = lf
|
||||||
|
|
8
.github/ISSUE_TEMPLATE/blank.md
vendored
8
.github/ISSUE_TEMPLATE/blank.md
vendored
|
@ -1,5 +1,11 @@
|
||||||
---
|
---
|
||||||
name: Blank issue
|
name: Blank issue
|
||||||
about: If you're 100% sure that you don't need one of the other issue templates, use this one instead.
|
about: If you're 100% sure that you don't need one of the other issue templates, use
|
||||||
|
this one instead.
|
||||||
|
title: ''
|
||||||
|
labels: help wanted, question
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
7
.github/ISSUE_TEMPLATE/bug_report.md
vendored
7
.github/ISSUE_TEMPLATE/bug_report.md
vendored
|
@ -1,7 +1,12 @@
|
||||||
---
|
---
|
||||||
name: Bug report
|
name: Bug report
|
||||||
about: Create a report to help us improve the QMK Firmware
|
about: Create a report to help us improve QMK Firmware.
|
||||||
|
title: "[Bug] "
|
||||||
|
labels: bug, help wanted, discussion
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- Provide a general summary of the bug in the title above. -->
|
<!-- Provide a general summary of the bug in the title above. -->
|
||||||
|
|
||||||
<!--- This template is entirely optional and can be removed, but is here to help both you and us. -->
|
<!--- This template is entirely optional and can be removed, but is here to help both you and us. -->
|
||||||
|
|
8
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
8
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
blank_issues_enabled: false
|
||||||
|
contact_links:
|
||||||
|
- name: QMK Discord
|
||||||
|
url: https://discord.gg/Uq7gcHh
|
||||||
|
about: Ask questions, discuss issues and features. Chill.
|
||||||
|
- name: OLKB Subreddit
|
||||||
|
url: https://www.reddit.com/r/olkb
|
||||||
|
about: All things OLKB and QMK.
|
7
.github/ISSUE_TEMPLATE/feature_request.md
vendored
7
.github/ISSUE_TEMPLATE/feature_request.md
vendored
|
@ -1,7 +1,12 @@
|
||||||
---
|
---
|
||||||
name: Feature request
|
name: Feature request
|
||||||
about: Suggest a new feature or changes to existing features
|
about: Suggest a new feature or changes to existing features.
|
||||||
|
title: "[Feature Request] "
|
||||||
|
labels: enhancement, help wanted, discussion
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<!--- Provide a general summary of the changes you want in the title above. -->
|
<!--- Provide a general summary of the changes you want in the title above. -->
|
||||||
|
|
||||||
<!--- This template is entirely optional and can be removed, but is here to help both you and us. -->
|
<!--- This template is entirely optional and can be removed, but is here to help both you and us. -->
|
||||||
|
|
5
.github/ISSUE_TEMPLATE/other_issues.md
vendored
5
.github/ISSUE_TEMPLATE/other_issues.md
vendored
|
@ -1,7 +1,12 @@
|
||||||
---
|
---
|
||||||
name: Other issues
|
name: Other issues
|
||||||
about: Anything else that doesn't fall into the above categories.
|
about: Anything else that doesn't fall into the above categories.
|
||||||
|
title: ''
|
||||||
|
labels: help wanted, question, discussion
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<!--- Provide a general summary of the changes you want in the title above. -->
|
<!--- Provide a general summary of the changes you want in the title above. -->
|
||||||
|
|
||||||
<!--- Anything on lines wrapped in comments like these will not show up in the final text. -->
|
<!--- Anything on lines wrapped in comments like these will not show up in the final text. -->
|
||||||
|
|
52
.github/stale.yml
vendored
Normal file
52
.github/stale.yml
vendored
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
# 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.
|
||||||
|
# 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: solved
|
||||||
|
limitPerRun: 10
|
||||||
|
daysUntilStale: 90
|
||||||
|
daysUntilClose: 30
|
||||||
|
markComment: >
|
||||||
|
This issue has been automatically marked as resolved 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.
|
||||||
|
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
|
7
.gitignore
vendored
7
.gitignore
vendored
|
@ -25,7 +25,7 @@ quantum/version.h
|
||||||
CMakeLists.txt
|
CMakeLists.txt
|
||||||
cmake-build-debug
|
cmake-build-debug
|
||||||
doxygen/
|
doxygen/
|
||||||
.DS_STORE
|
.DS_Store
|
||||||
/util/wsl_downloaded
|
/util/wsl_downloaded
|
||||||
/util/win_downloaded
|
/util/win_downloaded
|
||||||
/keyboards/*/Makefile
|
/keyboards/*/Makefile
|
||||||
|
@ -60,8 +60,8 @@ util/Win_Check_Output.txt
|
||||||
|
|
||||||
# ignore image files
|
# ignore image files
|
||||||
*.png
|
*.png
|
||||||
*.jpg
|
|
||||||
*.gif
|
*.gif
|
||||||
|
*.jpg
|
||||||
|
|
||||||
# Do not ignore MiniDox left/right hand eeprom files
|
# Do not ignore MiniDox left/right hand eeprom files
|
||||||
!keyboards/minidox/*.eep
|
!keyboards/minidox/*.eep
|
||||||
|
@ -70,3 +70,6 @@ util/Win_Check_Output.txt
|
||||||
secrets.tar
|
secrets.tar
|
||||||
id_rsa_*
|
id_rsa_*
|
||||||
/.vs
|
/.vs
|
||||||
|
|
||||||
|
# python things
|
||||||
|
__pycache__
|
||||||
|
|
3
.gitmodules
vendored
3
.gitmodules
vendored
|
@ -11,3 +11,6 @@
|
||||||
[submodule "lib/googletest"]
|
[submodule "lib/googletest"]
|
||||||
path = lib/googletest
|
path = lib/googletest
|
||||||
url = https://github.com/google/googletest
|
url = https://github.com/google/googletest
|
||||||
|
[submodule "lib/lufa"]
|
||||||
|
path = lib/lufa
|
||||||
|
url = https://github.com/qmk/lufa
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
os: linux
|
os: linux
|
||||||
dist: trusty
|
dist: trusty
|
||||||
sudo: required
|
|
||||||
group: edge
|
group: edge
|
||||||
language: c
|
language: c
|
||||||
branches:
|
branches:
|
||||||
|
@ -13,12 +12,11 @@ env:
|
||||||
- MAKEFLAGS="-j3 --output-sync"
|
- MAKEFLAGS="-j3 --output-sync"
|
||||||
services:
|
services:
|
||||||
- docker
|
- docker
|
||||||
before_install:
|
|
||||||
- docker build -t qmkfm/qmk_firmware .
|
|
||||||
install:
|
install:
|
||||||
- npm install -g moxygen
|
- npm install -g moxygen
|
||||||
script:
|
script:
|
||||||
- git rev-parse --short HEAD
|
- git rev-parse --short HEAD
|
||||||
|
- git diff --name-only HEAD $TRAVIS_BRANCH
|
||||||
- bash util/travis_test.sh
|
- bash util/travis_test.sh
|
||||||
- bash util/travis_build.sh
|
- bash util/travis_build.sh
|
||||||
- bash util/travis_docs.sh
|
- bash util/travis_docs.sh
|
||||||
|
@ -29,7 +27,7 @@ addons:
|
||||||
- diffutils
|
- diffutils
|
||||||
- dos2unix
|
- dos2unix
|
||||||
- doxygen
|
- doxygen
|
||||||
after_success:
|
after_script:
|
||||||
bash util/travis_compiled_push.sh
|
bash util/travis_compiled_push.sh
|
||||||
notifications:
|
notifications:
|
||||||
webhooks:
|
webhooks:
|
||||||
|
|
7
.vscode/extensions.json
vendored
7
.vscode/extensions.json
vendored
|
@ -1,6 +1,11 @@
|
||||||
// Suggested extensions
|
// Suggested extensions
|
||||||
{
|
{
|
||||||
"recommendations": [
|
"recommendations": [
|
||||||
"EditorConfig.EditorConfig"
|
"EditorConfig.EditorConfig",
|
||||||
|
"xaver.clang-format",
|
||||||
|
"ms-vscode.cpptools",
|
||||||
|
"bierner.github-markdown-preview",
|
||||||
|
"donjayamanne.git-extension-pack",
|
||||||
|
"CoenraadS.bracket-pair-colorizer-2"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
12
.vscode/settings.json
vendored
12
.vscode/settings.json
vendored
|
@ -8,10 +8,12 @@
|
||||||
"**/*.hex": true
|
"**/*.hex": true
|
||||||
},
|
},
|
||||||
"files.associations": {
|
"files.associations": {
|
||||||
"*.h": "c",
|
"*.h": "c",
|
||||||
"*.c": "c",
|
"*.c": "c",
|
||||||
"*.cpp": "cpp",
|
"*.cpp": "cpp",
|
||||||
"*.hpp": "cpp",
|
"*.hpp": "cpp",
|
||||||
"xstddef": "c"
|
"xstddef": "c",
|
||||||
|
"type_traits": "c",
|
||||||
|
"utility": "c"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,8 +8,17 @@ Our users, contributors, and collaborators are expected to treat each other with
|
||||||
|
|
||||||
* The use of sexualized language or imagery
|
* The use of sexualized language or imagery
|
||||||
* Unwelcome advances, sexual or otherwise
|
* Unwelcome advances, sexual or otherwise
|
||||||
|
* Deliberate intimidation, stalking, or following
|
||||||
* Insults or derogatory comments, or personal or political attacks
|
* Insults or derogatory comments, or personal or political attacks
|
||||||
* Publishing others’ private information without explicit permission
|
* Publishing others’ private information without explicit permission
|
||||||
|
* Sustained disruption of talks or other events
|
||||||
* Other conduct which could reasonably be considered inappropriate in a professional setting
|
* Other conduct which could reasonably be considered inappropriate in a professional setting
|
||||||
|
* Advocating for, or encouraging, any of the above behaviour
|
||||||
|
|
||||||
If someone is violating this Code of Conduct you may email hello@qmk.fm to bring your concern to the Members. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident.
|
# Reporting
|
||||||
|
|
||||||
|
If someone is violating this Code of Conduct, please email hello@qmk.fm or reach out to one of the Collaborators to bring it to our attention. All complaints will be reviewed and investigated.
|
||||||
|
|
||||||
|
QMK will seek to use the least punitive means available to resolve an issue. If the circumstances require asking an offender to leave, we will do that.
|
||||||
|
|
||||||
|
Reports will be taken and kept in strict confidence. You will not be required to confront an offender directly.
|
||||||
|
|
24
Dockerfile
24
Dockerfile
|
@ -1,26 +1,4 @@
|
||||||
FROM debian:9
|
FROM qmkfm/base_container
|
||||||
|
|
||||||
RUN apt-get update && apt-get install --no-install-recommends -y \
|
|
||||||
avr-libc \
|
|
||||||
avrdude \
|
|
||||||
binutils-arm-none-eabi \
|
|
||||||
binutils-avr \
|
|
||||||
build-essential \
|
|
||||||
dfu-programmer \
|
|
||||||
dfu-util \
|
|
||||||
gcc \
|
|
||||||
gcc-avr \
|
|
||||||
git \
|
|
||||||
libnewlib-arm-none-eabi \
|
|
||||||
software-properties-common \
|
|
||||||
unzip \
|
|
||||||
wget \
|
|
||||||
zip \
|
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
# upgrade gcc-arm-none-eabi from the default 5.4.1 to 6.3.1 due to ARM runtime issues
|
|
||||||
RUN wget -q https://developer.arm.com/-/media/Files/downloads/gnu-rm/6-2017q2/gcc-arm-none-eabi-6-2017-q2-update-linux.tar.bz2 -O - | \
|
|
||||||
tar xj --strip-components=1 -C /
|
|
||||||
|
|
||||||
VOLUME /qmk_firmware
|
VOLUME /qmk_firmware
|
||||||
WORKDIR /qmk_firmware
|
WORKDIR /qmk_firmware
|
||||||
|
|
34
Makefile
34
Makefile
|
@ -20,7 +20,10 @@ endif
|
||||||
override SILENT := false
|
override SILENT := false
|
||||||
|
|
||||||
ifndef SUB_IS_SILENT
|
ifndef SUB_IS_SILENT
|
||||||
QMK_VERSION := $(shell git describe --abbrev=0 --tags 2>/dev/null)
|
ifndef SKIP_GIT
|
||||||
|
QMK_VERSION := $(shell git describe --abbrev=0 --tags 2>/dev/null)
|
||||||
|
endif
|
||||||
|
|
||||||
ifneq ($(QMK_VERSION),)
|
ifneq ($(QMK_VERSION),)
|
||||||
$(info QMK Firmware $(QMK_VERSION))
|
$(info QMK Firmware $(QMK_VERSION))
|
||||||
endif
|
endif
|
||||||
|
@ -94,6 +97,7 @@ $(eval $(call NEXT_PATH_ELEMENT))
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
define GET_KEYBOARDS
|
define GET_KEYBOARDS
|
||||||
|
ifndef ALT_GET_KEYBOARDS
|
||||||
All_RULES_MK := $$(patsubst $(ROOT_DIR)/keyboards/%/rules.mk,%,$$(wildcard $(ROOT_DIR)/keyboards/*/rules.mk))
|
All_RULES_MK := $$(patsubst $(ROOT_DIR)/keyboards/%/rules.mk,%,$$(wildcard $(ROOT_DIR)/keyboards/*/rules.mk))
|
||||||
All_RULES_MK += $$(patsubst $(ROOT_DIR)/keyboards/%/rules.mk,%,$$(wildcard $(ROOT_DIR)/keyboards/*/*/rules.mk))
|
All_RULES_MK += $$(patsubst $(ROOT_DIR)/keyboards/%/rules.mk,%,$$(wildcard $(ROOT_DIR)/keyboards/*/*/rules.mk))
|
||||||
All_RULES_MK += $$(patsubst $(ROOT_DIR)/keyboards/%/rules.mk,%,$$(wildcard $(ROOT_DIR)/keyboards/*/*/*/rules.mk))
|
All_RULES_MK += $$(patsubst $(ROOT_DIR)/keyboards/%/rules.mk,%,$$(wildcard $(ROOT_DIR)/keyboards/*/*/*/rules.mk))
|
||||||
|
@ -105,6 +109,9 @@ define GET_KEYBOARDS
|
||||||
KEYMAPS_MK += $$(patsubst $(ROOT_DIR)/keyboards/%/rules.mk,%,$$(wildcard $(ROOT_DIR)/keyboards/*/*/*/*/keymaps/*/rules.mk))
|
KEYMAPS_MK += $$(patsubst $(ROOT_DIR)/keyboards/%/rules.mk,%,$$(wildcard $(ROOT_DIR)/keyboards/*/*/*/*/keymaps/*/rules.mk))
|
||||||
|
|
||||||
KEYBOARDS := $$(sort $$(filter-out $$(KEYMAPS_MK), $$(All_RULES_MK)))
|
KEYBOARDS := $$(sort $$(filter-out $$(KEYMAPS_MK), $$(All_RULES_MK)))
|
||||||
|
else
|
||||||
|
KEYBOARDS := $(shell find keyboards/ -type f -iname "rules.mk" | grep -v keymaps | sed 's!keyboards/\(.*\)/rules.mk!\1!' | sort | uniq)
|
||||||
|
endif
|
||||||
endef
|
endef
|
||||||
|
|
||||||
$(eval $(call GET_KEYBOARDS))
|
$(eval $(call GET_KEYBOARDS))
|
||||||
|
@ -265,12 +272,14 @@ define PARSE_RULE
|
||||||
# If the rule starts with all, then continue the parsing from
|
# If the rule starts with all, then continue the parsing from
|
||||||
# PARSE_ALL_KEYBOARDS
|
# PARSE_ALL_KEYBOARDS
|
||||||
ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,all),true)
|
ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,all),true)
|
||||||
|
KEYBOARD_RULE=all
|
||||||
$$(eval $$(call PARSE_ALL_KEYBOARDS))
|
$$(eval $$(call PARSE_ALL_KEYBOARDS))
|
||||||
else ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,test),true)
|
else ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,test),true)
|
||||||
$$(eval $$(call PARSE_TEST))
|
$$(eval $$(call PARSE_TEST))
|
||||||
# If the rule starts with the name of a known keyboard, then continue
|
# If the rule starts with the name of a known keyboard, then continue
|
||||||
# the parsing from PARSE_KEYBOARD
|
# the parsing from PARSE_KEYBOARD
|
||||||
else ifeq ($$(call TRY_TO_MATCH_RULE_FROM_LIST,$$(KEYBOARDS)),true)
|
else ifeq ($$(call TRY_TO_MATCH_RULE_FROM_LIST,$$(KEYBOARDS)),true)
|
||||||
|
KEYBOARD_RULE=$$(MATCHED_ITEM)
|
||||||
$$(eval $$(call PARSE_KEYBOARD,$$(MATCHED_ITEM)))
|
$$(eval $$(call PARSE_KEYBOARD,$$(MATCHED_ITEM)))
|
||||||
# Otherwise use the KEYBOARD variable, which is determined either by
|
# Otherwise use the KEYBOARD variable, which is determined either by
|
||||||
# the current directory you run make from, or passed in as an argument
|
# the current directory you run make from, or passed in as an argument
|
||||||
|
@ -364,12 +373,18 @@ define PARSE_KEYBOARD
|
||||||
# The same if all was specified
|
# The same if all was specified
|
||||||
else ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,all),true)
|
else ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,all),true)
|
||||||
$$(eval $$(call PARSE_ALL_KEYMAPS))
|
$$(eval $$(call PARSE_ALL_KEYMAPS))
|
||||||
|
# List all keymaps for the given keyboard
|
||||||
|
else ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,list-keymaps),true)
|
||||||
|
$$(eval $$(call LIST_ALL_KEYMAPS))
|
||||||
# Try to match the specified keyamp with the list of known keymaps
|
# Try to match the specified keyamp with the list of known keymaps
|
||||||
else ifeq ($$(call TRY_TO_MATCH_RULE_FROM_LIST,$$(KEYMAPS)),true)
|
else ifeq ($$(call TRY_TO_MATCH_RULE_FROM_LIST,$$(KEYMAPS)),true)
|
||||||
$$(eval $$(call PARSE_KEYMAP,$$(MATCHED_ITEM)))
|
$$(eval $$(call PARSE_KEYMAP,$$(MATCHED_ITEM)))
|
||||||
# Otherwise try to match the keymap from the current folder, or arguments to the make command
|
# Otherwise try to match the keymap from the current folder, or arguments to the make command
|
||||||
else ifneq ($$(KEYMAP),)
|
else ifneq ($$(KEYMAP),)
|
||||||
$$(eval $$(call PARSE_KEYMAP,$$(KEYMAP)))
|
$$(eval $$(call PARSE_KEYMAP,$$(KEYMAP)))
|
||||||
|
# Otherwise if we are running make all:<user> just skip
|
||||||
|
else ifeq ($$(KEYBOARD_RULE),all)
|
||||||
|
# $$(info Skipping: No user keymap for $$(CURRENT_KB))
|
||||||
# Otherwise, make all keymaps, again this is consistent with how it works without
|
# Otherwise, make all keymaps, again this is consistent with how it works without
|
||||||
# any arguments
|
# any arguments
|
||||||
else
|
else
|
||||||
|
@ -400,6 +415,16 @@ endef
|
||||||
# endif
|
# endif
|
||||||
# endef
|
# endef
|
||||||
|
|
||||||
|
# Prints a list of all known keymaps for the given keyboard
|
||||||
|
define LIST_ALL_KEYMAPS
|
||||||
|
COMMAND_true_LIST_KEYMAPS := \
|
||||||
|
printf "$$(KEYMAPS)\n";
|
||||||
|
COMMAND_false_LIST_KEYMAPS := \
|
||||||
|
printf "$$(MSG_AVAILABLE_KEYMAPS)\n"; \
|
||||||
|
printf "$$(KEYMAPS)\n";
|
||||||
|
COMMANDS += LIST_KEYMAPS
|
||||||
|
endef
|
||||||
|
|
||||||
# $1 Keymap
|
# $1 Keymap
|
||||||
# This is the meat of compiling a keyboard, when entering this, everything is known
|
# This is the meat of compiling a keyboard, when entering this, everything is known
|
||||||
# keyboard, subproject, and keymap
|
# keyboard, subproject, and keymap
|
||||||
|
@ -538,9 +563,10 @@ endef
|
||||||
if ! python3 --version 1> /dev/null 2>&1; then printf "$(MSG_PYTHON_MISSING)"; fi
|
if ! python3 --version 1> /dev/null 2>&1; then printf "$(MSG_PYTHON_MISSING)"; fi
|
||||||
# Check if the submodules are dirty, and display a warning if they are
|
# Check if the submodules are dirty, and display a warning if they are
|
||||||
ifndef SKIP_GIT
|
ifndef SKIP_GIT
|
||||||
if [ ! -e lib/chibios ]; then git submodule sync lib/chibios && git submodule update --depth 1 --init lib/chibios; fi
|
if [ ! -e lib/chibios ]; then git submodule sync lib/chibios && git submodule update --depth 50 --init lib/chibios; fi
|
||||||
if [ ! -e lib/chibios-contrib ]; then git submodule sync lib/chibios-contrib && git submodule update --depth 1 --init lib/chibios-contrib; fi
|
if [ ! -e lib/chibios-contrib ]; then git submodule sync lib/chibios-contrib && git submodule update --depth 50 --init lib/chibios-contrib; fi
|
||||||
if [ ! -e lib/ugfx ]; then git submodule sync lib/ugfx && git submodule update --depth 1 --init lib/ugfx; fi
|
if [ ! -e lib/ugfx ]; then git submodule sync lib/ugfx && git submodule update --depth 50 --init lib/ugfx; fi
|
||||||
|
if [ ! -e lib/lufa ]; then git submodule sync lib/lufa && git submodule update --depth 50 --init lib/lufa; fi
|
||||||
git submodule status --recursive 2>/dev/null | \
|
git submodule status --recursive 2>/dev/null | \
|
||||||
while IFS= read -r x; do \
|
while IFS= read -r x; do \
|
||||||
case "$$x" in \
|
case "$$x" in \
|
||||||
|
|
31
Vagrantfile
vendored
31
Vagrantfile
vendored
|
@ -52,26 +52,37 @@ Vagrant.configure(2) do |config|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Docker provider pulls from hub.docker.com respecting docker.image if
|
# Docker provider pulls from hub.docker.com respecting docker.image if
|
||||||
# config.vm.box is nil. Note that this bind-mounts from the current dir to
|
# config.vm.box is nil. In this case, we adhoc build util/vagrant/Dockerfile.
|
||||||
|
# Note that this bind-mounts from the current dir to
|
||||||
# /vagrant in the guest, so unless your UID is 1000 to match vagrant in the
|
# /vagrant in the guest, so unless your UID is 1000 to match vagrant in the
|
||||||
# image, you'll need to: chmod -R a+rw .
|
# image, you'll need to: chmod -R a+rw .
|
||||||
config.vm.provider "docker" do |docker, override|
|
config.vm.provider "docker" do |docker, override|
|
||||||
override.vm.box = nil
|
override.vm.box = nil
|
||||||
docker.image = "jesselang/debian-vagrant:stretch"
|
docker.build_dir = "util/vagrant"
|
||||||
docker.has_ssh = true
|
docker.has_ssh = true
|
||||||
end
|
end
|
||||||
|
|
||||||
# This script ensures the required packages for AVR programming are installed
|
# Unless we are running the docker container directly
|
||||||
# It also ensures the system always gets the latest updates when powered on
|
# 1. run container detached on vm
|
||||||
# If this causes issues you can run a 'vagrant destroy' and then
|
# 2. attach on 'vagrant ssh'
|
||||||
# add a # before ,run: (or change "always" to "once") and run 'vagrant up' to get a working
|
["virtualbox", "vmware_workstation", "vmware_fusion"].each do |type|
|
||||||
# non-updated box and then attempt to troubleshoot or open a Github issue
|
config.vm.provider type do |virt, override|
|
||||||
config.vm.provision "shell", inline: "/vagrant/util/qmk_install.sh", run: "always"
|
override.vm.provision "docker" do |d|
|
||||||
|
d.run "qmkfm/base_container",
|
||||||
|
cmd: "tail -f /dev/null",
|
||||||
|
args: "--privileged -v /dev:/dev -v '/vagrant:/vagrant'"
|
||||||
|
end
|
||||||
|
|
||||||
|
override.vm.provision "shell", inline: <<-SHELL
|
||||||
|
echo 'docker restart qmkfm-base_container && exec docker exec -it qmkfm-base_container /bin/bash -l' >> ~vagrant/.bashrc
|
||||||
|
SHELL
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
config.vm.post_up_message = <<-EOT
|
config.vm.post_up_message = <<-EOT
|
||||||
|
|
||||||
Log into the VM using 'vagrant ssh'. QMK directory synchronized with host is
|
Log into the environment using 'vagrant ssh'. QMK directory synchronized with
|
||||||
located at /vagrant
|
host is located at /vagrant
|
||||||
To compile the .hex files use make command inside this directory, e.g.
|
To compile the .hex files use make command inside this directory, e.g.
|
||||||
cd /vagrant
|
cd /vagrant
|
||||||
make <keyboard>:default
|
make <keyboard>:default
|
||||||
|
|
83
bin/qmk
Executable file
83
bin/qmk
Executable file
|
@ -0,0 +1,83 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
"""CLI wrapper for running QMK commands.
|
||||||
|
"""
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
from importlib.util import find_spec
|
||||||
|
from time import strftime
|
||||||
|
|
||||||
|
# Add the QMK python libs to our path
|
||||||
|
script_dir = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
qmk_dir = os.path.abspath(os.path.join(script_dir, '..'))
|
||||||
|
python_lib_dir = os.path.abspath(os.path.join(qmk_dir, 'lib', 'python'))
|
||||||
|
sys.path.append(python_lib_dir)
|
||||||
|
|
||||||
|
# Make sure our modules have been setup
|
||||||
|
with open(os.path.join(qmk_dir, 'requirements.txt'), 'r') as fd:
|
||||||
|
for line in fd.readlines():
|
||||||
|
line = line.strip().replace('<', '=').replace('>', '=')
|
||||||
|
|
||||||
|
if line[0] == '#':
|
||||||
|
continue
|
||||||
|
|
||||||
|
if '#' in line:
|
||||||
|
line = line.split('#')[0]
|
||||||
|
|
||||||
|
module = line.split('=')[0] if '=' in line else line
|
||||||
|
if not find_spec(module):
|
||||||
|
print('Could not find module %s!' % module)
|
||||||
|
print('Please run `pip3 install -r requirements.txt` to install the python dependencies.')
|
||||||
|
exit(255)
|
||||||
|
|
||||||
|
# Figure out our version
|
||||||
|
# TODO(skullydazed/anyone): Find a method that doesn't involve git. This is slow in docker and on windows.
|
||||||
|
command = ['git', 'describe', '--abbrev=6', '--dirty', '--always', '--tags']
|
||||||
|
result = subprocess.run(command, universal_newlines=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
||||||
|
|
||||||
|
if result.returncode == 0:
|
||||||
|
os.environ['QMK_VERSION'] = result.stdout.strip()
|
||||||
|
else:
|
||||||
|
os.environ['QMK_VERSION'] = 'nogit-' + strftime('%Y-%m-%d-%H:%M:%S') + '-dirty'
|
||||||
|
|
||||||
|
# Setup the CLI
|
||||||
|
import milc # noqa
|
||||||
|
|
||||||
|
milc.EMOJI_LOGLEVELS['INFO'] = '{fg_blue}Ψ{style_reset_all}'
|
||||||
|
|
||||||
|
|
||||||
|
@milc.cli.entrypoint('QMK Helper Script')
|
||||||
|
def qmk_main(cli):
|
||||||
|
"""The function that gets run when no subcommand is provided.
|
||||||
|
"""
|
||||||
|
cli.print_help()
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""Setup our environment and then call the CLI entrypoint.
|
||||||
|
"""
|
||||||
|
# Change to the root of our checkout
|
||||||
|
os.environ['ORIG_CWD'] = os.getcwd()
|
||||||
|
os.chdir(qmk_dir)
|
||||||
|
|
||||||
|
# Import the subcommands
|
||||||
|
import qmk.cli # noqa
|
||||||
|
|
||||||
|
# Execute
|
||||||
|
return_code = milc.cli()
|
||||||
|
|
||||||
|
if return_code is False:
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
elif return_code is not True and isinstance(return_code, int):
|
||||||
|
if return_code < 0 or return_code > 255:
|
||||||
|
milc.cli.log.error('Invalid return_code: %d', return_code)
|
||||||
|
exit(255)
|
||||||
|
|
||||||
|
exit(return_code)
|
||||||
|
|
||||||
|
exit(0)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
|
@ -19,12 +19,14 @@
|
||||||
#
|
#
|
||||||
# Sets the bootloader defined in the keyboard's/keymap's rules.mk
|
# Sets the bootloader defined in the keyboard's/keymap's rules.mk
|
||||||
# Current options:
|
# Current options:
|
||||||
# atmel-dfu
|
#
|
||||||
# lufa-dfu
|
# halfkay PJRC Teensy
|
||||||
# qmk-dfu
|
# caterina Pro Micro (Sparkfun/generic)
|
||||||
# halfkay
|
# atmel-dfu Atmel factory DFU
|
||||||
# caterina
|
# lufa-dfu LUFA DFU
|
||||||
# bootloadHID
|
# qmk-dfu QMK DFU (LUFA + blinkenlight)
|
||||||
|
# bootloadHID HIDBootFlash compatible (ATmega32A)
|
||||||
|
# USBasp USBaspLoader (ATmega328P)
|
||||||
#
|
#
|
||||||
# BOOTLOADER_SIZE can still be defined manually, but it's recommended
|
# BOOTLOADER_SIZE can still be defined manually, but it's recommended
|
||||||
# you add any possible configuration to this list
|
# you add any possible configuration to this list
|
||||||
|
@ -32,40 +34,40 @@
|
||||||
ifeq ($(strip $(BOOTLOADER)), atmel-dfu)
|
ifeq ($(strip $(BOOTLOADER)), atmel-dfu)
|
||||||
OPT_DEFS += -DBOOTLOADER_ATMEL_DFU
|
OPT_DEFS += -DBOOTLOADER_ATMEL_DFU
|
||||||
OPT_DEFS += -DBOOTLOADER_DFU
|
OPT_DEFS += -DBOOTLOADER_DFU
|
||||||
ifeq ($(strip $(MCU)), atmega32u4)
|
ifneq (,$(filter $(MCU), at90usb646 atmega16u2 atmega16u4 atmega32u2 atmega32u4))
|
||||||
BOOTLOADER_SIZE = 4096
|
BOOTLOADER_SIZE = 4096
|
||||||
endif
|
endif
|
||||||
ifeq ($(strip $(MCU)), at90usb1286)
|
ifeq ($(strip $(MCU)), at90usb1286)
|
||||||
BOOTLOADER_SIZE = 8192
|
BOOTLOADER_SIZE = 8192
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
ifeq ($(strip $(BOOTLOADER)), lufa-dfu)
|
ifeq ($(strip $(BOOTLOADER)), lufa-dfu)
|
||||||
OPT_DEFS += -DBOOTLOADER_LUFA_DFU
|
OPT_DEFS += -DBOOTLOADER_LUFA_DFU
|
||||||
OPT_DEFS += -DBOOTLOADER_DFU
|
OPT_DEFS += -DBOOTLOADER_DFU
|
||||||
ifeq ($(strip $(MCU)), atmega32u4)
|
ifneq (,$(filter $(MCU), at90usb646 atmega16u2 atmega16u4 atmega32u2 atmega32u4))
|
||||||
BOOTLOADER_SIZE = 4096
|
BOOTLOADER_SIZE = 4096
|
||||||
endif
|
endif
|
||||||
ifeq ($(strip $(MCU)), at90usb1286)
|
ifeq ($(strip $(MCU)), at90usb1286)
|
||||||
BOOTLOADER_SIZE = 8192
|
BOOTLOADER_SIZE = 8192
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
ifeq ($(strip $(BOOTLOADER)), qmk-dfu)
|
ifeq ($(strip $(BOOTLOADER)), qmk-dfu)
|
||||||
OPT_DEFS += -DBOOTLOADER_QMK_DFU
|
OPT_DEFS += -DBOOTLOADER_QMK_DFU
|
||||||
OPT_DEFS += -DBOOTLOADER_DFU
|
OPT_DEFS += -DBOOTLOADER_DFU
|
||||||
ifeq ($(strip $(MCU)), atmega32u4)
|
ifneq (,$(filter $(MCU), at90usb646 atmega16u2 atmega16u4 atmega32u2 atmega32u4))
|
||||||
BOOTLOADER_SIZE = 4096
|
BOOTLOADER_SIZE = 4096
|
||||||
endif
|
endif
|
||||||
ifeq ($(strip $(MCU)), at90usb1286)
|
ifeq ($(strip $(MCU)), at90usb1286)
|
||||||
BOOTLOADER_SIZE = 8192
|
BOOTLOADER_SIZE = 8192
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
ifeq ($(strip $(BOOTLOADER)), halfkay)
|
ifeq ($(strip $(BOOTLOADER)), halfkay)
|
||||||
OPT_DEFS += -DBOOTLOADER_HALFKAY
|
OPT_DEFS += -DBOOTLOADER_HALFKAY
|
||||||
ifeq ($(strip $(MCU)), atmega32u4)
|
ifeq ($(strip $(MCU)), atmega32u4)
|
||||||
BOOTLOADER_SIZE = 512
|
BOOTLOADER_SIZE = 512
|
||||||
endif
|
endif
|
||||||
ifeq ($(strip $(MCU)), at90usb1286)
|
ifeq ($(strip $(MCU)), at90usb1286)
|
||||||
BOOTLOADER_SIZE = 1024
|
BOOTLOADER_SIZE = 1024
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
ifeq ($(strip $(BOOTLOADER)), caterina)
|
ifeq ($(strip $(BOOTLOADER)), caterina)
|
||||||
|
@ -76,6 +78,10 @@ ifeq ($(strip $(BOOTLOADER)), bootloadHID)
|
||||||
OPT_DEFS += -DBOOTLOADER_BOOTLOADHID
|
OPT_DEFS += -DBOOTLOADER_BOOTLOADHID
|
||||||
BOOTLOADER_SIZE = 4096
|
BOOTLOADER_SIZE = 4096
|
||||||
endif
|
endif
|
||||||
|
ifeq ($(strip $(BOOTLOADER)), USBasp)
|
||||||
|
OPT_DEFS += -DBOOTLOADER_USBASP
|
||||||
|
BOOTLOADER_SIZE = 4096
|
||||||
|
endif
|
||||||
|
|
||||||
ifdef BOOTLOADER_SIZE
|
ifdef BOOTLOADER_SIZE
|
||||||
OPT_DEFS += -DBOOTLOADER_SIZE=$(strip $(BOOTLOADER_SIZE))
|
OPT_DEFS += -DBOOTLOADER_SIZE=$(strip $(BOOTLOADER_SIZE))
|
||||||
|
|
26
build_json.mk
Normal file
26
build_json.mk
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
# Look for a json keymap file
|
||||||
|
ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_5)/keymap.json)","")
|
||||||
|
KEYMAP_C := $(KEYBOARD_OUTPUT)/src/keymap.c
|
||||||
|
KEYMAP_JSON := $(MAIN_KEYMAP_PATH_5)/keymap.json
|
||||||
|
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_5)
|
||||||
|
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_4)/keymap.json)","")
|
||||||
|
KEYMAP_C := $(KEYBOARD_OUTPUT)/src/keymap.c
|
||||||
|
KEYMAP_JSON := $(MAIN_KEYMAP_PATH_4)/keymap.json
|
||||||
|
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_4)
|
||||||
|
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_3)/keymap.json)","")
|
||||||
|
KEYMAP_C := $(KEYBOARD_OUTPUT)/src/keymap.c
|
||||||
|
KEYMAP_JSON := $(MAIN_KEYMAP_PATH_3)/keymap.json
|
||||||
|
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_3)
|
||||||
|
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_2)/keymap.json)","")
|
||||||
|
KEYMAP_C := $(KEYBOARD_OUTPUT)/src/keymap.c
|
||||||
|
KEYMAP_JSON := $(MAIN_KEYMAP_PATH_2)/keymap.json
|
||||||
|
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_2)
|
||||||
|
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_1)/keymap.json)","")
|
||||||
|
KEYMAP_C := $(KEYBOARD_OUTPUT)/src/keymap.c
|
||||||
|
KEYMAP_JSON := $(MAIN_KEYMAP_PATH_1)/keymap.json
|
||||||
|
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_1)
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Generate the keymap.c
|
||||||
|
$(KEYBOARD_OUTPUT)/src/keymap.c:
|
||||||
|
bin/qmk json-keymap --quiet --output $(KEYMAP_C) $(KEYMAP_JSON)
|
|
@ -98,31 +98,38 @@ MAIN_KEYMAP_PATH_3 := $(KEYBOARD_PATH_3)/keymaps/$(KEYMAP)
|
||||||
MAIN_KEYMAP_PATH_4 := $(KEYBOARD_PATH_4)/keymaps/$(KEYMAP)
|
MAIN_KEYMAP_PATH_4 := $(KEYBOARD_PATH_4)/keymaps/$(KEYMAP)
|
||||||
MAIN_KEYMAP_PATH_5 := $(KEYBOARD_PATH_5)/keymaps/$(KEYMAP)
|
MAIN_KEYMAP_PATH_5 := $(KEYBOARD_PATH_5)/keymaps/$(KEYMAP)
|
||||||
|
|
||||||
ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_5)/keymap.c)","")
|
# Check for keymap.json first, so we can regenerate keymap.c
|
||||||
-include $(MAIN_KEYMAP_PATH_5)/rules.mk
|
include build_json.mk
|
||||||
KEYMAP_C := $(MAIN_KEYMAP_PATH_5)/keymap.c
|
|
||||||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_5)
|
ifeq ("$(wildcard $(KEYMAP_PATH))", "")
|
||||||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_4)/keymap.c)","")
|
# Look through the possible keymap folders until we find a matching keymap.c
|
||||||
-include $(MAIN_KEYMAP_PATH_4)/rules.mk
|
ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_5)/keymap.c)","")
|
||||||
KEYMAP_C := $(MAIN_KEYMAP_PATH_4)/keymap.c
|
-include $(MAIN_KEYMAP_PATH_5)/rules.mk
|
||||||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_4)
|
KEYMAP_C := $(MAIN_KEYMAP_PATH_5)/keymap.c
|
||||||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_3)/keymap.c)","")
|
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_5)
|
||||||
-include $(MAIN_KEYMAP_PATH_3)/rules.mk
|
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_4)/keymap.c)","")
|
||||||
KEYMAP_C := $(MAIN_KEYMAP_PATH_3)/keymap.c
|
-include $(MAIN_KEYMAP_PATH_4)/rules.mk
|
||||||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_3)
|
KEYMAP_C := $(MAIN_KEYMAP_PATH_4)/keymap.c
|
||||||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_2)/keymap.c)","")
|
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_4)
|
||||||
-include $(MAIN_KEYMAP_PATH_2)/rules.mk
|
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_3)/keymap.c)","")
|
||||||
KEYMAP_C := $(MAIN_KEYMAP_PATH_2)/keymap.c
|
-include $(MAIN_KEYMAP_PATH_3)/rules.mk
|
||||||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_2)
|
KEYMAP_C := $(MAIN_KEYMAP_PATH_3)/keymap.c
|
||||||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_1)/keymap.c)","")
|
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_3)
|
||||||
-include $(MAIN_KEYMAP_PATH_1)/rules.mk
|
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_2)/keymap.c)","")
|
||||||
KEYMAP_C := $(MAIN_KEYMAP_PATH_1)/keymap.c
|
-include $(MAIN_KEYMAP_PATH_2)/rules.mk
|
||||||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_1)
|
KEYMAP_C := $(MAIN_KEYMAP_PATH_2)/keymap.c
|
||||||
else ifneq ($(LAYOUTS),)
|
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_2)
|
||||||
include build_layout.mk
|
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_1)/keymap.c)","")
|
||||||
else
|
-include $(MAIN_KEYMAP_PATH_1)/rules.mk
|
||||||
$(error Could not find keymap)
|
KEYMAP_C := $(MAIN_KEYMAP_PATH_1)/keymap.c
|
||||||
# this state should never be reached
|
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_1)
|
||||||
|
else ifneq ($(LAYOUTS),)
|
||||||
|
# If we haven't found a keymap yet fall back to community layouts
|
||||||
|
include build_layout.mk
|
||||||
|
else
|
||||||
|
$(error Could not find keymap)
|
||||||
|
# this state should never be reached
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(strip $(CTPC)), yes)
|
ifeq ($(strip $(CTPC)), yes)
|
||||||
|
@ -313,7 +320,6 @@ ifneq ("$(wildcard $(USER_PATH)/config.h)","")
|
||||||
CONFIG_H += $(USER_PATH)/config.h
|
CONFIG_H += $(USER_PATH)/config.h
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
# Object files directory
|
# Object files directory
|
||||||
# To put object files in current directory, use a dot (.), do NOT make
|
# To put object files in current directory, use a dot (.), do NOT make
|
||||||
# this an empty or blank macro!
|
# this an empty or blank macro!
|
||||||
|
@ -323,7 +329,7 @@ ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","")
|
||||||
CONFIG_H += $(KEYMAP_PATH)/config.h
|
CONFIG_H += $(KEYMAP_PATH)/config.h
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# # project specific files
|
# project specific files
|
||||||
SRC += $(KEYBOARD_SRC) \
|
SRC += $(KEYBOARD_SRC) \
|
||||||
$(KEYMAP_C) \
|
$(KEYMAP_C) \
|
||||||
$(QUANTUM_SRC)
|
$(QUANTUM_SRC)
|
||||||
|
@ -392,6 +398,7 @@ $(KEYBOARD_OUTPUT)_CONFIG := $(PROJECT_CONFIG)
|
||||||
all: build check-size
|
all: build check-size
|
||||||
build: elf cpfirmware
|
build: elf cpfirmware
|
||||||
check-size: build
|
check-size: build
|
||||||
|
objs-size: build
|
||||||
|
|
||||||
include show_options.mk
|
include show_options.mk
|
||||||
include $(TMK_PATH)/rules.mk
|
include $(TMK_PATH)/rules.mk
|
||||||
|
|
|
@ -112,7 +112,7 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
|
||||||
ifeq ($(strip $(RGBLIGHT_CUSTOM_DRIVER)), yes)
|
ifeq ($(strip $(RGBLIGHT_CUSTOM_DRIVER)), yes)
|
||||||
OPT_DEFS += -DRGBLIGHT_CUSTOM_DRIVER
|
OPT_DEFS += -DRGBLIGHT_CUSTOM_DRIVER
|
||||||
else
|
else
|
||||||
SRC += ws2812.c
|
WS2812_DRIVER_REQUIRED = yes
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -176,7 +176,7 @@ endif
|
||||||
|
|
||||||
ifeq ($(strip $(RGB_MATRIX_ENABLE)), WS2812)
|
ifeq ($(strip $(RGB_MATRIX_ENABLE)), WS2812)
|
||||||
OPT_DEFS += -DWS2812
|
OPT_DEFS += -DWS2812
|
||||||
SRC += ws2812.c
|
WS2812_DRIVER_REQUIRED = yes
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(strip $(RGB_MATRIX_CUSTOM_KB)), yes)
|
ifeq ($(strip $(RGB_MATRIX_CUSTOM_KB)), yes)
|
||||||
|
@ -229,12 +229,59 @@ ifeq ($(strip $(LCD_ENABLE)), yes)
|
||||||
CIE1931_CURVE = yes
|
CIE1931_CURVE = yes
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
|
# backward compat
|
||||||
|
ifeq ($(strip $(BACKLIGHT_CUSTOM_DRIVER)), yes)
|
||||||
|
BACKLIGHT_ENABLE = custom
|
||||||
|
endif
|
||||||
|
|
||||||
|
VALID_BACKLIGHT_TYPES := yes software custom
|
||||||
|
|
||||||
|
BACKLIGHT_ENABLE ?= no
|
||||||
|
ifneq ($(strip $(BACKLIGHT_ENABLE)), no)
|
||||||
|
ifeq ($(filter $(BACKLIGHT_ENABLE),$(VALID_BACKLIGHT_TYPES)),)
|
||||||
|
$(error BACKLIGHT_ENABLE="$(BACKLIGHT_ENABLE)" is not a valid backlight type)
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(strip $(VISUALIZER_ENABLE)), yes)
|
ifeq ($(strip $(VISUALIZER_ENABLE)), yes)
|
||||||
CIE1931_CURVE = yes
|
CIE1931_CURVE = yes
|
||||||
endif
|
endif
|
||||||
ifeq ($(strip $(BACKLIGHT_CUSTOM_DRIVER)), yes)
|
|
||||||
OPT_DEFS += -DBACKLIGHT_CUSTOM_DRIVER
|
COMMON_VPATH += $(QUANTUM_DIR)/backlight
|
||||||
|
SRC += $(QUANTUM_DIR)/backlight/backlight.c
|
||||||
|
OPT_DEFS += -DBACKLIGHT_ENABLE
|
||||||
|
|
||||||
|
ifeq ($(strip $(BACKLIGHT_ENABLE)), software)
|
||||||
|
SRC += $(QUANTUM_DIR)/backlight/backlight_soft.c
|
||||||
|
else
|
||||||
|
ifeq ($(strip $(BACKLIGHT_ENABLE)), custom)
|
||||||
|
OPT_DEFS += -DBACKLIGHT_CUSTOM_DRIVER
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(PLATFORM),AVR)
|
||||||
|
SRC += $(QUANTUM_DIR)/backlight/backlight_avr.c
|
||||||
|
else
|
||||||
|
SRC += $(QUANTUM_DIR)/backlight/backlight_arm.c
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
VALID_WS2812_DRIVER_TYPES := bitbang pwm spi i2c
|
||||||
|
|
||||||
|
WS2812_DRIVER ?= bitbang
|
||||||
|
ifeq ($(strip $(WS2812_DRIVER_REQUIRED)), yes)
|
||||||
|
ifeq ($(filter $(WS2812_DRIVER),$(VALID_WS2812_DRIVER_TYPES)),)
|
||||||
|
$(error WS2812_DRIVER="$(WS2812_DRIVER)" is not a valid WS2812 driver)
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(WS2812_DRIVER)), bitbang)
|
||||||
|
SRC += ws2812.c
|
||||||
|
else
|
||||||
|
SRC += ws2812_$(strip $(WS2812_DRIVER)).c
|
||||||
|
endif
|
||||||
|
|
||||||
|
# add extra deps
|
||||||
|
ifeq ($(strip $(WS2812_DRIVER)), i2c)
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -267,20 +314,21 @@ ifeq ($(strip $(ENCODER_ENABLE)), yes)
|
||||||
OPT_DEFS += -DENCODER_ENABLE
|
OPT_DEFS += -DENCODER_ENABLE
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(strip $(HAPTIC_ENABLE)), DRV2605L)
|
HAPTIC_ENABLE ?= no
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/haptic
|
ifneq ($(strip $(HAPTIC_ENABLE)),no)
|
||||||
SRC += haptic.c
|
COMMON_VPATH += $(DRIVER_PATH)/haptic
|
||||||
|
SRC += haptic.c
|
||||||
|
OPT_DEFS += -DHAPTIC_ENABLE
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq ($(filter DRV2605L, $(HAPTIC_ENABLE)), )
|
||||||
SRC += DRV2605L.c
|
SRC += DRV2605L.c
|
||||||
QUANTUM_LIB_SRC += i2c_master.c
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
OPT_DEFS += -DHAPTIC_ENABLE
|
|
||||||
OPT_DEFS += -DDRV2605L
|
OPT_DEFS += -DDRV2605L
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(strip $(HAPTIC_ENABLE)), SOLENOID)
|
ifneq ($(filter SOLENOID, $(HAPTIC_ENABLE)), )
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/haptic
|
|
||||||
SRC += haptic.c
|
|
||||||
SRC += solenoid.c
|
SRC += solenoid.c
|
||||||
OPT_DEFS += -DHAPTIC_ENABLE
|
|
||||||
OPT_DEFS += -DSOLENOID_ENABLE
|
OPT_DEFS += -DSOLENOID_ENABLE
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -358,3 +406,13 @@ ifeq ($(strip $(SPACE_CADET_ENABLE)), yes)
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_space_cadet.c
|
SRC += $(QUANTUM_DIR)/process_keycode/process_space_cadet.c
|
||||||
OPT_DEFS += -DSPACE_CADET_ENABLE
|
OPT_DEFS += -DSPACE_CADET_ENABLE
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(DIP_SWITCH_ENABLE)), yes)
|
||||||
|
SRC += $(QUANTUM_DIR)/dip_switch.c
|
||||||
|
OPT_DEFS += -DDIP_SWITCH_ENABLE
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(DYNAMIC_MACRO_ENABLE)), yes)
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_dynamic_macro.c
|
||||||
|
OPT_DEFS += -DDYNAMIC_MACRO_ENABLE
|
||||||
|
endif
|
||||||
|
|
53
docs/ChangeLog/20190830.md
Normal file
53
docs/ChangeLog/20190830.md
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
# QMK Breaking Change - 2019 Aug 30
|
||||||
|
|
||||||
|
Four times a year QMK runs a process for merging Breaking Changes. A Breaking Change is any change which modifies how QMK behaves in a way that is incompatible or potentially dangerous. We limit these changes to 4 times per year so that users can have confidence that updating their QMK tree will not break their keymaps.
|
||||||
|
|
||||||
|
This document marks the inaugural Breaking Change merge. A list of changes follows.
|
||||||
|
|
||||||
|
## Core code formatting with clang-format
|
||||||
|
|
||||||
|
* All core files (`drivers/`, `quantum/`, `tests/`, and `tmk_core/`) have been formatted with clang-format
|
||||||
|
* A travis process to reformat PR's on merge has been instituted
|
||||||
|
* You can use the new CLI command `qmk cformat` to format before submitting your PR if you wish.
|
||||||
|
|
||||||
|
## LUFA USB descriptor cleanup
|
||||||
|
|
||||||
|
* Some code cleanups related to the USB HID descriptors on AVR keyboards, to make them easier to read and understand
|
||||||
|
* More information: see https://github.com/qmk/qmk_firmware/pull/4871
|
||||||
|
* No behaviour changes anticipated and no keymaps modified
|
||||||
|
|
||||||
|
## Migrating `ACTION_LAYER_MOMENTARY()` entries in `fn_actions` to `MO()` keycodes
|
||||||
|
|
||||||
|
* `fn_actions` is deprecated, and its functionality has been superseded by direct keycodes and `process_record_user()`
|
||||||
|
* The end result of removing this obsolete feature should result in a decent reduction in firmware size and code complexity
|
||||||
|
* All keymaps affected are recommended to switch away from `fn_actions` in favour of the [custom keycode](https://docs.qmk.fm/#/custom_quantum_functions) and [macro](https://docs.qmk.fm/#/feature_macros) features
|
||||||
|
|
||||||
|
## Update Atreus to current code conventions
|
||||||
|
|
||||||
|
* Duplicate include guards have bypassed the expected header processing behavior
|
||||||
|
* All keymaps affected are recommended to remove duplication of `<keyboard>/config.h` to `<keyboard>/keymaps/<user>/config.h` and only provide overrides at the keymap level
|
||||||
|
|
||||||
|
## Backport changes to keymap language files from ZSA fork
|
||||||
|
|
||||||
|
* Fixes an issue in the `keymap_br_abnt2.h` file that includes the wrong source (`keymap_common.h` instead of `keymap.h`)
|
||||||
|
* Updates the `keymap_swedish.h` file to be specific to swedish, and not just "nordic" in general.
|
||||||
|
* Any keymaps using this will need to remove `NO_*` and replace it with `SE_*`.
|
||||||
|
|
||||||
|
## Update repo to use LUFA as a git submodule
|
||||||
|
|
||||||
|
* `/lib/LUFA` removed from the repo
|
||||||
|
* LUFA set as a submodule, pointing to qmk/lufa
|
||||||
|
* This should allow more flexibility with LUFA, and allow us to keep the sub-module up to date, a lot more easily. It was ~2 years out of date with no easy path to fix that. This prevents that from being an issue in the future
|
||||||
|
|
||||||
|
## Migrating `ACTION_BACKLIGHT_*()` entries in `fn_actions` to `BL_` keycodes
|
||||||
|
|
||||||
|
* `fn_actions` is deprecated, and its functionality has been superseded by direct keycodes and `process_record_user()`
|
||||||
|
* All keymaps using these actions have had the relevant `KC_FN*` keys replaced with the equivalent `BL_*` keys
|
||||||
|
* If you currently use `KC_FN*` you will need to replace `fn_actions` with the [custom keycode](https://docs.qmk.fm/#/custom_quantum_functions) and [macro](https://docs.qmk.fm/#/feature_macros) features
|
||||||
|
|
||||||
|
## Remove `KC_DELT` alias in favor of `KC_DEL`
|
||||||
|
|
||||||
|
* `KC_DELT` was a redundant, undocumented alias for `KC_DELETE`
|
||||||
|
* It has been removed and all its uses replaced with the more common `KC_DEL` alias
|
||||||
|
* Around 90 keymaps (mostly for ErgoDox boards) have been modified as a result
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
# Languages
|
|
||||||
|
|
||||||
* [English](/)
|
|
||||||
* [Chinese](zh/)
|
|
|
@ -15,7 +15,7 @@ QMK (*Quantum Mechanical Keyboard*) is an open source community that maintains Q
|
||||||
|
|
||||||
If you plan on contributing a keymap, keyboard, or features to QMK, the easiest thing to do is [fork the repo through Github](https://github.com/qmk/qmk_firmware#fork-destination-box), and clone your repo locally to make your changes, push them, then open a [Pull Request](https://github.com/qmk/qmk_firmware/pulls) from your fork.
|
If you plan on contributing a keymap, keyboard, or features to QMK, the easiest thing to do is [fork the repo through Github](https://github.com/qmk/qmk_firmware#fork-destination-box), and clone your repo locally to make your changes, push them, then open a [Pull Request](https://github.com/qmk/qmk_firmware/pulls) from your fork.
|
||||||
|
|
||||||
Otherwise, you can either download it directly ([zip](https://github.com/qmk/qmk_firmware/zipball/master), [tar](https://github.com/qmk/qmk_firmware/tarball/master)), or clone it via git (`git@github.com:qmk/qmk_firmware.git`), or https (`https://github.com/qmk/qmk_firmware.git`).
|
Otherwise, you can clone it directly with `git clone https://github.com/qmk/qmk_firmware`. Do not download the zip or tar files; a git repository is required to download the submodules in order to compile.
|
||||||
|
|
||||||
## How to Compile
|
## How to Compile
|
||||||
|
|
||||||
|
|
8
docs/_langs.md
Normal file
8
docs/_langs.md
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
- Translations
|
||||||
|
- [:uk: English](/)
|
||||||
|
- [:cn: 中文](/zh-cn/)
|
||||||
|
- [:es: Español](/es/)
|
||||||
|
- [:fr: Français](/fr-fr/)
|
||||||
|
- [:he: עברית](/he-il/)
|
||||||
|
- [:ru: Русский](/ru-ru/)
|
||||||
|
- [:jp: 日本語](/ja/)
|
|
@ -8,15 +8,21 @@
|
||||||
|
|
||||||
* [QMK Basics](README.md)
|
* [QMK Basics](README.md)
|
||||||
* [QMK Introduction](getting_started_introduction.md)
|
* [QMK Introduction](getting_started_introduction.md)
|
||||||
|
* [QMK CLI](cli.md)
|
||||||
|
* [QMK CLI Config](cli_configuration.md)
|
||||||
* [Contributing to QMK](contributing.md)
|
* [Contributing to QMK](contributing.md)
|
||||||
* [How to Use Github](getting_started_github.md)
|
* [How to Use Github](getting_started_github.md)
|
||||||
* [Getting Help](getting_started_getting_help.md)
|
* [Getting Help](getting_started_getting_help.md)
|
||||||
|
|
||||||
|
* [Breaking Changes](breaking_changes.md)
|
||||||
|
* [2019 Aug 30](ChangeLog/20190830.md)
|
||||||
|
|
||||||
* [FAQ](faq.md)
|
* [FAQ](faq.md)
|
||||||
* [General FAQ](faq_general.md)
|
* [General FAQ](faq_general.md)
|
||||||
* [Build/Compile QMK](faq_build.md)
|
* [Build/Compile QMK](faq_build.md)
|
||||||
* [Debugging/Troubleshooting QMK](faq_debug.md)
|
* [Debugging/Troubleshooting QMK](faq_debug.md)
|
||||||
* [Keymap](faq_keymap.md)
|
* [Keymap](faq_keymap.md)
|
||||||
|
* [Driver Installation with Zadig](driver_installation_zadig.md)
|
||||||
|
|
||||||
* Detailed Guides
|
* Detailed Guides
|
||||||
* [Install Build Tools](getting_started_build_tools.md)
|
* [Install Build Tools](getting_started_build_tools.md)
|
||||||
|
@ -27,6 +33,7 @@
|
||||||
* [Keymap Overview](keymap.md)
|
* [Keymap Overview](keymap.md)
|
||||||
|
|
||||||
* [Hardware](hardware.md)
|
* [Hardware](hardware.md)
|
||||||
|
* [Compatible Microcontrollers](compatible_microcontrollers.md)
|
||||||
* [AVR Processors](hardware_avr.md)
|
* [AVR Processors](hardware_avr.md)
|
||||||
* [Drivers](hardware_drivers.md)
|
* [Drivers](hardware_drivers.md)
|
||||||
|
|
||||||
|
@ -34,6 +41,8 @@
|
||||||
* [Keyboard Guidelines](hardware_keyboard_guidelines.md)
|
* [Keyboard Guidelines](hardware_keyboard_guidelines.md)
|
||||||
* [Config Options](config_options.md)
|
* [Config Options](config_options.md)
|
||||||
* [Keycodes](keycodes.md)
|
* [Keycodes](keycodes.md)
|
||||||
|
* [Coding Conventions - C](coding_conventions_c.md)
|
||||||
|
* [Coding Conventions - Python](coding_conventions_python.md)
|
||||||
* [Documentation Best Practices](documentation_best_practices.md)
|
* [Documentation Best Practices](documentation_best_practices.md)
|
||||||
* [Documentation Templates](documentation_templates.md)
|
* [Documentation Templates](documentation_templates.md)
|
||||||
* [Glossary](reference_glossary.md)
|
* [Glossary](reference_glossary.md)
|
||||||
|
@ -41,6 +50,7 @@
|
||||||
* [Useful Functions](ref_functions.md)
|
* [Useful Functions](ref_functions.md)
|
||||||
* [Configurator Support](reference_configurator_support.md)
|
* [Configurator Support](reference_configurator_support.md)
|
||||||
* [info.json Format](reference_info_json.md)
|
* [info.json Format](reference_info_json.md)
|
||||||
|
* [Python CLI Development](cli_development.md)
|
||||||
|
|
||||||
* [Features](features.md)
|
* [Features](features.md)
|
||||||
* [Basic Keycodes](keycodes_basic.md)
|
* [Basic Keycodes](keycodes_basic.md)
|
||||||
|
@ -55,6 +65,7 @@
|
||||||
* [Combos](feature_combo.md)
|
* [Combos](feature_combo.md)
|
||||||
* [Command](feature_command.md)
|
* [Command](feature_command.md)
|
||||||
* [Debounce API](feature_debounce_type.md)
|
* [Debounce API](feature_debounce_type.md)
|
||||||
|
* [DIP Switch](feature_dip_switch.md)
|
||||||
* [Dynamic Macros](feature_dynamic_macros.md)
|
* [Dynamic Macros](feature_dynamic_macros.md)
|
||||||
* [Encoders](feature_encoders.md)
|
* [Encoders](feature_encoders.md)
|
||||||
* [Grave Escape](feature_grave_esc.md)
|
* [Grave Escape](feature_grave_esc.md)
|
||||||
|
@ -73,6 +84,7 @@
|
||||||
* [RGB Lighting](feature_rgblight.md)
|
* [RGB Lighting](feature_rgblight.md)
|
||||||
* [RGB Matrix](feature_rgb_matrix.md)
|
* [RGB Matrix](feature_rgb_matrix.md)
|
||||||
* [Space Cadet](feature_space_cadet.md)
|
* [Space Cadet](feature_space_cadet.md)
|
||||||
|
* [Split Keyboard](feature_split_keyboard.md)
|
||||||
* [Stenography](feature_stenography.md)
|
* [Stenography](feature_stenography.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)
|
||||||
|
@ -87,6 +99,7 @@
|
||||||
* [ISP Flashing Guide](isp_flashing_guide.md)
|
* [ISP Flashing Guide](isp_flashing_guide.md)
|
||||||
* [ARM Debugging Guide](arm_debugging.md)
|
* [ARM Debugging Guide](arm_debugging.md)
|
||||||
* [I2C Driver](i2c_driver.md)
|
* [I2C Driver](i2c_driver.md)
|
||||||
|
* [WS2812 Driver](ws2812_driver.md)
|
||||||
* [GPIO Controls](internals_gpio_control.md)
|
* [GPIO Controls](internals_gpio_control.md)
|
||||||
* [Proton C Conversion](proton_c_conversion.md)
|
* [Proton C Conversion](proton_c_conversion.md)
|
||||||
|
|
||||||
|
@ -98,6 +111,7 @@
|
||||||
* [Using Eclipse with QMK](other_eclipse.md)
|
* [Using Eclipse with QMK](other_eclipse.md)
|
||||||
* [Using VSCode with QMK](other_vscode.md)
|
* [Using VSCode with QMK](other_vscode.md)
|
||||||
* [Support](support.md)
|
* [Support](support.md)
|
||||||
|
* [How to add translations](translating.md)
|
||||||
|
|
||||||
* QMK Internals (In Progress)
|
* QMK Internals (In Progress)
|
||||||
* [Defines](internals_defines.md)
|
* [Defines](internals_defines.md)
|
||||||
|
|
|
@ -6,15 +6,15 @@ This guide is catered towards advance users and assumes you can compile an ARM c
|
||||||
|
|
||||||
## Installing the software
|
## Installing the software
|
||||||
|
|
||||||
The main objective here is to get the MCU Eclipse IDE correcly installed on our machine. The necesarry instructions are derived from [this](https://gnu-mcu-eclipse.github.io/install/) install guide.
|
The main objective here is to get the MCU Eclipse IDE correctly installed on our machine. The necessary instructions are derived from [this](https://gnu-mcu-eclipse.github.io/install/) install guide.
|
||||||
|
|
||||||
### The xPack Manager
|
### The xPack Manager
|
||||||
|
|
||||||
This tool is a software package manager and it is used to help us get the necesarry depencencies.
|
This tool is a software package manager and it is used to help us get the necessary dependencies.
|
||||||
|
|
||||||
XPM runs using Node.js so grab that form [here](https://nodejs.org/en/). After installation, open a terminal and type `npm -v`. A reply with the version number means that the instalation was successful.
|
XPM runs using Node.js so grab that from [here](https://nodejs.org/en/). After installation, open a terminal and type `npm -v`. A reply with the version number means that the installation was successful.
|
||||||
|
|
||||||
XPM instalation instructions can be found [here](https://www.npmjs.com/package/xpm) and are OS specific. Entering `xpm --version` to your terminal should return the software version.
|
XPM installation instructions can be found [here](https://www.npmjs.com/package/xpm) and are OS specific. Entering `xpm --version` to your terminal should return the software version.
|
||||||
|
|
||||||
### The ARM Toolchain
|
### The ARM Toolchain
|
||||||
|
|
||||||
|
@ -26,10 +26,10 @@ If you are using windows you need to install this!
|
||||||
|
|
||||||
`xpm install --global @gnu-mcu-eclipse/windows-build-tools`
|
`xpm install --global @gnu-mcu-eclipse/windows-build-tools`
|
||||||
|
|
||||||
### Programer/Debugger Drivers
|
### Programmer/Debugger Drivers
|
||||||
|
|
||||||
Now its the time to install your programer's drivers. This tutorial was made using an ST-Link v2 which you can get from almost anywhere.
|
Now it's time to install your programmer's drivers. This tutorial was made using an ST-Link v2 which you can get from almost anywhere.
|
||||||
If you have an ST-Link the drivers can be found [here](https://www.st.com/en/development-tools/stsw-link009.html) otherwise consult the manufuturer of your tool.
|
If you have an ST-Link the drivers can be found [here](https://www.st.com/en/development-tools/stsw-link009.html) otherwise consult the manufacturer of your tool.
|
||||||
|
|
||||||
### OpenOCD
|
### OpenOCD
|
||||||
|
|
||||||
|
|
107
docs/breaking_changes.md
Normal file
107
docs/breaking_changes.md
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
# Breaking Changes
|
||||||
|
|
||||||
|
This document describes QMK's Breaking Change process. A Breaking Change is any change which modifies how QMK behaves in a way that in incompatible or potentially dangerous. We limit these changes so that users can have confidence that updating their QMK tree will not break their keymaps.
|
||||||
|
|
||||||
|
The breaking change period is when we will merge PR's that change QMK in dangerous or unexpected ways. There is a built-in period of testing so we are confident that any problems caused are rare or unable to be predicted.
|
||||||
|
|
||||||
|
## What has been included in past Breaking Changes?
|
||||||
|
|
||||||
|
* [2019 Aug 30](ChangeLog/20190830.md)
|
||||||
|
|
||||||
|
## When is the next Breaking Change?
|
||||||
|
|
||||||
|
The next Breaking Change is scheduled for Nov 29.
|
||||||
|
|
||||||
|
### Important Dates
|
||||||
|
|
||||||
|
* [x] 2019 Sep 21 - `future` is created. It will be rebased weekly.
|
||||||
|
* [ ] 2019 Nov 01 - `future` closed to new PR's.
|
||||||
|
* [ ] 2019 Nov 01 - Call for testers.
|
||||||
|
* [ ] 2019 Nov 27 - `master` is locked, no PR's merged.
|
||||||
|
* [ ] 2019 Nov 29 - Merge `future` to `master`.
|
||||||
|
* [ ] 2019 Nov 30 - `master` is unlocked. PR's can be merged again.
|
||||||
|
|
||||||
|
## What changes will be included?
|
||||||
|
|
||||||
|
To see a list of breaking change candidates you can look at the [`breaking_change` label](https://github.com/qmk/qmk_firmware/pulls?q=is%3Aopen+label%3Abreaking_change+is%3Apr). New changes might be added between now and when `future` is closed, and a PR with that label applied is not guaranteed to be merged.
|
||||||
|
|
||||||
|
If you want your breaking change to be included in this round you need to create a PR with the `breaking_change` label and have it accepted before `future` closes. After `future` closes no new breaking changes will be accepted.
|
||||||
|
|
||||||
|
Criteria for acceptance:
|
||||||
|
|
||||||
|
* PR is complete and ready to merge
|
||||||
|
* PR has a ChangeLog
|
||||||
|
|
||||||
|
# Checklists
|
||||||
|
|
||||||
|
This section documents various processes we use when running the Breaking Changes process.
|
||||||
|
|
||||||
|
## Rebase `future` from `master`
|
||||||
|
|
||||||
|
This is run every Friday while `future` is open.
|
||||||
|
|
||||||
|
Process:
|
||||||
|
|
||||||
|
```
|
||||||
|
cd qmk_firmware
|
||||||
|
git checkout master
|
||||||
|
git pull --ff-only
|
||||||
|
git checkout future
|
||||||
|
git rebase master
|
||||||
|
git push --force
|
||||||
|
```
|
||||||
|
|
||||||
|
## Creating the `future` branch
|
||||||
|
|
||||||
|
This happens immediately after the previous `future` branch is merged.
|
||||||
|
|
||||||
|
* `qmk_firmware` git commands
|
||||||
|
* [ ] `git checkout master`
|
||||||
|
* [ ] `git pull --ff-only`
|
||||||
|
* [ ] `git checkout -b future`
|
||||||
|
* [ ] 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 origin future`
|
||||||
|
* [ ] `git push --tags`
|
||||||
|
|
||||||
|
## 4 Weeks Before Merge
|
||||||
|
|
||||||
|
* `future` is now closed to new PR's, only fixes for current PR's may be merged
|
||||||
|
* Post call for testers
|
||||||
|
* [ ] Discord
|
||||||
|
* [ ] GitHub PR
|
||||||
|
* [ ] https://reddit.com/r/olkb
|
||||||
|
|
||||||
|
## 1 Week Before Merge
|
||||||
|
|
||||||
|
* Announce that master will be closed from <2 Days Before> to <Day of Merge>
|
||||||
|
* [ ] Discord
|
||||||
|
* [ ] GitHub PR
|
||||||
|
* [ ] https://reddit.com/r/olkb
|
||||||
|
|
||||||
|
## 2 Days Before Merge
|
||||||
|
|
||||||
|
* Announce that master is closed for 2 days
|
||||||
|
* [ ] Discord
|
||||||
|
* [ ] GitHub PR
|
||||||
|
* [ ] https://reddit.com/r/olkb
|
||||||
|
|
||||||
|
## Day Of Merge
|
||||||
|
|
||||||
|
* `qmk_firmware` git commands
|
||||||
|
* [ ] `git checkout future`
|
||||||
|
* [ ] `git pull --ff-only`
|
||||||
|
* [ ] `git rebase origin/master`
|
||||||
|
* [ ] Edit `readme.md`
|
||||||
|
* [ ] Remove the notes about `future`
|
||||||
|
* [ ] Roll up the ChangeLog into one file.
|
||||||
|
* [ ] `git commit -m 'Merge point for <DATE> Breaking Change'`
|
||||||
|
* [ ] `git push origin future`
|
||||||
|
* Github Actions
|
||||||
|
* [ ] Create a PR for `future`
|
||||||
|
* [ ] Make sure travis comes back clean
|
||||||
|
* [ ] Merge `future` PR
|
222
docs/cli.md
Normal file
222
docs/cli.md
Normal file
|
@ -0,0 +1,222 @@
|
||||||
|
# QMK CLI
|
||||||
|
|
||||||
|
This page describes how to setup and use the QMK CLI.
|
||||||
|
|
||||||
|
# Overview
|
||||||
|
|
||||||
|
The QMK CLI makes building and working with QMK keyboards easier. We have provided a number of commands to simplify and streamline tasks such as obtaining and compiling the QMK firmware, creating keymaps, and more.
|
||||||
|
|
||||||
|
* [Global CLI](#global-cli)
|
||||||
|
* [Local CLI](#local-cli)
|
||||||
|
* [CLI Commands](#cli-commands)
|
||||||
|
|
||||||
|
# Requirements
|
||||||
|
|
||||||
|
The CLI requires Python 3.5 or greater. We try to keep the number of requirements small but you will also need to install the packages listed in [`requirements.txt`](https://github.com/qmk/qmk_firmware/blob/master/requirements.txt).
|
||||||
|
|
||||||
|
# Global CLI
|
||||||
|
|
||||||
|
QMK provides an installable CLI that can be used to setup your QMK build environment, work with QMK, and which makes working with multiple copies of `qmk_firmware` easier. We recommend installing and updating this periodically.
|
||||||
|
|
||||||
|
## Install Using Homebrew (macOS, some Linux)
|
||||||
|
|
||||||
|
If you have installed [Homebrew](https://brew.sh) you can tap and install QMK:
|
||||||
|
|
||||||
|
```
|
||||||
|
brew tap qmk/qmk
|
||||||
|
brew install qmk
|
||||||
|
export QMK_HOME='~/qmk_firmware' # Optional, set the location for `qmk_firmware`
|
||||||
|
qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment
|
||||||
|
```
|
||||||
|
|
||||||
|
## Install Using easy_install or pip
|
||||||
|
|
||||||
|
If your system is not listed above you can install QMK manually. First ensure that you have python 3.5 (or later) installed and have installed pip. Then install QMK with this command:
|
||||||
|
|
||||||
|
```
|
||||||
|
pip3 install qmk
|
||||||
|
export QMK_HOME='~/qmk_firmware' # Optional, set the location for `qmk_firmware`
|
||||||
|
qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment
|
||||||
|
```
|
||||||
|
|
||||||
|
## Packaging For Other Operating Systems
|
||||||
|
|
||||||
|
We are looking for people to create and maintain a `qmk` package for more operating systems. If you would like to create a package for your OS please follow these guidelines:
|
||||||
|
|
||||||
|
* Follow best practices for your OS when they conflict with these guidelines
|
||||||
|
* Document why in a comment when you do deviate
|
||||||
|
* Install using a virtualenv
|
||||||
|
* Instruct the user to set the environment variable `QMK_HOME` to have the firmware source checked out somewhere other than `~/qmk_firmware`.
|
||||||
|
|
||||||
|
# Local CLI
|
||||||
|
|
||||||
|
If you do not want to use the global CLI there is a local CLI bundled with `qmk_firmware`. You can find it in `qmk_firmware/bin/qmk`. You can run the `qmk` command from any directory and it will always operate on that copy of `qmk_firmware`.
|
||||||
|
|
||||||
|
**Example**:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ~/qmk_firmware/bin/qmk hello
|
||||||
|
Ψ Hello, World!
|
||||||
|
```
|
||||||
|
|
||||||
|
## Local CLI Limitations
|
||||||
|
|
||||||
|
There are some limitations to the local CLI compared to the global CLI:
|
||||||
|
|
||||||
|
* The local CLI does not support `qmk setup` or `qmk clone`
|
||||||
|
* The local CLI always operates on the same `qmk_firmware` tree, even if you have multiple repositories cloned.
|
||||||
|
* The local CLI does not run in a virtualenv, so it's possible that dependencies will conflict
|
||||||
|
|
||||||
|
# CLI Commands
|
||||||
|
|
||||||
|
## `qmk cformat`
|
||||||
|
|
||||||
|
This command formats C code using clang-format. Run it with no arguments to format all core code, or pass filenames on the command line to run it on specific files.
|
||||||
|
|
||||||
|
**Usage**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk cformat [file1] [file2] [...] [fileN]
|
||||||
|
```
|
||||||
|
|
||||||
|
## `qmk compile`
|
||||||
|
|
||||||
|
This command allows you to compile firmware from any directory. You can compile JSON exports from <https://config.qmk.fm> or compile keymaps in the repo.
|
||||||
|
|
||||||
|
**Usage for Configurator Exports**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk compile <configuratorExport.json>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Usage for Keymaps**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk compile -kb <keyboard_name> -km <keymap_name>
|
||||||
|
```
|
||||||
|
|
||||||
|
## `qmk flash`
|
||||||
|
|
||||||
|
This command is similar to `qmk compile`, but can also target a bootloader. The bootloader is optional, and is set to `:flash` by default.
|
||||||
|
To specify a different bootloader, use `-bl <bootloader>`. Visit <https://docs.qmk.fm/#/flashing>
|
||||||
|
for more details of the available bootloaders.
|
||||||
|
|
||||||
|
**Usage for Configurator Exports**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk flash <configuratorExport.json> -bl <bootloader>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Usage for Keymaps**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk flash -kb <keyboard_name> -km <keymap_name> -bl <bootloader>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Listing the Bootloaders**
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk flash -b
|
||||||
|
```
|
||||||
|
|
||||||
|
## `qmk config`
|
||||||
|
|
||||||
|
This command lets you configure the behavior of QMK. For the full `qmk config` documentation see [CLI Configuration](cli_configuration.md).
|
||||||
|
|
||||||
|
**Usage**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk config [-ro] [config_token1] [config_token2] [...] [config_tokenN]
|
||||||
|
```
|
||||||
|
|
||||||
|
## `qmk docs`
|
||||||
|
|
||||||
|
This command starts a local HTTP server which you can use for browsing or improving the docs. Default port is 8936.
|
||||||
|
|
||||||
|
**Usage**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk docs [-p PORT]
|
||||||
|
```
|
||||||
|
|
||||||
|
## `qmk doctor`
|
||||||
|
|
||||||
|
This command examines your environment and alerts you to potential build or flash problems.
|
||||||
|
|
||||||
|
**Usage**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk doctor
|
||||||
|
```
|
||||||
|
|
||||||
|
## `qmk json-keymap`
|
||||||
|
|
||||||
|
Creates a keymap.c from a QMK Configurator export.
|
||||||
|
|
||||||
|
**Usage**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk json-keymap [-o OUTPUT] filename
|
||||||
|
```
|
||||||
|
|
||||||
|
## `qmk kle2json`
|
||||||
|
|
||||||
|
This command allows you to convert from raw KLE data to QMK Configurator JSON. It accepts either an absolute file path, or a file name in the current directory. By default it will not overwrite `info.json` if it is already present. Use the `-f` or `--force` flag to overwrite.
|
||||||
|
|
||||||
|
**Usage**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk kle2json [-f] <filename>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Examples**:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ qmk kle2json kle.txt
|
||||||
|
☒ File info.json already exists, use -f or --force to overwrite.
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
$ qmk kle2json -f kle.txt -f
|
||||||
|
Ψ Wrote out to info.json
|
||||||
|
```
|
||||||
|
|
||||||
|
## `qmk list-keyboards`
|
||||||
|
|
||||||
|
This command lists all the keyboards currently defined in `qmk_firmware`
|
||||||
|
|
||||||
|
**Usage**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk list-keyboards
|
||||||
|
```
|
||||||
|
|
||||||
|
## `qmk new-keymap`
|
||||||
|
|
||||||
|
This command creates a new keymap based on a keyboard's existing default keymap.
|
||||||
|
|
||||||
|
**Usage**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk new-keymap [-kb KEYBOARD] [-km KEYMAP]
|
||||||
|
```
|
||||||
|
|
||||||
|
## `qmk pyformat`
|
||||||
|
|
||||||
|
This command formats python code in `qmk_firmware`.
|
||||||
|
|
||||||
|
**Usage**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk pyformat
|
||||||
|
```
|
||||||
|
|
||||||
|
## `qmk pytest`
|
||||||
|
|
||||||
|
This command runs the python test suite. If you make changes to python code you should ensure this runs successfully.
|
||||||
|
|
||||||
|
**Usage**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk pytest
|
||||||
|
```
|
121
docs/cli_configuration.md
Normal file
121
docs/cli_configuration.md
Normal file
|
@ -0,0 +1,121 @@
|
||||||
|
# QMK CLI Configuration
|
||||||
|
|
||||||
|
This document explains how `qmk config` works.
|
||||||
|
|
||||||
|
# Introduction
|
||||||
|
|
||||||
|
Configuration for QMK CLI is a key/value system. Each key consists of a subcommand and an argument name separated by a period. This allows for a straightforward and direct translation between config keys and the arguments they set.
|
||||||
|
|
||||||
|
## Simple Example
|
||||||
|
|
||||||
|
As an example let's look at the command `qmk compile --keyboard clueboard/66/rev4 --keymap default`.
|
||||||
|
|
||||||
|
There are two command line arguments that could be read from configuration instead:
|
||||||
|
|
||||||
|
* `compile.keyboard`
|
||||||
|
* `compile.keymap`
|
||||||
|
|
||||||
|
Let's set these now:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ qmk config compile.keyboard=clueboard/66/rev4 compile.keymap=default
|
||||||
|
compile.keyboard: None -> clueboard/66/rev4
|
||||||
|
compile.keymap: None -> default
|
||||||
|
Ψ Wrote configuration to '/Users/example/Library/Application Support/qmk/qmk.ini'
|
||||||
|
```
|
||||||
|
|
||||||
|
Now I can run `qmk compile` without specifying my keyboard and keymap each time.
|
||||||
|
|
||||||
|
## Setting User Defaults
|
||||||
|
|
||||||
|
Sometimes you want to share a setting between multiple commands. For example, multiple commands take the argument `--keyboard`. Rather than setting this value for every command you can set a user value which will be used by any command that takes that argument.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ qmk config user.keyboard=clueboard/66/rev4 user.keymap=default
|
||||||
|
user.keyboard: None -> clueboard/66/rev4
|
||||||
|
user.keymap: None -> default
|
||||||
|
Ψ Wrote configuration to '/Users/example/Library/Application Support/qmk/qmk.ini'
|
||||||
|
```
|
||||||
|
|
||||||
|
# CLI Documentation (`qmk config`)
|
||||||
|
|
||||||
|
The `qmk config` command is used to interact with the underlying configuration. When run with no argument it shows the current configuration. When arguments are supplied they are assumed to be configuration tokens, which are strings containing no spaces with the following form:
|
||||||
|
|
||||||
|
<subcommand|general|default>[.<key>][=<value>]
|
||||||
|
|
||||||
|
## Setting Configuration Values
|
||||||
|
|
||||||
|
You can set configuration values by putting an equal sign (=) into your config key. The key must always be the full `<section>.<key>` form.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ qmk config default.keymap=default
|
||||||
|
default.keymap: None -> default
|
||||||
|
Ψ Wrote configuration to '/Users/example/Library/Application Support/qmk/qmk.ini'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Reading Configuration Values
|
||||||
|
|
||||||
|
You can read configuration values for the entire configuration, a single key, or for an entire section. You can also specify multiple keys to display more than one value.
|
||||||
|
|
||||||
|
### Entire Configuration Example
|
||||||
|
|
||||||
|
qmk config
|
||||||
|
|
||||||
|
### Whole Section Example
|
||||||
|
|
||||||
|
qmk config compile
|
||||||
|
|
||||||
|
### Single Key Example
|
||||||
|
|
||||||
|
qmk config compile.keyboard
|
||||||
|
|
||||||
|
### Multiple Keys Example
|
||||||
|
|
||||||
|
qmk config user compile.keyboard compile.keymap
|
||||||
|
|
||||||
|
## Deleting Configuration Values
|
||||||
|
|
||||||
|
You can delete a configuration value by setting it to the special string `None`.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ qmk config default.keymap=None
|
||||||
|
default.keymap: default -> None
|
||||||
|
Ψ Wrote configuration to '/Users/example/Library/Application Support/qmk/qmk.ini'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Multiple Operations
|
||||||
|
|
||||||
|
You can combine multiple read and write operations into a single command. They will be executed and displayed in order:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ qmk config compile default.keymap=default compile.keymap=None
|
||||||
|
compile.keymap=skully
|
||||||
|
compile.keyboard=clueboard/66_hotswap/gen1
|
||||||
|
default.keymap: None -> default
|
||||||
|
compile.keymap: skully -> None
|
||||||
|
Ψ Wrote configuration to '/Users/example/Library/Application Support/qmk/qmk.ini'
|
||||||
|
```
|
||||||
|
|
||||||
|
# User Configuration Options
|
||||||
|
|
||||||
|
| Key | Default Value | Description |
|
||||||
|
|-----|---------------|-------------|
|
||||||
|
| user.keyboard | None | The keyboard path (Example: `clueboard/66/rev4`) |
|
||||||
|
| user.keymap | None | The keymap name (Example: `default`) |
|
||||||
|
| user.name | None | The user's github username. |
|
||||||
|
|
||||||
|
# All Configuration Options
|
||||||
|
|
||||||
|
| Key | Default Value | Description |
|
||||||
|
|-----|---------------|-------------|
|
||||||
|
| compile.keyboard | None | The keyboard path (Example: `clueboard/66/rev4`) |
|
||||||
|
| compile.keymap | None | The keymap name (Example: `default`) |
|
||||||
|
| hello.name | None | The name to greet when run. |
|
||||||
|
| new_keyboard.keyboard | None | The keyboard path (Example: `clueboard/66/rev4`) |
|
||||||
|
| new_keyboard.keymap | None | The keymap name (Example: `default`) |
|
207
docs/cli_development.md
Normal file
207
docs/cli_development.md
Normal file
|
@ -0,0 +1,207 @@
|
||||||
|
# QMK CLI Development
|
||||||
|
|
||||||
|
This document has useful information for developers wishing to write new `qmk` subcommands.
|
||||||
|
|
||||||
|
# Overview
|
||||||
|
|
||||||
|
The QMK CLI operates using the subcommand pattern made famous by git. The main `qmk` script is simply there to setup the environment and pick the correct entrypoint to run. Each subcommand is a self-contained module with an entrypoint (decorated by `@cli.subcommand()`) that performs some action and returns a shell returncode, or None.
|
||||||
|
|
||||||
|
# Subcommands
|
||||||
|
|
||||||
|
[MILC](https://github.com/clueboard/milc) is the CLI framework `qmk` uses to handle argument parsing, configuration, logging, and many other features. It lets you focus on writing your tool without wasting your time writing glue code.
|
||||||
|
|
||||||
|
Subcommands in the local CLI are always found in `qmk_firmware/lib/python/qmk/cli`.
|
||||||
|
|
||||||
|
Let's start by looking at an example subcommand. This is `lib/python/qmk/cli/hello.py`:
|
||||||
|
|
||||||
|
```python
|
||||||
|
"""QMK Python Hello World
|
||||||
|
|
||||||
|
This is an example QMK CLI script.
|
||||||
|
"""
|
||||||
|
from milc import cli
|
||||||
|
|
||||||
|
|
||||||
|
@cli.argument('-n', '--name', default='World', help='Name to greet.')
|
||||||
|
@cli.subcommand('QMK Hello World.')
|
||||||
|
def hello(cli):
|
||||||
|
"""Log a friendly greeting.
|
||||||
|
"""
|
||||||
|
cli.log.info('Hello, %s!', cli.config.hello.name)
|
||||||
|
```
|
||||||
|
|
||||||
|
First we import the `cli` object from `milc`. This is how we interact with the user and control the script's behavior. We use `@cli.argument()` to define a command line flag, `--name`. This also creates a configuration variable named `hello.name` (and the corresponding `user.name`) which the user can set so they don't have to specify the argument. The `cli.subcommand()` decorator designates this function as a subcommand. The name of the subcommand will be taken from the name of the function.
|
||||||
|
|
||||||
|
Once inside our function we find a typical "Hello, World!" program. We use `cli.log` to access the underlying [Logger Object](https://docs.python.org/3.5/library/logging.html#logger-objects), whose behavior is user controllable. We also access the value for name supplied by the user as `cli.config.hello.name`. The value for `cli.config.hello.name` will be determined by looking at the `--name` argument supplied by the user, if not provided it will use the value in the `qmk.ini` config file, and if neither of those is provided it will fall back to the default supplied in the `cli.argument()` decorator.
|
||||||
|
|
||||||
|
# User Interaction
|
||||||
|
|
||||||
|
MILC and the QMK CLI have several nice tools for interacting with the user. Using these standard tools will allow you to colorize your text for easier interactions, and allow the user to control when and how that information is displayed and stored.
|
||||||
|
|
||||||
|
## Printing Text
|
||||||
|
|
||||||
|
There are two main methods for outputting text in a subcommand- `cli.log` and `cli.echo()`. They operate in similar ways but you should prefer to use `cli.log.info()` for most general purpose printing.
|
||||||
|
|
||||||
|
You can use special tokens to colorize your text, to make it easier to understand the output of your program. See [Colorizing Text](#colorizing-text) below.
|
||||||
|
|
||||||
|
Both of these methods support built-in string formatting using python's [printf style string format operations](https://docs.python.org/3.5/library/stdtypes.html#old-string-formatting). You can use tokens such as `%s` and `%d` within your text strings then pass the values as arguments. See our Hello, World program above for an example.
|
||||||
|
|
||||||
|
You should never use the format operator (`%`) directly, always pass values as arguments.
|
||||||
|
|
||||||
|
### Logging (`cli.log`)
|
||||||
|
|
||||||
|
The `cli.log` object gives you access to a [Logger Object](https://docs.python.org/3.5/library/logging.html#logger-objects). We have configured our log output to show the user a nice emoji for each log level (or the log level name if their terminal does not support unicode.) This way the user can tell at a glance which messages are most important when something goes wrong.
|
||||||
|
|
||||||
|
The default log level is `INFO`. If the user runs `qmk -v <subcommand>` the default log level will be set to `DEBUG`.
|
||||||
|
|
||||||
|
| Function | Emoji |
|
||||||
|
|----------|-------|
|
||||||
|
| cli.log.critical | `{bg_red}{fg_white}¬_¬{style_reset_all}` |
|
||||||
|
| cli.log.error | `{fg_red}☒{style_reset_all}` |
|
||||||
|
| cli.log.warning | `{fg_yellow}⚠{style_reset_all}` |
|
||||||
|
| cli.log.info | `{fg_blue}Ψ{style_reset_all}` |
|
||||||
|
| cli.log.debug | `{fg_cyan}☐{style_reset_all}` |
|
||||||
|
| cli.log.notset | `{style_reset_all}¯\\_(o_o)_/¯` |
|
||||||
|
|
||||||
|
### Printing (`cli.echo`)
|
||||||
|
|
||||||
|
Sometimes you simply need to print text outside of the log system. This is appropriate if you are outputting fixed data or writing out something that should never be logged. Most of the time you should prefer `cli.log.info()` over `cli.echo`.
|
||||||
|
|
||||||
|
### Colorizing Text
|
||||||
|
|
||||||
|
You can colorize the output of your text by including color tokens within text. Use color to highlight, not to convey information. Remember that the user can disable color, and your subcommand should still be usable if they do.
|
||||||
|
|
||||||
|
You should generally avoid setting the background color, unless it's integral to what you are doing. Remember that users have a lot of preferences when it comes to their terminal color, so you should pick colors that work well against both black and white backgrounds.
|
||||||
|
|
||||||
|
Colors prefixed with 'fg' will affect the foreground (text) color. Colors prefixed with 'bg' will affect the background color.
|
||||||
|
|
||||||
|
| Color | Background | Extended Background | Foreground | Extended Foreground|
|
||||||
|
|-------|------------|---------------------|------------|--------------------|
|
||||||
|
| Black | {bg_black} | {bg_lightblack_ex} | {fg_black} | {fg_lightblack_ex} |
|
||||||
|
| Blue | {bg_blue} | {bg_lightblue_ex} | {fg_blue} | {fg_lightblue_ex} |
|
||||||
|
| Cyan | {bg_cyan} | {bg_lightcyan_ex} | {fg_cyan} | {fg_lightcyan_ex} |
|
||||||
|
| Green | {bg_green} | {bg_lightgreen_ex} | {fg_green} | {fg_lightgreen_ex} |
|
||||||
|
| Magenta | {bg_magenta} | {bg_lightmagenta_ex} | {fg_magenta} | {fg_lightmagenta_ex} |
|
||||||
|
| Red | {bg_red} | {bg_lightred_ex} | {fg_red} | {fg_lightred_ex} |
|
||||||
|
| White | {bg_white} | {bg_lightwhite_ex} | {fg_white} | {fg_lightwhite_ex} |
|
||||||
|
| Yellow | {bg_yellow} | {bg_lightyellow_ex} | {fg_yellow} | {fg_lightyellow_ex} |
|
||||||
|
|
||||||
|
There are also control sequences that can be used to change the behavior of
|
||||||
|
ANSI output:
|
||||||
|
|
||||||
|
| Control Sequences | Description |
|
||||||
|
|-------------------|-------------|
|
||||||
|
| {style_bright} | Make the text brighter |
|
||||||
|
| {style_dim} | Make the text dimmer |
|
||||||
|
| {style_normal} | Make the text normal (neither `{style_bright}` nor `{style_dim}`) |
|
||||||
|
| {style_reset_all} | Reset all text attributes to default. (This is automatically added to the end of every string.) |
|
||||||
|
| {bg_reset} | Reset the background color to the user's default |
|
||||||
|
| {fg_reset} | Reset the foreground color to the user's default |
|
||||||
|
|
||||||
|
# Arguments and Configuration
|
||||||
|
|
||||||
|
QMK handles the details of argument parsing and configuration for you. When you add a new argument it is automatically incorporated into the config tree based on your subcommand's name and the long name of the argument. You can access this configuration in `cli.config`, using either attribute-style access (`cli.config.<subcommand>.<argument>`) or dictionary-style access (`cli.config['<subcommand>']['<argument>']`).
|
||||||
|
|
||||||
|
Under the hood QMK uses [ConfigParser](https://docs.python.org/3/library/configparser.html) to store configurations. This gives us an easy and straightforward way to represent the configuration in a human-editable way. We have wrapped access to this configuration to provide some nicities that ConfigParser does not normally have.
|
||||||
|
|
||||||
|
## Reading Configuration Values
|
||||||
|
|
||||||
|
You can interact with `cli.config` in all the ways you'd normally expect. For example the `qmk compile` command gets the keyboard name from `cli.config.compile.keyboard`. It does not need to know whether that value came from the command line, an environment variable, or the configuration file.
|
||||||
|
|
||||||
|
Iteration is also supported:
|
||||||
|
|
||||||
|
```
|
||||||
|
for section in cli.config:
|
||||||
|
for key in cli.config[section]:
|
||||||
|
cli.log.info('%s.%s: %s', section, key, cli.config[section][key])
|
||||||
|
```
|
||||||
|
|
||||||
|
## Setting Configuration Values
|
||||||
|
|
||||||
|
You can set configuration values in the usual ways.
|
||||||
|
|
||||||
|
Dictionary style:
|
||||||
|
|
||||||
|
```
|
||||||
|
cli.config['<section>']['<key>'] = <value>
|
||||||
|
```
|
||||||
|
|
||||||
|
Attribute style:
|
||||||
|
|
||||||
|
```
|
||||||
|
cli.config.<section>.<key> = <value>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Deleting Configuration Values
|
||||||
|
|
||||||
|
You can delete configuration values in the usual ways.
|
||||||
|
|
||||||
|
Dictionary style:
|
||||||
|
|
||||||
|
```
|
||||||
|
del(cli.config['<section>']['<key>'])
|
||||||
|
```
|
||||||
|
|
||||||
|
Attribute style:
|
||||||
|
|
||||||
|
```
|
||||||
|
del(cli.config.<section>.<key>)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Writing The Configuration File
|
||||||
|
|
||||||
|
The configuration is not written out when it is changed. Most commands do not need to do this. We prefer to have the user change their configuration deliberitely using `qmk config`.
|
||||||
|
|
||||||
|
You can use `cli.save_config()` to write out the configuration.
|
||||||
|
|
||||||
|
## Excluding Arguments From Configuration
|
||||||
|
|
||||||
|
Some arguments should not be propagated to the configuration file. These can be excluded by adding `arg_only=True` when creating the argument.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```
|
||||||
|
@cli.argument('-o', '--output', arg_only=True, help='File to write to')
|
||||||
|
@cli.argument('filename', arg_only=True, help='Configurator JSON file')
|
||||||
|
@cli.subcommand('Create a keymap.c from a QMK Configurator export.')
|
||||||
|
def json_keymap(cli):
|
||||||
|
pass
|
||||||
|
```
|
||||||
|
|
||||||
|
You will only be able to access these arguments using `cli.args`. For example:
|
||||||
|
|
||||||
|
```
|
||||||
|
cli.log.info('Reading from %s and writing to %s', cli.args.filename, cli.args.output)
|
||||||
|
```
|
||||||
|
|
||||||
|
# Testing, and Linting, and Formatting (oh my!)
|
||||||
|
|
||||||
|
We use nose2, flake8, and yapf to test, lint, and format code. You can use the `pytest` and `pyformat` subcommands to run these tests:
|
||||||
|
|
||||||
|
### Testing and Linting
|
||||||
|
|
||||||
|
qmk pytest
|
||||||
|
|
||||||
|
### Formatting
|
||||||
|
|
||||||
|
qmk pyformat
|
||||||
|
|
||||||
|
## Formatting Details
|
||||||
|
|
||||||
|
We use [yapf](https://github.com/google/yapf) to automatically format code. Our configuration is in the `[yapf]` section of `setup.cfg`.
|
||||||
|
|
||||||
|
?> Tip- Many editors can use yapf as a plugin to automatically format code as you type.
|
||||||
|
|
||||||
|
## Testing Details
|
||||||
|
|
||||||
|
Our tests can be found in `lib/python/qmk/tests/`. You will find both unit and integration tests in this directory. We hope you will write both unit and integration tests for your code, but if you do not please favor integration tests.
|
||||||
|
|
||||||
|
If your PR does not include a comprehensive set of tests please add comments like this to your code so that other people know where they can help:
|
||||||
|
|
||||||
|
# TODO(unassigned/<yourGithubUsername>): Write <unit|integration> tests
|
||||||
|
|
||||||
|
We use [nose2](https://nose2.readthedocs.io/en/latest/getting_started.html) to run our tests. You can refer to the nose2 documentation for more details on what you can do in your test functions.
|
||||||
|
|
||||||
|
## Linting Details
|
||||||
|
|
||||||
|
We use flake8 to lint our code. Your code should pass flake8 before you open a PR. This will be checked when you run `qmk pytest` and by CI when you submit a PR.
|
58
docs/coding_conventions_c.md
Normal file
58
docs/coding_conventions_c.md
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
# Coding Conventions (C)
|
||||||
|
|
||||||
|
Most of our style is pretty easy to pick up on, but right now it's not entirely consistent. You should match the style of the code surrounding your change, but if that code is inconsistent or unclear use the following guidelines:
|
||||||
|
|
||||||
|
* We indent using four (4) spaces (soft tabs)
|
||||||
|
* We use a modified One True Brace Style
|
||||||
|
* Opening Brace: At the end of the same line as the statement that opens the block
|
||||||
|
* Closing Brace: Lined up with the first character of the statement that opens the block
|
||||||
|
* Else If: Place the closing brace at the beginning of the line and the next opening brace at the end of the same line.
|
||||||
|
* Optional Braces: Always include optional braces.
|
||||||
|
* Good: if (condition) { return false; }
|
||||||
|
* Bad: if (condition) return false;
|
||||||
|
* We encourage use of C style comments: `/* */`
|
||||||
|
* Think of them as a story describing the feature
|
||||||
|
* Use them liberally to explain why particular decisions were made.
|
||||||
|
* Do not write obvious comments
|
||||||
|
* If you not sure if a comment is obvious, go ahead and include it.
|
||||||
|
* In general we don't wrap lines, they can be as long as needed. If you do choose to wrap lines please do not wrap any wider than 76 columns.
|
||||||
|
* We use `#pragma once` at the start of header files rather than old-style include guards (`#ifndef THIS_FILE_H`, `#define THIS_FILE_H`, ..., `#endif`)
|
||||||
|
* We accept both forms of preprocessor if's: `#ifdef DEFINED` and `#if defined(DEFINED)`
|
||||||
|
* If you are not sure which to prefer use the `#if defined(DEFINED)` form.
|
||||||
|
* Do not change existing code from one style to the other, except when moving to a multiple condition `#if`.
|
||||||
|
* Do not put whitespace between `#` and `if`.
|
||||||
|
* When deciding how (or if) to indent directives keep these points in mind:
|
||||||
|
* Readability is more important than consistency.
|
||||||
|
* Follow the file's existing style. If the file is mixed follow the style that makes sense for the section you are modifying.
|
||||||
|
* When choosing to indent you can follow the indention level of the surrounding C code, or preprocessor directives can have their own indent level. Choose the style that best communicates the intent of your code.
|
||||||
|
|
||||||
|
Here is an example for easy reference:
|
||||||
|
|
||||||
|
```c
|
||||||
|
/* Enums for foo */
|
||||||
|
enum foo_state {
|
||||||
|
FOO_BAR,
|
||||||
|
FOO_BAZ,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Returns a value */
|
||||||
|
int foo(void) {
|
||||||
|
if (some_condition) {
|
||||||
|
return FOO_BAR;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
# Auto-formatting with clang-format
|
||||||
|
|
||||||
|
[Clang-format](https://clang.llvm.org/docs/ClangFormat.html) is part of LLVM and can automatically format your code for you, because ain't nobody got time to do it manually. We supply a configuration file for it that applies most of the coding conventions listed above. It will only change whitespace and newlines, so you will still have to remember to include optional braces yourself.
|
||||||
|
|
||||||
|
Use the [full LLVM installer](http://llvm.org/builds/) to get clang-format on Windows, or use `sudo apt install clang-format` on Ubuntu.
|
||||||
|
|
||||||
|
If you run it from the command-line, pass `-style=file` as an option and it will automatically find the .clang-format configuration file in the QMK root directory.
|
||||||
|
|
||||||
|
If you use VSCode, the standard C/C++ plugin supports clang-format, alternatively there is a [separate extension](https://marketplace.visualstudio.com/items?itemName=LLVMExtensions.ClangFormat) for it.
|
||||||
|
|
||||||
|
Some things (like LAYOUT macros) are destroyed by clang-format, so either don't run it on those files, or wrap the sensitive code in `// clang-format off` and `// clang-format on`.
|
314
docs/coding_conventions_python.md
Normal file
314
docs/coding_conventions_python.md
Normal file
|
@ -0,0 +1,314 @@
|
||||||
|
# Coding Conventions (Python)
|
||||||
|
|
||||||
|
Most of our style follows PEP8 with some local modifications to make things less nit-picky.
|
||||||
|
|
||||||
|
* We target Python 3.5 for compatability with all supported platforms.
|
||||||
|
* We indent using four (4) spaces (soft tabs)
|
||||||
|
* We encourage liberal use of comments
|
||||||
|
* Think of them as a story describing the feature
|
||||||
|
* Use them liberally to explain why particular decisions were made.
|
||||||
|
* Do not write obvious comments
|
||||||
|
* If you not sure if a comment is obvious, go ahead and include it.
|
||||||
|
* We require useful docstrings for all functions.
|
||||||
|
* In general we don't wrap lines, they can be as long as needed. If you do choose to wrap lines please do not wrap any wider than 76 columns.
|
||||||
|
* Some of our practices conflict with the wider python community to make our codebase more approachable to non-pythonistas.
|
||||||
|
|
||||||
|
# YAPF
|
||||||
|
|
||||||
|
You can use [yapf](https://github.com/google/yapf) to style your code. We provide a config in [setup.cfg](setup.cfg).
|
||||||
|
|
||||||
|
# Imports
|
||||||
|
|
||||||
|
We don't have a hard and fast rule for when to use `import ...` vs `from ... import ...`. Understandability and maintainability is our ultimate goal.
|
||||||
|
|
||||||
|
Generally we prefer to import specific function and class names from a module to keep code shorter and easier to understand. Sometimes this results in a name that is ambiguous, and in such cases we prefer to import the module instead. You should avoid using the "as" keyword when importing, unless you are importing a compatability module.
|
||||||
|
|
||||||
|
Imports should be one line per module. We group import statements together using the standard python rules- system, 3rd party, local.
|
||||||
|
|
||||||
|
Do not use `from foo import *`. Supply a list of objects you want to import instead, or import the whole module.
|
||||||
|
|
||||||
|
## Import Examples
|
||||||
|
|
||||||
|
Good:
|
||||||
|
|
||||||
|
```
|
||||||
|
from qmk import effects
|
||||||
|
|
||||||
|
effects.echo()
|
||||||
|
```
|
||||||
|
|
||||||
|
Bad:
|
||||||
|
|
||||||
|
```
|
||||||
|
from qmk.effects import echo
|
||||||
|
|
||||||
|
echo() # It's unclear where echo comes from
|
||||||
|
```
|
||||||
|
|
||||||
|
Good:
|
||||||
|
|
||||||
|
```
|
||||||
|
from qmk.keymap import compile_firmware
|
||||||
|
|
||||||
|
compile_firmware()
|
||||||
|
```
|
||||||
|
|
||||||
|
OK, but the above is better:
|
||||||
|
|
||||||
|
```
|
||||||
|
import qmk.keymap
|
||||||
|
|
||||||
|
qmk.keymap.compile_firmware()
|
||||||
|
```
|
||||||
|
|
||||||
|
# Statements
|
||||||
|
|
||||||
|
One statement per line.
|
||||||
|
|
||||||
|
Even when allowed (EG `if foo: bar`) we do not combine 2 statements onto a single line.
|
||||||
|
|
||||||
|
# Naming
|
||||||
|
|
||||||
|
`module_name`, `package_name`, `ClassName`, `method_name`, `ExceptionName`, `function_name`, `GLOBAL_CONSTANT_NAME`, `global_var_name`, `instance_var_name`, `function_parameter_name`, `local_var_name`.
|
||||||
|
|
||||||
|
Function names, variable names, and filenames should be descriptive; eschew abbreviation. In particular, do not use abbreviations that are ambiguous or unfamiliar to readers outside your project, and do not abbreviate by deleting letters within a word.
|
||||||
|
|
||||||
|
Always use a .py filename extension. Never use dashes.
|
||||||
|
|
||||||
|
## Names to Avoid
|
||||||
|
|
||||||
|
* single character names except for counters or iterators. You may use `e` as an exception identifier in try/except statements.
|
||||||
|
* dashes (`-`) in any package/module name
|
||||||
|
* `__double_leading_and_trailing_underscore__` names (reserved by Python)
|
||||||
|
|
||||||
|
# Docstrings
|
||||||
|
|
||||||
|
To maintain consistency with our docstrings we've set out the following guidelines.
|
||||||
|
|
||||||
|
* Use markdown formatting
|
||||||
|
* Always use triple-dquote docstrings with at least one linebreak: `"""\n"""`
|
||||||
|
* First line is a short (< 70 char) description of what the function does
|
||||||
|
* If you need more in your docstring leave a blank line between the description and the rest.
|
||||||
|
* Start indented lines at the same indent level as the opening triple-dquote
|
||||||
|
* Document all function arguments using the format described below
|
||||||
|
* If present, Args:, Returns:, and Raises: should be the last three things in the docstring, separated by a blank line each.
|
||||||
|
|
||||||
|
## Simple docstring example
|
||||||
|
|
||||||
|
```
|
||||||
|
def my_awesome_function():
|
||||||
|
"""Return the number of seconds since 1970 Jan 1 00:00 UTC.
|
||||||
|
"""
|
||||||
|
return int(time.time())
|
||||||
|
```
|
||||||
|
|
||||||
|
## Complex docstring example
|
||||||
|
|
||||||
|
```
|
||||||
|
def my_awesome_function():
|
||||||
|
"""Return the number of seconds since 1970 Jan 1 00:00 UTC.
|
||||||
|
|
||||||
|
This function always returns an integer number of seconds.
|
||||||
|
"""
|
||||||
|
return int(time.time())
|
||||||
|
```
|
||||||
|
|
||||||
|
## Function arguments docstring example
|
||||||
|
|
||||||
|
```
|
||||||
|
def my_awesome_function(start=None, offset=0):
|
||||||
|
"""Return the number of seconds since 1970 Jan 1 00:00 UTC.
|
||||||
|
|
||||||
|
This function always returns an integer number of seconds.
|
||||||
|
|
||||||
|
|
||||||
|
Args:
|
||||||
|
start
|
||||||
|
The time to start at instead of 1970 Jan 1 00:00 UTC
|
||||||
|
|
||||||
|
offset
|
||||||
|
Return an answer that has this number of seconds subtracted first
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
An integer describing a number of seconds.
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
ValueError
|
||||||
|
When `start` or `offset` are not positive numbers
|
||||||
|
"""
|
||||||
|
if start < 0 or offset < 0:
|
||||||
|
raise ValueError('start and offset must be positive numbers.')
|
||||||
|
|
||||||
|
if not start:
|
||||||
|
start = time.time()
|
||||||
|
|
||||||
|
return int(start - offset)
|
||||||
|
```
|
||||||
|
|
||||||
|
# Exceptions
|
||||||
|
|
||||||
|
Exceptions are used to handle exceptional situations. They should not be used for flow control. This is a break from the python norm of "ask for forgiveness." If you are catching an exception it should be to handle a situation that is unusual.
|
||||||
|
|
||||||
|
If you use a catch-all exception for any reason you must log the exception and stacktrace using cli.log.
|
||||||
|
|
||||||
|
Make your try/except blocks as short as possible. If you need a lot of try statements you may need to restructure your code.
|
||||||
|
|
||||||
|
# Tuples
|
||||||
|
|
||||||
|
When defining one-item tuples always include a trailing comma so that it is obvious you are using a tuple. Do not rely on implicit one-item tuple unpacking. Better still use a list which is unambiguous.
|
||||||
|
|
||||||
|
This is particularly important when using the printf-style format strings that are commonly used.
|
||||||
|
|
||||||
|
# Lists and Dictionaries
|
||||||
|
|
||||||
|
We have configured YAPF to differentiate between sequence styles with a trailing comma. When a trailing comma is omitted YAPF will format the sequence as a single line. When a trailing comma is included YAPF will format the sequence with one item per line.
|
||||||
|
|
||||||
|
You should generally prefer to keep short definition on a single line. Break out to multiple lines sooner rather than later to aid readability and maintainability.
|
||||||
|
|
||||||
|
# Parentheses
|
||||||
|
|
||||||
|
Avoid excessive parentheses, but do use parentheses to make code easier to understand. Do not use them in return statements unless you are explicitly returning a tuple, or it is part of a math expression.
|
||||||
|
|
||||||
|
# Format Strings
|
||||||
|
|
||||||
|
We generally prefer printf-style format strings. Example:
|
||||||
|
|
||||||
|
```
|
||||||
|
name = 'World'
|
||||||
|
print('Hello, %s!' % (name,))
|
||||||
|
```
|
||||||
|
|
||||||
|
This style is used by the logging module, which we make use of extensively, and we have adopted it in other places for consistency. It is also more familiar to C programmers, who are a big part of our casual audience.
|
||||||
|
|
||||||
|
Our included CLI module has support for using these without using the percent (%) operator. Look at `cli.echo()` and the various `cli.log` functions (EG, `cli.log.info()`) for more details.
|
||||||
|
|
||||||
|
# Comprehensions & Generator Expressions
|
||||||
|
|
||||||
|
We encourage the liberal use of comprehensions and generators, but do not let them get too complex. If you need complexity fall back to a for loop that is easier to understand.
|
||||||
|
|
||||||
|
# Lambdas
|
||||||
|
|
||||||
|
OK to use but probably should be avoided. With comprehensions and generators the need for lambdas is not as strong as it once was.
|
||||||
|
|
||||||
|
# Conditional Expressions
|
||||||
|
|
||||||
|
OK in variable assignment, but otherwise should be avoided.
|
||||||
|
|
||||||
|
Conditional expressions are if statements that are in line with code. For example:
|
||||||
|
|
||||||
|
```
|
||||||
|
x = 1 if cond else 2
|
||||||
|
```
|
||||||
|
|
||||||
|
It's generally not a good idea to use these as function arguments, sequence items, etc. It's too easy to overlook.
|
||||||
|
|
||||||
|
# Default Argument Values
|
||||||
|
|
||||||
|
Encouraged, but values must be immutable objects.
|
||||||
|
|
||||||
|
When specifying default values in argument lists always be careful to specify objects that can't be modified in place. If you use a mutable object the changes you make will persist between calls, which is usually not what you want. Even if that is what you intend to do it is confusing for others and will hinder understanding.
|
||||||
|
|
||||||
|
Bad:
|
||||||
|
|
||||||
|
```
|
||||||
|
def my_func(foo={}):
|
||||||
|
pass
|
||||||
|
```
|
||||||
|
|
||||||
|
Good:
|
||||||
|
|
||||||
|
```
|
||||||
|
def my_func(foo=None):
|
||||||
|
if not foo:
|
||||||
|
foo = {}
|
||||||
|
```
|
||||||
|
|
||||||
|
# Properties
|
||||||
|
|
||||||
|
Always use properties instead of getter and setter functions.
|
||||||
|
|
||||||
|
```
|
||||||
|
class Foo(object):
|
||||||
|
def __init__(self):
|
||||||
|
self._bar = None
|
||||||
|
|
||||||
|
@property
|
||||||
|
def bar(self):
|
||||||
|
return self._bar
|
||||||
|
|
||||||
|
@bar.setter
|
||||||
|
def bar(self, bar):
|
||||||
|
self._bar = bar
|
||||||
|
```
|
||||||
|
|
||||||
|
# True/False Evaluations
|
||||||
|
|
||||||
|
You should generally prefer the implicit True/False evaluation in if statements, rather than checking equivalency.
|
||||||
|
|
||||||
|
Bad:
|
||||||
|
|
||||||
|
```
|
||||||
|
if foo == True:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if bar == False:
|
||||||
|
pass
|
||||||
|
```
|
||||||
|
|
||||||
|
Good:
|
||||||
|
|
||||||
|
```
|
||||||
|
if foo:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if not bar:
|
||||||
|
pass
|
||||||
|
```
|
||||||
|
|
||||||
|
# Decorators
|
||||||
|
|
||||||
|
Use when appropriate. Try to avoid too much magic unless it helps with understanding.
|
||||||
|
|
||||||
|
# Threading and Multiprocessing
|
||||||
|
|
||||||
|
Should be avoided. If you need this you will have to make a strong case before we merge your code.
|
||||||
|
|
||||||
|
# Power Features
|
||||||
|
|
||||||
|
Python is an extremely flexible language and gives you many fancy features such as custom metaclasses, access to bytecode, on-the-fly compilation, dynamic inheritance, object reparenting, import hacks, reflection, modification of system internals, etc.
|
||||||
|
|
||||||
|
Don't use these.
|
||||||
|
|
||||||
|
Performance is not a critical concern for us, and code understandability is. We want our codebase to be approachable by someone who only has a day or two to play with it. These features generally come with a cost to easy understanding, and we would prefer to have code that can be readily understood over faster or more compact code.
|
||||||
|
|
||||||
|
Note that some standard library modules use these techniques and it is ok to make use of those modules. But please keep readability and understandability in mind when using them.
|
||||||
|
|
||||||
|
# Type Annotated Code
|
||||||
|
|
||||||
|
For now we are not using any type annotation system, and would prefer that code remain unannotated. We may revisit this in the future.
|
||||||
|
|
||||||
|
# Function length
|
||||||
|
|
||||||
|
Prefer small and focused functions.
|
||||||
|
|
||||||
|
We recognize that long functions are sometimes appropriate, so no hard limit is placed on function length. If a function exceeds about 40 lines, think about whether it can be broken up without harming the structure of the program.
|
||||||
|
|
||||||
|
Even if your long function works perfectly now, someone modifying it in a few months may add new behavior. This could result in bugs that are hard to find. Keeping your functions short and simple makes it easier for other people to read and modify your code.
|
||||||
|
|
||||||
|
You could find long and complicated functions when working with some code. Do not be intimidated by modifying existing code: if working with such a function proves to be difficult, you find that errors are hard to debug, or you want to use a piece of it in several different contexts, consider breaking up the function into smaller and more manageable pieces.
|
||||||
|
|
||||||
|
# FIXMEs
|
||||||
|
|
||||||
|
It is OK to leave FIXMEs in code. Why? Encouraging people to at least document parts of code that need to be thought out more (or that are confusing) is better than leaving this code undocumented.
|
||||||
|
|
||||||
|
All FIXMEs should be formatted like:
|
||||||
|
|
||||||
|
```
|
||||||
|
FIXME(username): Revisit this code when the frob feature is done.
|
||||||
|
```
|
||||||
|
|
||||||
|
...where username is your GitHub username.
|
||||||
|
|
||||||
|
# Unit Tests
|
||||||
|
|
||||||
|
These are good. We should have some one day.
|
|
@ -1,25 +1,36 @@
|
||||||
# Atmel AVR
|
# Compatible Microcontrollers
|
||||||
|
|
||||||
QMK should run on any Atmel AVR processor with enough Flash. It has been tested on the following:
|
QMK runs on any USB-capable AVR or ARM microcontroller with enough flash space - generally 32kB or more, though it will *just* squeeze into 16kB with most features disabled.
|
||||||
|
|
||||||
* ATmega32U4 ([PJRC Teensy 2.0](http://www.pjrc.com/teensy/))
|
## Atmel AVR
|
||||||
* AT90USB1286 ([PJRC Teensy++ 2.0](http://www.pjrc.com/teensy/))
|
|
||||||
* AT90USB1287 ([Atmel USBKEY](http://www.atmel.com/tools/AT90USBKEY.aspx))
|
|
||||||
* ATmega168P with using [V-USB](http://www.obdev.at/products/vusb/index.html)
|
|
||||||
* ATmega328P with using [V-USB](http://www.obdev.at/products/vusb/index.html)
|
|
||||||
* ATmega32U2
|
|
||||||
* AT90USB1286, 646, 647 should work
|
|
||||||
* AT90USB162 testing...
|
|
||||||
|
|
||||||
NOTE: To enable full features of firmware you'll need 32KB flash size.
|
The following use [LUFA](https://www.fourwalledcubicle.com/LUFA.php) as the USB stack:
|
||||||
|
|
||||||
Please add any tested microcontrollers to this list.
|
* [ATmega16U2](https://www.microchip.com/wwwproducts/en/ATmega16U2) / [ATmega32U2](https://www.microchip.com/wwwproducts/en/ATmega32U2)
|
||||||
|
* [ATmega16U4](https://www.microchip.com/wwwproducts/en/ATmega16U4) / [ATmega32U4](https://www.microchip.com/wwwproducts/en/ATmega32U4)
|
||||||
|
* [AT90USB64](https://www.microchip.com/wwwproducts/en/AT90USB646) / [AT90USB128](https://www.microchip.com/wwwproducts/en/AT90USB1286)
|
||||||
|
|
||||||
# ARM
|
Certain MCUs which do not have native USB will use [V-USB](https://www.obdev.at/products/vusb/index.html) instead:
|
||||||
|
|
||||||
You can also use any ARM processor that [ChibiOS](http://www.chibios.org) supports. The following processors have been tested:
|
* [ATmega32A](https://www.microchip.com/wwwproducts/en/ATmega32A)
|
||||||
|
* [ATmega328P](https://www.microchip.com/wwwproducts/en/ATmega328P)
|
||||||
|
|
||||||
* [Kinetis MKL26Z64](http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/kinetis-cortex-m-mcus/l-series-ultra-low-power-m0-plus/kinetis-kl2x-48-mhz-usb-ultra-low-power-microcontrollers-mcus-based-on-arm-cortex-m0-plus-core:KL2x)
|
## ARM
|
||||||
* [Kinetis MK20DX128](http://www.nxp.com/assets/documents/data/en/data-sheets/K20P64M50SF0.pdf)
|
|
||||||
* [Kinetis MK20DX128](http://www.nxp.com/assets/documents/data/en/data-sheets/K20P64M50SF0.pdf)
|
You can also use any ARM chip with USB that [ChibiOS](http://www.chibios.org) supports. Most have plenty of flash. Known to work are:
|
||||||
* [Kinetis MK20DX256](http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/kinetis-cortex-m-mcus/k-series-performance-m4/k2x-usb/kinetis-k20-72-mhz-full-speed-usb-mixed-signal-integration-microcontrollers-mcus-based-on-arm-cortex-m4-core:K20_72)
|
|
||||||
|
### STMicroelectronics (STM32)
|
||||||
|
|
||||||
|
* [STM32F0x2](https://www.st.com/en/microcontrollers-microprocessors/stm32f0x2.html)
|
||||||
|
* [STM32F103](https://www.st.com/en/microcontrollers-microprocessors/stm32f103.html)
|
||||||
|
* [STM32F303](https://www.st.com/en/microcontrollers-microprocessors/stm32f303.html)
|
||||||
|
|
||||||
|
### NXP (Kinetis)
|
||||||
|
|
||||||
|
* [MKL26Z64](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/kl-series-cortex-m0-plus/kinetis-kl2x-72-96-mhz-usb-ultra-low-power-microcontrollers-mcus-based-on-arm-cortex-m0-plus-core:KL2x)
|
||||||
|
* [MK20DX128](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/k-series-cortex-m4/k2x-usb/kinetis-k20-50-mhz-full-speed-usb-mixed-signal-integration-microcontrollers-based-on-arm-cortex-m4-core:K20_50)
|
||||||
|
* [MK20DX256](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/k-series-cortex-m4/k2x-usb/kinetis-k20-72-mhz-full-speed-usb-mixed-signal-integration-microcontrollers-mcus-based-on-arm-cortex-m4-core:K20_72)
|
||||||
|
|
||||||
|
## Atmel ATSAM
|
||||||
|
|
||||||
|
There is limited support for one of Atmel's ATSAM microcontrollers, that being the [ATSAMD51J18A](https://www.microchip.com/wwwproducts/en/ATSAMD51J18A) used by the [Massdrop keyboards](https://github.com/qmk/qmk_firmware/tree/master/keyboards/massdrop).
|
||||||
|
|
|
@ -76,7 +76,7 @@ This is a C header file that is one of the first things included, and will persi
|
||||||
* `#define B7_AUDIO`
|
* `#define B7_AUDIO`
|
||||||
* enables audio on pin B7 (duophony is enables if one of B[5-7]\_AUDIO is enabled along with one of C[4-6]\_AUDIO)
|
* enables audio on pin B7 (duophony is enables if one of B[5-7]\_AUDIO is enabled along with one of C[4-6]\_AUDIO)
|
||||||
* `#define BACKLIGHT_PIN B7`
|
* `#define BACKLIGHT_PIN B7`
|
||||||
* pin of the backlight - `B5`, `B6`, `B7` and `C6` (and `D4` on ATmega32A) use hardware PWM, others use software implementation
|
* pin of the backlight
|
||||||
* `#define BACKLIGHT_LEVELS 3`
|
* `#define BACKLIGHT_LEVELS 3`
|
||||||
* number of levels your backlight will have (maximum 15 excluding off)
|
* number of levels your backlight will have (maximum 15 excluding off)
|
||||||
* `#define BACKLIGHT_BREATHING`
|
* `#define BACKLIGHT_BREATHING`
|
||||||
|
@ -89,10 +89,12 @@ This is a C header file that is one of the first things included, and will persi
|
||||||
* mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap
|
* mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap
|
||||||
* `#define LOCKING_RESYNC_ENABLE`
|
* `#define LOCKING_RESYNC_ENABLE`
|
||||||
* tries to keep switch state consistent with keyboard LED state
|
* tries to keep switch state consistent with keyboard LED state
|
||||||
* `#define IS_COMMAND() (get_mods() == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)))`
|
* `#define IS_COMMAND() (get_mods() == MOD_MASK_SHIFT)`
|
||||||
* key combination that allows the use of magic commands (useful for debugging)
|
* key combination that allows the use of magic commands (useful for debugging)
|
||||||
* `#define USB_MAX_POWER_CONSUMPTION`
|
* `#define USB_MAX_POWER_CONSUMPTION 500`
|
||||||
* sets the maximum power (in mA) over USB for the device (default: 500)
|
* sets the maximum power (in mA) over USB for the device (default: 500)
|
||||||
|
* `#define USB_POLLING_INTERVAL_MS 10`
|
||||||
|
* sets the USB polling rate in milliseconds for the keyboard, mouse, and shared (NKRO/media keys) interfaces
|
||||||
* `#define F_SCL 100000L`
|
* `#define F_SCL 100000L`
|
||||||
* sets the I2C clock rate speed for keyboards using I2C. The default is `400000L`, except for keyboards using `split_common`, where the default is `100000L`.
|
* sets the I2C clock rate speed for keyboards using I2C. The default is `400000L`, except for keyboards using `split_common`, where the default is `100000L`.
|
||||||
|
|
||||||
|
@ -171,8 +173,8 @@ If you define these options you will enable the associated feature, which may in
|
||||||
* how long for the Combo keys to be detected. Defaults to `TAPPING_TERM` if not defined.
|
* how long for the Combo keys to be detected. Defaults to `TAPPING_TERM` if not defined.
|
||||||
* `#define TAP_CODE_DELAY 100`
|
* `#define TAP_CODE_DELAY 100`
|
||||||
* Sets the delay between `register_code` and `unregister_code`, if you're having issues with it registering properly (common on VUSB boards). The value is in milliseconds.
|
* Sets the delay between `register_code` and `unregister_code`, if you're having issues with it registering properly (common on VUSB boards). The value is in milliseconds.
|
||||||
* `#define TAP_HOLD_CAPS_DELAY 200`
|
* `#define TAP_HOLD_CAPS_DELAY 80`
|
||||||
* Sets the delay for Tap Hold keys (`LT`, `MT`) when using `KC_CAPSLOCK` keycode, as this has some special handling on MacOS. The value is in milliseconds, and defaults to 200ms if not defined.
|
* Sets the delay for Tap Hold keys (`LT`, `MT`) when using `KC_CAPSLOCK` keycode, as this has some special handling on MacOS. The value is in milliseconds, and defaults to 80 ms if not defined. For macOS, you may want to set this to 200 or higher.
|
||||||
|
|
||||||
## RGB Light Configuration
|
## RGB Light Configuration
|
||||||
|
|
||||||
|
@ -194,8 +196,8 @@ If you define these options you will enable the associated feature, which may in
|
||||||
* units to step when in/decreasing saturation
|
* units to step when in/decreasing saturation
|
||||||
* `#define RGBLIGHT_VAL_STEP 12`
|
* `#define RGBLIGHT_VAL_STEP 12`
|
||||||
* units to step when in/decreasing value (brightness)
|
* units to step when in/decreasing value (brightness)
|
||||||
* `#define RGBW_BB_TWI`
|
* `#define RGBW`
|
||||||
* bit-bangs TWI to EZ RGBW LEDs (only required for Ergodox EZ)
|
* Enables RGBW LED support
|
||||||
|
|
||||||
## Mouse Key Options
|
## Mouse Key Options
|
||||||
|
|
||||||
|
@ -222,6 +224,7 @@ There are a few different ways to set handedness for split keyboards (listed in
|
||||||
2. Set `EE_HANDS` and flash `eeprom-lefthand.eep`/`eeprom-righthand.eep` to each half
|
2. Set `EE_HANDS` and flash `eeprom-lefthand.eep`/`eeprom-righthand.eep` to each half
|
||||||
* For boards with DFU bootloader you can use `:dfu-split-left`/`:dfu-split-right` to flash these EEPROM files
|
* For boards with DFU bootloader you can use `:dfu-split-left`/`:dfu-split-right` to flash these EEPROM files
|
||||||
* For boards with Caterina bootloader (like stock Pro Micros), use `:avrdude-split-left`/`:avrdude-split-right`
|
* For boards with Caterina bootloader (like stock Pro Micros), use `:avrdude-split-left`/`:avrdude-split-right`
|
||||||
|
* For boards with ARM DFU bootloader (like Proton C), use `:dfu-util-split-left`/`:dfu-util-split-right`
|
||||||
3. Set `MASTER_RIGHT`: Half that is plugged into the USB port is determined to be the master and right half (inverse of the default)
|
3. Set `MASTER_RIGHT`: Half that is plugged into the USB port is determined to be the master and right half (inverse of the default)
|
||||||
4. Default: The side that is plugged into the USB port is the master half and is assumed to be the left half. The slave side is the right half
|
4. Default: The side that is plugged into the USB port is the master half and is assumed to be the left half. The slave side is the right half
|
||||||
|
|
||||||
|
@ -248,6 +251,9 @@ There are a few different ways to set handedness for split keyboards (listed in
|
||||||
* `#define MATRIX_COL_PINS_RIGHT { <col pins> }`
|
* `#define MATRIX_COL_PINS_RIGHT { <col pins> }`
|
||||||
* If you want to specify a different pinout for the right half than the left half, you can define `MATRIX_ROW_PINS_RIGHT`/`MATRIX_COL_PINS_RIGHT`. Currently, the size of `MATRIX_ROW_PINS` must be the same as `MATRIX_ROW_PINS_RIGHT` and likewise for the definition of columns.
|
* If you want to specify a different pinout for the right half than the left half, you can define `MATRIX_ROW_PINS_RIGHT`/`MATRIX_COL_PINS_RIGHT`. Currently, the size of `MATRIX_ROW_PINS` must be the same as `MATRIX_ROW_PINS_RIGHT` and likewise for the definition of columns.
|
||||||
|
|
||||||
|
* `#define DIRECT_PINS_RIGHT { { F1, F0, B0, C7 }, { F4, F5, F6, F7 } }`
|
||||||
|
* If you want to specify a different direct pinout for the right half than the left half, you can define `DIRECT_PINS_RIGHT`. Currently, the size of `DIRECT_PINS` must be the same as `DIRECT_PINS_RIGHT`.
|
||||||
|
|
||||||
* `#define RGBLED_SPLIT { 6, 6 }`
|
* `#define RGBLED_SPLIT { 6, 6 }`
|
||||||
* See [RGB Light Configuration](#rgb-light-configuration)
|
* See [RGB Light Configuration](#rgb-light-configuration)
|
||||||
|
|
||||||
|
@ -261,6 +267,14 @@ There are a few different ways to set handedness for split keyboards (listed in
|
||||||
* 4: about 26kbps
|
* 4: about 26kbps
|
||||||
* 5: about 20kbps
|
* 5: about 20kbps
|
||||||
|
|
||||||
|
* `#define SPLIT_USB_DETECT`
|
||||||
|
* Detect (with timeout) USB connection when delegating master/slave
|
||||||
|
* Default behavior for ARM
|
||||||
|
* Required for AVR Teensy
|
||||||
|
|
||||||
|
* `#define SPLIT_USB_TIMEOUT 2500`
|
||||||
|
* Maximum timeout when detecting master/slave when using `SPLIT_USB_DETECT`
|
||||||
|
|
||||||
# The `rules.mk` File
|
# The `rules.mk` File
|
||||||
|
|
||||||
This is a [make](https://www.gnu.org/software/make/manual/make.html) file that is included by the top-level `Makefile`. It is used to set some information about the MCU that we will be compiling for as well as enabling and disabling certain features.
|
This is a [make](https://www.gnu.org/software/make/manual/make.html) file that is included by the top-level `Makefile`. It is used to set some information about the MCU that we will be compiling for as well as enabling and disabling certain features.
|
||||||
|
@ -289,19 +303,20 @@ This is a [make](https://www.gnu.org/software/make/manual/make.html) file that i
|
||||||
* `halfkay`
|
* `halfkay`
|
||||||
* `caterina`
|
* `caterina`
|
||||||
* `bootloadHID`
|
* `bootloadHID`
|
||||||
|
* `USBasp`
|
||||||
|
|
||||||
## Feature Options
|
## Feature Options
|
||||||
|
|
||||||
Use these to enable or disable building certain features. The more you have enabled the bigger your firmware will be, and you run the risk of building a firmware too large for your MCU.
|
Use these to enable or disable building certain features. The more you have enabled the bigger your firmware will be, and you run the risk of building a firmware too large for your MCU.
|
||||||
|
|
||||||
* `BOOTMAGIC_ENABLE`
|
* `BOOTMAGIC_ENABLE`
|
||||||
* Virtual DIP switch configuration(+1000)
|
* Virtual DIP switch configuration
|
||||||
* `MOUSEKEY_ENABLE`
|
* `MOUSEKEY_ENABLE`
|
||||||
* Mouse keys(+4700)
|
* Mouse keys
|
||||||
* `EXTRAKEY_ENABLE`
|
* `EXTRAKEY_ENABLE`
|
||||||
* Audio control and System control(+450)
|
* Audio control and System control
|
||||||
* `CONSOLE_ENABLE`
|
* `CONSOLE_ENABLE`
|
||||||
* Console for debug(+400)
|
* Console for debug
|
||||||
* `COMMAND_ENABLE`
|
* `COMMAND_ENABLE`
|
||||||
* Commands for debug and configuration
|
* Commands for debug and configuration
|
||||||
* `COMBO_ENABLE`
|
* `COMBO_ENABLE`
|
||||||
|
@ -333,7 +348,8 @@ Use these to enable or disable building certain features. The more you have enab
|
||||||
* `NO_USB_STARTUP_CHECK`
|
* `NO_USB_STARTUP_CHECK`
|
||||||
* Disables usb suspend check after keyboard startup. Usually the keyboard waits for the host to wake it up before any tasks are performed. This is useful for split keyboards as one half will not get a wakeup call but must send commands to the master.
|
* Disables usb suspend check after keyboard startup. Usually the keyboard waits for the host to wake it up before any tasks are performed. This is useful for split keyboards as one half will not get a wakeup call but must send commands to the master.
|
||||||
* `LINK_TIME_OPTIMIZATION_ENABLE`
|
* `LINK_TIME_OPTIMIZATION_ENABLE`
|
||||||
= Enables Link Time Optimization (`LTO`) when compiling the keyboard. This makes the process take longer, but can significantly reduce the compiled size (and since the firmware is small, the added time is not noticable). However, this will automatically disable the old Macros and Functions features automatically, as these break when `LTO` is enabled. It does this by automatically defining `NO_ACTION_MACRO` and `NO_ACTION_FUNCTION`
|
* Enables Link Time Optimization (`LTO`) when compiling the keyboard. This makes the process take longer, but can significantly reduce the compiled size (and since the firmware is small, the added time is not noticeable). However, this will automatically disable the old Macros and Functions features automatically, as these break when `LTO` is enabled. It does this by automatically defining `NO_ACTION_MACRO` and `NO_ACTION_FUNCTION`
|
||||||
|
* Alternatively, you can use `LTO_ENABLE` instead of `LINK_TIME_OPTIMIZATION_ENABLE`.
|
||||||
|
|
||||||
## USB Endpoint Limitations
|
## USB Endpoint Limitations
|
||||||
|
|
||||||
|
|
|
@ -54,72 +54,20 @@ Never made an open source contribution before? Wondering how contributions work
|
||||||
|
|
||||||
# Coding Conventions
|
# Coding Conventions
|
||||||
|
|
||||||
Most of our style is pretty easy to pick up on, but right now it's not entirely consistent. You should match the style of the code surrounding your change, but if that code is inconsistent or unclear use the following guidelines:
|
Most of our style is pretty easy to pick up on. If you are familiar with either C or Python you should not have too much trouble with our local styles.
|
||||||
|
|
||||||
* We indent using four (4) spaces (soft tabs)
|
* [Coding Conventions - C](coding_conventions_c.md)
|
||||||
* We use a modified One True Brace Style
|
* [Coding Conventions - Python](coding_conventions_python.md)
|
||||||
* Opening Brace: At the end of the same line as the statement that opens the block
|
|
||||||
* Closing Brace: Lined up with the first character of the statement that opens the block
|
|
||||||
* Else If: Place the closing brace at the beginning of the line and the next opening brace at the end of the same line.
|
|
||||||
* Optional Braces: Always include optional braces.
|
|
||||||
* Good: if (condition) { return false; }
|
|
||||||
* Bad: if (condition) return false;
|
|
||||||
* We encourage use of C style comments: `/* */`
|
|
||||||
* Think of them as a story describing the feature
|
|
||||||
* Use them liberally to explain why particular decisions were made.
|
|
||||||
* Do not write obvious comments
|
|
||||||
* If you not sure if a comment is obvious, go ahead and include it.
|
|
||||||
* In general we don't wrap lines, they can be as long as needed. If you do choose to wrap lines please do not wrap any wider than 76 columns.
|
|
||||||
* We use `#pragma once` at the start of header files rather than old-style include guards (`#ifndef THIS_FILE_H`, `#define THIS_FILE_H`, ..., `#endif`)
|
|
||||||
* We accept both forms of preprocessor if's: `#ifdef DEFINED` and `#if defined(DEFINED)`
|
|
||||||
* If you are not sure which to prefer use the `#if defined(DEFINED)` form.
|
|
||||||
* Do not change existing code from one style to the other, except when moving to a multiple condition `#if`.
|
|
||||||
* Do not put whitespace between `#` and `if`.
|
|
||||||
* When deciding how (or if) to indent directives keep these points in mind:
|
|
||||||
* Readability is more important than consistency.
|
|
||||||
* Follow the file's existing style. If the file is mixed follow the style that makes sense for the section you are modifying.
|
|
||||||
* When choosing to indent you can follow the indention level of the surrounding C code, or preprocessor directives can have their own indent level. Choose the style that best communicates the intent of your code.
|
|
||||||
|
|
||||||
Here is an example for easy reference:
|
|
||||||
|
|
||||||
```c
|
|
||||||
/* Enums for foo */
|
|
||||||
enum foo_state {
|
|
||||||
FOO_BAR,
|
|
||||||
FOO_BAZ,
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Returns a value */
|
|
||||||
int foo(void) {
|
|
||||||
if (some_condition) {
|
|
||||||
return FOO_BAR;
|
|
||||||
} else {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
# Auto-formatting with clang-format
|
|
||||||
|
|
||||||
[Clang-format](https://clang.llvm.org/docs/ClangFormat.html) is part of LLVM and can automatically format your code for you, because ain't nobody got time to do it manually. We supply a configuration file for it that applies most of the coding conventions listed above. It will only change whitespace and newlines, so you will still have to remember to include optional braces yourself.
|
|
||||||
|
|
||||||
Use the [full LLVM installer](http://llvm.org/builds/) to get clang-format on Windows, or use `sudo apt install clang-format` on Ubuntu.
|
|
||||||
|
|
||||||
If you run it from the command-line, pass `-style=file` as an option and it will automatically find the .clang-format configuration file in the QMK root directory.
|
|
||||||
|
|
||||||
If you use VSCode, the standard C/C++ plugin supports clang-format, alternatively there is a [separate extension](https://marketplace.visualstudio.com/items?itemName=LLVMExtensions.ClangFormat) for it.
|
|
||||||
|
|
||||||
Some things (like LAYOUT macros) are destroyed by clang-format, so either don't run it on those files, or wrap the sensitive code in `// clang-format off` and `// clang-format on`.
|
|
||||||
|
|
||||||
# General Guidelines
|
# General Guidelines
|
||||||
|
|
||||||
We have a few different types of changes in QMK, each requiring a different level of rigor. We'd like you to keep the following guidelines in mind no matter what type of change you're making.
|
We have a few different types of changes in QMK, each requiring a different level of rigor. We'd like you to keep the following guidelines in mind no matter what type of change you're making.
|
||||||
|
|
||||||
* Separate PR's into logical units. For example, do not submit one PR covering two separate features, instead submit a separate PR for each feature.
|
* Separate PRs into logical units. For example, do not submit one PR covering two separate features, instead submit a separate PR for each feature.
|
||||||
* Check for unnecessary whitespace with `git diff --check` before committing.
|
* Check for unnecessary whitespace with `git diff --check` before committing.
|
||||||
* Make sure your code change actually compiles.
|
* Make sure your code change actually compiles.
|
||||||
* Keymaps: Make sure that `make keyboard:your_new_keymap` does not return an error
|
* Keymaps: Make sure that `make keyboard:your_new_keymap` does not return any errors.
|
||||||
* Keyboards: Make sure that `make keyboard:all` does not return any errors
|
* Keyboards: Make sure that `make keyboard:all` does not return any errors.
|
||||||
* Core: Make sure that `make all` does not return any errors.
|
* Core: Make sure that `make all` does not return any errors.
|
||||||
* Make sure commit messages are understandable on their own. You should put a short description (no more than 70 characters) on the first line, the second line should be empty, and on the 3rd and later lines you should describe your commit in detail, if required. Example:
|
* Make sure commit messages are understandable on their own. You should put a short description (no more than 70 characters) on the first line, the second line should be empty, and on the 3rd and later lines you should describe your commit in detail, if required. Example:
|
||||||
|
|
||||||
|
@ -131,6 +79,8 @@ The kerpleplork was intermittently failing with error code 23. The root cause wa
|
||||||
Limited experimentation on the devices I have available shows that 7 is high enough to avoid confusing the kerpleplork, but I'd like to get some feedback from people with ARM devices to be sure.
|
Limited experimentation on the devices I have available shows that 7 is high enough to avoid confusing the kerpleplork, but I'd like to get some feedback from people with ARM devices to be sure.
|
||||||
```
|
```
|
||||||
|
|
||||||
|
!> **IMPORTANT:** If you would like to contribute a bugfix or improvement to user code, such as non-default keymaps, userspace and layouts, be sure to tag the original submitter of the code in your PR. Many users, regardless of skill level with Git and GitHub, may be confused or frustrated at their code being modified without their knowledge.
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
Documentation is one of the easiest ways to get started contributing to QMK. Finding places where the documentation is wrong or incomplete and fixing those is easy! We also very badly need someone to edit our documentation, so if you have editing skills but aren't sure where or how to jump in please [reach out for help](#where-can-i-go-for-help)!
|
Documentation is one of the easiest ways to get started contributing to QMK. Finding places where the documentation is wrong or incomplete and fixing those is easy! We also very badly need someone to edit our documentation, so if you have editing skills but aren't sure where or how to jump in please [reach out for help](#where-can-i-go-for-help)!
|
||||||
|
|
|
@ -90,68 +90,110 @@ keyrecord_t record {
|
||||||
|
|
||||||
# LED Control
|
# LED Control
|
||||||
|
|
||||||
QMK provides methods to read the 5 LEDs defined as part of the HID spec:
|
QMK provides methods to read 5 of the LEDs defined in the HID spec:
|
||||||
|
|
||||||
* `USB_LED_NUM_LOCK`
|
* Num Lock
|
||||||
* `USB_LED_CAPS_LOCK`
|
* Caps Lock
|
||||||
* `USB_LED_SCROLL_LOCK`
|
* Scroll Lock
|
||||||
* `USB_LED_COMPOSE`
|
* Compose
|
||||||
* `USB_LED_KANA`
|
* Kana
|
||||||
|
|
||||||
These five constants correspond to the positional bits of the host LED state.
|
There are two ways to get the lock LED state:
|
||||||
There are two ways to get the host LED state:
|
|
||||||
|
|
||||||
* by implementing `led_set_user()`
|
* by implementing `bool led_update_kb(led_t led_state)` or `_user(led_t led_state)`; or
|
||||||
* by calling `host_keyboard_leds()`
|
* by calling `led_t host_keyboard_led_state()`
|
||||||
|
|
||||||
## `led_set_user()`
|
!> `host_keyboard_led_state()` may already reflect a new value before `led_update_user()` is called.
|
||||||
|
|
||||||
This function will be called when the state of one of those 5 LEDs changes. It receives the LED state as a parameter.
|
Two more deprecated functions exist that provide the LED state as a `uint8_t`:
|
||||||
Use the `IS_LED_ON(usb_led, led_name)` and `IS_LED_OFF(usb_led, led_name)` macros to check the LED status.
|
|
||||||
|
|
||||||
!> `host_keyboard_leds()` may already reflect a new value before `led_set_user()` is called.
|
* `uint8_t led_set_kb(uint8_t usb_led)` and `_user(uint8_t usb_led)`
|
||||||
|
* `uint8_t host_keyboard_leds()`
|
||||||
|
|
||||||
### Example `led_set_user()` Implementation
|
## `led_update_user()`
|
||||||
|
|
||||||
|
This function will be called when the state of one of those 5 LEDs changes. It receives the LED state as a struct parameter.
|
||||||
|
|
||||||
|
You must return either `true` or `false` from this function, depending on whether you want to override the keyboard-level 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.
|
||||||
|
|
||||||
|
### Example `led_update_kb()` Implementation
|
||||||
|
|
||||||
```c
|
```c
|
||||||
void led_set_user(uint8_t usb_led) {
|
bool led_update_kb(led_t led_state) {
|
||||||
if (IS_LED_ON(usb_led, USB_LED_NUM_LOCK)) {
|
if(led_update_user(led_state)) {
|
||||||
writePinLow(B0);
|
if (led_state.num_lock) {
|
||||||
} else {
|
writePinLow(B0);
|
||||||
writePinHigh(B0);
|
} else {
|
||||||
}
|
writePinHigh(B0);
|
||||||
if (IS_LED_ON(usb_led, USB_LED_CAPS_LOCK)) {
|
}
|
||||||
writePinLow(B1);
|
if (led_state.caps_lock) {
|
||||||
} else {
|
writePinLow(B1);
|
||||||
writePinHigh(B1);
|
} else {
|
||||||
}
|
writePinHigh(B1);
|
||||||
if (IS_LED_ON(usb_led, USB_LED_SCROLL_LOCK)) {
|
}
|
||||||
writePinLow(B2);
|
if (led_state.scroll_lock) {
|
||||||
} else {
|
writePinLow(B2);
|
||||||
writePinHigh(B2);
|
} else {
|
||||||
}
|
writePinHigh(B2);
|
||||||
if (IS_LED_ON(usb_led, USB_LED_COMPOSE)) {
|
}
|
||||||
writePinLow(B3);
|
if (led_state.compose) {
|
||||||
} else {
|
writePinLow(B3);
|
||||||
writePinHigh(B3);
|
} else {
|
||||||
}
|
writePinHigh(B3);
|
||||||
if (IS_LED_ON(usb_led, USB_LED_KANA)) {
|
}
|
||||||
writePinLow(B4);
|
if (led_state.kana) {
|
||||||
} else {
|
writePinLow(B4);
|
||||||
writePinHigh(B4);
|
} else {
|
||||||
|
writePinHigh(B4);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### `led_set_*` Function Documentation
|
### Example `led_update_user()` Implementation
|
||||||
|
|
||||||
* Keyboard/Revision: `void led_set_kb(uint8_t usb_led)`
|
```c
|
||||||
* Keymap: `void led_set_user(uint8_t usb_led)`
|
bool led_update_user(led_t led_state) {
|
||||||
|
if (led_state.num_lock) {
|
||||||
|
writePinLow(B0);
|
||||||
|
} else {
|
||||||
|
writePinHigh(B0);
|
||||||
|
}
|
||||||
|
if (led_state.caps_lock) {
|
||||||
|
writePinLow(B1);
|
||||||
|
} else {
|
||||||
|
writePinHigh(B1);
|
||||||
|
}
|
||||||
|
if (led_state.scroll_lock) {
|
||||||
|
writePinLow(B2);
|
||||||
|
} else {
|
||||||
|
writePinHigh(B2);
|
||||||
|
}
|
||||||
|
if (led_state.compose) {
|
||||||
|
writePinLow(B3);
|
||||||
|
} else {
|
||||||
|
writePinHigh(B3);
|
||||||
|
}
|
||||||
|
if (led_state.kana) {
|
||||||
|
writePinLow(B4);
|
||||||
|
} else {
|
||||||
|
writePinHigh(B4);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## `host_keyboard_leds()`
|
### `led_update_*` Function Documentation
|
||||||
|
|
||||||
Call this function to get the last received LED state. This is useful for reading the LED state outside `led_set_*`, e.g. in [`matrix_scan_user()`](#matrix-scanning-code).
|
* Keyboard/Revision: `bool led_update_kb(led_t led_state)`
|
||||||
For convenience, you can use the `IS_HOST_LED_ON(led_name)` and `IS_HOST_LED_OFF(led_name)` macros instead of calling and checking `host_keyboard_leds()` directly.
|
* Keymap: `bool led_update_user(led_t led_state)`
|
||||||
|
|
||||||
|
## `host_keyboard_led_state()`
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
@ -297,8 +339,8 @@ This runs code every time that the layers get changed. This can be useful for l
|
||||||
This example shows how to set the [RGB Underglow](feature_rgblight.md) lights based on the layer, using the Planck as an example
|
This example shows how to set the [RGB Underglow](feature_rgblight.md) lights based on the layer, using the Planck as an example
|
||||||
|
|
||||||
```c
|
```c
|
||||||
uint32_t layer_state_set_user(uint32_t state) {
|
layer_state_t layer_state_set_user(layer_state_t state) {
|
||||||
switch (biton32(state)) {
|
switch (get_highest_layer(state)) {
|
||||||
case _RAISE:
|
case _RAISE:
|
||||||
rgblight_setrgb (0x00, 0x00, 0xFF);
|
rgblight_setrgb (0x00, 0x00, 0xFF);
|
||||||
break;
|
break;
|
||||||
|
@ -320,8 +362,8 @@ uint32_t layer_state_set_user(uint32_t state) {
|
||||||
```
|
```
|
||||||
### `layer_state_set_*` Function Documentation
|
### `layer_state_set_*` Function Documentation
|
||||||
|
|
||||||
* Keyboard/Revision: `uint32_t layer_state_set_kb(uint32_t state)`
|
* Keyboard/Revision: `layer_state_t layer_state_set_kb(layer_state_t state)`
|
||||||
* Keymap: `uint32_t layer_state_set_user(uint32_t state)`
|
* Keymap: `layer_state_t layer_state_set_user(layer_state_t state)`
|
||||||
|
|
||||||
|
|
||||||
The `state` is the bitmask of the active layers, as explained in the [Keymap Overview](keymap.md#keymap-layer-status)
|
The `state` is the bitmask of the active layers, as explained in the [Keymap Overview](keymap.md#keymap-layer-status)
|
||||||
|
@ -377,8 +419,8 @@ void keyboard_post_init_user(void) {
|
||||||
The above function will use the EEPROM config immediately after reading it, to set the default layer's RGB color. The "raw" value of it is converted in a usable structure based on the "union" that you created above.
|
The above function will use the EEPROM config immediately after reading it, to set the default layer's RGB color. The "raw" value of it is converted in a usable structure based on the "union" that you created above.
|
||||||
|
|
||||||
```c
|
```c
|
||||||
uint32_t layer_state_set_user(uint32_t state) {
|
layer_state_t layer_state_set_user(layer_state_t state) {
|
||||||
switch (biton32(state)) {
|
switch (get_highest_layer(state)) {
|
||||||
case _RAISE:
|
case _RAISE:
|
||||||
if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_magenta(); rgblight_mode_noeeprom(1); }
|
if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_magenta(); rgblight_mode_noeeprom(1); }
|
||||||
break;
|
break;
|
||||||
|
|
33
docs/de/README.md
Normal file
33
docs/de/README.md
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
# Quantum Mechanical Keyboard Firmware
|
||||||
|
|
||||||
|
[![Aktuelle Version](https://img.shields.io/github/tag/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/tags)
|
||||||
|
[![Build Status](https://travis-ci.org/qmk/qmk_firmware.svg?branch=master)](https://travis-ci.org/qmk/qmk_firmware)
|
||||||
|
[![Discord](https://img.shields.io/discord/440868230475677696.svg)](https://discord.gg/Uq7gcHh)
|
||||||
|
[![Docs Status](https://img.shields.io/badge/docs-ready-orange.svg)](https://docs.qmk.fm)
|
||||||
|
[![GitHub contributors](https://img.shields.io/github/contributors/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/pulse/monthly)
|
||||||
|
[![GitHub forks](https://img.shields.io/github/forks/qmk/qmk_firmware.svg?style=social&label=Fork)](https://github.com/qmk/qmk_firmware/)
|
||||||
|
|
||||||
|
## Was ist QMK Firmware?
|
||||||
|
|
||||||
|
QMK (*Quantum Mechanical Keyboard*) ist eine Open-Source-Community, welche die QMK-Firmware, die QMK-Toolbox, [qmk.fm](https://qmk.fm) und diese Dokumententation betreut. QMK-Firmware ist eine Weiterentwicklung der [tmk\_keyboard](http://github.com/tmk/tmk_keyboard)-Tastatur-Firmware mit vielen nützlichen Zusatzfunktionen für Atmel AVR-Prozessoren. Ursprünglich wurde sie für Produkte von [OLKB](http://olkb.com), das [ErgoDox EZ](http://www.ergodox-ez.com) und das [Clueboard](http://clueboard.co/) entwickelt. Im Laufe der Zeit wurde sie mit Hilfe von [ChibiOS](http://chibios.org) auch für die ARM-Architektur angepasst. Außerdem ist es inzwischen möglich, auch handverdrahtete Tastaturen und selbst geätzte PCBs mit QMK zu verwenden.
|
||||||
|
|
||||||
|
## Bezugsquelle für QMK
|
||||||
|
|
||||||
|
Wenn Du vorhast, deine Tastatur, Tastaturbelegung oder Features zu QMK beizusteuern, geht das am einfachsten, indem Du das [Repository auf Github](https://github.com/qmk/qmk_firmware#fork-destination-box) forkst, die Änderungen in deinem lokalen Repo vornimmst und anschließend einen [Pull Request](https://github.com/qmk/qmk_firmware/pulls) einreichst.
|
||||||
|
|
||||||
|
Ansonsten kannst Du es als [zip](https://github.com/qmk/qmk_firmware/zipball/master) oder [tar](https://github.com/qmk/qmk_firmware/tarball/master) herunterladen, oder es direkt via git klonen (`git clone git@github.com:qmk/qmk_firmware.git` bzw. `git clone https://github.com/qmk/qmk_firmware.git`).
|
||||||
|
|
||||||
|
|
||||||
|
## Anleitung fürs Kompilieren
|
||||||
|
|
||||||
|
Bevor Du in der Lage bist, die Firmware zu kompilieren, musst Du eine [Entwicklungsumgebung](de/getting_started_build_tools.md) für AVR und/oder ARM aufsetzen. Danach kannst Du mit dem `make` Befehl eine Keymap für deine Tastatur erzeugen. Die Notation dafür ist:
|
||||||
|
|
||||||
|
make planck/rev4:default
|
||||||
|
|
||||||
|
Dies generiert die Revision `rev4` für eine Tastatur vom Type `planck` mit der `default` Tastaturbelegung. Nicht alle Tastaturen haben Revisionen (auch bekannt als Subprojekt oder Unterordner) weswegen dies auch ausgelassen werden kann:
|
||||||
|
|
||||||
|
make preonic:default
|
||||||
|
|
||||||
|
## Möglichkeiten der Anpassung
|
||||||
|
|
||||||
|
QMK hat viele [Features](de/features.md), die es zu entdecken gibt. In der [Dokumentation](https://docs.qmk.fmk) kannst Du Dir einen Überblick verschaffen. Die meisten Features basieren darauf, die [Tastaturbelegung](de/keymap.md) anzupassen und das Verhalten der [Keycodes](de/keycodes.md) zu verändern.
|
121
docs/de/_summary.md
Normal file
121
docs/de/_summary.md
Normal file
|
@ -0,0 +1,121 @@
|
||||||
|
* [Anleitung für Anfänger](de/newbs.md)
|
||||||
|
* [Erste Schritte](de/newbs_getting_started.md)
|
||||||
|
* [Die erste Firmware](de/newbs_building_firmware.md)
|
||||||
|
* [Firmware flashen](de/newbs_flashing.md)
|
||||||
|
* [Testen und Debuggen](de/newbs_testing_debugging.md)
|
||||||
|
* [Git Tips und Tricks](de/newbs_best_practices.md)
|
||||||
|
* [Hilfreiche Ressourcen](de/newbs_learn_more_resources.md)
|
||||||
|
|
||||||
|
* [QMK Basics](de/README.md)
|
||||||
|
* [QMK Einführung](de/getting_started_introduction.md)
|
||||||
|
* [QMK CLI](de/cli.md)
|
||||||
|
* [QMK CLI Konfiguration](de/cli_configuration.md)
|
||||||
|
* [Zu QMK beitragen](de/contributing.md)
|
||||||
|
* [Anleitung für Github](de/getting_started_github.md)
|
||||||
|
* [Nach Hilfe fragen](de/getting_started_getting_help.md)
|
||||||
|
|
||||||
|
* [Breaking Changes](de/breaking_changes.md)
|
||||||
|
* [2019 Aug 30](de/ChangeLog/20190830.md)
|
||||||
|
|
||||||
|
* [FAQ](de/faq.md)
|
||||||
|
* [Häufige Fragen](de/faq_general.md)
|
||||||
|
* [Build/Kompilieren](de/faq_build.md)
|
||||||
|
* [Debugging/Troubleshooting](de/faq_debug.md)
|
||||||
|
* [Keymap](de/faq_keymap.md)
|
||||||
|
* [Treiber Installation mit Zadig](de/driver_installation_zadig.md)
|
||||||
|
|
||||||
|
* Detailierte Guides
|
||||||
|
* [Build Tools installieren](de/getting_started_build_tools.md)
|
||||||
|
* [Vagrant Guide](de/getting_started_vagrant.md)
|
||||||
|
* [Build/Compile Anleitung](de/getting_started_make_guide.md)
|
||||||
|
* [Firmware flashen](de/flashing.md)
|
||||||
|
* [Funktionalität anpassen](de/custom_quantum_functions.md)
|
||||||
|
* [Keymap Überblick](de/keymap.md)
|
||||||
|
|
||||||
|
* [Hardware](de/hardware.md)
|
||||||
|
* [AVR Prozessoren](de/hardware_avr.md)
|
||||||
|
* [Treiber](de/hardware_drivers.md)
|
||||||
|
|
||||||
|
* Referenz
|
||||||
|
* [Tastatur Richtlinien](de/hardware_keyboard_guidelines.md)
|
||||||
|
* [Konfigurations Optionen](de/config_options.md)
|
||||||
|
* [Keycodes](de/keycodes.md)
|
||||||
|
* [Coding Konventionen - C](de/coding_conventions_c.md)
|
||||||
|
* [Coding Konventionen - Python](de/coding_conventions_python.md)
|
||||||
|
* [Dokumentations Best Practices](de/documentation_best_practices.md)
|
||||||
|
* [Dokumentations Templates](de/documentation_templates.md)
|
||||||
|
* [Glossar](de/reference_glossary.md)
|
||||||
|
* [Unit Testing](de/unit_testing.md)
|
||||||
|
* [Nützliche Funktionen](de/ref_functions.md)
|
||||||
|
* [Configurator Support](de/reference_configurator_support.md)
|
||||||
|
* [info.json Format](de/reference_info_json.md)
|
||||||
|
* [Python CLI Development](de/cli_development.md)
|
||||||
|
|
||||||
|
* [Features](de/features.md)
|
||||||
|
* [Basic Keycodes](de/keycodes_basic.md)
|
||||||
|
* [US ANSI Shifted Keys](de/keycodes_us_ansi_shifted.md)
|
||||||
|
* [Quantum Keycodes](de/quantum_keycodes.md)
|
||||||
|
* [Advanced Keycodes](de/feature_advanced_keycodes.md)
|
||||||
|
* [Audio](de/feature_audio.md)
|
||||||
|
* [Auto Shift](de/feature_auto_shift.md)
|
||||||
|
* [Backlight](de/feature_backlight.md)
|
||||||
|
* [Bluetooth](de/feature_bluetooth.md)
|
||||||
|
* [Bootmagic](de/feature_bootmagic.md)
|
||||||
|
* [Combos](de/feature_combo.md)
|
||||||
|
* [Command](de/feature_command.md)
|
||||||
|
* [Debounce API](de/feature_debounce_type.md)
|
||||||
|
* [DIP Switch](de/feature_dip_switch.md)
|
||||||
|
* [Dynamic Macros](de/feature_dynamic_macros.md)
|
||||||
|
* [Encoders](de/feature_encoders.md)
|
||||||
|
* [Grave Escape](de/feature_grave_esc.md)
|
||||||
|
* [Haptic Feedback](de/feature_haptic_feedback.md)
|
||||||
|
* [HD44780 LCD Controller](de/feature_hd44780.md)
|
||||||
|
* [Key Lock](de/feature_key_lock.md)
|
||||||
|
* [Layouts](de/feature_layouts.md)
|
||||||
|
* [Leader Key](de/feature_leader_key.md)
|
||||||
|
* [LED Matrix](de/feature_led_matrix.md)
|
||||||
|
* [Macros](de/feature_macros.md)
|
||||||
|
* [Mouse Keys](de/feature_mouse_keys.md)
|
||||||
|
* [OLED Driver](de/feature_oled_driver.md)
|
||||||
|
* [One Shot Keys](de/feature_advanced_keycodes.md#one-shot-keys)
|
||||||
|
* [Pointing Device](de/feature_pointing_device.md)
|
||||||
|
* [PS/2 Mouse](de/feature_ps2_mouse.md)
|
||||||
|
* [RGB Lighting](de/feature_rgblight.md)
|
||||||
|
* [RGB Matrix](de/feature_rgb_matrix.md)
|
||||||
|
* [Space Cadet](de/feature_space_cadet.md)
|
||||||
|
* [Split Keyboard](de/feature_split_keyboard.md)
|
||||||
|
* [Stenography](de/feature_stenography.md)
|
||||||
|
* [Swap Hands](de/feature_swap_hands.md)
|
||||||
|
* [Tap Dance](de/feature_tap_dance.md)
|
||||||
|
* [Terminal](de/feature_terminal.md)
|
||||||
|
* [Thermal Printer](de/feature_thermal_printer.md)
|
||||||
|
* [Unicode](de/feature_unicode.md)
|
||||||
|
* [Userspace](de/feature_userspace.md)
|
||||||
|
* [Velocikey](de/feature_velocikey.md)
|
||||||
|
|
||||||
|
* Für Maker und Modder
|
||||||
|
* [Hand Wiring Guide](de/hand_wire.md)
|
||||||
|
* [ISP Flashing Guide](de/isp_flashing_guide.md)
|
||||||
|
* [ARM Debugging Guide](de/arm_debugging.md)
|
||||||
|
* [I2C Driver](de/i2c_driver.md)
|
||||||
|
* [GPIO Controls](de/internals_gpio_control.md)
|
||||||
|
* [Proton C Conversion](de/proton_c_conversion.md)
|
||||||
|
|
||||||
|
* Für ein tieferes Verständnis
|
||||||
|
* [Wie Tastaturen funktionieren](de/how_keyboards_work.md)
|
||||||
|
* [QMK verstehen](de/understanding_qmk.md)
|
||||||
|
|
||||||
|
* Andere Themen
|
||||||
|
* [Eclipse mit QMK](de/other_eclipse.md)
|
||||||
|
* [VSCode mit QMK](de/other_vscode.md)
|
||||||
|
* [Support](de/support.md)
|
||||||
|
* [Übersetzungen](de/translating.md)
|
||||||
|
|
||||||
|
* QMK Internals (de/In Progress)
|
||||||
|
* [Defines](de/internals_defines.md)
|
||||||
|
* [Input Callback Reg](de/internals_input_callback_reg.md)
|
||||||
|
* [Midi Device](de/internals_midi_device.md)
|
||||||
|
* [Midi Device Setup Process](de/internals_midi_device_setup_process.md)
|
||||||
|
* [Midi Util](de/internals_midi_util.md)
|
||||||
|
* [Send Functions](de/internals_send_functions.md)
|
||||||
|
* [Sysex Tools](de/internals_sysex_tools.md)
|
169
docs/de/cli.md
Normal file
169
docs/de/cli.md
Normal file
|
@ -0,0 +1,169 @@
|
||||||
|
# QMK CLI (Kommandozeile)
|
||||||
|
|
||||||
|
Diese Seite beschreibt die Einrichtung und den Umgang mit dem QMK CLI (Kommandozeile).
|
||||||
|
|
||||||
|
# Übersicht
|
||||||
|
|
||||||
|
Die QMK CLI vereinfacht das Zusammenbauen und Arbeiten mit QMK Tastaturen. Hier findest Du wichtige Befehle, um beispielsweise das Herunterladen und Kompilieren der QMK Firmware oder das Erstellen von Tastaturbelegungen (und vieles mehr) zu erleichtern.
|
||||||
|
|
||||||
|
* [Globale CLI](#globale-cli)
|
||||||
|
* [Lokale CLI](#lokale-cli)
|
||||||
|
* [CLI-Befehle](#cli-befehle)
|
||||||
|
|
||||||
|
# System-Anforderungen
|
||||||
|
|
||||||
|
Die CLI benötigt Python 3.5 oder höher. Außerdem ist es nötig, die Packages laut [`requirements.txt`](https://github.com/qmk/qmk_firmware/blob/master/requirements.txt) zu installieren.
|
||||||
|
|
||||||
|
# Globale CLI
|
||||||
|
|
||||||
|
QMK bietet ein installierbares CLI, das Du zum Einrichten Deiner QMK Build-Umgebung verwenden kannst. Dieses ermöglicht Dir das Arbeiten mit QMK, und erleichtert das Arbeiten mit mehreren Kopien der `qmk_firmware`. Wir empfehlen, dieses CLI zu installieren und regelmäßig upzudaten.
|
||||||
|
|
||||||
|
## Installation mit Homebrew (macOS, manche Linux)
|
||||||
|
|
||||||
|
Solltest Du [Homebrew](https://brew.sh) installiert haben, kannst Du QMK per tap installieren:
|
||||||
|
|
||||||
|
```
|
||||||
|
brew tap qmk/qmk
|
||||||
|
brew install qmk
|
||||||
|
export QMK_HOME='~/qmk_firmware' # Optional: setzt den Installationsort für `qmk_firmware`
|
||||||
|
qmk setup # Dies klont `qmk/qmk_firmware` und richtet optional auch Deine Build-Umgebung ein
|
||||||
|
```
|
||||||
|
|
||||||
|
## Installation mit easy_install oder pip
|
||||||
|
|
||||||
|
Falls Du kein Homebrew hast, kannst Du QMK auch manuell installieren. Zuerst musst Du sicherstellen, dass Python 3.5 (oder höher) und pip installiert ist. Dann installiere QMK mit diesem Befehl:
|
||||||
|
|
||||||
|
```
|
||||||
|
pip3 install qmk
|
||||||
|
export QMK_HOME='~/qmk_firmware' # Optional: setzt den Installationsort für `qmk_firmware`
|
||||||
|
qmk setup # Dies klont `qmk/qmk_firmware` und richtet optional auch Deine Build-Umgebung ein
|
||||||
|
```
|
||||||
|
## Installation mit git Repo
|
||||||
|
|
||||||
|
`git clone https://github.com/qmk/qmk_cli.git && cd qmk_cli && python3 setup.py install`
|
||||||
|
|
||||||
|
## Packaging für andere Betriebssysteme
|
||||||
|
|
||||||
|
Wir suchen nach Freiwilligen, die ein `qmk`-Package für weitere Betriebssysteme erstellen und pflegen. Falls Du ein Package für Dein OS erstellen möchtest, bitte befolge diese Richtlinien:
|
||||||
|
|
||||||
|
* Verwende "Best Practices" für Dein OS, sollten sie mit diesen Richtlinien in Konflikt stehen.
|
||||||
|
* Dokumentiere den Grund in einem Kommentar, wenn Du abweichen musstest.
|
||||||
|
* Installiere mit einem [virtualenv](https://virtualenv.pypa.io/en/latest/).
|
||||||
|
* Weise den User an, die Umgebungs-Variable `QMK_HOME` zu setzen, um die Firmware-Quelle anders einzustellen als `~/qmk_firmware`.
|
||||||
|
|
||||||
|
# Lokale CLI
|
||||||
|
|
||||||
|
Wenn Du die globale CLI nicht verwenden möchtest, beinhaltet `qmk_firmware` auch eine lokale CLI. Du kannst sie hier finden: `qmk_firmware/bin/qmk`. Du kannst den `qmk`-Befehl aus irgendeinem Datei-Verzeichnis ausführen und es wird immer auf dieser Kopie von `qmk_firmware` arbeiten.
|
||||||
|
|
||||||
|
**Beispiel**:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ~/qmk_firmware/bin/qmk hello
|
||||||
|
Ψ Hello, World!
|
||||||
|
```
|
||||||
|
|
||||||
|
## Einschränkungen der lokalen CLI
|
||||||
|
|
||||||
|
Hier ein Vergleich mit der globalen CLI:
|
||||||
|
|
||||||
|
* Die lokale CLI unterstützt kein `qmk setup` oder `qmk clone`.
|
||||||
|
* Die lokale CLI arbeitet immer innerhalb der selben `qmk_firmware`-Verzeichnisstruktur, auch wenn Du mehrere Repositories geklont hast.
|
||||||
|
* Die lokale CLI läuft nicht in einer virtualenv. Daher ist es möglich, dass Abhängigkeiten (dependencies) miteinander in Konflikt kommen/stehen.
|
||||||
|
|
||||||
|
# CLI-Befehle
|
||||||
|
|
||||||
|
## `qmk compile`
|
||||||
|
|
||||||
|
Dieser Befehl erlaubt es dir, die Firmware - aus egal welchem Datei-Verzeichnis - zu compilen. Du kannst JSON-Exporte von <https://config.qmk.fm> oder Keymaps in der Repo kompilen.
|
||||||
|
|
||||||
|
**Anwendung für Konfigurations-Exports**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk compile <configuratorExport.json>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Anwendung für Keymaps**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk compile -kb <keyboard_name> -km <keymap_name>
|
||||||
|
```
|
||||||
|
|
||||||
|
## `qmk cformat`
|
||||||
|
|
||||||
|
Dieser Befehl formatiert C-Code im clang-Format. Benutze ihn ohne Argumente, um den core-Code zu formatieren, oder benutze Namen von Dateien in der CLI, um den Befehl auf bestimmte Dateien anzuwenden.
|
||||||
|
|
||||||
|
**Anwendung**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk cformat [file1] [file2] [...] [fileN]
|
||||||
|
```
|
||||||
|
|
||||||
|
## `qmk config`
|
||||||
|
|
||||||
|
Dieser Befehl konfiguriert das Verhalten von QMK. Für die volle `qmk config`-Dokumentation gehe zu [CLI-Konfiguration](cli_configuration.md).
|
||||||
|
|
||||||
|
**Anwendung**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk config [-ro] [config_token1] [config_token2] [...] [config_tokenN]
|
||||||
|
```
|
||||||
|
|
||||||
|
## `qmk docs`
|
||||||
|
|
||||||
|
Dieser Befehl startet einen lokalen HTTP-Server, den Du zum Browsen oder Verbessern der Dokumentation verwenden kannst. Der Default-Port ist 8936.
|
||||||
|
|
||||||
|
**Anwendung**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk docs [-p PORT]
|
||||||
|
```
|
||||||
|
|
||||||
|
## `qmk doctor`
|
||||||
|
|
||||||
|
Dieser Befehl untersucht Deine Umgebung und warnt Dich vor potentiellen Build- oder Flash-Problemen.
|
||||||
|
|
||||||
|
**Anwendung**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk doctor
|
||||||
|
```
|
||||||
|
|
||||||
|
## `qmk list-keyboards`
|
||||||
|
|
||||||
|
Dieser Befehl listet alle zurzeit in `qmk_firmware` definierten Tastaturen/Keyboards auf.
|
||||||
|
|
||||||
|
**Anwendung**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk list-keyboards
|
||||||
|
```
|
||||||
|
|
||||||
|
## `qmk new-keymap`
|
||||||
|
|
||||||
|
Dieser Befehl erstellt eine neue Keymap basierend auf einer existierenden Standard-Keymap eines bestimmten Keyboards.
|
||||||
|
|
||||||
|
**Anwendung**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk new-keymap [-kb KEYBOARD] [-km KEYMAP]
|
||||||
|
```
|
||||||
|
|
||||||
|
## `qmk pyformat`
|
||||||
|
|
||||||
|
Dieser Befehl formatiert Python-Code in `qmk_firmware`.
|
||||||
|
|
||||||
|
**Anwendung**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk pyformat
|
||||||
|
```
|
||||||
|
|
||||||
|
## `qmk pytest`
|
||||||
|
|
||||||
|
Dieser Befehl führt die Python Test Suite aus. Wenn Du Python-Code veränderst, solltest Du sicherstellen, dass der Test erfolgreich ausgeführt wurde.
|
||||||
|
|
||||||
|
**Anwendung**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk pytest
|
||||||
|
```
|
47
docs/de/driver_installation_zadig.md
Normal file
47
docs/de/driver_installation_zadig.md
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
# Bootloader Treiber Installation mit Zadig
|
||||||
|
|
||||||
|
QMK erscheint für den Host als normales HID Eingabegerät und benötigt deshalb keine zusätzlichen Treiber. Der Bootloader, den Du für das Flashen der Firmware benötigst, jedoch meistens schon.
|
||||||
|
|
||||||
|
Hierzu gibt es zwei Ausnahmen: den Caterina Bootloader, meistens auf Pro Micros, sowie den HalfKay Bootloader auf PJRC Teensys. Diese erscheinen als serieller Port und als generisches HID Gerät und benötigen keine Treiber.
|
||||||
|
|
||||||
|
Wir empfehlen deshalb [Zadig](https://zadig.akeo.ie/). Wenn Du die Entwicklungsumgebung mit MSYS2 oder WSL installiert hast, wird dich dass `qmk_install.sh` Skript gefragt haben, ob es die Treiber für dich installieren sollte.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Versetze deine Tastatur in den Bootloader-Modus, entweder durch Betätigung des physischen `RESET` Schalters - meist auf der Unterseite der Platine - oder durch das Auslösen des Key-Codes `RESET` bzw. `KC_RESET` (sollte in der zur Tastatur gehörigen `keycode.c` zu entnehmen sein). Sollte deine Tastatur weder noch besitzen, versuche es damit die `Escape`-Taste oder `Leertaste + B` zu halten während Du die Tastatur mit dem PC verbindest (Siehe auch [Bootmagic](de/feature_bootmagic.md) für weitere Details). Ein paar Tastaturen benutzen das [Command](de/feature_command.md)-Feature an Stelle von Bootmagic; in diesem Fall kannst du mit den Tastenkombinationen `linkes Shift + rechtes Shift + B` oder `linkes Shift + rechtes Shift + Escape` zu jeder Zeit in den Bootloader wechseln solange die Tastatur verbunden ist.
|
||||||
|
|
||||||
|
Eingie Tastaturen haben u.U. spezielle Anweisungen um in den Bootloader-Modus zu gelangen. Zum Beispiel kann die [Bootmagic-Lite](de/feature_bootmagic.md#bootmagic-lite)-Taste (default: Escape) auf eine andere Taste gemappt sein; oder die magische Kombination (default: linkes Shift+rechtes Shift) verwendet anstatt Shift die STRG-Tasten. Die zur Tastatur gehörige README sollte dir Aufschluss darüber geben wie der Bootloader-Modus ausgelöst werden kann wenn Du unsicher bist.
|
||||||
|
|
||||||
|
Um ein Gerät mit USBaspLoader in den Bootloader-Modus zu versetzen, halte `BOOT` gedrückt während Du den `RESET`-Knopf drückst.
|
||||||
|
Alternativ, halte `BOOT` gedrückt während Du das USB-Kabel einsteckst.
|
||||||
|
|
||||||
|
Zadig sollte das Bootloader-Gerät automatisch erkennen. Manchmal musst Du zusätzlich noch **Options → List All Devices** auswählen.
|
||||||
|
|
||||||
|
- Tastaturen mit Atmel AVR MCUs sollten als `ATm32U4DFU` (oder ähnlich) angezeigt werden, mit der Vendor ID `03EB`.
|
||||||
|
- USBasp werden als `USBasp` angezeigt, mit VID/PID `16C0:05DC`.
|
||||||
|
- Tastaturen AVR controller und dem QMK-DFU Bootloader haben den namen `<Tastatur Name> Bootloader` und die VID `03EB`.
|
||||||
|
- Die meisten ARM Tastaturen werden als `STM32 BOOTLOADER` angezeigt, mit VID/PID `0483:DF11`.
|
||||||
|
|
||||||
|
!> Sollte Zadig ein oder mehrere Geräte mit `HidUsb`-Treiber anzeigen, dann ist deine Tastatur wahrscheinlich nicht im Bootloader-Modus. Der Pfeil wird orange eingefärbt sein und Du wirst nach einer Bestätigung gefragt um Veränderungen am System vorzunehmen. In diesem Fall **fahre nicht fort**!
|
||||||
|
|
||||||
|
Wenn der Pfeil grün angezeigt wird, wähle den Treiber aus und klicke auf **Treiber installieren**. Der `libusb-win32`-Treiber sollte gewöhnlich für AVR verwendet werden und `WinUSB` für ARM. Sollte es danach noch nicht möglich sein die Tastatur zu flashen, versuche es mit einem anderen Treiber. Für USBaspLoader Geräte, die über die Befehlszeile mit MSYS2 geflasht werden, wird der `libusbk`-Treiber empfohlen. Ansonsten sollte `libusb-win32` funktionieren wenn die QMK Toolbox verwendet wird.
|
||||||
|
|
||||||
|
![Zadig mit Bootloader-Treiber korrekt installiert](https://i.imgur.com/b8VgXzx.png)
|
||||||
|
|
||||||
|
Entferne nun deine Tastatur und verbinde sie erneut um sicherzugehen dass der neue Treiber erfolgreich installiert wurde. Wenn Du QMK Toolbox benutzt, starte die Anwendung zur Sicherheit einmal neu, da Veränderungen am Treiber manchmal nicht richtig erkannt werden. Wenn dies immer noch nicht erfolgreich war hilft es an dieser Stelle manchmal ein Neustart des Computers.
|
||||||
|
|
||||||
|
## Wiederherstellung einer Installation für ein falsches Gerät
|
||||||
|
|
||||||
|
Wenn Du feststellst dass Du anschließend auf deiner Tastatur nicht mehr tippen kannst, ist etwas bei der Installation schief gelaufen. Ein häufiger Fehler ist es dass die Tastatur nicht im Bootloader-Modus war und stattdessen der Treiber für das HID-Gerät ersetzt wurde. Dies kannst Du einfach mit Zadig überprüfen, eine funktionierende Tastatur verwendet als Treiber `HidUsb` auf allen Interfaces .
|
||||||
|
|
||||||
|
![Eine funktionierende Tastatur aus Zadigs Sicht](https://i.imgur.com/Hx0E5kC.png)
|
||||||
|
|
||||||
|
Öffne den Geräte-Manager und suche nach einem Gerät das wie deine Tastatur aussieht.
|
||||||
|
|
||||||
|
![Die Tastatur mit dem falschen Treiber installiert, im Geräte-Manager](https://i.imgur.com/L3wvX8f.png)
|
||||||
|
|
||||||
|
Rechtsklick und **Gerät deinstallieren** anklicken. Bitte gehe sicher dass in diesem Schritt auch **Treibersoftware für dieses Gerät löschen** markiert ist.
|
||||||
|
|
||||||
|
![Der "Gerät deinstallieren"-Dialog, mit "Treibersoftware für dieses Gerät entfernen" markiert](https://i.imgur.com/aEs2RuA.png)
|
||||||
|
|
||||||
|
Klick **Aktion → Suche nach veränderter Hardware**. Nun solltest Du wieder in der Lage sein normal zu tippen. Vergewissere dich mit Hilfe von Zadig dass die Tastatur nun `HidUsb` als Treiber verwendet. Wenn dies der Fall ist sollte wieder alles funktionieren.
|
22
docs/de/newbs.md
Normal file
22
docs/de/newbs.md
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
# Anleitung für absolute Beginner
|
||||||
|
QMK ist eine mächtige Open Source Firmware für mechanische Tastaturen. Mit QMK kannst Du deine Tastatur sowohl sehr einfach als auch sehr umfangreich anpassen. Menschen unterschiedlichen Wissensstandes - vom kompletten Anfänger bis zum erfahrenen Programmierer - haben ihre Tastaturen mit QMK erfolgreich auf ihre persönlichen Bedürfnisse angepasst. Diese Anleitung soll Dir unabhängig von deinen Vorkenntnissen dabei helfen dies ebenfalls zu bewältigen.
|
||||||
|
|
||||||
|
Bist Du unsicher ob deine Tastatur QMK unterstützt? Wenn es eine mechanische Tastatur ist, die Du selbst gebaut hast, stehen deine Chancen gut. Wir unterstützen eine [Vielzahl](https://qmk.fm/keyboards/) selbst gebauter Tastaturen, sodass selbst wenn deine jetzige Tastatur nicht unterstützt wird Du keine Probleme haben solltest eine für deine Anforderungen zu finden.
|
||||||
|
|
||||||
|
## Übersicht
|
||||||
|
|
||||||
|
Diese Anleitung ist in 7 Abschnitte unterteilt:
|
||||||
|
|
||||||
|
* [Die ersten Schritte](newbs_getting_started.md)
|
||||||
|
* [Die erste Firmware auf der Kommandozeile erzeugen](newbs_building_firmware.md)
|
||||||
|
* [Die erste Firmware mit der Online GUI erzeugen](newbs_building_firmware_configurator.md)
|
||||||
|
* [Firmware flashen](newbs_flashing.md)
|
||||||
|
* [Testen und Debuggen](newbs_testing_debugging.md)
|
||||||
|
* [Git Leitfaden](newbs_best_practices.md)
|
||||||
|
* [Weitere hilfreiche Ressourcen für Anfänger](newbs_learn_more_resources.md)
|
||||||
|
|
||||||
|
Diese Anleitung richtet sich an Personen, die vorher noch nie Software kompiliert haben. Die Entscheidungen und Empfehlungen basieren auf dieser Grundannahme. Es gibt unterschiedliche Herangehensweisen für viele der Prozeduren und wir unterstützen die meisten Alternativen. Wenn Du mal nicht weiter weißt oder Dir nicht sicher bist, wie Du an ein Problem herangehen sollst, kannst Du uns gerne [um Hilfe bitten](getting_started_getting_help.md).
|
||||||
|
|
||||||
|
## Weitere Ressourcen
|
||||||
|
|
||||||
|
* [Thomas Baart's QMK Basics Blog](https://thomasbaart.nl/category/mechanical-keyboards/firmware/qmk/qmk-basics/) – Ein äußerst hilfreicher Blog eines Community-Mitglieds, der einige Grundlagen der QMK-Firmware aus der Sicht des Benutzers erklärt (auf Englisch).
|
78
docs/de/newbs_building_firmware.md
Normal file
78
docs/de/newbs_building_firmware.md
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
# Eine eigene Firmware erstellen
|
||||||
|
|
||||||
|
Nachdem Du nun eine funktionierende Entwicklungsumgebung aufgesetzt hast, bist Du nun bereit, deine eigene Firmware zu erstellen. Dieses Sektion des Guides wird zwischen drei Programmen hin- und herwechseln: deinem Dateimanager, deinem Texteditor und der Befehlszeile. Lasse diese drei Fenster geöffnet, bis Du fertig und zufrieden mit deiner Tastatur-Firmware bist.
|
||||||
|
|
||||||
|
Solltest Du die Befehlszeile zwischenzeitlich geschlossen haben, vergiss nicht wieder in das richtige Verzeichnis zu navigieren, benutze dazu den Befehl `cd qmk_firmware`.
|
||||||
|
|
||||||
|
## Navigiere in deinen Keymap Ordner
|
||||||
|
|
||||||
|
Beginne damit, in das `keymaps` Verzeichnis für deine Tastatur zu navigieren.
|
||||||
|
|
||||||
|
Wenn Du macOS oder Windows benutzt, kannst Du einfach in das keymaps Verzeichnis wechseln.
|
||||||
|
|
||||||
|
?> macOS:<br>
|
||||||
|
open keyboards/<keyboard_folder>/keymaps
|
||||||
|
|
||||||
|
?> Windows:<br>
|
||||||
|
start .\\keyboards\\<keyboard_folder>\\keymaps
|
||||||
|
|
||||||
|
## Eine Kopie der `default` Tastaturbelegung erstellen
|
||||||
|
|
||||||
|
Wenn Du den `keymaps` Ordner geöffnet hast, solltest Du zuerst eine Kopie des `default` Verzeichnisses erstellen. Wir empfehlen dafür deinen GitHub Benutzernamen zu verweden, aber Du kannst auch jeden anderen Namen verwenden solange er nur aus Kleinbuchstaben, Zahlen und Unterstrichen besteht.
|
||||||
|
|
||||||
|
Um den Prozess zu automatisieren kannst Du dazu auch das Skript `new_keymap.sh` verwenden.
|
||||||
|
|
||||||
|
Navigiere dazu in das `qmk_firmware/util` Verzeichnis und gib folgenden Befehl ein:
|
||||||
|
|
||||||
|
```
|
||||||
|
./new_keymap.sh <keyboard path> <username>
|
||||||
|
```
|
||||||
|
|
||||||
|
Um zum Beispiel den Benutzernamen John für die Tastaturbelegung eines 1up60hse zu verwenden, würdest Du Folgendes eingeben:
|
||||||
|
|
||||||
|
```
|
||||||
|
./new_keymap.sh 1upkeyboards/1up60hse john
|
||||||
|
```
|
||||||
|
|
||||||
|
## Öffne `keymap.c` in deinem bevorzugtem Text Editor
|
||||||
|
|
||||||
|
Öffne deine `keymap.c`. In dieser Datei findest Du die Strukturen, die das Verhalten deiner Tastatur bestimmen. Oben in der `keymap.c` befinden sich Definitionen (defines) und Aufzählungen (enums), die die Tastaturbelegung leserlicher machen sollen. Weiter unten wirst Du eine Zeile finden, die wie folgt aussieht:
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
|
||||||
|
Diese Zeile markiert den Anfang der Liste der Ebenen (Layers). Darunter befinden sich Zeilen die entweder `LAYOUT` oder `KEYMAP` enthalten, das deutet auf den Start einer Ebene hin. Danach folgt eine Liste von Tasten, die dieser Ebene zugewiesen sind.
|
||||||
|
|
||||||
|
!> Beim Bearbeiten einer Tastaturbelegung solltest Du darauf achten, keine Kommata hinzuzufügen oder zu entfernen. Ansonsten kann dies dazu führen, dass deine Firmware nicht mehr kompiliert und es ist nicht immer einfach festzustellen, wo genau ein Komma zuviel oder zu wenig ist. Die letzte Zeile hat am Ende kein Komma, die Zeilen davor jedoch schon.
|
||||||
|
|
||||||
|
## Personalisiere die Tastaturbelegung nach deinen Wünschen
|
||||||
|
|
||||||
|
Wie Du diesen Schritt abschließt ist vollkommen Dir überlassen. Ändere die eine Sache die Dich stört oder verändere alles von Grund auf. Du kannst Ebenen entfernen die Du nicht brauchst oder Neue hinzufügen, bis zu 32 Stück. Die folgende Dokumentation verrät Dir was Du hier alles definieren kannst:
|
||||||
|
|
||||||
|
* [Keycodes](de/keycodes.md)
|
||||||
|
* [Features](de/features.md)
|
||||||
|
* [FAQ](de/faq.md)
|
||||||
|
|
||||||
|
?> Während Du langsam ein Gefühl dafür kriegst wie Keymaps funktionieren, solltest Du darauf achten nicht zuviel auf einmal zu verändern. Größere Änderungen machen es schwieriger, Probleme zu debuggen.
|
||||||
|
|
||||||
|
## Deine Firmware erzeugen
|
||||||
|
|
||||||
|
Wenn Du damit fertig bist, deine Tastaturbelegung anzupassen, musst Du noch die Firmware erzeugen. Öffne dazu wieder die Befehlszeile und führe folgenden Befehl aus:
|
||||||
|
|
||||||
|
make <my_keyboard>:<my_keymap>
|
||||||
|
|
||||||
|
Wenn deine Tastaturbelegung z.B. "xyverz" heißt und Du die Belegung für ein rev5 planck erzeugen möchtest, lautet der Befehl:
|
||||||
|
|
||||||
|
make planck/rev5:xyverz
|
||||||
|
|
||||||
|
Während des Kompiliervorgangs wird viel Text auf dem Bildschirm ausgegeben. Es sollte am Ende mit etwas enden das ungefähr so aussieht:
|
||||||
|
|
||||||
|
```
|
||||||
|
Linking: .build/planck_rev5_xyverz.elf [OK]
|
||||||
|
Creating load file for flashing: .build/planck_rev5_xyverz.hex [OK]
|
||||||
|
Copying planck_rev5_xyverz.hex to qmk_firmware folder [OK]
|
||||||
|
Checking file size of planck_rev5_xyverz.hex [OK]
|
||||||
|
* File size is fine - 18392/28672
|
||||||
|
```
|
||||||
|
|
||||||
|
## Deine Firmware flashen
|
||||||
|
Bitte fahre mit [Firmware flashen](de/newbs_flashing.md) fort, um zu erfahren, wie Du deine neue Firmware auf deine Tastatur flashen kannst.
|
369
docs/de/newbs_flashing.md
Normal file
369
docs/de/newbs_flashing.md
Normal file
|
@ -0,0 +1,369 @@
|
||||||
|
# Deine Tastatur flashen
|
||||||
|
|
||||||
|
Nachdem deine Firmware nun fertig ist musst Du Sie noch auf deine Tastatur flashen.
|
||||||
|
|
||||||
|
## Flash-Vorgang mit QMK Toolbox
|
||||||
|
|
||||||
|
Der einfachste Weg deine Tastatur zu flashen ist mit Hilfe der [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases)
|
||||||
|
|
||||||
|
Leider ist die QMK Toolbox derzeit nur für Windows und macOS verfügbar. Wenn Du Linux benutzt (oder es vorziehst die Firmware mit der Kommandozeile zu flashen) solltest Du die Methode benutzen die [hier](de/newbs_flashing.md#tastatur-mit-der-befehlszeile-flashen) beschrieben wird.
|
||||||
|
|
||||||
|
### Lade die Datei in QMK Toolbox
|
||||||
|
|
||||||
|
Beginne damit die Datei in der QMK Toolbox Anwendung zu laden. Versichere dich dass Du die Firmware-Datei im Finder oder Explorer findest. Deine Tastatur-Firmware sollte entweder vom Typ `.hex` oder `.bin` sein sein. QMK sollte die für deine Tastatur entsprechende Datei automatisch in das Root-Verzeichnis (normalerweise `qmk_firmware`) kopieren.
|
||||||
|
|
||||||
|
?> Wenn Du Windows oder macOS benutzt kannst Du mit folgenden Befehlen ganz einfach das aktuelle Firmware-Verzeichnis im Explorer oder Finder öffnen.
|
||||||
|
|
||||||
|
#### Windows:
|
||||||
|
|
||||||
|
``` start . ```
|
||||||
|
|
||||||
|
#### macOS:
|
||||||
|
|
||||||
|
``` open . ```
|
||||||
|
|
||||||
|
Die Firmware-Dateien folgen dabei immer folgendem Schema:
|
||||||
|
|
||||||
|
<meine_Tastatur>_<meine_Tastaturbelegung>.{bin,hex}
|
||||||
|
|
||||||
|
Zum Beispiel würde ein `planck/rev5` mit der `default` Tastaturbelegung folgenden Dateinamen haben:
|
||||||
|
|
||||||
|
planck_rev5_default.hex
|
||||||
|
|
||||||
|
Wenn Du die Firmware-Datei gefunden hast kannst Du sie in das "Local file" ("Lokale Datei") Feld in der QMK Toolbox ziehen, alternativ kannst Du auf "Öffnen" klicken und in das Verzeichnis navigieren indem sich die Firmware-Datei befindet.
|
||||||
|
|
||||||
|
### Die Tastatur in den DFU (Bootloader) Modus versetzen
|
||||||
|
|
||||||
|
Um deine angepasste Firmware auf deine Tastatur zu flashen musst Du diese erst in einen speziellen "flashing"-Modus versetzen. Während die Tastatur in diesem Modus ist kannst Du nicht auf ihr tippen oder sie wie gewohnt als Tastatur benutzen. Es ist wichtig dass der flashing-Prozesses nicht unterbrochen oder die Tastatur ausstöpselst wird, da der Vorgang ansonst wiederholt werden muss.
|
||||||
|
|
||||||
|
Verschiedene Tastaturen verwenden unterschiedliche Methoden um in den Bootloader-Modus zu gelangen. Wenn dein PCB im Moment QMK oder TMK verwendet und Du keine spezifischen Anweisungen erhalten hast probiere die folgenden Methoden in dieser Reihenfolge:
|
||||||
|
|
||||||
|
* Halte beide Shift-Tasten und drücke `Pause`
|
||||||
|
* Halte beide Shift-Tasten und drücke `B`
|
||||||
|
* Entferne deine Tastatur vom Computer, drücke gleichzeitig `Leertaste` und `B`, verbinde die Tastatur wieder mit dem Computer und warte eine Sekunde bevor Du die Tasten wieder loslässt.
|
||||||
|
* Drücke den physischen `RESET`-Knopf auf der Unterseite des PCBs
|
||||||
|
* Suche auf dem PCB den Pin mit dem Label `RESET`, verbinde diesen mit deinem GND-Pin
|
||||||
|
* Suche auf dem PCB den Pin mit dem Label `BOOT0`, verbinde diesen mit GND und schließe die Tastatur wieder an den PC an TODO: DIS IS DANGEROUS!!
|
||||||
|
|
||||||
|
Wenn Du damit erfolgreich warst solltest Du in der QMK Toolbox eine Nachricht sehen die ungefähr so aussieht:
|
||||||
|
|
||||||
|
```
|
||||||
|
*** Clueboard - Clueboard 66% HotSwap disconnected -- 0xC1ED:0x2390
|
||||||
|
*** DFU device connected
|
||||||
|
```
|
||||||
|
|
||||||
|
### Tastatur flashen
|
||||||
|
|
||||||
|
Klicke auf den `Flash`-Knopf in der QMK Toolbox. Die Ausgabe wird ungefähr so aussehen:
|
||||||
|
|
||||||
|
```
|
||||||
|
*** Clueboard - Clueboard 66% HotSwap disconnected -- 0xC1ED:0x2390
|
||||||
|
*** DFU device connected
|
||||||
|
*** Attempting to flash, please don't remove device
|
||||||
|
>>> dfu-programmer atmega32u4 erase --force
|
||||||
|
Erasing flash... Success
|
||||||
|
Checking memory from 0x0 to 0x6FFF... Empty.
|
||||||
|
>>> dfu-programmer atmega32u4 flash qmk_firmware/clueboard_66_hotswap_skully.hex
|
||||||
|
Checking memory from 0x0 to 0x55FF... Empty.
|
||||||
|
0% 100% Programming 0x5600 bytes...
|
||||||
|
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] Success
|
||||||
|
0% 100% Reading 0x7000 bytes...
|
||||||
|
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] Success
|
||||||
|
Validating... Success
|
||||||
|
0x5600 bytes written into 0x7000 bytes memory (76.79%).
|
||||||
|
>>> dfu-programmer atmega32u4 reset
|
||||||
|
|
||||||
|
*** DFU device disconnected
|
||||||
|
*** Clueboard - Clueboard 66% HotSwap connected -- 0xC1ED:0x2390
|
||||||
|
```
|
||||||
|
|
||||||
|
## Tastatur mit der Befehlszeile flashen
|
||||||
|
|
||||||
|
Zunächst solltest Du versuchen herauszufinden welchen Bootlader deine Tastatur benutzt. Diese vier Bootloader sind am Weitesten verbreitet:
|
||||||
|
|
||||||
|
| MCU | Bootloader |
|
||||||
|
| --- | --- |
|
||||||
|
| Pro-Micro und Klone | CATERINA |
|
||||||
|
| Teensy | Halfkay |
|
||||||
|
| OLKB Boards | QMK-DFU |
|
||||||
|
| sonstige atmega32u4 | DFU |
|
||||||
|
|
||||||
|
Auf der Seite [Flash Anleitung und Bootloader Informationen](de/flashing.md) kannst Du mehr über das Thema erfahren.
|
||||||
|
|
||||||
|
Wenn Du weißt welchen Bootloader deine Tastaur verwendet, kannst Du diese Information bei der Kompilation hinzufügen um den Flash-Vorgang mit dem `make`-Befehl zu automatisieren.
|
||||||
|
```rules.mk
|
||||||
|
...
|
||||||
|
BOOTLOADER = caterina
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
### DFU
|
||||||
|
|
||||||
|
Wenn Du den DFU-Bootloader verwendest und Du bereit bist deine Firmware zu kompilieren und zu flashen, öffne ein Befehlszeile und führe folgenden Befehl aus:
|
||||||
|
|
||||||
|
make <meine_Tastatur>:<meine_Tastaturbelegung>:dfu
|
||||||
|
|
||||||
|
Wenn deine Tastaturbelegung z.B den Namen "xzverz" trägt und Du ein rev5 planck flashen möchtest sähe der Befehl wie folgt aus:
|
||||||
|
|
||||||
|
make planck/rev5:xyverz:dfu
|
||||||
|
|
||||||
|
|
||||||
|
Nachdem der Vorgang abgeschlossen ist sollte die Ausgabe ungefähr so aussehen:
|
||||||
|
|
||||||
|
```
|
||||||
|
Linking: .build/planck_rev5_xyverz.elf [OK]
|
||||||
|
Creating load file for flashing: .build/planck_rev5_xyverz.hex [OK]
|
||||||
|
Copying planck_rev5_xyverz.hex to qmk_firmware folder [OK]
|
||||||
|
Checking file size of planck_rev5_xyverz.hex
|
||||||
|
* File size is fine - 18574/28672
|
||||||
|
```
|
||||||
|
|
||||||
|
Wenn dieser Punkt erreicht ist wird das Build-Skript alle 5 Sekunden nach einem DFU Bootloader suchen. Dieser Vorgang wird wiederholt bis er erfolgreich ist oder abgebrochen wird.
|
||||||
|
|
||||||
|
dfu-programmer: no device present.
|
||||||
|
Error: Bootloader not found. Trying again in 5s.
|
||||||
|
|
||||||
|
Wenn diese Nachricht erscheint konnte das Build-Skript den Controller nicht eigenständig in den DFU Modus versetzen (z.B. weil der Modus in rules.mk falsch gesetzt wurde oder ein Problem mit der Hardware besteht), wenn dies eintritt musst Du die oben beschrieben Schritte benutzen um den Controller in den DFU Modus zu versetzen. Danach sollte die Ausgabe ungefähr so aussehen:
|
||||||
|
|
||||||
|
```
|
||||||
|
*** Attempting to flash, please don't remove device
|
||||||
|
>>> dfu-programmer atmega32u4 erase --force
|
||||||
|
Erasing flash... Success
|
||||||
|
Checking memory from 0x0 to 0x6FFF... Empty.
|
||||||
|
>>> dfu-programmer atmega32u4 flash qmk_firmware/clueboard_66_hotswap_skully.hex
|
||||||
|
Checking memory from 0x0 to 0x55FF... Empty.
|
||||||
|
0% 100% Programming 0x5600 bytes...
|
||||||
|
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] Success
|
||||||
|
0% 100% Reading 0x7000 bytes...
|
||||||
|
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] Success
|
||||||
|
Validating... Success
|
||||||
|
0x5600 bytes written into 0x7000 bytes memory (76.79%).
|
||||||
|
>>> dfu-programmer atmega32u4 reset
|
||||||
|
```
|
||||||
|
|
||||||
|
?> Wenn Du mit diesem Schritt Probleme hast (z.B. `dfu-programmer: no device present`) hilft dir hoffentlich der Abschnitt [Häufig gestellte Fragen (Build/Kompilieren)](de/faq_build.md).
|
||||||
|
|
||||||
|
#### DFU Befehle
|
||||||
|
|
||||||
|
Es gibt verschiedene DFU Befehle um die Firmware auf ein DFU Gerät zu flashen:
|
||||||
|
|
||||||
|
* `:dfu` - Dies ist die default Option. Es wird gecheckt ob ein DFU Gerät verfügbar ist, ist dies der Fall wird die Firmware geflasht. Dieser Check wird alle 5 Sekunden ausgeführt bis ein DFU Gerät erkannt wird.
|
||||||
|
* `:dfu-ee` - Der Flash-Vorgang benutzt eine `.eep` Datei anstatt einer `.hex` Datei. Dies ist eher unüblich.
|
||||||
|
* `:dfu-split-left` - Dies flasht die Firmware wie gewohnt (`:dfu`). Allerdings nur die "linke Seite" der EEPROM für geteilte Tastaturen. _Dies ist ideal für auf Elite C basierenden geteilten Tastaturen._
|
||||||
|
* `:dfu-split-right` - Dies flasht die Firmware wie gewohnt (`:dfu`). Allerdings nur die "rechte Seite" der EEPROM für geteilte Tastaturen. _Dies ist ideal für auf Elite C basierenden geteilten Tastaturen._
|
||||||
|
|
||||||
|
|
||||||
|
### Caterina
|
||||||
|
Für Arduinos und andere ProMicro Klone (z.B. SparkFun ProMicro), wenn Du bereit bist zu kompilieren und die Tastatur zu flashen, öffne ein Befehlszeilen-Fenster und führe den Build-Befehl aus:
|
||||||
|
|
||||||
|
make <meine_Tastatur>:<meine_Tastaturbelegung>:avrdude
|
||||||
|
|
||||||
|
Wenn deine Tastaturbelegung zum Beispiel den Namen "xyverz" hat und Du eine Tastaturbelegung für ein "rev2 Lets Split" erzeugen möchtest, lautet der Befehl dafür:
|
||||||
|
|
||||||
|
make lets_split/rev2:xyverz:avrdude
|
||||||
|
|
||||||
|
Nachdem die Kompilation abgeschlossen ist sollte die Ausgabe ungefähr so aussehen:
|
||||||
|
|
||||||
|
```
|
||||||
|
Linking: .build/lets_split_rev2_xyverz.elf [OK]
|
||||||
|
Creating load file for flashing: .build/lets_split_rev2_xyverz.hex [OK]
|
||||||
|
Checking file size of lets_split_rev2_xyverz.hex [OK]
|
||||||
|
* File size is fine - 27938/28672
|
||||||
|
Detecting USB port, reset your controller now..............
|
||||||
|
```
|
||||||
|
|
||||||
|
Nun wird die Tastatur automatisch zurückgesetzt und das Skript wird die Firmware flashen sobald es den Bootloader erkennt. Die Ausgabe sollte ungefähr so aussehen:
|
||||||
|
|
||||||
|
```
|
||||||
|
Detected controller on USB port at /dev/ttyS15
|
||||||
|
|
||||||
|
Connecting to programmer: .
|
||||||
|
Found programmer: Id = "CATERIN"; type = S
|
||||||
|
Software Version = 1.0; No Hardware Version given.
|
||||||
|
Programmer supports auto addr increment.
|
||||||
|
Programmer supports buffered memory access with buffersize=128 bytes.
|
||||||
|
|
||||||
|
Programmer supports the following devices:
|
||||||
|
Device code: 0x44
|
||||||
|
|
||||||
|
avrdude.exe: AVR device initialized and ready to accept instructions
|
||||||
|
|
||||||
|
Reading | ################################################## | 100% 0.00s
|
||||||
|
|
||||||
|
avrdude.exe: Device signature = 0x1e9587 (probably m32u4)
|
||||||
|
avrdude.exe: NOTE: "flash" memory has been specified, an erase cycle will be performed
|
||||||
|
To disable this feature, specify the -D option.
|
||||||
|
avrdude.exe: erasing chip
|
||||||
|
avrdude.exe: reading input file "./.build/lets_split_rev2_xyverz.hex"
|
||||||
|
avrdude.exe: input file ./.build/lets_split_rev2_xyverz.hex auto detected as Intel Hex
|
||||||
|
avrdude.exe: writing flash (27938 bytes):
|
||||||
|
|
||||||
|
Writing | ################################################## | 100% 2.40s
|
||||||
|
|
||||||
|
avrdude.exe: 27938 bytes of flash written
|
||||||
|
avrdude.exe: verifying flash memory against ./.build/lets_split_rev2_xyverz.hex:
|
||||||
|
avrdude.exe: load data flash data from input file ./.build/lets_split_rev2_xyverz.hex:
|
||||||
|
avrdude.exe: input file ./.build/lets_split_rev2_xyverz.hex auto detected as Intel Hex
|
||||||
|
avrdude.exe: input file ./.build/lets_split_rev2_xyverz.hex contains 27938 bytes
|
||||||
|
avrdude.exe: reading on-chip flash data:
|
||||||
|
|
||||||
|
Reading | ################################################## | 100% 0.43s
|
||||||
|
|
||||||
|
avrdude.exe: verifying ...
|
||||||
|
avrdude.exe: 27938 bytes of flash verified
|
||||||
|
|
||||||
|
avrdude.exe: safemode: Fuses OK (E:CB, H:D8, L:FF)
|
||||||
|
|
||||||
|
avrdude.exe done. Thank you.
|
||||||
|
```
|
||||||
|
Sollten dabei Probleme auftreten (z.B. "Zugriff verweigert" / "Permission denied") muss der Make-Befehl mit privilegierten Berechtigungen ausgeführt werden:
|
||||||
|
|
||||||
|
sudo make <meine_Tastatur>:<meine_Tastaturbelegung>:avrdude
|
||||||
|
|
||||||
|
Zusätzlich ist es möglich mehrere Tastaturen in einem Vorgang zu flashen:
|
||||||
|
|
||||||
|
make <keyboard>:<keymap>:avrdude-loop
|
||||||
|
|
||||||
|
Du kannst den Loop mit STRG + C unterbrechen sobald der Vorgang abgeschlossen ist. Die korrekte Tastenkombination kann abweichen und hängt vom Betriebssystem ab.
|
||||||
|
|
||||||
|
|
||||||
|
### HalfKay
|
||||||
|
|
||||||
|
Für Tastaturen mit PJRC Controllern (Teensy's), wenn Du bereit bist zu kompilieren und die Tastatur zu flashen, öffne ein Befehlszeilen-Fenster und führe den Build-Befehl aus:
|
||||||
|
|
||||||
|
make <meine_Tastatur>:<meine_Tastaturbelegung>:teensy
|
||||||
|
|
||||||
|
Wenn deine Tastaturbelegung zum Beispiel den Namen "xyverz" hat und Du eine Tastaturbelegung für ein Ergodox oder Ergodox EZ erzeugen möchtest, lautet der Befehl dafür:
|
||||||
|
|
||||||
|
make ergodox_ez:xyverz:teensy
|
||||||
|
|
||||||
|
Nachdem die Kompilation abgeschlossen ist sollte die Ausgabe ungefähr so aussehen:
|
||||||
|
|
||||||
|
```
|
||||||
|
Linking: .build/ergodox_ez_xyverz.elf [OK]
|
||||||
|
Creating load file for flashing: .build/ergodox_ez_xyverz.hex [OK]
|
||||||
|
Checking file size of ergodox_ez_xyverz.hex [OK]
|
||||||
|
* File size is fine - 25584/32256
|
||||||
|
Teensy Loader, Command Line, Version 2.1
|
||||||
|
Read "./.build/ergodox_ez_xyverz.hex": 25584 bytes, 79.3% usage
|
||||||
|
Waiting for Teensy device...
|
||||||
|
(hint: press the reset button)
|
||||||
|
```
|
||||||
|
|
||||||
|
An diesem Punkt solltest Du die Tastatur zurücksetzen um den Flash-Vorgang auszulösen. Wenn dies abgeschlossen ist sollte die Ausgabe ungefähr so aussehen:
|
||||||
|
|
||||||
|
```
|
||||||
|
Found HalfKay Bootloader
|
||||||
|
Read "./.build/ergodox_ez_xyverz.hex": 28532 bytes, 88.5% usage
|
||||||
|
Programming.............................................................
|
||||||
|
...................................................
|
||||||
|
Booting
|
||||||
|
```
|
||||||
|
|
||||||
|
### BootloadHID
|
||||||
|
|
||||||
|
Für auf Bootmapper Client(BMC)/bootloaderHID/ATmega32A basierende Tastaturen, wenn Du bereit bist zu kompilieren und die Tastatur zu flashen, öffne ein Befehlszeilen-Fenster und führe den Build-Befehl aus:
|
||||||
|
|
||||||
|
make <meine_Tastatur>:<meine_Tastaturbelegung>:bootloaderHID
|
||||||
|
|
||||||
|
Wenn deine Tastaturbelegung zum Beispiel den Namen "xyverz" hat und Du eine Tastaturbelegung für ein jj40 erzeugen möchtest, lautet der Befehl dafür:
|
||||||
|
|
||||||
|
make jj40:xyverz:bootloaderHID
|
||||||
|
|
||||||
|
Nachdem die Kompilation abgeschlossen ist sollte die Ausgabe ungefähr so aussehen:
|
||||||
|
|
||||||
|
```
|
||||||
|
Linking: .build/jj40_default.elf [OK]
|
||||||
|
Creating load file for flashing: .build/jj40_default.hex [OK]
|
||||||
|
Copying jj40_default.hex to qmk_firmware folder [OK]
|
||||||
|
Checking file size of jj40_default.hex [OK]
|
||||||
|
* The firmware size is fine - 21920/28672 (6752 bytes free)
|
||||||
|
```
|
||||||
|
|
||||||
|
Wenn dieser Punkt erreicht ist wird das Build-Skript alle 5 Sekunden nach einem DFU Bootloader suchen. Dieser Vorgang wird wiederholt bis er erfolgreich ist oder abgebrochen wird.
|
||||||
|
|
||||||
|
```
|
||||||
|
Error opening HIDBoot device: The specified device was not found
|
||||||
|
Trying again in 5s.
|
||||||
|
```
|
||||||
|
|
||||||
|
An diesem Punkt solltest Du die Tastatur zurücksetzen um den Flash-Vorgang auszulösen. Wenn dies abgeschlossen ist sollte die Ausgabe ungefähr so aussehen:
|
||||||
|
|
||||||
|
```
|
||||||
|
Page size = 128 (0x80)
|
||||||
|
Device size = 32768 (0x8000); 30720 bytes remaining
|
||||||
|
Uploading 22016 (0x5600) bytes starting at 0 (0x0)
|
||||||
|
0x05580 ... 0x05600
|
||||||
|
```
|
||||||
|
|
||||||
|
### STM32 (ARM)
|
||||||
|
|
||||||
|
Für die meisten ARM Tastaturen (inkl. Proton C, Planck Rev 6 und Preonic Rev 3), wenn Du bereit bist zu kompilieren und die Tastatur zu flashen, öffne ein Befehlszeilen-Fenster und führe den Build-Befehl aus:
|
||||||
|
|
||||||
|
make <meine_Tastatur>:<meine_Tastaturbelegung>:dfu-util
|
||||||
|
|
||||||
|
Wenn deine Tastaturbelegung zum Beispiel den Namen "xyverz" hat und Du eine Tastaturbelegung für ein Planck Revision 6 erzeugen möchtest, benutze dafür den folgenden Befehl und reboote die Tastatur in den Bootloader (kurz bevor der Kompiliervorgang abgeschlossen ist):
|
||||||
|
|
||||||
|
make planck/rev6:xyverz:dfu-util
|
||||||
|
|
||||||
|
Nachdem der Kompiliervorgang abgeschlossen ist sollte die Ausgabe ungefähr so aussehen:
|
||||||
|
|
||||||
|
Für auf Bootmapper Client(BMC)/bootloaderHID/ATmega32A basierende Tastaturen, wenn Du bereit bist zu kompilieren und die Tastatur zu flashen, öffne ein Befehlszeilen-Fenster und führe den Build-Befehl aus:
|
||||||
|
|
||||||
|
make <meine_Tastatur>:<meine_Tastaturbelegung>:bootloaderHID
|
||||||
|
|
||||||
|
Wenn deine Tastaturbelegung zum Beispiel den Namen "xyverz" hat und Du eine Tastaturbelegung für ein jj40 erzeugen möchtest, lautet der Befehl dafür:
|
||||||
|
```
|
||||||
|
Linking: .build/planck_rev6_xyverz.elf [OK]
|
||||||
|
Creating binary load file for flashing: .build/planck_rev6_xyverz.bin [OK]
|
||||||
|
Creating load file for flashing: .build/planck_rev6_xyverz.hex [OK]
|
||||||
|
|
||||||
|
Size after:
|
||||||
|
text data bss dec hex filename
|
||||||
|
0 41820 0 41820 a35c .build/planck_rev6_xyverz.hex
|
||||||
|
|
||||||
|
Copying planck_rev6_xyverz.bin to qmk_firmware folder [OK]
|
||||||
|
dfu-util 0.9
|
||||||
|
|
||||||
|
Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
|
||||||
|
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
|
||||||
|
This program is Free Software and has ABSOLUTELY NO WARRANTY
|
||||||
|
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/
|
||||||
|
|
||||||
|
Invalid DFU suffix signature
|
||||||
|
A valid DFU suffix will be required in a future dfu-util release!!!
|
||||||
|
Opening DFU capable USB device...
|
||||||
|
ID 0483:df11
|
||||||
|
Run-time device DFU version 011a
|
||||||
|
Claiming USB DFU Interface...
|
||||||
|
Setting Alternate Setting #0 ...
|
||||||
|
Determining device status: state = dfuERROR, status = 10
|
||||||
|
dfuERROR, clearing status
|
||||||
|
Determining device status: state = dfuIDLE, status = 0
|
||||||
|
dfuIDLE, continuing
|
||||||
|
DFU mode device DFU version 011a
|
||||||
|
Device returned transfer size 2048
|
||||||
|
DfuSe interface name: "Internal Flash "
|
||||||
|
Downloading to address = 0x08000000, size = 41824
|
||||||
|
Download [=========================] 100% 41824 bytes
|
||||||
|
Download done.
|
||||||
|
File downloaded successfully
|
||||||
|
Transitioning to dfuMANIFEST state
|
||||||
|
```
|
||||||
|
|
||||||
|
#### STM32 Befehle
|
||||||
|
|
||||||
|
Für Tastaturen mit STM32 Controller sind die DFU Befehle wie folgt:
|
||||||
|
|
||||||
|
* `:dfu-util` - The default command for flashing to STM32 devices.
|
||||||
|
* `:dfu-util` - Der Standard-Befehl für STM32 Geräte.
|
||||||
|
* `:dfu-util-wait` - Funktioniert wie der Standard-Befehl, aber mit einem 10 Sekunden Timeout bevor erneut versucht wird die Firmware zu flashen. Mit dem Parameter `TIME_DELAY=20` auf der Befehlszeile kann der Timeout beeinflusst werden.
|
||||||
|
* z.B.: `make <meine_Tastatur>:<meine_Tastaturbelegung>:dfu-util TIME_DELAY=5`
|
||||||
|
* `:dfu-util-split-left` - Gleiche Funktionsweise wie `dfu-util`, jedoch wird zusätzlich das EEPROM Setting "linke Seite" für geteilte Tastaturen gesetzt.
|
||||||
|
* `:dfu-util-split-right` - Gleiche Funktionsweise wie `dfu-util`, jedoch wird zusätzlich das EEPROM Setting "rechte Seite" für geteilte Tastaturen gesetzt.
|
||||||
|
|
||||||
|
## Probier's aus!
|
||||||
|
|
||||||
|
Herzlichen Glückwunsch! Deine individuell angepasst Firmware wurde auf deine Tastatur übertragen!
|
||||||
|
|
||||||
|
Probiere deine neue Tastatur aus und gehe sicher dass alles wie gewünscht funktioniert. Wir haben einen weiteren Artikel zum Thema [Testen und Debuggen](de/newbs_testing_debugging.md) verfasst der sich mit Problembeseitigung beschäftigt um den Beginnger-Guide abzuschließen.
|
101
docs/de/newbs_getting_started.md
Normal file
101
docs/de/newbs_getting_started.md
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
# Einleitung
|
||||||
|
Genau wie in einem Computer befindet sich auch in einer Tastatur ein Prozessor.
|
||||||
|
|
||||||
|
Dieser Prozessor führt Software aus, die registriert wenn Tasten gedrückt bzw. wieder losgelassen werden und leitet die entsprechenden Signale an den Computer weiter.
|
||||||
|
|
||||||
|
QMK übernimmt die Rolle dieser Software und teilt dem Host-Computer den aktuellen Zustand der Tastatur mit. Wenn Du eine Tastaturbelegung definierst, ist dies äquivalent zu einem ausführbarem Programm, das auf deiner Tastatur läuft.
|
||||||
|
|
||||||
|
QMK möchte seine BenutzerInnen in die Lage versetzen, simple Aufgaben möglichst einfach zu gestalten und gleichzeitig komplexe Dinge zu ermöglichen, die mit normalen Tastaturen ohne zusätzliche Software undenkbar wären. Du musst nicht programmieren können, um abgefahrene Tastaturbelegungen zu gestalten - es reicht wenn Du eine Idee hast und ein paar einfache syntaktische Regeln verstehen kannst.
|
||||||
|
|
||||||
|
# Los geht's!
|
||||||
|
Bevor Du damit loslegen kannst, deine Tastaturbelegung zu erstellen, musst Du ein wenig Software installieren und Dir eine Entwicklungsumgebung aufsetzen. Die gute Nachricht ist, dass das nur einmal erledigt werden muss, egal für wie viele verschiedene Tastaturen Du hinterher Firmware entwickeln willst.
|
||||||
|
|
||||||
|
Wenn Du es vorziehst mit einer grafischen Oberfläche zu entwickeln kannst Du auch dazu gerne direkt mit dem online [QMK Konfigurator](https://config.qmk.fm) loslegen. Siehe auch: [Firmware mit der Online GUI erzeugen](de/newbs_building_firmware_configurator.md)
|
||||||
|
|
||||||
|
## Software herunterladen
|
||||||
|
|
||||||
|
### Text Editor
|
||||||
|
|
||||||
|
Du wirst ein Programm benötigen, mit dem Du **plain text** (= reiner Text) Dateien bearbeiten und speichern kannst. Wenn Du Windows benutzt, reicht dafür schon das normale `Notepad` und für Linux z.B. `gedit` oder `leafpad`. Beide sind sehr rudimentäre Editoren deren Funktionsumfang aber vollkommen ausreicht. Für macOS' standard `TextEdit` muss man ein bisschen vorsichtig sein und darauf achten, beim Speichern explizit unter _Format_ die Option _Reiner Text_ auszuwählen.
|
||||||
|
|
||||||
|
Ansonsten ist es empfehlenswert, einen Editor herunterzuladen der für die Programmierung und das Bearbeiten von Code ausgelegt ist wie z.b [Notepad++](http://notepad-plus-plus.org/), [Sublime Text](https://www.sublimetext.com/) oder [VS Code](https://code.visualstudio.com/).
|
||||||
|
|
||||||
|
?> Immer noch unsicher, welcher Text Editor der Richtige für Dich ist? Laurence Bradford hat eine hervorragende [Einleitung](https://learntocodewith.me/programming/basics/text-editors/) zu dem Thema geschrieben (auf Englisch).
|
||||||
|
|
||||||
|
### QMK Toolbox
|
||||||
|
|
||||||
|
QMK Toolbox ist ein optionales grafisches Programm für Windows und macOS, das es erleichtern soll, deine Tastatur zu programmieren und zu debuggen. Du wirst es höchstwahrscheinlich früher oder später als unverzichtbar ansehen, wenn es darum geht eine Tastatur einfach zu flashen oder zu debuggen, da es ermöglicht, sich debug-Nachrichten direkt anzeigen zu lassen.
|
||||||
|
|
||||||
|
[Hier kannst Du die aktuelle Version herunterladen.](https://github.com/qmk/qmk_toolbox/releases/latest)
|
||||||
|
|
||||||
|
* Für Windows: `qmk_toolbox.exe` (portable) oder `qmk_toolbox_install.exe` (installer)
|
||||||
|
* Für macOS: `QMK.Toolbox.app.zip` (portable) oder `QMK.Toolbox.pkg` (installer)
|
||||||
|
|
||||||
|
## Die Entwicklungsumgebung aufsetzen
|
||||||
|
|
||||||
|
|
||||||
|
Wir haben versucht, die Installation der Entwicklungsumgebung für QMK so einfach wie möglich zu gestalten. Alles, was Du tun musst, ist eine Linux oder Unix Umgebung aufzusetzen, danach macht QMK den Rest.
|
||||||
|
|
||||||
|
?> Wenn Du das erste Mal mit der Linux/Unix Befehlszeile arbeitest, schadet es nicht, sich mit ein paar Grundlagen und Befehlen vertraut zu machen. Diese Ressourcen sollten ausreichen, um sich das Nötigste anzueignen um mit QMK arbeiten zu können:<br>
|
||||||
|
[Erforderliche Linux Grundlagen](https://www.guru99.com/must-know-linux-commands.html)<br>
|
||||||
|
[Noch ein paar Linux Befehle](https://www.tjhsst.edu/~dhyatt/superap/unixcmd.html)
|
||||||
|
|
||||||
|
### Windows
|
||||||
|
|
||||||
|
Du wirst MSYS2 (o.Ä.) und Git benötigen.
|
||||||
|
|
||||||
|
* Befolge die Installationsanleitung auf der [MSYS2 Homepage](http://www.msys2.org)
|
||||||
|
* Schließe alle offenen MSYS2 Fenster und öffne ein neues MSYS2 MinGW 64-bit Terminal
|
||||||
|
* Installiere Git mit dem Kommando: `pacman -S git`
|
||||||
|
|
||||||
|
### macOS
|
||||||
|
|
||||||
|
Du wirst Homebrew benötigen. Folge dafür den Anweisungen auf der [Homebrew homepage](https://brew.sh).
|
||||||
|
|
||||||
|
Nachdem Homebrew erfolgreich installiert ist, kannst Du mit _QMK aufsetzen_ fortfahren.
|
||||||
|
|
||||||
|
### Linux
|
||||||
|
|
||||||
|
Du benötigst Git, aber es ist ziemlich wahrscheinlich, dass es bereits installiert ist. Sollte dies nicht der Fall sein, kannst Du es mit dem folgenden Aufruf installieren:
|
||||||
|
|
||||||
|
* Debian / Ubuntu / Devuan: `apt-get install git`
|
||||||
|
* Fedora / Red Hat / CentOS: `yum install git`
|
||||||
|
* Arch Linux: `pacman -S git`
|
||||||
|
|
||||||
|
?> Docker ist ebenfalls eine Option für alle Plattformen. [Hier](de/getting_started_build_tools.md#docker) kannst Du dazu weitere Informationen finden.
|
||||||
|
|
||||||
|
## QMK aufsetzen
|
||||||
|
Wenn Du damit fertig bist, deine Linux/Unix Umgebung zu installieren, kannst Du damit fortfahren QMK herunterzuladen. Dafür werden wir mit Git das QMK Repository "klonen". Öffne ein Terminal oder ein MSYS2 MinGW Fenster, dies wirst Du für den Rest der Anleitung benötigen. In diesem Fenster rufst Du nun die beiden folgenden Kommandos auf:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
git clone --recurse-submodules https://github.com/qmk/qmk_firmware.git
|
||||||
|
cd qmk_firmware
|
||||||
|
```
|
||||||
|
?> Wenn Du bereits weißt, [wie man GitHub benutzt](de/getting_started_github.md), empfehlen wir, dass Du Dir ein eigenen Fork erstellst. Wenn Du nicht weißt, was das bedeuten soll, kannst Du diesen Ratschlag getrost ignorieren.
|
||||||
|
|
||||||
|
QMK liefert ein Script mit, das helfen soll, Dir alles Weitere abzunehmen. Du kannst es mit dem folgenden Befehl aufrufen:
|
||||||
|
|
||||||
|
util/qmk_install.sh
|
||||||
|
|
||||||
|
## Die Build-Umgebung testen
|
||||||
|
|
||||||
|
Nun sollte hoffentlich alles Nötige für eine funktionierende QMK Build-Umgebung installiert sein und Du solltest in der Lage sein, die QMK-Firmware zu kompilieren. Um dies mit einer `default` Tastaturbelegung zu testen, kannst Du den folgenden Befehl ausprobieren:
|
||||||
|
|
||||||
|
make <keyboard>:default
|
||||||
|
|
||||||
|
Der Befehl um z.B. die Firmware für ein _Clueboard 66%_ zu erzeugen lautet:
|
||||||
|
|
||||||
|
make clueboard/66/rev3:default
|
||||||
|
|
||||||
|
Wenn es fertig ist, sollte der Output ungefähr so ähnlich wie das Folgende aussehen:
|
||||||
|
|
||||||
|
```
|
||||||
|
Linking: .build/clueboard_66_rev3_default.elf [OK]
|
||||||
|
Creating load file for flashing: .build/clueboard_66_rev3_default.hex [OK]
|
||||||
|
Copying clueboard_66_rev3_default.hex to qmk_firmware folder [OK]
|
||||||
|
Checking file size of clueboard_66_rev3_default.hex [OK]
|
||||||
|
* The firmware size is fine - 26356/28672 (2316 bytes free)
|
||||||
|
```
|
||||||
|
|
||||||
|
# Eine eigene Tastaturbelegung erstellen
|
||||||
|
Du bist nun fertig mit dem Setup der Entwicklungsumgebung und solltest somit in der Lage sein, deine eigenen Tastaturbelegungen zu erstellen. Um fortzufahren, folge bitte der nächsten Anleitung unter [Die erste Firmware](de/newbs_building_firmware.md).
|
14
docs/de/newbs_learn_more_resources.md
Normal file
14
docs/de/newbs_learn_more_resources.md
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
# Lernmaterial
|
||||||
|
|
||||||
|
Diese weiterführenden Ressourcen sind darauf ausgerichtet, Neulingen der QMK Commmunity mehr Informationen und ein besseres Verständnis zu einzelnen Themen zu bieten.
|
||||||
|
|
||||||
|
Git Ressourcen:
|
||||||
|
|
||||||
|
* [Gutes allgemeines Tutorial](https://www.codecademy.com/learn/learn-git) (auf Englisch)
|
||||||
|
* [Git spielerisch anhand von Beispielen lernen](https://learngitbranching.js.org/) (auf Englisch)
|
||||||
|
* [Mehr über den allgemeinen Umgang mit Github](getting_started_github.md)
|
||||||
|
* [Mehr über Git im Bezug zu QMK](contributing.md)
|
||||||
|
|
||||||
|
Mehr über die Arbeit mit der Befehlszeile:
|
||||||
|
|
||||||
|
* [Gutes allgemeines Tutorial über die Arbeit mit der Befehlszeile](https://www.codecademy.com/learn/learn-the-command-line) (auf Englisch)
|
100
docs/de/newbs_testing_debugging.md
Normal file
100
docs/de/newbs_testing_debugging.md
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
# Testen und Debuggen
|
||||||
|
|
||||||
|
Nachdem Du deine Tastatur mit deiner angepassten Firmware geflasht hast, ist es nun an der Zeit sie auszuprobieren. Mit ein bisschen Glück sollte alles ohne Probleme funktionieren, wenn dies nicht der Fall ist, soll dieses Dokument dir dabei helfen, herauszufinden wo das Problem liegt.
|
||||||
|
|
||||||
|
## Testen
|
||||||
|
|
||||||
|
Die Tastatur zu testen ist relativ selbsterklärend. Drücke jede der Tasten um dich zu versichern, dass der gesendete Keyode der ist, den du erwarten würdest. Dafür gibt es sogar ein paar Programme die helfen sollen, dass keine Taste ausgelassen wurde.
|
||||||
|
|
||||||
|
Anmerkung: Diese Programme werden weder von QMK bereitgestellt oder gutgeheißen.
|
||||||
|
|
||||||
|
* [Switch Hitter](https://elitekeyboards.com/switchhitter.php) (Nur für Windows)
|
||||||
|
* [Keyboard Viewer](https://www.imore.com/how-use-keyboard-viewer-your-mac) (Nur für Mac)
|
||||||
|
* [Keyboard Tester](http://www.keyboardtester.com) (Web basiert)
|
||||||
|
* [Keyboard Checker](http://keyboardchecker.com) (Web basiert)
|
||||||
|
|
||||||
|
## Debuggen
|
||||||
|
|
||||||
|
Deine Tastatur wird Debug Informationen liefern wenn Du `CONSOLE_ENABLE = yes` in deiner `rules.mk` gesetzt hast. Die default-Ausgabe ist sehr beschränkt und kann wenn nötig durch die Aktivierung des Debug-Modes erhöht werden. Benutze dafür entweder den `DEBUG` Keycode in deiner Tastaturbelegung, das [Command](de/feature_command.md)-Feature oder füge den folgenden Code zu deiner Tastaturbelegung hinzu.
|
||||||
|
|
||||||
|
```c
|
||||||
|
void keyboard_post_init_user(void) {
|
||||||
|
// Customise these values to desired behaviour
|
||||||
|
debug_enable=true;
|
||||||
|
debug_matrix=true;
|
||||||
|
//debug_keyboard=true;
|
||||||
|
//debug_mouse=true;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Debuggen mit der QMK Toolbox
|
||||||
|
|
||||||
|
Für kompatible Plattformen kann die [QMK Toolbox](https://github.com/qmk/qmk_toolbox) benutzt werden um Debug-Nachrichten deiner Tastatur anzuzeigen.
|
||||||
|
|
||||||
|
### Debuggen mit hid_listen
|
||||||
|
|
||||||
|
Bevorzugst Du es lieber auf der Befehlszeile zu debuggen? Dafür eignet sich das Programm [hid_listen](https://www.pjrc.com/teensy/hid_listen.html) von PJRC. Binaries sind für Windows, Linux und MacOS verfügbar.
|
||||||
|
|
||||||
|
<!-- FIXME: Describe the debugging messages here. -->
|
||||||
|
|
||||||
|
## Eigene Debug-Nachrichten senden
|
||||||
|
|
||||||
|
Manchmal ist es hilfreich Debug-Nachrichten innerhalb deines eigenen [Custom Codes](de/custom_quantum_functions.md) zu drucken. Das ist ziemlich einfach. Beginne damit `print.h` am Anfang deiner Datei zu inkludieren:
|
||||||
|
|
||||||
|
#include <print.h>
|
||||||
|
|
||||||
|
Danach stehen dir verschiedene Druck-Funktionen zur Verfügung:
|
||||||
|
|
||||||
|
* `print("string")`: Druckt einen simplen String
|
||||||
|
* `uprintf("%s string", var)`: Druckt einen formatierten String
|
||||||
|
* `dprint("string")` Druckt einen simplen String, aber nur wenn der Debug-Mode aktiviert ist
|
||||||
|
* `dprintf("%s string", var)`: Druckt einen formatierten String, aber nur wenn der Debug-Mode aktiviert ist
|
||||||
|
|
||||||
|
## Debug Beispiele
|
||||||
|
|
||||||
|
Anbei findest Du eine Sammlung von hilfreichen Beispielen. Für weitere Informationen Informationen sei an dieser Stelle auf [Debugging/Troubleshooting QMK](de/faq_debug.md) verwiesen.
|
||||||
|
|
||||||
|
### Which matrix position is this keypress?
|
||||||
|
### Welche Matrix Position hat dieser Tastenanschlag
|
||||||
|
|
||||||
|
Beim Portieren, oder bei der Fehlerdiagnose von PCB Problemen, ist es nützlich sich anzeigen zu lassen ob ein Tastenanschlag richtig erkannt wurde. Um die Protokollierung für diesen Fall zu aktivieren, füge bitte folgenden Code zu deiner Tastaturbelegung `keymap.c` hinzu.
|
||||||
|
|
||||||
|
```c
|
||||||
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
// Wenn 'console' aktiviert ist wird die Matrix-Position und der Status jedes Tastenanschlags ausgegeben
|
||||||
|
#ifdef CONSOLE_ENABLE
|
||||||
|
uprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed);
|
||||||
|
#endif
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Beispiel Ausgabe:
|
||||||
|
```text
|
||||||
|
Waiting for device:.......
|
||||||
|
Listening:
|
||||||
|
KL: kc: 169, col: 0, row: 0, pressed: 1
|
||||||
|
KL: kc: 169, col: 0, row: 0, pressed: 0
|
||||||
|
KL: kc: 174, col: 1, row: 0, pressed: 1
|
||||||
|
KL: kc: 174, col: 1, row: 0, pressed: 0
|
||||||
|
KL: kc: 172, col: 2, row: 0, pressed: 1
|
||||||
|
KL: kc: 172, col: 2, row: 0, pressed: 0
|
||||||
|
```
|
||||||
|
|
||||||
|
### Wieviel Zeit wurde benötigt um einen Tastenanschlag zu detektieren?
|
||||||
|
|
||||||
|
Wenn Performance-Probleme auftreten ist es hilfreich die Frequenz, mit der die Matrix gescannt wird, zu wissen. Um dies in diesem Fall zu aktiveren füge, den folgenden Code zu deiner Tastaturbelegung in `config.h` hinzu.
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define DEBUG_MATRIX_SCAN_RATE
|
||||||
|
```
|
||||||
|
|
||||||
|
Beispiel Ausgabe
|
||||||
|
```text
|
||||||
|
> matrix scan frequency: 315
|
||||||
|
> matrix scan frequency: 313
|
||||||
|
> matrix scan frequency: 316
|
||||||
|
> matrix scan frequency: 316
|
||||||
|
> matrix scan frequency: 316
|
||||||
|
> matrix scan frequency: 316
|
||||||
|
```
|
|
@ -28,9 +28,9 @@ the Ctrl, Alt, or GUI modifiers are held down.
|
||||||
|
|
||||||
A compact 40% (12x4) ortholinear keyboard kit made and sold by OLKB and Massdrop. [More info on qmk.fm](http://qmk.fm/planck/)
|
A compact 40% (12x4) ortholinear keyboard kit made and sold by OLKB and Massdrop. [More info on qmk.fm](http://qmk.fm/planck/)
|
||||||
|
|
||||||
Keyboard Maintainer: [Jack Humbert](https://github.com/jackhumbert)
|
* Keyboard Maintainer: [Jack Humbert](https://github.com/jackhumbert)
|
||||||
Hardware Supported: Planck PCB rev1, rev2, rev3, rev4, Teensy 2.0
|
* Hardware Supported: Planck PCB rev1, rev2, rev3, rev4, Teensy 2.0
|
||||||
Hardware Availability: [OLKB.com](https://olkb.com), [Massdrop](https://www.massdrop.com/buy/planck-mechanical-keyboard?mode=guest_open)
|
* Hardware Availability: [OLKB.com](https://olkb.com), [Massdrop](https://www.massdrop.com/buy/planck-mechanical-keyboard?mode=guest_open)
|
||||||
|
|
||||||
Make example for this keyboard (after setting up your build environment):
|
Make example for this keyboard (after setting up your build environment):
|
||||||
|
|
||||||
|
@ -38,5 +38,3 @@ Make example for this keyboard (after setting up your build environment):
|
||||||
|
|
||||||
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
|
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
|
||||||
```
|
```
|
||||||
|
|
||||||
There needs to be two spaces at the end of the `Keyboard Maintainer` and `Hardware Supported` lines for it to render correctly with Markdown.
|
|
||||||
|
|
48
docs/driver_installation_zadig.md
Normal file
48
docs/driver_installation_zadig.md
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
# Bootloader Driver Installation with Zadig
|
||||||
|
|
||||||
|
QMK presents itself to the host as a regular HID keyboard device, and as such requires no special drivers. However, in order to flash your keyboard on Windows, the bootloader device that appears when you reset the board often *does*.
|
||||||
|
|
||||||
|
There are two notable exceptions: the Caterina bootloader, usually seen on Pro Micros, and the HalfKay bootloader shipped with PJRC Teensys, appear as a serial port and a generic HID device respectively, and so do not require a driver.
|
||||||
|
|
||||||
|
We recommend the use of the [Zadig](https://zadig.akeo.ie/) utility. If you have set up the development environment with MSYS2 or WSL, the `qmk_install.sh` script will have asked if you want it to install the drivers for you.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Put your keyboard into bootloader mode, either by hitting the `RESET` keycode (which may be on a different layer), or by pressing the reset switch that's usually located on the underside of the board. If your keyboard has neither, try holding Escape or Space+`B` as you plug it in (see the [Bootmagic](feature_bootmagic.md) docs for more details). Some boards use [Command](feature_command.md) instead of Bootmagic; in this case, you can enter bootloader mode by hitting Left Shift+Right Shift+`B` or Left Shift+Right Shift+Escape at any point while the keyboard is plugged in.
|
||||||
|
Some keyboards may have specific instructions for entering the bootloader. For example, the [Bootmagic Lite](feature_bootmagic.md#bootmagic-lite) key (default: Escape) might be on a different key, e.g. Left Control; or the magic combination for Command (default: Left Shift+Right Shift) might require you to hold something else, e.g. Left Control+Right Control. Refer to the board's README file if you are unsure.
|
||||||
|
|
||||||
|
To put a device in bootloader mode with USBaspLoader, tap the `RESET` button while holding down the `BOOT` button.
|
||||||
|
Alternatively, hold `BOOT` while inserting the USB cable.
|
||||||
|
|
||||||
|
Zadig will automatically detect the bootloader device. You may sometimes need to check **Options → List All Devices**.
|
||||||
|
|
||||||
|
- For keyboards with Atmel AVR MCUs, the bootloader will be named something similar to `ATm32U4DFU`, and have a Vendor ID of `03EB`.
|
||||||
|
- USBasp bootloaders will appear as `USBasp`, with a VID/PID of `16C0:05DC`.
|
||||||
|
- AVR keyboards flashed with the QMK-DFU bootloader will be named `<keyboard name> Bootloader` and will also have the VID `03EB`.
|
||||||
|
- For most ARM keyboards, it will be called `STM32 BOOTLOADER`, and have a VID/PID of `0483:DF11`.
|
||||||
|
|
||||||
|
!> If Zadig lists one or more devices with the `HidUsb` driver, your keyboard is probably not in bootloader mode. The arrow will be colored orange and you will be asked to confirm modifying a system driver. **Do not** proceed if this is the case!
|
||||||
|
|
||||||
|
If the arrow appears green, select the driver, and click **Install Driver**. The `libusb-win32` driver will usually work for AVR, and `WinUSB` for ARM, but if you still cannot flash the board, try installing a different driver from the list. For flashing a USBaspLoader device via command line with msys2, the `libusbk` driver is recommended, otherwise `libusb-win32` will work fine if you are using QMK Toolbox for flashing.
|
||||||
|
|
||||||
|
![Zadig with a bootloader driver correctly installed](https://i.imgur.com/b8VgXzx.png)
|
||||||
|
|
||||||
|
Finally, unplug and replug the keyboard to make sure the new driver has been loaded. If you are using the QMK Toolbox to flash, exit and restart it too, as it can sometimes fail to recognize the driver change.
|
||||||
|
|
||||||
|
## Recovering from Installation to Wrong Device
|
||||||
|
|
||||||
|
If you find that you can no longer type with the keyboard, you may have accidentally replaced the driver for the keyboard itself instead of for the bootloader. This can happen when the keyboard is not in the bootloader mode. You can easily confirm this in Zadig - a healthy keyboard has the `HidUsb` driver installed on all of its interfaces:
|
||||||
|
|
||||||
|
![A healthy keyboard as seen by Zadig](https://i.imgur.com/Hx0E5kC.png)
|
||||||
|
|
||||||
|
Open the Device Manager and look for a device that looks like your keyboard.
|
||||||
|
|
||||||
|
![The board with the wrong driver installed, in Device Manager](https://i.imgur.com/L3wvX8f.png)
|
||||||
|
|
||||||
|
Right-click it and hit **Uninstall device**. Make sure to tick **Delete the driver software for this device** first.
|
||||||
|
|
||||||
|
![The Device Uninstall dialog, with the "delete driver" checkbox ticked](https://i.imgur.com/aEs2RuA.png)
|
||||||
|
|
||||||
|
Click **Action → Scan for hardware changes**. At this point, you should be able to type again. Double check in Zadig that the keyboard device(s) are using the `HidUsb` driver. If so, you're all done, and your board should be functional again!
|
||||||
|
|
||||||
|
?> A full reboot of your computer may sometimes be necessary at this point, to get Windows to pick up the new driver.
|
32
docs/es/README.md
Normal file
32
docs/es/README.md
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
# Firmware Quantum Mechanical Keyboard
|
||||||
|
|
||||||
|
[![Versión actual](https://img.shields.io/github/tag/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/tags)
|
||||||
|
[![Estado de Build](https://travis-ci.org/qmk/qmk_firmware.svg?branch=master)](https://travis-ci.org/qmk/qmk_firmware)
|
||||||
|
[![Discord](https://img.shields.io/discord/440868230475677696.svg)](https://discord.gg/Uq7gcHh)
|
||||||
|
[![Estado de la documentación](https://img.shields.io/badge/docs-ready-orange.svg)](https://docs.qmk.fm)
|
||||||
|
[![Contribuyentes en GitHub](https://img.shields.io/github/contributors/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/pulse/monthly)
|
||||||
|
[![Forks en GitHub](https://img.shields.io/github/forks/qmk/qmk_firmware.svg?style=social&label=Fork)](https://github.com/qmk/qmk_firmware/)
|
||||||
|
|
||||||
|
## ¿Qué es el firmware QMK?
|
||||||
|
|
||||||
|
QMK (*Quantum Mechanical Keyboard*) es una comunidad open source que mantiene el firmware QMK, QMK Toolbox, qmk.fm, y estos documentos. El firmware QMK es un firmware para teclados basado en [tmk\_keyboard](http://github.com/tmk/tmk_keyboard) con algunas características útiles para controladores Atmel AVR, y más específicamente, la [línea de productos OLKB](http://olkb.com), el teclado [ErgoDox EZ](http://www.ergodox-ez.com), y la [línea de productos Clueboard](http://clueboard.co/). También ha sido portado a chips ARM chips usando ChibiOS. Lo puedes utilizar para manejar tu propio teclado ya sea cableado a mano o basado en una PCB personalizada.
|
||||||
|
|
||||||
|
## Cómo conseguirlo
|
||||||
|
|
||||||
|
Si estás pensando en contribuir con un keymap, teclado, or característica a QMK, la manera más sencilla es hacer un [fork del repositorio en Github](https://github.com/qmk/qmk_firmware#fork-destination-box), y clonar tu repositorio localmente para hacer los cambios, subirlos, y abir un [Pull Request](https://github.com/qmk/qmk_firmware/pulls) desde tu fork.
|
||||||
|
|
||||||
|
De cualquier manera, también puedes descargarlo directamente en formatos ([zip](https://github.com/qmk/qmk_firmware/zipball/master), [tar](https://github.com/qmk/qmk_firmware/tarball/master)), o clonarlo via git (`git@github.com:qmk/qmk_firmware.git`), o https (`https://github.com/qmk/qmk_firmware.git`).
|
||||||
|
|
||||||
|
## Cómo compilar
|
||||||
|
|
||||||
|
Antes de poder compilar, necesitarás [instalar un entorno](getting_started_build_tools.md) para el desarrollo de AVR y/o ARM. Una vez hayas completado este paso, usarás el comando `make` para compilar un teclado y keymap con la siguiente notación:
|
||||||
|
|
||||||
|
make planck/rev4:default
|
||||||
|
|
||||||
|
Este ejemplo compilaría la revisión `rev4` del teclado `planck` con el keymap `default`. No todos los teclados tienen revisiones (también llamados subproyectos o carpetas), en ese caso, se puede omitir:
|
||||||
|
|
||||||
|
make preonic:default
|
||||||
|
|
||||||
|
## Cómo personalizar
|
||||||
|
|
||||||
|
QMK tiene montones de [características](features.md) para explorar, y una buena cantidad de [documentación de referencia](http://docs.qmk.fm) en la que sumergirse. Se pueden sacar provecho de la mayoría de las características modificando tu [keymap](keymap.md), y cambiando los [keycodes](keycodes.md).
|
121
docs/es/_summary.md
Normal file
121
docs/es/_summary.md
Normal file
|
@ -0,0 +1,121 @@
|
||||||
|
* [Guía completa para novatos](newbs.md)
|
||||||
|
* [Empezando](newbs_getting_started.md)
|
||||||
|
* [Construyendo tu primer firmare](newbs_building_firmware.md)
|
||||||
|
* [Flasheando el firmware](newbs_flashing.md)
|
||||||
|
* [Testeando y depurando ](newbs_testing_debugging.md)
|
||||||
|
* [Mejores práticas](newbs_best_practices.md)
|
||||||
|
* [Recursos de aprendizaje](newbs_learn_more_resources.md)
|
||||||
|
|
||||||
|
* [QMK Basics](README.md)
|
||||||
|
* [Introducción a QMK](getting_started_introduction.md)
|
||||||
|
* [QMK CLI](cli.md)
|
||||||
|
* [Configuración de QMK CLI](cli_configuration.md)
|
||||||
|
* [Contribuyendo a QMK](contributing.md)
|
||||||
|
* [Cómo usar Github](getting_started_github.md)
|
||||||
|
* [Obtener ayuda](getting_started_getting_help.md)
|
||||||
|
|
||||||
|
* [Cambios incompatibles](breaking_changes.md)
|
||||||
|
* [30 Ago 2019](ChangeLog/20190830.md)
|
||||||
|
|
||||||
|
* [Preguntas frecuentes](faq.md)
|
||||||
|
* [General](faq_general.md)
|
||||||
|
* [Construir/Compilar QMK](faq_build.md)
|
||||||
|
* [Depurando/Encontrando problemas en QMK](faq_debug.md)
|
||||||
|
* [Keymap](faq_keymap.md)
|
||||||
|
* [Instalación de drivers con Zadig](driver_installation_zadig.md)
|
||||||
|
|
||||||
|
* Guías detalladas
|
||||||
|
* [Instalar herramientas construcción](getting_started_build_tools.md)
|
||||||
|
* [Guía Vagrant](getting_started_vagrant.md)
|
||||||
|
* [Instrucciones de Construcción/Compilado](getting_started_make_guide.md)
|
||||||
|
* [Flasheando Firmware](flashing.md)
|
||||||
|
* [Personalizando funcionalidad](custom_quantum_functions.md)
|
||||||
|
* [Visión general del Keymap](keymap.md)
|
||||||
|
|
||||||
|
* [Hardware](hardware.md)
|
||||||
|
* [Procesadores AVR](hardware_avr.md)
|
||||||
|
* [Drivers](hardware_drivers.md)
|
||||||
|
|
||||||
|
* Referencia
|
||||||
|
* [Pautas de teclados](hardware_keyboard_guidelines.md)
|
||||||
|
* [Opciones de configuración](config_options.md)
|
||||||
|
* [Keycodes](keycodes.md)
|
||||||
|
* [Convenciones de código - C](coding_conventions_c.md)
|
||||||
|
* [Convenciones de código - Python](coding_conventions_python.md)
|
||||||
|
* [Mejores prácticas de documentación](documentation_best_practices.md)
|
||||||
|
* [Plantillas de documentación](documentation_templates.md)
|
||||||
|
* [Glosario](reference_glossary.md)
|
||||||
|
* [Tests unitarios](unit_testing.md)
|
||||||
|
* [Funciones útiles](ref_functions.md)
|
||||||
|
* [Sporte configurador](reference_configurator_support.md)
|
||||||
|
* [Formato info.json](reference_info_json.md)
|
||||||
|
* [Desarrollo Python CLI](cli_development.md)
|
||||||
|
|
||||||
|
* [Características](features.md)
|
||||||
|
* [Keycodes Básicos](keycodes_basic.md)
|
||||||
|
* [Teclas US ANSI Shifted](keycodes_us_ansi_shifted.md)
|
||||||
|
* [Keycodes Quantum](quantum_keycodes.md)
|
||||||
|
* [Keycodes Avanzados](feature_advanced_keycodes.md)
|
||||||
|
* [Audio](feature_audio.md)
|
||||||
|
* [Auto Shift](feature_auto_shift.md)
|
||||||
|
* [Retroiluminación](feature_backlight.md)
|
||||||
|
* [Bluetooth](feature_bluetooth.md)
|
||||||
|
* [Bootmagic](feature_bootmagic.md)
|
||||||
|
* [Combos](feature_combo.md)
|
||||||
|
* [Comando](feature_command.md)
|
||||||
|
* [API Debounce](feature_debounce_type.md)
|
||||||
|
* [Switch DIP](feature_dip_switch.md)
|
||||||
|
* [Macros Dinámicas](feature_dynamic_macros.md)
|
||||||
|
* [Encoders](feature_encoders.md)
|
||||||
|
* [Grave Escape](feature_grave_esc.md)
|
||||||
|
* [Feedback Háptico](feature_haptic_feedback.md)
|
||||||
|
* [Controlador LCD HD44780](feature_hd44780.md)
|
||||||
|
* [Key Lock](feature_key_lock.md)
|
||||||
|
* [Layouts](feature_layouts.md)
|
||||||
|
* [Tecla Leader](feature_leader_key.md)
|
||||||
|
* [Matriz LED](feature_led_matrix.md)
|
||||||
|
* [Macros](feature_macros.md)
|
||||||
|
* [Teclas del ratón](feature_mouse_keys.md)
|
||||||
|
* [Driver OLED](feature_oled_driver.md)
|
||||||
|
* [Teclas One Shot](feature_advanced_keycodes.md#one-shot-keys)
|
||||||
|
* [Dispositivo de apuntado](feature_pointing_device.md)
|
||||||
|
* [Ratón PS/2](feature_ps2_mouse.md)
|
||||||
|
* [Iluminación RGB](feature_rgblight.md)
|
||||||
|
* [Matriz RGB](feature_rgb_matrix.md)
|
||||||
|
* [Cadete espacial](feature_space_cadet.md)
|
||||||
|
* [Teclado dividido](feature_split_keyboard.md)
|
||||||
|
* [Stenografía](feature_stenography.md)
|
||||||
|
* [Swap Hands](feature_swap_hands.md)
|
||||||
|
* [Tap Dance](feature_tap_dance.md)
|
||||||
|
* [Terminal](feature_terminal.md)
|
||||||
|
* [Impresora Térmica](feature_thermal_printer.md)
|
||||||
|
* [Unicode](feature_unicode.md)
|
||||||
|
* [Userspace](feature_userspace.md)
|
||||||
|
* [Velocikey](feature_velocikey.md)
|
||||||
|
|
||||||
|
* Para Makers y Modders
|
||||||
|
* [Guía de cableado a mano](hand_wire.md)
|
||||||
|
* [Guía de flasheado de ISP](isp_flashing_guide.md)
|
||||||
|
* [Guía de depuración de ARM](arm_debugging.md)
|
||||||
|
* [Driver I2C](i2c_driver.md)
|
||||||
|
* [Controles GPIO](internals_gpio_control.md)
|
||||||
|
* [Conversión Proton C](proton_c_conversion.md)
|
||||||
|
|
||||||
|
* Para entender en profundidad
|
||||||
|
* [Cómo funcionan los teclados](how_keyboards_work.md)
|
||||||
|
* [Entendiendo QMK](understanding_qmk.md)
|
||||||
|
|
||||||
|
* Otros temas
|
||||||
|
* [Usando Eclipse con QMK](other_eclipse.md)
|
||||||
|
* [Usando VSCode con QMK](other_vscode.md)
|
||||||
|
* [Soporte](support.md)
|
||||||
|
* [Cómo añadir traducciones](translating.md)
|
||||||
|
|
||||||
|
* QMK Internals (En progreso)
|
||||||
|
* [Defines](internals_defines.md)
|
||||||
|
* [Input Callback Reg](internals_input_callback_reg.md)
|
||||||
|
* [Dispositivo Midi](internals_midi_device.md)
|
||||||
|
* [Proceso de configuración de un dispositivo Midi](internals_midi_device_setup_process.md)
|
||||||
|
* [Utilidad Midi](internals_midi_util.md)
|
||||||
|
* [Funciones Send](internals_send_functions.md)
|
||||||
|
* [Herramientas Sysex](internals_sysex_tools.md)
|
9
docs/es/becoming_a_qmk_collaborator.md
Normal file
9
docs/es/becoming_a_qmk_collaborator.md
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# Llegar a ser un colaborador QMK
|
||||||
|
|
||||||
|
Un colaborador QMK es un maker o diseñador de teclados que tiene interés en ayudar a QMK a crecer y mantener sus teclado(s), y alentar a los usuarios y clientes a presentar herramientas, ideas, y keymaps. Siempre procuramos agregar más teclados y colaboradores, pero pedimos que cumplan los siguientes requisitos:
|
||||||
|
|
||||||
|
* **Tener un PCB disponible a la venta.** Desafortunadamente, hay demasiada variación y complicaciones con teclados cableados a mano.
|
||||||
|
* **Realizar el mantenimiento de tu teclado en QMK.** Este podría requirir un setup inicial para hacer que tu teclado funcione, pero también podría incluir adaptarse a cambios hecho al base de QMK que podrían descomponer o rendir código superfluo.
|
||||||
|
* **Aprobar e incorporar pull requests de keymaps para tu teclado.** Nos gusta alentar a los usuarios a contribuir sus keymaps para que otros los vean y los puedan usar para crear sus propios.
|
||||||
|
|
||||||
|
Si sientes que cumples los requisitos, ¡mándanos un email a hello@qmk.fm con una introducción y algunos enlaces para tu teclado!
|
8
docs/es/hardware.md
Normal file
8
docs/es/hardware.md
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
# Hardware
|
||||||
|
|
||||||
|
QMK es compatible con una variedad de hardware. Si tu procesador puede ser dirigido por [LUFA](http://www.fourwalledcubicle.com/LUFA.php) o [ChibiOS](http://www.chibios.com), probablemente puedes hacer que QMK se ejecute en él. Esta sección explora cómo hacer que QMK se ejecute y se comunique con hardware de todo tipo.
|
||||||
|
|
||||||
|
* [Pautas de teclados](hardware_keyboard_guidelines.md)
|
||||||
|
* [Procesadores AVR](hardware_avr.md)
|
||||||
|
* Procesadores ARM (TBD)
|
||||||
|
* [Drivers](hardware_drivers.md)
|
181
docs/es/hardware_avr.md
Normal file
181
docs/es/hardware_avr.md
Normal file
|
@ -0,0 +1,181 @@
|
||||||
|
# Teclados con Procesadores AVR
|
||||||
|
|
||||||
|
Esta página describe el soporte para procesadores AVR en QMK. Los procesadores AVR incluyen el atmega32u4, atmega32u2, at90usb1286, y otros procesadores de la Corporación Atmel. Los procesadores AVR son MCUs de 8-bit que son diseñados para ser fáciles de trabajar. Los procesadores AVR más comunes en los teclados tienen USB y un montón de GPIO para permitir grandes matrices de teclado. Son los MCUs más populares para el uso en los teclados hoy en día.
|
||||||
|
|
||||||
|
Si aún no lo has hecho, debes leer las [Pautas de teclados](hardware_keyboard_guidelines.md) para tener una idea de cómo los teclados encajan en QMK.
|
||||||
|
|
||||||
|
## Añadir tu Teclado AVR a QMK
|
||||||
|
|
||||||
|
QMK tiene varias características para simplificar el trabajo con teclados AVR. Para la mayoría de los teclados no tienes que escribir ni una sola línea de código. Para empezar, ejecuta el archivo `util/new_keyboard.sh`:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ./util/new_keyboard.sh
|
||||||
|
Generating a new QMK keyboard directory
|
||||||
|
|
||||||
|
Keyboard Name: mycoolkb
|
||||||
|
Keyboard Type [avr]:
|
||||||
|
Your Name [John Smith]:
|
||||||
|
|
||||||
|
Copying base template files... done
|
||||||
|
Copying avr template files... done
|
||||||
|
Renaming keyboard files... done
|
||||||
|
Replacing %KEYBOARD% with mycoolkb... done
|
||||||
|
Replacing %YOUR_NAME% with John Smith... done
|
||||||
|
|
||||||
|
Created a new keyboard called mycoolkb.
|
||||||
|
|
||||||
|
To start working on things, cd into keyboards/mycoolkb,
|
||||||
|
or open the directory in your favourite text editor.
|
||||||
|
```
|
||||||
|
|
||||||
|
Esto creará todos los archivos necesarios para tu nuevo teclado, y rellenará la configuración con valores predeterminados. Ahora sólo tienes que personalizarlo para tu teclado.
|
||||||
|
|
||||||
|
## `readme.md`
|
||||||
|
|
||||||
|
Aquí es donde describirás tu teclado. Por favor sigue la [Plantilla del readme de teclados](documentation_templates.md#keyboard-readmemd-template) al escribir tu `readme.md`. Te animamos a colocar una imagen en la parte superior de tu `readme.md`. Por favor, utiliza un servicio externo como [Imgur](http://imgur.com) para alojar las imágenes.
|
||||||
|
|
||||||
|
## `<keyboard>.c`
|
||||||
|
|
||||||
|
Aquí es donde pondrás toda la lógica personalizada para tu teclado. Muchos teclados no necesitan nada aquí. Puedes aprender más sobre cómo escribir lógica personalizada en [Funciones Quantum Personalizadas](custom_quantum_functions.md).
|
||||||
|
|
||||||
|
## `<keyboard>.h`
|
||||||
|
|
||||||
|
Este es el archivo en el que defines tu(s) [Macro(s) de Layout](feature_layouts.md). Por lo menos deberías tener un `#define LAYOUT` para tu teclado que se ve algo así:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define LAYOUT( \
|
||||||
|
k00, k01, k02, \
|
||||||
|
k10, k11 \
|
||||||
|
) { \
|
||||||
|
{ k00, k01, k02 }, \
|
||||||
|
{ k10, KC_NO, k11 }, \
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
La primera mitad de la macro pre-procesador `LAYOUT` define la disposición física de las llaves. La segunda mitad de la macro define la matriz a la que están conectados los interruptores. Esto te permite tener una disposición física de las llaves que difiere de la matriz de cableado.
|
||||||
|
|
||||||
|
Cada una de las variables `k__` tiene que ser única, y normalmente sigue el formato `k<row><col>`.
|
||||||
|
|
||||||
|
La matriz física (la segunda mitad) debe tener un número de filas igualando `MATRIX_ROWS`, y cada fila debe tener exactamente `MATRIX_COLS` elementos. Si no tienes tantas teclas físicas puedes usar `KC_NO` para rellenar los espacios en blanco.
|
||||||
|
|
||||||
|
## `config.h`
|
||||||
|
|
||||||
|
El archivo `config.h` es donde configuras el hardware y el conjunto de características para tu teclado. Hay un montón de opciones que se pueden colocar en ese archivo, demasiadas para listar allí. Para obtener una visión de conjunto completa de las opciones disponibles consulta la página de [Opciones de Configuración](config_options.md).
|
||||||
|
|
||||||
|
### Configuración de hardware
|
||||||
|
|
||||||
|
|
||||||
|
En la parte superior de `config.h` encontrarás ajustes relacionados con USB. Estos controlan la apariencia de tu teclado en el Sistema Operativo. Si no tienes una buena razón para cambiar debes dejar el `VENDOR_ID` como `0xFEED`. Para el `PRODUCT_ID` debes seleccionar un número que todavía no esté en uso.
|
||||||
|
|
||||||
|
Cambia las líneas de `MANUFACTURER`, `PRODUCT`, y `DESCRIPTION` para reflejar con precisión tu teclado.
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define VENDOR_ID 0xFEED
|
||||||
|
#define PRODUCT_ID 0x6060
|
||||||
|
#define DEVICE_VER 0x0001
|
||||||
|
#define MANUFACTURER Tú
|
||||||
|
#define PRODUCT mi_teclado_fantastico
|
||||||
|
#define DESCRIPTION Un teclado personalizado
|
||||||
|
```
|
||||||
|
|
||||||
|
?> Windows y macOS mostrarán el `MANUFACTURER` y `PRODUCT` en la lista de dispositivos USB. `lsusb` en Linux toma estos de la lista mantenida por el [Repositorio de ID USB](http://www.linux-usb.org/usb-ids.html) por defecto. `lsusb -v` mostrará los valores reportados por el dispositivo, y también están presentes en los registros del núcleo después de conectarlo.
|
||||||
|
|
||||||
|
### Configuración de la matriz del teclado
|
||||||
|
|
||||||
|
La siguiente sección del archivo `config.h` trata de la matriz de tu teclado. Lo primero que debes establecer es el tamaño de la matriz. Esto es generalmente, pero no siempre, el mismo número de filas y columnas como la disposición física de las teclas.
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define MATRIX_ROWS 2
|
||||||
|
#define MATRIX_COLS 3
|
||||||
|
```
|
||||||
|
|
||||||
|
Una vez que hayas definido el tamaño de tu matriz, necesitas definir qué pines en tu MCU están conectados a filas y columnas. Para hacerlo simplemente especifica los nombres de esos pines:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define MATRIX_ROW_PINS { D0, D5 }
|
||||||
|
#define MATRIX_COL_PINS { F1, F0, B0 }
|
||||||
|
#define UNUSED_PINS
|
||||||
|
```
|
||||||
|
|
||||||
|
El número de entradas debe ser el mismo que el número que asignaste a `MATRIX_ROWS`, y del mismo modo para `MATRIX_COL_PINS` y `MATRIX_COLS`. No tienes que especificar `UNUSED_PINS`, pero puedes si deseas documentar qué pines están abiertos.
|
||||||
|
|
||||||
|
Finalmente, puedes especificar la dirección en la que apuntan tus diodos. Esto puede ser `COL2ROW` o `ROW2COL`.
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define DIODE_DIRECTION COL2ROW
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Matriz de patas directas
|
||||||
|
Para configurar un teclado en el que cada interruptor está conectado a un pin y tierra separados en lugar de compartir los pines de fila y columna, usa `DIRECT_PINS`. La asignación define los pines de cada interruptor en filas y columnas, de izquierda a derecha. Debe ajustarse a los tamaños dentro de `MATRIX_ROWS` y `MATRIX_COLS`. Usa `NO_PIN` para rellenar espacios en blanco. Sobreescribe el comportamiento de `DIODE_DIRECTION`, `MATRIX_ROW_PINS` y `MATRIX_COL_PINS`.
|
||||||
|
|
||||||
|
```c
|
||||||
|
// #define MATRIX_ROW_PINS { D0, D5 }
|
||||||
|
// #define MATRIX_COL_PINS { F1, F0, B0 }
|
||||||
|
#define DIRECT_PINS { \
|
||||||
|
{ F1, E6, B0, B2, B3 }, \
|
||||||
|
{ F5, F0, B1, B7, D2 }, \
|
||||||
|
{ F6, F7, C7, D5, D3 }, \
|
||||||
|
{ B5, C6, B6, NO_PIN, NO_PIN } \
|
||||||
|
}
|
||||||
|
#define UNUSED_PINS
|
||||||
|
|
||||||
|
/* COL2ROW, ROW2COL */
|
||||||
|
//#define DIODE_DIRECTION
|
||||||
|
```
|
||||||
|
|
||||||
|
### Configuración de retroiluminación
|
||||||
|
|
||||||
|
QMK soporta retroiluminación en la mayoría de los pines GPIO. Algunos de ellos pueden ser manejados por el MCU en hardware. Para más detalles, consulta la [Documentación de Retroiluminación](feature_backlight.md).
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define BACKLIGHT_PIN B7
|
||||||
|
#define BACKLIGHT_LEVELS 3
|
||||||
|
#define BACKLIGHT_BREATHING
|
||||||
|
#define BREATHING_PERIOD 6
|
||||||
|
```
|
||||||
|
|
||||||
|
### Otras opciones de configuración
|
||||||
|
|
||||||
|
Hay un montón de características que se pueden configurar o ajustar en `config.h`. Debes consultar la página de [Opciones de Configuración](config_options.md) para más detalles.
|
||||||
|
|
||||||
|
## `rules.mk`
|
||||||
|
|
||||||
|
Usa el archivo `rules.mk` para decirle a QMK qué archivos construir y qué características habilitar. Si estás construyendo sobre un atmega32u4 deberías poder dejar mayormente los valores predeterminados. Si estás usando otro MCU es posible que tengas que ajustar algunos parámetros.
|
||||||
|
|
||||||
|
### Opciones MCU
|
||||||
|
|
||||||
|
Estas opciones le indican al sistema de compilación para qué CPU construir. Ten mucho cuidado si cambias cualquiera de estos ajustes. Puedes inutilizar tu teclado.
|
||||||
|
|
||||||
|
```make
|
||||||
|
MCU = atmega32u4
|
||||||
|
F_CPU = 16000000
|
||||||
|
ARCH = AVR8
|
||||||
|
F_USB = $(F_CPU)
|
||||||
|
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
|
||||||
|
```
|
||||||
|
|
||||||
|
### Gestores de arranque
|
||||||
|
|
||||||
|
El gestor de arranque es una sección especial de tu MCU que te permite actualizar el código almacenado en el MCU. Piensa en ello como una partición de rescate para tu teclado.
|
||||||
|
|
||||||
|
#### Ejemplo de gestor de arranque
|
||||||
|
|
||||||
|
```make
|
||||||
|
BOOTLOADER = halfkay
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Ejemplo de cargador DFU Atmel
|
||||||
|
|
||||||
|
```make
|
||||||
|
BOOTLOADER = atmel-dfu
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Ejemplo de gestor de arranque Pro Micro
|
||||||
|
|
||||||
|
```make
|
||||||
|
BOOTLOADER = caterina
|
||||||
|
```
|
||||||
|
|
||||||
|
### Opciones de construcción
|
||||||
|
|
||||||
|
Hay un serie de características que se pueden activar o desactivar en `rules.mk`. Consulta la página de [Opciones de Configuración](config_options.md#feature-options) para obtener una lista detallada y una descripción.
|
36
docs/es/hardware_drivers.md
Normal file
36
docs/es/hardware_drivers.md
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
# Controladores de hardware QMK
|
||||||
|
|
||||||
|
QMK se utiliza en un montón de hardware diferente. Mientras que el soporte para los MCUs y las configuraciones de matriz más comunes está integrado, hay una serie de controladores que se pueden añadir para soportar hardware adicional al teclado. Los ejemplos incluyen ratones y otros dispositivos de apuntamiento, extensores de i/o para teclados divididos, modúlos Bluetooth, y pantallas LCD, OLED y TFT.
|
||||||
|
|
||||||
|
<!-- FIXME: Esto debe hablar de cómo se integran los controladores en QMK y cómo puedes añadir su propio controlador.
|
||||||
|
|
||||||
|
# Descripción del sistema de controladores
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
|
# Controladores disponibles
|
||||||
|
|
||||||
|
## ProMicro (Solo AVR)
|
||||||
|
|
||||||
|
Soporte para direccionar pines en el ProMicro por su nombre Arduino en lugar de su nombre AVR. Esto necesita ser mejor documentado. Si estás tratando de hacer esto y leer el código no ayuda por favor [abre una issue](https://github.com/qmk/qmk_firmware/issues/new) y podemos ayudarte por el proceso.
|
||||||
|
|
||||||
|
## Controlador OLED SSD1306
|
||||||
|
|
||||||
|
Soporte para pantallas OLED basadas en SSD1306. Para obtener más información consulta la página de [Característica de Controlador OLED](feature_oled_driver.md).
|
||||||
|
|
||||||
|
## uGFX
|
||||||
|
|
||||||
|
Puedes hacer uso de uGFX dentro de QMK para manejar LCDs de caracteres y gráficos, matrices de LED, OLED, TFT, y otras tecnologías de visualización. Esto necesita ser mejor documentado. Si estás tratando de hacer esto y leer el código no ayuda por favor [abre una issue](https://github.com/qmk/qmk_firmware/issues/new) y podemos ayudarte por el proceso.
|
||||||
|
|
||||||
|
## WS2812 (Solo AVR)
|
||||||
|
|
||||||
|
Soporte para LEDs WS2811/WS2812{a,b,c}. Para obtener más información consulta la página de [Luz RGB](feature_rgblight.md).
|
||||||
|
|
||||||
|
## IS31FL3731
|
||||||
|
|
||||||
|
Soporte para hasta 2 controladores. Cada controlador implementa 2 matrices charlieplex para direccionar LEDs individualmente usando I2C. Esto permite hasta 144 LEDs del mismo color o 32 LEDs RGB. Para obtener más información sobre cómo configurar el controlador, consulta la página de [Matriz RGB](feature_rgb_matrix.md).
|
||||||
|
|
||||||
|
## IS31FL3733
|
||||||
|
|
||||||
|
Soporte para hasta un solo controlador con espacio para expansión. Cada controlador puede controlar 192 LEDs individuales o 64 LEDs RGB. Para obtener más información sobre cómo configurar el controlador, consulta la página de [Matriz RGB](feature_rgb_matrix.md).
|
||||||
|
|
149
docs/es/hardware_keyboard_guidelines.md
Normal file
149
docs/es/hardware_keyboard_guidelines.md
Normal file
|
@ -0,0 +1,149 @@
|
||||||
|
# Pautas del teclado QMK
|
||||||
|
|
||||||
|
Desde sus inicios, QMK ha crecido a pasos agigantados gracias a personas como tú que contribuyes a la creación y mantenimiento de nuestros teclados comunitarios. A medida que hemos crecido hemos descubierto algunos patrones que funcionan bien, y pedimos que te ajustes a ellos para que sea más fácil para que otras personas se beneficien de tu duro trabajo.
|
||||||
|
|
||||||
|
|
||||||
|
## Nombrar tu Teclado/Proyecto
|
||||||
|
|
||||||
|
Todos los nombres de teclado están en minúsculas, consistiendo sólo de letras, números y guiones bajos (`_`). Los nombres no pueden comenzar con un guión bajo. La barra de desplazamiento (`/`) se utiliza como un carácter de separación de subcarpetas.
|
||||||
|
|
||||||
|
Los nombres `test`, `keyboard`, y `all` están reservados para las órdenes de make y no pueden ser usados como un nombre de teclado o subcarpeta.
|
||||||
|
|
||||||
|
Ejemplos Válidos:
|
||||||
|
|
||||||
|
* `412_64`
|
||||||
|
* `chimera_ortho`
|
||||||
|
* `clueboard/66/rev3`
|
||||||
|
* `planck`
|
||||||
|
* `v60_type_r`
|
||||||
|
|
||||||
|
## Subcarpetas
|
||||||
|
|
||||||
|
QMK utiliza subcarpetas tanto para organización como para compartir código entre las revisiones del mismo teclado. Puedes anidar carpetas hasta 4 niveles de profundidad:
|
||||||
|
|
||||||
|
qmk_firmware/keyboards/top_folder/sub_1/sub_2/sub_3/sub_4
|
||||||
|
|
||||||
|
Si una subcarpeta tiene un archivo `rules.mk` será considerado un teclado compilable. Estará disponible en el configurador de QMK y se probará con `make all`. Si estás utilizando una carpeta para organizar varios teclados del mismo fabricante no debes tener un archivo `rules.mk`.
|
||||||
|
|
||||||
|
Ejemplo:
|
||||||
|
|
||||||
|
Clueboard utiliza subcarpetas para ambos propósitos: organización y revisiones de teclado.
|
||||||
|
|
||||||
|
* [`qmk_firmware`](https://github.com/qmk/qmk_firmware/tree/master)
|
||||||
|
* [`keyboards`](https://github.com/qmk/qmk_firmware/tree/master/keyboards)
|
||||||
|
* [`clueboard`](https://github.com/qmk/qmk_firmware/tree/master/keyboards/clueboard) ← This is the organization folder, there's no `rules.mk` file
|
||||||
|
* [`60`](https://github.com/qmk/qmk_firmware/tree/master/keyboards/clueboard/60) ← This is a compilable keyboard, it has a `rules.mk` file
|
||||||
|
* [`66`](https://github.com/qmk/qmk_firmware/tree/master/keyboards/clueboard/66) ← This is also compilable- it uses `DEFAULT_FOLDER` to specify `rev3` as the default revision
|
||||||
|
* [`rev1`](https://github.com/qmk/qmk_firmware/tree/master/keyboards/clueboard/66/rev1) ← compilable: `make clueboard/66/rev1`
|
||||||
|
* [`rev2`](https://github.com/qmk/qmk_firmware/tree/master/keyboards/clueboard/66/rev2) ← compilable: `make clueboard/66/rev2`
|
||||||
|
* [`rev3`](https://github.com/qmk/qmk_firmware/tree/master/keyboards/clueboard/66/rev3) ← compilable: `make clueboard/66/rev3` or `make clueboard/66`
|
||||||
|
|
||||||
|
## Estructura de carpetas de teclado
|
||||||
|
|
||||||
|
Su teclado debe estar ubicado en `qmk_firm cuidada/keyboards/` y el nombre de la carpeta debe ser el nombre de su teclado como se describe en la sección anterior. Dentro de esta carpeta debe haber varios archivos:
|
||||||
|
|
||||||
|
* `readme.md`
|
||||||
|
* `info.json`
|
||||||
|
* `config.h`
|
||||||
|
* `rules.mk`
|
||||||
|
* `<keyboard_name>.c`
|
||||||
|
* `<keyboard_name>.h`
|
||||||
|
|
||||||
|
### `readme.md`
|
||||||
|
|
||||||
|
Todos los proyectos necesitan tener un archivo `readme.md` que explica lo que es el teclado, quién lo hizo y dónde está disponible. Si es aplicable, también debe contener enlaces a más información, como el sitio web del fabricante. Por favor, sigue la [plantilla publicada](documentation_templates.md#keyboard-readmemd-template).
|
||||||
|
|
||||||
|
### `info.json`
|
||||||
|
|
||||||
|
Este archivo es utilizado por la [API de QMK](https://github.com/qmk/qmk_api). Contiene la información que [configurador de QMK](https://config.qmk.fm/) necesita mostrar en una representación de su teclado. También puede establecer metadatos aquí. Para más información, consulta la [página de referencia](reference_info_json.md).
|
||||||
|
|
||||||
|
### `config.h`
|
||||||
|
|
||||||
|
Todos los proyectos necesitan tener un archivo `config.h` que establece cosas como el tamaño de la matriz, nombre del producto, USB VID/PID, descripción y otros ajustes. En general, usa este archivo para establecer la información esencial y los valores predeterminados para tu teclado que siempre funcionarán.
|
||||||
|
|
||||||
|
### `rules.mk`
|
||||||
|
|
||||||
|
La presencia de este archivo indica que la carpeta es un destino de teclado y se puede utilizar en las órdenes `make`. Aquí es donde estableces el entorno de compilación para tu teclado y configuras el conjunto predeterminado de características.
|
||||||
|
|
||||||
|
### `<keyboard_name.c>`
|
||||||
|
|
||||||
|
Aquí es donde escribirás código personalizado para tu teclado. Típicamente escribirás código para inicializar e interactuar con el hardware de tu teclado. Si tu teclado se compone de sólo una matriz de teclas sin LEDs, altavoces u otro hardware auxiliar este archivo puede estar en blanco.
|
||||||
|
|
||||||
|
Las funciones siguientes se definen típicamente en este archivo:
|
||||||
|
|
||||||
|
* `void matrix_init_kb(void)`
|
||||||
|
* `void matrix_scan_kb(void)`
|
||||||
|
* `bool process_record_kb(uint16_t keycode, keyrecord_t *record)`
|
||||||
|
* `void led_set_kb(uint8_t usb_led)`
|
||||||
|
|
||||||
|
### `<keyboard_name.h>`
|
||||||
|
|
||||||
|
Este archivo se utiliza para definir la matriz para tu teclado. Debes definir al menos un macro de C que traduce una serie en una matriz que representa la matriz de interruptor físico para tu teclado. Si es posible construir tu teclado con múltiples diseños debes definir macros adicionales.
|
||||||
|
|
||||||
|
Si solo tienes un diseño debes llamar a esta macro `LAYOUT`.
|
||||||
|
|
||||||
|
Al definir diseños múltiples debes tener un diseño base, llamado `LAYOUT_all`, que soporte todas las posibles posiciones de switch en tu matriz, incluso si ese diseño es imposible de construir físicamente. Esta es la macro que deberías usar en tu keymap `predeterminado`. Debes tener keymaps adicionales llamados `default_ término layout>` que usen tus otras macros de diseño. Esto hará que sea más fácil para las personas utilizar los diseños que defines.
|
||||||
|
|
||||||
|
Los nombres de las macros de diseño son completamente minúsculas, excepto por la palabra `LAYOUT` en el frente.
|
||||||
|
|
||||||
|
Por ejemplo, si tienes un PCB de 60% que soporta ANSI e ISO podría definir los siguientes diseños y keymaps:
|
||||||
|
|
||||||
|
| Nombre de diseño | Nombre de keymap | Descripción |
|
||||||
|
|-------------|-------------|-------------|
|
||||||
|
| LAYOUT_all | default | Un diseño que soporta tanto ISO como ANSI |
|
||||||
|
| LAYOUT_ansi | default_ansi | Un diseño ANSI |
|
||||||
|
| LAYOUT_iso | default_iso | Un diseño ISO |
|
||||||
|
|
||||||
|
## Archivos de Imagen/Hardware
|
||||||
|
|
||||||
|
En un esfuerzo por mantener el tamaño de repo abajo ya no estamos aceptando archivos binarios de cualquier formato, con pocas excepciones. Alojarlos en otro lugar (por ejemplo <https://imgur.com>) y enlazarlos en el `readme.md` es preferible.
|
||||||
|
|
||||||
|
Para archivos de hardware (tales como placas, casos, pcb) puedes contribuir a [qmk.fm repo](https://github.com/qmk/qmk.fm) y estarán disponibles en [qmk.fm](http://qmk.fm). Archivos descargables se almacenan en `/<teclado>/` (nombre sigue el mismo formato que el anterior), se sirven en `http://qmk.fm/<teclado>/`, y se generan páginas de `/_pages/<teclado>/` que se sirven en la misma ubicación (Los archivos .md se generan en archivos .html mediante Jekyll). Echa un vistazo a la carpeta `lets_split` para ver un ejemplo.
|
||||||
|
|
||||||
|
## Predeterminados de teclado
|
||||||
|
|
||||||
|
Dada la cantidad de funcionalidad que expone QMK, es muy fácil confundir a los nuevos usuarios. Al armar el firmware predeterminado para tu teclado, te recomendamos limitar tus funciones y opciones habilitadas al conjunto mínimo necesario para soportar tu hardware. A continuación se formulan recomendaciones sobre características específicas.
|
||||||
|
|
||||||
|
### Bootmagic y Command
|
||||||
|
|
||||||
|
[Bootmagic](feature_bootmagic.md) and [Command](feature_command.md) son dos características relacionadas que permiten a un usuario controlar su teclado de manera no obvia. Te recomendamos que piense largo y tendido acerca de si vas a habilitar cualquiera de las características, y cómo vas a exponer esta funcionalidad. Tengas en cuenta que los usuarios que quieren esta funcionalidad puede habilitarla en sus keymaps personales sin afectar a todos los usuarios novatos que pueden estar usando tu teclado como su primera tarjeta programable.
|
||||||
|
|
||||||
|
De lejos el problema más común con el que se encuentran los nuevos usuarios es la activación accidental de Bootmagic mientras están conectando su teclado. Están sosteniendo el teclado por la parte inferior, presionando sin saberlo en alt y barra espaciadora, y luego se dan cuenta de que estas teclas han sido intercambiadas en ellos. Recomendamos dejar esta característica deshabilitada de forma predeterminada, pero si la activas consideres establecer la opción `BOOTMAGIC_KEY_SALT` a una tecla que es difícil de presionar al conectar el teclado.
|
||||||
|
|
||||||
|
Si tu teclado no tiene 2 teclas de cambio debes proporcionar un predeterminado de trabajo para `IS_COMMAND`, incluso cuando haya definido `COMMAND_ENABLE = no`. Esto dará a sus usuarios un valor predeterminado para ajustarse a si lo hacen enable Command.
|
||||||
|
|
||||||
|
## Programación de teclado personalizado
|
||||||
|
|
||||||
|
Como se documenta en [Funcionalidad de Adaptación](custom_quantum_functions.md) puedes definir funciones personalizadas para tu teclado. Por favor, tengas en cuenta que sus usuarios pueden querer personalizar ese comportamiento así, y hacer que sea posible para que puedan hacer eso. Si está proporcionando una función personalizada, por ejemplo `process_record_kb()`, asegúrese de que su función también llame a la versión` `_user()` de la llamada. También debes tener en cuenta el valor de retorno de la versión `_user()`, y ejecutar sólo tu código personalizado si el usuario devuelve `true`.
|
||||||
|
|
||||||
|
## Proyectos Sin Producción/Conectados A Mano
|
||||||
|
|
||||||
|
Estamos encantados de aceptar cualquier proyecto que utilice QMK, incluidos los prototipos y los cableados de mano, pero tenemos una carpeta `/keyboards/handwired/` separada para ellos, por lo que la carpeta `/keyboards/` principal no se llena. Si un proyecto prototipo se convierte en un proyecto de producción en algún momento en el futuro, ¡estaremos encantados de moverlo a la carpeta `/keyboards/` principal!
|
||||||
|
|
||||||
|
## Advertencias como errores
|
||||||
|
|
||||||
|
Al desarrollar su teclado, tengas en cuenta que todas las advertencias serán tratadas como errores - estas pequeñas advertencias pueden acumularse y causar errores más grandes en el camino (y pierdan es generalmente una mala práctica).
|
||||||
|
|
||||||
|
## Derechos de autor
|
||||||
|
|
||||||
|
Si estás adaptando la configuración de tu teclado de otro proyecto, pero no utilizando el mismo código, asegúrese de actualizar la cabecera de derechos de autor en la parte superior de los archivos para mostrar tu nombre, en este formato:
|
||||||
|
|
||||||
|
Copyright 2017 Tu nombre <tu@email.com>
|
||||||
|
|
||||||
|
Si estás modificando el código de otra persona y sólo ha hecho cambios triviales debes dejar su nombre en la declaración de derechos de autor. Si has hecho un trabajo significativo en el archivo debe agregar tu nombre a la de ellos, así:
|
||||||
|
|
||||||
|
Copyright 2017 Su nombre <original_author@ejemplo.com> Tu nombre <tu@ejemplo.com>
|
||||||
|
|
||||||
|
El año debe ser el primer año en que se crea el archivo. Si el trabajo se hizo a ese archivo en años posteriores puedes reflejar que mediante la adición del segundo año a la primera, como así:
|
||||||
|
|
||||||
|
Copyright 2015-2017 Tu nombre <tu@ejemplo.com>
|
||||||
|
|
||||||
|
## Licencia
|
||||||
|
|
||||||
|
El núcleo de QMC está licenciado bajo la [GNU General Public License](https://www.gnu.org/licenses/licenses.en.html). Si estás enviando binarios para los procesadores AVR puedes elegir cualquiera [GPLv2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.html) o [GPLv3](https://www.gnu.org/licenses/gpl.html). Si estás enviando binarios para ARM procesadores debes elegir [GPL Versión 3](https://www.gnu.org/licenses/gpl.html) para cumplir con los [ChibiOS](http://www.chibios.org) licencia GPLv3.
|
||||||
|
|
||||||
|
Si tu teclado hace uso de la [uGFX](https://gfx.io) características dentro de QMK debes cumplir con la [Licencia de uGFX](https://ugfx.io/license.html), que requiere una licencia comercial separada antes de vender un dispositivo que contiene uGFX.
|
||||||
|
|
||||||
|
## Detalles técnicos
|
||||||
|
|
||||||
|
Si estás buscando más información sobre cómo hacer que su teclado funcione con QMK, [echa un vistazo a la sección hardware](hardware.md)!
|
23
docs/es/newbs.md
Normal file
23
docs/es/newbs.md
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
# La guía completa de QMK para novatos
|
||||||
|
|
||||||
|
QMK es un poderoso firmware Open Source para tu teclado mecánico. Puedes utilizar QMK para personalizar tu teclado en maneras a la vez simples y potentes. Gente de todos los niveles de habilidad, desde completos novatos hasta expertos programadores, han utilizado con éxito QMK para personalizar sus teclados. Esta guía te ayudará a hacer lo mismo, sin importar tu nivel de habilidad.
|
||||||
|
|
||||||
|
¿No estás seguro de si tu teclado puede ejecutar QMK? Si es un teclado mecánico construido por ti mismo probablemente puedas. Damos soporte a [gran número de placas de hobbistas](http://qmk.fm/keyboards/), e incluso si tu teclado actual no pudiera ejecutar QMK no deberías tener problemas encontrando uno que cumpliera tus necesidades.
|
||||||
|
|
||||||
|
## Visión general
|
||||||
|
|
||||||
|
Hay 7 secciones principales en esta guía:
|
||||||
|
|
||||||
|
* [Empezando](newbs_getting_started.md)
|
||||||
|
* [Construyendo tu primer firmware](newbs_building_firmware.md)
|
||||||
|
* [Construyendo tu primer firmware usando la GUI](newbs_building_firmware_configurator.md)
|
||||||
|
* [Flasheando el firmware](newbs_flashing.md)
|
||||||
|
* [Testeando y depurando](newbs_testing_debugging.md)
|
||||||
|
* [Mejores práticas](newbs_best_practices.md)
|
||||||
|
* [Recursos de aprendizaje](newbs_learn_more_resources.md)
|
||||||
|
|
||||||
|
Esta guía está enfocada en ayudar a alguien que nunca ha compilado software con anterioridad. Toma decisiones y hace recomendaciones teniendo en cuenta este punto de vista. Hay métodos alternativos para muchos de estos procedimientos, y soportamos la mayoría de esas alternativas. Si tienes alguna duda sobre cómo llevar a cabo una tarea nos puedes [preguntar para que te guiemos](getting_started_getting_help.md).
|
||||||
|
|
||||||
|
## Recursos adicionales
|
||||||
|
|
||||||
|
* [Blog de Básicos de Thomas Baart's QMK](https://thomasbaart.nl/category/mechanical-keyboards/firmware/qmk/qmk-basics/) – Un blog creado por un usuario que cubre lo básico sobre cómo usar el firmware QMK Firmware, visto desde la perspectiva de un usuario nuevo.
|
159
docs/es/newbs_best_practices.md
Normal file
159
docs/es/newbs_best_practices.md
Normal file
|
@ -0,0 +1,159 @@
|
||||||
|
# Mejores prácticas
|
||||||
|
|
||||||
|
## O, "Cómo aprendí a dejar de preocuparme y amarle a Git."
|
||||||
|
|
||||||
|
Este documento procura instruir a los novatos en las mejores prácticas para tener una experiencia más fácil en contribuir a QMK. Te guiaremos por el proceso de contribuir a QMK, explicando algunas maneras de hacerlo más fácilmente, y luego romperemos algunas cosas para enseñarte cómo arreglarlas.
|
||||||
|
|
||||||
|
En este documento suponemos un par de cosas:
|
||||||
|
|
||||||
|
1. Tienes una cuenta de Github, y has hecho un [fork del repo qmk_firmware](getting_started_github.md) en tu cuenta.
|
||||||
|
2. Has [configurado tu entorno de desarrollo](newbs_getting_started.md?id=environment-setup).
|
||||||
|
|
||||||
|
|
||||||
|
## La rama master de tu fork: Actualizar a menudo, nunca commit
|
||||||
|
|
||||||
|
Se recomienda que para desarrollo con QMK, lo que sea que estés haciendo, mantener tu rama `master` actualizada, pero **nunca** commit en ella. Mejor, haz todos tus cambios en una rama de desarrollo y manda pull requests de tus ramas mientras programas.
|
||||||
|
|
||||||
|
Para evitar los conflictos de merge — cuando dos o más usuarios han editado la misma parte de un archivo al mismo tiempo — mantén tu rama `master` actualizada, y empieza desarrollo nuevo creando una nueva rama.
|
||||||
|
|
||||||
|
### Actualizando tu rama master
|
||||||
|
|
||||||
|
Para mantener tu rama `master` actualizada, se recomienda agregar el repository ("repo") de Firmware QMK como un repo remoto en git. Para hacer esto, abre tu interfaz de línea de mandatos y ingresa:
|
||||||
|
```
|
||||||
|
git remote add upstream https://github.com/qmk/qmk_firmware.git
|
||||||
|
```
|
||||||
|
|
||||||
|
Para verificar que el repo ha sido agregado, ejecuta `git remote -v`, y lo siguiente debe aparecer:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ git remote -v
|
||||||
|
origin https://github.com/<your_username>/qmk_firmware.git (fetch)
|
||||||
|
origin https://github.com/<your_username>/qmk_firmware.git (push)
|
||||||
|
upstream https://github.com/qmk/qmk_firmware.git (fetch)
|
||||||
|
upstream https://github.com/qmk/qmk_firmware.git (push)
|
||||||
|
```
|
||||||
|
|
||||||
|
Ya que has hecho esto, puedes buscar actualizaciones del repo ejecutando `git fetch upstream`. Esto busca las ramas y etiquetas — juntos conocidos como "refs" — del repo QMK, que ahora tiene el apodo `upstream`. Ahora podemos comparar los archivos en nuestro fork `origin` con los de QMK.
|
||||||
|
|
||||||
|
Para actualizar la rama master de tu fork, ejecuta lo siguiente, pulsando Intro después de cada línea:
|
||||||
|
|
||||||
|
```
|
||||||
|
git checkout master
|
||||||
|
git fetch upstream
|
||||||
|
git pull upstream master
|
||||||
|
git push origin master
|
||||||
|
```
|
||||||
|
|
||||||
|
Esto te coloca en tu rama master, busca los refs del repo de QMK, descarga la rama `master` actual a tu computadora, y después lo sube a tu fork.
|
||||||
|
|
||||||
|
### Hacer cambios
|
||||||
|
|
||||||
|
Para hacer cambios, crea una nueva rama ejecutando:
|
||||||
|
|
||||||
|
```
|
||||||
|
git checkout -b dev_branch
|
||||||
|
git push --set-upstream origin dev_branch
|
||||||
|
```
|
||||||
|
|
||||||
|
Esto crea una nueva rama llamada `dev_branch`, te coloca en ella, y después guarda la nueva rama a tu fork. El parámetro `--set-upstream` le dice a git que use tu fork y la rama `dev_branch` cada vez que uses `git push` o `git pull` en esta rama. Solo necesitas usarlo la primera que que subes cambios; ya después, puedes usar `git push` o `git pull`, sin usar los demás parámetros.
|
||||||
|
|
||||||
|
!> Con `git push`, puedes usar `-u` en vez de `--set-upstream` — `-u` es un alias de `--set-upstream`.
|
||||||
|
|
||||||
|
Puedes nombrar tu rama casi cualquier cosa, pero se recomienda ponerle algo con relación a los cambios que vas a hacer.
|
||||||
|
|
||||||
|
Por defecto `git checkout -b` se basará tu nueva rama en la rama en la cual estás actualmente. Puedes basar tu rama en otra rama existente agregando el nombre de la rama al comando:
|
||||||
|
|
||||||
|
```
|
||||||
|
git checkout -b dev_branch master
|
||||||
|
```
|
||||||
|
|
||||||
|
Ahora que tienes una rama development, abre tu editor de texto y haz los cambios que quieres. Se recomienda hacer varios commits pequeños a tu rama; de este modo cualquier cambio que causa problemas puede ser rastreado y deshecho si fuera necesario. Para hacer tus cambios, edita y guarda los archivos que necesitas actualizar, agrégalos al *staging area* de Git, y luego haz un commit a tu rama:
|
||||||
|
|
||||||
|
```
|
||||||
|
git add path/to/updated_file
|
||||||
|
git commit -m "My commit message."
|
||||||
|
```
|
||||||
|
`git add` agrega los archivos que han sido cambiados al *staging area* de Git, lo cual es la "zona de preparación"de Git. Este contiene los cambios que vas a *commit* usando `git commit`, que guarda los cambios en el repo. Usa un mensaje de commit descriptivo para que puedas saber que ha cambiado fácilmente.
|
||||||
|
|
||||||
|
!> Si has cambiado muchos archivos, pero todos los archivos son parte del mismo cambio, puedes usar `git add .` para agregar todos los archivos cambiados que están en tu directiro actual, en vez de agregar cada archivo manualmente.
|
||||||
|
|
||||||
|
### Publicar tus cambios
|
||||||
|
|
||||||
|
El útimo paso es subir tus cambios a tu fork. Para hacerlo, ejecuta `git push`. Ahora Git publicará el estado actual de `dev_branch` a tu fork.
|
||||||
|
|
||||||
|
|
||||||
|
## Resolver los conflictos del merge
|
||||||
|
|
||||||
|
A veces cuando el trabajo en una rama tarda mucho tiempo en completarse, los cambios que han sido hechos por otros chocan con los cambios que has hecho en tu rama cuando abres un pull request. Esto se llama un *merge conflict*, y es algo que ocurre cuando varias personas editan las mismas partes de los mismos archivos.
|
||||||
|
|
||||||
|
### Rebase tus cambios
|
||||||
|
|
||||||
|
Un *rebase* es la manera de Git de tomar los cambios que se aplicaron en un punto, deshacerlos, y aplicar estos mismos cambios en otro punto. En el caso de un conflicto de merge, puedes hacer un rebase de tu rama para recoger los cambios que has hecho.
|
||||||
|
|
||||||
|
Para empezar, ejecuta lo siguiente:
|
||||||
|
|
||||||
|
```
|
||||||
|
git fetch upstream
|
||||||
|
git rev-list --left-right --count HEAD...upstream/master
|
||||||
|
```
|
||||||
|
|
||||||
|
El comando `git rev-list` ejecutado aquí muestra el número de commits que difieren entre la rama actual y la rama master de QMK. Ejecutamos `git fetch` primero para asegurarnos de que tenemos los refs que representan es estado actual del repo upstream. El output del comando `git rev-list` muestra dos números:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ git rev-list --left-right --count HEAD...upstream/master
|
||||||
|
7 35
|
||||||
|
```
|
||||||
|
|
||||||
|
El primer número representa el número de commits en la rama actual desde que fue creada, y el segundo número es el número de commits hecho a `upstream/master` desde que la rama actual fue creada, o sea los cambios que no están registrados en la rama actual.
|
||||||
|
|
||||||
|
Ahora que sabemos el estado actual de la rama actual y el del repo upstream, podemos empezar una operación rebase:
|
||||||
|
|
||||||
|
```
|
||||||
|
git rebase upstream/master
|
||||||
|
```
|
||||||
|
Esto le dice a Git que deshaga los commits en la rama actual, y después los re-aplica en la rama master de QMK.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ git rebase upstream/master
|
||||||
|
First, rewinding head to replay your work on top of it...
|
||||||
|
Applying: Commit #1
|
||||||
|
Using index info to reconstruct a base tree...
|
||||||
|
M conflicting_file_1.txt
|
||||||
|
Falling back to patching base and 3-way merge...
|
||||||
|
Auto-merging conflicting_file_1.txt
|
||||||
|
CONFLICT (content): Merge conflict in conflicting_file_1.txt
|
||||||
|
error: Failed to merge in the changes.
|
||||||
|
hint: Use 'git am --show-current-patch' to see the failed patch
|
||||||
|
Patch failed at 0001 Commit #1
|
||||||
|
|
||||||
|
Resolve all conflicts manually, mark them as resolved with
|
||||||
|
"git add/rm <conflicted_files>", then run "git rebase --continue".
|
||||||
|
You can instead skip this commit: run "git rebase --skip".
|
||||||
|
To abort and get back to the state before "git rebase", run "git rebase --abort".
|
||||||
|
```
|
||||||
|
|
||||||
|
Esto nos dice que tenemos un conflicto de merge, y nos dice el nombre del archivo con el conflict. Abre el archivo en tu editor de texto, y en alguna parte del archivo verás algo así:
|
||||||
|
|
||||||
|
```
|
||||||
|
<<<<<<< HEAD
|
||||||
|
<p>For help with any issues, email us at support@webhost.us.</p>
|
||||||
|
=======
|
||||||
|
<p>Need help? Email support@webhost.us.</p>
|
||||||
|
>>>>>>> Commit #1
|
||||||
|
```
|
||||||
|
La línea `<<<<<<< HEAD` marca el principio de un conflicto de merge, y la línea `>>>>>>> Commit #1` marca el final, con las secciones de conflicto separadas por `=======`. La parte del lado `HEAD` is de la versión de QMK master del archivo, y la parte marcada con el mensaje de commit es de la rama actual.
|
||||||
|
|
||||||
|
Ya que Git rastrea *cambios de archivos* en vez del contenido de los archivos directamente, si Git no puede encontrar el texto que estaba en el archivo antes del último commit, no sabrá cómo editar el archivo. El editar el archivo de nuevo resolverá este conflicto. Haz tus cambios, y guarda el archivo.
|
||||||
|
|
||||||
|
```
|
||||||
|
<p>Need help? Email support@webhost.us.</p>
|
||||||
|
```
|
||||||
|
|
||||||
|
Ahora ejecuta:
|
||||||
|
|
||||||
|
```
|
||||||
|
git add conflicting_file_1.txt
|
||||||
|
git rebase --continue
|
||||||
|
```
|
||||||
|
|
||||||
|
Git registra los cambios al archivo con conflictos, y sigue aplicando los commits de nuestra rama hasta llegar al final.
|
81
docs/es/newbs_building_firmware.md
Normal file
81
docs/es/newbs_building_firmware.md
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
# Construyendo tu primer firmware
|
||||||
|
|
||||||
|
Ahora que has configurado tu entorno de construcción estas listo para empezar a construir firmwares personalizados. Para esta sección de la guía alternaremos entre 3 programas - tu gestor de ficheros, tu editor de texto , y tu ventana de terminal. Manten los 3 abiertos hasta que hayas acabado y estés contento con el firmware de tu teclado.
|
||||||
|
|
||||||
|
Si has cerrado y reabierto la ventana de tu terminal después de seguir el primero paso de esta guía, no olvides hacer `cd qmk_firmware` para que tu terminal esté en el directorio correcto.
|
||||||
|
|
||||||
|
## Navega a tu carpeta de keymaps
|
||||||
|
|
||||||
|
Comienza navegando a la carpeta `keymaps` correspondiente a tu teclado.
|
||||||
|
|
||||||
|
?> Si estás en macOS o Windows hay comandos que puedes utilizar fácilmente para abrir la carpeta keymaps.
|
||||||
|
|
||||||
|
?> macOS:
|
||||||
|
|
||||||
|
abre keyboards/<keyboard_folder>/keymaps
|
||||||
|
|
||||||
|
?> Windows:
|
||||||
|
|
||||||
|
inicia .\\keyboards\\<keyboard_folder>\\keymaps
|
||||||
|
|
||||||
|
## Crea una copia del keymap `default`
|
||||||
|
|
||||||
|
Una vez que tengas la carpeta `keymaps` abierta querrás crear una copia de la carpeta `default`. Recomendamos encarecidamente que nombres la carpeta igual que tu nombre de usuario de GitHub, pero puedes utilizar el nombre que quieras siempre que contenga sólo letras en minúscula, números y el caracter de guión bajo.
|
||||||
|
|
||||||
|
Para automatizar el proceso, también tienes la opción de ejecutar el script `new_keymap.sh`.
|
||||||
|
|
||||||
|
Navega a la carpeta `qmk_firmware/util` e introduce lo siguiente:
|
||||||
|
|
||||||
|
```
|
||||||
|
./new_keymap.sh <keyboard path> <username>
|
||||||
|
```
|
||||||
|
|
||||||
|
Por ejemplo, para un usuario llamado John, intentando hacer un keymap nuevo para el 1up60hse, tendría que teclear
|
||||||
|
|
||||||
|
```
|
||||||
|
./new_keymap.sh 1upkeyboards/1up60hse john
|
||||||
|
```
|
||||||
|
|
||||||
|
## Abre `keymap.c` con tu editor de texto favorito
|
||||||
|
|
||||||
|
Abre tu `keymap.c`. Dentro de este fichero encontrarás la estructura que controla cómo se comporta tu teclado. En lo alto de `keymap.c` puede haber distintos defines y enums que hacen el keymap más fácil de leer. Continuando por abajo encontrarás una línea con este aspecto:
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
|
||||||
|
Esta línea indica el comienzo del listado de Capas. Debajo encontrarás líneas que contienen o bien `LAYOUT` o `KEYMAP`, y estas líneas indican el comienzo de una capa. Debajo de esa línea está la lista de teclas que pertenecen a esa capa concreta.
|
||||||
|
|
||||||
|
!> Cuando estés editando tu fichero de keymap ten cuidado con no añadir ni eliminar ninguna coma. Si lo haces el firmware dejará de compilar y puede no ser fácil averiguar dónde está la coma faltante o sobrante.
|
||||||
|
|
||||||
|
## Personaliza el Layout a tu gusto
|
||||||
|
|
||||||
|
Cómo completar esta paso depende enteramente de ti. Haz ese pequeño cambio que querías o rehaz completamente todo. Puedes eliminar capas si no las necesitas todas, o añadir nuevas hasta un total de 32. Comprueba la siguiente documentación para descubrir qué es lo que puedes definir aquí:
|
||||||
|
|
||||||
|
* [Keycodes](keycodes.md)
|
||||||
|
* [Características](features.md)
|
||||||
|
* [Preguntas frecuentes](faq.md)
|
||||||
|
|
||||||
|
?> Mientras estás descubriendo cómo funcionan los keymaps, haz pequeños cambios. Cambios mayores pueden hacer difícil la depuración de problemas que puedan aparecer.
|
||||||
|
|
||||||
|
## Construye tu firmware
|
||||||
|
|
||||||
|
Cuando los cambios a tu keymap están completos necesitarás construir el firmware. Para hacerlo vuelve a la ventana de tu terminal y ejecuta el siguiente comando:
|
||||||
|
|
||||||
|
make <my_keyboard>:<my_keymap>
|
||||||
|
|
||||||
|
Por ejemplo, si tu keymap se llama "xyverz" y estás construyendo un keymap para un planck rev5, utilizarás el siguiente comando:
|
||||||
|
|
||||||
|
make planck/rev5:xyverz
|
||||||
|
|
||||||
|
Mientras compila, recibirás un montón de información de salida en la pantalla informándote de qué ficheros están siendo compilados. Debería acabar con una información similar a esta:
|
||||||
|
|
||||||
|
```
|
||||||
|
Linking: .build/planck_rev5_xyverz.elf [OK]
|
||||||
|
Creating load file for flashing: .build/planck_rev5_xyverz.hex [OK]
|
||||||
|
Copying planck_rev5_xyverz.hex to qmk_firmware folder [OK]
|
||||||
|
Checking file size of planck_rev5_xyverz.hex [OK]
|
||||||
|
* File size is fine - 18392/28672
|
||||||
|
```
|
||||||
|
|
||||||
|
## Flashea tu firmware
|
||||||
|
|
||||||
|
Continua con [Flasheando el firmware](newbs_flashing.md) para aprender cómo escribir tu firmware nuevo en tu teclado.
|
105
docs/es/newbs_building_firmware_configurator.md
Normal file
105
docs/es/newbs_building_firmware_configurator.md
Normal file
|
@ -0,0 +1,105 @@
|
||||||
|
# Configurador QMK
|
||||||
|
|
||||||
|
El [Configurador QMK](https://config.qmk.fm) es un entorno gráfico online que genera ficheros hexadecimales de Firmware QMK.
|
||||||
|
|
||||||
|
?> **Por favor sigue estos pasos en orden.**
|
||||||
|
|
||||||
|
Ve el [Video tutorial](https://youtu.be/tx54jkRC9ZY)
|
||||||
|
|
||||||
|
El Configurador QMK functiona mejor con Chrome/Firefox.
|
||||||
|
|
||||||
|
|
||||||
|
!> **Ficheros de otras herramientas como KLE, o kbfirmware no serán compatibles con el Configurador QMK. No las cargues, no las importes. El configurador Configurador QMK es una herramienta DIFERENTE. **
|
||||||
|
|
||||||
|
## Seleccionando tu teclado
|
||||||
|
|
||||||
|
Haz click en el desplegable y selecciona el teclado para el que quieres crear el keymap.
|
||||||
|
|
||||||
|
?> Si tu teclado tiene varias versiones, asegúrate de que seleccionas la correcta.**
|
||||||
|
|
||||||
|
Lo diré otra vez porque es importante
|
||||||
|
|
||||||
|
!> **ASEGÚRATE DE QUE SELECCIONAS LA VERSIÓN CORRECTA!**
|
||||||
|
|
||||||
|
Si se ha anunciado que tu teclado funciona con QMK pero no está en la lista, es probable que un desarrollador no se haya encargado de él aún o que todavía no hemos tenido la oportunidad de incluirlo. Abre un issue en [qmk_firmware](https://github.com/qmk/qmk_firmware/issues) solicitando soportar ese teclado un particular, si no hay un [Pull Request](https://github.com/qmk/qmk_firmware/pulls?q=is%3Aopen+is%3Apr+label%3Akeyboard) activo para ello. Hay también teclados que funcionan con QMK que están en las cuentas de github de sus manufacturantes. Acuérdate de comprobar esto también.
|
||||||
|
|
||||||
|
## Eligiendo el layout de tu teclado
|
||||||
|
|
||||||
|
Elige el layout que mejor represente el keymap que quieres crear. Algunos teclados no tienen suficientes layouts o layouts correctos definidos aún. Serán soportados en el futuro.
|
||||||
|
|
||||||
|
## Nombre del keymap
|
||||||
|
|
||||||
|
Llama a este keymap como quieras.
|
||||||
|
|
||||||
|
?> Si estás teniendo problemas para compilar, puede merecer la pena probar un cambio de nombre, ya que puede que ya exista en el repositorio de QMK Firmware.
|
||||||
|
|
||||||
|
## Creando Tu keymap
|
||||||
|
|
||||||
|
La adición de keycodes se puede hacer de 3 maneras.
|
||||||
|
1. Arrastrando y soltando
|
||||||
|
2. Clickando en un hueco vacío en el layout y haciendo click en el keycode que deseas
|
||||||
|
3. Clickando en un hueco vacío en el layout, presionando la tecla física en tu teclado.
|
||||||
|
|
||||||
|
Mueve el puntero de tu ratón sobre una tecla y un pequeño extracto te dirá que es lo que hace la tecla. Para una descripción más detallada por favor, mira
|
||||||
|
|
||||||
|
[Referencia básica de keycodes](https://docs.qmk.fm/#/keycodes_basic)
|
||||||
|
[Referencia avanzada de keycodes](https://docs.qmk.fm/#/feature_advanced_keycodes)
|
||||||
|
|
||||||
|
En el caso de que no puedas encontrar un layout que suporte tu keymap, por ejemplo, tres huecos para la barra espaciadora, dos huecos para el retroceso o dos huecos para shift etc etc, rellènalos TODOS.
|
||||||
|
|
||||||
|
### Ejemplo:
|
||||||
|
|
||||||
|
3 huecos para barra espaciadora: Rellena TODOS con barra espaciadora
|
||||||
|
|
||||||
|
2 huecos para retroceso: Rellena AMBOS con retroceso
|
||||||
|
|
||||||
|
2 huecos para el shift derecho: Rellena AMBOS con shift derecho
|
||||||
|
|
||||||
|
1 hueco para el shift izquierdo y 1 hueco para soporte iso: Rellena ambos con el shift izquierdo
|
||||||
|
|
||||||
|
5 huecos , pero sólo 4 teclas: Intuye y comprueba o pregunta a alguien que lo haya hecho anteriormente.
|
||||||
|
|
||||||
|
## Guardando tu keymap para ediciones futuras
|
||||||
|
|
||||||
|
Cuando estés satisfecho con un teclado o quieres trabajar en el después, pulsa el botón `Exportar Keymap`. Guardára tu keymap con el nombre que elijas seguido de .json.
|
||||||
|
|
||||||
|
Entonces podrás cargar este fichero .json en el futuro pulsando el botón `Importar Keymap`.
|
||||||
|
|
||||||
|
!> **PRECAUCIÓN:** No es el mismo tipo de fichero .json usado en kbfirmware.com ni ninguna otra herramienta. Si intentas utilizar un fichero .json de alguna de estas herramientas con el Configurador QMK, existe la posibilidad de que tu teclado **explote**.
|
||||||
|
|
||||||
|
## Generando tu fichero de firmware
|
||||||
|
|
||||||
|
Pulsa el botón verde `Compilar`.
|
||||||
|
|
||||||
|
Cuando la compilación haya acabado, podrás presionar el botón verde `Descargar Firmware`.
|
||||||
|
|
||||||
|
## Flasheando tu teclado
|
||||||
|
|
||||||
|
Por favor, dirígete a la sección de [Flashear firmware](newbs_flashing.md)
|
||||||
|
|
||||||
|
## Problemas comunes
|
||||||
|
|
||||||
|
#### Mi fichero .json no funciona
|
||||||
|
|
||||||
|
Si el fichero .json fue generado con el Configurador QMK, enhorabuena, has dado con un bug. Abre una issue en [qmk_configurator](https://github.com/qmk/qmk_configurator/issues)
|
||||||
|
|
||||||
|
Si no....cómo no viste el mensaje en negrita que puse arriba diciendo que no hay que utilizar otros ficheros .json?
|
||||||
|
|
||||||
|
#### Hay espacios extra en mi layout ¿Qué hago?
|
||||||
|
|
||||||
|
Si te refieres a tener tres espacios para la barra espaciadora, la mejor decisión es rellenar los tres con la barra espaciadora. También se puede hacer lo mismo con las teclas retroceso y las de shift
|
||||||
|
|
||||||
|
#### Para qué sirve el keycode.......
|
||||||
|
|
||||||
|
Por favor, mira
|
||||||
|
|
||||||
|
[Referencia básica de keycodes](https://docs.qmk.fm/#/keycodes_basic)
|
||||||
|
[Referencia avanzada de keycodes](https://docs.qmk.fm/#/feature_advanced_keycodes)
|
||||||
|
|
||||||
|
#### No compila
|
||||||
|
|
||||||
|
Por favor, revisa las otras capas de tu keymap para asegurarte de que no hay teclas aleatorias presentes.
|
||||||
|
|
||||||
|
## Problemas y bugs
|
||||||
|
|
||||||
|
Siempre aceptamos peticiones de clientes y reportes de bug. Por favor, indícalos en [qmk_configurator](https://github.com/qmk/qmk_configurator/issues)
|
351
docs/es/newbs_flashing.md
Normal file
351
docs/es/newbs_flashing.md
Normal file
|
@ -0,0 +1,351 @@
|
||||||
|
# Flasheando tu teclado
|
||||||
|
|
||||||
|
Ahora que has construido tu fichero de firmware personalizado querrás flashear tu teclado.
|
||||||
|
|
||||||
|
## Flasheando tu teclado con QMK Toolbox
|
||||||
|
|
||||||
|
La manera más simple de flashear tu teclado sería con [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases).
|
||||||
|
|
||||||
|
De todos modos, QMK Toolbox actualmente sólo está disponible para Windows y macOS. Si estás usando Linux (o sólo quisieras flashear el firmware desde la línea de comandos), tendrás que utilizar el [método indicado abajo](newbs_flashing.md#flash-your-keyboard-from-the-command-line).
|
||||||
|
|
||||||
|
### Cargar el fichero en QMK Toolbox
|
||||||
|
|
||||||
|
Empieza abriendo la aplicación QMK Toolbox. Tendrás que buscar el fichero de firmware usando Finder o Explorer. El firmware de teclado puede estar en uno de estos dos formatos- `.hex` o `.bin`. QMK intenta copiar el apropiado para tu teclado en el fichero raíz `qmk_firmware`.
|
||||||
|
|
||||||
|
?> Si tu estás on Windows o macOS hay comandos que puedes usar para abrir fácilmente la carpeta del firmware actual en Explorer o Finder.
|
||||||
|
|
||||||
|
?> Windows:
|
||||||
|
|
||||||
|
start .
|
||||||
|
|
||||||
|
?> macOS:
|
||||||
|
|
||||||
|
open .
|
||||||
|
|
||||||
|
El fichero de firmware sempre sigue el siguiente formato de nombre:
|
||||||
|
|
||||||
|
<nombre_teclado>_<nombre_keymap>.{bin,hex}
|
||||||
|
|
||||||
|
Por ejemplo, un `plank/rev5` con un keymap `default` tendrá este nombre de fichero:
|
||||||
|
|
||||||
|
planck_rev5_default.hex
|
||||||
|
|
||||||
|
Una vez que hayas localizado el fichero de tu firmware arrástralo a la caja "Fichero local" en QMK Toolbox, o haz click en "Abrir" y navega allí donde tengas almacenado tu fichero de firmware.
|
||||||
|
|
||||||
|
### Pon tu teclado en modo DFU (Bootloader)
|
||||||
|
|
||||||
|
Para poder flashear tu firmware personalizado tienes que poner tu teclado en un modo especial que permite flasheado. Cuando está en este modo no podrás teclear o utilizarlo para ninguna otra cosa. Es muy importante que no desconectes tu teclado, de lo contrario interrumpirás el proceso de flasheo mientras el firmware se está escribiendo.
|
||||||
|
|
||||||
|
Diferentes teclados tienen diferentes maneras de entrar en este modo especial. Si tu PCB actualmente ejecuta QMK o TMK y no has recibido instrucciones específicas, intenta los siguientes pasos en orden:
|
||||||
|
|
||||||
|
* Manten pulsadas ambas teclas shift y pulsa `Pause`
|
||||||
|
* Manten pulsadas ambas teclas shift y pulsa `B`
|
||||||
|
* Desconecta tu teclado, mantén pulsada la barra espaciadora y `B` al mismo tiempo, conecta tu teclado y espera un segundo antes de dejar de pulsar las teclas
|
||||||
|
* Pulsa el botón físico `RESET` situado en el fondo de la PCB
|
||||||
|
* Localiza los pines en la PCB etiquetados on `BOOT0` o `RESET`, puentea estos dos juntos cuando enchufes la PCB
|
||||||
|
|
||||||
|
Si has tenido éxito verás un mensaje similar a este en QMK Toolbox:
|
||||||
|
|
||||||
|
```
|
||||||
|
*** Clueboard - Clueboard 66% HotSwap disconnected -- 0xC1ED:0x2390
|
||||||
|
*** DFU device connected
|
||||||
|
```
|
||||||
|
|
||||||
|
### Flashea tu teclado
|
||||||
|
|
||||||
|
Haz click en el botón `Flash` de QMK Toolbox. Verás una información de salida similar a esta:
|
||||||
|
|
||||||
|
```
|
||||||
|
*** Clueboard - Clueboard 66% HotSwap disconnected -- 0xC1ED:0x2390
|
||||||
|
*** DFU device connected
|
||||||
|
*** Attempting to flash, please don't remove device
|
||||||
|
>>> dfu-programmer atmega32u4 erase --force
|
||||||
|
Erasing flash... Success
|
||||||
|
Checking memory from 0x0 to 0x6FFF... Empty.
|
||||||
|
>>> dfu-programmer atmega32u4 flash /Users/skully/qmk_firmware/clueboard_66_hotswap_gen1_skully.hex
|
||||||
|
Checking memory from 0x0 to 0x55FF... Empty.
|
||||||
|
0% 100% Programming 0x5600 bytes...
|
||||||
|
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] Success
|
||||||
|
0% 100% Reading 0x7000 bytes...
|
||||||
|
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] Success
|
||||||
|
Validating... Success
|
||||||
|
0x5600 bytes written into 0x7000 bytes memory (76.79%).
|
||||||
|
>>> dfu-programmer atmega32u4 reset
|
||||||
|
|
||||||
|
*** DFU device disconnected
|
||||||
|
*** Clueboard - Clueboard 66% HotSwap connected -- 0xC1ED:0x2390
|
||||||
|
```
|
||||||
|
|
||||||
|
## Flashea tu teclado desde la línea de comandos
|
||||||
|
|
||||||
|
Lo primero que tienes que saber es qué bootloader utiliza tu teclado. Hay cuatro bootloaders pincipales que se usan habitualmente . Pro-Micro y sus clones usan CATERINA, Teensy's usa Halfkay, las placas OLKB usan QMK-DFU, y otros chips atmega32u4 usan DFU.
|
||||||
|
|
||||||
|
Puedes encontrar más información sobre bootloaders en la página [Instrucciones de flasheado e información de Bootloader](flashing.md).
|
||||||
|
|
||||||
|
Si sabes qué bootloader estás usando, en el momento de compilar el firmware, podrás añadir algún texto extra al comando `make` para automatizar el proceso de flasheado.
|
||||||
|
|
||||||
|
### DFU
|
||||||
|
|
||||||
|
Para eo bootloader DFU, cuando estés listo para compilar y flashear tu firmware, abre tu ventana de terminal y ejecuta el siguiente comando de construcción:
|
||||||
|
|
||||||
|
make <my_keyboard>:<my_keymap>:dfu
|
||||||
|
|
||||||
|
Por ejemplo, si tu keymap se llama "xyverz" y estás construyendo un keymap para un planck rev5, utilizarás este comando:
|
||||||
|
|
||||||
|
make planck/rev5:xyverz:dfu
|
||||||
|
|
||||||
|
Una vez que finalice de compilar, deberá aparecer lo siguiente:
|
||||||
|
|
||||||
|
```
|
||||||
|
Linking: .build/planck_rev5_xyverz.elf [OK]
|
||||||
|
Creating load file for flashing: .build/planck_rev5_xyverz.hex [OK]
|
||||||
|
Copying planck_rev5_xyverz.hex to qmk_firmware folder [OK]
|
||||||
|
Checking file size of planck_rev5_xyverz.hex
|
||||||
|
* File size is fine - 18574/28672
|
||||||
|
```
|
||||||
|
|
||||||
|
Después de llegar a este punto, el script de construcción buscará el bootloader DFU cada 5 segundos. Repetirá lo siguiente hasta que se encuentre el dispositivo o lo canceles:
|
||||||
|
|
||||||
|
dfu-programmer: no device present.
|
||||||
|
Error: Bootloader not found. Trying again in 5s.
|
||||||
|
|
||||||
|
Una vez haya hecho esto, tendrás que reiniciar el controlador. Debería mostrar una información de salida similar a esta:
|
||||||
|
|
||||||
|
```
|
||||||
|
*** Attempting to flash, please don't remove device
|
||||||
|
>>> dfu-programmer atmega32u4 erase --force
|
||||||
|
Erasing flash... Success
|
||||||
|
Checking memory from 0x0 to 0x6FFF... Empty.
|
||||||
|
>>> dfu-programmer atmega32u4 flash /Users/skully/qmk_firmware/clueboard_66_hotswap_gen1_skully.hex
|
||||||
|
Checking memory from 0x0 to 0x55FF... Empty.
|
||||||
|
0% 100% Programming 0x5600 bytes...
|
||||||
|
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] Success
|
||||||
|
0% 100% Reading 0x7000 bytes...
|
||||||
|
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] Success
|
||||||
|
Validating... Success
|
||||||
|
0x5600 bytes written into 0x7000 bytes memory (76.79%).
|
||||||
|
>>> dfu-programmer atmega32u4 reset
|
||||||
|
```
|
||||||
|
|
||||||
|
?> Si tienes problemas con esto- del estilo de `dfu-programmer: no device present` - por favor consulta las [Preguntas frecuentes de construcción](faq_build.md).
|
||||||
|
|
||||||
|
#### Comandos DFU
|
||||||
|
|
||||||
|
Hay un número de comandos DFU que puedes usar para flashear firmware a un dispositivo DFU:
|
||||||
|
|
||||||
|
* `:dfu` - Esta es la opción normal y espera hasta que un dispositivo DFU esté disponible, entonces flashea el firmware. Esperará reintentando cada 5 segundos, para ver si un dispositivo DFU ha aparecido.
|
||||||
|
* `:dfu-ee` - Esta flashea un fichero `eep` en vez del hex normal. Esto no es lo común.
|
||||||
|
* `:dfu-split-left` - Esta flashea el firmware normal, igual que la opción por defecto (`:dfu`). Sin embargo, también flashea el fichero EEPROM "Lado Izquierdo" para teclados divididos. _Esto es ideal para los ficheros divididos basados en Elite C._
|
||||||
|
* `:dfu-split-right` - Esto flashea el firmware normal, igual que la opción por defecto (`:dfu`). Sin embargo, también flashea el fichero EEPROM "Lado Derecho" para teclados divididos. _Esto es ideal para los ficheros divididos basados en Elite C._
|
||||||
|
|
||||||
|
|
||||||
|
### Caterina
|
||||||
|
|
||||||
|
Para placas Arduino y sus clones (como la SparkFun ProMicro), cuando estés listo para compilar y flashear tu firmware, abre tu ventana de terminal y ejecuta el siguiente comando de construcción:
|
||||||
|
|
||||||
|
make <my_keyboard>:<my_keymap>:avrdude
|
||||||
|
|
||||||
|
Por ejemplo, si tu keymap se llama "xyverz" y estás construyendo un keymap para un Lets Split rev2, usarás este comando:
|
||||||
|
|
||||||
|
make lets_split/rev2:xyverz:avrdude
|
||||||
|
|
||||||
|
Una vez que finalice de compilar, deberá aparecer lo siguiente:
|
||||||
|
|
||||||
|
```
|
||||||
|
Linking: .build/lets_split_rev2_xyverz.elf [OK]
|
||||||
|
Creating load file for flashing: .build/lets_split_rev2_xyverz.hex [OK]
|
||||||
|
Checking file size of lets_split_rev2_xyverz.hex [OK]
|
||||||
|
* File size is fine - 27938/28672
|
||||||
|
Detecting USB port, reset your controller now..............
|
||||||
|
```
|
||||||
|
|
||||||
|
En este punto, reinicia la placa y entonces el script detectará el bootloader y procederá a flashear la placa. La información de salida deber ser algo similar a esto:
|
||||||
|
|
||||||
|
```
|
||||||
|
Detected controller on USB port at /dev/ttyS15
|
||||||
|
|
||||||
|
Connecting to programmer: .
|
||||||
|
Found programmer: Id = "CATERIN"; type = S
|
||||||
|
Software Version = 1.0; No Hardware Version given.
|
||||||
|
Programmer supports auto addr increment.
|
||||||
|
Programmer supports buffered memory access with buffersize=128 bytes.
|
||||||
|
|
||||||
|
Programmer supports the following devices:
|
||||||
|
Device code: 0x44
|
||||||
|
|
||||||
|
avrdude.exe: AVR device initialized and ready to accept instructions
|
||||||
|
|
||||||
|
Reading | ################################################## | 100% 0.00s
|
||||||
|
|
||||||
|
avrdude.exe: Device signature = 0x1e9587 (probably m32u4)
|
||||||
|
avrdude.exe: NOTE: "flash" memory has been specified, an erase cycle will be performed
|
||||||
|
To disable this feature, specify the -D option.
|
||||||
|
avrdude.exe: erasing chip
|
||||||
|
avrdude.exe: reading input file "./.build/lets_split_rev2_xyverz.hex"
|
||||||
|
avrdude.exe: input file ./.build/lets_split_rev2_xyverz.hex auto detected as Intel Hex
|
||||||
|
avrdude.exe: writing flash (27938 bytes):
|
||||||
|
|
||||||
|
Writing | ################################################## | 100% 2.40s
|
||||||
|
|
||||||
|
avrdude.exe: 27938 bytes of flash written
|
||||||
|
avrdude.exe: verifying flash memory against ./.build/lets_split_rev2_xyverz.hex:
|
||||||
|
avrdude.exe: load data flash data from input file ./.build/lets_split_rev2_xyverz.hex:
|
||||||
|
avrdude.exe: input file ./.build/lets_split_rev2_xyverz.hex auto detected as Intel Hex
|
||||||
|
avrdude.exe: input file ./.build/lets_split_rev2_xyverz.hex contains 27938 bytes
|
||||||
|
avrdude.exe: reading on-chip flash data:
|
||||||
|
|
||||||
|
Reading | ################################################## | 100% 0.43s
|
||||||
|
|
||||||
|
avrdude.exe: verifying ...
|
||||||
|
avrdude.exe: 27938 bytes of flash verified
|
||||||
|
|
||||||
|
avrdude.exe: safemode: Fuses OK (E:CB, H:D8, L:FF)
|
||||||
|
|
||||||
|
avrdude.exe done. Thank you.
|
||||||
|
```
|
||||||
|
Si tienes problemas con esto, puede ser necesario que hagas esto:
|
||||||
|
|
||||||
|
sudo make <my_keyboard>:<my_keymap>:avrdude
|
||||||
|
|
||||||
|
|
||||||
|
Adicionalmente, si quisieras flashear múltiples placas, usa el siguiente comando:
|
||||||
|
|
||||||
|
make <keyboard>:<keymap>:avrdude-loop
|
||||||
|
|
||||||
|
Cuando hayas acabado de flashear placas, necesitarás pulsar Ctrl + C o cualquier combinación que esté definida en tu sistema operativo para finalizar el bucle.
|
||||||
|
|
||||||
|
|
||||||
|
### HalfKay
|
||||||
|
|
||||||
|
Para dispositivos PJRC (Teensy's), cuando estés listo para compilar y flashear tu firmware, abre tu ventana de terminal y ejecuta el siguiente comando de construcción:
|
||||||
|
|
||||||
|
make <my_keyboard>:<my_keymap>:teensy
|
||||||
|
|
||||||
|
Por ejemplo, si tu keymap se llama "xyverz" y estás construyendo un keymap para un Ergodox o un Ergodox EZ, usarás este comando:
|
||||||
|
|
||||||
|
make ergodox_ez:xyverz:teensy
|
||||||
|
|
||||||
|
Una vez que el firmware acabe de compilar, deberá mostrar una información de salida como esta:
|
||||||
|
|
||||||
|
```
|
||||||
|
Linking: .build/ergodox_ez_xyverz.elf [OK]
|
||||||
|
Creating load file for flashing: .build/ergodox_ez_xyverz.hex [OK]
|
||||||
|
Checking file size of ergodox_ez_xyverz.hex [OK]
|
||||||
|
* File size is fine - 25584/32256
|
||||||
|
Teensy Loader, Command Line, Version 2.1
|
||||||
|
Read "./.build/ergodox_ez_xyverz.hex": 25584 bytes, 79.3% usage
|
||||||
|
Waiting for Teensy device...
|
||||||
|
(hint: press the reset button)
|
||||||
|
```
|
||||||
|
|
||||||
|
En este punto, reinicia tu placa. Una vez que lo hayas hecho, deberás ver una información de salida como esta:
|
||||||
|
|
||||||
|
```
|
||||||
|
Found HalfKay Bootloader
|
||||||
|
Read "./.build/ergodox_ez_xyverz.hex": 28532 bytes, 88.5% usage
|
||||||
|
Programming............................................................................................................................................................................
|
||||||
|
...................................................
|
||||||
|
Booting
|
||||||
|
```
|
||||||
|
|
||||||
|
### BootloadHID
|
||||||
|
|
||||||
|
Para placas basadas en Bootmapper Client(BMC)/bootloadHID/ATmega32A, cuando estés listo para compilar y flashear tu firmware, abre tu ventana de terminal y ejecuta el comando de construcción:
|
||||||
|
|
||||||
|
make <my_keyboard>:<my_keymap>:bootloaderHID
|
||||||
|
|
||||||
|
Por ejemplo, si tu keymap se llama "xyverz" y estás construyendo un keymap para un jj40, usarás esté comando:
|
||||||
|
|
||||||
|
make jj40:xyverz:bootloaderHID
|
||||||
|
|
||||||
|
Una vez que el firmware acaba de compilar, mostrará una información de salida como esta:
|
||||||
|
|
||||||
|
```
|
||||||
|
Linking: .build/jj40_default.elf [OK]
|
||||||
|
Creating load file for flashing: .build/jj40_default.hex [OK]
|
||||||
|
Copying jj40_default.hex to qmk_firmware folder [OK]
|
||||||
|
Checking file size of jj40_default.hex [OK]
|
||||||
|
* The firmware size is fine - 21920/28672 (6752 bytes free)
|
||||||
|
```
|
||||||
|
|
||||||
|
Después de llegar a este punto, el script de construcción buscará el bootloader DFU cada 5 segundos. Repetirá lo siguiente hasta que se encuentre el dispositivo o hasta que lo canceles.
|
||||||
|
|
||||||
|
```
|
||||||
|
Error opening HIDBoot device: The specified device was not found
|
||||||
|
Trying again in 5s.
|
||||||
|
```
|
||||||
|
|
||||||
|
Una vez que lo haga, querrás reinicar el controlador. Debería entonces mostrar una información de salida similar a esta:
|
||||||
|
|
||||||
|
```
|
||||||
|
Page size = 128 (0x80)
|
||||||
|
Device size = 32768 (0x8000); 30720 bytes remaining
|
||||||
|
Uploading 22016 (0x5600) bytes starting at 0 (0x0)
|
||||||
|
0x05580 ... 0x05600
|
||||||
|
```
|
||||||
|
|
||||||
|
### STM32 (ARM)
|
||||||
|
|
||||||
|
Para la mayoría de placas ARM (incluyendo la Proton C, Planck Rev 6, y Preonic Rev 3), cuando estés listo para compilar y flashear tu firmware, abre tu ventana de terminal y ejecuta el siguiente comando de construcción:
|
||||||
|
|
||||||
|
make <my_keyboard>:<my_keymap>:dfu-util
|
||||||
|
|
||||||
|
Por ejemplo, si tu keymap se llama "xyverz" y estás construyendo un keymap para un teclado Planck Revision 6, utilizarás este comando y a continuación reiniciarás el teclado con el bootloader (antes de que acabe de compilar):
|
||||||
|
|
||||||
|
make planck/rev6:xyverz:dfu-util
|
||||||
|
|
||||||
|
Una vez que el firmware acaba de compilar, mostrará una información de salida similar a esta:
|
||||||
|
|
||||||
|
```
|
||||||
|
Linking: .build/planck_rev6_xyverz.elf [OK]
|
||||||
|
Creating binary load file for flashing: .build/planck_rev6_xyverz.bin [OK]
|
||||||
|
Creating load file for flashing: .build/planck_rev6_xyverz.hex [OK]
|
||||||
|
|
||||||
|
Size after:
|
||||||
|
text data bss dec hex filename
|
||||||
|
0 41820 0 41820 a35c .build/planck_rev6_xyverz.hex
|
||||||
|
|
||||||
|
Copying planck_rev6_xyverz.bin to qmk_firmware folder [OK]
|
||||||
|
dfu-util 0.9
|
||||||
|
|
||||||
|
Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
|
||||||
|
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
|
||||||
|
This program is Free Software and has ABSOLUTELY NO WARRANTY
|
||||||
|
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/
|
||||||
|
|
||||||
|
Invalid DFU suffix signature
|
||||||
|
A valid DFU suffix will be required in a future dfu-util release!!!
|
||||||
|
Opening DFU capable USB device...
|
||||||
|
ID 0483:df11
|
||||||
|
Run-time device DFU version 011a
|
||||||
|
Claiming USB DFU Interface...
|
||||||
|
Setting Alternate Setting #0 ...
|
||||||
|
Determining device status: state = dfuERROR, status = 10
|
||||||
|
dfuERROR, clearing status
|
||||||
|
Determining device status: state = dfuIDLE, status = 0
|
||||||
|
dfuIDLE, continuing
|
||||||
|
DFU mode device DFU version 011a
|
||||||
|
Device returned transfer size 2048
|
||||||
|
DfuSe interface name: "Internal Flash "
|
||||||
|
Downloading to address = 0x08000000, size = 41824
|
||||||
|
Download [=========================] 100% 41824 bytes
|
||||||
|
Download done.
|
||||||
|
File downloaded successfully
|
||||||
|
Transitioning to dfuMANIFEST state
|
||||||
|
```
|
||||||
|
|
||||||
|
#### STM32 Commands
|
||||||
|
|
||||||
|
Hay un número de comandos DFU que puedes usar para flashear firmware a un dispositivo DFU:
|
||||||
|
|
||||||
|
* `:dfu-util` - El comando por defecto para flashing en dispositivos STM32.
|
||||||
|
* `:dfu-util-wait` - Esto funciona como el comando por defecto, pero te da (configurable) 10 segundos de tiempo antes de que intente flashear el firmware. Puedes usar `TIME_DELAY=20` desde la líena de comandos para cambiar este tiempo de retardo.
|
||||||
|
* Eg: `make <keyboard>:<keymap>:dfu-util TIME_DELAY=5`
|
||||||
|
* `:dfu-util-split-left` - Flashea el firmware normal, igual que la opción por defecto (`:dfu-util`). Sin embargo, también flashea el fichero EEPROM "Lado Izquierdo" para teclados divididos.
|
||||||
|
* `:dfu-util-split-right` - Flashea el firmware normal, igual que la opción por defecto (`:dfu-util`). Sin embargo, también flashea el fichero EEPROM "Lado Derecho" para teclados divididos.
|
||||||
|
|
||||||
|
## ¡Pruébalo!
|
||||||
|
|
||||||
|
¡Felicidades! ¡Tu firmware personalizado ha sido programado en tu teclado!
|
||||||
|
|
||||||
|
Pruébalo y asegúrate de que todo funciona de la manera que tu quieres. Hemos escrito [Testeando y depurando](newbs_testing_debugging.md) para redondear esta guía de novatos, así que pásate por allí para aprender cómo resolver problemas con tu funcionalidad personalizada.
|
103
docs/es/newbs_getting_started.md
Normal file
103
docs/es/newbs_getting_started.md
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
# Introducción
|
||||||
|
|
||||||
|
El teclado de tu computador tiene un procesador dentro de él, no muy distinto del que está dentro de tu ordenador. Este procesador ejecuta software que es responsable de detectar la pulsación de las teclas y enviar informes sobre el estado del teclado cuando las teclas son pulsadas y liberadas. QMK ocupa el rol de ese software. Cuando construyes un keymap personalizado , estas creando el equivalente de un programa ejecutable en tu teclado.
|
||||||
|
|
||||||
|
QMK intenta poner un montón de poder en tus manos haciendo que las cosas fáciles sean fáciles, y las cosas difíciles posibles. No tienes que saber cómo programar para crear keymaps potentes — sólo tienes que seguir un conjunto simple de reglas sintácticas.
|
||||||
|
|
||||||
|
# Comenzando
|
||||||
|
|
||||||
|
Antes de que puedas construir keymaps, necesitarás instalar algun software y configurar tu entorno de construcción. Esto sólo hay que hacerlo una vez sin importar en cuántos teclados planeas configurar el software.
|
||||||
|
|
||||||
|
Si prefieres hacerlo mediante un interfaz gráfico , por favor, considera utilizar el [Configurador QMK](https://config.qmk.fm). En ese caso dirígete a [Construyendo tu primer firmware usando la GUI](newbs_building_firmware_configurator.md).
|
||||||
|
|
||||||
|
|
||||||
|
## Descarga el software
|
||||||
|
|
||||||
|
### Editor de texto
|
||||||
|
|
||||||
|
Necesitarás un programa con el que puedas editar y guardar archivos de **texto plano**, en windows puedes utilizar Notepad y en tu Linux puedes utilizar gedit. Estos dos programas son editores simples y funcionales. En macOS ten cuidado con la aplicación de edición de texto por defecto TextEdit: no guardará texto plano a menos de que se le seleccione explícitamente _Make Plain Text_ desde el menú _Format_.
|
||||||
|
|
||||||
|
También puedes descargar e instalar un editor de texto dedicado como [Sublime Text](https://www.sublimetext.com/) o [VS Code](https://code.visualstudio.com/). Esta es probablemente la mejor manera independientemente de la plataforma, ya que estos programas fueron creados específicamente para editar código.
|
||||||
|
|
||||||
|
?> ¿No estás seguro de qué editor de texto utilizar? Laurence Bradford escribió una [estupenda introducción](https://learntocodewith.me/programming/basics/text-editors/) al tema.
|
||||||
|
|
||||||
|
### QMK Toolbox
|
||||||
|
|
||||||
|
QMK Toolbox is an optional graphical program for Windows and macOS that allows you to both program and debug your custom keyboard. You will likely find it invaluable for easily flashing your keyboard and viewing debug messages that it prints.
|
||||||
|
|
||||||
|
[Download the latest release here.](https://github.com/qmk/qmk_toolbox/releases/latest)
|
||||||
|
|
||||||
|
* For Windows: `qmk_toolbox.exe` (portable) or `qmk_toolbox_install.exe` (installer)
|
||||||
|
* For macOS: `QMK.Toolbox.app.zip` (portable) or `QMK.Toolbox.pkg` (installer)
|
||||||
|
|
||||||
|
## Configura tu entorno
|
||||||
|
|
||||||
|
Hemos intentado hacer QMK lo más fácil de configurar posible. Sólo tienes que preparar tu entorno Linux o Unix, y luego dejar que QMK
|
||||||
|
instale el resto.
|
||||||
|
|
||||||
|
?> Si no has trabajado con la línea de comandos de Linux/Unix con anterioridad, hay algunos conceptos y comandos básicos que deberías aprender. Estos recursos te enseñarán lo suficiente para poder trabajar con QMK:<br>
|
||||||
|
[Comandos de Linux que debería saber](https://www.guru99.com/must-know-linux-commands.html)<br>
|
||||||
|
[Algunos comandos básicos de Unix](https://www.tjhsst.edu/~dhyatt/superap/unixcmd.html)
|
||||||
|
|
||||||
|
### Windows
|
||||||
|
|
||||||
|
Necesitarás instalar MSYS2 y Git.
|
||||||
|
|
||||||
|
* Sigue las instrucciones de instalación en la [página de MSYS2](http://www.msys2.org).
|
||||||
|
* Cierra las terminales abiertas de MSYS2 y abre una nueva termial de MSYS2 MinGW 64-bit.
|
||||||
|
* Instala Git ejecutando este comando: `pacman -S git`.
|
||||||
|
|
||||||
|
### macOS
|
||||||
|
|
||||||
|
Necesitarás instalar Homebrew. Sigue las instrucciones que encontrarás en la [página de Homebrew](https://brew.sh).
|
||||||
|
|
||||||
|
Despueś de que se haya inastalado Homebrew, continúa con _Set Up QMK_. En ese paso ejecutará un script que instalará el resto de paquetes.
|
||||||
|
|
||||||
|
### Linux
|
||||||
|
|
||||||
|
Necesitarás instalar Git. Es bastante probable que ya lo tengas, pero si no, uno de los siguientes comandos debería instalarlo:
|
||||||
|
|
||||||
|
* Debian / Ubuntu / Devuan: `apt-get install git`
|
||||||
|
* Fedora / Red Hat / CentOS: `yum install git`
|
||||||
|
* Arch: `pacman -S git`
|
||||||
|
|
||||||
|
?> Docker es también una opción en todas las plataformas. [Haz click aquí si quieres detalles.](getting_started_build_tools.md#docker)
|
||||||
|
|
||||||
|
## Configura QMK
|
||||||
|
|
||||||
|
Una vez que hayas configurado tu entorno Linux/Unix, estarás listo para descargar QMK. Haremos esto utilizando Git para "clonar" el respositorio de QMK. Abre una ventana de Terminal o MSYS2 MinGW y mantenla abierta mientras sigues esta guía. Dentro de esa ventana ejecuta estos dos comandos:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
git clone --recurse-submodules https://github.com/qmk/qmk_firmware.git
|
||||||
|
cd qmk_firmware
|
||||||
|
```
|
||||||
|
|
||||||
|
?> Si ya sabes [cómo usar GitHub](getting_started_github.md), te recomendamos en vez de eso, crees y clones tu propio fork. Si no sabes lo que significa, puedes ignorar este mensaje sin problemas.
|
||||||
|
|
||||||
|
QMK viene con un script para ayudarte a configurar el resto de cosas que necesitarás. Deberías ejecutarlo introduciendo este comando:
|
||||||
|
|
||||||
|
util/qmk_install.sh
|
||||||
|
|
||||||
|
## Prueba tu entorno de construcción
|
||||||
|
|
||||||
|
Ahora que tu entorno de construcción de QMK está configurado, puedes construcir un firmware para tu teclado. Comienza intentado construir el keymap por defecto del teclado. Deberías ser capaz de hacerlo con un comando con este formato:
|
||||||
|
|
||||||
|
make <keyboard>:default
|
||||||
|
|
||||||
|
Por ejemplo, para construir el firmware para un Clueboard 66% deberías usar:
|
||||||
|
|
||||||
|
make clueboard/66/rev3:default
|
||||||
|
|
||||||
|
Cuando esté hecho, deberías tener un montón de información de salida similar a esta:
|
||||||
|
|
||||||
|
```
|
||||||
|
Linking: .build/clueboard_66_rev3_default.elf [OK]
|
||||||
|
Creating load file for flashing: .build/clueboard_66_rev3_default.hex [OK]
|
||||||
|
Copying clueboard_66_rev3_default.hex to qmk_firmware folder [OK]
|
||||||
|
Checking file size of clueboard_66_rev3_default.hex [OK]
|
||||||
|
* The firmware size is fine - 26356/28672 (2316 bytes free)
|
||||||
|
```
|
||||||
|
|
||||||
|
# Creando tu keymap
|
||||||
|
|
||||||
|
Ya estás listo para crear tu propio keymap personal! Para hacerlo continua con [Construyendo tu primer firmware](newbs_building_firmware.md).
|
15
docs/es/newbs_learn_more_resources.md
Normal file
15
docs/es/newbs_learn_more_resources.md
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
# Recursos de aprendizaje
|
||||||
|
|
||||||
|
Estos recursos procuran dar miembros nuevos en la communidad QMK un mayor entendimiento de la información proporcionada en la documentación para novatos.
|
||||||
|
|
||||||
|
Recursos de Git:
|
||||||
|
|
||||||
|
* [Excelente tutorial general](https://www.codecademy.com/learn/learn-git)
|
||||||
|
* [Juego de Git para aprender usando ejemplos](https://learngitbranching.js.org/)
|
||||||
|
* [Recursos de Git para aprender más sobre Github](getting_started_github.md)
|
||||||
|
* [Recursos de Git dirigidos específicamente a QMK](contributing.md)
|
||||||
|
|
||||||
|
|
||||||
|
Recursos para línea de mandatos:
|
||||||
|
|
||||||
|
* [Excelente tutorial general sobre la línea de mandatos](https://www.codecademy.com/learn/learn-the-command-line)
|
99
docs/es/newbs_testing_debugging.md
Normal file
99
docs/es/newbs_testing_debugging.md
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
# Testeando y depurando
|
||||||
|
|
||||||
|
Una vez que hayas flasheado tu teclado con un firmware personalizado estarás listo para probarlo. Con un poco de suerte todo funcionará a la primera, pero si no es así, este documento te ayudará a averiguar qué está mal.
|
||||||
|
|
||||||
|
## Probando
|
||||||
|
|
||||||
|
Probar tu teclado es generalmente bastante sencillo. Persiona cada una de las teclas y asegúrate de que envía la tecla correcta. Existen incluso programas que te ayudarán a asegurarte de que no te dejas ninguna tecla sin comprobar.
|
||||||
|
|
||||||
|
Nota: Estos programas no los provée ni están relacionados con QMK.
|
||||||
|
|
||||||
|
* [Switch Hitter](https://elitekeyboards.com/switchhitter.php) (Sólo Windows)
|
||||||
|
* [Keyboard Viewer](https://www.imore.com/how-use-keyboard-viewer-your-mac) (Sólo Mac)
|
||||||
|
* [Keyboard Tester](http://www.keyboardtester.com) (Aplicación web)
|
||||||
|
* [Keyboard Checker](http://keyboardchecker.com) (Aplicación web)
|
||||||
|
|
||||||
|
## Depurando
|
||||||
|
|
||||||
|
Tu teclado mostrará información de depuración si tienes `CONSOLE_ENABLE = yes` en tu `rules.mk`. Por defecto la información de salida es muy limitada, pero puedes encender el modo de depuración para incrementar la información de salida. Utiliza el keycode `DEBUG` de tu keymap, usa la característica [Comando](feature_command.md) para activar el modo depuración, o añade el siguiente código a tu keymap.
|
||||||
|
|
||||||
|
```c
|
||||||
|
void keyboard_post_init_user(void) {
|
||||||
|
// Customise these values to desired behaviour
|
||||||
|
debug_enable=true;
|
||||||
|
debug_matrix=true;
|
||||||
|
//debug_keyboard=true;
|
||||||
|
//debug_mouse=true;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Depurando con QMK Toolbox
|
||||||
|
|
||||||
|
Para plataformas compatibles, [QMK Toolbox](https://github.com/qmk/qmk_toolbox) se puede usar para mostrar mensajes de depuración de tu teclado.
|
||||||
|
|
||||||
|
### Depurando con hid_listen
|
||||||
|
|
||||||
|
¿Prefieres una solución basada en una terminal? [hid_listen](https://www.pjrc.com/teensy/hid_listen.html), provista por PJRC, se puede usar también para mostrar mensajes de depuración. Hay binarios preconstruídos para Windows,Linux,y MacOS.
|
||||||
|
|
||||||
|
<!-- FIXME: Describe the debugging messages here. -->
|
||||||
|
|
||||||
|
## Enviando tus propios mensajes de depuración
|
||||||
|
|
||||||
|
A veces, es útil imprimir mensajes de depuración desde tu [código personalizado](custom_quantum_functions.md). Hacerlo es bastante simple. Comienza incluyendo `print.h` al principio de tu fichero:
|
||||||
|
|
||||||
|
#include <print.h>
|
||||||
|
|
||||||
|
Después de eso puedes utilzar algunas funciones print diferentes:
|
||||||
|
|
||||||
|
* `print("string")`: Imprime un string simple
|
||||||
|
* `uprintf("%s string", var)`: Imprime un string formateado
|
||||||
|
* `dprint("string")` Imprime un string simple, pero sólo cuando el modo de depuración está activo
|
||||||
|
* `dprintf("%s string", var)`: Imprime un string formateado, pero sólo cuando el modo de depuración está activo
|
||||||
|
|
||||||
|
## Ejemplos de depuración
|
||||||
|
|
||||||
|
Debajo hay una colección de ejemplos de depuración del mundo real. Para información adicional, Dirígete a [Depurando/Encontrando problemas en QMK](faq_debug.md).
|
||||||
|
|
||||||
|
### ¿Que posición en la matriz tiene esta pulsación de tecla?
|
||||||
|
|
||||||
|
Cuando estés portando, o intentando diagnosticar problemas en la pcb, puede ser útil saber si la pulsación de una tecla es escaneada correctamente. Para hablitar la información de registro en este escenario, añade el siguiente código al `keymap.c` de tus keymaps
|
||||||
|
|
||||||
|
```c
|
||||||
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
// If console is enabled, it will print the matrix position and status of each key pressed
|
||||||
|
#ifdef CONSOLE_ENABLE
|
||||||
|
uprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed);
|
||||||
|
#endif
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Ejemplo de salida
|
||||||
|
```text
|
||||||
|
Waiting for device:.......
|
||||||
|
Listening:
|
||||||
|
KL: kc: 169, col: 0, row: 0, pressed: 1
|
||||||
|
KL: kc: 169, col: 0, row: 0, pressed: 0
|
||||||
|
KL: kc: 174, col: 1, row: 0, pressed: 1
|
||||||
|
KL: kc: 174, col: 1, row: 0, pressed: 0
|
||||||
|
KL: kc: 172, col: 2, row: 0, pressed: 1
|
||||||
|
KL: kc: 172, col: 2, row: 0, pressed: 0
|
||||||
|
```
|
||||||
|
|
||||||
|
### ¿Cuanto tiempo tardó en escanear la pulsación de una tecla?
|
||||||
|
|
||||||
|
Cuando estés probando problemas en el rendimiento, puede ser útil saber la frecuenta a la cual la matríz de pulsadores se está escaneando. Para hablitar la información de registro en este escenario, añade el siguiente código al `config.h` de tus keymaps
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define DEBUG_MATRIX_SCAN_RATE
|
||||||
|
```
|
||||||
|
|
||||||
|
Ejemplo de salida
|
||||||
|
```text
|
||||||
|
> matrix scan frequency: 315
|
||||||
|
> matrix scan frequency: 313
|
||||||
|
> matrix scan frequency: 316
|
||||||
|
> matrix scan frequency: 316
|
||||||
|
> matrix scan frequency: 316
|
||||||
|
> matrix scan frequency: 316
|
||||||
|
```
|
|
@ -19,7 +19,11 @@ Note that running `make` with `sudo` is generally ***not*** a good idea, and you
|
||||||
|
|
||||||
### Linux `udev` Rules
|
### Linux `udev` Rules
|
||||||
On Linux, you'll need proper privileges to access the MCU. You can either use
|
On Linux, you'll need proper privileges to access the MCU. You can either use
|
||||||
`sudo` when flashing firmware, or place these files in `/etc/udev/rules.d/`.
|
`sudo` when flashing firmware, or place these files in `/etc/udev/rules.d/`. Once added run the following:
|
||||||
|
```console
|
||||||
|
sudo udevadm control --reload-rules
|
||||||
|
sudo udevadm trigger
|
||||||
|
```
|
||||||
|
|
||||||
**/etc/udev/rules.d/50-atmel-dfu.rules:**
|
**/etc/udev/rules.d/50-atmel-dfu.rules:**
|
||||||
```
|
```
|
||||||
|
@ -43,22 +47,39 @@ SUBSYSTEMS=="usb", ATTRS{idVendor}=="feed", MODE:="0666"
|
||||||
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1c11", MODE:="0666"
|
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1c11", MODE:="0666"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**/etc/udev/rules.d/55-catalina.rules:**
|
||||||
|
```
|
||||||
|
# ModemManager should ignore the following devices
|
||||||
|
ATTRS{idVendor}=="2a03", ENV{ID_MM_DEVICE_IGNORE}="1"
|
||||||
|
ATTRS{idVendor}=="2341", ENV{ID_MM_DEVICE_IGNORE}="1"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Note:** ModemManager filtering only works when not in strict mode, the following commands can update that settings:
|
||||||
|
```console
|
||||||
|
sudo sed -i 's/--filter-policy=strict/--filter-policy=default/' /lib/systemd/system/ModemManager.service
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
sudo systemctl restart ModemManager
|
||||||
|
```
|
||||||
|
|
||||||
|
**/etc/udev/rules.d/56-dfu-util.rules:**
|
||||||
|
```
|
||||||
|
# stm32duino
|
||||||
|
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1eaf", ATTRS{idProduct}=="0003", MODE:="0666"
|
||||||
|
# Generic stm32
|
||||||
|
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="df11", MODE:="0666"
|
||||||
|
```
|
||||||
|
|
||||||
### Serial device is not detected in bootloader mode on Linux
|
### Serial device is not detected in bootloader mode on Linux
|
||||||
Make sure your kernel has appropriate support for your device. If your device uses USB ACM, such as
|
Make sure your kernel has appropriate support for your device. If your device uses USB ACM, such as
|
||||||
Pro Micro (Atmega32u4), make sure to include `CONFIG_USB_ACM=y`. Other devices may require `USB_SERIAL` and any of its sub options.
|
Pro Micro (Atmega32u4), make sure to include `CONFIG_USB_ACM=y`. Other devices may require `USB_SERIAL` and any of its sub options.
|
||||||
|
|
||||||
## Unknown Device for DFU Bootloader
|
## Unknown Device for DFU Bootloader
|
||||||
|
|
||||||
If you're using Windows to flash your keyboard, and you are running into issues, check the Device Manager. If you see an "Unknown Device" when the keyboard is in "bootloader mode", then you may have a driver issue.
|
Issues encountered when flashing keyboards on Windows are most often due to having the wrong drivers installed for the bootloader, or none at all.
|
||||||
|
|
||||||
Re-running the installation script for MSYS2 may help (eg run `./util/qmk_install.sh` from MSYS2/WSL) or reinstalling the QMK Toolbox may fix the issue.
|
Re-running the QMK installation script (`./util/qmk_install.sh` from the `qmk_firmware` directory in MSYS2 or WSL) or reinstalling the QMK Toolbox may fix the issue. Alternatively, you can download and run the [`qmk_driver_installer`](https://github.com/qmk/qmk_driver_installer) package manually.
|
||||||
|
|
||||||
If that doesn't work, then you may need to grab the [Zadig Utility](https://zadig.akeo.ie/). Download this, find the device in question, and select the `WinUSB` option, and hit "Reinstall driver". Once you've done that, try flashing your board, again. If that doesn't work, try all of the options, until one works.
|
|
||||||
|
|
||||||
?> There isn't a best option for which driver should be used here. Some options work better on some systems than others. libUSB and WinUSB seem to be the best options here.
|
|
||||||
|
|
||||||
If the bootloader doesn't show up in the list for devices, you may need to enable the "List all devices" option in the `Options` menu, and then find the bootloader in question.
|
|
||||||
|
|
||||||
|
If that doesn't work, then you may need to download and run Zadig. See [Bootloader Driver Installation with Zadig](driver_installation_zadig.md) for more detailed information.
|
||||||
|
|
||||||
## WINAVR is Obsolete
|
## WINAVR is Obsolete
|
||||||
It is no longer recommended and may cause some problem.
|
It is no longer recommended and may cause some problem.
|
||||||
|
|
|
@ -27,7 +27,7 @@ You may need privilege to access the device on OS like Linux.
|
||||||
Check:
|
Check:
|
||||||
- *hid_listen* finds your device. See above.
|
- *hid_listen* finds your device. See above.
|
||||||
- Enable debug with pressing **Magic**+d. See [Magic Commands](https://github.com/tmk/tmk_keyboard#magic-commands).
|
- Enable debug with pressing **Magic**+d. See [Magic Commands](https://github.com/tmk/tmk_keyboard#magic-commands).
|
||||||
- set `debug_enable=true` usually in `matrix_init()` in **matrix.c**.
|
- set `debug_enable=true`. See [Testing and Debugging](newbs_testing_debugging.md#debugging)
|
||||||
- try using 'print' function instead of debug print. See **common/print.h**.
|
- try using 'print' function instead of debug print. See **common/print.h**.
|
||||||
- disconnect other devices with console function. See [Issue #97](https://github.com/tmk/tmk_keyboard/issues/97).
|
- disconnect other devices with console function. See [Issue #97](https://github.com/tmk/tmk_keyboard/issues/97).
|
||||||
|
|
||||||
|
@ -87,6 +87,7 @@ Size after:
|
||||||
- EEPROM has around a 100000 write cycle. You shouldn't rewrite the
|
- EEPROM has around a 100000 write cycle. You shouldn't rewrite the
|
||||||
firmware repeatedly and continually; that'll burn the EEPROM
|
firmware repeatedly and continually; that'll burn the EEPROM
|
||||||
eventually.
|
eventually.
|
||||||
|
|
||||||
## NKRO Doesn't work
|
## NKRO Doesn't work
|
||||||
First you have to compile firmware with this build option `NKRO_ENABLE` in **Makefile**.
|
First you have to compile firmware with this build option `NKRO_ENABLE` in **Makefile**.
|
||||||
|
|
||||||
|
@ -183,22 +184,15 @@ Pressing any key during sleep should wake host.
|
||||||
|
|
||||||
Arduino Leonardo and micro have **ATMega32U4** and can be used for TMK, though Arduino bootloader may be a problem.
|
Arduino Leonardo and micro have **ATMega32U4** and can be used for TMK, though Arduino bootloader may be a problem.
|
||||||
|
|
||||||
|
## Enabling JTAG
|
||||||
|
|
||||||
## Using PF4-7 Pins of USB AVR?
|
By default, the JTAG debugging interface is disabled as soon as the keyboard starts up. JTAG-capable MCUs come from the factory with the `JTAGEN` fuse set, and it takes over certain pins of the MCU that the board may be using for the switch matrix, LEDs, etc.
|
||||||
You need to set JTD bit of MCUCR yourself to use PF4-7 as GPIO. Those pins are configured to serve JTAG function by default. MCUs like ATMega*U* or AT90USB* are affected with this.
|
|
||||||
|
|
||||||
If you are using Teensy this isn't needed. Teensy is shipped with JTAGEN fuse bit unprogrammed to disable the function.
|
If you would like to keep JTAG enabled, just add the following to your `config.h`:
|
||||||
|
|
||||||
See this code.
|
```c
|
||||||
|
#define NO_JTAG_DISABLE
|
||||||
```
|
```
|
||||||
// JTAG disable for PORT F. write JTD bit twice within four cycles.
|
|
||||||
MCUCR |= (1<<JTD);
|
|
||||||
MCUCR |= (1<<JTD);
|
|
||||||
```
|
|
||||||
https://github.com/tmk/tmk_keyboard/blob/master/keyboard/hbkb/matrix.c#L67
|
|
||||||
|
|
||||||
And read **26.5.1 MCU Control Register – MCUCR** of ATMega32U4 datasheet.
|
|
||||||
|
|
||||||
|
|
||||||
## Adding LED Indicators of Lock Keys
|
## Adding LED Indicators of Lock Keys
|
||||||
You need your own LED indicators for CapsLock, ScrollLock and NumLock? See this post.
|
You need your own LED indicators for CapsLock, ScrollLock and NumLock? See this post.
|
||||||
|
|
|
@ -4,10 +4,6 @@
|
||||||
|
|
||||||
[QMK](https://github.com/qmk), short for Quantum Mechanical Keyboard, is a group of people building tools for custom keyboards. We started with the [QMK firmware](https://github.com/qmk/qmk_firmware), a heavily modified fork of [TMK](https://github.com/tmk/tmk_keyboard).
|
[QMK](https://github.com/qmk), short for Quantum Mechanical Keyboard, is a group of people building tools for custom keyboards. We started with the [QMK firmware](https://github.com/qmk/qmk_firmware), a heavily modified fork of [TMK](https://github.com/tmk/tmk_keyboard).
|
||||||
|
|
||||||
### Why the Name Quantum?
|
|
||||||
|
|
||||||
<!-- FIXME -->
|
|
||||||
|
|
||||||
## What Differences Are There Between QMK and TMK?
|
## What Differences Are There Between QMK and TMK?
|
||||||
|
|
||||||
TMK was originally designed and implemented by [Jun Wako](https://github.com/tmk). QMK started as [Jack Humbert](https://github.com/jackhumbert)'s fork of TMK for the Planck. After a while Jack's fork had diverged quite a bit from TMK, and in 2015 Jack decided to rename his fork to QMK.
|
TMK was originally designed and implemented by [Jun Wako](https://github.com/tmk). QMK started as [Jack Humbert](https://github.com/jackhumbert)'s fork of TMK for the Planck. After a while Jack's fork had diverged quite a bit from TMK, and in 2015 Jack decided to rename his fork to QMK.
|
||||||
|
|
|
@ -95,13 +95,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.
|
||||||
|
|
||||||
|
|
||||||
## Media Control Keys in Mac OSX
|
|
||||||
#### KC_MNXT and KC_MPRV Does Not Work on Mac
|
|
||||||
Use `KC_MFFD`(`KC_MEDIA_FAST_FORWARD`) and `KC_MRWD`(`KC_MEDIA_REWIND`) instead of `KC_MNXT` and `KC_MPRV`.
|
|
||||||
See https://github.com/tmk/tmk_keyboard/issues/195
|
|
||||||
|
|
||||||
|
|
||||||
## 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.
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ This will allow you to use `FN_CAPS` and `ALT_TAB` in your keymap, keeping it mo
|
||||||
|
|
||||||
## Caveats
|
## Caveats
|
||||||
|
|
||||||
Currently, `LT()` and `MT()` are limited to the [Basic Keycode set](keycodes_basic.md), meaning you can't use keycodes like `LCTL()`, `KC_TILD`, or anything greater than `0xFF`. Modifiers specified as part of a Layer Tap or Mod Tap's keycode will be ignored. If you need to apply modifiers to your tapped keycode, [Tap Dance](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_tap_dance.md#example-5-using-tap-dance-for-advanced-mod-tap-and-layer-tap-keys) can be used to accomplish this.
|
Currently, `LT()` and `MT()` are limited to the [Basic Keycode set](keycodes_basic.md), meaning you can't use keycodes like `LCTL()`, `KC_TILD`, or anything greater than `0xFF`. Modifiers specified as part of a Layer Tap or Mod Tap's keycode will be ignored. If you need to apply modifiers to your tapped keycode, [Tap Dance](feature_tap_dance.md#example-5-using-tap-dance-for-advanced-mod-tap-and-layer-tap-keys) can be used to accomplish this.
|
||||||
|
|
||||||
Additionally, if at least one right-handed modifier is specified in a Mod Tap or Layer Tap, it will cause all modifiers specified to become right-handed, so it is not possible to mix and match the two.
|
Additionally, if at least one right-handed modifier is specified in a Mod Tap or Layer Tap, it will cause all modifiers specified to become right-handed, so it is not possible to mix and match the two.
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,8 @@ STARTUP_SONG // plays when the keyboard starts up (audio.c)
|
||||||
GOODBYE_SONG // plays when you press the RESET key (quantum.c)
|
GOODBYE_SONG // plays when you press the RESET key (quantum.c)
|
||||||
AG_NORM_SONG // plays when you press AG_NORM (quantum.c)
|
AG_NORM_SONG // plays when you press AG_NORM (quantum.c)
|
||||||
AG_SWAP_SONG // plays when you press AG_SWAP (quantum.c)
|
AG_SWAP_SONG // plays when you press AG_SWAP (quantum.c)
|
||||||
|
CG_NORM_SONG // plays when you press CG_NORM (quantum.c)
|
||||||
|
CG_SWAP_SONG // plays when you press CG_SWAP (quantum.c)
|
||||||
MUSIC_ON_SONG // plays when music mode is activated (process_music.c)
|
MUSIC_ON_SONG // plays when music mode is activated (process_music.c)
|
||||||
MUSIC_OFF_SONG // plays when music mode is deactivated (process_music.c)
|
MUSIC_OFF_SONG // plays when music mode is deactivated (process_music.c)
|
||||||
CHROMATIC_SONG // plays when the chromatic music mode is selected (process_music.c)
|
CHROMATIC_SONG // plays when the chromatic music mode is selected (process_music.c)
|
||||||
|
|
|
@ -51,12 +51,15 @@ By default, Auto Shift is disabled for any key press that is accompanied by one
|
||||||
modifiers. Thus, Ctrl+A that you hold for a really long time is not the same
|
modifiers. Thus, Ctrl+A that you hold for a really long time is not the same
|
||||||
as Ctrl+Shift+A.
|
as Ctrl+Shift+A.
|
||||||
|
|
||||||
You can re-enable Auto Shift for modifiers by adding another rule to your `rules.mk`
|
You can re-enable Auto Shift for modifiers by adding a define to your `config.h`
|
||||||
|
|
||||||
AUTO_SHIFT_MODIFIERS = yes
|
```c
|
||||||
|
#define AUTO_SHIFT_MODIFIERS
|
||||||
|
```
|
||||||
|
|
||||||
In which case, Ctrl+A held past the `AUTO_SHIFT_TIMEOUT` will be sent as Ctrl+Shift+A
|
In which case, Ctrl+A held past the `AUTO_SHIFT_TIMEOUT` will be sent as Ctrl+Shift+A
|
||||||
|
|
||||||
|
|
||||||
## Configuring Auto Shift
|
## Configuring Auto Shift
|
||||||
|
|
||||||
If desired, there is some configuration that can be done to change the
|
If desired, there is some configuration that can be done to change the
|
||||||
|
@ -65,15 +68,12 @@ behavior of Auto Shift. This is done by setting various variables the
|
||||||
|
|
||||||
A sample is
|
A sample is
|
||||||
|
|
||||||
#ifndef CONFIG_USER_H
|
```c
|
||||||
#define CONFIG_USER_H
|
#pragma once
|
||||||
|
|
||||||
#include "../../config.h"
|
#define AUTO_SHIFT_TIMEOUT 150
|
||||||
|
#define NO_AUTO_SHIFT_SPECIAL
|
||||||
#define AUTO_SHIFT_TIMEOUT 150
|
```
|
||||||
#define NO_AUTO_SHIFT_SPECIAL
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
### AUTO_SHIFT_TIMEOUT (Value in ms)
|
### AUTO_SHIFT_TIMEOUT (Value in ms)
|
||||||
|
|
||||||
|
|
|
@ -1,20 +1,23 @@
|
||||||
# Backlighting
|
# Backlighting
|
||||||
|
|
||||||
Many keyboards support backlit keys by way of individual LEDs placed through or underneath the keyswitches. QMK is able to control the brightness of these LEDs by switching them on and off rapidly in a certain ratio, a technique known as *Pulse Width Modulation*, or PWM. By altering the duty cycle of the PWM signal, it creates the illusion of dimming.
|
Many keyboards support backlit keys by way of individual LEDs placed through or underneath the keyswitches. This feature is distinct from both the [RGB underglow](feature_rgblight.md) and [RGB matrix](feature_rgb_matrix.md) features as it usually allows for only a single colour per switch, though you can obviously install multiple different single coloured LEDs on a keyboard.
|
||||||
|
|
||||||
|
QMK is able to control the brightness of these LEDs by switching them on and off rapidly in a certain ratio, a technique known as *Pulse Width Modulation*, or PWM. By altering the duty cycle of the PWM signal, it creates the illusion of dimming.
|
||||||
|
|
||||||
The MCU can only supply so much current to its GPIO pins. Instead of powering the backlight directly from the MCU, the backlight pin is connected to a transistor or MOSFET that switches the power to the LEDs.
|
The MCU can only supply so much current to its GPIO pins. Instead of powering the backlight directly from the MCU, the backlight pin is connected to a transistor or MOSFET that switches the power to the LEDs.
|
||||||
|
|
||||||
## Usage
|
## Driver configuration
|
||||||
|
|
||||||
Most keyboards have backlighting enabled by default if they support it, but if it is not working for you, check that your `rules.mk` includes the following:
|
Most keyboards have backlighting enabled by default if they support it, but if it is not working for you, check that your `rules.mk` includes the following:
|
||||||
|
|
||||||
```make
|
```makefile
|
||||||
BACKLIGHT_ENABLE = yes
|
BACKLIGHT_ENABLE = software # Valid driver values are 'yes,software,no'
|
||||||
```
|
```
|
||||||
|
|
||||||
You should then be able to use the keycodes below to change the backlight level.
|
See below for help on individual drivers.
|
||||||
|
|
||||||
## Keycodes
|
## Keycodes
|
||||||
|
Once enabled the following keycodes below can be used to change the backlight level.
|
||||||
|
|
||||||
|Key |Description |
|
|Key |Description |
|
||||||
|---------|------------------------------------------|
|
|---------|------------------------------------------|
|
||||||
|
@ -26,88 +29,6 @@ You should then be able to use the keycodes below to change the backlight level.
|
||||||
|`BL_DEC` |Decrease the backlight level |
|
|`BL_DEC` |Decrease the backlight level |
|
||||||
|`BL_BRTG`|Toggle backlight breathing |
|
|`BL_BRTG`|Toggle backlight breathing |
|
||||||
|
|
||||||
## Caveats
|
|
||||||
|
|
||||||
This feature is distinct from both the [RGB underglow](feature_rgblight.md) and [RGB matrix](feature_rgb_matrix.md) features as it usually allows for only a single colour per switch, though you can obviously use multiple different coloured LEDs on a keyboard.
|
|
||||||
|
|
||||||
Hardware PWM is only supported on certain pins of the MCU, so if the backlighting is not connected to one of them, a software PWM implementation triggered by hardware timer interrupts will be used.
|
|
||||||
|
|
||||||
Hardware PWM is supported according to the following table:
|
|
||||||
|
|
||||||
| Backlight Pin | Hardware timer |
|
|
||||||
|---------------|-------------------------|
|
|
||||||
|`B5` | Timer 1 |
|
|
||||||
|`B6` | Timer 1 |
|
|
||||||
|`B7` | Timer 1 |
|
|
||||||
|`C6` | Timer 3 |
|
|
||||||
|`D4` | Timer 1 (ATmega32A only)|
|
|
||||||
| other | Software PWM |
|
|
||||||
|
|
||||||
The [audio feature](feature_audio.md) also uses hardware timers. Please refer to the following table to know what hardware timer the software PWM will use depending on the audio configuration:
|
|
||||||
|
|
||||||
| Audio Pin(s) | Audio Timer | Software PWM Timer |
|
|
||||||
|--------------|-------------|--------------------|
|
|
||||||
| `C4` | Timer 3 | Timer 1 |
|
|
||||||
| `C5` | Timer 3 | Timer 1 |
|
|
||||||
| `C6` | Timer 3 | Timer 1 |
|
|
||||||
| `B5` | Timer 1 | Timer 3 |
|
|
||||||
| `B6` | Timer 1 | Timer 3 |
|
|
||||||
| `B7` | Timer 1 | Timer 3 |
|
|
||||||
| `Bx` & `Cx` | Timer 1 & 3 | None |
|
|
||||||
|
|
||||||
When all timers are in use for [audio](feature_audio.md), the backlight software PWM will not use a hardware timer, but instead will be triggered during the matrix scan. In this case the backlight doesn't support breathing and might show lighting artifacts (for instance flickering), because the PWM computation might not be called with enough timing precision.
|
|
||||||
|
|
||||||
## Configuration
|
|
||||||
|
|
||||||
To change the behaviour of the backlighting, `#define` these in your `config.h`:
|
|
||||||
|
|
||||||
|Define |Default |Description |
|
|
||||||
|---------------------|-------------|-------------------------------------------------------------------------------------------------------------|
|
|
||||||
|`BACKLIGHT_PIN` |`B7` |The pin that controls the LEDs. Unless you are designing your own keyboard, you shouldn't need to change this|
|
|
||||||
|`BACKLIGHT_PINS` |*Not defined*|experimental: see below for more information |
|
|
||||||
|`BACKLIGHT_LEVELS` |`3` |The number of brightness levels (maximum 15 excluding off) |
|
|
||||||
|`BACKLIGHT_CAPS_LOCK`|*Not defined*|Enable Caps Lock indicator using backlight (for keyboards without dedicated LED) |
|
|
||||||
|`BACKLIGHT_BREATHING`|*Not defined*|Enable backlight breathing, if supported |
|
|
||||||
|`BREATHING_PERIOD` |`6` |The length of one backlight "breath" in seconds |
|
|
||||||
|`BACKLIGHT_ON_STATE` |`0` |The state of the backlight pin when the backlight is "on" - `1` for high, `0` for low |
|
|
||||||
|
|
||||||
## Backlight On State
|
|
||||||
|
|
||||||
Most backlight circuits are driven by an N-channel MOSFET or NPN transistor. This means that to turn the transistor *on* and light the LEDs, you must drive the backlight pin, connected to the gate or base, *low*.
|
|
||||||
Sometimes, however, a P-channel MOSFET, or a PNP transistor is used. In this case you must `#define BACKLIGHT_ON_STATE 1`, so that when the transistor is on, the pin is driven *high* instead.
|
|
||||||
|
|
||||||
## Multiple backlight pins
|
|
||||||
|
|
||||||
Most keyboards have only one backlight pin which control all backlight LEDs (especially if the backlight is connected to an hardware PWM pin).
|
|
||||||
In software PWM, it is possible to define multiple backlight pins. All those pins will be turned on and off at the same time during the PWM duty cycle.
|
|
||||||
This feature allows to set for instance the Caps Lock LED (or any other controllable LED) brightness at the same level as the other LEDs of the backlight. This is useful if you have mapped LCTRL in place of Caps Lock and you need the Caps Lock LED to be part of the backlight instead of being activated when Caps Lock is on.
|
|
||||||
|
|
||||||
To activate multiple backlight pins, you need to add something like this to your user `config.h`:
|
|
||||||
|
|
||||||
~~~c
|
|
||||||
#define BACKLIGHT_LED_COUNT 2
|
|
||||||
#undef BACKLIGHT_PIN
|
|
||||||
#define BACKLIGHT_PINS { F5, B2 }
|
|
||||||
~~~
|
|
||||||
|
|
||||||
## Hardware PWM Implementation
|
|
||||||
|
|
||||||
When using the supported pins for backlighting, QMK will use a hardware timer configured to output a PWM signal. This timer will count up to `ICRx` (by default `0xFFFF`) before resetting to 0.
|
|
||||||
The desired brightness is calculated and stored in the `OCRxx` register. When the counter reaches this value, the backlight pin will go low, and is pulled high again when the counter resets.
|
|
||||||
In this way `OCRxx` essentially controls the duty cycle of the LEDs, and thus the brightness, where `0x0000` is completely off and `0xFFFF` is completely on.
|
|
||||||
|
|
||||||
The breathing effect is achieved by registering an interrupt handler for `TIMER1_OVF_vect` that is called whenever the counter resets, roughly 244 times per second.
|
|
||||||
In this handler, the value of an incrementing counter is mapped onto a precomputed brightness curve. To turn off breathing, the interrupt handler is simply disabled, and the brightness reset to the level stored in EEPROM.
|
|
||||||
|
|
||||||
## Software PWM Implementation
|
|
||||||
|
|
||||||
When `BACKLIGHT_PIN` is not set to a hardware backlight pin, QMK will use a hardware timer configured to trigger software interrupts. This time will count up to `ICRx` (by default `0xFFFF`) before resetting to 0.
|
|
||||||
When resetting to 0, the CPU will fire an OVF (overflow) interrupt that will turn the LEDs on, starting the duty cycle.
|
|
||||||
The desired brightness is calculated and stored in the `OCRxx` register. When the counter reaches this value, the CPU will fire a Compare Output match interrupt, which will turn the LEDs off.
|
|
||||||
In this way `OCRxx` essentially controls the duty cycle of the LEDs, and thus the brightness, where `0x0000` is completely off and `0xFFFF` is completely on.
|
|
||||||
|
|
||||||
The breathing effect is the same as in the hardware PWM implementation.
|
|
||||||
|
|
||||||
## Backlight Functions
|
## Backlight Functions
|
||||||
|
|
||||||
|Function |Description |
|
|Function |Description |
|
||||||
|
@ -124,8 +45,158 @@ The breathing effect is the same as in the hardware PWM implementation.
|
||||||
|
|
||||||
### Backlight Breathing Functions
|
### Backlight Breathing Functions
|
||||||
|
|
||||||
|Function |Description |
|
|Function |Description |
|
||||||
|----------|----------------------------------------------------------|
|
|----------|---------------------------------------------------|
|
||||||
|`breathing_toggle()` |Turn the backlight breathing on or off |
|
|`breathing_toggle()` |Turn the backlight breathing on or off |
|
||||||
|`breathing_enable()` |Turns on backlight breathing |
|
|`breathing_enable()` |Turns on backlight breathing |
|
||||||
|`breathing_disable()` |Turns off backlight breathing |
|
|`breathing_disable()` |Turns off backlight breathing |
|
||||||
|
|
||||||
|
## Common Driver Configuration
|
||||||
|
|
||||||
|
To change the behavior of the backlighting, `#define` these in your `config.h`:
|
||||||
|
|
||||||
|
|Define |Default |Description |
|
||||||
|
|---------------------|-------------|--------------------------------------------------------------------------------------|
|
||||||
|
|`BACKLIGHT_LEVELS` |`3` |The number of brightness levels (maximum 31 excluding off) |
|
||||||
|
|`BACKLIGHT_CAPS_LOCK`|*Not defined*|Enable Caps Lock indicator using backlight (for keyboards without dedicated LED) |
|
||||||
|
|`BACKLIGHT_BREATHING`|*Not defined*|Enable backlight breathing, if supported |
|
||||||
|
|`BREATHING_PERIOD` |`6` |The length of one backlight "breath" in seconds |
|
||||||
|
|`BACKLIGHT_ON_STATE` |`0` |The state of the backlight pin when the backlight is "on" - `1` for high, `0` for low |
|
||||||
|
|
||||||
|
### Backlight On State
|
||||||
|
|
||||||
|
Most backlight circuits are driven by an N-channel MOSFET or NPN transistor. This means that to turn the transistor *on* and light the LEDs, you must drive the backlight pin, connected to the gate or base, *high*.
|
||||||
|
Sometimes, however, a P-channel MOSFET, or a PNP transistor is used. In this case, when the transistor is on, the pin is driven *low* instead.
|
||||||
|
|
||||||
|
This functionality is configured at the keyboard level with the `BACKLIGHT_ON_STATE` define.
|
||||||
|
|
||||||
|
## AVR driver
|
||||||
|
|
||||||
|
On AVR boards, the default driver currently sniffs the configuration to pick the best scenario. To enable it, add this to your rules.mk:
|
||||||
|
```makefile
|
||||||
|
BACKLIGHT_ENABLE = yes
|
||||||
|
```
|
||||||
|
|
||||||
|
### Caveats
|
||||||
|
|
||||||
|
Hardware PWM is supported according to the following table:
|
||||||
|
|
||||||
|
|Backlight Pin|AT90USB64/128|ATmega16/32U4|ATmega16/32U2|ATmega32A|ATmega328P|
|
||||||
|
|-------------|-------------|-------------|-------------|---------|----------|
|
||||||
|
|`B1` | | | | |Timer 1 |
|
||||||
|
|`B2` | | | | |Timer 1 |
|
||||||
|
|`B5` |Timer 1 |Timer 1 | | | |
|
||||||
|
|`B6` |Timer 1 |Timer 1 | | | |
|
||||||
|
|`B7` |Timer 1 |Timer 1 |Timer 1 | | |
|
||||||
|
|`C4` |Timer 3 | | | | |
|
||||||
|
|`C5` |Timer 3 | |Timer 1 | | |
|
||||||
|
|`C6` |Timer 3 |Timer 3 |Timer 1 | | |
|
||||||
|
|`D4` | | | |Timer 1 | |
|
||||||
|
|`D5` | | | |Timer 1 | |
|
||||||
|
|
||||||
|
All other pins will use software PWM. If the [Audio](feature_audio.md) feature is disabled or only using one timer, the backlight PWM can be triggered by a hardware timer:
|
||||||
|
|
||||||
|
|Audio Pin|Audio Timer|Software PWM Timer|
|
||||||
|
|---------|-----------|------------------|
|
||||||
|
|`C4` |Timer 3 |Timer 1 |
|
||||||
|
|`C5` |Timer 3 |Timer 1 |
|
||||||
|
|`C6` |Timer 3 |Timer 1 |
|
||||||
|
|`B5` |Timer 1 |Timer 3 |
|
||||||
|
|`B6` |Timer 1 |Timer 3 |
|
||||||
|
|`B7` |Timer 1 |Timer 3 |
|
||||||
|
|
||||||
|
When both timers are in use for Audio, the backlight PWM will not use a hardware timer, but will instead be triggered during the matrix scan. In this case, breathing is not supported, and the backlight might flicker, because the PWM computation may not be called with enough timing precision.
|
||||||
|
|
||||||
|
### AVR Configuration
|
||||||
|
|
||||||
|
To change the behavior of the backlighting, `#define` these in your `config.h`:
|
||||||
|
|
||||||
|
|Define |Default |Description |
|
||||||
|
|---------------------|-------------|--------------------------------------------------------------------------------------------------------------|
|
||||||
|
|`BACKLIGHT_PIN` |`B7` |The pin that controls the LEDs. Unless you are designing your own keyboard, you shouldn't need to change this |
|
||||||
|
|`BACKLIGHT_PINS` |*Not defined*|experimental: see below for more information |
|
||||||
|
|
||||||
|
### Multiple backlight pins
|
||||||
|
|
||||||
|
Most keyboards have only one backlight pin which control all backlight LEDs (especially if the backlight is connected to an hardware PWM pin).
|
||||||
|
In software PWM, it is possible to define multiple backlight pins. All those pins will be turned on and off at the same time during the PWM duty cycle.
|
||||||
|
This feature allows to set for instance the Caps Lock LED (or any other controllable LED) brightness at the same level as the other LEDs of the backlight. This is useful if you have mapped LCTRL in place of Caps Lock and you need the Caps Lock LED to be part of the backlight instead of being activated when Caps Lock is on.
|
||||||
|
|
||||||
|
To activate multiple backlight pins, you need to add something like this to your user `config.h`:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define BACKLIGHT_LED_COUNT 2
|
||||||
|
#undef BACKLIGHT_PIN
|
||||||
|
#define BACKLIGHT_PINS { F5, B2 }
|
||||||
|
```
|
||||||
|
|
||||||
|
### Hardware PWM Implementation
|
||||||
|
|
||||||
|
When using the supported pins for backlighting, QMK will use a hardware timer configured to output a PWM signal. This timer will count up to `ICRx` (by default `0xFFFF`) before resetting to 0.
|
||||||
|
The desired brightness is calculated and stored in the `OCRxx` register. When the counter reaches this value, the backlight pin will go low, and is pulled high again when the counter resets.
|
||||||
|
In this way `OCRxx` essentially controls the duty cycle of the LEDs, and thus the brightness, where `0x0000` is completely off and `0xFFFF` is completely on.
|
||||||
|
|
||||||
|
The breathing effect is achieved by registering an interrupt handler for `TIMER1_OVF_vect` that is called whenever the counter resets, roughly 244 times per second.
|
||||||
|
In this handler, the value of an incrementing counter is mapped onto a precomputed brightness curve. To turn off breathing, the interrupt handler is simply disabled, and the brightness reset to the level stored in EEPROM.
|
||||||
|
|
||||||
|
### Timer Assisted PWM Implementation
|
||||||
|
|
||||||
|
When `BACKLIGHT_PIN` is not set to a hardware backlight pin, QMK will use a hardware timer configured to trigger software interrupts. This time will count up to `ICRx` (by default `0xFFFF`) before resetting to 0.
|
||||||
|
When resetting to 0, the CPU will fire an OVF (overflow) interrupt that will turn the LEDs on, starting the duty cycle.
|
||||||
|
The desired brightness is calculated and stored in the `OCRxx` register. When the counter reaches this value, the CPU will fire a Compare Output match interrupt, which will turn the LEDs off.
|
||||||
|
In this way `OCRxx` essentially controls the duty cycle of the LEDs, and thus the brightness, where `0x0000` is completely off and `0xFFFF` is completely on.
|
||||||
|
|
||||||
|
The breathing effect is the same as in the hardware PWM implementation.
|
||||||
|
|
||||||
|
## ARM Driver
|
||||||
|
|
||||||
|
While still in its early stages, ARM backlight support aims to eventually have feature parity with AVR. To enable it, add this to your rules.mk:
|
||||||
|
```makefile
|
||||||
|
BACKLIGHT_ENABLE = yes
|
||||||
|
```
|
||||||
|
|
||||||
|
### Caveats
|
||||||
|
|
||||||
|
Currently only hardware PWM is supported, not timer assisted, and does not provide automatic configuration.
|
||||||
|
|
||||||
|
?> STMF072 support is being investigated.
|
||||||
|
|
||||||
|
### ARM Configuration
|
||||||
|
|
||||||
|
To change the behavior of the backlighting, `#define` these in your `config.h`:
|
||||||
|
|
||||||
|
|Define |Default |Description |
|
||||||
|
|------------------------|-------------|-------------------------------------------------------------------------------------------------------------|
|
||||||
|
|`BACKLIGHT_PIN` |`B7` |The pin that controls the LEDs. Unless you are designing your own keyboard, you shouldn't need to change this|
|
||||||
|
|`BACKLIGHT_PWM_DRIVER` |`PWMD4` |The PWM driver to use, see ST datasheets for pin to PWM timer mapping. Unless you are designing your own keyboard, you shouldn't need to change this|
|
||||||
|
|`BACKLIGHT_PWM_CHANNEL` |`3` |The PWM channel to use, see ST datasheets for pin to PWM channel mapping. Unless you are designing your own keyboard, you shouldn't need to change this|
|
||||||
|
|`BACKLIGHT_PAL_MODE` |`2` |The pin alternative function to use, see ST datasheets for pin AF mapping. Unless you are designing your own keyboard, you shouldn't need to change this|
|
||||||
|
|
||||||
|
## Software PWM Driver
|
||||||
|
|
||||||
|
Emulation of PWM while running other keyboard tasks, it offers maximum hardware compatibility without extra platform configuration. The tradeoff is the backlight might jitter when the keyboard is busy. To enable, add this to your rules.mk:
|
||||||
|
```makefile
|
||||||
|
BACKLIGHT_ENABLE = software
|
||||||
|
```
|
||||||
|
|
||||||
|
### Software PWM Configuration
|
||||||
|
|
||||||
|
To change the behavior of the backlighting, `#define` these in your `config.h`:
|
||||||
|
|
||||||
|
|Define |Default |Description |
|
||||||
|
|-----------------|-------------|-------------------------------------------------------------------------------------------------------------|
|
||||||
|
|`BACKLIGHT_PIN` |`B7` |The pin that controls the LEDs. Unless you are designing your own keyboard, you shouldn't need to change this|
|
||||||
|
|`BACKLIGHT_PINS` |*Not defined*|experimental: see below for more information |
|
||||||
|
|
||||||
|
### Multiple backlight pins
|
||||||
|
|
||||||
|
Most keyboards have only one backlight pin which control all backlight LEDs (especially if the backlight is connected to an hardware PWM pin).
|
||||||
|
In software PWM, it is possible to define multiple backlight pins. All those pins will be turned on and off at the same time during the PWM duty cycle.
|
||||||
|
This feature allows to set for instance the Caps Lock LED (or any other controllable LED) brightness at the same level as the other LEDs of the backlight. This is useful if you have mapped LCTRL in place of Caps Lock and you need the Caps Lock LED to be part of the backlight instead of being activated when Caps Lock is on.
|
||||||
|
|
||||||
|
To activate multiple backlight pins, you need to add something like this to your user `config.h`:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#undef BACKLIGHT_PIN
|
||||||
|
#define BACKLIGHT_PINS { F5, B2 }
|
||||||
|
```
|
||||||
|
|
|
@ -2,18 +2,18 @@
|
||||||
|
|
||||||
## Bluetooth Known Supported Hardware
|
## Bluetooth Known Supported Hardware
|
||||||
|
|
||||||
Currently Bluetooth support is limited to AVR based chips. For Bluetooth 2.1 Qmk has support for RN-42 HID Firmware and Bluefruit EZ Key the later of which is not produced anymore. For more recent BLE protocols currently only the Adafruit Bluefruit SPI friend is directly supported. BLE is needed to connect to iOS devices. Note iOS does not support Mouse Input.
|
Currently Bluetooth support is limited to AVR based chips. For Bluetooth 2.1, QMK has support for RN-42 modules and the Bluefruit EZ-Key, the latter of which is not produced anymore. For more recent BLE protocols, currently only the Adafruit Bluefruit SPI Friend is directly supported. BLE is needed to connect to iOS devices. Note iOS does not support mouse input.
|
||||||
|
|
||||||
|Board |Bluetooth Protocol |Connection Type |Rules.mk |Bluetooth Chip|
|
|Board |Bluetooth Protocol |Connection Type |rules.mk |Bluetooth Chip|
|
||||||
|----------------------------------------------------------------|----------------------------|----------------|---------------------------|--------------|
|
|----------------------------------------------------------------|----------------------------|----------------|---------------------------|--------------|
|
||||||
|[Adafruit EzKey HID]("https://www.adafruit.com/product/1535") |Bluetooth Classic | UART | BLUETOOTH = AdafruitEZKey | |
|
|[Adafruit EZ-Key HID](https://www.adafruit.com/product/1535) |Bluetooth Classic | UART |`BLUETOOTH = AdafruitEZKey` | |
|
||||||
|Rover Networks RN-42 (Sparkfun Bluesmirf) |Bluetooth Classic | UART | BLUETOOTH = RN42 | RN-42 |
|
|Roving Networks RN-42 (Sparkfun Bluesmirf) |Bluetooth Classic | UART |`BLUETOOTH = RN42` | RN-42 |
|
||||||
|[Bluefruit LE SPI Friend](https://www.adafruit.com/product/2633)|Bluetooth Low Energy | SPI | BLUETOOTH = AdafruitBLE | nRF5182 |
|
|[Bluefruit LE SPI Friend](https://www.adafruit.com/product/2633)|Bluetooth Low Energy | SPI |`BLUETOOTH = AdafruitBLE` | nRF51822 |
|
||||||
|
|
||||||
Not Supported Yet but possible:
|
Not Supported Yet but possible:
|
||||||
* [Bluefruit LE UART Friend](https://www.adafruit.com/product/2479). [Possible tmk implementation found in](https://github.com/tmk/tmk_keyboard/issues/514)
|
* [Bluefruit LE UART Friend](https://www.adafruit.com/product/2479). [Possible tmk implementation found in](https://github.com/tmk/tmk_keyboard/issues/514)
|
||||||
* HC-05 boards flashed with RN-42 firmware. They apparently both use the CSR BC417 Chip. Flashing it with RN-42 firmware gives it HID capability.
|
* HC-05 boards flashed with RN-42 firmware. They apparently both use the CSR BC417 Chip. Flashing it with RN-42 firmware gives it HID capability.
|
||||||
* [Sparkfun Bluetooth mate](https://www.sparkfun.com/products/14839)
|
* Sparkfun Bluetooth Mate
|
||||||
* HM-13 based boards
|
* HM-13 based boards
|
||||||
|
|
||||||
### Adafruit BLE SPI Friend
|
### Adafruit BLE SPI Friend
|
||||||
|
|
|
@ -34,6 +34,8 @@ Hold down the Bootmagic key (Space by default) and the desired hotkey while plug
|
||||||
|`X` |Toggle key matrix debugging |
|
|`X` |Toggle key matrix debugging |
|
||||||
|`K` |Toggle keyboard debugging |
|
|`K` |Toggle keyboard debugging |
|
||||||
|`M` |Toggle mouse debugging |
|
|`M` |Toggle mouse debugging |
|
||||||
|
|`L` |Set "Left Hand" for EE_HANDS handedness |
|
||||||
|
|`R` |Set "Right Hand" for EE_HANDS handedness |
|
||||||
|Backspace |Clear the EEPROM |
|
|Backspace |Clear the EEPROM |
|
||||||
|Caps Lock |Toggle treating Caps Lock as Left Control |
|
|Caps Lock |Toggle treating Caps Lock as Left Control |
|
||||||
|Left Control |Toggle swapping Caps Lock and Left Control |
|
|Left Control |Toggle swapping Caps Lock and Left Control |
|
||||||
|
@ -64,8 +66,11 @@ Hold down the Bootmagic key (Space by default) and the desired hotkey while plug
|
||||||
|`MAGIC_NO_GUI` | |Disable the GUI keys (useful when gaming) |
|
|`MAGIC_NO_GUI` | |Disable the GUI keys (useful when gaming) |
|
||||||
|`MAGIC_UNNO_GUI` | |Enable the GUI keys |
|
|`MAGIC_UNNO_GUI` | |Enable the GUI keys |
|
||||||
|`MAGIC_SWAP_ALT_GUI` |`AG_SWAP`|Swap Alt and GUI on both sides (for macOS)|
|
|`MAGIC_SWAP_ALT_GUI` |`AG_SWAP`|Swap Alt and GUI on both sides (for macOS)|
|
||||||
|`MAGIC_UNSWAP_ALT_GUI` |`AG_NORM`|Unswap Left Alt and Left GUI |
|
|`MAGIC_UNSWAP_ALT_GUI` |`AG_NORM`|Unswap Alt and GUI |
|
||||||
|`MAGIC_TOGGLE_ALT_GUI` |`AG_TOGG`|Toggle Left Alt and GUI swap |
|
|`MAGIC_TOGGLE_ALT_GUI` |`AG_TOGG`|Toggle Alt and GUI swap |
|
||||||
|
|`MAGIC_SWAP_CTL_GUI` |`CG_SWAP`|Swap Ctrl and GUI on both sides (for macOS)|
|
||||||
|
|`MAGIC_UNSWAP_CTL_GUI` |`CG_NORM`|Unswap Ctrl and GUI |
|
||||||
|
|`MAGIC_TOGGLE_CTL_GUI` |`CG_TOGG`|Toggle Ctrl and GUI swap |
|
||||||
|`MAGIC_SWAP_BACKSLASH_BACKSPACE` | |Swap `\` and Backspace |
|
|`MAGIC_SWAP_BACKSLASH_BACKSPACE` | |Swap `\` and Backspace |
|
||||||
|`MAGIC_UNSWAP_BACKSLASH_BACKSPACE`| |Unswap `\` and Backspace |
|
|`MAGIC_UNSWAP_BACKSLASH_BACKSPACE`| |Unswap `\` and Backspace |
|
||||||
|`MAGIC_SWAP_CONTROL_CAPSLOCK` | |Swap Left Control and Caps Lock |
|
|`MAGIC_SWAP_CONTROL_CAPSLOCK` | |Swap Left Control and Caps Lock |
|
||||||
|
@ -76,6 +81,12 @@ Hold down the Bootmagic key (Space by default) and the desired hotkey while plug
|
||||||
|`MAGIC_UNSWAP_LALT_LGUI` | |Unswap Left Alt and Left GUI |
|
|`MAGIC_UNSWAP_LALT_LGUI` | |Unswap Left Alt and Left GUI |
|
||||||
|`MAGIC_SWAP_RALT_RGUI` | |Swap Right Alt and Right GUI |
|
|`MAGIC_SWAP_RALT_RGUI` | |Swap Right Alt and Right GUI |
|
||||||
|`MAGIC_UNSWAP_RALT_RGUI` | |Unswap Right Alt and Right GUI |
|
|`MAGIC_UNSWAP_RALT_RGUI` | |Unswap Right Alt and Right GUI |
|
||||||
|
|`MAGIC_SWAP_LCTL_LGUI` | |Swap Left Control and Left GUI |
|
||||||
|
|`MAGIC_UNSWAP_LCTL_LGUI` | |Unswap Left Control and Left GUI |
|
||||||
|
|`MAGIC_SWAP_RCTL_RGUI` | |Swap Right Control and Right GUI |
|
||||||
|
|`MAGIC_UNSWAP_RCTL_RGUI` | |Unswap Right Control and Right GUI |
|
||||||
|
|`MAGIC_EE_HANDS_LEFT` | |Set "Left Hand" for EE_HANDS handedness |
|
||||||
|
|`MAGIC_EE_HANDS_RIGHT` | |Set "Right Hand" for EE_HANDS handedness |
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
|
@ -91,6 +102,8 @@ If you would like to change the hotkey assignments for Bootmagic, `#define` thes
|
||||||
|`BOOTMAGIC_KEY_DEBUG_MATRIX` |`KC_X` |Toggle matrix debugging |
|
|`BOOTMAGIC_KEY_DEBUG_MATRIX` |`KC_X` |Toggle matrix debugging |
|
||||||
|`BOOTMAGIC_KEY_DEBUG_KEYBOARD` |`KC_K` |Toggle keyboard debugging |
|
|`BOOTMAGIC_KEY_DEBUG_KEYBOARD` |`KC_K` |Toggle keyboard debugging |
|
||||||
|`BOOTMAGIC_KEY_DEBUG_MOUSE` |`KC_M` |Toggle mouse debugging |
|
|`BOOTMAGIC_KEY_DEBUG_MOUSE` |`KC_M` |Toggle mouse debugging |
|
||||||
|
|`BOOTMAGIC_KEY_EE_HANDS_LEFT` |`KC_L` |Set "Left Hand" for EE_HANDS handedness |
|
||||||
|
|`BOOTMAGIC_KEY_EE_HANDS_RIGHT` |`KC_R` |Set "Right Hand" for EE_HANDS handedness |
|
||||||
|`BOOTMAGIC_KEY_SWAP_CONTROL_CAPSLOCK` |`KC_LCTRL` |Swap Left Control and Caps Lock |
|
|`BOOTMAGIC_KEY_SWAP_CONTROL_CAPSLOCK` |`KC_LCTRL` |Swap Left Control and Caps Lock |
|
||||||
|`BOOTMAGIC_KEY_CAPSLOCK_TO_CONTROL` |`KC_CAPSLOCK`|Toggle treating Caps Lock as Left Control |
|
|`BOOTMAGIC_KEY_CAPSLOCK_TO_CONTROL` |`KC_CAPSLOCK`|Toggle treating Caps Lock as Left Control |
|
||||||
|`BOOTMAGIC_KEY_SWAP_LALT_LGUI` |`KC_LALT` |Toggle swapping Left Alt and Left GUI (for macOS) |
|
|`BOOTMAGIC_KEY_SWAP_LALT_LGUI` |`KC_LALT` |Toggle swapping Left Alt and Left GUI (for macOS) |
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
The Combo feature is a chording type solution for adding custom actions. It lets you hit multiple keys at once and produce a different effect. For instance, hitting `A` and `S` within the tapping term would hit `ESC` instead, or have it perform even more complex tasks.
|
The Combo feature is a chording type solution for adding custom actions. It lets you hit multiple keys at once and produce a different effect. For instance, hitting `A` and `S` within the tapping term would hit `ESC` instead, or have it perform even more complex tasks.
|
||||||
|
|
||||||
To enable this feature, yu need to add `COMBO_ENABLE = yes` to your `rules.mk`.
|
To enable this feature, you need to add `COMBO_ENABLE = yes` to your `rules.mk`.
|
||||||
|
|
||||||
Additionally, in your `config.h`, you'll need to specify the number of combos that you'll be using, by adding `#define COMBO_COUNT 1` (replacing 1 with the number that you're using).
|
Additionally, in your `config.h`, you'll need to specify the number of combos that you'll be using, by adding `#define COMBO_COUNT 1` (replacing 1 with the number that you're using).
|
||||||
<!-- At this time, this is necessary -->
|
<!-- At this time, this is necessary -->
|
||||||
|
@ -59,19 +59,12 @@ void process_combo_event(uint8_t combo_index, bool pressed) {
|
||||||
switch(combo_index) {
|
switch(combo_index) {
|
||||||
case ZC_COPY:
|
case ZC_COPY:
|
||||||
if (pressed) {
|
if (pressed) {
|
||||||
register_code(KC_LCTL);
|
tap_code16(LCTL(KC_C));
|
||||||
register_code(KC_C);
|
|
||||||
unregister_code(KC_C);
|
|
||||||
unregister_code(KC_LCTL);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case XV_PASTE:
|
case XV_PASTE:
|
||||||
if (pressed) {
|
if (pressed) {
|
||||||
register_code(KC_LCTL);
|
tap_code16(LCTL(KC_V));
|
||||||
register_code(KC_V);
|
|
||||||
unregister_code(KC_V);
|
|
||||||
unregister_code(KC_LCTL);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -87,3 +80,24 @@ If you're using long combos, or even longer combos, you may run into issues with
|
||||||
In this case, you can add either `#define EXTRA_LONG_COMBOS` or `#define EXTRA_EXTRA_LONG_COMBOS` in your `config.h` file.
|
In this case, you can add either `#define EXTRA_LONG_COMBOS` or `#define EXTRA_EXTRA_LONG_COMBOS` in your `config.h` file.
|
||||||
|
|
||||||
You may also be able to enable action keys by defining `COMBO_ALLOW_ACTION_KEYS`.
|
You may also be able to enable action keys by defining `COMBO_ALLOW_ACTION_KEYS`.
|
||||||
|
|
||||||
|
## Keycodes
|
||||||
|
|
||||||
|
You can enable, disable and toggle the Combo feature on the fly. This is useful if you need to disable them temporarily, such as for a game.
|
||||||
|
|
||||||
|
|Keycode |Description |
|
||||||
|
|----------|---------------------------------|
|
||||||
|
|`CMB_ON` |Turns on Combo feature |
|
||||||
|
|`CMB_OFF` |Turns off Combo feature |
|
||||||
|
|`CMB_TOG` |Toggles Combo feature on and off |
|
||||||
|
|
||||||
|
## User callbacks
|
||||||
|
|
||||||
|
In addition to the keycodes, there are a few functions that you can use to set the status, or check it:
|
||||||
|
|
||||||
|
|Function |Description |
|
||||||
|
|-----------|--------------------------------------------------------------------|
|
||||||
|
| `combo_enable()` | Enables the combo feature |
|
||||||
|
| `combo_disable()` | Disables the combo feature, and clears the combo buffer |
|
||||||
|
| `combo_toggle()` | Toggles the state of the combo feature |
|
||||||
|
| `is_combo_enabled()` | Returns the status of the combo feature state (true or false) |
|
||||||
|
|
|
@ -16,36 +16,36 @@ To use Command, hold down the key combination defined by the `IS_COMMAND()` macr
|
||||||
|
|
||||||
If you would like to change the key assignments for Command, `#define` these in your `config.h` at either the keyboard or keymap level. All keycode assignments here must omit the `KC_` prefix.
|
If you would like to change the key assignments for Command, `#define` these in your `config.h` at either the keyboard or keymap level. All keycode assignments here must omit the `KC_` prefix.
|
||||||
|
|
||||||
|Define |Default |Description |
|
|Define |Default |Description |
|
||||||
|------------------------------------|---------------------------------------------------------------------------|------------------------------------------------|
|
|------------------------------------|--------------------------------|------------------------------------------------|
|
||||||
|`IS_COMMAND()` |<code>(get_mods() == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)))</code>|The key combination to activate Command |
|
|`IS_COMMAND()` |`(get_mods() == MOD_MASK_SHIFT)`|The key combination to activate Command |
|
||||||
|`MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS` |`true` |Set default layer with the Function row |
|
|`MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS` |`true` |Set default layer with the Function row |
|
||||||
|`MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS` |`true` |Set default layer with the number keys |
|
|`MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS` |`true` |Set default layer with the number keys |
|
||||||
|`MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM`|`false` |Set default layer with `MAGIC_KEY_LAYER0..9` |
|
|`MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM`|`false` |Set default layer with `MAGIC_KEY_LAYER0..9` |
|
||||||
|`MAGIC_KEY_DEBUG` |`D` |Toggle debugging over serial |
|
|`MAGIC_KEY_DEBUG` |`D` |Toggle debugging over serial |
|
||||||
|`MAGIC_KEY_DEBUG_MATRIX` |`X` |Toggle key matrix debugging |
|
|`MAGIC_KEY_DEBUG_MATRIX` |`X` |Toggle key matrix debugging |
|
||||||
|`MAGIC_KEY_DEBUG_KBD` |`K` |Toggle keyboard debugging |
|
|`MAGIC_KEY_DEBUG_KBD` |`K` |Toggle keyboard debugging |
|
||||||
|`MAGIC_KEY_DEBUG_MOUSE` |`M` |Toggle mouse debugging |
|
|`MAGIC_KEY_DEBUG_MOUSE` |`M` |Toggle mouse debugging |
|
||||||
|`MAGIC_KEY_CONSOLE` |`C` |Enable the Command console |
|
|`MAGIC_KEY_CONSOLE` |`C` |Enable the Command console |
|
||||||
|`MAGIC_KEY_VERSION` |`V` |Print the running QMK version to the console |
|
|`MAGIC_KEY_VERSION` |`V` |Print the running QMK version to the console |
|
||||||
|`MAGIC_KEY_STATUS` |`S` |Print the current keyboard status to the console|
|
|`MAGIC_KEY_STATUS` |`S` |Print the current keyboard status to the console|
|
||||||
|`MAGIC_KEY_HELP` |`H` |Print Command help to the console |
|
|`MAGIC_KEY_HELP` |`H` |Print Command help to the console |
|
||||||
|`MAGIC_KEY_HELP_ALT` |`SLASH` |Print Command help to the console (alternate) |
|
|`MAGIC_KEY_HELP_ALT` |`SLASH` |Print Command help to the console (alternate) |
|
||||||
|`MAGIC_KEY_LAYER0` |`0` |Make layer 0 the default layer |
|
|`MAGIC_KEY_LAYER0` |`0` |Make layer 0 the default layer |
|
||||||
|`MAGIC_KEY_LAYER0_ALT` |`GRAVE` |Make layer 0 the default layer (alternate) |
|
|`MAGIC_KEY_LAYER0_ALT` |`GRAVE` |Make layer 0 the default layer (alternate) |
|
||||||
|`MAGIC_KEY_LAYER1` |`1` |Make layer 1 the default layer |
|
|`MAGIC_KEY_LAYER1` |`1` |Make layer 1 the default layer |
|
||||||
|`MAGIC_KEY_LAYER2` |`2` |Make layer 2 the default layer |
|
|`MAGIC_KEY_LAYER2` |`2` |Make layer 2 the default layer |
|
||||||
|`MAGIC_KEY_LAYER3` |`3` |Make layer 3 the default layer |
|
|`MAGIC_KEY_LAYER3` |`3` |Make layer 3 the default layer |
|
||||||
|`MAGIC_KEY_LAYER4` |`4` |Make layer 4 the default layer |
|
|`MAGIC_KEY_LAYER4` |`4` |Make layer 4 the default layer |
|
||||||
|`MAGIC_KEY_LAYER5` |`5` |Make layer 5 the default layer |
|
|`MAGIC_KEY_LAYER5` |`5` |Make layer 5 the default layer |
|
||||||
|`MAGIC_KEY_LAYER6` |`6` |Make layer 6 the default layer |
|
|`MAGIC_KEY_LAYER6` |`6` |Make layer 6 the default layer |
|
||||||
|`MAGIC_KEY_LAYER7` |`7` |Make layer 7 the default layer |
|
|`MAGIC_KEY_LAYER7` |`7` |Make layer 7 the default layer |
|
||||||
|`MAGIC_KEY_LAYER8` |`8` |Make layer 8 the default layer |
|
|`MAGIC_KEY_LAYER8` |`8` |Make layer 8 the default layer |
|
||||||
|`MAGIC_KEY_LAYER9` |`9` |Make layer 9 the default layer |
|
|`MAGIC_KEY_LAYER9` |`9` |Make layer 9 the default layer |
|
||||||
|`MAGIC_KEY_BOOTLOADER` |`B` |Jump to bootloader |
|
|`MAGIC_KEY_BOOTLOADER` |`B` |Jump to bootloader |
|
||||||
|`MAGIC_KEY_BOOTLOADER_ALT` |`ESC` |Jump to bootloader (alternate) |
|
|`MAGIC_KEY_BOOTLOADER_ALT` |`ESC` |Jump to bootloader (alternate) |
|
||||||
|`MAGIC_KEY_LOCK` |`CAPS` |Lock the keyboard so nothing can be typed |
|
|`MAGIC_KEY_LOCK` |`CAPS` |Lock the keyboard so nothing can be typed |
|
||||||
|`MAGIC_KEY_EEPROM` |`E` |Print stored EEPROM config to the console |
|
|`MAGIC_KEY_EEPROM` |`E` |Print stored EEPROM config to the console |
|
||||||
|`MAGIC_KEY_EEPROM_CLEAR` |`BSPACE` |Clear the EEPROM |
|
|`MAGIC_KEY_EEPROM_CLEAR` |`BSPACE` |Clear the EEPROM |
|
||||||
|`MAGIC_KEY_NKRO` |`N` |Toggle N-Key Rollover (NKRO) |
|
|`MAGIC_KEY_NKRO` |`N` |Toggle N-Key Rollover (NKRO) |
|
||||||
|`MAGIC_KEY_SLEEP_LED` |`Z` |Toggle LED when computer is sleeping |
|
|`MAGIC_KEY_SLEEP_LED` |`Z` |Toggle LED when computer is sleeping |
|
||||||
|
|
|
@ -17,14 +17,14 @@ endif
|
||||||
| DEBOUNCE_TYPE | Description | What else is needed |
|
| DEBOUNCE_TYPE | Description | What else is needed |
|
||||||
| ------------- | --------------------------------------------------- | ----------------------------- |
|
| ------------- | --------------------------------------------------- | ----------------------------- |
|
||||||
| Not defined | Use the default algorithm, currently sym_g | Nothing |
|
| Not defined | Use the default algorithm, currently sym_g | Nothing |
|
||||||
| custom | Use your own debounce.c | ```SRC += debounce.c``` add your own debounce.c and implement necessary functions |
|
| custom | Use your own debounce code | ```SRC += debounce.c``` add your own debounce.c and implement necessary functions |
|
||||||
| anything_else | Use another algorithm from quantum/debounce/* | Nothing |
|
| anything_else | Use another algorithm from quantum/debounce/* | Nothing |
|
||||||
|
|
||||||
**Regarding split keyboards**:
|
**Regarding split keyboards**:
|
||||||
The debounce code is compatible with split keyboards.
|
The debounce code is compatible with split keyboards.
|
||||||
|
|
||||||
# Use your own debouncing code
|
# Use your own debouncing code
|
||||||
* Set ```DEBOUNCE_TYPE = custom ```.
|
* Set ```DEBOUNCE_TYPE = custom```.
|
||||||
* Add ```SRC += debounce.c```
|
* Add ```SRC += debounce.c```
|
||||||
* Add your own ```debounce.c```. Look at current implementations in ```quantum/debounce``` for examples.
|
* Add your own ```debounce.c```. Look at current implementations in ```quantum/debounce``` for examples.
|
||||||
* Debouncing occurs after every raw matrix scan.
|
* Debouncing occurs after every raw matrix scan.
|
||||||
|
@ -33,10 +33,10 @@ The debounce code is compatible with split keyboards.
|
||||||
# Changing between included debouncing methods
|
# Changing between included debouncing methods
|
||||||
You can either use your own code, by including your own debounce.c, or switch to another included one.
|
You can either use your own code, by including your own debounce.c, or switch to another included one.
|
||||||
Included debounce methods are:
|
Included debounce methods are:
|
||||||
* eager_pr - debouncing per row. On any state change, response is immediate, followed by locking the row ```DEBOUNCE_DELAY``` milliseconds of no further input for that row.
|
* eager_pr - debouncing per row. On any state change, response is immediate, followed by locking the row ```DEBOUNCE``` milliseconds of no further input for that row.
|
||||||
For use in keyboards where refreshing ```NUM_KEYS``` 8-bit counters is computationally expensive / low scan rate, and fingers usually only hit one row at a time. This could be
|
For use in keyboards where refreshing ```NUM_KEYS``` 8-bit counters is computationally expensive / low scan rate, and fingers usually only hit one row at a time. This could be
|
||||||
appropriate for the ErgoDox models; the matrix is rotated 90°, and hence its "rows" are really columns, and each finger only hits a single "row" at a time in normal use.
|
appropriate for the ErgoDox models; the matrix is rotated 90°, and hence its "rows" are really columns, and each finger only hits a single "row" at a time in normal use.
|
||||||
* eager_pk - debouncing per key. On any state change, response is immediate, followed by ```DEBOUNCE_DELAY``` milliseconds of no further input for that key
|
* eager_pk - debouncing per key. On any state change, response is immediate, followed by ```DEBOUNCE``` milliseconds of no further input for that key
|
||||||
* sym_g - debouncing per keyboard. On any state change, a global timer is set. When ```DEBOUNCE_DELAY``` milliseconds of no changes has occured, all input changes are pushed.
|
* sym_g - debouncing per keyboard. On any state change, a global timer is set. When ```DEBOUNCE``` milliseconds of no changes has occured, all input changes are pushed.
|
||||||
|
|
||||||
|
|
||||||
|
|
90
docs/feature_dip_switch.md
Normal file
90
docs/feature_dip_switch.md
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
# DIP Switches
|
||||||
|
|
||||||
|
DIP switches are supported by adding this to your `rules.mk`:
|
||||||
|
|
||||||
|
DIP_SWITCH_ENABLE = yes
|
||||||
|
|
||||||
|
and this to your `config.h`:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define DIP_SWITCH_PINS { B14, A15, A10, B9 }
|
||||||
|
```
|
||||||
|
|
||||||
|
## Callbacks
|
||||||
|
|
||||||
|
The callback functions can be inserted into your `<keyboard>.c`:
|
||||||
|
|
||||||
|
```c
|
||||||
|
void dip_switch_update_kb(uint8_t index, bool active) {
|
||||||
|
dip_switch_update_user(index, active);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
or `keymap.c`:
|
||||||
|
|
||||||
|
```c
|
||||||
|
void dip_switch_update_user(uint8_t index, bool active) {
|
||||||
|
switch (index) {
|
||||||
|
case 0:
|
||||||
|
if(active) { audio_on(); } else { audio_off(); }
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if(active) { clicky_on(); } else { clicky_off(); }
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if(active) { music_on(); } else { music_off(); }
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
if (active) {
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
PLAY_SONG(plover_song);
|
||||||
|
#endif
|
||||||
|
layer_on(_PLOVER);
|
||||||
|
} else {
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
PLAY_SONG(plover_gb_song);
|
||||||
|
#endif
|
||||||
|
layer_off(_PLOVER);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Additionally, we support bit mask functions which allow for more complex handling.
|
||||||
|
|
||||||
|
|
||||||
|
```c
|
||||||
|
void dip_switch_update_mask_kb(uint32_t state) {
|
||||||
|
dip_switch_update_mask_user(state);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
or `keymap.c`:
|
||||||
|
|
||||||
|
```c
|
||||||
|
void dip_switch_update_mask_user(uint32_t state) {
|
||||||
|
if (state & (1UL<<0) && state & (1UL<<1)) {
|
||||||
|
layer_on(_ADJUST); // C on esc
|
||||||
|
} else {
|
||||||
|
layer_off(_ADJUST);
|
||||||
|
}
|
||||||
|
if (state & (1UL<<0)) {
|
||||||
|
layer_on(_TEST_A); // A on ESC
|
||||||
|
} else {
|
||||||
|
layer_off(_TEST_A);
|
||||||
|
}
|
||||||
|
if (state & (1UL<<1)) {
|
||||||
|
layer_on(_TEST_B); // B on esc
|
||||||
|
} else {
|
||||||
|
layer_off(_TEST_B);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Hardware
|
||||||
|
|
||||||
|
One side of the DIP switch should be wired directly to the pin on the MCU, and the other side to ground. It should not matter which side is connected to which, as it should be functionally the same.
|
|
@ -4,51 +4,45 @@ QMK supports temporary macros created on the fly. We call these Dynamic Macros.
|
||||||
|
|
||||||
You can store one or two macros and they may have a combined total of 128 keypresses. You can increase this size at the cost of RAM.
|
You can store one or two macros and they may have a combined total of 128 keypresses. You can increase this size at the cost of RAM.
|
||||||
|
|
||||||
To enable them, first add a new element to the end of your `keycodes` enum — `DYNAMIC_MACRO_RANGE`:
|
To enable them, first include `DYNAMIC_MACRO_ENABLE = yes` in your `rules.mk`. Then, add the following keys to your keymap:
|
||||||
|
|
||||||
```c
|
|Key |Alias |Description |
|
||||||
enum keycodes {
|
|------------------|----------|---------------------------------------------------|
|
||||||
QWERTY = SAFE_RANGE,
|
|`DYN_REC_START1` |`DM_REC1` |Start recording Macro 1 |
|
||||||
COLEMAK,
|
|`DYN_REC_START2` |`DM_REC2` |Start recording Macro 2 |
|
||||||
DVORAK,
|
|`DYN_MACRO_PLAY1` |`DM_PLY1` |Replay Macro 1 |
|
||||||
PLOVER,
|
|`DYN_MACRO_PLAY2` |`DM_PLY2` |Replay Macro 2 |
|
||||||
LOWER,
|
|`DYN_REC_STOP` |`DM_RSTP` |Finish the macro that is currently being recorded. |
|
||||||
RAISE,
|
|
||||||
BACKLIT,
|
|
||||||
EXT_PLV,
|
|
||||||
DYNAMIC_MACRO_RANGE,
|
|
||||||
};
|
|
||||||
```
|
|
||||||
|
|
||||||
Your `keycodes` enum may have a slightly different name. You must add `DYNAMIC_MACRO_RANGE` as the last element because `dynamic_macros.h` will add some more keycodes after it.
|
That should be everything necessary.
|
||||||
|
|
||||||
Below it, include the `dynamic_macro.h` header:
|
To start recording the macro, press either `DYN_REC_START1` or `DYN_REC_START2`.
|
||||||
|
|
||||||
```c
|
To finish the recording, press the `DYN_REC_STOP` layer button.
|
||||||
#include "dynamic_macro.h"`
|
|
||||||
```
|
|
||||||
|
|
||||||
Add the following keys to your keymap:
|
To replay the macro, press either `DYN_MACRO_PLAY1` or `DYN_MACRO_PLAY2`.
|
||||||
|
|
||||||
* `DYN_REC_START1` — start recording the macro 1,
|
It is possible to replay a macro as part of a macro. It's ok to replay macro 2 while recording macro 1 and vice versa but never create recursive macros i.e. macro 1 that replays macro 1. If you do so and the keyboard will get unresponsive, unplug the keyboard and plug it again. You can disable this completly by defining `DYNAMIC_MACRO_NO_NESTING` in your `config.h` file.
|
||||||
* `DYN_REC_START2` — start recording the macro 2,
|
|
||||||
* `DYN_MACRO_PLAY1` — replay the macro 1,
|
|
||||||
* `DYN_MACRO_PLAY2` — replay the macro 2,
|
|
||||||
* `DYN_REC_STOP` — finish the macro that is currently being recorded.
|
|
||||||
|
|
||||||
Add the following code to the very beginning of your `process_record_user()` function:
|
?> For the details about the internals of the dynamic macros, please read the comments in the `process_dynamic_macro.h` and `process_dynamic_macro.c` files.
|
||||||
|
|
||||||
```c
|
## Customization
|
||||||
if (!process_record_dynamic_macro(keycode, record)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
That should be everything necessary. To start recording the macro, press either `DYN_REC_START1` or `DYN_REC_START2`. To finish the recording, press the `DYN_REC_STOP` layer button. To replay the macro, press either `DYN_MACRO_PLAY1` or `DYN_MACRO_PLAY2`.
|
There are a number of options added that should allow some additional degree of customization
|
||||||
|
|
||||||
Note that it's possible to replay a macro as part of a macro. It's ok to replay macro 2 while recording macro 1 and vice versa but never create recursive macros i.e. macro 1 that replays macro 1. If you do so and the keyboard will get unresponsive, unplug the keyboard and plug it again.
|
|Define |Default |Description |
|
||||||
|
|----------------------------|----------------|-----------------------------------------------------------------------------------------------------------------|
|
||||||
|
|`DYNAMIC_MACRO_SIZE` |128 |Sets the amount of memory that Dynamic Macros can use. This is a limited resource, dependent on the controller. |
|
||||||
|
|`DYNAMIC_MACRO_USER_CALL` |*Not defined* |Defining this falls back to using the user `keymap.c` file to trigger the macro behavior. |
|
||||||
|
|`DYNAMIC_MACRO_NO_NESTING` |*Not Defined* |Defining this disables the ability to call a macro from another macro (nested macros). |
|
||||||
|
|
||||||
For users of the earlier versions of dynamic macros: It is still possible to finish the macro recording using just the layer modifier used to access the dynamic macro keys, without a dedicated `DYN_REC_STOP` key. If you want this behavior back, use the following snippet instead of the one above:
|
|
||||||
|
If the LEDs start blinking during the recording with each keypress, it means there is no more space for the macro in the macro buffer. To fit the macro in, either make the other macro shorter (they share the same buffer) or increase the buffer size by adding the `DYNAMIC_MACRO_SIZE` define in your `config.h` (default value: 128; please read the comments for it in the header).
|
||||||
|
|
||||||
|
|
||||||
|
### DYNAMIC_MACRO_USER_CALL
|
||||||
|
|
||||||
|
For users of the earlier versions of dynamic macros: It is still possible to finish the macro recording using just the layer modifier used to access the dynamic macro keys, without a dedicated `DYN_REC_STOP` key. If you want this behavior back, add `#define DYNAMIC_MACRO_USER_CALL` to your `config.h` and insert the following snippet at the beginning of your `process_record_user()` function:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
uint16_t macro_kc = (keycode == MO(_DYN) ? DYN_REC_STOP : keycode);
|
uint16_t macro_kc = (keycode == MO(_DYN) ? DYN_REC_STOP : keycode);
|
||||||
|
@ -58,6 +52,15 @@ For users of the earlier versions of dynamic macros: It is still possible to fin
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
If the LEDs start blinking during the recording with each keypress, it means there is no more space for the macro in the macro buffer. To fit the macro in, either make the other macro shorter (they share the same buffer) or increase the buffer size by setting the `DYNAMIC_MACRO_SIZE` preprocessor macro (default value: 128; please read the comments for it in the header).
|
### User Hooks
|
||||||
|
|
||||||
For the details about the internals of the dynamic macros, please read the comments in the `dynamic_macro.h` header.
|
There are a number of hooks that you can use to add custom functionality and feedback options to Dynamic Macro feature. This allows for some additional degree of customization.
|
||||||
|
|
||||||
|
Note, that direction indicates which macro it is, with `1` being Macro 1, `-1` being Macro 2, and 0 being no macro.
|
||||||
|
|
||||||
|
* `dynamic_macro_record_start_user(void)` - Triggered when you start recording a macro.
|
||||||
|
* `dynamic_macro_play_user(int8_t direction)` - Triggered when you play back a macro.
|
||||||
|
* `dynamic_macro_record_key_user(int8_t direction, keyrecord_t *record)` - Triggered on each keypress while recording a macro.
|
||||||
|
* `dynamic_macro_record_end_user(int8_t direction)` - Triggered when the macro recording is stopped.
|
||||||
|
|
||||||
|
Additionally, you can call `dynamic_macro_led_blink()` to flash the backlights if that feature is enabled.
|
||||||
|
|
|
@ -6,7 +6,6 @@ Basic encoders are supported by adding this to your `rules.mk`:
|
||||||
|
|
||||||
and this to your `config.h`:
|
and this to your `config.h`:
|
||||||
|
|
||||||
#define NUMBER_OF_ENCODERS 1
|
|
||||||
#define ENCODERS_PAD_A { B12 }
|
#define ENCODERS_PAD_A { B12 }
|
||||||
#define ENCODERS_PAD_B { B13 }
|
#define ENCODERS_PAD_B { B13 }
|
||||||
|
|
||||||
|
@ -21,6 +20,15 @@ Additionally, the resolution can be specified in the same file (the default & su
|
||||||
|
|
||||||
#define ENCODER_RESOLUTION 4
|
#define ENCODER_RESOLUTION 4
|
||||||
|
|
||||||
|
## Split Keyboards
|
||||||
|
|
||||||
|
If you are using different pinouts for the encoders on each half of a split keyboard, you can define the pinout for the right half like this:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define ENCODERS_PAD_A_RIGHT { encoder1a, encoder2a }
|
||||||
|
#define ENCODERS_PAD_B_RIGHT { encoder1b, encoder2b }
|
||||||
|
```
|
||||||
|
|
||||||
## Callbacks
|
## Callbacks
|
||||||
|
|
||||||
The callback functions can be inserted into your `<keyboard>.c`:
|
The callback functions can be inserted into your `<keyboard>.c`:
|
||||||
|
|
|
@ -22,13 +22,16 @@ Not all keycodes below will work depending on which haptic mechanism you have ch
|
||||||
| Name | Description |
|
| Name | Description |
|
||||||
|-----------|-------------------------------------------------------|
|
|-----------|-------------------------------------------------------|
|
||||||
|`HPT_ON` | Turn haptic feedback on |
|
|`HPT_ON` | Turn haptic feedback on |
|
||||||
|`HPT_OFF` | Turn haptic feedback on |
|
|`HPT_OFF` | Turn haptic feedback off |
|
||||||
|`HPT_TOG` | Toggle haptic feedback on/off |
|
|`HPT_TOG` | Toggle haptic feedback on/off |
|
||||||
|`HPT_RST` | Reset haptic feedback config to default |
|
|`HPT_RST` | Reset haptic feedback config to default |
|
||||||
|`HPT_FBK` | Toggle feedback to occur on keypress, release or both |
|
|`HPT_FBK` | Toggle feedback to occur on keypress, release or both |
|
||||||
|`HPT_BUZ` | Toggle solenoid buzz on/off |
|
|`HPT_BUZ` | Toggle solenoid buzz on/off |
|
||||||
|`HPT_MODI` | Go to next DRV2605L waveform |
|
|`HPT_MODI` | Go to next DRV2605L waveform |
|
||||||
|`HPT_MODD` | Go to previous DRV2605L waveform |
|
|`HPT_MODD` | Go to previous DRV2605L waveform |
|
||||||
|
|`HPT_CONT` | Toggle continuous haptic mode on/off |
|
||||||
|
|`HPT_CONI` | Increase DRV2605L continous haptic strength |
|
||||||
|
|`HPT_COND` | Decrease DRV2605L continous haptic strength |
|
||||||
|`HPT_DWLI` | Increase Solenoid dwell time |
|
|`HPT_DWLI` | Increase Solenoid dwell time |
|
||||||
|`HPT_DWLD` | Decrease Solenoid dwell time |
|
|`HPT_DWLD` | Decrease Solenoid dwell time |
|
||||||
|
|
||||||
|
@ -38,11 +41,15 @@ First you will need a build a circuit to drive the solenoid through a mosfet as
|
||||||
|
|
||||||
[Wiring diagram provided by Adafruit](https://playground.arduino.cc/uploads/Learning/solenoid_driver.pdf)
|
[Wiring diagram provided by Adafruit](https://playground.arduino.cc/uploads/Learning/solenoid_driver.pdf)
|
||||||
|
|
||||||
Select a pin that has PWM for the signal pin
|
|
||||||
|
|
||||||
```
|
| Settings | Default | Description |
|
||||||
#define SOLENOID_PIN *pin*
|
|--------------------------|---------------|-------------------------------------------------------|
|
||||||
```
|
|`SOLENOID_PIN` | *Not defined* |Configures the pin that the Solenoid is connected to. |
|
||||||
|
|`SOLENOID_DEFAULT_DWELL` | `12` ms |Configures the default dwell time for the solenoid. |
|
||||||
|
|`SOLENOID_MIN_DWELL` | `4` ms |Sets the lower limit for the dwell. |
|
||||||
|
|`SOLENOID_MAX_DWELL` | `100` ms |Sets the upper limit for the dwell. |
|
||||||
|
|
||||||
|
?> Dwell time is how long the "plunger" stays activated. The dwell time changes how the solenoid sounds.
|
||||||
|
|
||||||
Beware that some pins may be powered during bootloader (ie. A13 on the STM32F303 chip) and will result in the solenoid kept in the on state through the whole flashing process. This may overheat and damage the solenoid. If you find that the pin the solenoid is connected to is triggering the solenoid during bootloader/DFU, select another pin.
|
Beware that some pins may be powered during bootloader (ie. A13 on the STM32F303 chip) and will result in the solenoid kept in the on state through the whole flashing process. This may overheat and damage the solenoid. If you find that the pin the solenoid is connected to is triggering the solenoid during bootloader/DFU, select another pin.
|
||||||
|
|
||||||
|
@ -145,3 +152,7 @@ If haptic feedback is enabled, the keyboard will vibrate to a specific sqeuence
|
||||||
#define DRV_MODE_DEFAULT *sequence name or number*
|
#define DRV_MODE_DEFAULT *sequence name or number*
|
||||||
```
|
```
|
||||||
This will set what sequence HPT_RST will set as the active mode. If not defined, mode will be set to 1 when HPT_RST is pressed.
|
This will set what sequence HPT_RST will set as the active mode. If not defined, mode will be set to 1 when HPT_RST is pressed.
|
||||||
|
|
||||||
|
### DRV2605L Continuous Haptic Mode
|
||||||
|
|
||||||
|
This mode sets continuous haptic feedback with the option to increase or decrease strength.
|
||||||
|
|
|
@ -2,11 +2,12 @@
|
||||||
|
|
||||||
This is an integration of Peter Fleury's LCD library. This page will explain the basics. [For in depth documentation visit his page.](http://homepage.hispeed.ch/peterfleury/doxygen/avr-gcc-libraries/group__pfleury__lcd.html)
|
This is an integration of Peter Fleury's LCD library. This page will explain the basics. [For in depth documentation visit his page.](http://homepage.hispeed.ch/peterfleury/doxygen/avr-gcc-libraries/group__pfleury__lcd.html)
|
||||||
|
|
||||||
You can enable support for HD44780 Displays by setting the `HD44780_ENABLE` flag in your keyboards `rules.mk` to yes. This will use about 400 KB of extra space.
|
You can enable support for HD44780 Displays by setting the `HD44780_ENABLE` flag in your keyboards `rules.mk` to yes.
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
You will need to configure the pins used by your display and its number of lines and collumn in your keyboards `config.h`.
|
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.
|
Uncomment the section labled HD44780 and change the parameters as needed.
|
||||||
````
|
````
|
||||||
|
@ -40,7 +41,7 @@ Should you need to configure other properties you can copy them from `quantum/hd
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
To initialize your display call lcd_init() with one of these parameters:
|
To initialize your display, call `lcd_init()` with one of these parameters:
|
||||||
````
|
````
|
||||||
LCD_DISP_OFF : display off
|
LCD_DISP_OFF : display off
|
||||||
LCD_DISP_ON : display on, cursor off
|
LCD_DISP_ON : display on, cursor off
|
||||||
|
@ -53,4 +54,4 @@ To do so call `lcd_clrsrc()`.
|
||||||
|
|
||||||
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")`.
|
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")`.
|
||||||
|
|
||||||
There are more posible methods to control the display. [For in depth documentation please visit the linked page.](http://homepage.hispeed.ch/peterfleury/doxygen/avr-gcc-libraries/group__pfleury__lcd.html)
|
There are more methods available to control the display. [For in depth documentation please visit the linked page.](http://homepage.hispeed.ch/peterfleury/doxygen/avr-gcc-libraries/group__pfleury__lcd.html)
|
||||||
|
|
|
@ -16,7 +16,7 @@ First, enable Key Lock by setting `KEY_LOCK_ENABLE = yes` in your `rules.mk`. Th
|
||||||
|
|
||||||
## Caveats
|
## Caveats
|
||||||
|
|
||||||
Key Lock is only able to hold standard action keys and [One Shot modifier](quantum_keycodes.md#one-shot-keys) keys (for example, if you have your Shift defined as `OSM(KC_LSFT)`).
|
Key Lock is only able to hold standard action keys and [One Shot modifier](feature_advanced_keycodes.md#one-shot-keys) keys (for example, if you have your Shift defined as `OSM(KC_LSFT)`).
|
||||||
This does not include any of the QMK special functions (except One Shot modifiers), or shifted versions of keys such as `KC_LPRN`. If it's in the [Basic Keycodes](keycodes_basic.md) list, it can be held.
|
This does not include any of the QMK special functions (except One Shot modifiers), or shifted versions of keys such as `KC_LPRN`. If it's in the [Basic Keycodes](keycodes_basic.md) list, it can be held.
|
||||||
|
|
||||||
Switching layers will not cancel the Key Lock.
|
Switching layers will not cancel the Key Lock.
|
||||||
|
|
|
@ -31,7 +31,7 @@ This enables the feature and the `OLED_DRIVER_ENABLE` define. Then in your `keym
|
||||||
void oled_task_user(void) {
|
void oled_task_user(void) {
|
||||||
// Host Keyboard Layer Status
|
// Host Keyboard Layer Status
|
||||||
oled_write_P(PSTR("Layer: "), false);
|
oled_write_P(PSTR("Layer: "), false);
|
||||||
switch (biton32(layer_state)) {
|
switch (get_highest_layer(layer_state)) {
|
||||||
case _QWERTY:
|
case _QWERTY:
|
||||||
oled_write_P(PSTR("Default\n"), false);
|
oled_write_P(PSTR("Default\n"), false);
|
||||||
break;
|
break;
|
||||||
|
@ -96,17 +96,19 @@ void oled_task_user(void) {
|
||||||
|
|
||||||
## Basic Configuration
|
## Basic Configuration
|
||||||
|
|
||||||
| Define | Default | Description |
|
| Define | Default | Description |
|
||||||
|------------------------|-------------------|----------------------------------------------------------------------------------------------------------------------------|
|
|----------------------------|-------------------|----------------------------------------------------------------------------------------------------------------------------|
|
||||||
| `OLED_DISPLAY_ADDRESS` | `0x3C` | The i2c address of the OLED Display |
|
| `OLED_DISPLAY_ADDRESS` | `0x3C` | The i2c address of the OLED Display |
|
||||||
| `OLED_FONT_H` | `"glcdfont.c"` | The font code file to use for custom fonts |
|
| `OLED_FONT_H` | `"glcdfont.c"` | The font code file to use for custom fonts |
|
||||||
| `OLED_FONT_START` | `0` | The starting characer index for custom fonts |
|
| `OLED_FONT_START` | `0` | The starting characer index for custom fonts |
|
||||||
| `OLED_FONT_END` | `224` | The ending characer index for custom fonts |
|
| `OLED_FONT_END` | `224` | The ending characer index for custom fonts |
|
||||||
| `OLED_FONT_WIDTH` | `6` | The font width |
|
| `OLED_FONT_WIDTH` | `6` | The font width |
|
||||||
| `OLED_FONT_HEIGHT` | `8` | The font height (untested) |
|
| `OLED_FONT_HEIGHT` | `8` | The font height (untested) |
|
||||||
| `OLED_DISABLE_TIMEOUT` | *Not defined* | Disables the built in OLED timeout feature. Useful when implementing custom timeout rules. |
|
| `OLED_TIMEOUT` | `60000` | Turns off the OLED screen after 60000ms of keyboard inactivity. Helps reduce OLED Burn-in. Set to 0 to disable. |
|
||||||
| `OLED_IC` | `OLED_IC_SSD1306` | Set to `OLED_IC_SH1106` if you're using the SH1106 OLED controller. |
|
| `OLED_SCROLL_TIMEOUT` | `0` | Scrolls the OLED screen after 0ms of OLED inactivity. Helps reduce OLED Burn-in. Set to 0 to disable. |
|
||||||
| `OLED_COLUMN_OFFSET` | `0` | (SH1106 only.) Shift output to the right this many pixels.<br />Useful for 128x64 displays centered on a 132x64 SH1106 IC. |
|
| `OLED_SCROLL_TIMEOUT_RIGHT`| *Not defined* | Scroll timeout direction is right when defined, left when undefined. |
|
||||||
|
| `OLED_IC` | `OLED_IC_SSD1306` | Set to `OLED_IC_SH1106` if you're using the SH1106 OLED controller. |
|
||||||
|
| `OLED_COLUMN_OFFSET` | `0` | (SH1106 only.) Shift output to the right this many pixels.<br />Useful for 128x64 displays centered on a 132x64 SH1106 IC. |
|
||||||
|
|
||||||
## 128x64 & Custom sized OLED Displays
|
## 128x64 & Custom sized OLED Displays
|
||||||
|
|
||||||
|
@ -227,6 +229,12 @@ void oled_write_P(const char *data, bool invert);
|
||||||
// Remapped to call 'void oled_write_ln(const char *data, bool invert);' on ARM
|
// Remapped to call 'void oled_write_ln(const char *data, bool invert);' on ARM
|
||||||
void oled_write_ln_P(const char *data, bool invert);
|
void oled_write_ln_P(const char *data, bool invert);
|
||||||
|
|
||||||
|
// Writes a string to the buffer at current cursor position
|
||||||
|
void oled_write_raw(const char *data, uint16_t size);
|
||||||
|
|
||||||
|
// Writes a PROGMEM string to the buffer at current cursor position
|
||||||
|
void oled_write_raw_P(const char *data, uint16_t size);
|
||||||
|
|
||||||
// Can be used to manually turn on the screen if it is off
|
// Can be used to manually turn on the screen if it is off
|
||||||
// Returns true if the screen was on or turns on
|
// Returns true if the screen was on or turns on
|
||||||
bool oled_on(void);
|
bool oled_on(void);
|
||||||
|
|
|
@ -149,7 +149,7 @@ In your keyboard config.h:
|
||||||
|
|
||||||
#### PS/2 Mouse Features
|
#### PS/2 Mouse Features
|
||||||
|
|
||||||
These enable settings supported by the PS/2 mouse protocol: http://www.computer-engineering.org/ps2mouse/
|
These enable settings supported by the PS/2 mouse protocol.
|
||||||
|
|
||||||
```
|
```
|
||||||
/* Use remote mode instead of the default stream mode (see link) */
|
/* Use remote mode instead of the default stream mode (see link) */
|
||||||
|
@ -202,7 +202,7 @@ Note: you can also use `ps2_mouse_set_resolution` for the same effect (not suppo
|
||||||
#### Scroll Button
|
#### Scroll Button
|
||||||
|
|
||||||
If you're using a trackpoint, you will likely want to be able to use it for scrolling.
|
If you're using a trackpoint, you will likely want to be able to use it for scrolling.
|
||||||
Its possible to enable a "scroll button/s" that when pressed will cause the mouse to scroll instead of moving.
|
It's possible to enable a "scroll button/s" that when pressed will cause the mouse to scroll instead of moving.
|
||||||
To enable the feature, you must set a scroll button mask as follows:
|
To enable the feature, you must set a scroll button mask as follows:
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
|
@ -107,7 +107,7 @@ Where `X_Y` is the location of the LED in the matrix defined by [the datasheet](
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### WS2812 (AVR only)
|
### WS2812
|
||||||
|
|
||||||
There is basic support for addressable RGB matrix lighting with a WS2811/WS2812{a,b,c} addressable LED strand. To enable it, add this to your `rules.mk`:
|
There is basic support for addressable RGB matrix lighting with a WS2811/WS2812{a,b,c} addressable LED strand. To enable it, add this to your `rules.mk`:
|
||||||
|
|
||||||
|
@ -374,6 +374,7 @@ These are defined in [`rgblight_list.h`](https://github.com/qmk/qmk_firmware/blo
|
||||||
#define RGB_MATRIX_LED_PROCESS_LIMIT (DRIVER_LED_TOTAL + 4) / 5 // limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness)
|
#define RGB_MATRIX_LED_PROCESS_LIMIT (DRIVER_LED_TOTAL + 4) / 5 // limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness)
|
||||||
#define RGB_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness)
|
#define RGB_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness)
|
||||||
#define RGB_MATRIX_MAXIMUM_BRIGHTNESS 200 // limits maximum brightness of LEDs to 200 out of 255. If not defined maximum brightness is set to 255
|
#define RGB_MATRIX_MAXIMUM_BRIGHTNESS 200 // limits maximum brightness of LEDs to 200 out of 255. If not defined maximum brightness is set to 255
|
||||||
|
#define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_CYCLE_LEFT_RIGHT // Sets the default mode, if none has been set
|
||||||
```
|
```
|
||||||
|
|
||||||
## EEPROM storage
|
## EEPROM storage
|
||||||
|
|
|
@ -6,7 +6,7 @@ QMK has the ability to control RGB LEDs attached to your keyboard. This is commo
|
||||||
|
|
||||||
Some keyboards come with RGB LEDs preinstalled. Others must have them installed after the fact. See the [Hardware Modification](#hardware-modification) section for information on adding RGB lighting to your keyboard.
|
Some keyboards come with RGB LEDs preinstalled. Others must have them installed after the fact. See the [Hardware Modification](#hardware-modification) section for information on adding RGB lighting to your keyboard.
|
||||||
|
|
||||||
Currently QMK supports the following addressable LEDs on AVR microcontrollers (however, the white LED in RGBW variants is not supported):
|
Currently QMK supports the following addressable LEDs (however, the white LED in RGBW variants is not supported):
|
||||||
|
|
||||||
* WS2811, WS2812, WS2812B, WS2812C, etc.
|
* WS2811, WS2812, WS2812B, WS2812C, etc.
|
||||||
* SK6812, SK6812MINI, SK6805
|
* SK6812, SK6812MINI, SK6805
|
||||||
|
@ -363,8 +363,8 @@ Using the `rgblight_set_clipping_range()` function, you can prepare more buffers
|
||||||
You can set the Clipping Range by executing the following code.
|
You can set the Clipping Range by executing the following code.
|
||||||
|
|
||||||
```c
|
```c
|
||||||
// some soruce
|
// some source
|
||||||
rgblight_set_clipping_range(3, 4);
|
rgblight_set_clipping_range(3, 4);
|
||||||
```
|
```
|
||||||
<img src="https://user-images.githubusercontent.com/2170248/55743785-2bd82a00-5a6e-11e9-9d4b-1b4ffaf4932b.JPG" alt="clip direct" width="70%"/>
|
<img src="https://user-images.githubusercontent.com/2170248/55743785-2bd82a00-5a6e-11e9-9d4b-1b4ffaf4932b.JPG" alt="clip direct" width="70%"/>
|
||||||
|
|
||||||
|
|
211
docs/feature_split_keyboard.md
Normal file
211
docs/feature_split_keyboard.md
Normal file
|
@ -0,0 +1,211 @@
|
||||||
|
# Split Keyboard
|
||||||
|
|
||||||
|
Many keyboards in the QMK Firmware repo are "split" keyboards. They use two controllers—one plugging into USB, and the second connected by a serial or an I<sup>2</sup>C connection over a TRRS or similar cable.
|
||||||
|
|
||||||
|
Split keyboards can have a lot of benefits, but there is some additional work needed to get them enabled.
|
||||||
|
|
||||||
|
QMK Firmware has a generic implementation that is usable by any board, as well as numerous board specific implementations.
|
||||||
|
|
||||||
|
For this, we will mostly be talking about the generic implementation used by the Let's Split and other keyboards.
|
||||||
|
|
||||||
|
!> ARM is not yet supported for Split Keyboards. Progress is being made, but we are not quite there, yet.
|
||||||
|
|
||||||
|
|
||||||
|
## Hardware Configuration
|
||||||
|
|
||||||
|
This assumes that you're using two Pro Micro-compatible controllers, and are using TRRS jacks to connect to two halves.
|
||||||
|
|
||||||
|
### Required Hardware
|
||||||
|
|
||||||
|
Apart from diodes and key switches for the keyboard matrix in each half, you will need 2x TRRS sockets and 1x TRRS cable.
|
||||||
|
|
||||||
|
Alternatively, you can use any sort of cable and socket that has at least 3 wires.
|
||||||
|
|
||||||
|
If you want to use I<sup>2</sup>C to communicate between halves, you will need a cable with at least 4 wires and 2x 4.7kΩ pull-up resistors.
|
||||||
|
|
||||||
|
#### Considerations
|
||||||
|
|
||||||
|
The most commonly used connection is a TRRS cable and jacks. These provide 4 wires, making them very useful for split keyboards, and are easy to find.
|
||||||
|
|
||||||
|
However, since one of the wires carries VCC, this means that the boards are not hot pluggable. You should always disconnect the board from USB before unplugging and plugging in TRRS cables, or you can short the controller, or worse.
|
||||||
|
|
||||||
|
Another option is to use phone cables (as in, old school RJ-11/RJ-14 cables). Make sure that you use one that actually supports 4 wires/lanes.
|
||||||
|
|
||||||
|
However, USB cables, SATA cables, and even just 4 wires have been known to be used for communication between the controllers.
|
||||||
|
|
||||||
|
!> Using USB cables for communication between the controllers works just fine, but the connector could be mistaken for a normal USB connection and potentially short out the keyboard, depending on how it's wired. For this reason, they are not recommended for connecting split keyboards.
|
||||||
|
|
||||||
|
### Serial Wiring
|
||||||
|
|
||||||
|
The 3 wires of the TRS/TRRS cable need to connect GND, VCC, and D0 (aka PDO or pin 3) between the two Pro Micros.
|
||||||
|
|
||||||
|
?> Note that the pin used here is actually set by `SOFT_SERIAL_PIN` below.
|
||||||
|
|
||||||
|
![serial wiring](https://i.imgur.com/C3D1GAQ.png)
|
||||||
|
|
||||||
|
### I<sup>2</sup>C Wiring
|
||||||
|
|
||||||
|
The 4 wires of the TRRS cable need to connect GND, VCC, and SCL and SDA (aka PD0/pin 3 and PD1/pin 2, respectively) between the two Pro Micros.
|
||||||
|
|
||||||
|
The pull-up resistors may be placed on either half. If you wish to use the halves independently, it is also possible to use 4 resistors and have the pull-ups in both halves.
|
||||||
|
|
||||||
|
![I2C wiring](https://i.imgur.com/Hbzhc6E.png)
|
||||||
|
|
||||||
|
## Firmware Configuration
|
||||||
|
|
||||||
|
To enable the split keyboard feature, add the following to your `rules.mk`:
|
||||||
|
|
||||||
|
```make
|
||||||
|
SPLIT_KEYBOARD = yes
|
||||||
|
```
|
||||||
|
|
||||||
|
If you're using a custom transport (communication method), then you will also need to add:
|
||||||
|
|
||||||
|
```make
|
||||||
|
SPLIT_TRANSPORT = custom
|
||||||
|
```
|
||||||
|
|
||||||
|
### Setting Handedness
|
||||||
|
|
||||||
|
By default, the firmware does not know which side is which; it needs some help to determine that. There are several ways to do this, listed in order of precedence.
|
||||||
|
|
||||||
|
#### Handedness by Pin
|
||||||
|
|
||||||
|
You can configure the firmware to read a pin on the controller to determine handedness. To do this, add the following to your `config.h` file:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define SPLIT_HAND_PIN B7
|
||||||
|
```
|
||||||
|
|
||||||
|
This will read the specified pin. If it's high, then the controller assumes it is the left hand, and if it's low, it's assumed to be the right side.
|
||||||
|
|
||||||
|
#### Handedness by EEPROM
|
||||||
|
|
||||||
|
This method sets the keyboard's handedness by setting a flag in the persistent storage (`EEPROM`). This is checked when the controller first starts up, and determines what half the keyboard is, and how to orient the keyboard layout.
|
||||||
|
|
||||||
|
|
||||||
|
To enable this method, add the following to your `config.h` file:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define EE_HANDS
|
||||||
|
```
|
||||||
|
|
||||||
|
However, you'll have to flash the EEPROM files for the correct hand to each controller. You can do this manually, or there are targets for avrdude and dfu to do this, while flashing the firmware:
|
||||||
|
|
||||||
|
* `:avrdude-split-left`
|
||||||
|
* `:avrdude-split-right`
|
||||||
|
* `:dfu-split-left`
|
||||||
|
* `:dfu-split-right`
|
||||||
|
* `:dfu-util-split-left`
|
||||||
|
* `:dfu-util-split-right`
|
||||||
|
|
||||||
|
This setting is not changed when re-initializing the EEPROM using the `EEP_RST` key, or using the `eeconfig_init()` function. However, if you reset the EEPROM outside of the firmware's built in options (such as flashing a file that overwrites the `EEPROM`, like how the [QMK Toolbox]()'s "Reset EEPROM" button works), you'll need to re-flash the controller with the `EEPROM` files.
|
||||||
|
|
||||||
|
You can find the `EEPROM` files in the QMK firmware repo, [here](https://github.com/qmk/qmk_firmware/tree/master/quantum/split_common).
|
||||||
|
|
||||||
|
#### Handedness by `#define`
|
||||||
|
|
||||||
|
You can set the handedness at compile time. This is done by adding the following to your `config.h` file:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define MASTER_RIGHT
|
||||||
|
```
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define MASTER_LEFT
|
||||||
|
```
|
||||||
|
|
||||||
|
If neither are defined, the handedness defaults to `MASTER_LEFT`.
|
||||||
|
|
||||||
|
|
||||||
|
### Communication Options
|
||||||
|
|
||||||
|
Because not every split keyboard is identical, there are a number of additional options that can be configured in your `config.h` file.
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define USE_I2C
|
||||||
|
```
|
||||||
|
|
||||||
|
This enables I<sup>2</sup>C support for split keyboards. This isn't strictly for communication, but can be used for OLED or other I<sup>2</sup>C-based devices.
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define SOFT_SERIAL_PIN D0
|
||||||
|
```
|
||||||
|
|
||||||
|
This sets the pin to be used for serial communication. If you're not using serial, you shouldn't need to define this.
|
||||||
|
|
||||||
|
However, if you are using serial and I<sup>2</sup>C on the board, you will need to set this, and to something other than D0 and D1 (as these are used for I<sup>2</sup>C communication).
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define SELECT_SOFT_SERIAL_SPEED {#}`
|
||||||
|
```
|
||||||
|
|
||||||
|
If you're having issues with serial communication, you can change this value, as it controls the communication speed for serial. The default is 1, and the possible values are:
|
||||||
|
|
||||||
|
* **`0`**: about 189kbps (Experimental only)
|
||||||
|
* **`1`**: about 137kbps (default)
|
||||||
|
* **`2`**: about 75kbps
|
||||||
|
* **`3`**: about 39kbps
|
||||||
|
* **`4`**: about 26kbps
|
||||||
|
* **`5`**: about 20kbps
|
||||||
|
|
||||||
|
### Hardware Configuration Options
|
||||||
|
|
||||||
|
There are some settings that you may need to configure, based on how the hardware is set up.
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define MATRIX_ROW_PINS_RIGHT { <row pins> }
|
||||||
|
#define MATRIX_COL_PINS_RIGHT { <col pins> }
|
||||||
|
```
|
||||||
|
|
||||||
|
This allows you to specify a different set of pins for the matrix on the right side. This is useful if you have a board with differently-shaped halves that requires a different configuration (such as Keebio's Quefrency).
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define DIRECT_PINS_RIGHT { { F1, F0, B0, C7 }, { F4, F5, F6, F7 } }
|
||||||
|
```
|
||||||
|
|
||||||
|
This allows you to specify a different set of direct pins for the right side.
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define ENCODERS_PAD_A_RIGHT { encoder1a, encoder2a }
|
||||||
|
#define ENCODERS_PAD_B_RIGHT { encoder1b, encoder2b }
|
||||||
|
```
|
||||||
|
|
||||||
|
This allows you to specify a different set of encoder pins for the right side.
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define RGBLIGHT_SPLIT
|
||||||
|
```
|
||||||
|
|
||||||
|
This option enables synchronization of the RGB Light modes between the controllers of the split keyboard. This is for keyboards that have RGB LEDs that are directly wired to the controller (that is, they are not using the "extra data" option on the TRRS cable).
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define RGBLED_SPLIT { 6, 6 }
|
||||||
|
```
|
||||||
|
|
||||||
|
This sets how many LEDs are directly connected to each controller. The first number is the left side, and the second number is the right side.
|
||||||
|
|
||||||
|
?> This setting implies that `RGBLIGHT_SPLIT` is enabled, and will forcibly enable it, if it's not.
|
||||||
|
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define SPLIT_USB_DETECT
|
||||||
|
```
|
||||||
|
This option changes the startup behavior to detect an active USB connection when delegating master/slave. If this operation times out, then the half is assume to be a slave. This is the default behavior for ARM, and required for AVR Teensy boards (due to hardware limitations).
|
||||||
|
|
||||||
|
?> This setting will stop the ability to demo using battery packs.
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define SPLIT_USB_TIMEOUT 2500
|
||||||
|
```
|
||||||
|
This sets the maximum timeout when detecting master/slave when using `SPLIT_USB_DETECT`.
|
||||||
|
|
||||||
|
## Additional Resources
|
||||||
|
|
||||||
|
Nicinabox has a [very nice and detailed guide](https://github.com/nicinabox/lets-split-guide) for the Let's Split keyboard, that covers most everything you need to know, including troubleshooting information.
|
||||||
|
|
||||||
|
However, the RGB Light section is out of date, as it was written long before the RGB Split code was added to QMK Firmware. Instead, wire each strip up directly to the controller.
|
||||||
|
|
||||||
|
<!-- I may port this information later, but for now ... it's very nice, and covers everything -->
|
|
@ -1,25 +1,38 @@
|
||||||
# Tap Dance: A Single Key Can Do 3, 5, or 100 Different Things
|
# Tap Dance: A Single Key Can Do 3, 5, or 100 Different Things
|
||||||
|
|
||||||
<!-- FIXME: Break this up into multiple sections -->
|
## Introduction
|
||||||
|
|
||||||
Hit the semicolon key once, send a semicolon. Hit it twice, rapidly -- send a colon. Hit it three times, and your keyboard's LEDs do a wild dance. That's just one example of what Tap Dance can do. It's one of the nicest community-contributed features in the firmware, conceived and created by [algernon](https://github.com/algernon) in [#451](https://github.com/qmk/qmk_firmware/pull/451). Here's how algernon describes the feature:
|
Hit the semicolon key once, send a semicolon. Hit it twice, rapidly -- send a colon. Hit it three times, and your keyboard's LEDs do a wild dance. That's just one example of what Tap Dance can do. It's one of the nicest community-contributed features in the firmware, conceived and created by [algernon](https://github.com/algernon) in [#451](https://github.com/qmk/qmk_firmware/pull/451). Here's how algernon describes the feature:
|
||||||
|
|
||||||
With this feature one can specify keys that behave differently, based on the amount of times they have been tapped, and when interrupted, they get handled before the interrupter.
|
With this feature one can specify keys that behave differently, based on the amount of times they have been tapped, and when interrupted, they get handled before the interrupter.
|
||||||
|
|
||||||
To make it clear how this is different from `ACTION_FUNCTION_TAP`, let's explore a certain setup! We want one key to send `Space` on single tap, but `Enter` on double-tap.
|
## Explanatory Comparison with `ACTION_FUNCTION_TAP`
|
||||||
|
`ACTION_FUNCTION_TAP` can offer similar functionality to Tap Dance, but it's worth noting some important differences. To do this, let's explore a certain setup! We want one key to send `Space` on single-tap, but `Enter` on double-tap.
|
||||||
|
|
||||||
With `ACTION_FUNCTION_TAP`, it is quite a rain-dance to set this up, and has the problem that when the sequence is interrupted, the interrupting key will be sent first. Thus, `SPC a` will result in `a SPC` being sent, if they are typed within `TAPPING_TERM`. With the tap dance feature, that'll come out as `SPC a`, correctly.
|
With `ACTION_FUNCTION_TAP`, it is quite a rain-dance to set this up, and has the problem that when the sequence is interrupted, the interrupting key will be sent first. Thus, `SPC a` will result in `a SPC` being sent, if `SPC` and `a` are both typed within `TAPPING_TERM`. With the Tap Dance feature, that'll come out correctly as `SPC a` (even if both `SPC` and `a` are typed within the `TAPPING_TERM`.
|
||||||
|
|
||||||
The implementation hooks into two parts of the system, to achieve this: into `process_record_quantum()`, and the matrix scan. We need the latter to be able to time out a tap sequence even when a key is not being pressed, so `SPC` alone will time out and register after `TAPPING_TERM` time.
|
To achieve this correct handling of interrupts, the implementation of Tap Dance hooks into two parts of the system: `process_record_quantum()`, and the matrix scan. These two parts are explained below, but for now the point to note is that we need the latter to be able to time out a tap sequence even when a key is not being pressed. That way, `SPC` alone will time out and register after `TAPPING_TERM` time.
|
||||||
|
|
||||||
But lets start with how to use it, first!
|
## How to Use Tap Dance
|
||||||
|
But enough of the generalities; lets look at how to actually use Tap Dance!
|
||||||
|
|
||||||
First, you will need `TAP_DANCE_ENABLE=yes` in your `rules.mk`, because the feature is disabled by default. This adds a little less than 1k to the firmware size. Next, you will want to define some tap-dance keys, which is easiest to do with the `TD()` macro, that - similar to `F()`, takes a number, which will later be used as an index into the `tap_dance_actions` array.
|
First, you will need `TAP_DANCE_ENABLE=yes` in your `rules.mk`, because the feature is disabled by default. This adds a little less than 1k to the firmware size.
|
||||||
|
|
||||||
This array specifies what actions shall be taken when a tap-dance key is in action. Currently, there are five possible options:
|
Optionally, you might want to set a custom `TAPPING_TERM` time by adding something like this in you `config.h`:
|
||||||
|
|
||||||
|
```
|
||||||
|
#define TAPPING_TERM 175
|
||||||
|
```
|
||||||
|
|
||||||
|
The `TAPPING_TERM` time is the maximum time allowed between taps of your Tap Dance key, and is measured in milliseconds. For example, if you used the above `#define` statement and set up a Tap Dance key that sends `Space` on single-tap and `Enter` on double-tap, then this key will send `ENT` only if you tap this key twice in less than 175ms. If you tap the key, wait more than 175ms, and tap the key again you'll end up sending `SPC SPC` instead.
|
||||||
|
|
||||||
|
Next, you will want to define some tap-dance keys, which is easiest to do with the `TD()` macro, that - similar to `F()` - takes a number, which will later be used as an index into the `tap_dance_actions` array.
|
||||||
|
|
||||||
|
After this, you'll want to use the `tap_dance_actions` array to specify what actions shall be taken when a tap-dance key is in action. Currently, there are five possible options:
|
||||||
|
|
||||||
* `ACTION_TAP_DANCE_DOUBLE(kc1, kc2)`: Sends the `kc1` keycode when tapped once, `kc2` otherwise. When the key is held, the appropriate keycode is registered: `kc1` when pressed and held, `kc2` when tapped once, then pressed and held.
|
* `ACTION_TAP_DANCE_DOUBLE(kc1, kc2)`: Sends the `kc1` keycode when tapped once, `kc2` otherwise. When the key is held, the appropriate keycode is registered: `kc1` when pressed and held, `kc2` when tapped once, then pressed and held.
|
||||||
* `ACTION_TAP_DANCE_DUAL_ROLE(kc, layer)`: Sends the `kc` keycode when tapped once, or moves to `layer`. (this functions like the `TO` layer keycode).
|
* `ACTION_TAP_DANCE_LAYER_MOVE(kc, layer)`: Sends the `kc` keycode when tapped once, or moves to `layer`. (this functions like the `TO` layer keycode).
|
||||||
|
* This is the same as `ACTION_TAP_DANCE_DUAL_ROLE`, but renamed to something that is clearer about its functionality. Both names will work.
|
||||||
|
* `ACTION_TAP_DANCE_LAYER_TOGGLE(kc, layer)`: Sends the `kc` keycode when tapped once, or toggles the state of `layer`. (this functions like the `TG` layer keycode).
|
||||||
* `ACTION_TAP_DANCE_FN(fn)`: Calls the specified function - defined in the user keymap - with the final tap count of the tap dance action.
|
* `ACTION_TAP_DANCE_FN(fn)`: Calls the specified function - defined in the user keymap - with the final tap count of the tap dance action.
|
||||||
* `ACTION_TAP_DANCE_FN_ADVANCED(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn)`: Calls the first specified function - defined in the user keymap - on every tap, the second function when the dance action finishes (like the previous option), and the last function when the tap dance action resets.
|
* `ACTION_TAP_DANCE_FN_ADVANCED(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn)`: Calls the first specified function - defined in the user keymap - on every tap, the second function when the dance action finishes (like the previous option), and the last function when the tap dance action resets.
|
||||||
* `ACTION_TAP_DANCE_FN_ADVANCED_TIME(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn, tap_specific_tapping_term)`: This functions identically to the `ACTION_TAP_DANCE_FN_ADVANCED` function, but uses a custom tapping term for it, instead of the predefined `TAPPING_TERM`.
|
* `ACTION_TAP_DANCE_FN_ADVANCED_TIME(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn, tap_specific_tapping_term)`: This functions identically to the `ACTION_TAP_DANCE_FN_ADVANCED` function, but uses a custom tapping term for it, instead of the predefined `TAPPING_TERM`.
|
||||||
|
@ -28,13 +41,18 @@ The first option is enough for a lot of cases, that just want dual roles. For ex
|
||||||
|
|
||||||
!> Keep in mind that only [basic keycodes](keycodes_basic.md) are supported here. Custom keycodes are not supported.
|
!> Keep in mind that only [basic keycodes](keycodes_basic.md) are supported here. Custom keycodes are not supported.
|
||||||
|
|
||||||
And that's the bulk of it!
|
Similar to the first option, the second option is good for simple layer-switching cases.
|
||||||
|
|
||||||
And now, on to the explanation of how it works!
|
For more complicated cases, use the third or fourth options (examples of each are listed below).
|
||||||
|
|
||||||
The main entry point is `process_tap_dance()`, called from `process_record_quantum()`, which is run for every keypress, and our handler gets to run early. This function checks whether the key pressed is a tap-dance key. If it is not, and a tap-dance was in action, we handle that first, and enqueue the newly pressed key. If it is a tap-dance key, then we check if it is the same as the already active one (if there's one active, that is). If it is not, we fire off the old one first, then register the new one. If it was the same, we increment the counter and the timer.
|
Finally, the fifth option is particularly useful if your non-Tap-Dance keys start behaving weirdly after adding the code for your Tap Dance keys. The likely problem is that you changed the `TAPPING_TERM` time to make your Tap Dance keys easier for you to use, and that this has changed the way your other keys handle interrupts.
|
||||||
|
|
||||||
This means that you have `TAPPING_TERM` time to tap the key again, you do not have to input all the taps within that timeframe. This allows for longer tap counts, with minimal impact on responsiveness.
|
## Implementation Details
|
||||||
|
Well, that's the bulk of it! You should now be able to work through the examples below, and to develop your own Tap Dance functionality. But if you want a deeper understanding of what's going on behind the scenes, then read on for the explanation of how it all works!
|
||||||
|
|
||||||
|
The main entry point is `process_tap_dance()`, called from `process_record_quantum()`, which is run for every keypress, and our handler gets to run early. This function checks whether the key pressed is a tap-dance key. If it is not, and a tap-dance was in action, we handle that first, and enqueue the newly pressed key. If it is a tap-dance key, then we check if it is the same as the already active one (if there's one active, that is). If it is not, we fire off the old one first, then register the new one. If it was the same, we increment the counter and reset the timer.
|
||||||
|
|
||||||
|
This means that you have `TAPPING_TERM` time to tap the key again; you do not have to input all the taps within a single `TAPPING_TERM` timeframe. This allows for longer tap counts, with minimal impact on responsiveness.
|
||||||
|
|
||||||
Our next stop is `matrix_scan_tap_dance()`. This handles the timeout of tap-dance keys.
|
Our next stop is `matrix_scan_tap_dance()`. This handles the timeout of tap-dance keys.
|
||||||
|
|
||||||
|
@ -315,6 +333,8 @@ And then simply use `TD(X_CTL)` anywhere in your keymap.
|
||||||
|
|
||||||
If you want to implement this in your userspace, then you may want to check out how [DanielGGordon](https://github.com/qmk/qmk_firmware/tree/master/users/gordon) has implemented this in their userspace.
|
If you want to implement this in your userspace, then you may want to check out how [DanielGGordon](https://github.com/qmk/qmk_firmware/tree/master/users/gordon) has implemented this in their userspace.
|
||||||
|
|
||||||
|
> In this configuration "hold" takes place **after** tap dance timeout (see `ACTION_TAP_DANCE_FN_ADVANCED_TIME`). To achieve instant hold, remove `state->interrupted` checks in conditions. As a result you may use comfortable longer tapping periods to have more time for taps and not to wait too long for holds (try starting with doubled `TAPPING_TERM`).
|
||||||
|
|
||||||
### Example 5: Using tap dance for advanced mod-tap and layer-tap keys
|
### Example 5: Using tap dance for advanced mod-tap and layer-tap keys
|
||||||
|
|
||||||
Tap dance can be used to emulate `MT()` and `LT()` behavior when the tapped code is not a basic keycode. This is useful to send tapped keycodes that normally require `Shift`, such as parentheses or curly braces—or other modified keycodes, such as `Control + X`.
|
Tap dance can be used to emulate `MT()` and `LT()` behavior when the tapped code is not a basic keycode. This is useful to send tapped keycodes that normally require `Shift`, such as parentheses or curly braces—or other modified keycodes, such as `Control + X`.
|
||||||
|
@ -397,3 +417,106 @@ qk_tap_dance_action_t tap_dance_actions[] = {
|
||||||
```
|
```
|
||||||
|
|
||||||
Wrap each tapdance keycode in `TD()` when including it in your keymap, e.g. `TD(ALT_LP)`.
|
Wrap each tapdance keycode in `TD()` when including it in your keymap, e.g. `TD(ALT_LP)`.
|
||||||
|
|
||||||
|
### Example 6: Using tap dance for momentary-layer-switch and layer-toggle keys
|
||||||
|
|
||||||
|
Tap Dance can be used to mimic MO(layer) and TG(layer) functionality. For this example, we will set up a key to function as `KC_QUOT` on single-tap, as `MO(_MY_LAYER)` on single-hold, and `TG(_MY_LAYER)` on double-tap.
|
||||||
|
|
||||||
|
The first step is to include the following code towards the beginning of your `keymap.c`:
|
||||||
|
|
||||||
|
```c
|
||||||
|
typedef struct {
|
||||||
|
bool is_press_action;
|
||||||
|
int state;
|
||||||
|
} tap;
|
||||||
|
|
||||||
|
//Define a type for as many tap dance states as you need
|
||||||
|
enum {
|
||||||
|
SINGLE_TAP = 1,
|
||||||
|
SINGLE_HOLD = 2,
|
||||||
|
DOUBLE_TAP = 3
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
QUOT_LAYR = 0 //Our custom tap dance key; add any other tap dance keys to this enum
|
||||||
|
};
|
||||||
|
|
||||||
|
//Declare the functions to be used with your tap dance key(s)
|
||||||
|
|
||||||
|
//Function associated with all tap dances
|
||||||
|
int cur_dance (qk_tap_dance_state_t *state);
|
||||||
|
|
||||||
|
//Functions associated with individual tap dances
|
||||||
|
void ql_finished (qk_tap_dance_state_t *state, void *user_data);
|
||||||
|
void ql_reset (qk_tap_dance_state_t *state, void *user_data);
|
||||||
|
```
|
||||||
|
|
||||||
|
Towards the bottom of your `keymap.c`, include the following code:
|
||||||
|
|
||||||
|
```c
|
||||||
|
//Determine the current tap dance state
|
||||||
|
int cur_dance (qk_tap_dance_state_t *state) {
|
||||||
|
if (state->count == 1) {
|
||||||
|
if (!state->pressed) {
|
||||||
|
return SINGLE_TAP;
|
||||||
|
} else {
|
||||||
|
return SINGLE_HOLD;
|
||||||
|
}
|
||||||
|
} else if (state->count == 2) {
|
||||||
|
return DOUBLE_TAP;
|
||||||
|
}
|
||||||
|
else return 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Initialize tap structure associated with example tap dance key
|
||||||
|
static tap ql_tap_state = {
|
||||||
|
.is_press_action = true,
|
||||||
|
.state = 0
|
||||||
|
};
|
||||||
|
|
||||||
|
//Functions that control what our tap dance key does
|
||||||
|
void ql_finished (qk_tap_dance_state_t *state, void *user_data) {
|
||||||
|
ql_tap_state.state = cur_dance(state);
|
||||||
|
switch (ql_tap_state.state) {
|
||||||
|
case SINGLE_TAP:
|
||||||
|
tap_code(KC_QUOT);
|
||||||
|
break;
|
||||||
|
case SINGLE_HOLD:
|
||||||
|
layer_on(_MY_LAYER);
|
||||||
|
break;
|
||||||
|
case DOUBLE_TAP:
|
||||||
|
//check to see if the layer is already set
|
||||||
|
if (layer_state_is(_MY_LAYER)) {
|
||||||
|
//if already set, then switch it off
|
||||||
|
layer_off(_MY_LAYER);
|
||||||
|
} else {
|
||||||
|
//if not already set, then switch the layer on
|
||||||
|
layer_on(_MY_LAYER);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ql_reset (qk_tap_dance_state_t *state, void *user_data) {
|
||||||
|
//if the key was held down and now is released then switch off the layer
|
||||||
|
if (ql_tap_state.state==SINGLE_HOLD) {
|
||||||
|
layer_off(_MY_LAYER);
|
||||||
|
}
|
||||||
|
ql_tap_state.state = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Associate our tap dance key with its functionality
|
||||||
|
qk_tap_dance_action_t tap_dance_actions[] = {
|
||||||
|
[QUOT_LAYR] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, ql_finished, ql_reset, 275)
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
The above code is similar to that used in previous examples. The one point to note is that we need to be able to check which layers are active at any time so we can toggle them if needed. To do this we use the `layer_state_is( layer )` function which returns `true` if the given `layer` is active.
|
||||||
|
|
||||||
|
The use of `cur_dance()` and `ql_tap_state` mirrors the above examples.
|
||||||
|
|
||||||
|
The `case:SINGLE_TAP` in `ql_finished` is similar to the above examples. The `case:SINGLE_HOLD` works in conjunction with `ql_reset()` to switch to `_MY_LAYER` while the tap dance key is held, and to switch away from `_MY_LAYER` when the key is released. This mirrors the use of `MO(_MY_LAYER)`. The `case:DOUBLE_TAP` works by checking whether `_MY_LAYER` is the active layer, and toggling it on or off accordingly. This mirrors the use of `TG(_MY_LAYER)`.
|
||||||
|
|
||||||
|
`tap_dance_actions[]` works similar to the above examples. Note that I used `ACTION_TAP_DANCE_FN_ADVANCED_TIME()` instead of `ACTION_TAP_DANCE_FN_ADVANCED()`. This is because I like my `TAPPING_TERM` to be short (~175ms) for my non-tap-dance keys but find that this is too quick for me to reliably complete tap dance actions - thus the increased time of 275ms here.
|
||||||
|
|
||||||
|
Finally, to get this tap dance key working, be sure to include `TD(QUOT_LAYR)` in your `keymaps[]`.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# Terminal
|
# Terminal
|
||||||
|
|
||||||
> This feature is currently *huge* at 4400 bytes, and should probably only be put on boards with a lot of memory, or for fun.
|
> This feature is currently *huge*, and should probably only be put on boards with a lot of memory, or for fun.
|
||||||
|
|
||||||
The terminal feature is a command-line-like interface designed to communicate through a text editor with keystrokes. It's beneficial to turn off auto-indent features in your editor.
|
The terminal feature is a command-line-like interface designed to communicate through a text editor with keystrokes. It's beneficial to turn off auto-indent features in your editor.
|
||||||
|
|
||||||
|
|
|
@ -115,11 +115,11 @@ For instance, let's look at the `layer_state_set_user()` function. You can enab
|
||||||
In your `<name.c>` file, you'd want to add this:
|
In your `<name.c>` file, you'd want to add this:
|
||||||
```c
|
```c
|
||||||
__attribute__ ((weak))
|
__attribute__ ((weak))
|
||||||
uint32_t layer_state_set_keymap (uint32_t state) {
|
layer_state_t layer_state_set_keymap (layer_state_t state) {
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t layer_state_set_user (uint32_t state) {
|
layer_state_t layer_state_set_user (layer_state_t state) {
|
||||||
state = update_tri_layer_state(state, 2, 3, 5);
|
state = update_tri_layer_state(state, 2, 3, 5);
|
||||||
return layer_state_set_keymap (state);
|
return layer_state_set_keymap (state);
|
||||||
}
|
}
|
||||||
|
@ -211,15 +211,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
if ( (temp_mod | temp_osm) & MOD_MASK_SHIFT )
|
if ( (temp_mod | temp_osm) & MOD_MASK_SHIFT )
|
||||||
#endif
|
#endif
|
||||||
{ //
|
{ //
|
||||||
#if defined(__arm__) // only run for ARM boards
|
SEND_STRING(":flash");
|
||||||
SEND_STRING(":dfu-util");
|
|
||||||
#elif defined(BOOTLOADER_DFU) // only run for DFU boards
|
|
||||||
SEND_STRING(":dfu");
|
|
||||||
#elif defined(BOOTLOADER_HALFKAY) // only run for teensy boards
|
|
||||||
SEND_STRING(":teensy");
|
|
||||||
#elif defined(BOOTLOADER_CATERINA) // only run for Pro Micros
|
|
||||||
SEND_STRING(":avrdude");
|
|
||||||
#endif // bootloader options
|
|
||||||
}
|
}
|
||||||
if ( (temp_mod | temp_osm) & MOD_MASK_CTRL) {
|
if ( (temp_mod | temp_osm) & MOD_MASK_CTRL) {
|
||||||
SEND_STRING(" -j8 --output-sync");
|
SEND_STRING(" -j8 --output-sync");
|
||||||
|
@ -244,7 +236,7 @@ endif
|
||||||
|
|
||||||
This will add a new `KC_MAKE` keycode that can be used in any of your keymaps. And this keycode will output `make <keyboard>:<keymap>`, making frequent compiling easier. And this will work with any keyboard and any keymap as it will output the current boards info, so that you don't have to type this out every time.
|
This will add a new `KC_MAKE` keycode that can be used in any of your keymaps. And this keycode will output `make <keyboard>:<keymap>`, making frequent compiling easier. And this will work with any keyboard and any keymap as it will output the current boards info, so that you don't have to type this out every time.
|
||||||
|
|
||||||
Also, holding `shift` will add the appropriate flashing command (`:dfu`, `:teensy`, `:avrdude`, `:dfu-util`) for a majority of keyboards. Holding `control` will add some commands that will speed up compiling time by processing multiple files at once.
|
Also, holding Shift will add the flash target (`:flash`) to the command. Holding Control will add some commands that will speed up compiling time by processing multiple files at once.
|
||||||
|
|
||||||
And for the boards that lack a shift key, or that you want to always attempt the flashing part, you can add `FLASH_BOOTLOADER = yes` to the `rules.mk` of that keymap.
|
And for the boards that lack a shift key, or that you want to always attempt the flashing part, you can add `FLASH_BOOTLOADER = yes` to the `rules.mk` of that keymap.
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@ QMK has a staggering number of features for building your keyboard. It can take
|
||||||
* [Combos](feature_combo.md) - Custom actions for multiple key holds.
|
* [Combos](feature_combo.md) - Custom actions for multiple key holds.
|
||||||
* [Command](feature_command.md) - Runtime version of bootmagic (Formerly known as "Magic").
|
* [Command](feature_command.md) - Runtime version of bootmagic (Formerly known as "Magic").
|
||||||
* [Debounce API](feature_debounce_type.md) - Customization of debouncing algorithms, and the ability to add more/custom debouncing.
|
* [Debounce API](feature_debounce_type.md) - Customization of debouncing algorithms, and the ability to add more/custom debouncing.
|
||||||
|
* [DIP Switch](feature_dip_switch.md) - Toggle switches for customizing board function.
|
||||||
* [Dynamic Macros](feature_dynamic_macros.md) - Record and playback macros from the keyboard itself.
|
* [Dynamic Macros](feature_dynamic_macros.md) - Record and playback macros from the keyboard itself.
|
||||||
* [Encoders](feature_encoders.md) - Rotary encoders!
|
* [Encoders](feature_encoders.md) - Rotary encoders!
|
||||||
* [Grave Escape](feature_grave_esc.md) - Lets you use a single key for Esc and Grave.
|
* [Grave Escape](feature_grave_esc.md) - Lets you use a single key for Esc and Grave.
|
||||||
|
@ -30,6 +31,7 @@ QMK has a staggering number of features for building your keyboard. It can take
|
||||||
* [RGB Light](feature_rgblight.md) - RGB lighting for your keyboard.
|
* [RGB Light](feature_rgblight.md) - RGB lighting for your keyboard.
|
||||||
* [RGB Matrix](feature_rgb_matrix.md) - RGB Matrix lights for per key lighting.
|
* [RGB Matrix](feature_rgb_matrix.md) - RGB Matrix lights for per key lighting.
|
||||||
* [Space Cadet](feature_space_cadet.md) - Use your left/right shift keys to type parenthesis and brackets.
|
* [Space Cadet](feature_space_cadet.md) - Use your left/right shift keys to type parenthesis and brackets.
|
||||||
|
* [Split Keyboard](feature_split_keyboard.md)
|
||||||
* [Stenography](feature_stenography.md) - Put your keyboard into Plover mode for stenography use.
|
* [Stenography](feature_stenography.md) - Put your keyboard into Plover mode for stenography use.
|
||||||
* [Swap Hands](feature_swap_hands.md) - Mirror your keyboard for one handed usage.
|
* [Swap Hands](feature_swap_hands.md) - Mirror your keyboard for one handed usage.
|
||||||
* [Tap Dance](feature_tap_dance.md) - Make a single key do as many things as you want.
|
* [Tap Dance](feature_tap_dance.md) - Make a single key do as many things as you want.
|
||||||
|
|
132
docs/flashing.md
132
docs/flashing.md
|
@ -10,11 +10,17 @@ Atmel's DFU bootloader comes on all atmega32u4 chips by default, and is used by
|
||||||
|
|
||||||
To ensure compatibility with the DFU bootloader, make sure this block is present your `rules.mk` (optionally with `lufa-dfu` or `qmk-dfu` instead):
|
To ensure compatibility with the DFU bootloader, make sure this block is present your `rules.mk` (optionally with `lufa-dfu` or `qmk-dfu` instead):
|
||||||
|
|
||||||
# Bootloader
|
```make
|
||||||
# This definition is optional, and if your keyboard supports multiple bootloaders of
|
# Bootloader selection
|
||||||
# different sizes, comment this out, and the correct address will be loaded
|
# Teensy halfkay
|
||||||
# automatically (+60). See bootloader.mk for all options.
|
# Pro Micro caterina
|
||||||
BOOTLOADER = atmel-dfu
|
# Atmel DFU atmel-dfu
|
||||||
|
# LUFA DFU lufa-dfu
|
||||||
|
# QMK DFU qmk-dfu
|
||||||
|
# ATmega32A bootloadHID
|
||||||
|
# ATmega328P USBasp
|
||||||
|
BOOTLOADER = atmel-dfu
|
||||||
|
```
|
||||||
|
|
||||||
Compatible flashers:
|
Compatible flashers:
|
||||||
|
|
||||||
|
@ -64,11 +70,17 @@ Arduino boards and their clones use the [Caterina bootloader](https://github.com
|
||||||
|
|
||||||
To ensure compatibility with the Caterina bootloader, make sure this block is present your `rules.mk`:
|
To ensure compatibility with the Caterina bootloader, make sure this block is present your `rules.mk`:
|
||||||
|
|
||||||
# Bootloader
|
```make
|
||||||
# This definition is optional, and if your keyboard supports multiple bootloaders of
|
# Bootloader selection
|
||||||
# different sizes, comment this out, and the correct address will be loaded
|
# Teensy halfkay
|
||||||
# automatically (+60). See bootloader.mk for all options.
|
# Pro Micro caterina
|
||||||
BOOTLOADER = caterina
|
# Atmel DFU atmel-dfu
|
||||||
|
# LUFA DFU lufa-dfu
|
||||||
|
# QMK DFU qmk-dfu
|
||||||
|
# ATmega32A bootloadHID
|
||||||
|
# ATmega328P USBasp
|
||||||
|
BOOTLOADER = caterina
|
||||||
|
```
|
||||||
|
|
||||||
Compatible flashers:
|
Compatible flashers:
|
||||||
|
|
||||||
|
@ -87,11 +99,16 @@ or
|
||||||
|
|
||||||
make <keyboard>:<keymap>:avrdude
|
make <keyboard>:<keymap>:avrdude
|
||||||
|
|
||||||
or if you want to flash multiple boards, use the following command
|
|
||||||
|
|
||||||
make <keyboard>:<keymap>:avrdude-loop
|
#### Caterina commands
|
||||||
|
|
||||||
|
There are a number of DFU commands that you can use to flash firmware to a DFU device:
|
||||||
|
|
||||||
|
* `:avrdude` - This is the normal option which waits until a Caterina device is available (by detecting a new COM port), and then flashes the firmware.
|
||||||
|
* `:avrdude-loop` - This runs the same command as `:avrdude`, but after each device is flashed, it will attempt to flash again. This is useful for bulk flashing. _This requires you to manually escape the loop by hitting Ctrl+C._
|
||||||
|
* `:avrdude-split-left` - This flashes the normal firmware, just like the default option (`:avrdude`). However, this also flashes the "Left Side" EEPROM file for split keyboards. _This is ideal for Pro Micro based split keyboards._
|
||||||
|
* `:avrdude-split-right` - This flashes the normal firmware, just like the default option (`:avrdude`). However, this also flashes the "Right Side" EEPROM file for split keyboards. _This is ideal for Pro Micro based split keyboards._
|
||||||
|
|
||||||
When you're done flashing boards, you'll need to hit Ctrl + C or whatever the correct keystroke is for your operating system to break the loop.
|
|
||||||
|
|
||||||
|
|
||||||
## Halfkay
|
## Halfkay
|
||||||
|
@ -100,11 +117,17 @@ Halfkay is a super-slim protocol developed by PJRC that uses HID, and come on al
|
||||||
|
|
||||||
To ensure compatibility with the Halfkay bootloader, make sure this block is present your `rules.mk`:
|
To ensure compatibility with the Halfkay bootloader, make sure this block is present your `rules.mk`:
|
||||||
|
|
||||||
# Bootloader
|
```make
|
||||||
# This definition is optional, and if your keyboard supports multiple bootloaders of
|
# Bootloader selection
|
||||||
# different sizes, comment this out, and the correct address will be loaded
|
# Teensy halfkay
|
||||||
# automatically (+60). See bootloader.mk for all options.
|
# Pro Micro caterina
|
||||||
BOOTLOADER = halfkay
|
# Atmel DFU atmel-dfu
|
||||||
|
# LUFA DFU lufa-dfu
|
||||||
|
# QMK DFU qmk-dfu
|
||||||
|
# ATmega32A bootloadHID
|
||||||
|
# ATmega328P USBasp
|
||||||
|
BOOTLOADER = halfkay
|
||||||
|
```
|
||||||
|
|
||||||
Compatible flashers:
|
Compatible flashers:
|
||||||
|
|
||||||
|
@ -119,6 +142,73 @@ Flashing sequence:
|
||||||
3. Flash a .hex file
|
3. Flash a .hex file
|
||||||
4. Reset the device into application mode (may be done automatically)
|
4. Reset the device into application mode (may be done automatically)
|
||||||
|
|
||||||
|
## USBasploader
|
||||||
|
|
||||||
|
USBasploader is a bootloader developed by matrixstorm. It is used in some non-USB AVR chips such as the ATmega328P, which run V-USB.
|
||||||
|
|
||||||
|
To ensure compatibility with the USBasploader bootloader, make sure this block is present in your `rules.mk`:
|
||||||
|
|
||||||
|
```make
|
||||||
|
# Bootloader selection
|
||||||
|
# Teensy halfkay
|
||||||
|
# Pro Micro caterina
|
||||||
|
# Atmel DFU atmel-dfu
|
||||||
|
# LUFA DFU lufa-dfu
|
||||||
|
# QMK DFU qmk-dfu
|
||||||
|
# ATmega32A bootloadHID
|
||||||
|
# ATmega328P USBasp
|
||||||
|
BOOTLOADER = USBasp
|
||||||
|
```
|
||||||
|
|
||||||
|
Compatible flashers:
|
||||||
|
|
||||||
|
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI)
|
||||||
|
* [avrdude](http://www.nongnu.org/avrdude/) with the `usbasp` programmer
|
||||||
|
* [AVRDUDESS](https://github.com/zkemble/AVRDUDESS)
|
||||||
|
|
||||||
|
Flashing sequence:
|
||||||
|
|
||||||
|
1. Press the `RESET` keycode, or keep the boot pin shorted to GND while quickly shorting RST to GND
|
||||||
|
2. Wait for the OS to detect the device
|
||||||
|
3. Flash a .hex file
|
||||||
|
4. Reset the device into application mode (may be done automatically)
|
||||||
|
|
||||||
|
## BootloadHID
|
||||||
|
|
||||||
|
BootloadHID is a USB bootloader for AVR microcontrollers. The uploader tool requires no kernel level driver on Windows and can therefore be run without installing any DLLs.
|
||||||
|
|
||||||
|
To ensure compatibility with the bootloadHID bootloader, make sure this block is present your `rules.mk`:
|
||||||
|
|
||||||
|
```make
|
||||||
|
# Bootloader selection
|
||||||
|
# Teensy halfkay
|
||||||
|
# Pro Micro caterina
|
||||||
|
# Atmel DFU atmel-dfu
|
||||||
|
# LUFA DFU lufa-dfu
|
||||||
|
# QMK DFU qmk-dfu
|
||||||
|
# ATmega32A bootloadHID
|
||||||
|
# ATmega328P USBasp
|
||||||
|
BOOTLOADER = bootloadHID
|
||||||
|
```
|
||||||
|
|
||||||
|
Compatible flashers:
|
||||||
|
|
||||||
|
* [HIDBootFlash](http://vusb.wikidot.com/project:hidbootflash) (recommended Windows GUI)
|
||||||
|
* [bootloadhid Command Line](https://www.obdev.at/products/vusb/bootloadhid.html) / `:BootloadHID` in QMK (recommended command line)
|
||||||
|
|
||||||
|
Flashing sequence:
|
||||||
|
|
||||||
|
1. Enter the bootloader using any of the following methods:
|
||||||
|
* Tap the `RESET` keycode (may not work on all devices)
|
||||||
|
* Hold the salt key while plugging the keyboard in (usually documented within keyboard readme)
|
||||||
|
2. Wait for the OS to detect the device
|
||||||
|
3. Flash a .hex file
|
||||||
|
4. Reset the device into application mode (may be done automatically)
|
||||||
|
|
||||||
|
or:
|
||||||
|
|
||||||
|
make <keyboard>:<keymap>:bootloadHID
|
||||||
|
|
||||||
## STM32
|
## STM32
|
||||||
|
|
||||||
All STM32 chips come preloaded with a factory bootloader that cannot be modified nor deleted. Some STM32 chips have bootloaders that do not come with USB programming (e.g. STM32F103) but the process is still the same.
|
All STM32 chips come preloaded with a factory bootloader that cannot be modified nor deleted. Some STM32 chips have bootloaders that do not come with USB programming (e.g. STM32F103) but the process is still the same.
|
||||||
|
@ -146,7 +236,7 @@ Flashing sequence:
|
||||||
|
|
||||||
There are a number of DFU commands that you can use to flash firmware to a STM32 device:
|
There are a number of DFU commands that you can use to flash firmware to a STM32 device:
|
||||||
|
|
||||||
* `:dfu-util` - The default command for flashing to STM32 devices.
|
* `:dfu-util` - The default command for flashing to STM32 devices, and will wait until an STM32 bootloader device is present.
|
||||||
* `:dfu-util-wait` - This works like the default command, but it gives you a (configurable) 10 second timeout before it attempts to flash the firmware. You can use `TIME_DELAY=20` from the command line to change the timeout.
|
* `:dfu-util-split-left` - This flashes the normal firmware, just like the default option (`:dfu-util`). However, this also configures the "Left Side" EEPROM setting for split keyboards.
|
||||||
* Eg: `make <keyboard>:<keymap>:dfu-util TIME_DELAY=5`
|
* `:dfu-util-split-right` - This flashes the normal firmware, just like the default option (`:dfu-util`). However, this also configures the "Right Side" EEPROM setting for split keyboards.
|
||||||
* `:st-link-cli` - This allows you to flash the firmware via ST-LINK's CLI utility, rather than dfu-util.
|
* `:st-link-cli` - This allows you to flash the firmware via ST-LINK's CLI utility, rather than dfu-util.
|
||||||
|
|
70
docs/flashing_bootloadhid.md
Normal file
70
docs/flashing_bootloadhid.md
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
# BootloadHID Flashing Instructions and Bootloader Information
|
||||||
|
|
||||||
|
ps2avr(GB) boards use an ATmega32A microcontroller and a different bootloader. It is not flashable using the regular QMK methods.
|
||||||
|
|
||||||
|
General flashing sequence:
|
||||||
|
|
||||||
|
1. Enter the bootloader using any of the following methods:
|
||||||
|
* Tap the `RESET` keycode (may not work on all devices)
|
||||||
|
* Hold the salt key while plugging the keyboard in (usually documented within keyboard readme)
|
||||||
|
2. Wait for the OS to detect the device
|
||||||
|
3. Flash a .hex file
|
||||||
|
4. Reset the device into application mode (may be done automatically)
|
||||||
|
|
||||||
|
## bootloadHID Flashing Target
|
||||||
|
|
||||||
|
Using the QMK installation script, detailed [here](newbs_getting_started.md), the required bootloadHID tools should be automatically installed.
|
||||||
|
|
||||||
|
To flash via the command line, use the target `:bootloadHID` by executing the following command:
|
||||||
|
|
||||||
|
make <keyboard>:<keymap>:bootloadHID
|
||||||
|
|
||||||
|
## GUI Flashing
|
||||||
|
|
||||||
|
### Windows
|
||||||
|
1. Download [HIDBootFlash](http://vusb.wikidot.com/project:hidbootflash).
|
||||||
|
2. Place your keyboard into reset.
|
||||||
|
3. Ensure the configured VendorID is `16c0` and ProductID is `05df`
|
||||||
|
4. Press the `Find Device` button and ensure that your keyboard is found.
|
||||||
|
5. Press the `Open .hex File` button and locate the `.hex` file you created.
|
||||||
|
6. Press the `Flash Device` button and wait for the process to complete.
|
||||||
|
|
||||||
|
## Command Line Flashing
|
||||||
|
|
||||||
|
1. Place your keyboard into reset.
|
||||||
|
2. Flash the board by typing `bootloadHID -r` followed by the path to your `.hex` file.
|
||||||
|
|
||||||
|
### Windows Manual Installation
|
||||||
|
For MSYS2:
|
||||||
|
1. Download the BootloadHID firmware package from https://www.obdev.at/downloads/vusb/bootloadHID.2012-12-08.tar.gz.
|
||||||
|
2. Extract contents using a compatible tool, for example 7-Zip.
|
||||||
|
3. Add to the MSYS path by copying `commandline/bootloadHID.exe` from the extracted archive to your MSYS2 installation, typically `C:\msys64\usr\bin`.
|
||||||
|
|
||||||
|
For native Windows flashing, the `bootloadHID.exe` can be used outside of the MSYS2 environment.
|
||||||
|
|
||||||
|
### Linux Manual Installation
|
||||||
|
1. Install libusb development dependency:
|
||||||
|
```bash
|
||||||
|
# This depends on OS - for Debian the following works
|
||||||
|
sudo apt-get install libusb-dev
|
||||||
|
```
|
||||||
|
2. Download the BootloadHID firmware package:
|
||||||
|
```
|
||||||
|
wget https://www.obdev.at/downloads/vusb/bootloadHID.2012-12-08.tar.gz -O - | tar -xz -C /tmp
|
||||||
|
```
|
||||||
|
3. Build the bootloadHID executable:
|
||||||
|
```
|
||||||
|
cd /tmp/bootloadHID.2012-12-08/commandline/
|
||||||
|
make
|
||||||
|
sudo cp bootloadHID /usr/local/bin
|
||||||
|
```
|
||||||
|
|
||||||
|
### MacOS Manual Installation
|
||||||
|
1. Install Homebrew by typing the following:
|
||||||
|
```
|
||||||
|
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
|
||||||
|
```
|
||||||
|
2. Install the following packages:
|
||||||
|
```
|
||||||
|
brew install --HEAD https://raw.githubusercontent.com/robertgzr/homebrew-tap/master/bootloadhid.rb
|
||||||
|
```
|
52
docs/fr-fr/ChangeLog/20190830.md
Normal file
52
docs/fr-fr/ChangeLog/20190830.md
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
# QMK Breaking Change - 30 août 2019
|
||||||
|
|
||||||
|
Quatre fois par an, QMK lance un processus pour fusionner les Breaking Changes. Un Breaking Change est un changement qui modifie la manière dont QMK fonctionne introduisant des incompatibilités ou des comportements dangereux. Nous n'effectuons ces changements que 4 fois par an afin que les utilisateurs n'aient pas peur de casser leurs keymaps en mettant à jour leur version de QMK.
|
||||||
|
|
||||||
|
Ce document présente les fusions de Breaking Change. Voici la liste des changements.
|
||||||
|
|
||||||
|
## Formattage de code Core avec clang-format
|
||||||
|
|
||||||
|
* Tous les fichiers core (`drivers/`, `quantum/`, `tests/`, et `tmk_core/`) seront formatés avec clang-format
|
||||||
|
* Un processus travis pour reformatter les PRs lors de la fusion a été mis en place
|
||||||
|
* Vous pouvez utiliser la nouvelle commande CLI `qmk cformat` afin de formater avant de soumettre votre PR si vous le souhaitez.
|
||||||
|
|
||||||
|
## Nettoyage des descripteurs LUFA USB
|
||||||
|
|
||||||
|
* Nettoyage du code lié aux descripteurs USB HID sur les claviers AVR, afin de les rendre plus simple à lire et compréhensibles
|
||||||
|
* Plus d'information: https://github.com/qmk/qmk_firmware/pull/4871
|
||||||
|
* Normalement pas de changement de fonctionnement et aucune keymap modifiée.
|
||||||
|
|
||||||
|
## Migration des entrées de `ACTION_LAYER_MOMENTARY()` dans `fn_actions` vers des keycodes `MO()`
|
||||||
|
|
||||||
|
* `fn_actions` est déprécié, et ses fonctionnalités ont été remplacées par des keycodes directs et `process_record_user()`
|
||||||
|
* Supprimer cette fonctionnalité obsolète devrait aboutir à une réduction importante de la taille du firmware et de la complexité du code
|
||||||
|
* Il est recommandé que toutes les keymaps affectées remplacent `fn_actions` vers les fonctionnalités de [keycode custom](https://docs.qmk.fm/#/custom_quantum_functions) et [macro](https://docs.qmk.fm/#/feature_macros)
|
||||||
|
|
||||||
|
## Mise à jour Atreus vers les conventions de codage courantes
|
||||||
|
|
||||||
|
* Les doublons include guards ont contourné le comportement de traitement des headers attendu
|
||||||
|
* Il est recommandé pour toutes les keymaps affectées de supprimer le doublon de `<keyboard>/config.h` et `<keyboard>/keymaps/<user>/config.h` et de ne garder que des surcharges au niveau keymap
|
||||||
|
|
||||||
|
## Récupération des changements de fichier keymap langage de la fork ZSA
|
||||||
|
|
||||||
|
* Corrige une issue dans le fichier `keymap_br_abnt2.h` qui inclut la mauvaise souce (`keymap_common.h` au lieu de `keymap.h`)
|
||||||
|
* Met à jour le fichier `keymap_swedish.h` afin d'être spécifique au suédois et plus "nordique" en général.
|
||||||
|
* Toutes les keymaps qui utilisent ceci devront supprimer `NO_*` et le remplacer par `SE_*`.
|
||||||
|
|
||||||
|
## Mise à jour du repo afin d'utiliser LUFA comme un sous-module git
|
||||||
|
|
||||||
|
* `/lib/LUFA` supprimé du dépôt
|
||||||
|
* LUFA, définis comme un sous-module, pointe vers qmk/lufa
|
||||||
|
* Ceci devrait ajouter plus de flexibilité vers LUFA, et nous permet de garder le sous-module à jour bien plus facilement. Il avait environ 2 ans de retard, sans manière simple de corriger. Ce changement devrait simplifier la mise à jour dans le futur.
|
||||||
|
|
||||||
|
## Migration des entrées `ACTION_BACKLIGHT_*()` dans `fn_actions` vers des keycodes `BL_`
|
||||||
|
|
||||||
|
* `fn_actions` est déprécié, et ses fonctionnalités ont été remplacées par des keycodes directs et `process_record_user()`
|
||||||
|
* Toutes les keymaps utilisant ces actions doivent avoir les clés `KC_FN*` remplacées par les clés `BL_*` équivalentes
|
||||||
|
* Si vous utilisez actuellement `KC_FN*` vous devrez remplacer `fn_actions` avec les fonctionnalités de [keycode custom](https://docs.qmk.fm/#/custom_quantum_functions) et [macro](https://docs.qmk.fm/#/feature_macros)
|
||||||
|
|
||||||
|
## Remplacer l'alias `KC_DELT` par `KC_DEL`
|
||||||
|
|
||||||
|
* `KC_DELT` était un alias redondant et non documenté pour `KC_DELETE`
|
||||||
|
* Il a été supprimé et toutes ses utilisations ont été remplacées par l'alias plus courant `KC_DEL`
|
||||||
|
* Environ 90 keymaps (surtout des boards ErgoDox) ont été modifiées à cette fin
|
32
docs/fr-fr/README.md
Normal file
32
docs/fr-fr/README.md
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
# Quantum Mechanical Keyboard Firmware
|
||||||
|
|
||||||
|
[![Version courante](https://img.shields.io/github/tag/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/tags)
|
||||||
|
[![Statut du build](https://travis-ci.org/qmk/qmk_firmware.svg?branch=master)](https://travis-ci.org/qmk/qmk_firmware)
|
||||||
|
[![Discord](https://img.shields.io/discord/440868230475677696.svg)](https://discord.gg/Uq7gcHh)
|
||||||
|
[![Statut de la doc](https://img.shields.io/badge/docs-ready-orange.svg)](https://docs.qmk.fm)
|
||||||
|
[![Contributeurs Github](https://img.shields.io/github/contributors/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/pulse/monthly)
|
||||||
|
[![Forks Github](https://img.shields.io/github/forks/qmk/qmk_firmware.svg?style=social&label=Fork)](https://github.com/qmk/qmk_firmware/)
|
||||||
|
|
||||||
|
## Qu'est-ce que QMK Firmware ?
|
||||||
|
|
||||||
|
QMK (*Quantum Mechanical Keyboard*) est une communauté open source qui maintient le firmware QMK, la QMK Toolbox (*Boite à outil*), qmk.fm et leurs documentations. QMK Firmware est un firmware dédié aux claviers qui est basé sur [tmk\_keyboard](http://github.com/tmk/tmk_keyboard). Il offre des fonctionnalités très utiles pour les contrôleurs Atmel AVR, et, plus spécifiquement pour [les produits d'OLKB](http://olkb.com), le clavier [ErgoDox EZ](http://www.ergodox-ez.com), et pour les [produits Clueboard](http://clueboard.co/). Il prend désormais aussi en charge les processeurs ARM qui utilisent ChibiOS. Vous pouvez l'utiliser pour contrôler un clavier personnalisé soudé à la main ou alors sur un clavier avec un PCB personnalisé.
|
||||||
|
|
||||||
|
## Comment l'obtenir
|
||||||
|
|
||||||
|
Si vous souhaitez contribuer à une disposition de clavier (keymap), ou à des fonctionnalités de QMK alors le plus simple est de [forker le dépôt avec Github](https://github.com/qmk/qmk_firmware#fork-destination-box) puis cloner le dépôt localement pour y faire des changements. Vous pourrez pousser vos changements sur github puis ouvrir un [Pull Request](https://github.com/qmk/qmk_firmware/pulls) depuis votre fork Github.
|
||||||
|
|
||||||
|
Sinon, vous pouvez aussi le télécharger directement en ([zip](https://github.com/qmk/qmk_firmware/zipball/master), [tar](https://github.com/qmk/qmk_firmware/tarball/master)), ou le cloner avec git en ssh (`git@github.com:qmk/qmk_firmware.git`), ou https (`https://github.com/qmk/qmk_firmware.git`).
|
||||||
|
|
||||||
|
## Comment le compiler
|
||||||
|
|
||||||
|
Avant d'être prêt à compiler vous allez devoir [installer un environnement](getting_started_build_tools.md) pour les développements AVR et/ou ARM. Une fois ceci fait, vous pourrez utiliser la commande `make` pour compiler le clavier et la disposition avec une commande de ce type :
|
||||||
|
|
||||||
|
make planck/rev4:default
|
||||||
|
|
||||||
|
Cette commande compilera la révision `rev4` du clavier `planck` avec la disposition `default`. Notez que tous les claviers n'ont pas forcément de révisions (aussi appelées sous-projects ou dossiers, ou en anglais « subprojects » ou « folder »). Cette option peut donc être omise :
|
||||||
|
|
||||||
|
make preonic:default
|
||||||
|
|
||||||
|
## Comment le personnaliser
|
||||||
|
|
||||||
|
QMK a beaucoup de [fonctionnalités](features.md) à explorer, et [une documentation](http://docs.qmk.fm) très abondante que vous pourrez parcourir. La plupart des fonctionnalités vous permettrons de modifier vos [dispositions](keymap.md) (keymaps) et de changer [les codes de caractères](keycodes.md) (keycodes).
|
125
docs/fr-fr/_summary.md
Normal file
125
docs/fr-fr/_summary.md
Normal file
|
@ -0,0 +1,125 @@
|
||||||
|
**En Français**
|
||||||
|
|
||||||
|
* [Guide pour débutant complet](fr-fr/newbs.md)
|
||||||
|
* [Pour débuter](fr-fr/newbs_getting_started.md)
|
||||||
|
* [Compiler son premier firmware](fr-fr/newbs_building_firmware.md)
|
||||||
|
* [Flasher le Firmware](fr-fr/newbs_flashing.md)
|
||||||
|
* [Test et Débuggage](fr-fr/newbs_testing_debugging.md)
|
||||||
|
* [Bonnes pratiques Git](fr-fr/newbs_best_practices.md)
|
||||||
|
* [Ressources d'apprentissage](fr-fr/newbs_learn_more_resources.md)
|
||||||
|
|
||||||
|
* [Les bases de QMK](fr-fr/README.md)
|
||||||
|
* [Indroduction à QMK](fr-fr/getting_started_introduction.md)
|
||||||
|
* [QMK CLI](fr-fr/cli.md)
|
||||||
|
* [Configuration de la CLI QMK](fr-fr/cli_configuration.md)
|
||||||
|
* [Contribuer à QMK](fr-fr/contributing.md)
|
||||||
|
* [Comment utiliser GitHub](fr-fr/getting_started_github.md)
|
||||||
|
* [Trouver de l'aide](fr-fr/getting_started_getting_help.md)
|
||||||
|
|
||||||
|
* [Breaking changes](fr-fr/breaking_changes.md)
|
||||||
|
* [30 août 2019](fr-fr/ChangeLog/20190830.md)
|
||||||
|
|
||||||
|
* [FAQ](fr-fr/faq.md)
|
||||||
|
* [FAQ Générale](fr-fr/faq_general.md)
|
||||||
|
* [Compiler QMK](fr-fr/faq_build.md)
|
||||||
|
* [Débugguer / Dépanner QMK](fr-fr/faq_debug.md)
|
||||||
|
* [Keymap / Disposition](fr-fr/faq_keymap.md)
|
||||||
|
* [Installer les drivers avec Zadig](fr-fr/driver_installation_zadig.md)
|
||||||
|
|
||||||
|
**En Anglais**
|
||||||
|
|
||||||
|
* Guides détaillés
|
||||||
|
* [Installation des outils de compilation](getting_started_build_tools.md)
|
||||||
|
* [Guide Vagrant](getting_started_vagrant.md)
|
||||||
|
* [Commandes de compilations](getting_started_make_guide.md)
|
||||||
|
* [Flasher les firmwares](fr-fr/flashing.md)
|
||||||
|
* [Personnaliser les fonctionnalités](custom_quantum_functions.md)
|
||||||
|
* [Aperçu des fonctionnalités des dispositions](keymap.md)
|
||||||
|
|
||||||
|
* [Hardware](hardware.md)
|
||||||
|
* [Processeurs AVR](hardware_avr.md)
|
||||||
|
* [Pilotes / Drivers](hardware_drivers.md)
|
||||||
|
|
||||||
|
* Réferences
|
||||||
|
* [Lignes de conduite des claviers](hardware_keyboard_guidelines.md)
|
||||||
|
* [Options de configurations](config_options.md)
|
||||||
|
* [Keycodes / Codes des caractères](keycodes.md)
|
||||||
|
* [Conventions de codage - C](coding_conventions_c.md)
|
||||||
|
* [Conventions de codage - Python](coding_conventions_python.md)
|
||||||
|
* [Meilleurs pratiques sur la documentation](documentation_best_practices.md)
|
||||||
|
* [Modèles de documentation](documentation_templates.md)
|
||||||
|
* [Glossaire](reference_glossary.md)
|
||||||
|
* [Tests unitaires](unit_testing.md)
|
||||||
|
* [Fonctions utiles](ref_functions.md)
|
||||||
|
* [Support de configuration](reference_configurator_support.md)
|
||||||
|
* [Format du fichier info.json](reference_info_json.md)
|
||||||
|
* [Développer la CLI en Python](cli_development.md)
|
||||||
|
|
||||||
|
* [Fonctionnalités](features.md)
|
||||||
|
* [Keycodes basiques](keycodes_basic.md)
|
||||||
|
* [Touches utilisées avec Shift (US ANSI)](keycodes_us_ansi_shifted.md)
|
||||||
|
* [Keycodes quantiques](quantum_keycodes.md)
|
||||||
|
* [Keycodes avancés](feature_advanced_keycodes.md)
|
||||||
|
* [Fonctionnalités audio](feature_audio.md)
|
||||||
|
* [Majuscule automatique](feature_auto_shift.md)
|
||||||
|
* [Rétroéclairage](feature_backlight.md)
|
||||||
|
* [Bluetooth](feature_bluetooth.md)
|
||||||
|
* [Bootmagic](feature_bootmagic.md)
|
||||||
|
* [Combos](feature_combo.md)
|
||||||
|
* [Commande](feature_command.md)
|
||||||
|
* [API anti-rebond](feature_debounce_type.md)
|
||||||
|
* [DIP Switch](feature_dip_switch.md)
|
||||||
|
* [Macros dynamiques](feature_dynamic_macros.md)
|
||||||
|
* [Interrupteurs rotatifs](feature_encoders.md)
|
||||||
|
* [Grave Escape](feature_grave_esc.md)
|
||||||
|
* [Retour haptique](feature_haptic_feedback.md)
|
||||||
|
* [Contrôleur LCD HD44780](feature_hd44780.md)
|
||||||
|
* [Touche à verrou / Lock-key](feature_key_lock.md)
|
||||||
|
* [Dispositions / layouts](feature_layouts.md)
|
||||||
|
* [Touche leader](feature_leader_key.md)
|
||||||
|
* [Matrice LED](feature_led_matrix.md)
|
||||||
|
* [Macros](feature_macros.md)
|
||||||
|
* [Boutons de souris](feature_mouse_keys.md)
|
||||||
|
* [Pilotes / Drivers OLED](feature_oled_driver.md)
|
||||||
|
* [Touche one-shot](feature_advanced_keycodes.md#one-shot-keys)
|
||||||
|
* [Périphériques de pointage](feature_pointing_device.md)
|
||||||
|
* [Souris PS/2](feature_ps2_mouse.md)
|
||||||
|
* [Éclairage RGB](feature_rgblight.md)
|
||||||
|
* [Matrice RGB](feature_rgb_matrix.md)
|
||||||
|
* [Space Cadet](feature_space_cadet.md)
|
||||||
|
* [Claviers scindés / splittés](feature_split_keyboard.md)
|
||||||
|
* [Stenographie](feature_stenography.md)
|
||||||
|
* [Inversion des mains](feature_swap_hands.md)
|
||||||
|
* [Tap Dance](feature_tap_dance.md)
|
||||||
|
* [Terminale](feature_terminal.md)
|
||||||
|
* [Imprimante thermique](feature_thermal_printer.md)
|
||||||
|
* [Caractères unicodes](feature_unicode.md)
|
||||||
|
* [Dossier utilisateur](feature_userspace.md)
|
||||||
|
* [Velocikey](feature_velocikey.md)
|
||||||
|
|
||||||
|
* Pour les makers et les bricoleurs
|
||||||
|
* [Guide des claviers soudés à la main](hand_wire.md)
|
||||||
|
* [Guide de flash de l’ISP](isp_flashing_guide.md)
|
||||||
|
* [Guide du débogage ARM](arm_debugging.md)
|
||||||
|
* [Drivers i2c](i2c_driver.md)
|
||||||
|
* [Contrôles des GPIO](internals_gpio_control.md)
|
||||||
|
* [Conversion en Proton C](proton_c_conversion.md)
|
||||||
|
|
||||||
|
* Pour aller plus loin
|
||||||
|
* [Comment fonctionnent les claviers](how_keyboards_work.md)
|
||||||
|
* [Comprendre QMK](understanding_qmk.md)
|
||||||
|
|
||||||
|
* Autres sujets
|
||||||
|
* [Utiliser Eclipse avec QMK](other_eclipse.md)
|
||||||
|
* [Utiliser VSCode avec QMK](other_vscode.md)
|
||||||
|
* [Support](support.md)
|
||||||
|
* [Comment ajouter des traductions](translating.md)
|
||||||
|
|
||||||
|
* À l’intérieur de QMK (En cours de documentation)
|
||||||
|
* [Définitions](internals_defines.md)
|
||||||
|
* [Input Callback Reg](internals_input_callback_reg.md)
|
||||||
|
* [Appareils Midi](internals_midi_device.md)
|
||||||
|
* [Installation d’un appareil Midi](internals_midi_device_setup_process.md)
|
||||||
|
* [Utilitaires Midi](internals_midi_util.md)
|
||||||
|
* [Fonctions Midi](internals_send_functions.md)
|
||||||
|
* [Outils Sysex](internals_sysex_tools.md)
|
107
docs/fr-fr/breaking_changes.md
Normal file
107
docs/fr-fr/breaking_changes.md
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
# Breaking changes
|
||||||
|
|
||||||
|
Ce document décrit le processus de QMK pour la gestion des breaking changes. Un breaking change est un changement qui modifie la manière dont QMK fonctionne introduisant des incompatibilités ou des comportements dangereux. Nous limitons ces changements afin que les utilisateurs n'aient pas peur de casser leurs keymaps en mettant à jour leur version de QMK.
|
||||||
|
|
||||||
|
La période de breaking change est quand nous allons fusionner un PR qui change QMK d'une manière dangereuse ou inattendue. Il y a une période interne de test afin de nous assurer que les problèmes résiduels sont rares ou impossible à prévoir.
|
||||||
|
|
||||||
|
## Qu'est-ce qui a été inclus dans des Breaking Changes précédents?
|
||||||
|
|
||||||
|
* [30 août 2019](ChangeLog/20190830.md)
|
||||||
|
|
||||||
|
## Quand va être le prochain Breaking Change?
|
||||||
|
|
||||||
|
Le prochain Breaking Change est planifié pour le 29 novembre.
|
||||||
|
|
||||||
|
### Dates importantes
|
||||||
|
|
||||||
|
* [x] 21 septembre 2019 - `future` est créé. Il va être rebasé de manière hebdomadaire.
|
||||||
|
* [ ] 01 novembre 2019 - `future` fermé aux nouveaux PRs.
|
||||||
|
* [ ] 01 novembre 2019 - Appel aux testeurs.
|
||||||
|
* [ ] 27 novembre 2019 - `master` est bloqué, pas de PRs fusionnés.
|
||||||
|
* [ ] 29 novembre 2019 - `future` est fusionné dans `master`.
|
||||||
|
* [ ] 30 novembre 2019 - `master` est débloqué. Les PRs peuvent à nouveau être fusionnés.
|
||||||
|
|
||||||
|
## Quels changements seront inclus?
|
||||||
|
|
||||||
|
Pour voir une liste de candidats de breaking changes, vous pouvez regarder la liste des [labels `breaking_change`](https://github.com/qmk/qmk_firmware/pulls?q=is%3Aopen+label%3Abreaking_change+is%3Apr). De nouveaux changements peuvent être ajoutés entre maintenant et lorsque `future` est fermée, et un PR avec ce label n'est pas garanti d'être fusionné.
|
||||||
|
|
||||||
|
Si vous souhaitez que votre breaking change soit inclus dans ce tour, vous devez créer un PR avec le label `breaking_change` et faire en sorte qu'il soit accepté avant que `future` ne soit fermé. Une fois `future` fermé, aucun nouveau breaking change sera accepté.
|
||||||
|
|
||||||
|
Critère d'acceptation:
|
||||||
|
|
||||||
|
* Le PR est complété et prêt à fusionner
|
||||||
|
* Le PR a un ChangeLog
|
||||||
|
|
||||||
|
# Checklists
|
||||||
|
|
||||||
|
Cette section documente plusieurs processus que nous utilisons en lançant le processus de Breaking Change.
|
||||||
|
|
||||||
|
## Rebase `future` de `master`
|
||||||
|
|
||||||
|
Ceci est lancé chaque vendredi tant que `future` est ouvert.
|
||||||
|
|
||||||
|
Processus:
|
||||||
|
|
||||||
|
```
|
||||||
|
cd qmk_firmware
|
||||||
|
git checkout master
|
||||||
|
git pull --ff-only
|
||||||
|
git checkout future
|
||||||
|
git rebase master
|
||||||
|
git push --force
|
||||||
|
```
|
||||||
|
|
||||||
|
## Créer la branche `future`
|
||||||
|
|
||||||
|
Ceci est fait immédiatement après la fusion de la branche `future` précédente.
|
||||||
|
|
||||||
|
* `qmk_firmware` git commands
|
||||||
|
* [ ] `git checkout master`
|
||||||
|
* [ ] `git pull --ff-only`
|
||||||
|
* [ ] `git checkout -b future`
|
||||||
|
* [ ] Modifie `readme.md`
|
||||||
|
* [ ] Ajoute un message en haut qui indique que c'est une branche de test.
|
||||||
|
* [ ] Ajoute un lien vers ce document
|
||||||
|
* [ ] `git commit -m 'Branch point for <DATE> Breaking Change'`
|
||||||
|
* [ ] `git tag breakpoint_<YYYY>_<MM>_<DD>`
|
||||||
|
* [ ] `git tag <next_version>` # Evite que le label point d'arrêt soit confondu par un incrément de version
|
||||||
|
* [ ] `git push origin future`
|
||||||
|
* [ ] `git push --tags`
|
||||||
|
|
||||||
|
## 4 Semaines Avant la Fusion
|
||||||
|
|
||||||
|
* `future` est maintenant fermé aux nouveaux PRs, seul des correctifs pour les PRs courants peuvent être mergés
|
||||||
|
* Envoi de l'appel aux testeurs
|
||||||
|
* [ ] Discord
|
||||||
|
* [ ] GitHub PR
|
||||||
|
* [ ] https://reddit.com/r/olkb
|
||||||
|
|
||||||
|
## 1 Semaine Avant la Fusion
|
||||||
|
|
||||||
|
* Annonce que master sera fermée entre <2 jours avant> à <Jour de la fusion>
|
||||||
|
* [ ] Discord
|
||||||
|
* [ ] GitHub PR
|
||||||
|
* [ ] https://reddit.com/r/olkb
|
||||||
|
|
||||||
|
## 2 Jours Avant la Fusion
|
||||||
|
|
||||||
|
* Annonce que master est fermé pour 2 jours
|
||||||
|
* [ ] Discord
|
||||||
|
* [ ] GitHub PR
|
||||||
|
* [ ] https://reddit.com/r/olkb
|
||||||
|
|
||||||
|
## Jour de la fusion
|
||||||
|
|
||||||
|
* `qmk_firmware` git commands
|
||||||
|
* [ ] `git checkout future`
|
||||||
|
* [ ] `git pull --ff-only`
|
||||||
|
* [ ] `git rebase origin/master`
|
||||||
|
* [ ] Modifie `readme.md`
|
||||||
|
* [ ] Supprimer les notes à propos de `future`
|
||||||
|
* [ ] Regroupe ChangeLog dans un fichier.
|
||||||
|
* [ ] `git commit -m 'Merge point for <DATE> Breaking Change'`
|
||||||
|
* [ ] `git push origin future`
|
||||||
|
* Actions sur Github
|
||||||
|
* [ ] Crée un PR pour `future`
|
||||||
|
* [ ] S'assurer que Travis ne relève aucun problème
|
||||||
|
* [ ] Fusion le PR `future`
|
146
docs/fr-fr/cli.md
Normal file
146
docs/fr-fr/cli.md
Normal file
|
@ -0,0 +1,146 @@
|
||||||
|
# La CLI de QMK
|
||||||
|
|
||||||
|
Cette page décrit comment configurer et utiliser la CLI QMK.
|
||||||
|
|
||||||
|
# Vue d'ensemble
|
||||||
|
|
||||||
|
La CLI de QMK permet de simplifier la compilation et l'interaction avec les claviers QMK. Nous avons défini plusieurs commandes pour simplifier et rationaliser les tâches telles qu'obtenir et compiler le firmware QMK, créer de nouvelles keymaps, et plus.
|
||||||
|
|
||||||
|
* [CLI globale](#global-cli)
|
||||||
|
* [CLI locale](#local-cli)
|
||||||
|
* [Les commandes CLI](#cli-commands)
|
||||||
|
|
||||||
|
# Pré-requis
|
||||||
|
|
||||||
|
La CLI nécessite Python 3.5 ou plus récent. Nous essayons de limiter le nombre de pré-requis, mais vous allez aussi devoir installer les paquets listés dans le fichier [`requirements.txt`](https://github.com/qmk/qmk_firmware/blob/master/requirements.txt).
|
||||||
|
|
||||||
|
# CLI globale
|
||||||
|
|
||||||
|
QMK met à disposition une CLI installable qui peut être utilisée pour configurer votre environnement de compilation QMK, fonctionne avec QMK, et qui rend l'utilisation de plusieurs copies de `qmk_firmware` plus simple. Nous recommandons d'installer et de mettre à jour ceci régulièrement.
|
||||||
|
|
||||||
|
## Installer en utilisant Homebrew (macOS, quelques Linux)
|
||||||
|
|
||||||
|
Si vous avez installé [Homebrew](https://brew.sh) vous pouvez entrer ce qui suit et installer QMK:
|
||||||
|
|
||||||
|
```
|
||||||
|
brew tap qmk/qmk
|
||||||
|
brew install qmk
|
||||||
|
export QMK_HOME='~/qmk_firmware' # Optional, set the location for `qmk_firmware`
|
||||||
|
qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment
|
||||||
|
```
|
||||||
|
|
||||||
|
## Installer en utilisant easy_install ou pip
|
||||||
|
|
||||||
|
Si votre système n'est pas listé ci-dessus, vous pouvez installer QMK manuellement. Premièrement, vérifiez que vous avez bien installé Python 3.5 (ou plus récent) et pip. Ensuite, installez QMK avec cette commande:
|
||||||
|
|
||||||
|
```
|
||||||
|
pip3 install qmk
|
||||||
|
export QMK_HOME='~/qmk_firmware' # Optional, set the location for `qmk_firmware`
|
||||||
|
qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment
|
||||||
|
```
|
||||||
|
|
||||||
|
## Paquets pour d'autres systèmes d'exploitation
|
||||||
|
|
||||||
|
Nous recherchons des gens pour créer et maintenir un paquet `qmk` pour plus de systèmes d'exploitation. Si vous voulez créer un paquet pour votre système d'exploitation, suivez ces directives:
|
||||||
|
|
||||||
|
* Suivez les bonnes pratiques pour votre système d'exploitation lorsqu'elles entrent en conflit avec ces directives
|
||||||
|
* Documentez pourquoi dans un commentaire lorsque vous ne les suivez pas
|
||||||
|
* Installez en utilisant un virtualenv
|
||||||
|
* Expliquez à l'utilisateur de définir la variable d'environnement `QMK_Home` pour "check out" les sources du firmware à un autre endroit que `~/qmk_firmware`.
|
||||||
|
|
||||||
|
# CLI locale
|
||||||
|
|
||||||
|
Si vous ne voulez pas utiliser la CLI globale, il y a une CLI locale empaquetée avec `qmk_firmware`. Vous pouvez le trouver dans `qmk_firmware/bin/qmk`. Vous pouvez lancer la commande `qmk` depuis n'importe quel répertoire et elle fonctionnera toujours sur cette copie de `qmk_firmware`.
|
||||||
|
|
||||||
|
**Exemple**:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ~/qmk_firmware/bin/qmk hello
|
||||||
|
Ψ Hello, World!
|
||||||
|
```
|
||||||
|
|
||||||
|
## Limitations de la CLI locale
|
||||||
|
|
||||||
|
Il y a quelques limitations à la CLI locale comparé à la globale:
|
||||||
|
|
||||||
|
* La CLI locale ne supporte pas `qmk setup` ou `qmk clone`
|
||||||
|
* La CLI locale n'opère pas sur le même arbre `qmk_firmware`, même si vous avez plusieurs dépôts clonés.
|
||||||
|
* La CLI locale ne s'exécute pas dans un virtualenv, donc il y a des risques que des dépendances seront en conflit
|
||||||
|
|
||||||
|
# Les commandes CLI
|
||||||
|
|
||||||
|
## `qmk compile`
|
||||||
|
|
||||||
|
Cette commande permet de compiler le firmware de n'importe quel répertoire. Vous pouvez compiler des exports JSON de <https://config.qmk.fm> ou compiler des keymaps du dépôt.
|
||||||
|
|
||||||
|
**Utilisation pour les exports de configuration**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk compile <configuratorExport.json>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Utilisation pour les Keymaps**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk compile -kb <keyboard_name> -km <keymap_name>
|
||||||
|
```
|
||||||
|
|
||||||
|
## `qmk cformat`
|
||||||
|
|
||||||
|
Cette commande formatte le code C en utilisant clang-format. Lancez-la sans arguments pour formatter tout le code core, ou passez les noms de fichiers à la ligne de commande pour la lancer sur des fichiers spécifiques.
|
||||||
|
|
||||||
|
**Utilisation**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk cformat [file1] [file2] [...] [fileN]
|
||||||
|
```
|
||||||
|
|
||||||
|
## `qmk config`
|
||||||
|
|
||||||
|
Cette commande vous permet de configurer le comportement de QMK. Pour la documentation complète de `qmk config`, regardez [Configuration de CLI](cli_configuration.md).
|
||||||
|
|
||||||
|
**Utilisation**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk config [-ro] [config_token1] [config_token2] [...] [config_tokenN]
|
||||||
|
```
|
||||||
|
|
||||||
|
## `qmk doctor`
|
||||||
|
|
||||||
|
Cette commande examine votre environnement et vous alertes des potentiels problèmes de compilation ou de flash.
|
||||||
|
|
||||||
|
**Utilisation**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk doctor
|
||||||
|
```
|
||||||
|
|
||||||
|
## `qmk new-keymap`
|
||||||
|
|
||||||
|
Cette commande crée une nouvelle keymap basée sur une keymap par défaut d'un clavier existant.
|
||||||
|
|
||||||
|
**Utilisation**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk new-keymap [-kb KEYBOARD] [-km KEYMAP]
|
||||||
|
```
|
||||||
|
|
||||||
|
## `qmk pyformat`
|
||||||
|
|
||||||
|
Cette commande formate le code python dans `qmk_firmware`.
|
||||||
|
|
||||||
|
**Utilisation**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk pyformat
|
||||||
|
```
|
||||||
|
|
||||||
|
## `qmk pytest`
|
||||||
|
|
||||||
|
Cette commande démarre la suite de test python. Si vous faites des changements dans le code Python, assurez-vous que les tests se lancent avec succès.
|
||||||
|
|
||||||
|
**Utilisation**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk pytest
|
||||||
|
```
|
121
docs/fr-fr/cli_configuration.md
Normal file
121
docs/fr-fr/cli_configuration.md
Normal file
|
@ -0,0 +1,121 @@
|
||||||
|
# Configuration de QMK CLI
|
||||||
|
|
||||||
|
Ce document explique comment fonctionne la commande `qmk config`.
|
||||||
|
|
||||||
|
# Introduction
|
||||||
|
|
||||||
|
La configuration pour QMK CLI est un système clé/valeur. Chaque clé est composée d'une sous-commande et d'un argument séparé par une virgule. Cela permet une traduction simple et directe entre les clés de configuration et l'argument qu'elle définit.
|
||||||
|
|
||||||
|
## Exemple simple
|
||||||
|
|
||||||
|
Comme exemple, regardons la commande `qmk compile --keyboard clueboard/66/rev4 --keymap default`.
|
||||||
|
|
||||||
|
Il y a deux arguments de ligne de commande qui peuvent être lu de la configuration:
|
||||||
|
|
||||||
|
* `compile.keyboard`
|
||||||
|
* `compile.keymap`
|
||||||
|
|
||||||
|
Essayons de les définir:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ qmk config compile.keyboard=clueboard/66/rev4 compile.keymap=default
|
||||||
|
compile.keyboard: None -> clueboard/66/rev4
|
||||||
|
compile.keymap: None -> default
|
||||||
|
Ψ Wrote configuration to '/Users/example/Library/Application Support/qmk/qmk.ini'
|
||||||
|
```
|
||||||
|
|
||||||
|
Maintenant, je peux lancer la commande `qmk compile` sans avoir à spécifier mon clavier et keymap à chaque fois.
|
||||||
|
|
||||||
|
## Définir les options par défaut
|
||||||
|
|
||||||
|
Parfois, il est utile de partager une configuration entre plusieurs commandes. Par exemple, plusieurs commandes prennent un argument `--keyboard`. Plutôt que de devoir définir cette valeur pour chaque commande, vous pouvez définir une valeur d'utilisateur qui sera utilisée par toutes les commandes qui prennent cet argument.
|
||||||
|
|
||||||
|
Exemple:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ qmk config user.keyboard=clueboard/66/rev4 user.keymap=default
|
||||||
|
user.keyboard: None -> clueboard/66/rev4
|
||||||
|
user.keymap: None -> default
|
||||||
|
Ψ Wrote configuration to '/Users/example/Library/Application Support/qmk/qmk.ini'
|
||||||
|
```
|
||||||
|
|
||||||
|
# CLI Documentation (`qmk config`)
|
||||||
|
|
||||||
|
La commande `qmk config` est utilisée pour interagir avec la configuration sous-jacente. Lancée sans argument, elle affiche la configuration courante. Lorsque des arguments sont définis, ils sont considérés comme étant des jetons de configuration, qui sont des chaînes de caractère ne contenant aucun espace avec le format suivant:
|
||||||
|
|
||||||
|
<subcommand|general|default>[.<key>][=<value>]
|
||||||
|
|
||||||
|
## Définir des valeurs de configuration
|
||||||
|
|
||||||
|
Vous pouvez définir des valeurs de configuration en mettant le caractère égal (=) dans votre clé de configuration. La clé doit toujours être dans le format complet `<section>.<key>`.
|
||||||
|
|
||||||
|
Exemple:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ qmk config default.keymap=default
|
||||||
|
default.keymap: None -> default
|
||||||
|
Ψ Wrote configuration to '/Users/example/Library/Application Support/qmk/qmk.ini'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Lire des valeurs de configuration
|
||||||
|
|
||||||
|
Vous pouvez lire les valeurs de configuration pour la totalité de la configuration, une seule clé, ou une section entière. Vous pouvez aussi spécifier plusieurs clés pour afficher plus d'une valeur.
|
||||||
|
|
||||||
|
### Exemple avec la totalité de la configuration
|
||||||
|
|
||||||
|
qmk config
|
||||||
|
|
||||||
|
### Exemple avec une section entière
|
||||||
|
|
||||||
|
qmk config compile
|
||||||
|
|
||||||
|
### Exemple avec une clé unique
|
||||||
|
|
||||||
|
qmk config compile.keyboard
|
||||||
|
|
||||||
|
### Exemple avec plusieurs clés
|
||||||
|
|
||||||
|
qmk config user compile.keyboard compile.keymap
|
||||||
|
|
||||||
|
## Supprimer des valeurs de configuration
|
||||||
|
|
||||||
|
Vous pouvez supprimer une valeur de configuration en la définissant avec la chaîne spéciale `None`.
|
||||||
|
|
||||||
|
Exemple:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ qmk config default.keymap=None
|
||||||
|
default.keymap: default -> None
|
||||||
|
Ψ Wrote configuration to '/Users/example/Library/Application Support/qmk/qmk.ini'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Plusieurs opérations
|
||||||
|
|
||||||
|
Vous pouvez combiner plusieurs opérations d'écriture et de lecture en une seule commande. Elles seront exécutées et affichées dans l'ordre:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ qmk config compile default.keymap=default compile.keymap=None
|
||||||
|
compile.keymap=skully
|
||||||
|
compile.keyboard=clueboard/66_hotswap/gen1
|
||||||
|
default.keymap: None -> default
|
||||||
|
compile.keymap: skully -> None
|
||||||
|
Ψ Wrote configuration to '/Users/example/Library/Application Support/qmk/qmk.ini'
|
||||||
|
```
|
||||||
|
|
||||||
|
# Options de configuration utilisateur
|
||||||
|
|
||||||
|
| Clé | Valeur par défaut | Description |
|
||||||
|
|-----|---------------|-------------|
|
||||||
|
| user.keyboard | None | Le chemin d'accès vers le clavier (Exemple: `clueboard/66/rev4`) |
|
||||||
|
| user.keymap | None | Le nom de la keymap (Exemple: `default`) |
|
||||||
|
| user.name | None | Le nom d'utilisateur GitHub de l'utilisateur. |
|
||||||
|
|
||||||
|
# Toutes les options de configuration
|
||||||
|
|
||||||
|
| Clé | Valeur par défaut | Description |
|
||||||
|
|-----|---------------|-------------|
|
||||||
|
| compile.keyboard | None | Le chemin d'accès vers le clavier (Exemple: `clueboard/66/rev4`) |
|
||||||
|
| compile.keymap | None | Le nom de la keymap (Exemple: `default`) |
|
||||||
|
| hello.name | None | Le nom à saluer lorsque démarré. |
|
||||||
|
| new_keyboard.keyboard | None | Le chemin d'accès vers le clavier (Exemple: `clueboard/66/rev4`) |
|
||||||
|
| new_keyboard.keymap | None | Le nom de la keymap (Example: `default`) |
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue