Merge remote-tracking branch 'qmk/master' into merge-2022-03-06
This commit is contained in:
commit
3a3c93383f
@ -5,6 +5,9 @@ AlignConsecutiveAssignments: 'true'
|
|||||||
AlignConsecutiveDeclarations: 'true'
|
AlignConsecutiveDeclarations: 'true'
|
||||||
AlignOperands: 'true'
|
AlignOperands: 'true'
|
||||||
AllowAllParametersOfDeclarationOnNextLine: 'false'
|
AllowAllParametersOfDeclarationOnNextLine: 'false'
|
||||||
|
AllowShortCaseLabelsOnASingleLine: 'false'
|
||||||
|
AllowShortFunctionsOnASingleLine: Empty
|
||||||
|
AllowShortLoopsOnASingleLine: 'false'
|
||||||
AlwaysBreakAfterDefinitionReturnType: None
|
AlwaysBreakAfterDefinitionReturnType: None
|
||||||
AlwaysBreakAfterReturnType: None
|
AlwaysBreakAfterReturnType: None
|
||||||
AlwaysBreakBeforeMultilineStrings: 'false'
|
AlwaysBreakBeforeMultilineStrings: 'false'
|
||||||
@ -20,6 +23,7 @@ SortIncludes: 'false'
|
|||||||
SpaceBeforeAssignmentOperators: 'true'
|
SpaceBeforeAssignmentOperators: 'true'
|
||||||
SpaceBeforeParens: ControlStatements
|
SpaceBeforeParens: ControlStatements
|
||||||
SpaceInEmptyParentheses: 'false'
|
SpaceInEmptyParentheses: 'false'
|
||||||
|
SpacesBeforeTrailingComments: 1
|
||||||
TabWidth: '4'
|
TabWidth: '4'
|
||||||
UseTab: Never
|
UseTab: Never
|
||||||
|
|
||||||
|
111
.gitattributes
vendored
111
.gitattributes
vendored
@ -2,39 +2,40 @@
|
|||||||
* text=auto
|
* text=auto
|
||||||
|
|
||||||
# sources
|
# sources
|
||||||
*.c text
|
*.c text eol=lf
|
||||||
*.cc text
|
*.cc text eol=lf
|
||||||
*.cxx text
|
*.cxx text eol=lf
|
||||||
*.cpp text
|
*.cpp text eol=lf
|
||||||
*.c++ text
|
*.c++ text eol=lf
|
||||||
*.hpp text
|
*.hpp text eol=lf
|
||||||
*.h text
|
*.h text eol=lf
|
||||||
*.h++ text
|
*.h++ text eol=lf
|
||||||
*.hh text
|
*.hh text eol=lf
|
||||||
*.bat text
|
*.bat text eol=crlf
|
||||||
*.coffee text
|
*.cmd text eol=crlf
|
||||||
*.css text
|
*.coffee text eol=lf
|
||||||
*.htm text
|
*.css text eol=lf
|
||||||
*.html text
|
*.htm text eol=lf
|
||||||
*.inc text
|
*.html text eol=lf
|
||||||
*.ini text
|
*.inc text eol=lf
|
||||||
*.js text
|
*.ini text eol=crlf
|
||||||
*.jsx text
|
*.js text eol=lf
|
||||||
*.json text
|
*.jsx text eol=lf
|
||||||
*.less text
|
*.json text eol=lf
|
||||||
*.php text
|
*.less text eol=lf
|
||||||
*.pl text
|
*.php text eol=lf
|
||||||
*.py text
|
*.pl text eol=lf
|
||||||
*.rb text
|
*.py text eol=lf
|
||||||
*.sass text
|
*.rb text eol=lf
|
||||||
*.scm text
|
*.sass text eol=lf
|
||||||
*.scss text
|
*.scm text eol=lf
|
||||||
*.sh text
|
*.scss text eol=lf
|
||||||
*.sql text
|
*.sh text eol=lf
|
||||||
*.styl text
|
*.sql text eol=lf
|
||||||
*.ts text
|
*.styl text eol=lf
|
||||||
*.xml text
|
*.ts text eol=lf
|
||||||
*.xhtml text
|
*.xml text eol=lf
|
||||||
|
*.xhtml text eol=lf
|
||||||
|
|
||||||
# make files (need to always use lf for compatibility with Windows 10 bash)
|
# make files (need to always use lf for compatibility with Windows 10 bash)
|
||||||
Makefile eol=lf
|
Makefile eol=lf
|
||||||
@ -44,27 +45,27 @@ Makefile eol=lf
|
|||||||
*.sh eol=lf
|
*.sh eol=lf
|
||||||
|
|
||||||
# documentation
|
# documentation
|
||||||
*.markdown text
|
*.markdown text eol=lf
|
||||||
*.md text
|
*.md text eol=lf
|
||||||
*.mdwn text
|
*.mdwn text eol=lf
|
||||||
*.mdown text
|
*.mdown text eol=lf
|
||||||
*.mkd text
|
*.mkd text eol=lf
|
||||||
*.mkdn text
|
*.mkdn text eol=lf
|
||||||
*.mdtxt text
|
*.mdtxt text eol=lf
|
||||||
*.mdtext text
|
*.mdtext text eol=lf
|
||||||
*.txt text
|
*.txt text eol=lf
|
||||||
AUTHORS text
|
AUTHORS text eol=lf
|
||||||
CHANGELOG text
|
CHANGELOG text eol=lf
|
||||||
CHANGES text
|
CHANGES text eol=lf
|
||||||
CONTRIBUTING text
|
CONTRIBUTING text eol=lf
|
||||||
COPYING text
|
COPYING text eol=lf
|
||||||
INSTALL text
|
INSTALL text eol=lf
|
||||||
license text
|
license text eol=lf
|
||||||
LICENSE text
|
LICENSE text eol=lf
|
||||||
NEWS text
|
NEWS text eol=lf
|
||||||
readme text
|
readme text eol=lf
|
||||||
*README* text
|
*README* text eol=lf
|
||||||
TODO text
|
TODO text eol=lf
|
||||||
|
|
||||||
GRAPHICS
|
GRAPHICS
|
||||||
*.ai binary
|
*.ai binary
|
||||||
@ -82,7 +83,7 @@ GRAPHICS
|
|||||||
*.png binary
|
*.png binary
|
||||||
*.psb binary
|
*.psb binary
|
||||||
*.psd binary
|
*.psd binary
|
||||||
*.svg text
|
*.svg text eol=lf
|
||||||
*.svgz binary
|
*.svgz binary
|
||||||
*.tif binary
|
*.tif binary
|
||||||
*.tiff binary
|
*.tiff binary
|
||||||
|
23
.github/ISSUE_TEMPLATE/bug_report.md
vendored
23
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@ -18,18 +18,17 @@ assignees: ''
|
|||||||
|
|
||||||
## System Information
|
## System Information
|
||||||
|
|
||||||
- Keyboard:
|
**Keyboard:**
|
||||||
- Revision (if applicable):
|
**Revision (if applicable):**
|
||||||
- Operating system:
|
**Operating system:**
|
||||||
- AVR GCC version:
|
**`qmk doctor` output:**
|
||||||
<!-- Run `avr-gcc --version` to find this out. -->
|
```
|
||||||
- ARM GCC version:
|
(Paste output here)
|
||||||
<!-- Run `arm-none-eabi-gcc --version` to find this out. -->
|
```
|
||||||
- QMK Firmware version:
|
|
||||||
<!-- Run `git describe --abbrev=0 --tags` to find this out. -->
|
**Any keyboard related software installed?**
|
||||||
- Any keyboard related software installed?
|
- [ ] AutoHotKey (Windows)
|
||||||
- [ ] AutoHotKey
|
- [ ] Karabiner (macOS)
|
||||||
- [ ] Karabiner
|
|
||||||
- [ ] Other:
|
- [ ] Other:
|
||||||
|
|
||||||
## Additional Context
|
## Additional Context
|
||||||
|
2
.gitignore
vendored
2
.gitignore
vendored
@ -3,6 +3,7 @@
|
|||||||
*.swp
|
*.swp
|
||||||
*~
|
*~
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
._*
|
||||||
|
|
||||||
# Build artifacts
|
# Build artifacts
|
||||||
.clang_complete
|
.clang_complete
|
||||||
@ -18,7 +19,6 @@
|
|||||||
|
|
||||||
# QMK-specific
|
# QMK-specific
|
||||||
api_data/v1
|
api_data/v1
|
||||||
doxygen/
|
|
||||||
quantum/version.h
|
quantum/version.h
|
||||||
*.bin
|
*.bin
|
||||||
*.eep
|
*.eep
|
||||||
|
6
Doxyfile
6
Doxyfile
@ -21,7 +21,7 @@ DOXYFILE_ENCODING = UTF-8
|
|||||||
PROJECT_NAME = "QMK Firmware"
|
PROJECT_NAME = "QMK Firmware"
|
||||||
PROJECT_NUMBER = https://github.com/qmk/qmk_firmware
|
PROJECT_NUMBER = https://github.com/qmk/qmk_firmware
|
||||||
PROJECT_BRIEF = "Keyboard controller firmware for Atmel AVR and ARM USB families"
|
PROJECT_BRIEF = "Keyboard controller firmware for Atmel AVR and ARM USB families"
|
||||||
OUTPUT_DIRECTORY = doxygen
|
OUTPUT_DIRECTORY = .build/doxygen
|
||||||
ALLOW_UNICODE_NAMES = NO
|
ALLOW_UNICODE_NAMES = NO
|
||||||
OUTPUT_LANGUAGE = English
|
OUTPUT_LANGUAGE = English
|
||||||
BRIEF_MEMBER_DESC = YES
|
BRIEF_MEMBER_DESC = YES
|
||||||
@ -145,7 +145,7 @@ FILE_PATTERNS = *.c \
|
|||||||
RECURSIVE = YES
|
RECURSIVE = YES
|
||||||
EXCLUDE =
|
EXCLUDE =
|
||||||
EXCLUDE_SYMLINKS = NO
|
EXCLUDE_SYMLINKS = NO
|
||||||
EXCLUDE_PATTERNS =
|
EXCLUDE_PATTERNS = */protocol/arm_atsam/*
|
||||||
EXCLUDE_SYMBOLS =
|
EXCLUDE_SYMBOLS =
|
||||||
EXAMPLE_PATH =
|
EXAMPLE_PATH =
|
||||||
EXAMPLE_PATTERNS = *
|
EXAMPLE_PATTERNS = *
|
||||||
@ -209,7 +209,7 @@ EXPAND_ONLY_PREDEF = NO
|
|||||||
SEARCH_INCLUDES = YES
|
SEARCH_INCLUDES = YES
|
||||||
INCLUDE_PATH =
|
INCLUDE_PATH =
|
||||||
INCLUDE_FILE_PATTERNS =
|
INCLUDE_FILE_PATTERNS =
|
||||||
PREDEFINED =
|
PREDEFINED = __DOXYGEN__ PROGMEM
|
||||||
EXPAND_AS_DEFINED =
|
EXPAND_AS_DEFINED =
|
||||||
SKIP_FUNCTION_MACROS = YES
|
SKIP_FUNCTION_MACROS = YES
|
||||||
|
|
||||||
|
135
Makefile
135
Makefile
@ -19,6 +19,10 @@ endif
|
|||||||
# Otherwise the [OK], [ERROR] and [WARN] messages won't be displayed correctly
|
# Otherwise the [OK], [ERROR] and [WARN] messages won't be displayed correctly
|
||||||
override SILENT := false
|
override SILENT := false
|
||||||
|
|
||||||
|
ifdef SKIP_VERSION
|
||||||
|
SKIP_GIT := yes
|
||||||
|
endif
|
||||||
|
|
||||||
ifndef SUB_IS_SILENT
|
ifndef SUB_IS_SILENT
|
||||||
ifndef SKIP_GIT
|
ifndef SKIP_GIT
|
||||||
QMK_VERSION := $(shell git describe --abbrev=0 --tags 2>/dev/null)
|
QMK_VERSION := $(shell git describe --abbrev=0 --tags 2>/dev/null)
|
||||||
@ -50,48 +54,12 @@ ABS_ROOT_MAKEFILE := $(abspath $(ROOT_MAKEFILE))
|
|||||||
ABS_STARTING_DIR := $(dir $(ABS_STARTING_MAKEFILE))
|
ABS_STARTING_DIR := $(dir $(ABS_STARTING_MAKEFILE))
|
||||||
ABS_ROOT_DIR := $(dir $(ABS_ROOT_MAKEFILE))
|
ABS_ROOT_DIR := $(dir $(ABS_ROOT_MAKEFILE))
|
||||||
STARTING_DIR := $(subst $(ABS_ROOT_DIR),,$(ABS_STARTING_DIR))
|
STARTING_DIR := $(subst $(ABS_ROOT_DIR),,$(ABS_STARTING_DIR))
|
||||||
BUILD_DIR := $(ROOT_DIR)/.build
|
|
||||||
TEST_DIR := $(BUILD_DIR)/test
|
include paths.mk
|
||||||
|
|
||||||
|
TEST_OUTPUT_DIR := $(BUILD_DIR)/test
|
||||||
ERROR_FILE := $(BUILD_DIR)/error_occurred
|
ERROR_FILE := $(BUILD_DIR)/error_occurred
|
||||||
|
|
||||||
# Helper function to process the newt element of a space separated path
|
|
||||||
# It works a bit like the traditional functional head tail
|
|
||||||
# so the CURRENT_PATH_ELEMENT will become the new head
|
|
||||||
# and the PATH_ELEMENTS are the rest that are still unprocessed
|
|
||||||
define NEXT_PATH_ELEMENT
|
|
||||||
$$(eval CURRENT_PATH_ELEMENT := $$(firstword $$(PATH_ELEMENTS)))
|
|
||||||
$$(eval PATH_ELEMENTS := $$(wordlist 2,9999,$$(PATH_ELEMENTS)))
|
|
||||||
endef
|
|
||||||
|
|
||||||
# We change the / to spaces so that we more easily can work with the elements
|
|
||||||
# separately
|
|
||||||
PATH_ELEMENTS := $(subst /, ,$(STARTING_DIR))
|
|
||||||
# Initialize the path elements list for further processing
|
|
||||||
$(eval $(call NEXT_PATH_ELEMENT))
|
|
||||||
|
|
||||||
|
|
||||||
# Phony targets to enable a few simple make commands outside the main processing below.
|
|
||||||
.PHONY: list-keyboards
|
|
||||||
list-keyboards:
|
|
||||||
util/list_keyboards.sh | sort -u | tr '\n' ' '
|
|
||||||
|
|
||||||
.PHONY: generate-keyboards-file
|
|
||||||
generate-keyboards-file:
|
|
||||||
util/list_keyboards.sh | sort -u
|
|
||||||
|
|
||||||
.PHONY: clean
|
|
||||||
clean:
|
|
||||||
echo -n 'Deleting .build/ ... '
|
|
||||||
rm -rf $(BUILD_DIR)
|
|
||||||
echo 'done.'
|
|
||||||
|
|
||||||
.PHONY: distclean
|
|
||||||
distclean: clean
|
|
||||||
echo -n 'Deleting *.bin, *.hex, and *.uf2 ... '
|
|
||||||
rm -f *.bin *.hex *.uf2
|
|
||||||
echo 'done.'
|
|
||||||
|
|
||||||
|
|
||||||
.DEFAULT_GOAL := all:all
|
.DEFAULT_GOAL := all:all
|
||||||
|
|
||||||
|
|
||||||
@ -119,53 +87,20 @@ endef
|
|||||||
# a function that returns the value
|
# a function that returns the value
|
||||||
COMPARE_AND_REMOVE_FROM_RULE = $(eval $(call COMPARE_AND_REMOVE_FROM_RULE_HELPER,$1))$(RULE_FOUND)
|
COMPARE_AND_REMOVE_FROM_RULE = $(eval $(call COMPARE_AND_REMOVE_FROM_RULE_HELPER,$1))$(RULE_FOUND)
|
||||||
|
|
||||||
|
# Try to find a match for the start of the rule to be checked
|
||||||
# Recursively try to find a match for the start of the rule to be checked
|
|
||||||
# $1 The list to be checked
|
|
||||||
# If a match is found, then RULE_FOUND is set to true
|
|
||||||
# and MATCHED_ITEM to the item that was matched
|
|
||||||
define TRY_TO_MATCH_RULE_FROM_LIST_HELPER3
|
|
||||||
ifneq ($1,)
|
|
||||||
ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,$$(firstword $1)),true)
|
|
||||||
MATCHED_ITEM := $$(firstword $1)
|
|
||||||
else
|
|
||||||
$$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER3,$$(wordlist 2,9999,$1)))
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endef
|
|
||||||
|
|
||||||
# A recursive helper function for finding the longest match
|
|
||||||
# $1 The list to be checked
|
|
||||||
# It works by always removing the currently matched item from the list
|
|
||||||
define TRY_TO_MATCH_RULE_FROM_LIST_HELPER2
|
|
||||||
# Stop the recursion when the list is empty
|
|
||||||
ifneq ($1,)
|
|
||||||
RULE_BEFORE := $$(RULE)
|
|
||||||
$$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER3,$1))
|
|
||||||
# If a match is found in the current list, otherwise just return what we had before
|
|
||||||
ifeq ($$(RULE_FOUND),true)
|
|
||||||
# Save the best match so far and call itself recursively
|
|
||||||
BEST_MATCH := $$(MATCHED_ITEM)
|
|
||||||
BEST_MATCH_RULE := $$(RULE)
|
|
||||||
RULE_FOUND := false
|
|
||||||
RULE := $$(RULE_BEFORE)
|
|
||||||
$$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER2,$$(filter-out $$(MATCHED_ITEM),$1)))
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endef
|
|
||||||
|
|
||||||
|
|
||||||
# Recursively try to find the longest match for the start of the rule to be checked
|
|
||||||
# $1 The list to be checked
|
# $1 The list to be checked
|
||||||
# If a match is found, then RULE_FOUND is set to true
|
# If a match is found, then RULE_FOUND is set to true
|
||||||
# and MATCHED_ITEM to the item that was matched
|
# and MATCHED_ITEM to the item that was matched
|
||||||
define TRY_TO_MATCH_RULE_FROM_LIST_HELPER
|
define TRY_TO_MATCH_RULE_FROM_LIST_HELPER
|
||||||
BEST_MATCH :=
|
# Split on ":", padding with empty strings to avoid indexing issues
|
||||||
$$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER2,$1))
|
TOKEN1:=$$(shell python3 -c "import sys; print((sys.argv[1].split(':',1)+[''])[0])" $$(RULE))
|
||||||
ifneq ($$(BEST_MATCH),)
|
TOKENr:=$$(shell python3 -c "import sys; print((sys.argv[1].split(':',1)+[''])[1])" $$(RULE))
|
||||||
|
|
||||||
|
FOUNDx:=$$(shell echo $1 | tr " " "\n" | grep -Fx $$(TOKEN1))
|
||||||
|
ifneq ($$(FOUNDx),)
|
||||||
|
RULE := $$(TOKENr)
|
||||||
RULE_FOUND := true
|
RULE_FOUND := true
|
||||||
RULE := $$(BEST_MATCH_RULE)
|
MATCHED_ITEM := $$(TOKEN1)
|
||||||
MATCHED_ITEM := $$(BEST_MATCH)
|
|
||||||
else
|
else
|
||||||
RULE_FOUND := false
|
RULE_FOUND := false
|
||||||
MATCHED_ITEM :=
|
MATCHED_ITEM :=
|
||||||
@ -340,7 +275,7 @@ define PARSE_KEYMAP
|
|||||||
# Specify the variables that we are passing forward to submake
|
# Specify the variables that we are passing forward to submake
|
||||||
MAKE_VARS := KEYBOARD=$$(CURRENT_KB) KEYMAP=$$(CURRENT_KM) REQUIRE_PLATFORM_KEY=$$(REQUIRE_PLATFORM_KEY) QMK_BIN=$$(QMK_BIN)
|
MAKE_VARS := KEYBOARD=$$(CURRENT_KB) KEYMAP=$$(CURRENT_KM) REQUIRE_PLATFORM_KEY=$$(REQUIRE_PLATFORM_KEY) QMK_BIN=$$(QMK_BIN)
|
||||||
# And the first part of the make command
|
# And the first part of the make command
|
||||||
MAKE_CMD := $$(MAKE) -r -R -C $(ROOT_DIR) -f build_keyboard.mk $$(MAKE_TARGET)
|
MAKE_CMD := $$(MAKE) -r -R -C $(ROOT_DIR) -f $(BUILDDEFS_PATH)/build_keyboard.mk $$(MAKE_TARGET)
|
||||||
# The message to display
|
# The message to display
|
||||||
MAKE_MSG := $$(MSG_MAKE_KB)
|
MAKE_MSG := $$(MSG_MAKE_KB)
|
||||||
# We run the command differently, depending on if we want more output or not
|
# We run the command differently, depending on if we want more output or not
|
||||||
@ -382,12 +317,12 @@ define BUILD_TEST
|
|||||||
TEST_NAME := $$(notdir $$(TEST_PATH))
|
TEST_NAME := $$(notdir $$(TEST_PATH))
|
||||||
MAKE_TARGET := $2
|
MAKE_TARGET := $2
|
||||||
COMMAND := $1
|
COMMAND := $1
|
||||||
MAKE_CMD := $$(MAKE) -r -R -C $(ROOT_DIR) -f build_test.mk $$(MAKE_TARGET)
|
MAKE_CMD := $$(MAKE) -r -R -C $(ROOT_DIR) -f $(BUILDDEFS_PATH)/build_test.mk $$(MAKE_TARGET)
|
||||||
MAKE_VARS := TEST=$$(TEST_NAME) TEST_PATH=$$(TEST_PATH) FULL_TESTS="$$(FULL_TESTS)"
|
MAKE_VARS := TEST=$$(TEST_NAME) TEST_PATH=$$(TEST_PATH) FULL_TESTS="$$(FULL_TESTS)"
|
||||||
MAKE_MSG := $$(MSG_MAKE_TEST)
|
MAKE_MSG := $$(MSG_MAKE_TEST)
|
||||||
$$(eval $$(call BUILD))
|
$$(eval $$(call BUILD))
|
||||||
ifneq ($$(MAKE_TARGET),clean)
|
ifneq ($$(MAKE_TARGET),clean)
|
||||||
TEST_EXECUTABLE := $$(TEST_DIR)/$$(TEST_NAME).elf
|
TEST_EXECUTABLE := $$(TEST_OUTPUT_DIR)/$$(TEST_NAME).elf
|
||||||
TESTS += $$(TEST_NAME)
|
TESTS += $$(TEST_NAME)
|
||||||
TEST_MSG := $$(MSG_TEST)
|
TEST_MSG := $$(MSG_TEST)
|
||||||
$$(TEST_NAME)_COMMAND := \
|
$$(TEST_NAME)_COMMAND := \
|
||||||
@ -404,6 +339,7 @@ define PARSE_TEST
|
|||||||
TESTS :=
|
TESTS :=
|
||||||
TEST_NAME := $$(firstword $$(subst :, ,$$(RULE)))
|
TEST_NAME := $$(firstword $$(subst :, ,$$(RULE)))
|
||||||
TEST_TARGET := $$(subst $$(TEST_NAME),,$$(subst $$(TEST_NAME):,,$$(RULE)))
|
TEST_TARGET := $$(subst $$(TEST_NAME),,$$(subst $$(TEST_NAME):,,$$(RULE)))
|
||||||
|
include $(BUILDDEFS_PATH)/testlist.mk
|
||||||
ifeq ($$(TEST_NAME),all)
|
ifeq ($$(TEST_NAME),all)
|
||||||
MATCHED_TESTS := $$(TEST_LIST)
|
MATCHED_TESTS := $$(TEST_LIST)
|
||||||
else
|
else
|
||||||
@ -426,7 +362,6 @@ define SET_SILENT_MODE
|
|||||||
endif
|
endif
|
||||||
endef
|
endef
|
||||||
|
|
||||||
include paths.mk
|
|
||||||
include $(BUILDDEFS_PATH)/message.mk
|
include $(BUILDDEFS_PATH)/message.mk
|
||||||
|
|
||||||
ifeq ($(strip $(BREAK_ON_ERRORS)), yes)
|
ifeq ($(strip $(BREAK_ON_ERRORS)), yes)
|
||||||
@ -496,16 +431,22 @@ git-submodule:
|
|||||||
git submodule sync --recursive
|
git submodule sync --recursive
|
||||||
git submodule update --init --recursive --progress
|
git submodule update --init --recursive --progress
|
||||||
|
|
||||||
# Generate the version.h file
|
.PHONY: list-keyboards
|
||||||
ifdef SKIP_GIT
|
list-keyboards:
|
||||||
VERSION_H_FLAGS := --skip-git
|
util/list_keyboards.sh | sort -u | tr '\n' ' '
|
||||||
endif
|
|
||||||
ifdef SKIP_VERSION
|
|
||||||
VERSION_H_FLAGS := --skip-all
|
|
||||||
SKIP_GIT := yes
|
|
||||||
endif
|
|
||||||
|
|
||||||
$(shell $(QMK_BIN) generate-version-h $(VERSION_H_FLAGS) -q -o quantum/version.h)
|
.PHONY: generate-keyboards-file
|
||||||
$(shell python3 util/build_id.py >> $(ROOT_DIR)/quantum/version.h)
|
generate-keyboards-file:
|
||||||
|
util/list_keyboards.sh | sort -u
|
||||||
|
|
||||||
include $(ROOT_DIR)/testlist.mk
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
echo -n 'Deleting .build/ ... '
|
||||||
|
rm -rf $(BUILD_DIR)
|
||||||
|
echo 'done.'
|
||||||
|
|
||||||
|
.PHONY: distclean
|
||||||
|
distclean: clean
|
||||||
|
echo -n 'Deleting *.bin, *.hex, and *.uf2 ... '
|
||||||
|
rm -f *.bin *.hex *.uf2
|
||||||
|
echo 'done.'
|
||||||
|
46
book.json
46
book.json
@ -1,46 +0,0 @@
|
|||||||
{
|
|
||||||
"structure": {
|
|
||||||
"summary": "_summary.md"
|
|
||||||
},
|
|
||||||
"plugins" : [
|
|
||||||
"edit-link",
|
|
||||||
"forkmegithub",
|
|
||||||
"hints",
|
|
||||||
"page-toc",
|
|
||||||
"terminal",
|
|
||||||
"toolbar",
|
|
||||||
"bulk-redirect"
|
|
||||||
],
|
|
||||||
"pluginsConfig": {
|
|
||||||
"edit-link": {
|
|
||||||
"base": "https://github.com/qmk/qmk_firmware/edit/master/docs",
|
|
||||||
"label": "Suggest an edit"
|
|
||||||
},
|
|
||||||
"forkmegithub": {
|
|
||||||
"color": "red",
|
|
||||||
"url": "https://github.com/qmk/qmk_firmware"
|
|
||||||
},
|
|
||||||
"page-toc": {
|
|
||||||
"selector": ".markdown-section h1, .markdown-section h2"
|
|
||||||
},
|
|
||||||
"terminal": {
|
|
||||||
"copyButtons": true,
|
|
||||||
"fade": false,
|
|
||||||
"style": "flat"
|
|
||||||
},
|
|
||||||
"toolbar": {
|
|
||||||
"buttons": [
|
|
||||||
{
|
|
||||||
"label": "QMK Firmware",
|
|
||||||
"icon": "fa fa-github",
|
|
||||||
"url": "https://github.com/qmk/qmk_firmware"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"bulk-redirect": {
|
|
||||||
"basepath": "/",
|
|
||||||
"redirectsFile": "docs/redirects.json"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"root": "./docs/"
|
|
||||||
}
|
|
@ -30,6 +30,7 @@
|
|||||||
# bootloadhid HIDBootFlash compatible (ATmega32A)
|
# bootloadhid HIDBootFlash compatible (ATmega32A)
|
||||||
# usbasploader USBaspLoader (ATmega328P)
|
# usbasploader USBaspLoader (ATmega328P)
|
||||||
# ARM:
|
# ARM:
|
||||||
|
# halfkay PJRC Teensy
|
||||||
# kiibohd Input:Club Kiibohd bootloader (only used on their boards)
|
# kiibohd Input:Club Kiibohd bootloader (only used on their boards)
|
||||||
# stm32duino STM32Duino (STM32F103x8)
|
# stm32duino STM32Duino (STM32F103x8)
|
||||||
# stm32-dfu STM32 USB DFU in ROM
|
# stm32-dfu STM32 USB DFU in ROM
|
||||||
@ -37,12 +38,23 @@
|
|||||||
# RISC-V:
|
# RISC-V:
|
||||||
# gd32v-dfu GD32V USB DFU in ROM
|
# gd32v-dfu GD32V USB DFU in ROM
|
||||||
#
|
#
|
||||||
|
# If you need to provide your own implementation, you can set inside `rules.mk`
|
||||||
|
# `BOOTLOADER = custom` -- you'll need to provide your own implementations. See
|
||||||
|
# the respective file under `platforms/<PLATFORM>/bootloaders/custom.c` to see
|
||||||
|
# which functions may be overridden.
|
||||||
|
#
|
||||||
# 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
|
||||||
|
|
||||||
|
ifeq ($(strip $(BOOTLOADER)), custom)
|
||||||
|
OPT_DEFS += -DBOOTLOADER_CUSTOM
|
||||||
|
BOOTLOADER_TYPE = custom
|
||||||
|
endif
|
||||||
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
|
||||||
|
BOOTLOADER_TYPE = dfu
|
||||||
|
|
||||||
ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2 atmega16u4 atmega32u4 at90usb646 at90usb647))
|
ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2 atmega16u4 atmega32u4 at90usb646 at90usb647))
|
||||||
BOOTLOADER_SIZE = 4096
|
BOOTLOADER_SIZE = 4096
|
||||||
endif
|
endif
|
||||||
@ -53,6 +65,8 @@ 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
|
||||||
|
BOOTLOADER_TYPE = dfu
|
||||||
|
|
||||||
ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2 atmega16u4 atmega32u4 at90usb646 at90usb647))
|
ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2 atmega16u4 atmega32u4 at90usb646 at90usb647))
|
||||||
BOOTLOADER_SIZE ?= 4096
|
BOOTLOADER_SIZE ?= 4096
|
||||||
endif
|
endif
|
||||||
@ -63,6 +77,8 @@ 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
|
||||||
|
BOOTLOADER_TYPE = dfu
|
||||||
|
|
||||||
ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2 atmega16u4 atmega32u4 at90usb646 at90usb647))
|
ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2 atmega16u4 atmega32u4 at90usb646 at90usb647))
|
||||||
BOOTLOADER_SIZE ?= 4096
|
BOOTLOADER_SIZE ?= 4096
|
||||||
endif
|
endif
|
||||||
@ -73,10 +89,14 @@ endif
|
|||||||
ifeq ($(strip $(BOOTLOADER)), qmk-hid)
|
ifeq ($(strip $(BOOTLOADER)), qmk-hid)
|
||||||
OPT_DEFS += -DBOOTLOADER_QMK_HID
|
OPT_DEFS += -DBOOTLOADER_QMK_HID
|
||||||
OPT_DEFS += -DBOOTLOADER_HID
|
OPT_DEFS += -DBOOTLOADER_HID
|
||||||
|
BOOTLOADER_TYPE = dfu
|
||||||
|
|
||||||
BOOTLOADER_SIZE ?= 4096
|
BOOTLOADER_SIZE ?= 4096
|
||||||
endif
|
endif
|
||||||
ifeq ($(strip $(BOOTLOADER)), halfkay)
|
ifeq ($(strip $(BOOTLOADER)), halfkay)
|
||||||
OPT_DEFS += -DBOOTLOADER_HALFKAY
|
OPT_DEFS += -DBOOTLOADER_HALFKAY
|
||||||
|
BOOTLOADER_TYPE = halfkay
|
||||||
|
|
||||||
ifeq ($(strip $(MCU)), atmega32u4)
|
ifeq ($(strip $(MCU)), atmega32u4)
|
||||||
BOOTLOADER_SIZE = 512
|
BOOTLOADER_SIZE = 512
|
||||||
endif
|
endif
|
||||||
@ -86,18 +106,26 @@ ifeq ($(strip $(BOOTLOADER)), halfkay)
|
|||||||
endif
|
endif
|
||||||
ifeq ($(strip $(BOOTLOADER)), caterina)
|
ifeq ($(strip $(BOOTLOADER)), caterina)
|
||||||
OPT_DEFS += -DBOOTLOADER_CATERINA
|
OPT_DEFS += -DBOOTLOADER_CATERINA
|
||||||
|
BOOTLOADER_TYPE = caterina
|
||||||
|
|
||||||
BOOTLOADER_SIZE = 4096
|
BOOTLOADER_SIZE = 4096
|
||||||
endif
|
endif
|
||||||
ifneq (,$(filter $(BOOTLOADER), bootloadhid bootloadHID))
|
ifneq (,$(filter $(BOOTLOADER), bootloadhid bootloadHID))
|
||||||
OPT_DEFS += -DBOOTLOADER_BOOTLOADHID
|
OPT_DEFS += -DBOOTLOADER_BOOTLOADHID
|
||||||
|
BOOTLOADER_TYPE = bootloadhid
|
||||||
|
|
||||||
BOOTLOADER_SIZE = 4096
|
BOOTLOADER_SIZE = 4096
|
||||||
endif
|
endif
|
||||||
ifneq (,$(filter $(BOOTLOADER), usbasploader USBasp))
|
ifneq (,$(filter $(BOOTLOADER), usbasploader USBasp))
|
||||||
OPT_DEFS += -DBOOTLOADER_USBASP
|
OPT_DEFS += -DBOOTLOADER_USBASP
|
||||||
|
BOOTLOADER_TYPE = usbasploader
|
||||||
|
|
||||||
BOOTLOADER_SIZE = 4096
|
BOOTLOADER_SIZE = 4096
|
||||||
endif
|
endif
|
||||||
ifeq ($(strip $(BOOTLOADER)), lufa-ms)
|
ifeq ($(strip $(BOOTLOADER)), lufa-ms)
|
||||||
OPT_DEFS += -DBOOTLOADER_MS
|
OPT_DEFS += -DBOOTLOADER_MS
|
||||||
|
BOOTLOADER_TYPE = dfu
|
||||||
|
|
||||||
BOOTLOADER_SIZE ?= 8192
|
BOOTLOADER_SIZE ?= 8192
|
||||||
FIRMWARE_FORMAT = bin
|
FIRMWARE_FORMAT = bin
|
||||||
cpfirmware: lufa_warning
|
cpfirmware: lufa_warning
|
||||||
@ -115,6 +143,7 @@ endif
|
|||||||
|
|
||||||
ifeq ($(strip $(BOOTLOADER)), stm32-dfu)
|
ifeq ($(strip $(BOOTLOADER)), stm32-dfu)
|
||||||
OPT_DEFS += -DBOOTLOADER_STM32_DFU
|
OPT_DEFS += -DBOOTLOADER_STM32_DFU
|
||||||
|
BOOTLOADER_TYPE = stm32_dfu
|
||||||
|
|
||||||
# Options to pass to dfu-util when flashing
|
# Options to pass to dfu-util when flashing
|
||||||
DFU_ARGS ?= -d 0483:DF11 -a 0 -s 0x08000000:leave
|
DFU_ARGS ?= -d 0483:DF11 -a 0 -s 0x08000000:leave
|
||||||
@ -122,6 +151,7 @@ ifeq ($(strip $(BOOTLOADER)), stm32-dfu)
|
|||||||
endif
|
endif
|
||||||
ifeq ($(strip $(BOOTLOADER)), apm32-dfu)
|
ifeq ($(strip $(BOOTLOADER)), apm32-dfu)
|
||||||
OPT_DEFS += -DBOOTLOADER_APM32_DFU
|
OPT_DEFS += -DBOOTLOADER_APM32_DFU
|
||||||
|
BOOTLOADER_TYPE = stm32_dfu
|
||||||
|
|
||||||
# Options to pass to dfu-util when flashing
|
# Options to pass to dfu-util when flashing
|
||||||
DFU_ARGS ?= -d 314B:0106 -a 0 -s 0x08000000:leave
|
DFU_ARGS ?= -d 314B:0106 -a 0 -s 0x08000000:leave
|
||||||
@ -129,6 +159,7 @@ ifeq ($(strip $(BOOTLOADER)), apm32-dfu)
|
|||||||
endif
|
endif
|
||||||
ifeq ($(strip $(BOOTLOADER)), gd32v-dfu)
|
ifeq ($(strip $(BOOTLOADER)), gd32v-dfu)
|
||||||
OPT_DEFS += -DBOOTLOADER_GD32V_DFU
|
OPT_DEFS += -DBOOTLOADER_GD32V_DFU
|
||||||
|
BOOTLOADER_TYPE = gd32v_dfu
|
||||||
|
|
||||||
# Options to pass to dfu-util when flashing
|
# Options to pass to dfu-util when flashing
|
||||||
DFU_ARGS ?= -d 28E9:0189 -a 0 -s 0x08000000:leave
|
DFU_ARGS ?= -d 28E9:0189 -a 0 -s 0x08000000:leave
|
||||||
@ -136,6 +167,8 @@ ifeq ($(strip $(BOOTLOADER)), gd32v-dfu)
|
|||||||
endif
|
endif
|
||||||
ifeq ($(strip $(BOOTLOADER)), kiibohd)
|
ifeq ($(strip $(BOOTLOADER)), kiibohd)
|
||||||
OPT_DEFS += -DBOOTLOADER_KIIBOHD
|
OPT_DEFS += -DBOOTLOADER_KIIBOHD
|
||||||
|
BOOTLOADER_TYPE = kiibohd
|
||||||
|
|
||||||
ifeq ($(strip $(MCU_ORIG)), MK20DX128)
|
ifeq ($(strip $(MCU_ORIG)), MK20DX128)
|
||||||
MCU_LDSCRIPT = MK20DX128BLDR4
|
MCU_LDSCRIPT = MK20DX128BLDR4
|
||||||
endif
|
endif
|
||||||
@ -151,8 +184,7 @@ ifeq ($(strip $(BOOTLOADER)), stm32duino)
|
|||||||
OPT_DEFS += -DBOOTLOADER_STM32DUINO
|
OPT_DEFS += -DBOOTLOADER_STM32DUINO
|
||||||
MCU_LDSCRIPT = STM32F103x8_stm32duino_bootloader
|
MCU_LDSCRIPT = STM32F103x8_stm32duino_bootloader
|
||||||
BOARD = STM32_F103_STM32DUINO
|
BOARD = STM32_F103_STM32DUINO
|
||||||
# STM32F103 does NOT have an USB bootloader in ROM (only serial), so setting anything here does not make much sense
|
BOOTLOADER_TYPE = stm32duino
|
||||||
STM32_BOOTLOADER_ADDRESS = 0x80000000
|
|
||||||
|
|
||||||
# Options to pass to dfu-util when flashing
|
# Options to pass to dfu-util when flashing
|
||||||
DFU_ARGS = -d 1EAF:0003 -a 2 -R
|
DFU_ARGS = -d 1EAF:0003 -a 2 -R
|
||||||
@ -162,6 +194,8 @@ ifeq ($(strip $(BOOTLOADER)), vibl)
|
|||||||
MCU_LDSCRIPT = STM32_F103_vibl
|
MCU_LDSCRIPT = STM32_F103_vibl
|
||||||
BOARD = STM32_F103_vibl
|
BOARD = STM32_F103_vibl
|
||||||
PROGRAM_CMD = echo 'CLI flashing not supported' >&2
|
PROGRAM_CMD = echo 'CLI flashing not supported' >&2
|
||||||
|
OPT_DEFS += -DBOOTLOADER_VIBL
|
||||||
|
BOOTLOADER_TYPE = vibl
|
||||||
|
|
||||||
DFU_ARGS =
|
DFU_ARGS =
|
||||||
DFU_SUFFIX_ARGS =
|
DFU_SUFFIX_ARGS =
|
||||||
@ -169,4 +203,17 @@ ifeq ($(strip $(BOOTLOADER)), vibl)
|
|||||||
endif
|
endif
|
||||||
ifeq ($(strip $(BOOTLOADER)), tinyuf2)
|
ifeq ($(strip $(BOOTLOADER)), tinyuf2)
|
||||||
OPT_DEFS += -DBOOTLOADER_TINYUF2
|
OPT_DEFS += -DBOOTLOADER_TINYUF2
|
||||||
|
BOOTLOADER_TYPE = tinyuf2
|
||||||
|
endif
|
||||||
|
ifeq ($(strip $(BOOTLOADER)), halfkay)
|
||||||
|
OPT_DEFS += -DBOOTLOADER_HALFKAY
|
||||||
|
BOOTLOADER_TYPE = halfkay
|
||||||
|
endif
|
||||||
|
ifeq ($(strip $(BOOTLOADER)), md-boot)
|
||||||
|
OPT_DEFS += -DBOOTLOADER_MD_BOOT
|
||||||
|
BOOTLOADER_TYPE = md_boot
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(BOOTLOADER_TYPE)),)
|
||||||
|
$(call CATASTROPHIC_ERROR,Invalid BOOTLOADER,No bootloader specified. Please set an appropriate 'BOOTLOADER' in your keyboard's 'rules.mk' file.)
|
||||||
endif
|
endif
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
$(TEST)_INC := \
|
$(TEST)_INC := \
|
||||||
tests\test_common\common_config.h
|
tests/test_common/common_config.h
|
||||||
|
|
||||||
$(TEST)_SRC := \
|
$(TEST)_SRC := \
|
||||||
$(TMK_COMMON_SRC) \
|
$(TMK_COMMON_SRC) \
|
@ -37,6 +37,18 @@ ifdef SKIP_VERSION
|
|||||||
OPT_DEFS += -DSKIP_VERSION
|
OPT_DEFS += -DSKIP_VERSION
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# Generate the version.h file
|
||||||
|
ifdef SKIP_VERSION
|
||||||
|
VERSION_H_FLAGS := --skip-all
|
||||||
|
endif
|
||||||
|
ifdef SKIP_GIT
|
||||||
|
VERSION_H_FLAGS := --skip-git
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Generate the board's version.h file.
|
||||||
|
$(shell $(QMK_BIN) generate-version-h $(VERSION_H_FLAGS) -q -o $(KEYMAP_OUTPUT)/src/version.h)
|
||||||
|
$(shell python3 util/build_id.py >> $(KEYMAP_OUTPUT)/src/version.h)
|
||||||
|
|
||||||
# Determine which subfolders exist.
|
# Determine which subfolders exist.
|
||||||
KEYBOARD_FOLDER_PATH_1 := $(KEYBOARD)
|
KEYBOARD_FOLDER_PATH_1 := $(KEYBOARD)
|
||||||
KEYBOARD_FOLDER_PATH_2 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_1)))
|
KEYBOARD_FOLDER_PATH_2 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_1)))
|
||||||
@ -100,7 +112,7 @@ INFO_RULES_MK = $(shell $(QMK_BIN) generate-rules-mk --quiet --escape --keyboard
|
|||||||
include $(INFO_RULES_MK)
|
include $(INFO_RULES_MK)
|
||||||
|
|
||||||
# Check for keymap.json first, so we can regenerate keymap.c
|
# Check for keymap.json first, so we can regenerate keymap.c
|
||||||
include build_json.mk
|
include $(BUILDDEFS_PATH)/build_json.mk
|
||||||
|
|
||||||
# Pull in keymap level rules.mk
|
# Pull in keymap level rules.mk
|
||||||
ifeq ("$(wildcard $(KEYMAP_PATH))", "")
|
ifeq ("$(wildcard $(KEYMAP_PATH))", "")
|
||||||
@ -127,9 +139,9 @@ ifeq ("$(wildcard $(KEYMAP_PATH))", "")
|
|||||||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_1)
|
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_1)
|
||||||
else ifneq ($(LAYOUTS),)
|
else ifneq ($(LAYOUTS),)
|
||||||
# If we haven't found a keymap yet fall back to community layouts
|
# If we haven't found a keymap yet fall back to community layouts
|
||||||
include build_layout.mk
|
include $(BUILDDEFS_PATH)/build_layout.mk
|
||||||
else
|
else
|
||||||
$(error Could not find keymap)
|
$(call CATASTROPHIC_ERROR,Invalid keymap,Could not find keymap)
|
||||||
# this state should never be reached
|
# this state should never be reached
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
@ -384,8 +396,10 @@ VPATH += $(KEYMAP_PATH)
|
|||||||
VPATH += $(USER_PATH)
|
VPATH += $(USER_PATH)
|
||||||
VPATH += $(KEYBOARD_PATHS)
|
VPATH += $(KEYBOARD_PATHS)
|
||||||
VPATH += $(COMMON_VPATH)
|
VPATH += $(COMMON_VPATH)
|
||||||
|
VPATH += $(KEYBOARD_OUTPUT)/src
|
||||||
|
VPATH += $(KEYMAP_OUTPUT)/src
|
||||||
|
|
||||||
include common_features.mk
|
include $(BUILDDEFS_PATH)/common_features.mk
|
||||||
include $(BUILDDEFS_PATH)/generic_features.mk
|
include $(BUILDDEFS_PATH)/generic_features.mk
|
||||||
include $(TMK_PATH)/protocol.mk
|
include $(TMK_PATH)/protocol.mk
|
||||||
include $(PLATFORM_PATH)/common.mk
|
include $(PLATFORM_PATH)/common.mk
|
||||||
@ -425,8 +439,7 @@ OUTPUTS := $(KEYMAP_OUTPUT) $(KEYBOARD_OUTPUT)
|
|||||||
$(KEYMAP_OUTPUT)_SRC := $(SRC)
|
$(KEYMAP_OUTPUT)_SRC := $(SRC)
|
||||||
$(KEYMAP_OUTPUT)_DEFS := $(OPT_DEFS) \
|
$(KEYMAP_OUTPUT)_DEFS := $(OPT_DEFS) \
|
||||||
-DQMK_KEYBOARD=\"$(KEYBOARD)\" -DQMK_KEYBOARD_H=\"$(QMK_KEYBOARD_H)\" \
|
-DQMK_KEYBOARD=\"$(KEYBOARD)\" -DQMK_KEYBOARD_H=\"$(QMK_KEYBOARD_H)\" \
|
||||||
-DQMK_KEYMAP=\"$(KEYMAP)\" -DQMK_KEYMAP_H=\"$(KEYMAP).h\" -DQMK_KEYMAP_CONFIG_H=\"$(KEYMAP_PATH)/config.h\" \
|
-DQMK_KEYMAP=\"$(KEYMAP)\" -DQMK_KEYMAP_H=\"$(KEYMAP).h\" -DQMK_KEYMAP_CONFIG_H=\"$(KEYMAP_PATH)/config.h\"
|
||||||
-DQMK_SUBPROJECT -DQMK_SUBPROJECT_H -DQMK_SUBPROJECT_CONFIG_H
|
|
||||||
$(KEYMAP_OUTPUT)_INC := $(VPATH) $(EXTRAINCDIRS)
|
$(KEYMAP_OUTPUT)_INC := $(VPATH) $(EXTRAINCDIRS)
|
||||||
$(KEYMAP_OUTPUT)_CONFIG := $(CONFIG_H)
|
$(KEYMAP_OUTPUT)_CONFIG := $(CONFIG_H)
|
||||||
$(KEYBOARD_OUTPUT)_SRC := $(PLATFORM_SRC)
|
$(KEYBOARD_OUTPUT)_SRC := $(PLATFORM_SRC)
|
||||||
@ -448,7 +461,7 @@ check-md5: build
|
|||||||
objs-size: build
|
objs-size: build
|
||||||
|
|
||||||
include $(BUILDDEFS_PATH)/show_options.mk
|
include $(BUILDDEFS_PATH)/show_options.mk
|
||||||
include $(TMK_PATH)/rules.mk
|
include $(BUILDDEFS_PATH)/common_rules.mk
|
||||||
|
|
||||||
# Ensure we have generated files available for each of the objects
|
# Ensure we have generated files available for each of the objects
|
||||||
define GEN_FILES
|
define GEN_FILES
|
@ -25,7 +25,7 @@ ifneq ($(FORCE_LAYOUT),)
|
|||||||
$(info Forcing layout: $(FORCE_LAYOUT))
|
$(info Forcing layout: $(FORCE_LAYOUT))
|
||||||
LAYOUTS := $(FORCE_LAYOUT)
|
LAYOUTS := $(FORCE_LAYOUT)
|
||||||
else
|
else
|
||||||
$(error Forced layout does not exist)
|
$(call CATASTROPHIC_ERROR,Invalid layout,Forced layout does not exist)
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
@ -43,6 +43,7 @@ all: elf
|
|||||||
VPATH += $(COMMON_VPATH)
|
VPATH += $(COMMON_VPATH)
|
||||||
PLATFORM:=TEST
|
PLATFORM:=TEST
|
||||||
PLATFORM_KEY:=test
|
PLATFORM_KEY:=test
|
||||||
|
BOOTLOADER_TYPE:=none
|
||||||
|
|
||||||
ifeq ($(strip $(DEBUG)), 1)
|
ifeq ($(strip $(DEBUG)), 1)
|
||||||
CONSOLE_ENABLE = yes
|
CONSOLE_ENABLE = yes
|
||||||
@ -53,7 +54,7 @@ include tests/test_common/build.mk
|
|||||||
include $(TEST_PATH)/test.mk
|
include $(TEST_PATH)/test.mk
|
||||||
endif
|
endif
|
||||||
|
|
||||||
include common_features.mk
|
include $(BUILDDEFS_PATH)/common_features.mk
|
||||||
include $(BUILDDEFS_PATH)/generic_features.mk
|
include $(BUILDDEFS_PATH)/generic_features.mk
|
||||||
include $(PLATFORM_PATH)/common.mk
|
include $(PLATFORM_PATH)/common.mk
|
||||||
include $(TMK_PATH)/protocol.mk
|
include $(TMK_PATH)/protocol.mk
|
||||||
@ -62,7 +63,7 @@ include $(QUANTUM_PATH)/encoder/tests/rules.mk
|
|||||||
include $(QUANTUM_PATH)/sequencer/tests/rules.mk
|
include $(QUANTUM_PATH)/sequencer/tests/rules.mk
|
||||||
include $(PLATFORM_PATH)/test/rules.mk
|
include $(PLATFORM_PATH)/test/rules.mk
|
||||||
ifneq ($(filter $(FULL_TESTS),$(TEST)),)
|
ifneq ($(filter $(FULL_TESTS),$(TEST)),)
|
||||||
include build_full_test.mk
|
include $(BUILDDEFS_PATH)/build_full_test.mk
|
||||||
endif
|
endif
|
||||||
|
|
||||||
$(TEST)_SRC += \
|
$(TEST)_SRC += \
|
||||||
@ -76,7 +77,7 @@ $(TEST_OBJ)/$(TEST)_DEFS := $($(TEST)_DEFS)
|
|||||||
$(TEST_OBJ)/$(TEST)_CONFIG := $($(TEST)_CONFIG)
|
$(TEST_OBJ)/$(TEST)_CONFIG := $($(TEST)_CONFIG)
|
||||||
|
|
||||||
include $(PLATFORM_PATH)/$(PLATFORM_KEY)/platform.mk
|
include $(PLATFORM_PATH)/$(PLATFORM_KEY)/platform.mk
|
||||||
include $(TMK_PATH)/rules.mk
|
include $(BUILDDEFS_PATH)/common_rules.mk
|
||||||
|
|
||||||
|
|
||||||
$(shell mkdir -p $(BUILD_DIR)/test 2>/dev/null)
|
$(shell mkdir -p $(BUILD_DIR)/test 2>/dev/null)
|
@ -20,7 +20,6 @@ QUANTUM_SRC += \
|
|||||||
$(QUANTUM_DIR)/led.c \
|
$(QUANTUM_DIR)/led.c \
|
||||||
$(QUANTUM_DIR)/action.c \
|
$(QUANTUM_DIR)/action.c \
|
||||||
$(QUANTUM_DIR)/action_layer.c \
|
$(QUANTUM_DIR)/action_layer.c \
|
||||||
$(QUANTUM_DIR)/action_macro.c \
|
|
||||||
$(QUANTUM_DIR)/action_tapping.c \
|
$(QUANTUM_DIR)/action_tapping.c \
|
||||||
$(QUANTUM_DIR)/action_util.c \
|
$(QUANTUM_DIR)/action_util.c \
|
||||||
$(QUANTUM_DIR)/eeconfig.c \
|
$(QUANTUM_DIR)/eeconfig.c \
|
||||||
@ -109,11 +108,10 @@ ifeq ($(strip $(MOUSEKEY_ENABLE)), yes)
|
|||||||
SRC += $(QUANTUM_DIR)/mousekey.c
|
SRC += $(QUANTUM_DIR)/mousekey.c
|
||||||
endif
|
endif
|
||||||
|
|
||||||
VALID_POINTING_DEVICE_DRIVER_TYPES := adns5050 adns9800 analog_joystick cirque_pinnacle_i2c cirque_pinnacle_spi pmw3360 pimoroni_trackball custom
|
VALID_POINTING_DEVICE_DRIVER_TYPES := adns5050 adns9800 analog_joystick cirque_pinnacle_i2c cirque_pinnacle_spi pmw3360 pmw3389 pimoroni_trackball custom
|
||||||
POINTING_DEVICE_DRIVER ?= custom
|
|
||||||
ifeq ($(strip $(POINTING_DEVICE_ENABLE)), yes)
|
ifeq ($(strip $(POINTING_DEVICE_ENABLE)), yes)
|
||||||
ifeq ($(filter $(POINTING_DEVICE_DRIVER),$(VALID_POINTING_DEVICE_DRIVER_TYPES)),)
|
ifeq ($(filter $(POINTING_DEVICE_DRIVER),$(VALID_POINTING_DEVICE_DRIVER_TYPES)),)
|
||||||
$(error POINTING_DEVICE_DRIVER="$(POINTING_DEVICE_DRIVER)" is not a valid pointing device type)
|
$(call CATASTROPHIC_ERROR,Invalid POINTING_DEVICE_DRIVER,POINTING_DEVICE_DRIVER="$(POINTING_DEVICE_DRIVER)" is not a valid pointing device type)
|
||||||
else
|
else
|
||||||
OPT_DEFS += -DPOINTING_DEVICE_ENABLE
|
OPT_DEFS += -DPOINTING_DEVICE_ENABLE
|
||||||
MOUSE_ENABLE := yes
|
MOUSE_ENABLE := yes
|
||||||
@ -144,6 +142,9 @@ ifeq ($(strip $(POINTING_DEVICE_ENABLE)), yes)
|
|||||||
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), pmw3360)
|
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), pmw3360)
|
||||||
OPT_DEFS += -DSTM32_SPI -DHAL_USE_SPI=TRUE
|
OPT_DEFS += -DSTM32_SPI -DHAL_USE_SPI=TRUE
|
||||||
QUANTUM_LIB_SRC += spi_master.c
|
QUANTUM_LIB_SRC += spi_master.c
|
||||||
|
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), pmw3389)
|
||||||
|
OPT_DEFS += -DSTM32_SPI -DHAL_USE_SPI=TRUE
|
||||||
|
QUANTUM_LIB_SRC += spi_master.c
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
@ -151,57 +152,88 @@ endif
|
|||||||
VALID_EEPROM_DRIVER_TYPES := vendor custom transient i2c spi
|
VALID_EEPROM_DRIVER_TYPES := vendor custom transient i2c spi
|
||||||
EEPROM_DRIVER ?= vendor
|
EEPROM_DRIVER ?= vendor
|
||||||
ifeq ($(filter $(EEPROM_DRIVER),$(VALID_EEPROM_DRIVER_TYPES)),)
|
ifeq ($(filter $(EEPROM_DRIVER),$(VALID_EEPROM_DRIVER_TYPES)),)
|
||||||
$(error EEPROM_DRIVER="$(EEPROM_DRIVER)" is not a valid EEPROM driver)
|
$(call CATASTROPHIC_ERROR,Invalid EEPROM_DRIVER,EEPROM_DRIVER="$(EEPROM_DRIVER)" is not a valid EEPROM driver)
|
||||||
else
|
else
|
||||||
OPT_DEFS += -DEEPROM_ENABLE
|
OPT_DEFS += -DEEPROM_ENABLE
|
||||||
ifeq ($(strip $(EEPROM_DRIVER)), custom)
|
ifeq ($(strip $(EEPROM_DRIVER)), custom)
|
||||||
|
# Custom EEPROM implementation -- only needs to implement init/erase/read_block/write_block
|
||||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_CUSTOM
|
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_CUSTOM
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/eeprom
|
COMMON_VPATH += $(DRIVER_PATH)/eeprom
|
||||||
SRC += eeprom_driver.c
|
SRC += eeprom_driver.c
|
||||||
else ifeq ($(strip $(EEPROM_DRIVER)), i2c)
|
else ifeq ($(strip $(EEPROM_DRIVER)), i2c)
|
||||||
|
# External I2C EEPROM implementation
|
||||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_I2C
|
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_I2C
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/eeprom
|
COMMON_VPATH += $(DRIVER_PATH)/eeprom
|
||||||
QUANTUM_LIB_SRC += i2c_master.c
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
SRC += eeprom_driver.c eeprom_i2c.c
|
SRC += eeprom_driver.c eeprom_i2c.c
|
||||||
else ifeq ($(strip $(EEPROM_DRIVER)), spi)
|
else ifeq ($(strip $(EEPROM_DRIVER)), spi)
|
||||||
|
# External SPI EEPROM implementation
|
||||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_SPI
|
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_SPI
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/eeprom
|
COMMON_VPATH += $(DRIVER_PATH)/eeprom
|
||||||
QUANTUM_LIB_SRC += spi_master.c
|
QUANTUM_LIB_SRC += spi_master.c
|
||||||
SRC += eeprom_driver.c eeprom_spi.c
|
SRC += eeprom_driver.c eeprom_spi.c
|
||||||
else ifeq ($(strip $(EEPROM_DRIVER)), transient)
|
else ifeq ($(strip $(EEPROM_DRIVER)), transient)
|
||||||
|
# Transient EEPROM implementation -- no data storage but provides runtime area for it
|
||||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT
|
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/eeprom
|
COMMON_VPATH += $(DRIVER_PATH)/eeprom
|
||||||
SRC += eeprom_driver.c eeprom_transient.c
|
SRC += eeprom_driver.c eeprom_transient.c
|
||||||
else ifeq ($(strip $(EEPROM_DRIVER)), vendor)
|
else ifeq ($(strip $(EEPROM_DRIVER)), vendor)
|
||||||
|
# Vendor-implemented EEPROM
|
||||||
OPT_DEFS += -DEEPROM_VENDOR
|
OPT_DEFS += -DEEPROM_VENDOR
|
||||||
ifeq ($(PLATFORM),AVR)
|
ifeq ($(PLATFORM),AVR)
|
||||||
# Automatically provided by avr-libc, nothing required
|
# Automatically provided by avr-libc, nothing required
|
||||||
else ifeq ($(PLATFORM),CHIBIOS)
|
else ifeq ($(PLATFORM),CHIBIOS)
|
||||||
ifneq ($(filter STM32F3xx_% STM32F1xx_% %_STM32F401xC %_STM32F401xE %_STM32F405xG %_STM32F411xE %_STM32F072xB %_STM32F042x6 %_GD32VF103xB %_GD32VF103x8, $(MCU_SERIES)_$(MCU_LDSCRIPT)),)
|
ifneq ($(filter STM32F3xx_% STM32F1xx_% %_STM32F401xC %_STM32F401xE %_STM32F405xG %_STM32F411xE %_STM32F072xB %_STM32F042x6 %_GD32VF103xB %_GD32VF103x8, $(MCU_SERIES)_$(MCU_LDSCRIPT)),)
|
||||||
OPT_DEFS += -DEEPROM_DRIVER
|
# Emulated EEPROM
|
||||||
OPT_DEFS += -DSTM32_EEPROM_ENABLE
|
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_STM32_FLASH_EMULATED
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/eeprom
|
COMMON_VPATH += $(DRIVER_PATH)/eeprom
|
||||||
SRC += eeprom_driver.c
|
SRC += eeprom_driver.c
|
||||||
SRC += $(PLATFORM_COMMON_DIR)/eeprom_stm32.c
|
SRC += $(PLATFORM_COMMON_DIR)/eeprom_stm32.c
|
||||||
SRC += $(PLATFORM_COMMON_DIR)/flash_stm32.c
|
SRC += $(PLATFORM_COMMON_DIR)/flash_stm32.c
|
||||||
else ifneq ($(filter $(MCU_SERIES),STM32L0xx STM32L1xx),)
|
else ifneq ($(filter $(MCU_SERIES),STM32L0xx STM32L1xx),)
|
||||||
OPT_DEFS += -DEEPROM_DRIVER
|
# True EEPROM on STM32L0xx, L1xx
|
||||||
|
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_STM32_L0_L1
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/eeprom
|
COMMON_VPATH += $(DRIVER_PATH)/eeprom
|
||||||
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/eeprom
|
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/eeprom
|
||||||
SRC += eeprom_driver.c
|
SRC += eeprom_driver.c
|
||||||
SRC += eeprom_stm32_L0_L1.c
|
SRC += eeprom_stm32_L0_L1.c
|
||||||
|
else ifneq ($(filter $(MCU_SERIES),KL2x K20x),)
|
||||||
|
# Teensy EEPROM implementations
|
||||||
|
OPT_DEFS += -DEEPROM_TEENSY
|
||||||
|
SRC += eeprom_teensy.c
|
||||||
else
|
else
|
||||||
# This will effectively work the same as "transient" if not supported by the chip
|
# Fall back to transient, i.e. non-persistent
|
||||||
SRC += $(PLATFORM_COMMON_DIR)/eeprom_teensy.c
|
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/eeprom
|
||||||
|
SRC += eeprom_driver.c eeprom_transient.c
|
||||||
endif
|
endif
|
||||||
else ifeq ($(PLATFORM),ARM_ATSAM)
|
else ifeq ($(PLATFORM),ARM_ATSAM)
|
||||||
SRC += $(PLATFORM_COMMON_DIR)/eeprom.c
|
# arm_atsam EEPROM
|
||||||
|
OPT_DEFS += -DEEPROM_SAMD
|
||||||
|
SRC += $(PLATFORM_COMMON_DIR)/eeprom_samd.c
|
||||||
else ifeq ($(PLATFORM),TEST)
|
else ifeq ($(PLATFORM),TEST)
|
||||||
|
# Test harness "EEPROM"
|
||||||
|
OPT_DEFS += -DEEPROM_TEST_HARNESS
|
||||||
SRC += $(PLATFORM_COMMON_DIR)/eeprom.c
|
SRC += $(PLATFORM_COMMON_DIR)/eeprom.c
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
VALID_FLASH_DRIVER_TYPES := spi
|
||||||
|
FLASH_DRIVER ?= no
|
||||||
|
ifneq ($(strip $(FLASH_DRIVER)), no)
|
||||||
|
ifeq ($(filter $(FLASH_DRIVER),$(VALID_FLASH_DRIVER_TYPES)),)
|
||||||
|
$(error FLASH_DRIVER="$(FLASH_DRIVER)" is not a valid FLASH driver)
|
||||||
|
else
|
||||||
|
OPT_DEFS += -DFLASH_ENABLE
|
||||||
|
ifeq ($(strip $(FLASH_DRIVER)), spi)
|
||||||
|
OPT_DEFS += -DFLASH_DRIVER -DFLASH_SPI
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/flash
|
||||||
|
SRC += flash_spi.c
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
RGBLIGHT_ENABLE ?= no
|
RGBLIGHT_ENABLE ?= no
|
||||||
VALID_RGBLIGHT_TYPES := WS2812 APA102 custom
|
VALID_RGBLIGHT_TYPES := WS2812 APA102 custom
|
||||||
|
|
||||||
@ -213,7 +245,7 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
|
|||||||
RGBLIGHT_DRIVER ?= WS2812
|
RGBLIGHT_DRIVER ?= WS2812
|
||||||
|
|
||||||
ifeq ($(filter $(RGBLIGHT_DRIVER),$(VALID_RGBLIGHT_TYPES)),)
|
ifeq ($(filter $(RGBLIGHT_DRIVER),$(VALID_RGBLIGHT_TYPES)),)
|
||||||
$(error RGBLIGHT_DRIVER="$(RGBLIGHT_DRIVER)" is not a valid RGB type)
|
$(call CATASTROPHIC_ERROR,Invalid RGBLIGHT_DRIVER,RGBLIGHT_DRIVER="$(RGBLIGHT_DRIVER)" is not a valid RGB type)
|
||||||
else
|
else
|
||||||
COMMON_VPATH += $(QUANTUM_DIR)/rgblight
|
COMMON_VPATH += $(QUANTUM_DIR)/rgblight
|
||||||
POST_CONFIG_H += $(QUANTUM_DIR)/rgblight/rgblight_post_config.h
|
POST_CONFIG_H += $(QUANTUM_DIR)/rgblight/rgblight_post_config.h
|
||||||
@ -238,12 +270,12 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
LED_MATRIX_ENABLE ?= no
|
LED_MATRIX_ENABLE ?= no
|
||||||
VALID_LED_MATRIX_TYPES := IS31FL3731 custom
|
VALID_LED_MATRIX_TYPES := IS31FL3731 IS31FL3742A IS31FL3743A IS31FL3745 IS31FL3746A custom
|
||||||
# TODO: IS31FL3733 IS31FL3737 IS31FL3741
|
# TODO: IS31FL3733 IS31FL3737 IS31FL3741
|
||||||
|
|
||||||
ifeq ($(strip $(LED_MATRIX_ENABLE)), yes)
|
ifeq ($(strip $(LED_MATRIX_ENABLE)), yes)
|
||||||
ifeq ($(filter $(LED_MATRIX_DRIVER),$(VALID_LED_MATRIX_TYPES)),)
|
ifeq ($(filter $(LED_MATRIX_DRIVER),$(VALID_LED_MATRIX_TYPES)),)
|
||||||
$(error "$(LED_MATRIX_DRIVER)" is not a valid matrix type)
|
$(call CATASTROPHIC_ERROR,Invalid LED_MATRIX_DRIVER,LED_MATRIX_DRIVER="$(LED_MATRIX_DRIVER)" is not a valid matrix type)
|
||||||
endif
|
endif
|
||||||
OPT_DEFS += -DLED_MATRIX_ENABLE
|
OPT_DEFS += -DLED_MATRIX_ENABLE
|
||||||
ifneq (,$(filter $(MCU), atmega16u2 atmega32u2 at90usb162))
|
ifneq (,$(filter $(MCU), atmega16u2 atmega32u2 at90usb162))
|
||||||
@ -265,14 +297,43 @@ endif
|
|||||||
SRC += is31fl3731-simple.c
|
SRC += is31fl3731-simple.c
|
||||||
QUANTUM_LIB_SRC += i2c_master.c
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(LED_MATRIX_DRIVER)), IS31FL3742A)
|
||||||
|
OPT_DEFS += -DIS31FLCOMMON -DIS31FL3742A -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||||
|
SRC += is31flcommon.c
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(LED_MATRIX_DRIVER)), IS31FL3743A)
|
||||||
|
OPT_DEFS += -DIS31FLCOMMON -DIS31FL3743A -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||||
|
SRC += is31flcommon.c
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(LED_MATRIX_DRIVER)), IS31FL3745)
|
||||||
|
OPT_DEFS += -DIS31FLCOMMON -DIS31FL3745 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||||
|
SRC += is31flcommon.c
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(LED_MATRIX_DRIVER)), IS31FL3746A)
|
||||||
|
OPT_DEFS += -DIS31FLCOMMON -DIS31FL3746A -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||||
|
SRC += is31flcommon.c
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
endif
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
RGB_MATRIX_ENABLE ?= no
|
RGB_MATRIX_ENABLE ?= no
|
||||||
VALID_RGB_MATRIX_TYPES := AW20216 IS31FL3731 IS31FL3733 IS31FL3737 IS31FL3741 CKLED2001 WS2812 custom
|
|
||||||
|
|
||||||
|
VALID_RGB_MATRIX_TYPES := AW20216 IS31FL3731 IS31FL3733 IS31FL3737 IS31FL3741 IS31FL3742A IS31FL3743A IS31FL3745 IS31FL3746A CKLED2001 WS2812 custom
|
||||||
ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes)
|
ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes)
|
||||||
ifeq ($(filter $(RGB_MATRIX_DRIVER),$(VALID_RGB_MATRIX_TYPES)),)
|
ifeq ($(filter $(RGB_MATRIX_DRIVER),$(VALID_RGB_MATRIX_TYPES)),)
|
||||||
$(error "$(RGB_MATRIX_DRIVER)" is not a valid matrix type)
|
$(call CATASTROPHIC_ERROR,Invalid RGB_MATRIX_DRIVER,RGB_MATRIX_DRIVER="$(RGB_MATRIX_DRIVER)" is not a valid matrix type)
|
||||||
endif
|
endif
|
||||||
OPT_DEFS += -DRGB_MATRIX_ENABLE
|
OPT_DEFS += -DRGB_MATRIX_ENABLE
|
||||||
ifneq (,$(filter $(MCU), atmega16u2 atmega32u2 at90usb162))
|
ifneq (,$(filter $(MCU), atmega16u2 atmega32u2 at90usb162))
|
||||||
@ -324,6 +385,34 @@ endif
|
|||||||
QUANTUM_LIB_SRC += i2c_master.c
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(RGB_MATRIX_DRIVER)), IS31FL3742A)
|
||||||
|
OPT_DEFS += -DIS31FLCOMMON -DIS31FL3742A -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||||
|
SRC += is31flcommon.c
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(RGB_MATRIX_DRIVER)), IS31FL3743A)
|
||||||
|
OPT_DEFS += -DIS31FLCOMMON -DIS31FL3743A -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||||
|
SRC += is31flcommon.c
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(RGB_MATRIX_DRIVER)), IS31FL3745)
|
||||||
|
OPT_DEFS += -DIS31FLCOMMON -DIS31FL3745 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||||
|
SRC += is31flcommon.c
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(RGB_MATRIX_DRIVER)), IS31FL3746A)
|
||||||
|
OPT_DEFS += -DIS31FLCOMMON -DIS31FL3746A -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||||
|
SRC += is31flcommon.c
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), CKLED2001)
|
ifeq ($(strip $(RGB_MATRIX_DRIVER)), CKLED2001)
|
||||||
OPT_DEFS += -DCKLED2001 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
OPT_DEFS += -DCKLED2001 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/led
|
COMMON_VPATH += $(DRIVER_PATH)/led
|
||||||
@ -357,7 +446,7 @@ endif
|
|||||||
ifeq ($(strip $(PRINTING_ENABLE)), yes)
|
ifeq ($(strip $(PRINTING_ENABLE)), yes)
|
||||||
OPT_DEFS += -DPRINTING_ENABLE
|
OPT_DEFS += -DPRINTING_ENABLE
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_printer.c
|
SRC += $(QUANTUM_DIR)/process_keycode/process_printer.c
|
||||||
SRC += $(TMK_DIR)/protocol/serial_uart.c
|
QUANTUM_LIB_SRC += uart.c
|
||||||
endif
|
endif
|
||||||
|
|
||||||
VARIABLE_TRACE ?= no
|
VARIABLE_TRACE ?= no
|
||||||
@ -386,7 +475,7 @@ else
|
|||||||
endif
|
endif
|
||||||
ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
|
ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
|
||||||
ifeq ($(filter $(BACKLIGHT_DRIVER),$(VALID_BACKLIGHT_TYPES)),)
|
ifeq ($(filter $(BACKLIGHT_DRIVER),$(VALID_BACKLIGHT_TYPES)),)
|
||||||
$(error BACKLIGHT_DRIVER="$(BACKLIGHT_DRIVER)" is not a valid backlight type)
|
$(call CATASTROPHIC_ERROR,Invalid BACKLIGHT_DRIVER,BACKLIGHT_DRIVER="$(BACKLIGHT_DRIVER)" is not a valid backlight type)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
COMMON_VPATH += $(QUANTUM_DIR)/backlight
|
COMMON_VPATH += $(QUANTUM_DIR)/backlight
|
||||||
@ -411,7 +500,7 @@ VALID_WS2812_DRIVER_TYPES := bitbang pwm spi i2c
|
|||||||
WS2812_DRIVER ?= bitbang
|
WS2812_DRIVER ?= bitbang
|
||||||
ifeq ($(strip $(WS2812_DRIVER_REQUIRED)), yes)
|
ifeq ($(strip $(WS2812_DRIVER_REQUIRED)), yes)
|
||||||
ifeq ($(filter $(WS2812_DRIVER),$(VALID_WS2812_DRIVER_TYPES)),)
|
ifeq ($(filter $(WS2812_DRIVER),$(VALID_WS2812_DRIVER_TYPES)),)
|
||||||
$(error WS2812_DRIVER="$(WS2812_DRIVER)" is not a valid WS2812 driver)
|
$(call CATASTROPHIC_ERROR,Invalid WS2812_DRIVER,WS2812_DRIVER="$(WS2812_DRIVER)" is not a valid WS2812 driver)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
OPT_DEFS += -DWS2812_DRIVER_$(strip $(shell echo $(WS2812_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
OPT_DEFS += -DWS2812_DRIVER_$(strip $(shell echo $(WS2812_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||||
@ -512,7 +601,7 @@ VALID_MAGIC_TYPES := yes
|
|||||||
BOOTMAGIC_ENABLE ?= no
|
BOOTMAGIC_ENABLE ?= no
|
||||||
ifneq ($(strip $(BOOTMAGIC_ENABLE)), no)
|
ifneq ($(strip $(BOOTMAGIC_ENABLE)), no)
|
||||||
ifeq ($(filter $(BOOTMAGIC_ENABLE),$(VALID_MAGIC_TYPES)),)
|
ifeq ($(filter $(BOOTMAGIC_ENABLE),$(VALID_MAGIC_TYPES)),)
|
||||||
$(error BOOTMAGIC_ENABLE="$(BOOTMAGIC_ENABLE)" is not a valid type of magic)
|
$(call CATASTROPHIC_ERROR,Invalid BOOTMAGIC_ENABLE,BOOTMAGIC_ENABLE="$(BOOTMAGIC_ENABLE)" is not a valid type of magic)
|
||||||
endif
|
endif
|
||||||
ifneq ($(strip $(BOOTMAGIC_ENABLE)), no)
|
ifneq ($(strip $(BOOTMAGIC_ENABLE)), no)
|
||||||
OPT_DEFS += -DBOOTMAGIC_LITE
|
OPT_DEFS += -DBOOTMAGIC_LITE
|
||||||
@ -528,7 +617,7 @@ CUSTOM_MATRIX ?= no
|
|||||||
|
|
||||||
ifneq ($(strip $(CUSTOM_MATRIX)), yes)
|
ifneq ($(strip $(CUSTOM_MATRIX)), yes)
|
||||||
ifeq ($(filter $(CUSTOM_MATRIX),$(VALID_CUSTOM_MATRIX_TYPES)),)
|
ifeq ($(filter $(CUSTOM_MATRIX),$(VALID_CUSTOM_MATRIX_TYPES)),)
|
||||||
$(error CUSTOM_MATRIX="$(CUSTOM_MATRIX)" is not a valid custom matrix type)
|
$(call CATASTROPHIC_ERROR,Invalid CUSTOM_MATRIX,CUSTOM_MATRIX="$(CUSTOM_MATRIX)" is not a valid custom matrix type)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Include common stuff for all non custom matrix users
|
# Include common stuff for all non custom matrix users
|
||||||
@ -611,7 +700,7 @@ VALID_OLED_DRIVER_TYPES := SSD1306 custom
|
|||||||
OLED_DRIVER ?= SSD1306
|
OLED_DRIVER ?= SSD1306
|
||||||
ifeq ($(strip $(OLED_ENABLE)), yes)
|
ifeq ($(strip $(OLED_ENABLE)), yes)
|
||||||
ifeq ($(filter $(OLED_DRIVER),$(VALID_OLED_DRIVER_TYPES)),)
|
ifeq ($(filter $(OLED_DRIVER),$(VALID_OLED_DRIVER_TYPES)),)
|
||||||
$(error OLED_DRIVER="$(OLED_DRIVER)" is not a valid OLED driver)
|
$(call CATASTROPHIC_ERROR,Invalid OLED_DRIVER,OLED_DRIVER="$(OLED_DRIVER)" is not a valid OLED driver)
|
||||||
else
|
else
|
||||||
OPT_DEFS += -DOLED_ENABLE
|
OPT_DEFS += -DOLED_ENABLE
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/oled
|
COMMON_VPATH += $(DRIVER_PATH)/oled
|
||||||
@ -651,6 +740,7 @@ ifeq ($(strip $(UNICODE_ENABLE)), yes)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(strip $(UNICODE_COMMON)), yes)
|
ifeq ($(strip $(UNICODE_COMMON)), yes)
|
||||||
|
OPT_DEFS += -DUNICODE_COMMON_ENABLE
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_unicode_common.c
|
SRC += $(QUANTUM_DIR)/process_keycode/process_unicode_common.c
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@ -678,7 +768,7 @@ endif
|
|||||||
ifeq ($(strip $(PS2_USE_BUSYWAIT)), yes)
|
ifeq ($(strip $(PS2_USE_BUSYWAIT)), yes)
|
||||||
PS2_ENABLE := yes
|
PS2_ENABLE := yes
|
||||||
SRC += ps2_busywait.c
|
SRC += ps2_busywait.c
|
||||||
SRC += ps2_io_avr.c
|
SRC += ps2_io.c
|
||||||
OPT_DEFS += -DPS2_USE_BUSYWAIT
|
OPT_DEFS += -DPS2_USE_BUSYWAIT
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@ -707,7 +797,7 @@ VALID_JOYSTICK_TYPES := analog digital
|
|||||||
JOYSTICK_DRIVER ?= analog
|
JOYSTICK_DRIVER ?= analog
|
||||||
ifeq ($(strip $(JOYSTICK_ENABLE)), yes)
|
ifeq ($(strip $(JOYSTICK_ENABLE)), yes)
|
||||||
ifeq ($(filter $(JOYSTICK_DRIVER),$(VALID_JOYSTICK_TYPES)),)
|
ifeq ($(filter $(JOYSTICK_DRIVER),$(VALID_JOYSTICK_TYPES)),)
|
||||||
$(error "$(JOYSTICK_DRIVER)" is not a valid joystick driver)
|
$(call CATASTROPHIC_ERROR,Invalid JOYSTICK_DRIVER,JOYSTICK_DRIVER="$(JOYSTICK_DRIVER)" is not a valid joystick driver)
|
||||||
endif
|
endif
|
||||||
OPT_DEFS += -DJOYSTICK_ENABLE
|
OPT_DEFS += -DJOYSTICK_ENABLE
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_joystick.c
|
SRC += $(QUANTUM_DIR)/process_keycode/process_joystick.c
|
||||||
@ -727,7 +817,7 @@ VALID_USBPD_DRIVER_TYPES = custom vendor
|
|||||||
USBPD_DRIVER ?= vendor
|
USBPD_DRIVER ?= vendor
|
||||||
ifeq ($(strip $(USBPD_ENABLE)), yes)
|
ifeq ($(strip $(USBPD_ENABLE)), yes)
|
||||||
ifeq ($(filter $(strip $(USBPD_DRIVER)),$(VALID_USBPD_DRIVER_TYPES)),)
|
ifeq ($(filter $(strip $(USBPD_DRIVER)),$(VALID_USBPD_DRIVER_TYPES)),)
|
||||||
$(error USBPD_DRIVER="$(USBPD_DRIVER)" is not a valid USBPD driver)
|
$(call CATASTROPHIC_ERROR,Invalid USBPD_DRIVER,USBPD_DRIVER="$(USBPD_DRIVER)" is not a valid USBPD driver)
|
||||||
else
|
else
|
||||||
OPT_DEFS += -DUSBPD_ENABLE
|
OPT_DEFS += -DUSBPD_ENABLE
|
||||||
ifeq ($(strip $(USBPD_DRIVER)), vendor)
|
ifeq ($(strip $(USBPD_DRIVER)), vendor)
|
||||||
@ -737,7 +827,7 @@ ifeq ($(strip $(USBPD_ENABLE)), yes)
|
|||||||
OPT_DEFS += -DUSBPD_STM32G4
|
OPT_DEFS += -DUSBPD_STM32G4
|
||||||
SRC += usbpd_stm32g4.c
|
SRC += usbpd_stm32g4.c
|
||||||
else
|
else
|
||||||
$(error There is no vendor-provided USBPD driver available)
|
$(call CATASTROPHIC_ERROR,Invalid USBPD_DRIVER,There is no vendor-provided USBPD driver available)
|
||||||
endif
|
endif
|
||||||
else ifeq ($(strip $(USBPD_DRIVER)), custom)
|
else ifeq ($(strip $(USBPD_DRIVER)), custom)
|
||||||
OPT_DEFS += -DUSBPD_CUSTOM
|
OPT_DEFS += -DUSBPD_CUSTOM
|
||||||
@ -747,25 +837,26 @@ ifeq ($(strip $(USBPD_ENABLE)), yes)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
BLUETOOTH_ENABLE ?= no
|
BLUETOOTH_ENABLE ?= no
|
||||||
VALID_BLUETOOTH_DRIVER_TYPES := AdafruitBLE RN42 custom
|
VALID_BLUETOOTH_DRIVER_TYPES := BluefruitLE RN42 custom
|
||||||
ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
|
ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
|
||||||
ifeq ($(filter $(strip $(BLUETOOTH_DRIVER)),$(VALID_BLUETOOTH_DRIVER_TYPES)),)
|
ifeq ($(filter $(strip $(BLUETOOTH_DRIVER)),$(VALID_BLUETOOTH_DRIVER_TYPES)),)
|
||||||
$(error "$(BLUETOOTH_DRIVER)" is not a valid Bluetooth driver type)
|
$(call CATASTROPHIC_ERROR,Invalid BLUETOOTH_DRIVER,BLUETOOTH_DRIVER="$(BLUETOOTH_DRIVER)" is not a valid Bluetooth driver type)
|
||||||
endif
|
endif
|
||||||
OPT_DEFS += -DBLUETOOTH_ENABLE
|
OPT_DEFS += -DBLUETOOTH_ENABLE
|
||||||
NO_USB_STARTUP_CHECK := yes
|
NO_USB_STARTUP_CHECK := yes
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/bluetooth
|
COMMON_VPATH += $(DRIVER_PATH)/bluetooth
|
||||||
SRC += outputselect.c
|
SRC += outputselect.c
|
||||||
|
|
||||||
ifeq ($(strip $(BLUETOOTH_DRIVER)), AdafruitBLE)
|
ifeq ($(strip $(BLUETOOTH_DRIVER)), BluefruitLE)
|
||||||
OPT_DEFS += -DMODULE_ADAFRUIT_BLE
|
OPT_DEFS += -DBLUETOOTH_BLUEFRUIT_LE
|
||||||
SRC += analog.c
|
SRC += analog.c
|
||||||
SRC += $(DRIVER_PATH)/bluetooth/adafruit_ble.cpp
|
SRC += $(DRIVER_PATH)/bluetooth/bluefruit_le.cpp
|
||||||
QUANTUM_LIB_SRC += spi_master.c
|
QUANTUM_LIB_SRC += spi_master.c
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(strip $(BLUETOOTH_DRIVER)), RN42)
|
ifeq ($(strip $(BLUETOOTH_DRIVER)), RN42)
|
||||||
OPT_DEFS += -DMODULE_RN42
|
OPT_DEFS += -DBLUETOOTH_RN42
|
||||||
SRC += $(TMK_DIR)/protocol/serial_uart.c
|
SRC += $(DRIVER_PATH)/bluetooth/rn42.c
|
||||||
|
QUANTUM_LIB_SRC += uart.c
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
526
builddefs/common_rules.mk
Normal file
526
builddefs/common_rules.mk
Normal file
@ -0,0 +1,526 @@
|
|||||||
|
# Hey Emacs, this is a -*- makefile -*-
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
# WinAVR Makefile Template written by Eric B. Weddington, Jg Wunsch, et al.
|
||||||
|
#
|
||||||
|
# Released to the Public Domain
|
||||||
|
#
|
||||||
|
# Additional material for this makefile was written by:
|
||||||
|
# Peter Fleury
|
||||||
|
# Tim Henigan
|
||||||
|
# Colin O'Flynn
|
||||||
|
# Reiner Patommel
|
||||||
|
# Markus Pfaff
|
||||||
|
# Sander Pool
|
||||||
|
# Frederik Rouleau
|
||||||
|
# Carlos Lamas
|
||||||
|
#
|
||||||
|
|
||||||
|
# Enable vpath seraching for source files only
|
||||||
|
# Without this, output files, could be read from the wrong .build directories
|
||||||
|
VPATH_SRC := $(VPATH)
|
||||||
|
vpath %.c $(VPATH_SRC)
|
||||||
|
vpath %.h $(VPATH_SRC)
|
||||||
|
vpath %.cpp $(VPATH_SRC)
|
||||||
|
vpath %.cc $(VPATH_SRC)
|
||||||
|
vpath %.hpp $(VPATH_SRC)
|
||||||
|
vpath %.S $(VPATH_SRC)
|
||||||
|
VPATH :=
|
||||||
|
|
||||||
|
# Convert all SRC to OBJ
|
||||||
|
define OBJ_FROM_SRC
|
||||||
|
$(patsubst %.c,$1/%.o,$(patsubst %.cpp,$1/%.o,$(patsubst %.cc,$1/%.o,$(patsubst %.S,$1/%.o,$(patsubst %.clib,$1/%.a,$($1_SRC))))))
|
||||||
|
endef
|
||||||
|
$(foreach OUTPUT,$(OUTPUTS),$(eval $(OUTPUT)_OBJ +=$(call OBJ_FROM_SRC,$(OUTPUT))))
|
||||||
|
|
||||||
|
# Define a list of all objects
|
||||||
|
OBJ := $(foreach OUTPUT,$(OUTPUTS),$($(OUTPUT)_OBJ))
|
||||||
|
NO_LTO_OBJ := $(filter %.a,$(OBJ))
|
||||||
|
|
||||||
|
MASTER_OUTPUT := $(firstword $(OUTPUTS))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Output format. (can be srec, ihex, binary)
|
||||||
|
FORMAT = ihex
|
||||||
|
|
||||||
|
# Optimization level, can be [0, 1, 2, 3, s].
|
||||||
|
# 0 = turn off optimization. s = optimize for size.
|
||||||
|
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
|
||||||
|
OPT ?= s
|
||||||
|
|
||||||
|
# Compiler flag to set the C Standard level.
|
||||||
|
# c89 = "ANSI" C
|
||||||
|
# gnu89 = c89 plus GCC extensions
|
||||||
|
# c99 = ISO C99 standard (not yet fully implemented)
|
||||||
|
# gnu99 = c99 plus GCC extensions
|
||||||
|
CSTANDARD = -std=gnu99
|
||||||
|
|
||||||
|
|
||||||
|
# Place -D or -U options here for C sources
|
||||||
|
#CDEFS +=
|
||||||
|
|
||||||
|
|
||||||
|
# Place -D or -U options here for ASM sources
|
||||||
|
#ADEFS +=
|
||||||
|
|
||||||
|
|
||||||
|
# Place -D or -U options here for C++ sources
|
||||||
|
#CXXDEFS += -D__STDC_LIMIT_MACROS
|
||||||
|
#CXXDEFS += -D__STDC_CONSTANT_MACROS
|
||||||
|
#CXXDEFS +=
|
||||||
|
|
||||||
|
# Speed up recompilations by opt-in usage of ccache
|
||||||
|
USE_CCACHE ?= no
|
||||||
|
ifneq ($(USE_CCACHE),no)
|
||||||
|
CC_PREFIX ?= ccache
|
||||||
|
endif
|
||||||
|
|
||||||
|
#---------------- Compiler Options C ----------------
|
||||||
|
# -g*: generate debugging information
|
||||||
|
# -O*: optimization level
|
||||||
|
# -f...: tuning, see GCC manual and avr-libc documentation
|
||||||
|
# -Wall...: warning level
|
||||||
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
|
ifeq ($(strip $(LTO_ENABLE)), yes)
|
||||||
|
ifeq ($(PLATFORM),CHIBIOS)
|
||||||
|
$(info Enabling LTO on ChibiOS-targeting boards is known to have a high likelihood of failure.)
|
||||||
|
$(info If unsure, set LTO_ENABLE = no.)
|
||||||
|
endif
|
||||||
|
CDEFS += -flto
|
||||||
|
CDEFS += -DLTO_ENABLE
|
||||||
|
endif
|
||||||
|
|
||||||
|
DEBUG_ENABLE ?= yes
|
||||||
|
ifeq ($(strip $(SKIP_DEBUG_INFO)),yes)
|
||||||
|
DEBUG_ENABLE=no
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(DEBUG_ENABLE)),yes)
|
||||||
|
CFLAGS += -g$(DEBUG)
|
||||||
|
endif
|
||||||
|
CFLAGS += $(CDEFS)
|
||||||
|
CFLAGS += -O$(OPT)
|
||||||
|
# add color
|
||||||
|
ifeq ($(COLOR),true)
|
||||||
|
ifeq ("$(shell echo "int main(){}" | $(CC) -fdiagnostics-color -x c - -o /dev/null 2>&1)", "")
|
||||||
|
CFLAGS+= -fdiagnostics-color
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
CFLAGS += -Wall
|
||||||
|
CFLAGS += -Wstrict-prototypes
|
||||||
|
ifneq ($(strip $(ALLOW_WARNINGS)), yes)
|
||||||
|
CFLAGS += -Werror
|
||||||
|
endif
|
||||||
|
#CFLAGS += -mshort-calls
|
||||||
|
#CFLAGS += -fno-unit-at-a-time
|
||||||
|
#CFLAGS += -Wundef
|
||||||
|
#CFLAGS += -Wunreachable-code
|
||||||
|
#CFLAGS += -Wsign-compare
|
||||||
|
CFLAGS += $(CSTANDARD)
|
||||||
|
|
||||||
|
# This fixes lots of keyboards linking errors but SHOULDN'T BE A FINAL SOLUTION
|
||||||
|
# Fixing of multiple variable definitions must be made.
|
||||||
|
CFLAGS += -fcommon
|
||||||
|
|
||||||
|
#---------------- Compiler Options C++ ----------------
|
||||||
|
# -g*: generate debugging information
|
||||||
|
# -O*: optimization level
|
||||||
|
# -f...: tuning, see GCC manual and avr-libc documentation
|
||||||
|
# -Wall...: warning level
|
||||||
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
|
ifeq ($(strip $(DEBUG_ENABLE)),yes)
|
||||||
|
CXXFLAGS += -g$(DEBUG)
|
||||||
|
endif
|
||||||
|
CXXFLAGS += $(CXXDEFS)
|
||||||
|
CXXFLAGS += -O$(OPT)
|
||||||
|
# to supress "warning: only initialized variables can be placed into program memory area"
|
||||||
|
CXXFLAGS += -w
|
||||||
|
CXXFLAGS += -Wall
|
||||||
|
CXXFLAGS += -Wundef
|
||||||
|
|
||||||
|
ifneq ($(strip $(ALLOW_WARNINGS)), yes)
|
||||||
|
CXXFLAGS += -Werror
|
||||||
|
endif
|
||||||
|
#CXXFLAGS += -mshort-calls
|
||||||
|
#CXXFLAGS += -fno-unit-at-a-time
|
||||||
|
#CXXFLAGS += -Wstrict-prototypes
|
||||||
|
#CXXFLAGS += -Wunreachable-code
|
||||||
|
#CXXFLAGS += -Wsign-compare
|
||||||
|
#CXXFLAGS += $(CSTANDARD)
|
||||||
|
|
||||||
|
#---------------- Assembler Options ----------------
|
||||||
|
ASFLAGS += $(ADEFS)
|
||||||
|
ifeq ($(VERBOSE_AS_CMD),yes)
|
||||||
|
ASFLAGS += -v
|
||||||
|
endif
|
||||||
|
|
||||||
|
#---------------- Library Options ----------------
|
||||||
|
# Minimalistic printf version
|
||||||
|
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
|
||||||
|
|
||||||
|
# Floating point printf version (requires MATH_LIB = -lm below)
|
||||||
|
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
|
||||||
|
|
||||||
|
# If this is left blank, then it will use the Standard printf version.
|
||||||
|
PRINTF_LIB =
|
||||||
|
#PRINTF_LIB = $(PRINTF_LIB_MIN)
|
||||||
|
#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
|
||||||
|
|
||||||
|
|
||||||
|
# Minimalistic scanf version
|
||||||
|
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
|
||||||
|
|
||||||
|
# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
|
||||||
|
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
|
||||||
|
|
||||||
|
# If this is left blank, then it will use the Standard scanf version.
|
||||||
|
SCANF_LIB =
|
||||||
|
#SCANF_LIB = $(SCANF_LIB_MIN)
|
||||||
|
#SCANF_LIB = $(SCANF_LIB_FLOAT)
|
||||||
|
|
||||||
|
|
||||||
|
MATH_LIB = -lm
|
||||||
|
CREATE_MAP ?= yes
|
||||||
|
|
||||||
|
|
||||||
|
#---------------- Linker Options ----------------
|
||||||
|
# -Wl,...: tell GCC to pass this to linker.
|
||||||
|
# -Map: create map file
|
||||||
|
# --cref: add cross reference to map file
|
||||||
|
#
|
||||||
|
# Comennt out "--relax" option to avoid a error such:
|
||||||
|
# (.vectors+0x30): relocation truncated to fit: R_AVR_13_PCREL against symbol `__vector_12'
|
||||||
|
#
|
||||||
|
|
||||||
|
ifeq ($(CREATE_MAP),yes)
|
||||||
|
LDFLAGS += -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref
|
||||||
|
endif
|
||||||
|
ifeq ($(VERBOSE_LD_CMD),yes)
|
||||||
|
LDFLAGS += -v
|
||||||
|
endif
|
||||||
|
#LDFLAGS += -Wl,--relax
|
||||||
|
LDFLAGS += $(EXTMEMOPTS)
|
||||||
|
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
|
||||||
|
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
|
||||||
|
#LDFLAGS += -T linker_script.x
|
||||||
|
# You can give EXTRALDFLAGS at 'make' command line.
|
||||||
|
LDFLAGS += $(EXTRALDFLAGS)
|
||||||
|
|
||||||
|
#---------------- Assembler Listings ----------------
|
||||||
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
|
# -adhlns: create listing
|
||||||
|
# -gstabs: have the assembler create line number information; note that
|
||||||
|
# for use in COFF files, additional information about filenames
|
||||||
|
# and function names needs to be present in the assembler source
|
||||||
|
# files -- see avr-libc docs [FIXME: not yet described there]
|
||||||
|
# -listing-cont-lines: Sets the maximum number of continuation lines of hex
|
||||||
|
# dump that will be displayed for a given single line of source input.
|
||||||
|
|
||||||
|
ADHLNS_ENABLE ?= no
|
||||||
|
ifeq ($(ADHLNS_ENABLE),yes)
|
||||||
|
# Avoid "Options to '-Xassembler' do not match" - only specify assembler options at LTO link time
|
||||||
|
ifeq ($(strip $(LTO_ENABLE)), yes)
|
||||||
|
LDFLAGS += -Wa,-adhlns=$(BUILD_DIR)/$(TARGET).lst
|
||||||
|
else
|
||||||
|
CFLAGS += -Wa,-adhlns=$(@:%.o=%.lst)
|
||||||
|
CXXFLAGS += -Wa,-adhlns=$(@:%.o=%.lst)
|
||||||
|
ifeq ($(strip $(DEBUG_ENABLE)),yes)
|
||||||
|
ASFLAGS = -Wa,-adhlns=$(@:%.o=%.lst),-gstabs,--listing-cont-lines=100
|
||||||
|
else
|
||||||
|
ASFLAGS = -Wa,-adhlns=$(@:%.o=%.lst),--listing-cont-lines=100
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Define programs and commands.
|
||||||
|
SHELL = sh
|
||||||
|
SED = sed
|
||||||
|
REMOVE = rm -f
|
||||||
|
REMOVEDIR = rmdir
|
||||||
|
COPY = cp
|
||||||
|
WINSHELL = cmd
|
||||||
|
SECHO = $(SILENT) || echo
|
||||||
|
MD5SUM ?= md5sum
|
||||||
|
ifneq ($(filter Darwin FreeBSD,$(shell uname -s)),)
|
||||||
|
MD5SUM = md5
|
||||||
|
endif
|
||||||
|
|
||||||
|
# UF2 format settings
|
||||||
|
# To produce a UF2 file in your build, add to your keyboard's rules.mk:
|
||||||
|
# FIRMWARE_FORMAT = uf2
|
||||||
|
UF2CONV = $(TOP_DIR)/util/uf2conv.py
|
||||||
|
UF2_FAMILY ?= 0x0
|
||||||
|
|
||||||
|
# Compiler flags to generate dependency files.
|
||||||
|
#GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
|
||||||
|
GENDEPFLAGS = -MMD -MP -MF $(patsubst %.o,%.td,$@)
|
||||||
|
|
||||||
|
|
||||||
|
# Combine all necessary flags and optional flags.
|
||||||
|
# Add target processor to flags.
|
||||||
|
# You can give extra flags at 'make' command line like: make EXTRAFLAGS=-DFOO=bar
|
||||||
|
ALL_CFLAGS = $(MCUFLAGS) $(CFLAGS) $(EXTRAFLAGS)
|
||||||
|
ALL_CXXFLAGS = $(MCUFLAGS) -x c++ $(CXXFLAGS) $(EXTRAFLAGS)
|
||||||
|
ALL_ASFLAGS = $(MCUFLAGS) -x assembler-with-cpp $(ASFLAGS) $(EXTRAFLAGS)
|
||||||
|
|
||||||
|
define NO_LTO
|
||||||
|
$(patsubst %.a,%.o,$1): NOLTO_CFLAGS += -fno-lto
|
||||||
|
endef
|
||||||
|
$(foreach LOBJ, $(NO_LTO_OBJ), $(eval $(call NO_LTO,$(LOBJ))))
|
||||||
|
|
||||||
|
MOVE_DEP = mv -f $(patsubst %.o,%.td,$@) $(patsubst %.o,%.d,$@)
|
||||||
|
|
||||||
|
# For a ChibiOS build, ensure that the board files have the hook overrides injected
|
||||||
|
define BOARDSRC_INJECT_HOOKS
|
||||||
|
$(KEYBOARD_OUTPUT)/$(patsubst %.c,%.o,$(patsubst ./%,%,$1)): INIT_HOOK_CFLAGS += -include $(TOP_DIR)/tmk_core/protocol/chibios/init_hooks.h
|
||||||
|
endef
|
||||||
|
$(foreach LOBJ, $(BOARDSRC), $(eval $(call BOARDSRC_INJECT_HOOKS,$(LOBJ))))
|
||||||
|
|
||||||
|
# Add QMK specific flags
|
||||||
|
DFU_SUFFIX ?= dfu-suffix
|
||||||
|
DFU_SUFFIX_ARGS ?=
|
||||||
|
|
||||||
|
|
||||||
|
elf: $(BUILD_DIR)/$(TARGET).elf
|
||||||
|
hex: $(BUILD_DIR)/$(TARGET).hex
|
||||||
|
uf2: $(BUILD_DIR)/$(TARGET).uf2
|
||||||
|
cpfirmware: $(FIRMWARE_FORMAT)
|
||||||
|
$(SILENT) || printf "Copying $(TARGET).$(FIRMWARE_FORMAT) to qmk_firmware folder" | $(AWK_CMD)
|
||||||
|
$(COPY) $(BUILD_DIR)/$(TARGET).$(FIRMWARE_FORMAT) $(TARGET).$(FIRMWARE_FORMAT) && $(PRINT_OK)
|
||||||
|
eep: $(BUILD_DIR)/$(TARGET).eep
|
||||||
|
lss: $(BUILD_DIR)/$(TARGET).lss
|
||||||
|
sym: $(BUILD_DIR)/$(TARGET).sym
|
||||||
|
LIBNAME=lib$(TARGET).a
|
||||||
|
lib: $(LIBNAME)
|
||||||
|
|
||||||
|
# Display size of file, modifying the output so people don't mistakenly grab the hex output
|
||||||
|
BINARY_SIZE = $(SIZE) --target=$(FORMAT) $(BUILD_DIR)/$(TARGET).hex | $(SED) -e 's/\.build\/.*$$/$(TARGET).$(FIRMWARE_FORMAT)/g'
|
||||||
|
|
||||||
|
sizebefore:
|
||||||
|
@if test -f $(BUILD_DIR)/$(TARGET).hex; then $(SECHO) $(MSG_SIZE_BEFORE); $(SILENT) || $(BINARY_SIZE); \
|
||||||
|
2>/dev/null; $(SECHO); fi
|
||||||
|
|
||||||
|
sizeafter: $(BUILD_DIR)/$(TARGET).hex
|
||||||
|
@if test -f $(BUILD_DIR)/$(TARGET).hex; then $(SECHO); $(SECHO) $(MSG_SIZE_AFTER); $(SILENT) || $(BINARY_SIZE); \
|
||||||
|
2>/dev/null; $(SECHO); fi
|
||||||
|
|
||||||
|
# Display compiler version information.
|
||||||
|
gccversion :
|
||||||
|
@$(SILENT) || $(CC) --version
|
||||||
|
|
||||||
|
# Create final output files (.hex, .eep) from ELF output file.
|
||||||
|
%.hex: %.elf
|
||||||
|
$(eval CMD=$(HEX) $< $@)
|
||||||
|
#@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
|
||||||
|
@$(SILENT) || printf "$(MSG_FLASH) $@" | $(AWK_CMD)
|
||||||
|
@$(BUILD_CMD)
|
||||||
|
|
||||||
|
%.uf2: %.hex
|
||||||
|
$(eval CMD=$(UF2CONV) $(BUILD_DIR)/$(TARGET).hex -o $(BUILD_DIR)/$(TARGET).uf2 -c -f $(UF2_FAMILY) >/dev/null 2>&1)
|
||||||
|
#@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
|
||||||
|
@$(SILENT) || printf "$(MSG_UF2) $@" | $(AWK_CMD)
|
||||||
|
@$(BUILD_CMD)
|
||||||
|
|
||||||
|
%.eep: %.elf
|
||||||
|
$(eval CMD=$(EEP) $< $@ || exit 0)
|
||||||
|
#@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
|
||||||
|
@$(SILENT) || printf "$(MSG_EEPROM) $@" | $(AWK_CMD)
|
||||||
|
@$(BUILD_CMD)
|
||||||
|
|
||||||
|
# Create extended listing file from ELF output file.
|
||||||
|
%.lss: %.elf
|
||||||
|
$(eval CMD=$(OBJDUMP) -h -S -z $< > $@)
|
||||||
|
#@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
|
||||||
|
@$(SILENT) || printf "$(MSG_EXTENDED_LISTING) $@" | $(AWK_CMD)
|
||||||
|
@$(BUILD_CMD)
|
||||||
|
|
||||||
|
# Create a symbol table from ELF output file.
|
||||||
|
%.sym: %.elf
|
||||||
|
$(eval CMD=$(NM) -n $< > $@ )
|
||||||
|
#@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
|
||||||
|
@$(SILENT) || printf "$(MSG_SYMBOL_TABLE) $@" | $(AWK_CMD)
|
||||||
|
@$(BUILD_CMD)
|
||||||
|
|
||||||
|
%.bin: %.elf
|
||||||
|
$(eval CMD=$(BIN) $< $@ || exit 0)
|
||||||
|
#@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
|
||||||
|
@$(SILENT) || printf "$(MSG_BIN) $@" | $(AWK_CMD)
|
||||||
|
@$(BUILD_CMD)
|
||||||
|
if [ ! -z "$(DFU_SUFFIX_ARGS)" ]; then \
|
||||||
|
$(DFU_SUFFIX) $(DFU_SUFFIX_ARGS) -a $(BUILD_DIR)/$(TARGET).bin 1>/dev/null ;\
|
||||||
|
fi
|
||||||
|
#$(SILENT) || printf "$(MSG_EXECUTING) '$(DFU_SUFFIX) $(DFU_SUFFIX_ARGS) -a $(BUILD_DIR)/$(TARGET).bin 1>/dev/null':\n" ;\
|
||||||
|
$(COPY) $(BUILD_DIR)/$(TARGET).bin $(TARGET).bin;
|
||||||
|
if [ ! -z "$(VIBL)" ]; then \
|
||||||
|
python3 util/vial_generate_vfw.py $(TARGET).bin $(TARGET).vfw $(CONFIG_H) ;\
|
||||||
|
fi
|
||||||
|
|
||||||
|
BEGIN = gccversion sizebefore
|
||||||
|
|
||||||
|
# Link: create ELF output file from object files.
|
||||||
|
.SECONDARY : $(BUILD_DIR)/$(TARGET).elf
|
||||||
|
.PRECIOUS : $(OBJ)
|
||||||
|
# Note the obj.txt depeendency is there to force linking if a source file is deleted
|
||||||
|
%.elf: $(OBJ) $(MASTER_OUTPUT)/cflags.txt $(MASTER_OUTPUT)/ldflags.txt $(MASTER_OUTPUT)/obj.txt | $(BEGIN)
|
||||||
|
@$(SILENT) || printf "$(MSG_LINKING) $@" | $(AWK_CMD)
|
||||||
|
$(eval CMD=MAKE=$(MAKE) $(CC) $(ALL_CFLAGS) $(filter-out %.txt,$^) --output $@ $(LDFLAGS))
|
||||||
|
@$(BUILD_CMD)
|
||||||
|
|
||||||
|
|
||||||
|
define GEN_OBJRULE
|
||||||
|
$1_INCFLAGS := $$(patsubst %,-I%,$$($1_INC))
|
||||||
|
ifdef $1_CONFIG
|
||||||
|
$1_CONFIG_FLAGS += $$(patsubst %,-include %,$$($1_CONFIG))
|
||||||
|
endif
|
||||||
|
$1_CFLAGS = $$(ALL_CFLAGS) $$($1_DEFS) $$($1_INCFLAGS) $$($1_CONFIG_FLAGS) $$(NOLTO_CFLAGS)
|
||||||
|
$1_CXXFLAGS = $$(ALL_CXXFLAGS) $$($1_DEFS) $$($1_INCFLAGS) $$($1_CONFIG_FLAGS) $$(NOLTO_CFLAGS)
|
||||||
|
$1_ASFLAGS = $$(ALL_ASFLAGS) $$($1_DEFS) $$($1_INCFLAGS) $$($1_CONFIG_FLAGS)
|
||||||
|
|
||||||
|
# Compile: create object files from C source files.
|
||||||
|
$1/%.o : %.c $1/%.d $1/cflags.txt $1/compiler.txt | $(BEGIN)
|
||||||
|
@mkdir -p $$(@D)
|
||||||
|
@$$(SILENT) || printf "$$(MSG_COMPILING) $$<" | $$(AWK_CMD)
|
||||||
|
$$(eval CC_EXEC := $$(CC))
|
||||||
|
ifneq ($$(VERBOSE_C_CMD),)
|
||||||
|
$$(if $$(filter $$(notdir $$(VERBOSE_C_CMD)),$$(notdir $$<)),$$(eval CC_EXEC += -v))
|
||||||
|
endif
|
||||||
|
ifneq ($$(VERBOSE_C_INCLUDE),)
|
||||||
|
$$(if $$(filter $$(notdir $$(VERBOSE_C_INCLUDE)),$$(notdir $$<)),$$(eval CC_EXEC += -H))
|
||||||
|
endif
|
||||||
|
$$(eval CMD := $$(CC_EXEC) -c $$($1_CFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
|
||||||
|
@$$(BUILD_CMD)
|
||||||
|
ifneq ($$(DUMP_C_MACROS),)
|
||||||
|
$$(eval CMD := $$(CC) -E -dM $$($1_CFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$<)
|
||||||
|
@$$(if $$(filter $$(notdir $$(DUMP_C_MACROS)),$$(notdir $$<)),$$(BUILD_CMD))
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Compile: create object files from C++ source files.
|
||||||
|
$1/%.o : %.cpp $1/%.d $1/cxxflags.txt $1/compiler.txt | $(BEGIN)
|
||||||
|
@mkdir -p $$(@D)
|
||||||
|
@$$(SILENT) || printf "$$(MSG_COMPILING_CXX) $$<" | $$(AWK_CMD)
|
||||||
|
$$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
|
||||||
|
@$$(BUILD_CMD)
|
||||||
|
|
||||||
|
$1/%.o : %.cc $1/%.d $1/cxxflags.txt $1/compiler.txt | $(BEGIN)
|
||||||
|
@mkdir -p $$(@D)
|
||||||
|
@$$(SILENT) || printf "$$(MSG_COMPILING_CXX) $$<" | $$(AWK_CMD)
|
||||||
|
$$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
|
||||||
|
@$$(BUILD_CMD)
|
||||||
|
|
||||||
|
# Assemble: create object files from assembler source files.
|
||||||
|
$1/%.o : %.S $1/asflags.txt $1/compiler.txt | $(BEGIN)
|
||||||
|
@mkdir -p $$(@D)
|
||||||
|
@$(SILENT) || printf "$$(MSG_ASSEMBLING) $$<" | $$(AWK_CMD)
|
||||||
|
$$(eval CMD=$$(CC) -c $$($1_ASFLAGS) $$< -o $$@)
|
||||||
|
@$$(BUILD_CMD)
|
||||||
|
|
||||||
|
$1/%.a : $1/%.o
|
||||||
|
@mkdir -p $$(@D)
|
||||||
|
@$(SILENT) || printf "Archiving: $$<" | $$(AWK_CMD)
|
||||||
|
$$(eval CMD=$$(AR) rcs $$@ $$<)
|
||||||
|
@$$(BUILD_CMD)
|
||||||
|
|
||||||
|
$1/force:
|
||||||
|
|
||||||
|
$1/cflags.txt: $1/force
|
||||||
|
echo '$$($1_CFLAGS)' | cmp -s - $$@ || echo '$$($1_CFLAGS)' > $$@
|
||||||
|
|
||||||
|
$1/cxxflags.txt: $1/force
|
||||||
|
echo '$$($1_CXXFLAGS)' | cmp -s - $$@ || echo '$$($1_CXXFLAGS)' > $$@
|
||||||
|
|
||||||
|
$1/asflags.txt: $1/force
|
||||||
|
echo '$$($1_ASFLAGS)' | cmp -s - $$@ || echo '$$($1_ASFLAGS)' > $$@
|
||||||
|
|
||||||
|
$1/compiler.txt: $1/force
|
||||||
|
$$(CC) --version | cmp -s - $$@ || $$(CC) --version > $$@
|
||||||
|
endef
|
||||||
|
|
||||||
|
.PRECIOUS: $(MASTER_OUTPUT)/obj.txt
|
||||||
|
$(MASTER_OUTPUT)/obj.txt: $(MASTER_OUTPUT)/force
|
||||||
|
echo '$(OBJ)' | cmp -s - $@ || echo '$(OBJ)' > $@
|
||||||
|
|
||||||
|
.PRECIOUS: $(MASTER_OUTPUT)/ldflags.txt
|
||||||
|
$(MASTER_OUTPUT)/ldflags.txt: $(MASTER_OUTPUT)/force
|
||||||
|
echo '$(LDFLAGS)' | cmp -s - $@ || echo '$(LDFLAGS)' > $@
|
||||||
|
|
||||||
|
|
||||||
|
# We have to use static rules for the .d files for some reason
|
||||||
|
DEPS = $(patsubst %.o,%.d,$(patsubst %.a,%.o,$(OBJ)))
|
||||||
|
# Keep the .d files
|
||||||
|
.PRECIOUS: $(DEPS)
|
||||||
|
# Empty rule to force recompilation if the .d file is missing
|
||||||
|
$(DEPS):
|
||||||
|
|
||||||
|
|
||||||
|
$(foreach OUTPUT,$(OUTPUTS),$(eval $(call GEN_OBJRULE,$(OUTPUT))))
|
||||||
|
|
||||||
|
# Create preprocessed source for use in sending a bug report.
|
||||||
|
%.i : %.c | $(BEGIN)
|
||||||
|
$(CC) -E -mmcu=$(MCU) $(CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
# Target: clean project.
|
||||||
|
clean:
|
||||||
|
$(foreach OUTPUT,$(OUTPUTS), $(REMOVE) -r $(OUTPUT) 2>/dev/null)
|
||||||
|
$(REMOVE) $(BUILD_DIR)/$(TARGET).*
|
||||||
|
|
||||||
|
show_path:
|
||||||
|
@echo VPATH=$(VPATH)
|
||||||
|
@echo SRC=$(SRC)
|
||||||
|
@echo OBJ=$(OBJ)
|
||||||
|
|
||||||
|
dump_vars: ERROR_IF_EMPTY=""
|
||||||
|
dump_vars: ERROR_IF_NONBOOL=""
|
||||||
|
dump_vars: ERROR_IF_UNSET=""
|
||||||
|
dump_vars:
|
||||||
|
@$(foreach V,$(sort $(.VARIABLES)),$(if $(filter-out environment% default automatic,$(origin $V)),$(info $V=$($V))))
|
||||||
|
|
||||||
|
objs-size:
|
||||||
|
for i in $(OBJ); do echo $$i; done | sort | xargs $(SIZE)
|
||||||
|
|
||||||
|
ifeq ($(findstring avr-gcc,$(CC)),avr-gcc)
|
||||||
|
SIZE_MARGIN = 1024
|
||||||
|
|
||||||
|
check-size:
|
||||||
|
$(eval MAX_SIZE=$(shell n=`$(CC) -E -mmcu=$(MCU) -D__ASSEMBLER__ $(CFLAGS) $(OPT_DEFS) platforms/avr/bootloader_size.c 2> /dev/null | $(SED) -ne 's/\r//;/^#/n;/^AVR_SIZE:/,$${s/^AVR_SIZE: //;p;}'` && echo $$(($$n)) || echo 0))
|
||||||
|
$(eval CURRENT_SIZE=$(shell if [ -f $(BUILD_DIR)/$(TARGET).hex ]; then $(SIZE) --target=$(FORMAT) $(BUILD_DIR)/$(TARGET).hex | $(AWK) 'NR==2 {print $$4}'; else printf 0; fi))
|
||||||
|
$(eval FREE_SIZE=$(shell expr $(MAX_SIZE) - $(CURRENT_SIZE)))
|
||||||
|
$(eval OVER_SIZE=$(shell expr $(CURRENT_SIZE) - $(MAX_SIZE)))
|
||||||
|
$(eval PERCENT_SIZE=$(shell expr $(CURRENT_SIZE) \* 100 / $(MAX_SIZE)))
|
||||||
|
if [ $(MAX_SIZE) -gt 0 ] && [ $(CURRENT_SIZE) -gt 0 ]; then \
|
||||||
|
$(SILENT) || printf "$(MSG_CHECK_FILESIZE)" | $(AWK_CMD); \
|
||||||
|
if [ $(CURRENT_SIZE) -gt $(MAX_SIZE) ]; then \
|
||||||
|
printf "\n * $(MSG_FILE_TOO_BIG)"; $(PRINT_ERROR_PLAIN); \
|
||||||
|
else \
|
||||||
|
if [ $(FREE_SIZE) -lt $(SIZE_MARGIN) ]; then \
|
||||||
|
$(PRINT_WARNING_PLAIN); printf " * $(MSG_FILE_NEAR_LIMIT)"; \
|
||||||
|
else \
|
||||||
|
$(PRINT_OK); $(SILENT) || printf " * $(MSG_FILE_JUST_RIGHT)"; \
|
||||||
|
fi ; \
|
||||||
|
fi ; \
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
check-size:
|
||||||
|
$(SILENT) || echo "$(MSG_CHECK_FILESIZE_SKIPPED)"
|
||||||
|
endif
|
||||||
|
|
||||||
|
check-md5:
|
||||||
|
$(MD5SUM) $(BUILD_DIR)/$(TARGET).$(FIRMWARE_FORMAT)
|
||||||
|
|
||||||
|
# Create build directory
|
||||||
|
$(shell mkdir -p $(BUILD_DIR) 2>/dev/null)
|
||||||
|
|
||||||
|
# Create object files directory
|
||||||
|
$(eval $(foreach OUTPUT,$(OUTPUTS),$(shell mkdir -p $(OUTPUT) 2>/dev/null)))
|
||||||
|
|
||||||
|
# Include the dependency files.
|
||||||
|
-include $(patsubst %.o,%.d,$(patsubst %.a,%.o,$(OBJ)))
|
||||||
|
|
||||||
|
|
||||||
|
# Listing of phony targets.
|
||||||
|
.PHONY : all dump_vars finish sizebefore sizeafter qmkversion \
|
||||||
|
gccversion build elf hex uf2 eep lss sym coff extcoff \
|
||||||
|
clean clean_list debug gdb-config show_path \
|
||||||
|
program teensy dfu dfu-ee dfu-start \
|
||||||
|
flash dfu-split-left dfu-split-right \
|
||||||
|
avrdude-split-left avrdude-split-right \
|
||||||
|
avrdude-loop usbasp
|
@ -143,6 +143,9 @@ ifneq ($(findstring STM32F042, $(MCU)),)
|
|||||||
# This ensures that the EEPROM page buffer fits into RAM
|
# This ensures that the EEPROM page buffer fits into RAM
|
||||||
USE_PROCESS_STACKSIZE = 0x600
|
USE_PROCESS_STACKSIZE = 0x600
|
||||||
USE_EXCEPTIONS_STACKSIZE = 0x300
|
USE_EXCEPTIONS_STACKSIZE = 0x300
|
||||||
|
|
||||||
|
# Bootloader address for STM32 DFU
|
||||||
|
STM32_BOOTLOADER_ADDRESS ?= 0x1FFFC400
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(findstring STM32F072, $(MCU)),)
|
ifneq ($(findstring STM32F072, $(MCU)),)
|
||||||
@ -175,6 +178,9 @@ ifneq ($(findstring STM32F072, $(MCU)),)
|
|||||||
|
|
||||||
# UF2 settings
|
# UF2 settings
|
||||||
UF2_FAMILY ?= STM32F0
|
UF2_FAMILY ?= STM32F0
|
||||||
|
|
||||||
|
# Bootloader address for STM32 DFU
|
||||||
|
STM32_BOOTLOADER_ADDRESS ?= 0x1FFFC800
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(findstring STM32F103, $(MCU)),)
|
ifneq ($(findstring STM32F103, $(MCU)),)
|
||||||
@ -239,6 +245,9 @@ ifneq ($(findstring STM32F303, $(MCU)),)
|
|||||||
|
|
||||||
# UF2 settings
|
# UF2 settings
|
||||||
UF2_FAMILY ?= STM32F3
|
UF2_FAMILY ?= STM32F3
|
||||||
|
|
||||||
|
# Bootloader address for STM32 DFU
|
||||||
|
STM32_BOOTLOADER_ADDRESS ?= 0x1FFFD800
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(findstring STM32F401, $(MCU)),)
|
ifneq ($(findstring STM32F401, $(MCU)),)
|
||||||
@ -276,6 +285,9 @@ ifneq ($(findstring STM32F401, $(MCU)),)
|
|||||||
|
|
||||||
# UF2 settings
|
# UF2 settings
|
||||||
UF2_FAMILY ?= STM32F4
|
UF2_FAMILY ?= STM32F4
|
||||||
|
|
||||||
|
# Bootloader address for STM32 DFU
|
||||||
|
STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(findstring STM32F405, $(MCU)),)
|
ifneq ($(findstring STM32F405, $(MCU)),)
|
||||||
@ -308,6 +320,9 @@ ifneq ($(findstring STM32F405, $(MCU)),)
|
|||||||
|
|
||||||
# UF2 settings
|
# UF2 settings
|
||||||
UF2_FAMILY ?= STM32F4
|
UF2_FAMILY ?= STM32F4
|
||||||
|
|
||||||
|
# Bootloader address for STM32 DFU
|
||||||
|
STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(findstring STM32F407, $(MCU)),)
|
ifneq ($(findstring STM32F407, $(MCU)),)
|
||||||
@ -340,6 +355,9 @@ ifneq ($(findstring STM32F407, $(MCU)),)
|
|||||||
|
|
||||||
# UF2 settings
|
# UF2 settings
|
||||||
UF2_FAMILY ?= STM32F4
|
UF2_FAMILY ?= STM32F4
|
||||||
|
|
||||||
|
# Bootloader address for STM32 DFU
|
||||||
|
STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(findstring STM32F411, $(MCU)),)
|
ifneq ($(findstring STM32F411, $(MCU)),)
|
||||||
@ -377,6 +395,9 @@ ifneq ($(findstring STM32F411, $(MCU)),)
|
|||||||
|
|
||||||
# UF2 settings
|
# UF2 settings
|
||||||
UF2_FAMILY ?= STM32F4
|
UF2_FAMILY ?= STM32F4
|
||||||
|
|
||||||
|
# Bootloader address for STM32 DFU
|
||||||
|
STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(findstring STM32F446, $(MCU)),)
|
ifneq ($(findstring STM32F446, $(MCU)),)
|
||||||
@ -406,6 +427,9 @@ ifneq ($(findstring STM32F446, $(MCU)),)
|
|||||||
BOARD ?= GENERIC_STM32_F446XE
|
BOARD ?= GENERIC_STM32_F446XE
|
||||||
|
|
||||||
USE_FPU ?= yes
|
USE_FPU ?= yes
|
||||||
|
|
||||||
|
# Bootloader address for STM32 DFU
|
||||||
|
STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(findstring STM32G431, $(MCU)),)
|
ifneq ($(findstring STM32G431, $(MCU)),)
|
||||||
@ -438,6 +462,9 @@ ifneq ($(findstring STM32G431, $(MCU)),)
|
|||||||
|
|
||||||
# UF2 settings
|
# UF2 settings
|
||||||
UF2_FAMILY ?= STM32G4
|
UF2_FAMILY ?= STM32G4
|
||||||
|
|
||||||
|
# Bootloader address for STM32 DFU
|
||||||
|
STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(findstring STM32G474, $(MCU)),)
|
ifneq ($(findstring STM32G474, $(MCU)),)
|
||||||
@ -470,6 +497,46 @@ ifneq ($(findstring STM32G474, $(MCU)),)
|
|||||||
|
|
||||||
# UF2 settings
|
# UF2 settings
|
||||||
UF2_FAMILY ?= STM32G4
|
UF2_FAMILY ?= STM32G4
|
||||||
|
|
||||||
|
# Bootloader address for STM32 DFU
|
||||||
|
STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq (,$(filter $(MCU),STM32L432 STM32L442))
|
||||||
|
# Cortex version
|
||||||
|
MCU = cortex-m4
|
||||||
|
|
||||||
|
# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
|
||||||
|
ARMV = 7
|
||||||
|
|
||||||
|
## chip/board settings
|
||||||
|
# - the next two should match the directories in
|
||||||
|
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
|
MCU_FAMILY = STM32
|
||||||
|
MCU_SERIES = STM32L4xx
|
||||||
|
|
||||||
|
# Linker script to use
|
||||||
|
# - it should exist either in <chibios>/os/common/startup/ARMCMx/compilers/GCC/ld/
|
||||||
|
# or <keyboard_dir>/ld/
|
||||||
|
MCU_LDSCRIPT ?= STM32L432xC
|
||||||
|
|
||||||
|
# Startup code to use
|
||||||
|
# - it should exist in <chibios>/os/common/startup/ARMCMx/compilers/GCC/mk/
|
||||||
|
MCU_STARTUP ?= stm32l4xx
|
||||||
|
|
||||||
|
# Board: it should exist either in <chibios>/os/hal/boards/,
|
||||||
|
# <keyboard_dir>/boards/, or drivers/boards/
|
||||||
|
BOARD ?= GENERIC_STM32_L432XC
|
||||||
|
|
||||||
|
PLATFORM_NAME ?= platform_l432
|
||||||
|
|
||||||
|
USE_FPU ?= yes
|
||||||
|
|
||||||
|
# UF2 settings
|
||||||
|
UF2_FAMILY ?= STM32L4
|
||||||
|
|
||||||
|
# Bootloader address for STM32 DFU
|
||||||
|
STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq (,$(filter $(MCU),STM32L433 STM32L443))
|
ifneq (,$(filter $(MCU),STM32L433 STM32L443))
|
||||||
@ -504,6 +571,9 @@ ifneq (,$(filter $(MCU),STM32L433 STM32L443))
|
|||||||
|
|
||||||
# UF2 settings
|
# UF2 settings
|
||||||
UF2_FAMILY ?= STM32L4
|
UF2_FAMILY ?= STM32L4
|
||||||
|
|
||||||
|
# Bootloader address for STM32 DFU
|
||||||
|
STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq (,$(filter $(MCU),STM32L412 STM32L422))
|
ifneq (,$(filter $(MCU),STM32L412 STM32L422))
|
||||||
@ -538,6 +608,9 @@ ifneq (,$(filter $(MCU),STM32L412 STM32L422))
|
|||||||
|
|
||||||
# UF2 settings
|
# UF2 settings
|
||||||
UF2_FAMILY ?= STM32L4
|
UF2_FAMILY ?= STM32L4
|
||||||
|
|
||||||
|
# Bootloader address for STM32 DFU
|
||||||
|
STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(findstring WB32F3G71, $(MCU)),)
|
ifneq ($(findstring WB32F3G71, $(MCU)),)
|
||||||
@ -567,6 +640,10 @@ ifneq ($(findstring WB32F3G71, $(MCU)),)
|
|||||||
BOARD ?= GENERIC_WB32_F3G71XX
|
BOARD ?= GENERIC_WB32_F3G71XX
|
||||||
|
|
||||||
USE_FPU ?= no
|
USE_FPU ?= no
|
||||||
|
|
||||||
|
# Bootloader address for WB32 DFU
|
||||||
|
STM32_BOOTLOADER_ADDRESS ?= 0x1FFFE000
|
||||||
|
WB32_BOOTLOADER_ADDRESS ?= 0x1FFFE000
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(findstring GD32VF103, $(MCU)),)
|
ifneq ($(findstring GD32VF103, $(MCU)),)
|
||||||
|
@ -87,6 +87,7 @@ define GENERATE_MSG_AVAILABLE_KEYMAPS
|
|||||||
endef
|
endef
|
||||||
MSG_AVAILABLE_KEYMAPS = $(eval $(call GENERATE_MSG_AVAILABLE_KEYMAPS))$(MSG_AVAILABLE_KEYMAPS_ACTUAL)
|
MSG_AVAILABLE_KEYMAPS = $(eval $(call GENERATE_MSG_AVAILABLE_KEYMAPS))$(MSG_AVAILABLE_KEYMAPS_ACTUAL)
|
||||||
|
|
||||||
|
MSG_BOOTLOADER_NOT_FOUND_BASE = Bootloader not found. Make sure the board is in bootloader mode. See https://docs.qmk.fm/\#/newbs_flashing\n
|
||||||
MSG_CHECK_FILESIZE = Checking file size of $(TARGET).$(FIRMWARE_FORMAT)
|
MSG_CHECK_FILESIZE = Checking file size of $(TARGET).$(FIRMWARE_FORMAT)
|
||||||
MSG_CHECK_FILESIZE_SKIPPED = (Firmware size check does not yet support $(MCU_ORIG); skipping)
|
MSG_CHECK_FILESIZE_SKIPPED = (Firmware size check does not yet support $(MCU_ORIG); skipping)
|
||||||
MSG_FILE_TOO_BIG = $(ERROR_COLOR)The firmware is too large!$(NO_COLOR) $(CURRENT_SIZE)/$(MAX_SIZE) ($(OVER_SIZE) bytes over)\n
|
MSG_FILE_TOO_BIG = $(ERROR_COLOR)The firmware is too large!$(NO_COLOR) $(CURRENT_SIZE)/$(MAX_SIZE) ($(OVER_SIZE) bytes over)\n
|
||||||
@ -97,6 +98,11 @@ MSG_PYTHON_MISSING = $(ERROR_COLOR)ERROR:$(NO_COLOR) Cannot run \"qmk hello\"!\n
|
|||||||
Please run $(BOLD)qmk setup$(NO_COLOR) to install all the dependencies QMK requires.\n\n
|
Please run $(BOLD)qmk setup$(NO_COLOR) to install all the dependencies QMK requires.\n\n
|
||||||
MSG_FLASH_BOOTLOADER = $(WARN_COLOR)WARNING:$(NO_COLOR) This board's bootloader is not specified or is not supported by the \":flash\" target at this time.\n\n
|
MSG_FLASH_BOOTLOADER = $(WARN_COLOR)WARNING:$(NO_COLOR) This board's bootloader is not specified or is not supported by the \":flash\" target at this time.\n\n
|
||||||
MSG_FLASH_ARCH = $(WARN_COLOR)WARNING:$(NO_COLOR) This board's architecture is not supported by the \":flash\" target at this time.\n\n
|
MSG_FLASH_ARCH = $(WARN_COLOR)WARNING:$(NO_COLOR) This board's architecture is not supported by the \":flash\" target at this time.\n\n
|
||||||
MSG_BOOTLOADER_NOT_FOUND = $(ERROR_COLOR)ERROR:$(NO_COLOR) Bootloader not found. Trying again in 5s (Ctrl+C to cancel)\n
|
MSG_BOOTLOADER_NOT_FOUND = $(ERROR_COLOR)ERROR:$(NO_COLOR) $(MSG_BOOTLOADER_NOT_FOUND_BASE) Trying again in 5s (Ctrl+C to cancel)\n
|
||||||
BOOTLOADER_RETRY_TIME ?= 0.5
|
BOOTLOADER_RETRY_TIME ?= 0.5
|
||||||
MSG_BOOTLOADER_NOT_FOUND_QUICK_RETRY = Bootloader not found. Trying again every $(BOOTLOADER_RETRY_TIME)s (Ctrl+C to cancel)
|
MSG_BOOTLOADER_NOT_FOUND_QUICK_RETRY = $(MSG_BOOTLOADER_NOT_FOUND_BASE) Trying again every $(BOOTLOADER_RETRY_TIME)s (Ctrl+C to cancel)
|
||||||
|
|
||||||
|
define CATASTROPHIC_ERROR
|
||||||
|
$(shell printf "\n * %-99s $(ERROR_STRING)\n" "$2" >&2)
|
||||||
|
$(error $1)
|
||||||
|
endef
|
@ -8,7 +8,7 @@ include $(PLATFORM_PATH)/test/testlist.mk
|
|||||||
define VALIDATE_TEST_LIST
|
define VALIDATE_TEST_LIST
|
||||||
ifneq ($1,)
|
ifneq ($1,)
|
||||||
ifeq ($$(findstring -,$1),-)
|
ifeq ($$(findstring -,$1),-)
|
||||||
$$(error Test names can't contain '-', but '$1' does)
|
$$(call CATASTROPHIC_ERROR,Invalid test name,Test names can't contain '-', but '$1' does.)
|
||||||
else
|
else
|
||||||
$$(eval $$(call VALIDATE_TEST_LIST,$$(firstword $2),$$(wordlist 2,9999,$2)))
|
$$(eval $$(call VALIDATE_TEST_LIST,$$(firstword $2),$$(wordlist 2,9999,$2)))
|
||||||
endif
|
endif
|
@ -15,6 +15,8 @@
|
|||||||
"COMBO_TERM": {"info_key": "combo.term", "value_type": "int"},
|
"COMBO_TERM": {"info_key": "combo.term", "value_type": "int"},
|
||||||
"DEBOUNCE": {"info_key": "debounce", "value_type": "int"},
|
"DEBOUNCE": {"info_key": "debounce", "value_type": "int"},
|
||||||
"DEVICE_VER": {"info_key": "usb.device_ver", "value_type": "hex"},
|
"DEVICE_VER": {"info_key": "usb.device_ver", "value_type": "hex"},
|
||||||
|
# TODO: Replace ^^^ with vvv
|
||||||
|
#"DEVICE_VER": {"info_key": "usb.device_version", "value_type": "bcd_version"},
|
||||||
"DESCRIPTION": {"info_key": "keyboard_folder", "to_json": false},
|
"DESCRIPTION": {"info_key": "keyboard_folder", "to_json": false},
|
||||||
"DIODE_DIRECTION": {"info_key": "diode_direction"},
|
"DIODE_DIRECTION": {"info_key": "diode_direction"},
|
||||||
"FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "bool"},
|
"FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "bool"},
|
||||||
|
@ -41,8 +41,14 @@
|
|||||||
'atom47/rev3': {
|
'atom47/rev3': {
|
||||||
target: 'maartenwut/atom47/rev3'
|
target: 'maartenwut/atom47/rev3'
|
||||||
},
|
},
|
||||||
|
bakeneko60: {
|
||||||
|
target: 'kkatano/bakeneko60'
|
||||||
|
},
|
||||||
bakeneko65: {
|
bakeneko65: {
|
||||||
target: 'bakeneko65/rev2'
|
target: 'kkatano/bakeneko65/rev2'
|
||||||
|
},
|
||||||
|
bakeneko80: {
|
||||||
|
target: 'kkatano/bakeneko80'
|
||||||
},
|
},
|
||||||
bear_face: {
|
bear_face: {
|
||||||
target: 'bear_face/v1'
|
target: 'bear_face/v1'
|
||||||
@ -215,6 +221,9 @@
|
|||||||
LAYOUT: 'LAYOUT_all'
|
LAYOUT: 'LAYOUT_all'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
idobo: {
|
||||||
|
target: 'idobao/id75'
|
||||||
|
},
|
||||||
'jj40': {
|
'jj40': {
|
||||||
target: 'kprepublic/jj40'
|
target: 'kprepublic/jj40'
|
||||||
},
|
},
|
||||||
@ -260,6 +269,9 @@
|
|||||||
'lfkeyboards/smk65': {
|
'lfkeyboards/smk65': {
|
||||||
target: 'lfkeyboards/smk65/revb'
|
target: 'lfkeyboards/smk65/revb'
|
||||||
},
|
},
|
||||||
|
m3v3van: {
|
||||||
|
target: 'matthewdias/m3n3van'
|
||||||
|
},
|
||||||
'maartenwut/atom47/rev2': {
|
'maartenwut/atom47/rev2': {
|
||||||
target: 'evyd13/atom47/rev2'
|
target: 'evyd13/atom47/rev2'
|
||||||
},
|
},
|
||||||
@ -344,15 +356,24 @@
|
|||||||
'mechlovin/hannah65/mechlovin9': {
|
'mechlovin/hannah65/mechlovin9': {
|
||||||
target: 'mechlovin/mechlovin9/rev1'
|
target: 'mechlovin/mechlovin9/rev1'
|
||||||
},
|
},
|
||||||
|
'mechlovin/hex4b': {
|
||||||
|
target: 'mechlovin/hex4b/rev1'
|
||||||
|
},
|
||||||
'melgeek/z70ultra': {
|
'melgeek/z70ultra': {
|
||||||
target: 'melgeek/z70ultra/rev1'
|
target: 'melgeek/z70ultra/rev1'
|
||||||
},
|
},
|
||||||
'mechlovin/hannah65': {
|
'mechlovin/hannah65': {
|
||||||
target: 'mechlovin/hannah65/rev1'
|
target: 'mechlovin/hannah65/rev1'
|
||||||
},
|
},
|
||||||
|
minim: {
|
||||||
|
target: 'matthewdias/minim'
|
||||||
|
},
|
||||||
model01: {
|
model01: {
|
||||||
target: 'keyboardio/model01'
|
target: 'keyboardio/model01'
|
||||||
},
|
},
|
||||||
|
model_v: {
|
||||||
|
target: 'matthewdias/model_v'
|
||||||
|
},
|
||||||
m0lly: {
|
m0lly: {
|
||||||
target: 'tkc/m0lly'
|
target: 'tkc/m0lly'
|
||||||
},
|
},
|
||||||
@ -495,6 +516,9 @@
|
|||||||
'tokyo60': {
|
'tokyo60': {
|
||||||
target: 'tokyokeyboard/tokyo60'
|
target: 'tokyokeyboard/tokyo60'
|
||||||
},
|
},
|
||||||
|
'txuu': {
|
||||||
|
target: 'matthewdias/txuu'
|
||||||
|
},
|
||||||
underscore33: {
|
underscore33: {
|
||||||
target: 'underscore33/rev1'
|
target: 'underscore33/rev1'
|
||||||
},
|
},
|
||||||
@ -547,7 +571,7 @@
|
|||||||
target: 'xelus/valor/rev1'
|
target: 'xelus/valor/rev1'
|
||||||
},
|
},
|
||||||
yd60mq: {
|
yd60mq: {
|
||||||
target: 'yd60mq/12led'
|
target: 'ymdk/yd60mq/12led'
|
||||||
},
|
},
|
||||||
ymd75: {
|
ymd75: {
|
||||||
target: 'ymd75/rev1'
|
target: 'ymd75/rev1'
|
||||||
@ -560,5 +584,615 @@
|
|||||||
},
|
},
|
||||||
zeal65: {
|
zeal65: {
|
||||||
target: 'wilba_tech/zeal65'
|
target: 'wilba_tech/zeal65'
|
||||||
|
},
|
||||||
|
# Moved during 2022 Q1 cycle
|
||||||
|
6ball: {
|
||||||
|
target: 'maple_computing/6ball'
|
||||||
|
},
|
||||||
|
7skb: {
|
||||||
|
target: 'salicylic_acid3/7skb'
|
||||||
|
},
|
||||||
|
7splus: {
|
||||||
|
target: 'salicylic_acid3/7splus'
|
||||||
|
},
|
||||||
|
acr60: {
|
||||||
|
target: 'mechkeys/acr60'
|
||||||
|
},
|
||||||
|
adalyn: {
|
||||||
|
target: 'tominabox1/adalyn'
|
||||||
|
},
|
||||||
|
ajisai74: {
|
||||||
|
target: 'salicylic_acid3/ajisai74'
|
||||||
|
},
|
||||||
|
aleth42: {
|
||||||
|
target: '25keys/aleth42'
|
||||||
|
},
|
||||||
|
alicia_cook: {
|
||||||
|
target: 'ibnuda/alicia_cook'
|
||||||
|
},
|
||||||
|
allison: {
|
||||||
|
target: 'prototypist/allison'
|
||||||
|
},
|
||||||
|
allison_numpad: {
|
||||||
|
target: 'prototypist/allison_numpad'
|
||||||
|
},
|
||||||
|
alu84: {
|
||||||
|
target: 'mechkeys/alu84'
|
||||||
|
},
|
||||||
|
angel17: {
|
||||||
|
target: 'kakunpc/angel17'
|
||||||
|
},
|
||||||
|
angel64/alpha: {
|
||||||
|
target: 'kakunpc/angel64/alpha'
|
||||||
|
},
|
||||||
|
angel64/rev1: {
|
||||||
|
target: 'kakunpc/angel64/rev1'
|
||||||
|
},
|
||||||
|
arch_36: {
|
||||||
|
target: 'obosob/arch_36'
|
||||||
|
},
|
||||||
|
bakeneko60: {
|
||||||
|
target: 'kkatano/bakeneko60'
|
||||||
|
},
|
||||||
|
bakeneko65/rev2: {
|
||||||
|
target: 'kkatano/bakeneko65/rev2'
|
||||||
|
},
|
||||||
|
bakeneko65/rev3: {
|
||||||
|
target: 'kkatano/bakeneko65/rev3'
|
||||||
|
},
|
||||||
|
bakeneko80: {
|
||||||
|
target: 'kkatano/bakeneko80'
|
||||||
|
},
|
||||||
|
barleycorn: {
|
||||||
|
target: 'yiancardesigns/barleycorn'
|
||||||
|
},
|
||||||
|
bat43/rev1: {
|
||||||
|
target: 'dailycraft/bat43/rev1'
|
||||||
|
},
|
||||||
|
bat43/rev2: {
|
||||||
|
target: 'dailycraft/bat43/rev2'
|
||||||
|
},
|
||||||
|
bigseries/1key: {
|
||||||
|
target: 'woodkeys/bigseries/1key'
|
||||||
|
},
|
||||||
|
bigseries/2key: {
|
||||||
|
target: 'woodkeys/bigseries/2key'
|
||||||
|
},
|
||||||
|
bigseries/3key: {
|
||||||
|
target: 'woodkeys/bigseries/3key'
|
||||||
|
},
|
||||||
|
bigseries/4key: {
|
||||||
|
target: 'woodkeys/bigseries/4key'
|
||||||
|
},
|
||||||
|
bkf: {
|
||||||
|
target: 'drhigsby/bkf'
|
||||||
|
},
|
||||||
|
business_card/alpha: {
|
||||||
|
target: 'kakunpc/business_card/alpha'
|
||||||
|
},
|
||||||
|
business_card/beta: {
|
||||||
|
target: 'kakunpc/business_card/beta'
|
||||||
|
},
|
||||||
|
butterstick: {
|
||||||
|
target: 'gboards/butterstick'
|
||||||
|
},
|
||||||
|
c39: {
|
||||||
|
target: 'maple_computing/c39'
|
||||||
|
},
|
||||||
|
cassette42: {
|
||||||
|
target: '25keys/cassette42'
|
||||||
|
},
|
||||||
|
chidori: {
|
||||||
|
target: 'kagizaraya/chidori'
|
||||||
|
},
|
||||||
|
chili: {
|
||||||
|
target: 'ydkb/chili'
|
||||||
|
},
|
||||||
|
chimera_ergo: {
|
||||||
|
target: 'glenpickle/chimera_ergo'
|
||||||
|
},
|
||||||
|
chimera_ls: {
|
||||||
|
target: 'glenpickle/chimera_ls'
|
||||||
|
},
|
||||||
|
chimera_ortho: {
|
||||||
|
target: 'glenpickle/chimera_ortho'
|
||||||
|
},
|
||||||
|
chimera_ortho_plus: {
|
||||||
|
target: 'glenpickle/chimera_ortho_plus'
|
||||||
|
},
|
||||||
|
choc_taro: {
|
||||||
|
target: 'kakunpc/choc_taro'
|
||||||
|
},
|
||||||
|
choco60: {
|
||||||
|
target: 'recompile_keys/choco60'
|
||||||
|
},
|
||||||
|
christmas_tree: {
|
||||||
|
target: 'maple_computing/christmas_tree'
|
||||||
|
},
|
||||||
|
claw44/rev1: {
|
||||||
|
target: 'dailycraft/claw44/rev1'
|
||||||
|
},
|
||||||
|
cocoa40: {
|
||||||
|
target: 'recompile_keys/cocoa40'
|
||||||
|
},
|
||||||
|
comet46: {
|
||||||
|
target: 'satt/comet46'
|
||||||
|
},
|
||||||
|
cu24: {
|
||||||
|
target: 'capsunlocked/cu24'
|
||||||
|
},
|
||||||
|
cu75: {
|
||||||
|
target: 'capsunlocked/cu75'
|
||||||
|
},
|
||||||
|
cu80: {
|
||||||
|
target: 'capsunlocked/cu80/v1'
|
||||||
|
},
|
||||||
|
delilah: {
|
||||||
|
target: 'rainkeebs/delilah'
|
||||||
|
},
|
||||||
|
diverge3: {
|
||||||
|
target: 'unikeyboard/diverge3'
|
||||||
|
},
|
||||||
|
divergetm2: {
|
||||||
|
target: 'unikeyboard/divergetm2'
|
||||||
|
},
|
||||||
|
dozen0: {
|
||||||
|
target: 'yynmt/dozen0'
|
||||||
|
},
|
||||||
|
dubba175: {
|
||||||
|
target: 'drhigsby/dubba175'
|
||||||
|
},
|
||||||
|
eggman: {
|
||||||
|
target: 'qpockets/eggman'
|
||||||
|
},
|
||||||
|
ergo42: {
|
||||||
|
target: 'biacco42/ergo42'
|
||||||
|
},
|
||||||
|
ergoarrows: {
|
||||||
|
target: 'salicylic_acid3/ergoarrows'
|
||||||
|
},
|
||||||
|
ergodash/mini: {
|
||||||
|
target: 'omkbd/ergodash/mini'
|
||||||
|
},
|
||||||
|
ergodash/rev1: {
|
||||||
|
target: 'omkbd/ergodash/rev1'
|
||||||
|
},
|
||||||
|
ergodox_infinity: {
|
||||||
|
target: 'input_club/ergodox_infinity'
|
||||||
|
},
|
||||||
|
ergotaco: {
|
||||||
|
target: 'gboards/ergotaco'
|
||||||
|
},
|
||||||
|
espectro: {
|
||||||
|
target: 'mechkeys/espectro'
|
||||||
|
},
|
||||||
|
felix: {
|
||||||
|
target: 'unikeyboard/felix'
|
||||||
|
},
|
||||||
|
four_banger: {
|
||||||
|
target: 'bpiphany/four_banger'
|
||||||
|
},
|
||||||
|
freyr: {
|
||||||
|
target: 'hnahkb/freyr'
|
||||||
|
},
|
||||||
|
geminate60: {
|
||||||
|
target: 'weirdo/geminate60'
|
||||||
|
},
|
||||||
|
georgi: {
|
||||||
|
target: 'gboards/georgi'
|
||||||
|
},
|
||||||
|
gergo: {
|
||||||
|
target: 'gboards/gergo'
|
||||||
|
},
|
||||||
|
getta25: {
|
||||||
|
target: 'salicylic_acid3/getta25'
|
||||||
|
},
|
||||||
|
gingham: {
|
||||||
|
target: 'yiancardesigns/gingham'
|
||||||
|
},
|
||||||
|
gurindam: {
|
||||||
|
target: 'ibnuda/gurindam'
|
||||||
|
},
|
||||||
|
halberd: {
|
||||||
|
target: 'kagizaraya/halberd'
|
||||||
|
},
|
||||||
|
hecomi/alpha: {
|
||||||
|
target: 'takashiski/hecomi/alpha'
|
||||||
|
},
|
||||||
|
hid_liber: {
|
||||||
|
target: 'bpiphany/hid_liber'
|
||||||
|
},
|
||||||
|
id67/default_rgb: {
|
||||||
|
target: 'idobao/id67/default_rgb'
|
||||||
|
},
|
||||||
|
id67/rgb: {
|
||||||
|
target: 'idobao/id67/rgb'
|
||||||
|
},
|
||||||
|
id80: {
|
||||||
|
target: 'idobao/id80/v1'
|
||||||
|
},
|
||||||
|
id87: {
|
||||||
|
target: 'idobao/id87/v1'
|
||||||
|
},
|
||||||
|
idobo: {
|
||||||
|
target: 'idobao/id75/v1'
|
||||||
|
},
|
||||||
|
infinity60: {
|
||||||
|
target: 'input_club/infinity60'
|
||||||
|
},
|
||||||
|
ivy/rev1: {
|
||||||
|
target: 'maple_computing/ivy/rev1'
|
||||||
|
},
|
||||||
|
jisplit89: {
|
||||||
|
target: 'salicylic_acid3/jisplit89'
|
||||||
|
},
|
||||||
|
jnao: {
|
||||||
|
target: 'maple_computing/jnao'
|
||||||
|
},
|
||||||
|
just60: {
|
||||||
|
target: 'ydkb/just60'
|
||||||
|
},
|
||||||
|
k_type: {
|
||||||
|
target: 'input_club/k_type'
|
||||||
|
},
|
||||||
|
kagamidget: {
|
||||||
|
target: 'yynmt/kagamidget'
|
||||||
|
},
|
||||||
|
kelowna/rgb64: {
|
||||||
|
target: 'weirdo/kelowna/rgb64'
|
||||||
|
},
|
||||||
|
kprepublic/bm65hsrgb_iso: {
|
||||||
|
target: 'kprepublic/bm65hsrgb_iso/rev1'
|
||||||
|
},
|
||||||
|
kprepublic/bm68hsrgb: {
|
||||||
|
target: 'kprepublic/bm68hsrgb/rev1'
|
||||||
|
},
|
||||||
|
latin17rgb: {
|
||||||
|
target: 'latincompass/latin17rgb'
|
||||||
|
},
|
||||||
|
latin47ble: {
|
||||||
|
target: 'latincompass/latin47ble'
|
||||||
|
},
|
||||||
|
latin60rgb: {
|
||||||
|
target: 'latincompass/latin60rgb'
|
||||||
|
},
|
||||||
|
latin64ble: {
|
||||||
|
target: 'latincompass/latin64ble'
|
||||||
|
},
|
||||||
|
latin6rgb: {
|
||||||
|
target: 'latincompass/latin6rgb'
|
||||||
|
},
|
||||||
|
latinpad: {
|
||||||
|
target: 'latincompass/latinpad'
|
||||||
|
},
|
||||||
|
latinpadble: {
|
||||||
|
target: 'latincompass/latinpadble'
|
||||||
|
},
|
||||||
|
launchpad/rev1: {
|
||||||
|
target: 'maple_computing/launchpad/rev1'
|
||||||
|
},
|
||||||
|
lck75: {
|
||||||
|
target: 'lyso1/lck75'
|
||||||
|
},
|
||||||
|
le_chiffre: {
|
||||||
|
target: 'tominabox1/le_chiffre'
|
||||||
|
},
|
||||||
|
lefishe: {
|
||||||
|
target: 'lyso1/lefishe'
|
||||||
|
},
|
||||||
|
lets_split_eh/eh: {
|
||||||
|
target: 'maple_computing/lets_split_eh/eh'
|
||||||
|
},
|
||||||
|
ls_60: {
|
||||||
|
target: 'weirdo/ls_60'
|
||||||
|
},
|
||||||
|
m3n3van: {
|
||||||
|
target: 'matthewdias/m3n3van'
|
||||||
|
},
|
||||||
|
mechmini/v1: {
|
||||||
|
target: 'mechkeys/mechmini/v1'
|
||||||
|
},
|
||||||
|
mechmini/v2: {
|
||||||
|
target: 'mechkeys/mechmini/v2'
|
||||||
|
},
|
||||||
|
meira: {
|
||||||
|
target: 'woodkeys/meira'
|
||||||
|
},
|
||||||
|
meishi: {
|
||||||
|
target: 'biacco42/meishi'
|
||||||
|
},
|
||||||
|
meishi2: {
|
||||||
|
target: 'biacco42/meishi2'
|
||||||
|
},
|
||||||
|
minidox/rev1: {
|
||||||
|
target: 'maple_computing/minidox/rev1'
|
||||||
|
},
|
||||||
|
minim: {
|
||||||
|
target: 'matthewdias/minim'
|
||||||
|
},
|
||||||
|
mio: {
|
||||||
|
target: 'recompile_keys/mio'
|
||||||
|
},
|
||||||
|
model_v: {
|
||||||
|
target: 'matthewdias/model_v'
|
||||||
|
},
|
||||||
|
montex: {
|
||||||
|
target: 'idobao/montex/v1'
|
||||||
|
},
|
||||||
|
nafuda: {
|
||||||
|
target: 'salicylic_acid3/nafuda'
|
||||||
|
},
|
||||||
|
naiping/np64: {
|
||||||
|
target: 'weirdo/naiping/np64'
|
||||||
|
},
|
||||||
|
naiping/nphhkb: {
|
||||||
|
target: 'weirdo/naiping/nphhkb'
|
||||||
|
},
|
||||||
|
naiping/npminila: {
|
||||||
|
target: 'weirdo/naiping/npminila'
|
||||||
|
},
|
||||||
|
naked48: {
|
||||||
|
target: 'salicylic_acid3/naked48'
|
||||||
|
},
|
||||||
|
naked60: {
|
||||||
|
target: 'salicylic_acid3/naked60'
|
||||||
|
},
|
||||||
|
naked64: {
|
||||||
|
target: 'salicylic_acid3/naked64'
|
||||||
|
},
|
||||||
|
namecard2x4: {
|
||||||
|
target: 'takashiski/namecard2x4'
|
||||||
|
},
|
||||||
|
nebula12: {
|
||||||
|
target: 'spaceholdings/nebula12'
|
||||||
|
},
|
||||||
|
nebula68: {
|
||||||
|
target: 'spaceholdings/nebula68'
|
||||||
|
},
|
||||||
|
nebula68b: {
|
||||||
|
target: 'spaceholdings/nebula68b'
|
||||||
|
},
|
||||||
|
niu_mini: {
|
||||||
|
target: 'kbdfans/niu_mini'
|
||||||
|
},
|
||||||
|
nk1: {
|
||||||
|
target: 'novelkeys/nk1'
|
||||||
|
},
|
||||||
|
nk65: {
|
||||||
|
target: 'novelkeys/nk65'
|
||||||
|
},
|
||||||
|
nk87: {
|
||||||
|
target: 'novelkeys/nk87'
|
||||||
|
},
|
||||||
|
nknl7en: {
|
||||||
|
target: 'salicylic_acid3/nknl7en'
|
||||||
|
},
|
||||||
|
nknl7jp: {
|
||||||
|
target: 'salicylic_acid3/nknl7jp'
|
||||||
|
},
|
||||||
|
nomu30: {
|
||||||
|
target: 'recompile_keys/nomu30'
|
||||||
|
},
|
||||||
|
novelpad: {
|
||||||
|
target: 'novelkeys/novelpad'
|
||||||
|
},
|
||||||
|
ogurec: {
|
||||||
|
target: 'drhigsby/ogurec'
|
||||||
|
},
|
||||||
|
otaku_split/rev0: {
|
||||||
|
target: 'takashiski/otaku_split/rev0'
|
||||||
|
},
|
||||||
|
otaku_split/rev1: {
|
||||||
|
target: 'takashiski/otaku_split/rev1'
|
||||||
|
},
|
||||||
|
owl8: {
|
||||||
|
target: 'dailycraft/owl8'
|
||||||
|
},
|
||||||
|
packrat: {
|
||||||
|
target: 'drhigsby/packrat'
|
||||||
|
},
|
||||||
|
pistachio: {
|
||||||
|
target: 'rate/pistachio'
|
||||||
|
},
|
||||||
|
pistachio_mp: {
|
||||||
|
target: 'rate/pistachio_mp'
|
||||||
|
},
|
||||||
|
pistachio_pro: {
|
||||||
|
target: 'rate/pistachio_pro'
|
||||||
|
},
|
||||||
|
plexus75: {
|
||||||
|
target: 'checkerboards/plexus75'
|
||||||
|
},
|
||||||
|
pursuit40: {
|
||||||
|
target: 'checkerboards/pursuit40'
|
||||||
|
},
|
||||||
|
qaz: {
|
||||||
|
target: 'tominabox1/qaz'
|
||||||
|
},
|
||||||
|
quark: {
|
||||||
|
target: 'checkerboards/quark'
|
||||||
|
},
|
||||||
|
rabbit_capture_plan: {
|
||||||
|
target: 'kakunpc/rabbit_capture_plan'
|
||||||
|
},
|
||||||
|
rainkeeb: {
|
||||||
|
target: 'rainkeebs/rainkeeb'
|
||||||
|
},
|
||||||
|
reviung33: {
|
||||||
|
target: 'reviung/reviung33'
|
||||||
|
},
|
||||||
|
reviung34: {
|
||||||
|
target: 'reviung/reviung34'
|
||||||
|
},
|
||||||
|
reviung39: {
|
||||||
|
target: 'reviung/reviung39'
|
||||||
|
},
|
||||||
|
reviung41: {
|
||||||
|
target: 'reviung/reviung41'
|
||||||
|
},
|
||||||
|
reviung5: {
|
||||||
|
target: 'reviung/reviung5'
|
||||||
|
},
|
||||||
|
reviung53: {
|
||||||
|
target: 'reviung/reviung53'
|
||||||
|
},
|
||||||
|
reviung61: {
|
||||||
|
target: 'reviung/reviung61'
|
||||||
|
},
|
||||||
|
runner3680/3x6: {
|
||||||
|
target: 'omkbd/runner3680/3x6'
|
||||||
|
},
|
||||||
|
runner3680/3x7: {
|
||||||
|
target: 'omkbd/runner3680/3x7'
|
||||||
|
},
|
||||||
|
runner3680/3x8: {
|
||||||
|
target: 'omkbd/runner3680/3x8'
|
||||||
|
},
|
||||||
|
runner3680/4x6: {
|
||||||
|
target: 'omkbd/runner3680/4x6'
|
||||||
|
},
|
||||||
|
runner3680/4x7: {
|
||||||
|
target: 'omkbd/runner3680/4x7'
|
||||||
|
},
|
||||||
|
runner3680/4x8: {
|
||||||
|
target: 'omkbd/runner3680/4x8'
|
||||||
|
},
|
||||||
|
runner3680/5x6: {
|
||||||
|
target: 'omkbd/runner3680/5x6'
|
||||||
|
},
|
||||||
|
runner3680/5x6_5x8: {
|
||||||
|
target: 'omkbd/runner3680/5x6_5x8'
|
||||||
|
},
|
||||||
|
runner3680/5x7: {
|
||||||
|
target: 'omkbd/runner3680/5x7'
|
||||||
|
},
|
||||||
|
runner3680/5x8: {
|
||||||
|
target: 'omkbd/runner3680/5x8'
|
||||||
|
},
|
||||||
|
scarletbandana: {
|
||||||
|
target: 'woodkeys/scarletbandana'
|
||||||
|
},
|
||||||
|
scythe: {
|
||||||
|
target: 'kagizaraya/scythe'
|
||||||
|
},
|
||||||
|
seigaiha: {
|
||||||
|
target: 'yiancardesigns/seigaiha'
|
||||||
|
},
|
||||||
|
setta21: {
|
||||||
|
target: 'salicylic_acid3/setta21'
|
||||||
|
},
|
||||||
|
space_space/rev1: {
|
||||||
|
target: 'qpockets/space_space/rev1'
|
||||||
|
},
|
||||||
|
space_space/rev2: {
|
||||||
|
target: 'qpockets/space_space/rev2'
|
||||||
|
},
|
||||||
|
spiderisland/winry25tc: {
|
||||||
|
target: 'winry/winry25tc'
|
||||||
|
},
|
||||||
|
splitreus62: {
|
||||||
|
target: 'nacly/splitreus62'
|
||||||
|
},
|
||||||
|
squiggle/rev1: {
|
||||||
|
target: 'ibnuda/squiggle/rev1'
|
||||||
|
},
|
||||||
|
standaside: {
|
||||||
|
target: 'edi/standaside'
|
||||||
|
},
|
||||||
|
steal_this_keyboard: {
|
||||||
|
target: 'obosob/steal_this_keyboard'
|
||||||
|
},
|
||||||
|
stella: {
|
||||||
|
target: 'hnahkb/stella'
|
||||||
|
},
|
||||||
|
suihankey/alpha: {
|
||||||
|
target: 'kakunpc/suihankey/alpha'
|
||||||
|
},
|
||||||
|
suihankey/rev1: {
|
||||||
|
target: 'kakunpc/suihankey/rev1'
|
||||||
|
},
|
||||||
|
suihankey/split: {
|
||||||
|
target: 'kakunpc/suihankey/split'
|
||||||
|
},
|
||||||
|
the_ruler: {
|
||||||
|
target: 'maple_computing/the_ruler'
|
||||||
|
},
|
||||||
|
thedogkeyboard: {
|
||||||
|
target: 'kakunpc/thedogkeyboard'
|
||||||
|
},
|
||||||
|
tiger910: {
|
||||||
|
target: 'weirdo/tiger910'
|
||||||
|
},
|
||||||
|
treadstone32: {
|
||||||
|
target: 'marksard/treadstone32'
|
||||||
|
},
|
||||||
|
treadstone48/rev1: {
|
||||||
|
target: 'marksard/treadstone48/rev1'
|
||||||
|
},
|
||||||
|
treadstone48/rev2: {
|
||||||
|
target: 'marksard/treadstone48/rev2'
|
||||||
|
},
|
||||||
|
txuu: {
|
||||||
|
target: 'matthewdias/txuu'
|
||||||
|
},
|
||||||
|
ua62: {
|
||||||
|
target: 'nacly/ua62'
|
||||||
|
},
|
||||||
|
underscore33/rev1: {
|
||||||
|
target: 'tominabox1/underscore33/rev1'
|
||||||
|
},
|
||||||
|
underscore33/rev2: {
|
||||||
|
target: 'tominabox1/underscore33/rev2'
|
||||||
|
},
|
||||||
|
vn66: {
|
||||||
|
target: 'hnahkb/vn66'
|
||||||
|
},
|
||||||
|
wallaby: {
|
||||||
|
target: 'kkatano/wallaby'
|
||||||
|
},
|
||||||
|
wanten: {
|
||||||
|
target: 'qpockets/wanten'
|
||||||
|
},
|
||||||
|
whitefox: {
|
||||||
|
target: 'input_club/whitefox'
|
||||||
|
},
|
||||||
|
wings42/rev1: {
|
||||||
|
target: 'dailycraft/wings42/rev1'
|
||||||
|
},
|
||||||
|
wings42/rev1_extkeys: {
|
||||||
|
target: 'dailycraft/wings42/rev1_extkeys'
|
||||||
|
},
|
||||||
|
wings42/rev2: {
|
||||||
|
target: 'dailycraft/wings42/rev2'
|
||||||
|
},
|
||||||
|
yasui: {
|
||||||
|
target: 'rainkeebs/yasui'
|
||||||
|
},
|
||||||
|
yd60mq: {
|
||||||
|
target: 'ymdk/yd60mq'
|
||||||
|
},
|
||||||
|
yd68: {
|
||||||
|
target: 'ydkb/yd68'
|
||||||
|
},
|
||||||
|
ymd75: {
|
||||||
|
target: 'ymdk/ymd75'
|
||||||
|
},
|
||||||
|
ymd96: {
|
||||||
|
target: 'ymdk/ymd96'
|
||||||
|
},
|
||||||
|
ymdk_np21: {
|
||||||
|
target: 'ymdk/np21'
|
||||||
|
},
|
||||||
|
yurei: {
|
||||||
|
target: 'kkatano/yurei'
|
||||||
|
},
|
||||||
|
zinc: {
|
||||||
|
target: '25keys/zinc'
|
||||||
|
},
|
||||||
|
zinc/rev1: {
|
||||||
|
target: '25keys/zinc/rev1'
|
||||||
|
},
|
||||||
|
zinc/reva: {
|
||||||
|
target: '25keys/zinc/reva'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,10 @@
|
|||||||
"type": "string",
|
"type": "string",
|
||||||
"pattern": "^0x[0-9A-F]{4}$"
|
"pattern": "^0x[0-9A-F]{4}$"
|
||||||
},
|
},
|
||||||
|
"bcd_version": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[0-9]{1,2}\\.[0-9]\\.[0-9]$"
|
||||||
|
},
|
||||||
"text_identifier": {
|
"text_identifier": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"minLength": 1,
|
"minLength": 1,
|
||||||
@ -29,7 +33,33 @@
|
|||||||
"oneOf": [
|
"oneOf": [
|
||||||
{
|
{
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": ["LAYOUT", "LAYOUT_planck_1x2uC"]
|
"enum": [
|
||||||
|
"LAYOUT",
|
||||||
|
"LAYOUT_1x2uC",
|
||||||
|
"LAYOUT_1x2uL",
|
||||||
|
"LAYOUT_1x2uR",
|
||||||
|
"LAYOUT_2x2uC",
|
||||||
|
"LAYOUT_2x3uC",
|
||||||
|
"LAYOUT_625uC",
|
||||||
|
"LAYOUT_ANSI_DEFAULT",
|
||||||
|
"LAYOUT_JP",
|
||||||
|
"LAYOUT_ortho_3x12_1x2uC",
|
||||||
|
"LAYOUT_ortho_4x12_1x2uC",
|
||||||
|
"LAYOUT_ortho_4x12_1x2uL",
|
||||||
|
"LAYOUT_ortho_4x12_1x2uR",
|
||||||
|
"LAYOUT_ortho_5x12_1x2uC",
|
||||||
|
"LAYOUT_ortho_5x12_2x2uC",
|
||||||
|
"LAYOUT_ortho_5x14_1x2uC",
|
||||||
|
"LAYOUT_ortho_5x14_1x2uL",
|
||||||
|
"LAYOUT_ortho_5x14_1x2uR",
|
||||||
|
"LAYOUT_planck_1x2uC",
|
||||||
|
"LAYOUT_planck_1x2uL",
|
||||||
|
"LAYOUT_planck_1x2uR",
|
||||||
|
"LAYOUT_preonic_1x2uC",
|
||||||
|
"LAYOUT_preonic_1x2uL",
|
||||||
|
"LAYOUT_preonic_1x2uR",
|
||||||
|
"LAYOUT_reviung34_2uL"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "string",
|
"type": "string",
|
||||||
@ -47,6 +77,10 @@
|
|||||||
},
|
},
|
||||||
"mcu_pin": {
|
"mcu_pin": {
|
||||||
"oneOf": [
|
"oneOf": [
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["NO_PIN"]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"pattern": "^[A-K]\\d{1,2}$"
|
"pattern": "^[A-K]\\d{1,2}$"
|
||||||
@ -70,13 +104,13 @@
|
|||||||
"signed_int": {
|
"signed_int": {
|
||||||
"type": "number",
|
"type": "number",
|
||||||
"multipleOf": 1
|
"multipleOf": 1
|
||||||
}
|
},
|
||||||
"signed_int_8": {
|
"signed_int_8": {
|
||||||
"type": "number",
|
"type": "number",
|
||||||
"min": -127,
|
"min": -127,
|
||||||
"max": 127,
|
"max": 127,
|
||||||
"multipleOf": 1
|
"multipleOf": 1
|
||||||
}
|
},
|
||||||
"string_array": {
|
"string_array": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
@ -97,7 +131,7 @@
|
|||||||
"type": "number",
|
"type": "number",
|
||||||
"min": 0,
|
"min": 0,
|
||||||
"multipleOf": 1
|
"multipleOf": 1
|
||||||
}
|
},
|
||||||
"unsigned_int_8": {
|
"unsigned_int_8": {
|
||||||
"type": "number",
|
"type": "number",
|
||||||
"min": 0,
|
"min": 0,
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
},
|
},
|
||||||
"processor": {
|
"processor": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": ["cortex-m0", "cortex-m0plus", "cortex-m3", "cortex-m4", "MKL26Z64", "MK20DX128", "MK20DX256", "MK66FX1M0", "STM32F042", "STM32F072", "STM32F103", "STM32F303", "STM32F401", "STM32F405", "STM32F407", "STM32F411", "STM32F446", "STM32G431", "STM32G474", "STM32L412", "STM32L422", "STM32L433", "STM32L443", "GD32VF103", "WB32F3G71", "atmega16u2", "atmega32u2", "atmega16u4", "atmega32u4", "at90usb162", "at90usb646", "at90usb647", "at90usb1286", "at90usb1287", "atmega32a", "atmega328p", "atmega328", "attiny85", "unknown"]
|
"enum": ["cortex-m0", "cortex-m0plus", "cortex-m3", "cortex-m4", "MKL26Z64", "MK20DX128", "MK20DX256", "MK66FX1M0", "STM32F042", "STM32F072", "STM32F103", "STM32F303", "STM32F401", "STM32F405", "STM32F407", "STM32F411", "STM32F446", "STM32G431", "STM32G474", "STM32L412", "STM32L422", "STM32L432", "STM32L433", "STM32L442", "STM32L443", "GD32VF103", "WB32F3G71", "atmega16u2", "atmega32u2", "atmega16u4", "atmega32u4", "at90usb162", "at90usb646", "at90usb647", "at90usb1286", "at90usb1287", "atmega32a", "atmega328p", "atmega328", "attiny85", "unknown"]
|
||||||
},
|
},
|
||||||
"audio": {
|
"audio": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
@ -45,7 +45,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"driver": {
|
"driver": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": ["AdafruitBLE", "RN42"]
|
"enum": ["BluefruitLE", "RN42"]
|
||||||
},
|
},
|
||||||
"lto": {"type": "boolean"},
|
"lto": {"type": "boolean"},
|
||||||
}
|
}
|
||||||
@ -57,7 +57,7 @@
|
|||||||
},
|
},
|
||||||
"bootloader": {
|
"bootloader": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": ["atmel-dfu", "bootloadhid", "bootloadHID", "caterina", "halfkay", "kiibohd", "lufa-dfu", "lufa-ms", "micronucleus", "qmk-dfu", "qmk-hid", "stm32-dfu", "stm32duino", "gd32v-dfu", "wb32-dfu", "unknown", "usbasploader", "USBasp", "tinyuf2", "vibl"],
|
"enum": ["atmel-dfu", "bootloadhid", "bootloadHID", "custom", "caterina", "halfkay", "kiibohd", "lufa-dfu", "lufa-ms", "md-boot", "qmk-dfu", "qmk-hid", "stm32-dfu", "stm32duino", "gd32v-dfu", "wb32-dfu", "unknown", "usbasploader", "USBasp", "tinyuf2", "vibl"],
|
||||||
},
|
},
|
||||||
"bootloader_instructions": {
|
"bootloader_instructions": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
@ -69,7 +69,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"debounce_type": {
|
"debounce_type": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": ["custom", "eager_pk", "eager_pr", "sym_defer_pk", "sym_eager_pk"]
|
"enum": ["custom", "eager_pk", "eager_pr", "sym_defer_pk", "sym_defer_pr", "sym_eager_pk"]
|
||||||
},
|
},
|
||||||
"firmware_format": {
|
"firmware_format": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
@ -109,6 +109,7 @@
|
|||||||
},
|
},
|
||||||
"layouts": {
|
"layouts": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
|
"propertyNames": {"$ref": "qmk.definitions.v1#/layout_macro"},
|
||||||
"additionalProperties": {
|
"additionalProperties": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
@ -320,7 +321,8 @@
|
|||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"properties": {
|
"properties": {
|
||||||
"device_ver": {"$ref": "qmk.definitions.v1#/hex_number_4d"},
|
"device_ver": {"$ref": "qmk.definitions.v1#/hex_number_4d"}, # Deprecated
|
||||||
|
"device_version": {"$ref": "qmk.definitions.v1#/bcd_version"},
|
||||||
"force_nkro": {"type": "boolean"},
|
"force_nkro": {"type": "boolean"},
|
||||||
"pid": {"$ref": "qmk.definitions.v1#/hex_number_4d"},
|
"pid": {"$ref": "qmk.definitions.v1#/hex_number_4d"},
|
||||||
"vid": {"$ref": "qmk.definitions.v1#/hex_number_4d"},
|
"vid": {"$ref": "qmk.definitions.v1#/hex_number_4d"},
|
||||||
|
@ -53,5 +53,10 @@
|
|||||||
"type": "string",
|
"type": "string",
|
||||||
"description": "asdf"
|
"description": "asdf"
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"required": [
|
||||||
|
"keyboard",
|
||||||
|
"layout",
|
||||||
|
"layers"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
@ -1,138 +0,0 @@
|
|||||||
// Copyright %(YEAR)s %(YOUR_NAME)s (@%(USER_NAME)s)
|
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "config_common.h"
|
|
||||||
|
|
||||||
/* USB Device descriptor parameter */
|
|
||||||
#define VENDOR_ID 0xFEED
|
|
||||||
#define PRODUCT_ID 0x0000
|
|
||||||
#define DEVICE_VER 0x0001
|
|
||||||
#define MANUFACTURER %(USER_NAME)s
|
|
||||||
#define PRODUCT %(KEYBOARD)s
|
|
||||||
|
|
||||||
/* key matrix size */
|
|
||||||
#define MATRIX_ROWS 2
|
|
||||||
#define MATRIX_COLS 3
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Keyboard Matrix Assignments
|
|
||||||
*
|
|
||||||
* Change this to how you wired your keyboard
|
|
||||||
* COLS: AVR pins used for columns, left to right
|
|
||||||
* ROWS: AVR pins used for rows, top to bottom
|
|
||||||
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
|
|
||||||
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#define MATRIX_ROW_PINS { D0, D5 }
|
|
||||||
#define MATRIX_COL_PINS { F1, F0, B0 }
|
|
||||||
#define UNUSED_PINS
|
|
||||||
|
|
||||||
/* COL2ROW, ROW2COL */
|
|
||||||
#define DIODE_DIRECTION COL2ROW
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Split Keyboard specific options, make sure you have 'SPLIT_KEYBOARD = yes' in your rules.mk, and define SOFT_SERIAL_PIN.
|
|
||||||
*/
|
|
||||||
#define SOFT_SERIAL_PIN D0 // or D1, D2, D3, E6
|
|
||||||
|
|
||||||
//#define LED_NUM_LOCK_PIN B0
|
|
||||||
//#define LED_CAPS_LOCK_PIN B1
|
|
||||||
//#define LED_SCROLL_LOCK_PIN B2
|
|
||||||
//#define LED_COMPOSE_PIN B3
|
|
||||||
//#define LED_KANA_PIN B4
|
|
||||||
|
|
||||||
//#define BACKLIGHT_PIN B7
|
|
||||||
//#define BACKLIGHT_LEVELS 3
|
|
||||||
//#define BACKLIGHT_BREATHING
|
|
||||||
|
|
||||||
//#define RGB_DI_PIN E2
|
|
||||||
//#ifdef RGB_DI_PIN
|
|
||||||
//# define RGBLED_NUM 16
|
|
||||||
//# define RGBLIGHT_HUE_STEP 8
|
|
||||||
//# define RGBLIGHT_SAT_STEP 8
|
|
||||||
//# define RGBLIGHT_VAL_STEP 8
|
|
||||||
//# define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */
|
|
||||||
//# define RGBLIGHT_SLEEP /* If defined, the RGB lighting will be switched off when the host goes to sleep */
|
|
||||||
/*== all animations enable ==*/
|
|
||||||
//# define RGBLIGHT_ANIMATIONS
|
|
||||||
/*== or choose animations ==*/
|
|
||||||
//# define RGBLIGHT_EFFECT_BREATHING
|
|
||||||
//# define RGBLIGHT_EFFECT_RAINBOW_MOOD
|
|
||||||
//# define RGBLIGHT_EFFECT_RAINBOW_SWIRL
|
|
||||||
//# define RGBLIGHT_EFFECT_SNAKE
|
|
||||||
//# define RGBLIGHT_EFFECT_KNIGHT
|
|
||||||
//# define RGBLIGHT_EFFECT_CHRISTMAS
|
|
||||||
//# define RGBLIGHT_EFFECT_STATIC_GRADIENT
|
|
||||||
//# define RGBLIGHT_EFFECT_RGB_TEST
|
|
||||||
//# define RGBLIGHT_EFFECT_ALTERNATING
|
|
||||||
/*== customize breathing effect ==*/
|
|
||||||
/*==== (DEFAULT) use fixed table instead of exp() and sin() ====*/
|
|
||||||
//# define RGBLIGHT_BREATHE_TABLE_SIZE 256 // 256(default) or 128 or 64
|
|
||||||
/*==== use exp() and sin() ====*/
|
|
||||||
//# define RGBLIGHT_EFFECT_BREATHE_CENTER 1.85 // 1 to 2.7
|
|
||||||
//# define RGBLIGHT_EFFECT_BREATHE_MAX 255 // 0 to 255
|
|
||||||
//#endif
|
|
||||||
|
|
||||||
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
|
|
||||||
#define DEBOUNCE 5
|
|
||||||
|
|
||||||
/* define if matrix has ghost (lacks anti-ghosting diodes) */
|
|
||||||
//#define MATRIX_HAS_GHOST
|
|
||||||
|
|
||||||
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
|
|
||||||
#define LOCKING_SUPPORT_ENABLE
|
|
||||||
/* Locking resynchronize hack */
|
|
||||||
#define LOCKING_RESYNC_ENABLE
|
|
||||||
|
|
||||||
/* If defined, GRAVE_ESC will always act as ESC when CTRL is held.
|
|
||||||
* This is useful for the Windows task manager shortcut (ctrl+shift+esc).
|
|
||||||
*/
|
|
||||||
//#define GRAVE_ESC_CTRL_OVERRIDE
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Force NKRO
|
|
||||||
*
|
|
||||||
* Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
|
|
||||||
* state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
|
|
||||||
* makefile for this to work.)
|
|
||||||
*
|
|
||||||
* If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
|
|
||||||
* until the next keyboard reset.
|
|
||||||
*
|
|
||||||
* NKRO may prevent your keystrokes from being detected in the BIOS, but it is
|
|
||||||
* fully operational during normal computer usage.
|
|
||||||
*
|
|
||||||
* For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
|
|
||||||
* or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
|
|
||||||
* bootmagic, NKRO mode will always be enabled until it is toggled again during a
|
|
||||||
* power-up.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
//#define FORCE_NKRO
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Feature disable options
|
|
||||||
* These options are also useful to firmware size reduction.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* disable debug print */
|
|
||||||
//#define NO_DEBUG
|
|
||||||
|
|
||||||
/* disable print */
|
|
||||||
//#define NO_PRINT
|
|
||||||
|
|
||||||
/* disable action features */
|
|
||||||
//#define NO_ACTION_LAYER
|
|
||||||
//#define NO_ACTION_TAPPING
|
|
||||||
//#define NO_ACTION_ONESHOT
|
|
||||||
|
|
||||||
/* disable these deprecated features by default */
|
|
||||||
#define NO_ACTION_MACRO
|
|
||||||
#define NO_ACTION_FUNCTION
|
|
||||||
|
|
||||||
/* Bootmagic Lite key configuration */
|
|
||||||
//#define BOOTMAGIC_LITE_ROW 0
|
|
||||||
//#define BOOTMAGIC_LITE_COLUMN 0
|
|
@ -1,27 +0,0 @@
|
|||||||
# %(KEYBOARD)s
|
|
||||||
|
|
||||||
![%(KEYBOARD)s](imgur.com image replace me!)
|
|
||||||
|
|
||||||
*A short description of the keyboard/project*
|
|
||||||
|
|
||||||
* Keyboard Maintainer: [%(YOUR_NAME)s](https://github.com/%(USER_NAME)s)
|
|
||||||
* Hardware Supported: *The PCBs, controllers supported*
|
|
||||||
* Hardware Availability: *Links to where you can find this hardware*
|
|
||||||
|
|
||||||
Make example for this keyboard (after setting up your build environment):
|
|
||||||
|
|
||||||
make %(KEYBOARD)s:default
|
|
||||||
|
|
||||||
Flashing example for this keyboard:
|
|
||||||
|
|
||||||
make %(KEYBOARD)s:default:flash
|
|
||||||
|
|
||||||
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
|
|
||||||
|
|
||||||
## Bootloader
|
|
||||||
|
|
||||||
Enter the bootloader in 3 ways:
|
|
||||||
|
|
||||||
* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
|
|
||||||
* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead
|
|
||||||
* **Keycode in layout**: Press the key mapped to `RESET` if it is available
|
|
@ -1,4 +0,0 @@
|
|||||||
// Copyright %(YEAR)s %(YOUR_NAME)s (@%(USER_NAME)s)
|
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
#include "%(KEYBOARD)s.h"
|
|
@ -1,22 +0,0 @@
|
|||||||
// Copyright %(YEAR)s %(YOUR_NAME)s (@%(USER_NAME)s)
|
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "quantum.h"
|
|
||||||
|
|
||||||
/* This is a shortcut to help you visually see your layout.
|
|
||||||
*
|
|
||||||
* The first section contains all of the arguments representing the physical
|
|
||||||
* layout of the board and position of the keys.
|
|
||||||
*
|
|
||||||
* The second converts the arguments into a two-dimensional array which
|
|
||||||
* represents the switch matrix.
|
|
||||||
*/
|
|
||||||
#define LAYOUT( \
|
|
||||||
k00, k01, k02, \
|
|
||||||
k10, k12 \
|
|
||||||
) { \
|
|
||||||
{ k00, k01, k02 }, \
|
|
||||||
{ k10, KC_NO, k12 } \
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
{
|
|
||||||
"keyboard_name": "%(KEYBOARD)s",
|
|
||||||
"url": "",
|
|
||||||
"maintainer": "%(USER_NAME)s",
|
|
||||||
"layouts": {
|
|
||||||
"LAYOUT": {
|
|
||||||
"layout": [
|
|
||||||
{"label": "k00", "x": 0, "y": 0},
|
|
||||||
{"label": "k01", "x": 1, "y": 0},
|
|
||||||
{"label": "k02", "x": 2, "y": 0},
|
|
||||||
|
|
||||||
{"label": "k10", "x": 0, "y": 1, "w": 1.5},
|
|
||||||
{"label": "k12", "x": 1.5, "y": 1, "w": 1.5}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
// Copyright %(YEAR)s %(YOUR_NAME)s (@%(USER_NAME)s)
|
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
#include QMK_KEYBOARD_H
|
|
||||||
|
|
||||||
// Defines names for use in layer keycodes and the keymap
|
|
||||||
enum layer_names {
|
|
||||||
_BASE,
|
|
||||||
_FN
|
|
||||||
};
|
|
||||||
|
|
||||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|
||||||
/* Base */
|
|
||||||
[_BASE] = LAYOUT(
|
|
||||||
KC_A, KC_1, MO(_FN),
|
|
||||||
KC_TAB, KC_SPC
|
|
||||||
),
|
|
||||||
[_FN] = LAYOUT(
|
|
||||||
_______, _______, _______,
|
|
||||||
RESET, XXXXXXX
|
|
||||||
)
|
|
||||||
};
|
|
@ -1 +0,0 @@
|
|||||||
# The default keymap for %(KEYBOARD)s
|
|
20
data/templates/keyboard/config.h
Normal file
20
data/templates/keyboard/config.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
// Copyright %YEAR% %REAL_NAME% (@%USER_NAME%)
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Feature disable options
|
||||||
|
* These options are also useful to firmware size reduction.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* disable debug print */
|
||||||
|
//#define NO_DEBUG
|
||||||
|
|
||||||
|
/* disable print */
|
||||||
|
//#define NO_PRINT
|
||||||
|
|
||||||
|
/* disable action features */
|
||||||
|
//#define NO_ACTION_LAYER
|
||||||
|
//#define NO_ACTION_TAPPING
|
||||||
|
//#define NO_ACTION_ONESHOT
|
25
data/templates/keyboard/info.json
Normal file
25
data/templates/keyboard/info.json
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"keyboard_name": "%KEYBOARD%",
|
||||||
|
"maintainer": "%USER_NAME%",
|
||||||
|
"manufacturer": "%REAL_NAME%",
|
||||||
|
"processor": "%MCU%",
|
||||||
|
"bootloader": "%BOOTLOADER%",
|
||||||
|
"diode_direction": "COL2ROW",
|
||||||
|
"matrix_pins": {
|
||||||
|
"cols": ["C2"],
|
||||||
|
"rows": ["D1"]
|
||||||
|
},
|
||||||
|
"usb": {
|
||||||
|
"vid": "0xFEED",
|
||||||
|
"pid": "0x0000",
|
||||||
|
"device_version": "1.0.0"
|
||||||
|
},
|
||||||
|
"features": {
|
||||||
|
"bootmagic": true,
|
||||||
|
"command": false,
|
||||||
|
"console": false,
|
||||||
|
"extrakey": true,
|
||||||
|
"mousekey": true,
|
||||||
|
"nkro": true
|
||||||
|
}
|
||||||
|
}
|
27
data/templates/keyboard/readme.md
Normal file
27
data/templates/keyboard/readme.md
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
# %KEYBOARD%
|
||||||
|
|
||||||
|
![%KEYBOARD%](imgur.com image replace me!)
|
||||||
|
|
||||||
|
*A short description of the keyboard/project*
|
||||||
|
|
||||||
|
* Keyboard Maintainer: [%REAL_NAME%](https://github.com/%USER_NAME%)
|
||||||
|
* Hardware Supported: *The PCBs, controllers supported*
|
||||||
|
* Hardware Availability: *Links to where you can find this hardware*
|
||||||
|
|
||||||
|
Make example for this keyboard (after setting up your build environment):
|
||||||
|
|
||||||
|
make %KEYBOARD%:default
|
||||||
|
|
||||||
|
Flashing example for this keyboard:
|
||||||
|
|
||||||
|
make %KEYBOARD%:default:flash
|
||||||
|
|
||||||
|
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
|
||||||
|
|
||||||
|
## Bootloader
|
||||||
|
|
||||||
|
Enter the bootloader in 3 ways:
|
||||||
|
|
||||||
|
* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
|
||||||
|
* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead
|
||||||
|
* **Keycode in layout**: Press the key mapped to `RESET` if it is available
|
1
data/templates/keyboard/rules.mk
Normal file
1
data/templates/keyboard/rules.mk
Normal file
@ -0,0 +1 @@
|
|||||||
|
# This file intentionally left blank
|
@ -1,128 +0,0 @@
|
|||||||
// Copyright %(YEAR)s %(YOUR_NAME)s (@%(USER_NAME)s)
|
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "config_common.h"
|
|
||||||
|
|
||||||
/* USB Device descriptor parameter */
|
|
||||||
#define VENDOR_ID 0xFEED
|
|
||||||
#define PRODUCT_ID 0x0000
|
|
||||||
#define DEVICE_VER 0x0001
|
|
||||||
#define MANUFACTURER %(USER_NAME)s
|
|
||||||
#define PRODUCT %(KEYBOARD)s
|
|
||||||
|
|
||||||
/* key matrix size */
|
|
||||||
#define MATRIX_ROWS 8
|
|
||||||
#define MATRIX_COLS 15
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Keyboard Matrix Assignments
|
|
||||||
*
|
|
||||||
* Change this to how you wired your keyboard
|
|
||||||
* COLS: AVR pins used for columns, left to right
|
|
||||||
* ROWS: AVR pins used for rows, top to bottom
|
|
||||||
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
|
|
||||||
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#define MATRIX_ROW_PINS { B0, B1, B2, B3, B4, B5, B6, B7 }
|
|
||||||
#define MATRIX_COL_PINS { A0, A1, A2, A3, A4, A5, A6, A7, C7, C6, C5, C4, C3, C2, D7 }
|
|
||||||
#define UNUSED_PINS
|
|
||||||
|
|
||||||
/* COL2ROW, ROW2COL */
|
|
||||||
#define DIODE_DIRECTION COL2ROW
|
|
||||||
|
|
||||||
//#define LED_NUM_LOCK_PIN D0
|
|
||||||
//#define LED_CAPS_LOCK_PIN D1
|
|
||||||
//#define LED_SCROLL_LOCK_PIN D6
|
|
||||||
|
|
||||||
#define BACKLIGHT_PIN D4
|
|
||||||
//#define BACKLIGHT_LEVELS 3
|
|
||||||
//#define BACKLIGHT_BREATHING
|
|
||||||
|
|
||||||
#define RGBLED_NUM 16
|
|
||||||
//#define RGBLIGHT_HUE_STEP 8
|
|
||||||
//#define RGBLIGHT_SAT_STEP 8
|
|
||||||
//#define RGBLIGHT_VAL_STEP 8
|
|
||||||
//#define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */
|
|
||||||
//#define RGBLIGHT_SLEEP /* If defined, the RGB lighting will be switched off when the host goes to sleep */
|
|
||||||
/*== all animations enable ==*/
|
|
||||||
//#define RGBLIGHT_ANIMATIONS
|
|
||||||
/*== or choose animations ==*/
|
|
||||||
//#define RGBLIGHT_EFFECT_BREATHING
|
|
||||||
//#define RGBLIGHT_EFFECT_RAINBOW_MOOD
|
|
||||||
//#define RGBLIGHT_EFFECT_RAINBOW_SWIRL
|
|
||||||
//#define RGBLIGHT_EFFECT_SNAKE
|
|
||||||
//#define RGBLIGHT_EFFECT_KNIGHT
|
|
||||||
//#define RGBLIGHT_EFFECT_CHRISTMAS
|
|
||||||
//#define RGBLIGHT_EFFECT_STATIC_GRADIENT
|
|
||||||
//#define RGBLIGHT_EFFECT_RGB_TEST
|
|
||||||
//#define RGBLIGHT_EFFECT_ALTERNATING
|
|
||||||
/*== customize breathing effect ==*/
|
|
||||||
/*==== (DEFAULT) use fixed table instead of exp() and sin() ====*/
|
|
||||||
//#define RGBLIGHT_BREATHE_TABLE_SIZE 256 // 256(default) or 128 or 64
|
|
||||||
/*==== use exp() and sin() ====*/
|
|
||||||
//#define RGBLIGHT_EFFECT_BREATHE_CENTER 1.85 // 1 to 2.7
|
|
||||||
//#define RGBLIGHT_EFFECT_BREATHE_MAX 255 // 0 to 255
|
|
||||||
|
|
||||||
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
|
|
||||||
#define DEBOUNCE 5
|
|
||||||
|
|
||||||
/* define if matrix has ghost (lacks anti-ghosting diodes) */
|
|
||||||
//#define MATRIX_HAS_GHOST
|
|
||||||
|
|
||||||
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
|
|
||||||
#define LOCKING_SUPPORT_ENABLE
|
|
||||||
/* Locking resynchronize hack */
|
|
||||||
#define LOCKING_RESYNC_ENABLE
|
|
||||||
|
|
||||||
/* If defined, GRAVE_ESC will always act as ESC when CTRL is held.
|
|
||||||
* This is useful for the Windows task manager shortcut (ctrl+shift+esc).
|
|
||||||
*/
|
|
||||||
//#define GRAVE_ESC_CTRL_OVERRIDE
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Force NKRO
|
|
||||||
*
|
|
||||||
* Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
|
|
||||||
* state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
|
|
||||||
* makefile for this to work.)
|
|
||||||
*
|
|
||||||
* If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
|
|
||||||
* until the next keyboard reset.
|
|
||||||
*
|
|
||||||
* NKRO may prevent your keystrokes from being detected in the BIOS, but it is
|
|
||||||
* fully operational during normal computer usage.
|
|
||||||
*
|
|
||||||
* For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
|
|
||||||
* or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
|
|
||||||
* bootmagic, NKRO mode will always be enabled until it is toggled again during a
|
|
||||||
* power-up.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
//#define FORCE_NKRO
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Feature disable options
|
|
||||||
* These options are also useful to firmware size reduction.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* disable debug print */
|
|
||||||
//#define NO_DEBUG
|
|
||||||
|
|
||||||
/* disable print */
|
|
||||||
//#define NO_PRINT
|
|
||||||
|
|
||||||
/* disable action features */
|
|
||||||
//#define NO_ACTION_LAYER
|
|
||||||
//#define NO_ACTION_TAPPING
|
|
||||||
//#define NO_ACTION_ONESHOT
|
|
||||||
|
|
||||||
/* disable these deprecated features by default */
|
|
||||||
#define NO_ACTION_MACRO
|
|
||||||
#define NO_ACTION_FUNCTION
|
|
||||||
|
|
||||||
/* Bootmagic Lite key configuration */
|
|
||||||
//#define BOOTMAGIC_LITE_ROW 0
|
|
||||||
//#define BOOTMAGIC_LITE_COLUMN 0
|
|
@ -1,28 +0,0 @@
|
|||||||
# %(KEYBOARD)s
|
|
||||||
|
|
||||||
![%(KEYBOARD)s](imgur.com image replace me!)
|
|
||||||
|
|
||||||
*A short description of the keyboard/project*
|
|
||||||
|
|
||||||
* Keyboard Maintainer: [%(YOUR_NAME)s](https://github.com/yourusername)
|
|
||||||
* Hardware Supported: *The PCBs, controllers supported*
|
|
||||||
* Hardware Availability: *Links to where you can find this hardware*
|
|
||||||
|
|
||||||
Make example for this keyboard (after setting up your build environment):
|
|
||||||
|
|
||||||
make %(KEYBOARD)s:default
|
|
||||||
|
|
||||||
Flashing example for this keyboard ([after setting up the bootloadHID flashing environment](https://docs.qmk.fm/#/flashing_bootloadhid))
|
|
||||||
|
|
||||||
make %(KEYBOARD)s:default:flash
|
|
||||||
|
|
||||||
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
|
|
||||||
|
|
||||||
## Bootloader
|
|
||||||
|
|
||||||
Enter the bootloader in 3 ways:
|
|
||||||
|
|
||||||
* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
|
|
||||||
* **BootloadHID reset**: Hold down the key connected to the `A0` and `B0` pins on the MCU if it is known (often top left or bottom left) and plug in the keyboard
|
|
||||||
* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead
|
|
||||||
* **Keycode in layout**: Press the key mapped to `RESET` if it is available
|
|
@ -1,17 +0,0 @@
|
|||||||
# MCU name
|
|
||||||
MCU = atmega32a
|
|
||||||
|
|
||||||
# Bootloader selection
|
|
||||||
BOOTLOADER = bootloadhid
|
|
||||||
|
|
||||||
# Build Options
|
|
||||||
# change yes to no to disable
|
|
||||||
#
|
|
||||||
BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
|
|
||||||
MOUSEKEY_ENABLE = yes # Mouse keys
|
|
||||||
EXTRAKEY_ENABLE = yes # Audio control and System control
|
|
||||||
CONSOLE_ENABLE = no # Console for debug
|
|
||||||
COMMAND_ENABLE = no # Commands for debug and configuration
|
|
||||||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
|
|
||||||
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
|
|
||||||
WS2812_DRIVER = i2c
|
|
489
docs/ChangeLog/20220226.md
Normal file
489
docs/ChangeLog/20220226.md
Normal file
@ -0,0 +1,489 @@
|
|||||||
|
# QMK Breaking Changes - 2022 February 26 Changelog
|
||||||
|
|
||||||
|
## Notable Features :id=notable-features
|
||||||
|
|
||||||
|
### Default USB Polling rate now 1kHz ([#15352](https://github.com/qmk/qmk_firmware/pull/15352))
|
||||||
|
|
||||||
|
The default USB Polling rate has been aligned across supported platforms to now be 1ms/1kHz.
|
||||||
|
|
||||||
|
Something something *Lets go gamers!*
|
||||||
|
|
||||||
|
### Split support for pointing devices ([#15304](https://github.com/qmk/qmk_firmware/pull/15304))
|
||||||
|
|
||||||
|
Pointing devices can now be shared across a split keyboard with support for a single pointing device or a pointing device on each side.
|
||||||
|
|
||||||
|
See the [Pointing Device](feature_pointing_device.md) documentation for further configuration options.
|
||||||
|
|
||||||
|
## Changes Requiring User Action :id=changes-requiring-user-action
|
||||||
|
|
||||||
|
### Legacy macro and action_function system removed ([#16025](https://github.com/qmk/qmk_firmware/pull/16025))
|
||||||
|
|
||||||
|
The long time deprecated `MACRO()` and `action_get_macro` methods have been removed. Where possible, existing usages have been migrated over to core [Macros](feature_macros.md).
|
||||||
|
|
||||||
|
### Create a build error if no bootloader is specified ([#16181](https://github.com/qmk/qmk_firmware/pull/16181))
|
||||||
|
|
||||||
|
Bootloader configuration is no longer assumed. Keyboards must now set either:
|
||||||
|
|
||||||
|
* `BOOTLOADER` within `rules.mk`
|
||||||
|
* `bootloader` within `info.json`
|
||||||
|
|
||||||
|
### Rename `AdafruitBLE` to `BluefruitLE` ([#16127](https://github.com/qmk/qmk_firmware/pull/16127))
|
||||||
|
|
||||||
|
In preparation of future bluetooth work, the `AdafruitBLE` integration has been renamed to allow potential for any other Adafruit BLE products.
|
||||||
|
|
||||||
|
### Updated Keyboard Codebases :id=updated-keyboard-codebases
|
||||||
|
|
||||||
|
The following keyboards have had their source moved within QMK:
|
||||||
|
|
||||||
|
| Old Keyboard Name | New Keyboard Name |
|
||||||
|
|----------------------------|------------------------------------|
|
||||||
|
| 6ball | maple_computing/6ball |
|
||||||
|
| 7skb | salicylic_acid3/7skb |
|
||||||
|
| 7splus | salicylic_acid3/7splus |
|
||||||
|
| acr60 | mechkeys/acr60 |
|
||||||
|
| adalyn | tominabox1/adalyn |
|
||||||
|
| ajisai74 | salicylic_acid3/ajisai74 |
|
||||||
|
| aleth42 | 25keys/aleth42 |
|
||||||
|
| alicia_cook | ibnuda/alicia_cook |
|
||||||
|
| allison_numpad | prototypist/allison_numpad |
|
||||||
|
| allison | prototypist/allison |
|
||||||
|
| alu84 | mechkeys/alu84 |
|
||||||
|
| angel17 | kakunpc/angel17 |
|
||||||
|
| angel64/alpha | kakunpc/angel64/alpha |
|
||||||
|
| angel64/rev1 | kakunpc/angel64/rev1 |
|
||||||
|
| arch_36 | obosob/arch_36 |
|
||||||
|
| bakeneko60 | kkatano/bakeneko60 |
|
||||||
|
| bakeneko65/rev2 | kkatano/bakeneko65/rev2 |
|
||||||
|
| bakeneko65/rev3 | kkatano/bakeneko65/rev3 |
|
||||||
|
| bakeneko80 | kkatano/bakeneko80 |
|
||||||
|
| barleycorn | yiancardesigns/barleycorn |
|
||||||
|
| bat43/rev1 | dailycraft/bat43/rev1 |
|
||||||
|
| bat43/rev2 | dailycraft/bat43/rev2 |
|
||||||
|
| bigseries/1key | woodkeys/bigseries/1key |
|
||||||
|
| bigseries/2key | woodkeys/bigseries/2key |
|
||||||
|
| bigseries/3key | woodkeys/bigseries/3key |
|
||||||
|
| bigseries/4key | woodkeys/bigseries/4key |
|
||||||
|
| bkf | drhigsby/bkf |
|
||||||
|
| business_card/alpha | kakunpc/business_card/alpha |
|
||||||
|
| business_card/beta | kakunpc/business_card/beta |
|
||||||
|
| butterstick | gboards/butterstick |
|
||||||
|
| c39 | maple_computing/c39 |
|
||||||
|
| cassette42 | 25keys/cassette42 |
|
||||||
|
| chidori | kagizaraya/chidori |
|
||||||
|
| chili | ydkb/chili |
|
||||||
|
| chimera_ergo | glenpickle/chimera_ergo |
|
||||||
|
| chimera_ls | glenpickle/chimera_ls |
|
||||||
|
| chimera_ortho | glenpickle/chimera_ortho |
|
||||||
|
| chimera_ortho_plus | glenpickle/chimera_ortho_plus |
|
||||||
|
| choco60 | recompile_keys/choco60 |
|
||||||
|
| choc_taro | kakunpc/choc_taro |
|
||||||
|
| christmas_tree | maple_computing/christmas_tree |
|
||||||
|
| claw44/rev1 | dailycraft/claw44/rev1 |
|
||||||
|
| cocoa40 | recompile_keys/cocoa40 |
|
||||||
|
| comet46 | satt/comet46 |
|
||||||
|
| cu24 | capsunlocked/cu24 |
|
||||||
|
| cu75 | capsunlocked/cu75 |
|
||||||
|
| cu80 | capsunlocked/cu80/v1 |
|
||||||
|
| delilah | rainkeebs/delilah |
|
||||||
|
| diverge3 | unikeyboard/diverge3 |
|
||||||
|
| divergetm2 | unikeyboard/divergetm2 |
|
||||||
|
| dozen0 | yynmt/dozen0 |
|
||||||
|
| dubba175 | drhigsby/dubba175 |
|
||||||
|
| eggman | qpockets/eggman |
|
||||||
|
| ergo42 | biacco42/ergo42 |
|
||||||
|
| ergoarrows | salicylic_acid3/ergoarrows |
|
||||||
|
| ergodash/mini | omkbd/ergodash/mini |
|
||||||
|
| ergodash/rev1 | omkbd/ergodash/rev1 |
|
||||||
|
| ergodox_infinity | input_club/ergodox_infinity |
|
||||||
|
| ergotaco | gboards/ergotaco |
|
||||||
|
| espectro | mechkeys/espectro |
|
||||||
|
| felix | unikeyboard/felix |
|
||||||
|
| four_banger | bpiphany/four_banger |
|
||||||
|
| freyr | hnahkb/freyr |
|
||||||
|
| geminate60 | weirdo/geminate60 |
|
||||||
|
| georgi | gboards/georgi |
|
||||||
|
| gergo | gboards/gergo |
|
||||||
|
| getta25 | salicylic_acid3/getta25 |
|
||||||
|
| gingham | yiancardesigns/gingham |
|
||||||
|
| gurindam | ibnuda/gurindam |
|
||||||
|
| halberd | kagizaraya/halberd |
|
||||||
|
| hecomi/alpha | takashiski/hecomi/alpha |
|
||||||
|
| hid_liber | bpiphany/hid_liber |
|
||||||
|
| id67/default_rgb | idobao/id67/default_rgb |
|
||||||
|
| id67/rgb | idobao/id67/rgb |
|
||||||
|
| id80 | idobao/id80/v1 |
|
||||||
|
| id87 | idobao/id87/v1 |
|
||||||
|
| idobo | idobao/id75/v1 |
|
||||||
|
| infinity60 | input_club/infinity60 |
|
||||||
|
| ivy/rev1 | maple_computing/ivy/rev1 |
|
||||||
|
| jisplit89 | salicylic_acid3/jisplit89 |
|
||||||
|
| jnao | maple_computing/jnao |
|
||||||
|
| just60 | ydkb/just60 |
|
||||||
|
| kagamidget | yynmt/kagamidget |
|
||||||
|
| kelowna/rgb64 | weirdo/kelowna/rgb64 |
|
||||||
|
| kprepublic/bm65hsrgb_iso | kprepublic/bm65hsrgb_iso/rev1 |
|
||||||
|
| kprepublic/bm68hsrgb | kprepublic/bm68hsrgb/rev1 |
|
||||||
|
| k_type | input_club/k_type |
|
||||||
|
| latin17rgb | latincompass/latin17rgb |
|
||||||
|
| latin47ble | latincompass/latin47ble |
|
||||||
|
| latin60rgb | latincompass/latin60rgb |
|
||||||
|
| latin64ble | latincompass/latin64ble |
|
||||||
|
| latin6rgb | latincompass/latin6rgb |
|
||||||
|
| latinpadble | latincompass/latinpadble |
|
||||||
|
| latinpad | latincompass/latinpad |
|
||||||
|
| launchpad/rev1 | maple_computing/launchpad/rev1 |
|
||||||
|
| lck75 | lyso1/lck75 |
|
||||||
|
| le_chiffre | tominabox1/le_chiffre |
|
||||||
|
| lefishe | lyso1/lefishe |
|
||||||
|
| lets_split_eh/eh | maple_computing/lets_split_eh/eh |
|
||||||
|
| ls_60 | weirdo/ls_60 |
|
||||||
|
| m3n3van | matthewdias/m3n3van |
|
||||||
|
| mechmini/v1 | mechkeys/mechmini/v1 |
|
||||||
|
| mechmini/v2 | mechkeys/mechmini/v2 |
|
||||||
|
| meira | woodkeys/meira |
|
||||||
|
| meishi2 | biacco42/meishi2 |
|
||||||
|
| meishi | biacco42/meishi |
|
||||||
|
| minidox/rev1 | maple_computing/minidox/rev1 |
|
||||||
|
| minim | matthewdias/minim |
|
||||||
|
| mio | recompile_keys/mio |
|
||||||
|
| model_v | matthewdias/model_v |
|
||||||
|
| montex | idobao/montex/v1 |
|
||||||
|
| nafuda | salicylic_acid3/nafuda |
|
||||||
|
| naiping/np64 | weirdo/naiping/np64 |
|
||||||
|
| naiping/nphhkb | weirdo/naiping/nphhkb |
|
||||||
|
| naiping/npminila | weirdo/naiping/npminila |
|
||||||
|
| naked48 | salicylic_acid3/naked48 |
|
||||||
|
| naked60 | salicylic_acid3/naked60 |
|
||||||
|
| naked64 | salicylic_acid3/naked64 |
|
||||||
|
| namecard2x4 | takashiski/namecard2x4 |
|
||||||
|
| nebula12 | spaceholdings/nebula12 |
|
||||||
|
| nebula68b | spaceholdings/nebula68b |
|
||||||
|
| nebula68 | spaceholdings/nebula68 |
|
||||||
|
| niu_mini | kbdfans/niu_mini |
|
||||||
|
| nk1 | novelkeys/nk1 |
|
||||||
|
| nk65 | novelkeys/nk65 |
|
||||||
|
| nk87 | novelkeys/nk87 |
|
||||||
|
| nknl7en | salicylic_acid3/nknl7en |
|
||||||
|
| nknl7jp | salicylic_acid3/nknl7jp |
|
||||||
|
| nomu30 | recompile_keys/nomu30 |
|
||||||
|
| novelpad | novelkeys/novelpad |
|
||||||
|
| ogurec | drhigsby/ogurec |
|
||||||
|
| otaku_split/rev0 | takashiski/otaku_split/rev0 |
|
||||||
|
| otaku_split/rev1 | takashiski/otaku_split/rev1 |
|
||||||
|
| owl8 | dailycraft/owl8 |
|
||||||
|
| packrat | drhigsby/packrat |
|
||||||
|
| pistachio_mp | rate/pistachio_mp |
|
||||||
|
| pistachio_pro | rate/pistachio_pro |
|
||||||
|
| pistachio | rate/pistachio |
|
||||||
|
| plexus75 | checkerboards/plexus75 |
|
||||||
|
| pursuit40 | checkerboards/pursuit40 |
|
||||||
|
| qaz | tominabox1/qaz |
|
||||||
|
| quark | checkerboards/quark |
|
||||||
|
| rabbit_capture_plan | kakunpc/rabbit_capture_plan |
|
||||||
|
| rainkeeb | rainkeebs/rainkeeb |
|
||||||
|
| reviung33 | reviung/reviung33 |
|
||||||
|
| reviung34 | reviung/reviung34 |
|
||||||
|
| reviung39 | reviung/reviung39 |
|
||||||
|
| reviung41 | reviung/reviung41 |
|
||||||
|
| reviung53 | reviung/reviung53 |
|
||||||
|
| reviung5 | reviung/reviung5 |
|
||||||
|
| reviung61 | reviung/reviung61 |
|
||||||
|
| runner3680/3x6 | omkbd/runner3680/3x6 |
|
||||||
|
| runner3680/3x7 | omkbd/runner3680/3x7 |
|
||||||
|
| runner3680/3x8 | omkbd/runner3680/3x8 |
|
||||||
|
| runner3680/4x6 | omkbd/runner3680/4x6 |
|
||||||
|
| runner3680/4x7 | omkbd/runner3680/4x7 |
|
||||||
|
| runner3680/4x8 | omkbd/runner3680/4x8 |
|
||||||
|
| runner3680/5x6_5x8 | omkbd/runner3680/5x6_5x8 |
|
||||||
|
| runner3680/5x6 | omkbd/runner3680/5x6 |
|
||||||
|
| runner3680/5x7 | omkbd/runner3680/5x7 |
|
||||||
|
| runner3680/5x8 | omkbd/runner3680/5x8 |
|
||||||
|
| scarletbandana | woodkeys/scarletbandana |
|
||||||
|
| scythe | kagizaraya/scythe |
|
||||||
|
| seigaiha | yiancardesigns/seigaiha |
|
||||||
|
| setta21 | salicylic_acid3/setta21 |
|
||||||
|
| space_space/rev1 | qpockets/space_space/rev1 |
|
||||||
|
| space_space/rev2 | qpockets/space_space/rev2 |
|
||||||
|
| spiderisland/winry25tc | winry/winry25tc |
|
||||||
|
| splitreus62 | nacly/splitreus62 |
|
||||||
|
| squiggle/rev1 | ibnuda/squiggle/rev1 |
|
||||||
|
| standaside | edi/standaside |
|
||||||
|
| steal_this_keyboard | obosob/steal_this_keyboard |
|
||||||
|
| stella | hnahkb/stella |
|
||||||
|
| suihankey/alpha | kakunpc/suihankey/alpha |
|
||||||
|
| suihankey/rev1 | kakunpc/suihankey/rev1 |
|
||||||
|
| suihankey/split | kakunpc/suihankey/split |
|
||||||
|
| thedogkeyboard | kakunpc/thedogkeyboard |
|
||||||
|
| the_ruler | maple_computing/the_ruler |
|
||||||
|
| tiger910 | weirdo/tiger910 |
|
||||||
|
| treadstone32 | marksard/treadstone32 |
|
||||||
|
| treadstone48/rev1 | marksard/treadstone48/rev1 |
|
||||||
|
| treadstone48/rev2 | marksard/treadstone48/rev2 |
|
||||||
|
| txuu | matthewdias/txuu |
|
||||||
|
| ua62 | nacly/ua62 |
|
||||||
|
| underscore33/rev1 | tominabox1/underscore33/rev1 |
|
||||||
|
| underscore33/rev2 | tominabox1/underscore33/rev2 |
|
||||||
|
| vn66 | hnahkb/vn66 |
|
||||||
|
| wallaby | kkatano/wallaby |
|
||||||
|
| wanten | qpockets/wanten |
|
||||||
|
| whitefox | input_club/whitefox |
|
||||||
|
| wings42/rev1 | dailycraft/wings42/rev1 |
|
||||||
|
| wings42/rev1_extkeys | dailycraft/wings42/rev1_extkeys |
|
||||||
|
| wings42/rev2 | dailycraft/wings42/rev2 |
|
||||||
|
| yasui | rainkeebs/yasui |
|
||||||
|
| yd60mq | ymdk/yd60mq |
|
||||||
|
| yd68 | ydkb/yd68 |
|
||||||
|
| ymd75 | ymdk/ymd75 |
|
||||||
|
| ymd96 | ymdk/ymd96 |
|
||||||
|
| ymdk_np21 | ymdk/np21 |
|
||||||
|
| yurei | kkatano/yurei |
|
||||||
|
| zinc | 25keys/zinc |
|
||||||
|
| zinc/rev1 | 25keys/zinc/rev1 |
|
||||||
|
| zinc/reva | 25keys/zinc/reva |
|
||||||
|
|
||||||
|
## Notable core changes :id=notable-core
|
||||||
|
|
||||||
|
### New MCU Support :id=new-mcu-support
|
||||||
|
|
||||||
|
Building on previous cycles, QMK firmware picked up support for a couple extra MCU variants:
|
||||||
|
|
||||||
|
* STM32L432
|
||||||
|
* STM32L442
|
||||||
|
|
||||||
|
### New Drivers
|
||||||
|
|
||||||
|
QMK now has core-supplied support for the following device peripherals:
|
||||||
|
|
||||||
|
#### LED
|
||||||
|
|
||||||
|
* IS31FL3742A
|
||||||
|
* IS31FL3743A
|
||||||
|
* IS31FL3745
|
||||||
|
* IS31FL3746A
|
||||||
|
|
||||||
|
#### GPIO
|
||||||
|
|
||||||
|
* SN74x138
|
||||||
|
* mcp23018
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Full changelist
|
||||||
|
|
||||||
|
Core:
|
||||||
|
* Initial pass at data driven new-keyboard subcommand ([#12795](https://github.com/qmk/qmk_firmware/pull/12795))
|
||||||
|
* Don't send keyboard reports that propagate no changes to the host ([#14065](https://github.com/qmk/qmk_firmware/pull/14065))
|
||||||
|
* Custom matrix lite support for split keyboards ([#14674](https://github.com/qmk/qmk_firmware/pull/14674))
|
||||||
|
* Add sym_defer_pr debouncer type ([#14948](https://github.com/qmk/qmk_firmware/pull/14948))
|
||||||
|
* Add RGB matrix & LED Matrix support for IS31FL3742A, IS31FL3743A, IS31FL3745, IS31FL3746A ([#14989](https://github.com/qmk/qmk_firmware/pull/14989))
|
||||||
|
* New combo configuration options ([#15083](https://github.com/qmk/qmk_firmware/pull/15083))
|
||||||
|
* IS31FL3733 driver for LED Matrix ([#15088](https://github.com/qmk/qmk_firmware/pull/15088))
|
||||||
|
* Add open-drain GPIO support. ([#15282](https://github.com/qmk/qmk_firmware/pull/15282))
|
||||||
|
* Make (un)register code functions weak ([#15285](https://github.com/qmk/qmk_firmware/pull/15285))
|
||||||
|
* Split support for pointing devices. ([#15304](https://github.com/qmk/qmk_firmware/pull/15304))
|
||||||
|
* Added cancel_key_lock function ([#15321](https://github.com/qmk/qmk_firmware/pull/15321))
|
||||||
|
* Remove matrix_is_modified() and debounce_is_active() ([#15349](https://github.com/qmk/qmk_firmware/pull/15349))
|
||||||
|
* Change default USB Polling rate to 1kHz ([#15352](https://github.com/qmk/qmk_firmware/pull/15352))
|
||||||
|
* Implement MAGIC_TOGGLE_CONTROL_CAPSLOCK ([#15368](https://github.com/qmk/qmk_firmware/pull/15368))
|
||||||
|
* Tidy up existing i2c_master implementations ([#15376](https://github.com/qmk/qmk_firmware/pull/15376))
|
||||||
|
* Generalize Unicode defines ([#15409](https://github.com/qmk/qmk_firmware/pull/15409))
|
||||||
|
* Added external spi flash driver. ([#15419](https://github.com/qmk/qmk_firmware/pull/15419))
|
||||||
|
* Remove Deprecated USB Polling comment from vusb.c ([#15420](https://github.com/qmk/qmk_firmware/pull/15420))
|
||||||
|
* Expand rotational range for PMW3360 Optical Sensor ([#15431](https://github.com/qmk/qmk_firmware/pull/15431))
|
||||||
|
* ChibiOS SVN mirror script update ([#15435](https://github.com/qmk/qmk_firmware/pull/15435))
|
||||||
|
* Refactor `bootloader_jump()` implementations ([#15450](https://github.com/qmk/qmk_firmware/pull/15450))
|
||||||
|
* added missing audio_off_user() callback ([#15457](https://github.com/qmk/qmk_firmware/pull/15457))
|
||||||
|
* Migrate serial_uart usages to UART driver ([#15479](https://github.com/qmk/qmk_firmware/pull/15479))
|
||||||
|
* Migrate RN42 to UART driver and refactor ([#15492](https://github.com/qmk/qmk_firmware/pull/15492))
|
||||||
|
* pwm3360 driver cleanup and diff reduction to adns9800 ([#15559](https://github.com/qmk/qmk_firmware/pull/15559))
|
||||||
|
* Advanced deferred_exec for core-side code. ([#15579](https://github.com/qmk/qmk_firmware/pull/15579))
|
||||||
|
* Adjust tap_code16 to account for TAP_HOLD_CAPS_DELAY ([#15635](https://github.com/qmk/qmk_firmware/pull/15635))
|
||||||
|
* Slight tidy up of keyboard task loop ([#15725](https://github.com/qmk/qmk_firmware/pull/15725))
|
||||||
|
* Unify the key up/down behaviour of RGB keycodes ([#15730](https://github.com/qmk/qmk_firmware/pull/15730))
|
||||||
|
* Add PMW3389 optical sensor Support (Updated) ([#15740](https://github.com/qmk/qmk_firmware/pull/15740))
|
||||||
|
* ChibiOS: add support for HID Programmable Buttons ([#15787](https://github.com/qmk/qmk_firmware/pull/15787))
|
||||||
|
* ChibiOS: shorten USB disconnect state on boot to 50ms ([#15805](https://github.com/qmk/qmk_firmware/pull/15805))
|
||||||
|
* Add init function to clear previous matrix effect ([#15815](https://github.com/qmk/qmk_firmware/pull/15815))
|
||||||
|
* Optimize initialization of PMW3360 Sensor ([#15821](https://github.com/qmk/qmk_firmware/pull/15821))
|
||||||
|
* Add Pixel Flow RGB matrix effect ([#15829](https://github.com/qmk/qmk_firmware/pull/15829))
|
||||||
|
* PMW3389 Revert Firmware load during Initilization ([#15859](https://github.com/qmk/qmk_firmware/pull/15859))
|
||||||
|
* Combo `TAP_CODE_DELAY` and `clear_weak_mods` ([#15866](https://github.com/qmk/qmk_firmware/pull/15866))
|
||||||
|
* Relocate matrix_scan_quantum tasks ([#15882](https://github.com/qmk/qmk_firmware/pull/15882))
|
||||||
|
* Adjust mouse key defaults ([#15883](https://github.com/qmk/qmk_firmware/pull/15883))
|
||||||
|
* RGB Matrix: Reload from EEPROM ([#15923](https://github.com/qmk/qmk_firmware/pull/15923))
|
||||||
|
* Enable a default task throttle for split pointing. ([#15925](https://github.com/qmk/qmk_firmware/pull/15925))
|
||||||
|
* Move mcp23018 driver to core ([#15944](https://github.com/qmk/qmk_firmware/pull/15944))
|
||||||
|
* Relocate matrix_init_quantum content ([#15953](https://github.com/qmk/qmk_firmware/pull/15953))
|
||||||
|
* Align location of some host led logic ([#15954](https://github.com/qmk/qmk_firmware/pull/15954))
|
||||||
|
* Rename some Quantum keycodes ([#15968](https://github.com/qmk/qmk_firmware/pull/15968))
|
||||||
|
* Migrate more makefile utilities to builddefs sub-directory ([#16002](https://github.com/qmk/qmk_firmware/pull/16002))
|
||||||
|
* Various Makefile optimisations ([#16015](https://github.com/qmk/qmk_firmware/pull/16015))
|
||||||
|
* Add support for STM32L432, STM32L442. ([#16016](https://github.com/qmk/qmk_firmware/pull/16016))
|
||||||
|
* EEPROM refactor: remove `eeprom_teensy.c` by default, use transient instead ([#16020](https://github.com/qmk/qmk_firmware/pull/16020))
|
||||||
|
* Deprecate Split Transaction status field ([#16023](https://github.com/qmk/qmk_firmware/pull/16023))
|
||||||
|
* Rip out old macro and action_function system ([#16025](https://github.com/qmk/qmk_firmware/pull/16025))
|
||||||
|
* Add a script that simplifies running commands under docker. ([#16028](https://github.com/qmk/qmk_firmware/pull/16028))
|
||||||
|
* Add support for Q-series on the ckled2001 LED driver ([#16051](https://github.com/qmk/qmk_firmware/pull/16051))
|
||||||
|
* Remove unused suspend_idle ([#16063](https://github.com/qmk/qmk_firmware/pull/16063))
|
||||||
|
* Initial migration of suspend callbacks ([#16067](https://github.com/qmk/qmk_firmware/pull/16067))
|
||||||
|
* Add layout change callbacks to VIA ([#16087](https://github.com/qmk/qmk_firmware/pull/16087))
|
||||||
|
* Rename `AdafruitBLE` to `BluefruitLE` ([#16127](https://github.com/qmk/qmk_firmware/pull/16127))
|
||||||
|
* Update outputselect to use platform connected state API ([#16185](https://github.com/qmk/qmk_firmware/pull/16185))
|
||||||
|
* Remove default pointing device driver. ([#16190](https://github.com/qmk/qmk_firmware/pull/16190))
|
||||||
|
* Add SN74x138 demultiplexer driver ([#16217](https://github.com/qmk/qmk_firmware/pull/16217))
|
||||||
|
* Standardise error output. ([#16220](https://github.com/qmk/qmk_firmware/pull/16220))
|
||||||
|
* Followup to #16220, more test error output. ([#16221](https://github.com/qmk/qmk_firmware/pull/16221))
|
||||||
|
* Misc size regression script improvements. ([#16268](https://github.com/qmk/qmk_firmware/pull/16268))
|
||||||
|
* Align existing pca9555 driver to better match mcp23018 API ([#16277](https://github.com/qmk/qmk_firmware/pull/16277))
|
||||||
|
* Size checks print out target firmware file instead ([#16290](https://github.com/qmk/qmk_firmware/pull/16290))
|
||||||
|
|
||||||
|
CLI:
|
||||||
|
* `develop` changelog generator: use the PR title instead ([#15537](https://github.com/qmk/qmk_firmware/pull/15537))
|
||||||
|
* `develop` changelog generator: skip code formatting in listing ([#16215](https://github.com/qmk/qmk_firmware/pull/16215))
|
||||||
|
|
||||||
|
Keyboards:
|
||||||
|
* Durgod: Increase scan rate by using wait_us timer ([#14091](https://github.com/qmk/qmk_firmware/pull/14091))
|
||||||
|
* Add another GMMK Pro ANSI Keymap with custom RGB. ([#14243](https://github.com/qmk/qmk_firmware/pull/14243))
|
||||||
|
* Parse USB device version BCD ([#14580](https://github.com/qmk/qmk_firmware/pull/14580))
|
||||||
|
* Add vitoni keymap for GMMK Pro (ISO) ([#15006](https://github.com/qmk/qmk_firmware/pull/15006))
|
||||||
|
* Move bm65hsrgb_iso and bm68hsrgb to rev1/ to prepare for updates to the boards ([#15132](https://github.com/qmk/qmk_firmware/pull/15132))
|
||||||
|
* Convert ergoinu to SPLIT_KEYBOARD ([#15305](https://github.com/qmk/qmk_firmware/pull/15305))
|
||||||
|
* Convert not_so_minidox to SPLIT_KEYBOARD ([#15306](https://github.com/qmk/qmk_firmware/pull/15306))
|
||||||
|
* Added new handwired keyboard Wakizashi 40 ([#15336](https://github.com/qmk/qmk_firmware/pull/15336))
|
||||||
|
* Convert ai03/orbit to SPLIT_KEYBOARD ([#15340](https://github.com/qmk/qmk_firmware/pull/15340))
|
||||||
|
* Remove manual enable of LTO within user keymaps ([#15378](https://github.com/qmk/qmk_firmware/pull/15378))
|
||||||
|
* Move to organization folder ([#15481](https://github.com/qmk/qmk_firmware/pull/15481))
|
||||||
|
* Convert some more boards to Matrix Lite ([#15489](https://github.com/qmk/qmk_firmware/pull/15489))
|
||||||
|
* Organize Reviung boards into a directory ([#15636](https://github.com/qmk/qmk_firmware/pull/15636))
|
||||||
|
* move winry25tc to winry/ ([#15637](https://github.com/qmk/qmk_firmware/pull/15637))
|
||||||
|
* Rename ymdk_np21 to np21 + move to ymdk vendor folder ([#15641](https://github.com/qmk/qmk_firmware/pull/15641))
|
||||||
|
* move ymd96 to ymdk vendor folder ([#15643](https://github.com/qmk/qmk_firmware/pull/15643))
|
||||||
|
* move ymd75 to ymdk vendor folder ([#15645](https://github.com/qmk/qmk_firmware/pull/15645))
|
||||||
|
* move yd60mq to ymdk vendor folder ([#15647](https://github.com/qmk/qmk_firmware/pull/15647))
|
||||||
|
* rename idobo to idobao/id75, move to vendor folder ([#15661](https://github.com/qmk/qmk_firmware/pull/15661))
|
||||||
|
* move ID67 to IDOBAO vendor folder ([#15662](https://github.com/qmk/qmk_firmware/pull/15662))
|
||||||
|
* move ID80 to IDOBAO vendor folder ([#15665](https://github.com/qmk/qmk_firmware/pull/15665))
|
||||||
|
* move ID87 to IDOBAO vendor folder ([#15667](https://github.com/qmk/qmk_firmware/pull/15667))
|
||||||
|
* move montex to IDOBAO vendor folder ([#15668](https://github.com/qmk/qmk_firmware/pull/15668))
|
||||||
|
* move @yangdigi 's keyboards to a YDKB folder ([#15681](https://github.com/qmk/qmk_firmware/pull/15681))
|
||||||
|
* move @kkatano 's keyboards to kkatano user folder ([#15684](https://github.com/qmk/qmk_firmware/pull/15684))
|
||||||
|
* Sol 3 Keyboard from RGBKB ([#15687](https://github.com/qmk/qmk_firmware/pull/15687))
|
||||||
|
* move cu24, cu75, cu80/v1 into capsunlocked folder ([#15758](https://github.com/qmk/qmk_firmware/pull/15758))
|
||||||
|
* move mechkeys keyboards into the mechkeys/ vendor folder ([#15760](https://github.com/qmk/qmk_firmware/pull/15760))
|
||||||
|
* move @lyso1 's boards into lyso1/ ([#15767](https://github.com/qmk/qmk_firmware/pull/15767))
|
||||||
|
* move prototypist boards into vendor folder ([#15780](https://github.com/qmk/qmk_firmware/pull/15780))
|
||||||
|
* move @yiancar 's boards into yiancardesigns/ ([#15781](https://github.com/qmk/qmk_firmware/pull/15781))
|
||||||
|
* move novelkeys keyboards to vendor folder ([#15783](https://github.com/qmk/qmk_firmware/pull/15783))
|
||||||
|
* move @weirdo-f 's keyboards into weirdo/ ([#15785](https://github.com/qmk/qmk_firmware/pull/15785))
|
||||||
|
* move @marksard 's boards to marksard/ ([#15786](https://github.com/qmk/qmk_firmware/pull/15786))
|
||||||
|
* move input club keyboards into vendor folder ([#15788](https://github.com/qmk/qmk_firmware/pull/15788))
|
||||||
|
* move @monksoffunk 's boards into 25keys/ ([#15789](https://github.com/qmk/qmk_firmware/pull/15789))
|
||||||
|
* move @Salicylic-acid3 's keyboards to salicylic-acid3/ ([#15791](https://github.com/qmk/qmk_firmware/pull/15791))
|
||||||
|
* move @rainkeebs 's keyboards to rainkeebs/ ([#15797](https://github.com/qmk/qmk_firmware/pull/15797))
|
||||||
|
* move standaside into edi/ ([#15798](https://github.com/qmk/qmk_firmware/pull/15798))
|
||||||
|
* move @obosob 's boards into obosob/ ([#15799](https://github.com/qmk/qmk_firmware/pull/15799))
|
||||||
|
* move @nacly 's boards to nacly/ ([#15801](https://github.com/qmk/qmk_firmware/pull/15801))
|
||||||
|
* move @kakunpc 's keebs into kakunpc/ ([#15814](https://github.com/qmk/qmk_firmware/pull/15814))
|
||||||
|
* move @qpocket 's keyboards to qpocket/ ([#15827](https://github.com/qmk/qmk_firmware/pull/15827))
|
||||||
|
* BDN9 keymap ([#15924](https://github.com/qmk/qmk_firmware/pull/15924))
|
||||||
|
* move @matthewdias 's keebs into matthewdias/ ([#15991](https://github.com/qmk/qmk_firmware/pull/15991))
|
||||||
|
* move id80 and id75 to v1 to accommodate for id75 v2 and id80 v3 ([#15992](https://github.com/qmk/qmk_firmware/pull/15992))
|
||||||
|
* Remove `action_function()` from LFKeyboards boards ([#15993](https://github.com/qmk/qmk_firmware/pull/15993))
|
||||||
|
* move @latincompass (aka @18438880 , @haierwangwei2005)'s boards to /latincompass ([#16039](https://github.com/qmk/qmk_firmware/pull/16039))
|
||||||
|
* move g heavy industry boards into /gboards ([#16040](https://github.com/qmk/qmk_firmware/pull/16040))
|
||||||
|
* move @drhigsby 's boards into /drhigsby ([#16041](https://github.com/qmk/qmk_firmware/pull/16041))
|
||||||
|
* More keyboard rules.mk cleanups ([#16044](https://github.com/qmk/qmk_firmware/pull/16044))
|
||||||
|
* move @That-Canadian 's boards into /maple_computing ([#16050](https://github.com/qmk/qmk_firmware/pull/16050))
|
||||||
|
* move @takai 's keyboards into /recompile_keys ([#16053](https://github.com/qmk/qmk_firmware/pull/16053))
|
||||||
|
* move @satt99 's comet46 to satt/ ([#16059](https://github.com/qmk/qmk_firmware/pull/16059))
|
||||||
|
* move @ka2hiro 's boards into /kagizaraya ([#16070](https://github.com/qmk/qmk_firmware/pull/16070))
|
||||||
|
* move @GlenPickle 's chimera* boards into a folder ([#16072](https://github.com/qmk/qmk_firmware/pull/16072))
|
||||||
|
* move @yynmt 's boards into /yynmt ([#16075](https://github.com/qmk/qmk_firmware/pull/16075))
|
||||||
|
* move @Biacco42 's keebs into /biacco42 ([#16080](https://github.com/qmk/qmk_firmware/pull/16080))
|
||||||
|
* move unikeyboard boards to /unikeyboard ([#16081](https://github.com/qmk/qmk_firmware/pull/16081))
|
||||||
|
* move four_banger to bpiphany ([#16082](https://github.com/qmk/qmk_firmware/pull/16082))
|
||||||
|
* move @takashiski 's keebs into /takashiski ([#16089](https://github.com/qmk/qmk_firmware/pull/16089))
|
||||||
|
* move hid_liber to /bpiphany ([#16091](https://github.com/qmk/qmk_firmware/pull/16091))
|
||||||
|
* move spaceholdings boards into /spaceholdings ([#16096](https://github.com/qmk/qmk_firmware/pull/16096))
|
||||||
|
* move @7-rate 's keebs to /rate ([#16099](https://github.com/qmk/qmk_firmware/pull/16099))
|
||||||
|
* move @npspears 's boards into /checkerboards ([#16100](https://github.com/qmk/qmk_firmware/pull/16100))
|
||||||
|
* move @vuhopkep 's keebs into /hnahkb ([#16102](https://github.com/qmk/qmk_firmware/pull/16102))
|
||||||
|
* move @ibnuda 's keebs into /ibnuda ([#16108](https://github.com/qmk/qmk_firmware/pull/16108))
|
||||||
|
* move @tominabox1 's keebs into /tominabox1 ([#16109](https://github.com/qmk/qmk_firmware/pull/16109))
|
||||||
|
* move niu_mini to /kbdfans ([#16112](https://github.com/qmk/qmk_firmware/pull/16112))
|
||||||
|
* move woodkeys.click keyboards to /woodkeys ([#16113](https://github.com/qmk/qmk_firmware/pull/16113))
|
||||||
|
* move @omkbd 's boards to /omkbd ([#16116](https://github.com/qmk/qmk_firmware/pull/16116))
|
||||||
|
* Overhaul Tractyl Manuform ([#16134](https://github.com/qmk/qmk_firmware/pull/16134))
|
||||||
|
* Reduce firmware size for dztech/dz60rgb_wkl/v2_1:via ([#16254](https://github.com/qmk/qmk_firmware/pull/16254))
|
||||||
|
|
||||||
|
Keyboard fixes:
|
||||||
|
* Fix build failure for UT47 ([#15483](https://github.com/qmk/qmk_firmware/pull/15483))
|
||||||
|
* Update grs_70ec to use newer custom matrix ([#15609](https://github.com/qmk/qmk_firmware/pull/15609))
|
||||||
|
* fix compiler issue with Tractyl Manuform 4x6 ([#15646](https://github.com/qmk/qmk_firmware/pull/15646))
|
||||||
|
* Fix CI. ([#15828](https://github.com/qmk/qmk_firmware/pull/15828))
|
||||||
|
* Yet another bad `DEFAULT_FOLDER` fix. ([#15904](https://github.com/qmk/qmk_firmware/pull/15904))
|
||||||
|
* Fix build failures for `mschwingen/modelm` ([#15987](https://github.com/qmk/qmk_firmware/pull/15987))
|
||||||
|
* `rocketboard_16`: Fix mismatched LUT sizes ([#15997](https://github.com/qmk/qmk_firmware/pull/15997))
|
||||||
|
* Fix erroneous SRC for Clueboard 66 hotswap ([#16007](https://github.com/qmk/qmk_firmware/pull/16007))
|
||||||
|
* Fix handwired/ms_sculpt_mobile default keymap ([#16032](https://github.com/qmk/qmk_firmware/pull/16032))
|
||||||
|
* Re-org Hillside folders as new model prep. Fix default keymap. ([#16128](https://github.com/qmk/qmk_firmware/pull/16128))
|
||||||
|
* Fix up default folder locations. Again. ([#16135](https://github.com/qmk/qmk_firmware/pull/16135))
|
||||||
|
* Sol3 rgb fix ([#16157](https://github.com/qmk/qmk_firmware/pull/16157))
|
||||||
|
* Add missing `BOOTLOADER` for a handful of boards ([#16225](https://github.com/qmk/qmk_firmware/pull/16225))
|
||||||
|
* Remove half implemented micronucleus bootloader support ([#16252](https://github.com/qmk/qmk_firmware/pull/16252))
|
||||||
|
* Fixup bootloaders. ([#16256](https://github.com/qmk/qmk_firmware/pull/16256))
|
||||||
|
* Fix idobao/id80/v3 compilation errors ([#16280](https://github.com/qmk/qmk_firmware/pull/16280))
|
||||||
|
* Remove parent-relative paths from keyboards. ([#16282](https://github.com/qmk/qmk_firmware/pull/16282))
|
||||||
|
* Bodge for helix build failures ([#16376](https://github.com/qmk/qmk_firmware/pull/16376))
|
||||||
|
|
||||||
|
Others:
|
||||||
|
* Add a clarification to an error message ([#15207](https://github.com/qmk/qmk_firmware/pull/15207))
|
||||||
|
* Clang-format tweaks ([#15906](https://github.com/qmk/qmk_firmware/pull/15906))
|
||||||
|
* Add example implementations for compatible MCUs list ([#15935](https://github.com/qmk/qmk_firmware/pull/15935))
|
||||||
|
* Add version.h to gitignore ([#16222](https://github.com/qmk/qmk_firmware/pull/16222))
|
||||||
|
* Update keyboard mapping for all moved boards this cycle ([#16312](https://github.com/qmk/qmk_firmware/pull/16312))
|
||||||
|
* Align docs to new-keyboard behaviour ([#16357](https://github.com/qmk/qmk_firmware/pull/16357))
|
||||||
|
* Align new-keyboard with recent schema updates ([#16378](https://github.com/qmk/qmk_firmware/pull/16378))
|
||||||
|
|
||||||
|
Bugs:
|
||||||
|
* Fixes potential wpm sampling overflow, along with code comment fixes ([#15277](https://github.com/qmk/qmk_firmware/pull/15277))
|
||||||
|
* Add missing define for unicode common ([#15416](https://github.com/qmk/qmk_firmware/pull/15416))
|
||||||
|
* Fix for SPI write timing in PMW3360 driver ([#15519](https://github.com/qmk/qmk_firmware/pull/15519))
|
||||||
|
* Documentation Typo fix ([#15538](https://github.com/qmk/qmk_firmware/pull/15538))
|
||||||
|
* fix a typo ([#15557](https://github.com/qmk/qmk_firmware/pull/15557))
|
||||||
|
* Fix avr serial compile ([#15589](https://github.com/qmk/qmk_firmware/pull/15589))
|
||||||
|
* More AVR GPIO compilation fixes. ([#15592](https://github.com/qmk/qmk_firmware/pull/15592))
|
||||||
|
* Fix bug and code regression for Split Common ([#15603](https://github.com/qmk/qmk_firmware/pull/15603))
|
||||||
|
* Include missing string.h include in split ([#15606](https://github.com/qmk/qmk_firmware/pull/15606))
|
||||||
|
* Fixes for bootloader refactor build failures ([#15638](https://github.com/qmk/qmk_firmware/pull/15638))
|
||||||
|
* Update pmw3360 driver after reading the datasheet top to bottom. Fix some outdated refs. ([#15682](https://github.com/qmk/qmk_firmware/pull/15682))
|
||||||
|
* Fix split pointing for analog joystick ([#15691](https://github.com/qmk/qmk_firmware/pull/15691))
|
||||||
|
* Fix broken bootloader builds in develop. ([#15880](https://github.com/qmk/qmk_firmware/pull/15880))
|
||||||
|
* Fix optical sensor firmware upload ([#15919](https://github.com/qmk/qmk_firmware/pull/15919))
|
||||||
|
* Pass in the keyrecord_t of the dual-role/tapping key when calling per-key tap hold functions ([#15938](https://github.com/qmk/qmk_firmware/pull/15938))
|
||||||
|
* fixed typo in orange HSV colors decalartion ([#15976](https://github.com/qmk/qmk_firmware/pull/15976))
|
||||||
|
* Fix hack for chibiOS reset name ([#15984](https://github.com/qmk/qmk_firmware/pull/15984))
|
||||||
|
* Fix right side ws2812 leds having two indices ([#15985](https://github.com/qmk/qmk_firmware/pull/15985))
|
||||||
|
* Workaround in Makefile for recursive rule matching ([#15988](https://github.com/qmk/qmk_firmware/pull/15988))
|
||||||
|
* Fix BACKLIGHT_CAPS_LOCK warning ([#15999](https://github.com/qmk/qmk_firmware/pull/15999))
|
||||||
|
* Fix compilation issues for led indicators ([#16001](https://github.com/qmk/qmk_firmware/pull/16001))
|
||||||
|
* ChibiOS timer fixes ([#16017](https://github.com/qmk/qmk_firmware/pull/16017))
|
||||||
|
* Fix bootloader_jump for certain CTRL boards ([#16026](https://github.com/qmk/qmk_firmware/pull/16026))
|
||||||
|
* Fix up issue with PROGMEM and hand_swap_config ([#16027](https://github.com/qmk/qmk_firmware/pull/16027))
|
||||||
|
* Don't make EEPROM size assumptions with dynamic keymaps. ([#16054](https://github.com/qmk/qmk_firmware/pull/16054))
|
||||||
|
* fix missed .noci in reviung move ([#16107](https://github.com/qmk/qmk_firmware/pull/16107))
|
||||||
|
* Fix issues with Python Tests ([#16162](https://github.com/qmk/qmk_firmware/pull/16162))
|
||||||
|
* Fixup multibuild filegen ([#16166](https://github.com/qmk/qmk_firmware/pull/16166))
|
||||||
|
* Remove old .gitignore entry. Add more macOS junk exclusions. ([#16167](https://github.com/qmk/qmk_firmware/pull/16167))
|
||||||
|
* Fixup builds so that teensy EEPROM knows which MCU it's targeting. ([#16168](https://github.com/qmk/qmk_firmware/pull/16168))
|
||||||
|
* Create a build error if no bootloader is specified. ([#16181](https://github.com/qmk/qmk_firmware/pull/16181))
|
||||||
|
* Ensure `version.h` is recreated each build. ([#16188](https://github.com/qmk/qmk_firmware/pull/16188))
|
||||||
|
* Add `custom` to list of valid bootloader types in info.json ([#16228](https://github.com/qmk/qmk_firmware/pull/16228))
|
||||||
|
* Fix `layer_state` restoration at end of dynamic macro feature #16208 ([#16230](https://github.com/qmk/qmk_firmware/pull/16230))
|
||||||
|
* Minor additions #12795 ([#16276](https://github.com/qmk/qmk_firmware/pull/16276))
|
||||||
|
* Various fixes for matrix _RIGHT handling ([#16292](https://github.com/qmk/qmk_firmware/pull/16292))
|
||||||
|
* Fix slashes in build_full_test.mk ([#16300](https://github.com/qmk/qmk_firmware/pull/16300))
|
||||||
|
* ps2/avr: use the correct file name ([#16316](https://github.com/qmk/qmk_firmware/pull/16316))
|
||||||
|
* Fix compilation of ChibiOS UART driver ([#16348](https://github.com/qmk/qmk_firmware/pull/16348))
|
||||||
|
* Various fixes for new-keyboard ([#16358](https://github.com/qmk/qmk_firmware/pull/16358))
|
||||||
|
* Allow NO_PIN within data driven configuration ([#16359](https://github.com/qmk/qmk_firmware/pull/16359))
|
@ -1,9 +1,4 @@
|
|||||||
- Translations
|
- Translations
|
||||||
- [:uk: English](/)
|
- [:uk: English](/)
|
||||||
- [:cn: 简体中文](/zh-cn/)
|
- [:cn: 简体中文](/zh-cn/)
|
||||||
- [:es: Español](/es/)
|
|
||||||
- [:fr: Français](/fr-fr/)
|
|
||||||
- [:israel: עברית](/he-il/)
|
|
||||||
- [:brazil: Português](/pt-br/)
|
|
||||||
- [:ru: Русский](/ru-ru/)
|
|
||||||
- [:jp: 日本語](/ja/)
|
- [:jp: 日本語](/ja/)
|
||||||
|
@ -37,7 +37,6 @@
|
|||||||
* Guides
|
* Guides
|
||||||
* [Customizing Functionality](custom_quantum_functions.md)
|
* [Customizing Functionality](custom_quantum_functions.md)
|
||||||
* [Driver Installation with Zadig](driver_installation_zadig.md)
|
* [Driver Installation with Zadig](driver_installation_zadig.md)
|
||||||
* [Easy Maker for One Offs](easy_maker.md)
|
|
||||||
* [Keymap Overview](keymap.md)
|
* [Keymap Overview](keymap.md)
|
||||||
* Development Environments
|
* Development Environments
|
||||||
* [Docker Guide](getting_started_docker.md)
|
* [Docker Guide](getting_started_docker.md)
|
||||||
@ -53,9 +52,6 @@
|
|||||||
* [Your Fork](newbs_git_using_your_master_branch.md)
|
* [Your Fork](newbs_git_using_your_master_branch.md)
|
||||||
* [Merge Conflicts](newbs_git_resolving_merge_conflicts.md)
|
* [Merge Conflicts](newbs_git_resolving_merge_conflicts.md)
|
||||||
* [Fixing Your Branch](newbs_git_resynchronize_a_branch.md)
|
* [Fixing Your Branch](newbs_git_resynchronize_a_branch.md)
|
||||||
* Keyboard Building
|
|
||||||
* [Hand Wiring Guide](hand_wire.md)
|
|
||||||
* [ISP Flashing Guide](isp_flashing_guide.md)
|
|
||||||
|
|
||||||
* Simple Keycodes
|
* Simple Keycodes
|
||||||
* [Full List](keycodes.md)
|
* [Full List](keycodes.md)
|
||||||
@ -124,17 +120,22 @@
|
|||||||
* [Thermal Printer](feature_thermal_printer.md)
|
* [Thermal Printer](feature_thermal_printer.md)
|
||||||
* [Velocikey](feature_velocikey.md)
|
* [Velocikey](feature_velocikey.md)
|
||||||
|
|
||||||
|
* Keyboard Building
|
||||||
|
* [Easy Maker for One Offs](easy_maker.md)
|
||||||
|
* [Porting Keyboards](porting_your_keyboard_to_qmk.md)
|
||||||
|
* [Hand Wiring Guide](hand_wire.md)
|
||||||
|
* [ISP Flashing Guide](isp_flashing_guide.md)
|
||||||
|
|
||||||
* Developing QMK
|
* Developing QMK
|
||||||
* [PR Checklist](pr_checklist.md)
|
* [PR Checklist](pr_checklist.md)
|
||||||
* Breaking Changes
|
* Breaking Changes
|
||||||
* [Overview](breaking_changes.md)
|
* [Overview](breaking_changes.md)
|
||||||
* [My Pull Request Was Flagged](breaking_changes_instructions.md)
|
* [My Pull Request Was Flagged](breaking_changes_instructions.md)
|
||||||
* [Most Recent ChangeLog](ChangeLog/20211127.md "QMK v0.15.0 - 2021 Nov 27")
|
* [Most Recent ChangeLog](ChangeLog/20220226.md "QMK v0.16.0 - 2022 Feb 26")
|
||||||
* [Past Breaking Changes](breaking_changes_history.md)
|
* [Past Breaking Changes](breaking_changes_history.md)
|
||||||
|
|
||||||
* C Development
|
* C Development
|
||||||
* [ARM Debugging Guide](arm_debugging.md)
|
* [ARM Debugging Guide](arm_debugging.md)
|
||||||
* [AVR Processors](hardware_avr.md)
|
|
||||||
* [Coding Conventions](coding_conventions_c.md)
|
* [Coding Conventions](coding_conventions_c.md)
|
||||||
* [Compatible Microcontrollers](compatible_microcontrollers.md)
|
* [Compatible Microcontrollers](compatible_microcontrollers.md)
|
||||||
* [Drivers](hardware_drivers.md)
|
* [Drivers](hardware_drivers.md)
|
||||||
|
@ -62,7 +62,7 @@ This shows us that the job has made it through the queue and is currently runnin
|
|||||||
|
|
||||||
Once your compile job has finished you'll check the `result` key. The value of this key is a hash containing several key bits of information:
|
Once your compile job has finished you'll check the `result` key. The value of this key is a hash containing several key bits of information:
|
||||||
|
|
||||||
* `firmware_binary_url`: A list of URLs for the the flashable firmware
|
* `firmware_binary_url`: A list of URLs for the flashable firmware
|
||||||
* `firmware_keymap_url`: A list of URLs for the the `keymap.c`
|
* `firmware_keymap_url`: A list of URLs for the `keymap.c`
|
||||||
* `firmware_source_url`: A list of URLs for the full firmware source code
|
* `firmware_source_url`: A list of URLs for the full firmware source code
|
||||||
* `output`: The stdout and stderr for this compile job. Errors will be found here.
|
* `output`: The stdout and stderr for this compile job. Errors will be found here.
|
||||||
|
@ -8,6 +8,7 @@ The breaking change period is when we will merge PR's that change QMK in dangero
|
|||||||
|
|
||||||
## What has been included in past Breaking Changes?
|
## What has been included in past Breaking Changes?
|
||||||
|
|
||||||
|
* [2022 Feb 26](ChangeLog/20220226.md)
|
||||||
* [2021 Nov 27](ChangeLog/20211127.md)
|
* [2021 Nov 27](ChangeLog/20211127.md)
|
||||||
* [2021 Aug 28](ChangeLog/20210828.md)
|
* [2021 Aug 28](ChangeLog/20210828.md)
|
||||||
* [2021 May 29](ChangeLog/20210529.md)
|
* [2021 May 29](ChangeLog/20210529.md)
|
||||||
@ -20,17 +21,17 @@ The breaking change period is when we will merge PR's that change QMK in dangero
|
|||||||
|
|
||||||
## When is the next Breaking Change?
|
## When is the next Breaking Change?
|
||||||
|
|
||||||
The next Breaking Change is scheduled for February 26, 2022.
|
The next Breaking Change is scheduled for May 28, 2022.
|
||||||
|
|
||||||
### Important Dates
|
### Important Dates
|
||||||
|
|
||||||
* [x] 2021 Nov 27 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions.
|
* [x] 2022 Feb 26 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions.
|
||||||
* [ ] 2022 Jan 31 - `develop` closed to new PR's.
|
* [ ] 2022 Apr 31 - `develop` closed to new PR's.
|
||||||
* [ ] 2022 Jan 31 - Call for testers.
|
* [ ] 2022 Apr 31 - Call for testers.
|
||||||
* [ ] 2022 Feb 12 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes
|
* [ ] 2022 May 14 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes
|
||||||
* [ ] 2022 Feb 24 - `master` is locked, no PR's merged.
|
* [ ] 2022 May 26 - `master` is locked, no PR's merged.
|
||||||
* [ ] 2022 Feb 26 - Merge `develop` to `master`.
|
* [ ] 2022 May 28 - Merge `develop` to `master`.
|
||||||
* [ ] 2022 Feb 26 - `master` is unlocked. PR's can be merged again.
|
* [ ] 2022 May 28 - `master` is unlocked. PR's can be merged again.
|
||||||
|
|
||||||
## What changes will be included?
|
## What changes will be included?
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
This page links to all previous changelogs from the QMK Breaking Changes process.
|
This page links to all previous changelogs from the QMK Breaking Changes process.
|
||||||
|
|
||||||
|
* [2022 Feb 26](ChangeLog/20220226.md) - version 0.16.0
|
||||||
* [2021 Nov 27](ChangeLog/20211127.md) - version 0.15.0
|
* [2021 Nov 27](ChangeLog/20211127.md) - version 0.15.0
|
||||||
* [2021 Aug 28](ChangeLog/20210828.md) - version 0.14.0
|
* [2021 Aug 28](ChangeLog/20210828.md) - version 0.14.0
|
||||||
* [2021 May 29](ChangeLog/20210529.md) - version 0.13.0
|
* [2021 May 29](ChangeLog/20210529.md) - version 0.13.0
|
||||||
|
@ -54,7 +54,7 @@ or in keymap directory
|
|||||||
```
|
```
|
||||||
$ cd ~/qmk_firmware/keyboards/gh60/satan/keymaps/colemak
|
$ cd ~/qmk_firmware/keyboards/gh60/satan/keymaps/colemak
|
||||||
$ qmk compile
|
$ qmk compile
|
||||||
Ψ Compiling keymap with make make gh60/satan:colemak
|
Ψ Compiling keymap with make gh60/satan:colemak
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -310,7 +310,7 @@ Any arguments that are not provided will prompt for input. If `-u` is not passed
|
|||||||
**Usage**:
|
**Usage**:
|
||||||
|
|
||||||
```
|
```
|
||||||
qmk new-keyboard [-kb KEYBOARD] [-t {avr,ps2avrgb}] -u USERNAME
|
qmk new-keyboard [-kb KEYBOARD] [-t {atmega32u4,STM32F303,etc}] [-l {60_ansi,75_iso,etc}] -u USERNAME
|
||||||
```
|
```
|
||||||
|
|
||||||
## `qmk new-keymap`
|
## `qmk new-keymap`
|
||||||
|
@ -188,7 +188,7 @@ cli.log.info('Reading from %s and writing to %s', cli.args.filename, cli.args.ou
|
|||||||
|
|
||||||
# Testing, and Linting, and Formatting (oh my!)
|
# 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 `format-py` subcommands to run these tests:
|
We use nose2, flake8, and yapf to test, lint, and format code. You can use the `pytest` and `format-python` subcommands to run these tests:
|
||||||
|
|
||||||
### Testing and Linting
|
### Testing and Linting
|
||||||
|
|
||||||
@ -196,7 +196,7 @@ We use nose2, flake8, and yapf to test, lint, and format code. You can use the `
|
|||||||
|
|
||||||
### Formatting
|
### Formatting
|
||||||
|
|
||||||
qmk format-py
|
qmk format-python
|
||||||
|
|
||||||
## Formatting Details
|
## Formatting Details
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# Compatible Microcontrollers
|
# Compatible Microcontrollers
|
||||||
|
|
||||||
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.
|
QMK runs on any USB-capable AVR or ARM microcontroller with enough flash space - generally 32kB+ for AVR, and 64kB+ for ARM. With significant disabling of features, QMK may *just* squeeze into 16kB AVR MCUs.
|
||||||
|
|
||||||
## Atmel AVR
|
## Atmel AVR
|
||||||
|
|
||||||
@ -8,7 +8,11 @@ The following use [LUFA](https://www.fourwalledcubicle.com/LUFA.php) as the USB
|
|||||||
|
|
||||||
* [ATmega16U2](https://www.microchip.com/wwwproducts/en/ATmega16U2) / [ATmega32U2](https://www.microchip.com/wwwproducts/en/ATmega32U2)
|
* [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)
|
* [ATmega16U4](https://www.microchip.com/wwwproducts/en/ATmega16U4) / [ATmega32U4](https://www.microchip.com/wwwproducts/en/ATmega32U4)
|
||||||
|
* SparkFun Pro Micro (and clones)
|
||||||
|
* PJRC Teensy 2.0
|
||||||
|
* Adafruit Feather 32U4
|
||||||
* [AT90USB64](https://www.microchip.com/wwwproducts/en/AT90USB646) / [AT90USB128](https://www.microchip.com/wwwproducts/en/AT90USB1286)
|
* [AT90USB64](https://www.microchip.com/wwwproducts/en/AT90USB646) / [AT90USB128](https://www.microchip.com/wwwproducts/en/AT90USB1286)
|
||||||
|
* PJRC Teensy++ 2.0
|
||||||
* [AT90USB162](https://www.microchip.com/wwwproducts/en/AT90USB162)
|
* [AT90USB162](https://www.microchip.com/wwwproducts/en/AT90USB162)
|
||||||
|
|
||||||
Certain MCUs which do not have native USB will use [V-USB](https://www.obdev.at/products/vusb/index.html) instead:
|
Certain MCUs which do not have native USB will use [V-USB](https://www.obdev.at/products/vusb/index.html) instead:
|
||||||
@ -25,17 +29,23 @@ You can also use any ARM chip with USB that [ChibiOS](https://www.chibios.org) s
|
|||||||
|
|
||||||
* [STM32F0x2](https://www.st.com/en/microcontrollers-microprocessors/stm32f0x2.html)
|
* [STM32F0x2](https://www.st.com/en/microcontrollers-microprocessors/stm32f0x2.html)
|
||||||
* [STM32F103](https://www.st.com/en/microcontrollers-microprocessors/stm32f103.html)
|
* [STM32F103](https://www.st.com/en/microcontrollers-microprocessors/stm32f103.html)
|
||||||
|
* Bluepill (with STM32duino bootloader)
|
||||||
* [STM32F303](https://www.st.com/en/microcontrollers-microprocessors/stm32f303.html)
|
* [STM32F303](https://www.st.com/en/microcontrollers-microprocessors/stm32f303.html)
|
||||||
|
* QMK Proton-C
|
||||||
* [STM32F401](https://www.st.com/en/microcontrollers-microprocessors/stm32f401.html)
|
* [STM32F401](https://www.st.com/en/microcontrollers-microprocessors/stm32f401.html)
|
||||||
|
* WeAct Blackpill
|
||||||
* [STM32F405](https://www.st.com/en/microcontrollers-microprocessors/stm32f405-415.html)
|
* [STM32F405](https://www.st.com/en/microcontrollers-microprocessors/stm32f405-415.html)
|
||||||
* [STM32F407](https://www.st.com/en/microcontrollers-microprocessors/stm32f407-417.html)
|
* [STM32F407](https://www.st.com/en/microcontrollers-microprocessors/stm32f407-417.html)
|
||||||
* [STM32F411](https://www.st.com/en/microcontrollers-microprocessors/stm32f411.html)
|
* [STM32F411](https://www.st.com/en/microcontrollers-microprocessors/stm32f411.html)
|
||||||
|
* WeAct Blackpill
|
||||||
* [STM32F446](https://www.st.com/en/microcontrollers-microprocessors/stm32f446.html)
|
* [STM32F446](https://www.st.com/en/microcontrollers-microprocessors/stm32f446.html)
|
||||||
* [STM32G431](https://www.st.com/en/microcontrollers-microprocessors/stm32g4x1.html)
|
* [STM32G431](https://www.st.com/en/microcontrollers-microprocessors/stm32g4x1.html)
|
||||||
* [STM32G474](https://www.st.com/en/microcontrollers-microprocessors/stm32g4x4.html)
|
* [STM32G474](https://www.st.com/en/microcontrollers-microprocessors/stm32g4x4.html)
|
||||||
* [STM32L412](https://www.st.com/en/microcontrollers-microprocessors/stm32l4x2.html)
|
* [STM32L412](https://www.st.com/en/microcontrollers-microprocessors/stm32l4x2.html)
|
||||||
* [STM32L422](https://www.st.com/en/microcontrollers-microprocessors/stm32l4x2.html)
|
* [STM32L422](https://www.st.com/en/microcontrollers-microprocessors/stm32l4x2.html)
|
||||||
|
* [STM32L432](https://www.st.com/en/microcontrollers-microprocessors/stm32l4x2.html)
|
||||||
* [STM32L433](https://www.st.com/en/microcontrollers-microprocessors/stm32l4x3.html)
|
* [STM32L433](https://www.st.com/en/microcontrollers-microprocessors/stm32l4x3.html)
|
||||||
|
* [STM32L442](https://www.st.com/en/microcontrollers-microprocessors/stm32l4x2.html)
|
||||||
* [STM32L443](https://www.st.com/en/microcontrollers-microprocessors/stm32l4x3.html)
|
* [STM32L443](https://www.st.com/en/microcontrollers-microprocessors/stm32l4x3.html)
|
||||||
|
|
||||||
### WestBerryTech (WB32)
|
### WestBerryTech (WB32)
|
||||||
@ -45,13 +55,16 @@ You can also use any ARM chip with USB that [ChibiOS](https://www.chibios.org) s
|
|||||||
### NXP (Kinetis)
|
### 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)
|
* [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)
|
||||||
|
* PJRC Teensy LC
|
||||||
* [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)
|
* [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)
|
* [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)
|
||||||
|
* PJRC Teensy 3.2
|
||||||
* [MK66FX1M0](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/k-series-cortex-m4/k6x-ethernet/kinetis-k66-180-mhz-dual-high-speed-full-speed-usbs-2mb-flash-microcontrollers-mcus-based-on-arm-cortex-m4-core:K66_180)
|
* [MK66FX1M0](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/k-series-cortex-m4/k6x-ethernet/kinetis-k66-180-mhz-dual-high-speed-full-speed-usbs-2mb-flash-microcontrollers-mcus-based-on-arm-cortex-m4-core:K66_180)
|
||||||
|
* PJRC Teensy 3.6
|
||||||
|
|
||||||
## Atmel ATSAM
|
## 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).
|
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). However, it is not recommended to design a board with this microcontroller as the support is quite specialized to Massdrop hardware.
|
||||||
|
|
||||||
## RISC-V
|
## RISC-V
|
||||||
|
|
||||||
|
@ -61,6 +61,8 @@ This is a C header file that is one of the first things included, and will persi
|
|||||||
* pins unused by the keyboard for reference
|
* pins unused by the keyboard for reference
|
||||||
* `#define MATRIX_HAS_GHOST`
|
* `#define MATRIX_HAS_GHOST`
|
||||||
* define is matrix has ghost (unlikely)
|
* define is matrix has ghost (unlikely)
|
||||||
|
* `#define MATRIX_UNSELECT_DRIVE_HIGH`
|
||||||
|
* On un-select of matrix pins, rather than setting pins to input-high, sets them to output-high.
|
||||||
* `#define DIODE_DIRECTION COL2ROW`
|
* `#define DIODE_DIRECTION COL2ROW`
|
||||||
* COL2ROW or ROW2COL - how your matrix is configured. COL2ROW means the black mark on your diode is facing to the rows, and between the switch and the rows.
|
* COL2ROW or ROW2COL - how your matrix is configured. COL2ROW means the black mark on your diode is facing to the rows, and between the switch and the rows.
|
||||||
* `#define DIRECT_PINS { { F1, F0, B0, C7 }, { F4, F5, F6, F7 } }`
|
* `#define DIRECT_PINS { { F1, F0, B0, C7 }, { F4, F5, F6, F7 } }`
|
||||||
@ -124,10 +126,6 @@ If you define these options you will disable the associated feature, which can s
|
|||||||
* disable tap dance and other tapping features
|
* disable tap dance and other tapping features
|
||||||
* `#define NO_ACTION_ONESHOT`
|
* `#define NO_ACTION_ONESHOT`
|
||||||
* disable one-shot modifiers
|
* disable one-shot modifiers
|
||||||
* `#define NO_ACTION_MACRO`
|
|
||||||
* disable old-style macro handling using `MACRO()`, `action_get_macro()` _(deprecated)_
|
|
||||||
* `#define NO_ACTION_FUNCTION`
|
|
||||||
* disable old-style function handling using `fn_actions`, `action_function()` _(deprecated)_
|
|
||||||
|
|
||||||
## Features That Can Be Enabled
|
## Features That Can Be Enabled
|
||||||
|
|
||||||
@ -383,7 +381,6 @@ This is a [make](https://www.gnu.org/software/make/manual/make.html) file that i
|
|||||||
* A list of [layouts](feature_layouts.md) this keyboard supports.
|
* A list of [layouts](feature_layouts.md) this keyboard supports.
|
||||||
* `LTO_ENABLE`
|
* `LTO_ENABLE`
|
||||||
* Enables Link Time Optimization (LTO) when compiling the keyboard. This makes the process take longer, but it can significantly reduce the compiled size (and since the firmware is small, the added time is not noticeable).
|
* Enables Link Time Optimization (LTO) when compiling the keyboard. This makes the process take longer, but it can significantly reduce the compiled size (and since the firmware is small, the added time is not noticeable).
|
||||||
However, this will automatically disable the legacy TMK Macros and Functions features, as these break when LTO is enabled. It does this by automatically defining `NO_ACTION_MACRO` and `NO_ACTION_FUNCTION`. (Note: This does not affect QMK [Macros](feature_macros.md) and [Layers](feature_layers.md).)
|
|
||||||
|
|
||||||
## AVR MCU Options
|
## AVR MCU Options
|
||||||
* `MCU = atmega32u4`
|
* `MCU = atmega32u4`
|
||||||
@ -434,8 +431,8 @@ Use these to enable or disable building certain features. The more you have enab
|
|||||||
* MIDI controls
|
* MIDI controls
|
||||||
* `UNICODE_ENABLE`
|
* `UNICODE_ENABLE`
|
||||||
* Unicode
|
* Unicode
|
||||||
* `BLUETOOTH`
|
* `BLUETOOTH_ENABLE`
|
||||||
* Current options are AdafruitBLE, RN42
|
* Current options are BluefruitLE, RN42
|
||||||
* `SPLIT_KEYBOARD`
|
* `SPLIT_KEYBOARD`
|
||||||
* Enables split keyboard support (dual MCU like the let's split and bakingpy's boards) and includes all necessary files located at quantum/split_common
|
* Enables split keyboard support (dual MCU like the let's split and bakingpy's boards) and includes all necessary files located at quantum/split_common
|
||||||
* `CUSTOM_MATRIX`
|
* `CUSTOM_MATRIX`
|
||||||
|
@ -43,7 +43,7 @@ Keycode Entry is accomplished in one of 3 ways:
|
|||||||
|
|
||||||
## Step 5: Save Your Keymap for Future Changes
|
## Step 5: Save Your Keymap for Future Changes
|
||||||
|
|
||||||
When you're satisfied with your keymap or just want to work on it later, press the `Export Keymap` button. It will save your keymap to your computer. You can then load this .json file in the future by pressing the `Import Keymap` button.
|
When you're satisfied with your keymap or just want to work on it later, press the `Download this QMK Keymap JSON File` button. It will save your keymap to your computer. You can then load this .json file in the future by pressing the `Upload a QMK Keymap JSON File` button.
|
||||||
|
|
||||||
!> **CAUTION:** This is not the same type of .json file used for kbfirmware.com or any other tool. If you try to use this for those tools, or the .json from those tools with QMK Configurator, you will encounter problems.
|
!> **CAUTION:** This is not the same type of .json file used for kbfirmware.com or any other tool. If you try to use this for those tools, or the .json from those tools with QMK Configurator, you will encounter problems.
|
||||||
|
|
||||||
|
@ -109,7 +109,7 @@ Before opening a pull request, you can preview your changes if you have set up t
|
|||||||
|
|
||||||
or if you only have Python 3 installed:
|
or if you only have Python 3 installed:
|
||||||
|
|
||||||
python3 -m http.server 8936
|
python3 -m http.server 8936 --directory docs
|
||||||
|
|
||||||
and navigating to `http://localhost:8936/`.
|
and navigating to `http://localhost:8936/`.
|
||||||
|
|
||||||
@ -165,4 +165,4 @@ To maintain a clear vision of how things are laid out in QMK we try to plan out
|
|||||||
|
|
||||||
# What Does the Code of Conduct Mean for Me?
|
# What Does the Code of Conduct Mean for Me?
|
||||||
|
|
||||||
Our [Code of Conduct](https://github.com/qmk/qmk_firmware/blob/master/CODE_OF_CONDUCT.md) means that you are responsible for treating everyone on the project with respect and courtesy regardless of their identity. If you are the victim of any inappropriate behavior or comments as described in our Code of Conduct, we are here for you and will do the best to ensure that the abuser is reprimanded appropriately, per our code.
|
Our [Code of Conduct](https://qmk.fm/coc/) means that you are responsible for treating everyone on the project with respect and courtesy regardless of their identity. If you are the victim of any inappropriate behavior or comments as described in our Code of Conduct, we are here for you and will do the best to ensure that the abuser is reprimanded appropriately, per our code.
|
||||||
|
@ -408,7 +408,7 @@ The `val` is the value of the data that you want to write to EEPROM. And the `e
|
|||||||
|
|
||||||
### Deferred Execution :id=deferred-execution
|
### Deferred Execution :id=deferred-execution
|
||||||
|
|
||||||
QMK has the ability to execute a callback after a specified period of time, rather than having to manually manage timers.
|
QMK has the ability to execute a callback after a specified period of time, rather than having to manually manage timers. To enable this functionality, set `DEFERRED_EXEC_ENABLE = yes` in rules.mk.
|
||||||
|
|
||||||
#### Deferred executor callbacks
|
#### Deferred executor callbacks
|
||||||
|
|
||||||
|
@ -74,7 +74,7 @@ Whenever QMK generates a complete `info.json` it extracts information from `conf
|
|||||||
|
|
||||||
If you are not sure how to edit this file or are not comfortable with Python [open an issue](https://github.com/qmk/qmk_firmware/issues/new?assignees=&labels=cli%2C+python&template=other_issues.md&title=) or [join #cli on Discord](https://discord.gg/heQPAgy) and someone can help you with this part.
|
If you are not sure how to edit this file or are not comfortable with Python [open an issue](https://github.com/qmk/qmk_firmware/issues/new?assignees=&labels=cli%2C+python&template=other_issues.md&title=) or [join #cli on Discord](https://discord.gg/heQPAgy) and someone can help you with this part.
|
||||||
|
|
||||||
### Add code to generate it
|
### Add code to generate it :id=add-code-to-generate-it
|
||||||
|
|
||||||
The final piece of the puzzle is providing your new option to the build system. This is done by generating two files:
|
The final piece of the puzzle is providing your new option to the build system. This is done by generating two files:
|
||||||
|
|
||||||
|
@ -1,32 +0,0 @@
|
|||||||
# Quantum Mechanical Keyboard Firmware
|
|
||||||
|
|
||||||
[![Aktuelle Version](https://img.shields.io/github/tag/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/tags)
|
|
||||||
[![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](https://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](https://olkb.com), das [ErgoDox EZ](https://www.ergodox-ez.com) und das [Clueboard](https://clueboard.co/) entwickelt. Im Laufe der Zeit wurde sie mit Hilfe von [ChibiOS](https://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.
|
|
@ -1,122 +0,0 @@
|
|||||||
* [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/one_shot_keys.md)
|
|
||||||
* [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)
|
|
||||||
* [SPI Driver](de/spi_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/getting_started_getting_help.md)
|
|
||||||
* [Übersetzungen](de/translating.md)
|
|
||||||
|
|
||||||
* QMK Internals (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)
|
|
150
docs/de/cli.md
150
docs/de/cli.md
@ -1,150 +0,0 @@
|
|||||||
# 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`.
|
|
||||||
|
|
||||||
# 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 format-c`
|
|
||||||
|
|
||||||
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 format-c [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 format-py`
|
|
||||||
|
|
||||||
Dieser Befehl formatiert Python-Code in `qmk_firmware`.
|
|
||||||
|
|
||||||
**Anwendung**:
|
|
||||||
|
|
||||||
```
|
|
||||||
qmk format-py
|
|
||||||
```
|
|
||||||
|
|
||||||
## `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
|
|
||||||
```
|
|
@ -1,47 +0,0 @@
|
|||||||
# 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.
|
|
@ -1,22 +0,0 @@
|
|||||||
# 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).
|
|
@ -1,78 +0,0 @@
|
|||||||
# 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.
|
|
@ -1,369 +0,0 @@
|
|||||||
# 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.
|
|
@ -1,101 +0,0 @@
|
|||||||
# 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++](https://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](https://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).
|
|
@ -1,14 +0,0 @@
|
|||||||
# 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)
|
|
@ -1,102 +0,0 @@
|
|||||||
# 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](https://www.keyboardtester.com) (Web basiert)
|
|
||||||
* [Keyboard Checker](https://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:
|
|
||||||
|
|
||||||
```c
|
|
||||||
#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
|
|
||||||
```
|
|
@ -7,7 +7,7 @@ There are different styles of Easy Maker available depending on your needs:
|
|||||||
* [Direct Pin](https://config.qmk.fm/#/?filter=ez_maker/direct) - Connect a single switch to a single pin
|
* [Direct Pin](https://config.qmk.fm/#/?filter=ez_maker/direct) - Connect a single switch to a single pin
|
||||||
* Direct Pin + Backlight (Coming Soon) - Like Direct Pin but dedicates a single pin to [Backlight](feature_backlight.md) control
|
* Direct Pin + Backlight (Coming Soon) - Like Direct Pin but dedicates a single pin to [Backlight](feature_backlight.md) control
|
||||||
* Direct Pin + Numlock (Coming Soon) - Like Direct Pin but dedicates a single pin to the Numlock LED
|
* Direct Pin + Numlock (Coming Soon) - Like Direct Pin but dedicates a single pin to the Numlock LED
|
||||||
* Direct Pin + Capslock (Coming Soon) - Like Direct Pin but dedicates a single pin to the Numlock LED
|
* Direct Pin + Capslock (Coming Soon) - Like Direct Pin but dedicates a single pin to the Capslock LED
|
||||||
* Direct Pin + Encoder (Coming Soon) - Like Direct Pin but uses 2 pins to add a single rotary encoder
|
* Direct Pin + Encoder (Coming Soon) - Like Direct Pin but uses 2 pins to add a single rotary encoder
|
||||||
|
|
||||||
## Quickstart
|
## Quickstart
|
||||||
|
@ -1,31 +0,0 @@
|
|||||||
# Firmware Quantum Mechanical Keyboard
|
|
||||||
|
|
||||||
[![Versión actual](https://img.shields.io/github/tag/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/tags)
|
|
||||||
[![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](https://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](https://olkb.com), el teclado [ErgoDox EZ](https://www.ergodox-ez.com), y la [línea de productos Clueboard](https://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](es/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](es/features.md) para explorar, y una buena cantidad de [documentación de referencia](https://docs.qmk.fm) en la que sumergirse. Se pueden sacar provecho de la mayoría de las características modificando tu [keymap](es/keymap.md), y cambiando los [keycodes](es/keycodes.md).
|
|
@ -1,122 +0,0 @@
|
|||||||
* [Guía completa para novatos](es/newbs.md)
|
|
||||||
* [Empezando](es/newbs_getting_started.md)
|
|
||||||
* [Construyendo tu primer firmare](es/newbs_building_firmware.md)
|
|
||||||
* [Flasheando el firmware](es/newbs_flashing.md)
|
|
||||||
* [Testeando y depurando ](es/newbs_testing_debugging.md)
|
|
||||||
* [Mejores práticas](es/newbs_best_practices.md)
|
|
||||||
* [Recursos de aprendizaje](es/newbs_learn_more_resources.md)
|
|
||||||
|
|
||||||
* [QMK Basics](es/README.md)
|
|
||||||
* [Introducción a QMK](es/getting_started_introduction.md)
|
|
||||||
* [QMK CLI](es/cli.md)
|
|
||||||
* [Configuración de QMK CLI](es/cli_configuration.md)
|
|
||||||
* [Contribuyendo a QMK](es/contributing.md)
|
|
||||||
* [Cómo usar GitHub](es/getting_started_github.md)
|
|
||||||
* [Obtener ayuda](es/getting_started_getting_help.md)
|
|
||||||
|
|
||||||
* [Cambios incompatibles](es/breaking_changes.md)
|
|
||||||
* [30 Ago 2019](es/ChangeLog/20190830.md)
|
|
||||||
|
|
||||||
* [Preguntas frecuentes](es/faq.md)
|
|
||||||
* [General](es/faq_general.md)
|
|
||||||
* [Construir/Compilar QMK](es/faq_build.md)
|
|
||||||
* [Depurando/Encontrando problemas en QMK](es/faq_debug.md)
|
|
||||||
* [Keymap](es/faq_keymap.md)
|
|
||||||
* [Instalación de drivers con Zadig](es/driver_installation_zadig.md)
|
|
||||||
|
|
||||||
* Guías detalladas
|
|
||||||
* [Instalar herramientas construcción](es/getting_started_build_tools.md)
|
|
||||||
* [Guía Vagrant](es/getting_started_vagrant.md)
|
|
||||||
* [Instrucciones de Construcción/Compilado](es/getting_started_make_guide.md)
|
|
||||||
* [Flasheando Firmware](es/flashing.md)
|
|
||||||
* [Personalizando funcionalidad](es/custom_quantum_functions.md)
|
|
||||||
* [Visión general del Keymap](es/keymap.md)
|
|
||||||
|
|
||||||
* [Hardware](es/hardware.md)
|
|
||||||
* [Procesadores AVR](es/hardware_avr.md)
|
|
||||||
* [Drivers](es/hardware_drivers.md)
|
|
||||||
|
|
||||||
* Referencia
|
|
||||||
* [Pautas de teclados](es/hardware_keyboard_guidelines.md)
|
|
||||||
* [Opciones de configuración](es/config_options.md)
|
|
||||||
* [Keycodes](es/keycodes.md)
|
|
||||||
* [Convenciones de código - C](es/coding_conventions_c.md)
|
|
||||||
* [Convenciones de código - Python](es/coding_conventions_python.md)
|
|
||||||
* [Mejores prácticas de documentación](es/documentation_best_practices.md)
|
|
||||||
* [Plantillas de documentación](es/documentation_templates.md)
|
|
||||||
* [Glosario](es/reference_glossary.md)
|
|
||||||
* [Tests unitarios](es/unit_testing.md)
|
|
||||||
* [Funciones útiles](es/ref_functions.md)
|
|
||||||
* [Sporte configurador](es/reference_configurator_support.md)
|
|
||||||
* [Formato info.json](es/reference_info_json.md)
|
|
||||||
* [Desarrollo Python CLI](es/cli_development.md)
|
|
||||||
|
|
||||||
* [Características](es/features.md)
|
|
||||||
* [Keycodes Básicos](es/keycodes_basic.md)
|
|
||||||
* [Teclas US ANSI Shifted](es/keycodes_us_ansi_shifted.md)
|
|
||||||
* [Keycodes Quantum](es/quantum_keycodes.md)
|
|
||||||
* [Keycodes Avanzados](es/feature_advanced_keycodes.md)
|
|
||||||
* [Audio](es/feature_audio.md)
|
|
||||||
* [Auto Shift](es/feature_auto_shift.md)
|
|
||||||
* [Retroiluminación](es/feature_backlight.md)
|
|
||||||
* [Bluetooth](es/feature_bluetooth.md)
|
|
||||||
* [Bootmagic](es/feature_bootmagic.md)
|
|
||||||
* [Combos](es/feature_combo.md)
|
|
||||||
* [Comando](es/feature_command.md)
|
|
||||||
* [API Debounce](es/feature_debounce_type.md)
|
|
||||||
* [Switch DIP](es/feature_dip_switch.md)
|
|
||||||
* [Macros Dinámicas](es/feature_dynamic_macros.md)
|
|
||||||
* [Encoders](es/feature_encoders.md)
|
|
||||||
* [Grave Escape](es/feature_grave_esc.md)
|
|
||||||
* [Feedback Háptico](es/feature_haptic_feedback.md)
|
|
||||||
* [Controlador LCD HD44780](es/feature_hd44780.md)
|
|
||||||
* [Key Lock](es/feature_key_lock.md)
|
|
||||||
* [Layouts](es/feature_layouts.md)
|
|
||||||
* [Tecla Leader](es/feature_leader_key.md)
|
|
||||||
* [Matriz LED](es/feature_led_matrix.md)
|
|
||||||
* [Macros](es/feature_macros.md)
|
|
||||||
* [Teclas del ratón](es/feature_mouse_keys.md)
|
|
||||||
* [Driver OLED](es/feature_oled_driver.md)
|
|
||||||
* [Teclas One Shot](es/one_shot_keys.md)
|
|
||||||
* [Dispositivo de apuntado](es/feature_pointing_device.md)
|
|
||||||
* [Ratón PS/2](es/feature_ps2_mouse.md)
|
|
||||||
* [Iluminación RGB](es/feature_rgblight.md)
|
|
||||||
* [Matriz RGB](es/feature_rgb_matrix.md)
|
|
||||||
* [Cadete espacial](es/feature_space_cadet.md)
|
|
||||||
* [Teclado dividido](es/feature_split_keyboard.md)
|
|
||||||
* [Stenografía](es/feature_stenography.md)
|
|
||||||
* [Swap Hands](es/feature_swap_hands.md)
|
|
||||||
* [Tap Dance](es/feature_tap_dance.md)
|
|
||||||
* [Terminal](es/feature_terminal.md)
|
|
||||||
* [Impresora Térmica](es/feature_thermal_printer.md)
|
|
||||||
* [Unicode](es/feature_unicode.md)
|
|
||||||
* [Userspace](es/feature_userspace.md)
|
|
||||||
* [Velocikey](es/feature_velocikey.md)
|
|
||||||
|
|
||||||
* Para Makers y Modders
|
|
||||||
* [Guía de cableado a mano](es/hand_wire.md)
|
|
||||||
* [Guía de flasheado de ISP](es/isp_flashing_guide.md)
|
|
||||||
* [Guía de depuración de ARM](es/arm_debugging.md)
|
|
||||||
* [Driver I2C](es/i2c_driver.md)
|
|
||||||
* [Driver SPI](es/spi_driver.md)
|
|
||||||
* [Controles GPIO](es/internals_gpio_control.md)
|
|
||||||
* [Conversión Proton C](es/proton_c_conversion.md)
|
|
||||||
|
|
||||||
* Para entender en profundidad
|
|
||||||
* [Cómo funcionan los teclados](es/how_keyboards_work.md)
|
|
||||||
* [Entendiendo QMK](es/understanding_qmk.md)
|
|
||||||
|
|
||||||
* Otros temas
|
|
||||||
* [Usando Eclipse con QMK](es/other_eclipse.md)
|
|
||||||
* [Usando VSCode con QMK](es/other_vscode.md)
|
|
||||||
* [Soporte](es/getting_started_getting_help.md)
|
|
||||||
* [Cómo añadir traducciones](es/translating.md)
|
|
||||||
|
|
||||||
* QMK Internals (En progreso)
|
|
||||||
* [Defines](es/internals_defines.md)
|
|
||||||
* [Input Callback Reg](es/internals_input_callback_reg.md)
|
|
||||||
* [Dispositivo Midi](es/internals_midi_device.md)
|
|
||||||
* [Proceso de configuración de un dispositivo Midi](es/internals_midi_device_setup_process.md)
|
|
||||||
* [Utilidad Midi](es/internals_midi_util.md)
|
|
||||||
* [Funciones Send](es/internals_send_functions.md)
|
|
||||||
* [Herramientas Sysex](es/internals_sysex_tools.md)
|
|
@ -1,8 +0,0 @@
|
|||||||
# Hardware
|
|
||||||
|
|
||||||
QMK es compatible con una variedad de hardware. Si tu procesador puede ser dirigido por [LUFA](https://www.fourwalledcubicle.com/LUFA.php) o [ChibiOS](https://www.chibios.org), 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)
|
|
@ -1,182 +0,0 @@
|
|||||||
# 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 `qmk new-keyboard`:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ qmk new-keyboard
|
|
||||||
Ψ Generating a new QMK keyboard directory
|
|
||||||
|
|
||||||
Keyboard Name: mycoolkeeb
|
|
||||||
Keyboard Type:
|
|
||||||
1. avr
|
|
||||||
2. ps2avrgb
|
|
||||||
Please enter your choice: [1]
|
|
||||||
Your Name: [John Smith]
|
|
||||||
Ψ Copying base template files...
|
|
||||||
Ψ Copying avr template files...
|
|
||||||
Ψ Renaming keyboard.[ch] to mycoolkeeb.[ch]...
|
|
||||||
Ψ Replacing %YEAR% with 2021...
|
|
||||||
Ψ Replacing %KEYBOARD% with mycoolkeeb...
|
|
||||||
Ψ Replacing %YOUR_NAME% with John Smith...
|
|
||||||
|
|
||||||
Ψ Created a new keyboard called mycoolkeeb.
|
|
||||||
Ψ To start working on things, `cd` into keyboards/mycoolkeeb,
|
|
||||||
Ψ or open the directory in your preferred 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](https://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` y `PRODUCT` 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
|
|
||||||
```
|
|
||||||
|
|
||||||
?> 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.
|
|
@ -1,31 +0,0 @@
|
|||||||
# 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).
|
|
||||||
|
|
||||||
## 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).
|
|
@ -1,147 +0,0 @@
|
|||||||
# 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](https://qmk.fm). Archivos descargables se almacenan en `/<teclado>/` (nombre sigue el mismo formato que el anterior), se sirven en `https://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](https://www.chibios.org) licencia GPLv3.
|
|
||||||
|
|
||||||
## 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)!
|
|
@ -1,23 +0,0 @@
|
|||||||
# 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](https://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.
|
|
@ -1,159 +0,0 @@
|
|||||||
# 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.
|
|
@ -1,81 +0,0 @@
|
|||||||
# 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.
|
|
@ -1,105 +0,0 @@
|
|||||||
# 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://www.youtube.com/watch?v=-imgglzDMdY)
|
|
||||||
|
|
||||||
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)
|
|
@ -1,351 +0,0 @@
|
|||||||
# 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.
|
|
@ -1,103 +0,0 @@
|
|||||||
# 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](https://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).
|
|
@ -1,15 +0,0 @@
|
|||||||
# 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)
|
|
@ -1,101 +0,0 @@
|
|||||||
# 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](https://www.keyboardtester.com) (Aplicación web)
|
|
||||||
* [Keyboard Checker](https://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:
|
|
||||||
|
|
||||||
```c
|
|
||||||
#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
|
|
||||||
```
|
|
@ -18,15 +18,19 @@ void keyboard_post_init_user(void) {
|
|||||||
|
|
||||||
## Debugging Tools
|
## Debugging Tools
|
||||||
|
|
||||||
There are two different tools you can use to debug your keyboard.
|
Various tools are available to debug your keyboard.
|
||||||
|
|
||||||
### Debugging With QMK Toolbox
|
### Debugging With QMK Toolbox
|
||||||
|
|
||||||
For compatible platforms, [QMK Toolbox](https://github.com/qmk/qmk_toolbox) can be used to display debug messages from your keyboard.
|
For compatible platforms, [QMK Toolbox](https://github.com/qmk/qmk_toolbox) can be used to display debug messages from your keyboard.
|
||||||
|
|
||||||
|
### Debugging with QMK CLI
|
||||||
|
|
||||||
|
Prefer a terminal based solution? The [QMK CLI console command](cli_commands.md#qmk-console) can be used to display debug messages from your keyboard.
|
||||||
|
|
||||||
### Debugging With hid_listen
|
### Debugging With hid_listen
|
||||||
|
|
||||||
Prefer a terminal based solution? [hid_listen](https://www.pjrc.com/teensy/hid_listen.html), provided by PJRC, can also be used to display debug messages. Prebuilt binaries for Windows,Linux,and MacOS are available.
|
Something stand-alone? [hid_listen](https://www.pjrc.com/teensy/hid_listen.html), provided by PJRC, can also be used to display debug messages. Prebuilt binaries for Windows,Linux,and MacOS are available.
|
||||||
|
|
||||||
## Sending Your Own Debug Messages :id=debug-api
|
## Sending Your Own Debug Messages :id=debug-api
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@ Currently Bluetooth support is limited to AVR based chips. For Bluetooth 2.1, QM
|
|||||||
|Board |Bluetooth Protocol |Connection Type|rules.mk |Bluetooth Chip|
|
|Board |Bluetooth Protocol |Connection Type|rules.mk |Bluetooth Chip|
|
||||||
|----------------------------------------------------------------|--------------------|---------------|--------------------------------|--------------|
|
|----------------------------------------------------------------|--------------------|---------------|--------------------------------|--------------|
|
||||||
|Roving Networks RN-42 (Sparkfun Bluesmirf) |Bluetooth Classic |UART |`BLUETOOTH_DRIVER = RN42` |RN-42 |
|
|Roving Networks RN-42 (Sparkfun Bluesmirf) |Bluetooth Classic |UART |`BLUETOOTH_DRIVER = RN42` |RN-42 |
|
||||||
|[Bluefruit LE SPI Friend](https://www.adafruit.com/product/2633)|Bluetooth Low Energy|SPI |`BLUETOOTH_DRIVER = AdafruitBLE`|nRF51822 |
|
|[Bluefruit LE SPI Friend](https://www.adafruit.com/product/2633)|Bluetooth Low Energy|SPI |`BLUETOOTH_DRIVER = BluefruitLE`|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)
|
||||||
@ -16,10 +16,10 @@ Not Supported Yet but possible:
|
|||||||
* HM-13 based boards
|
* HM-13 based boards
|
||||||
|
|
||||||
### Adafruit BLE SPI Friend
|
### Adafruit BLE SPI Friend
|
||||||
Currently The only bluetooth chipset supported by QMK is the Adafruit Bluefruit SPI Friend. It's a Nordic nRF5182 based chip running Adafruit's custom firmware. Data is transmitted via Adafruit's SDEP over Hardware SPI. The [Feather 32u4 Bluefruit LE](https://www.adafruit.com/product/2829) is supported as it's an AVR mcu connected via SPI to the Nordic BLE chip with Adafruit firmware. If Building a custom board with the SPI friend it would be easiest to just use the pin selection that the 32u4 feather uses but you can change the pins in the config.h options with the following defines:
|
Currently The only bluetooth chipset supported by QMK is the Adafruit Bluefruit SPI Friend. It's a Nordic nRF51822 based chip running Adafruit's custom firmware. Data is transmitted via Adafruit's SDEP over Hardware SPI. The [Feather 32u4 Bluefruit LE](https://www.adafruit.com/product/2829) is supported as it's an AVR mcu connected via SPI to the Nordic BLE chip with Adafruit firmware. If Building a custom board with the SPI friend it would be easiest to just use the pin selection that the 32u4 feather uses but you can change the pins in the config.h options with the following defines:
|
||||||
* `#define ADAFRUIT_BLE_RST_PIN D4`
|
* `#define BLUEFRUIT_LE_RST_PIN D4`
|
||||||
* `#define ADAFRUIT_BLE_CS_PIN B4`
|
* `#define BLUEFRUIT_LE_CS_PIN B4`
|
||||||
* `#define ADAFRUIT_BLE_IRQ_PIN E6`
|
* `#define BLUEFRUIT_LE_IRQ_PIN E6`
|
||||||
|
|
||||||
A Bluefruit UART friend can be converted to an SPI friend, however this [requires](https://github.com/qmk/qmk_firmware/issues/2274) some reflashing and soldering directly to the MDBT40 chip.
|
A Bluefruit UART friend can be converted to an SPI friend, however this [requires](https://github.com/qmk/qmk_firmware/issues/2274) some reflashing and soldering directly to the MDBT40 chip.
|
||||||
|
|
||||||
@ -32,7 +32,7 @@ Add the following to your `rules.mk`:
|
|||||||
|
|
||||||
```make
|
```make
|
||||||
BLUETOOTH_ENABLE = yes
|
BLUETOOTH_ENABLE = yes
|
||||||
BLUETOOTH_DRIVER = AdafruitBLE # or RN42
|
BLUETOOTH_DRIVER = BluefruitLE # or RN42
|
||||||
```
|
```
|
||||||
|
|
||||||
## Bluetooth Keycodes
|
## Bluetooth Keycodes
|
||||||
|
@ -100,7 +100,7 @@ void process_combo_event(uint16_t combo_index, bool pressed) {
|
|||||||
|
|
||||||
This will send "john.doe@example.com" if you chord E and M together, and clear the current line with Backspace and Left-Shift. You could change this to do stuff like play sounds or change settings.
|
This will send "john.doe@example.com" if you chord E and M together, and clear the current line with Backspace and Left-Shift. You could change this to do stuff like play sounds or change settings.
|
||||||
|
|
||||||
It is worth noting that `COMBO_ACTION`s are not needed anymore. As of [PR#8591](https://github.com/qmk/qmk_firmware/pull/8591/), it is possible to run your own custom keycodes from combos. Just define the custom keycode, program its functionality in `process_record_user`, and define a combo with `COMBO(<key_array>, <your_custom_keycode>)`.
|
It is worth noting that `COMBO_ACTION`s are not needed anymore. As of [PR#8591](https://github.com/qmk/qmk_firmware/pull/8591/), it is possible to run your own custom keycodes from combos. Just define the custom keycode, program its functionality in `process_record_user`, and define a combo with `COMBO(<key_array>, <your_custom_keycode>)`. See the first example in [Macros](feature_macros.md).
|
||||||
|
|
||||||
## Keycodes
|
## 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. The following keycodes are available for use in your `keymap.c`
|
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. The following keycodes are available for use in your `keymap.c`
|
||||||
@ -141,10 +141,13 @@ Processing combos has two buffers, one for the key presses, another for the comb
|
|||||||
## Modifier Combos
|
## Modifier Combos
|
||||||
If a combo resolves to a Modifier, the window for processing the combo can be extended independently from normal combos. By default, this is disabled but can be enabled with `#define COMBO_MUST_HOLD_MODS`, and the time window can be configured with `#define COMBO_HOLD_TERM 150` (default: `TAPPING_TERM`). With `COMBO_MUST_HOLD_MODS`, you cannot tap the combo any more which makes the combo less prone to misfires.
|
If a combo resolves to a Modifier, the window for processing the combo can be extended independently from normal combos. By default, this is disabled but can be enabled with `#define COMBO_MUST_HOLD_MODS`, and the time window can be configured with `#define COMBO_HOLD_TERM 150` (default: `TAPPING_TERM`). With `COMBO_MUST_HOLD_MODS`, you cannot tap the combo any more which makes the combo less prone to misfires.
|
||||||
|
|
||||||
## Per Combo Timing, Holding and Tapping
|
## Strict key press order
|
||||||
For each combo, it is possible to configure the time window it has to pressed in, if it needs to be held down, or if it needs to be tapped.
|
By defining `COMBO_MUST_PRESS_IN_ORDER` combos only activate when the keys are pressed in the same order as they are defined in the key array.
|
||||||
|
|
||||||
For example, tap-only combos are useful if any (or all) of the underlying keys is a Mod-Tap or a Layer-Tap key. When you tap the combo, you get the combo result. When you press the combo and hold it down, the combo doesn't actually activate. Instead the keys are processed separately as if the combo wasn't even there.
|
## Per Combo Timing, Holding, Tapping and Key Press Order
|
||||||
|
For each combo, it is possible to configure the time window it has to pressed in, if it needs to be held down, if it needs to be tapped, or if its keys need to be pressed in order.
|
||||||
|
|
||||||
|
For example, tap-only combos are useful if any (or all) of the underlying keys are mod-tap or layer-tap keys. When you tap the combo, you get the combo result. When you press the combo and hold it down, the combo doesn't activate. Instead the keys are processed separately as if the combo wasn't even there.
|
||||||
|
|
||||||
In order to use these features, the following configuration options and functions need to be defined. Coming up with useful timings and configuration is left as an exercise for the reader.
|
In order to use these features, the following configuration options and functions need to be defined. Coming up with useful timings and configuration is left as an exercise for the reader.
|
||||||
|
|
||||||
@ -153,6 +156,7 @@ In order to use these features, the following configuration options and function
|
|||||||
| `COMBO_TERM_PER_COMBO` | uint16_t get_combo_term(uint16_t index, combo_t \*combo) | Optional per-combo timeout window. (default: `COMBO_TERM`) |
|
| `COMBO_TERM_PER_COMBO` | uint16_t get_combo_term(uint16_t index, combo_t \*combo) | Optional per-combo timeout window. (default: `COMBO_TERM`) |
|
||||||
| `COMBO_MUST_HOLD_PER_COMBO` | bool get_combo_must_hold(uint16_t index, combo_t \*combo) | Controls if a given combo should fire immediately on tap or if it needs to be held. (default: `false`) |
|
| `COMBO_MUST_HOLD_PER_COMBO` | bool get_combo_must_hold(uint16_t index, combo_t \*combo) | Controls if a given combo should fire immediately on tap or if it needs to be held. (default: `false`) |
|
||||||
| `COMBO_MUST_TAP_PER_COMBO` | bool get_combo_must_tap(uint16_t index, combo_t \*combo) | Controls if a given combo should fire only if tapped within `COMBO_HOLD_TERM`. (default: `false`) |
|
| `COMBO_MUST_TAP_PER_COMBO` | bool get_combo_must_tap(uint16_t index, combo_t \*combo) | Controls if a given combo should fire only if tapped within `COMBO_HOLD_TERM`. (default: `false`) |
|
||||||
|
| `COMBO_MUST_PRESS_IN_ORDER_PER_COMBO` | bool get_combo_must_press_in_order(uint16_t index, combo_t \*combo) | Controls if a given combo should fire only if its keys are pressed in order. (default: `true`) |
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
```c
|
```c
|
||||||
@ -216,6 +220,38 @@ bool get_combo_must_tap(uint16_t index, combo_t *combo) {
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool get_combo_must_press_in_order(uint16_t combo_index, combo_t *combo) {
|
||||||
|
switch (combo_index) {
|
||||||
|
/* List combos here that you want to only activate if their keys
|
||||||
|
* are pressed in the same order as they are defined in the combo's key
|
||||||
|
* array. */
|
||||||
|
case COMBO_NAME_HERE:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Generic hook to (dis)allow a combo activation
|
||||||
|
|
||||||
|
By defining `COMBO_SHOULD_TRIGGER` and its companying function `bool combo_should_trigger(uint16_t combo_index, combo_t *combo, uint16_t keycode, keyrecord_t *record)` you can block or allow combos to activate on the conditions of your choice.
|
||||||
|
For example, you could disallow some combos on the base layer and allow them on another. Or disable combos on the home row when a timer is running.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
```c
|
||||||
|
bool combo_should_trigger(uint16_t combo_index, combo_t *combo, uint16_t keycode, keyrecord_t *record) {
|
||||||
|
/* Disable combo `SOME_COMBO` on layer `_LAYER_A` */
|
||||||
|
switch (combo_index) {
|
||||||
|
case SOME_COMBO:
|
||||||
|
if (layer_state_is(_LAYER_A)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Variable Length Combos
|
## Variable Length Combos
|
||||||
|
@ -116,6 +116,7 @@ Where name of algorithm is one of:
|
|||||||
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.
|
||||||
* ```sym_eager_pk``` - debouncing per key. On any state change, response is immediate, followed by ```DEBOUNCE``` milliseconds of no further input for that key
|
* ```sym_eager_pk``` - debouncing per key. On any state change, response is immediate, followed by ```DEBOUNCE``` milliseconds of no further input for that key
|
||||||
|
* ```sym_defer_pr``` - debouncing per row. On any state change, a per-row timer is set. When ```DEBOUNCE``` milliseconds of no changes have occurred on that row, the entire row is pushed. Can improve responsiveness over `sym_defer_g` while being less susceptible than per-key debouncers to noise.
|
||||||
* ```sym_defer_pk``` - debouncing per key. On any state change, a per-key timer is set. When ```DEBOUNCE``` milliseconds of no changes have occurred on that key, the key status change is pushed.
|
* ```sym_defer_pk``` - debouncing per key. On any state change, a per-key timer is set. When ```DEBOUNCE``` milliseconds of no changes have occurred on that key, the key status change is pushed.
|
||||||
* ```asym_eager_defer_pk``` - debouncing per key. On a key-down state change, response is immediate, followed by ```DEBOUNCE``` milliseconds of no further input for that key. On a key-up state change, a per-key timer is set. When ```DEBOUNCE``` milliseconds of no changes have occurred on that key, the key-up status change is pushed.
|
* ```asym_eager_defer_pk``` - debouncing per key. On a key-down state change, response is immediate, followed by ```DEBOUNCE``` milliseconds of no further input for that key. On a key-up state change, a per-key timer is set. When ```DEBOUNCE``` milliseconds of no changes have occurred on that key, the key-up status change is pushed.
|
||||||
|
|
||||||
|
@ -70,22 +70,61 @@ or `keymap.c`:
|
|||||||
bool encoder_update_user(uint8_t index, bool clockwise) {
|
bool encoder_update_user(uint8_t index, bool clockwise) {
|
||||||
if (index == 0) { /* First encoder */
|
if (index == 0) { /* First encoder */
|
||||||
if (clockwise) {
|
if (clockwise) {
|
||||||
tap_code(KC_PGDN);
|
tap_code_delay(KC_VOLU, 10);
|
||||||
} else {
|
} else {
|
||||||
tap_code(KC_PGUP);
|
tap_code_delay(KC_VOLD, 10);
|
||||||
}
|
}
|
||||||
} else if (index == 1) { /* Second encoder */
|
} else if (index == 1) { /* Second encoder */
|
||||||
if (clockwise) {
|
if (clockwise) {
|
||||||
tap_code(KC_DOWN);
|
rgb_matrix_increase_hue();
|
||||||
} else {
|
} else {
|
||||||
tap_code(KC_UP);
|
rgb_matrix_decrease_hue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
!> If you return `true`, this will allow the keyboard level code to run, as well. Returning `false` will override the keyboard level code. Depending on how the keyboard level function is set up.
|
!> If you return `true`, it will allow the keyboard level code to run as well. Returning `false` will override the keyboard level code, depending on how the keyboard function is set up.
|
||||||
|
|
||||||
|
Layer conditions can also be used with the callback function like the following:
|
||||||
|
|
||||||
|
```c
|
||||||
|
bool encoder_update_user(uint8_t index, bool clockwise) {
|
||||||
|
if (get_highest_layer(layer_state|default_layer_state) > 0) {
|
||||||
|
if (index == 0) {
|
||||||
|
if (clockwise) {
|
||||||
|
tap_code(KC_WH_D);
|
||||||
|
} else {
|
||||||
|
tap_code(KC_WH_U);
|
||||||
|
}
|
||||||
|
} else if (index == 1) {
|
||||||
|
if (clockwise) {
|
||||||
|
tap_code_delay(KC_VOLU, 10);
|
||||||
|
} else {
|
||||||
|
tap_code_delay(KC_VOLD, 10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else { /* Layer 0 */
|
||||||
|
if (index == 0) {
|
||||||
|
if (clockwise) {
|
||||||
|
tap_code(KC_PGDN);
|
||||||
|
} else {
|
||||||
|
tap_code(KC_PGUP);
|
||||||
|
}
|
||||||
|
} else if (index == 1) {
|
||||||
|
if (clockwise) {
|
||||||
|
rgb_matrix_increase_speed();
|
||||||
|
} else {
|
||||||
|
rgb_matrix_decrease_speed();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
?> Media and mouse countrol keycodes such as `KC_VOLU` and `KC_WH_D` requires `EXTRAKEY_ENABLE = yes` and `MOUSEKEY_ENABLE = yes` respectively in user's `rules.mk` if they are not enabled as default on keyboard level configuration.
|
||||||
|
|
||||||
## Hardware
|
## Hardware
|
||||||
|
|
||||||
@ -93,7 +132,10 @@ The A an B lines of the encoders should be wired directly to the MCU, and the C/
|
|||||||
|
|
||||||
## Multiple Encoders
|
## Multiple Encoders
|
||||||
|
|
||||||
Multiple encoders may share pins so long as each encoder has a distinct pair of pins.
|
Multiple encoders may share pins so long as each encoder has a distinct pair of pins when the following conditions are met:
|
||||||
|
- using detent encoders
|
||||||
|
- pads must be high at the detent stability point which is called 'default position' in QMK
|
||||||
|
- no more than two encoders sharing a pin can be turned at the same time
|
||||||
|
|
||||||
For example you can support two encoders using only 3 pins like this
|
For example you can support two encoders using only 3 pins like this
|
||||||
```
|
```
|
||||||
|
@ -4,17 +4,17 @@ If you're using a 60% keyboard, or any other layout with no F-row, you will have
|
|||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
Replace the `KC_GRV` key in your keymap (usually to the left of the `1` key) with `KC_GESC`. Most of the time this key will output `KC_ESC` when pressed. However, when Shift or GUI are held down it will output `KC_GRV` instead.
|
Replace the `KC_GRV` key in your keymap (usually to the left of the `1` key) with `QK_GESC`. Most of the time this key will output `KC_ESC` when pressed. However, when Shift or GUI are held down it will output `KC_GRV` instead.
|
||||||
|
|
||||||
## What Your OS Sees
|
## What Your OS Sees
|
||||||
|
|
||||||
If Mary presses GESC on her keyboard, the OS will see an KC_ESC character. Now if Mary holds Shift down and presses GESC it will output `~`, or a shifted backtick. Now if she holds GUI/CMD/WIN, it will output a simple <code>`</code> character.
|
If Mary presses `QK_GESC` on her keyboard, the OS will see an KC_ESC character. Now if Mary holds Shift down and presses `QK_GESC` it will output `~`, or a shifted backtick. Now if she holds GUI/CMD/WIN, it will output a simple <code>`</code> character.
|
||||||
|
|
||||||
## Keycodes
|
## Keycodes
|
||||||
|
|
||||||
|Key |Aliases |Description |
|
|Key |Aliases |Description |
|
||||||
|---------|-----------|------------------------------------------------------------------|
|
|-----------------|---------|------------------------------------------------------------------|
|
||||||
|`KC_GESC`|`GRAVE_ESC`|Escape when pressed, <code>`</code> when Shift or GUI are held|
|
|`QK_GRAVE_ESCAPE`|`QK_GESC`|Escape when pressed, <code>`</code> when Shift or GUI are held|
|
||||||
|
|
||||||
### Caveats
|
### Caveats
|
||||||
|
|
||||||
|
@ -167,7 +167,7 @@ List of waveform sequences from the datasheet:
|
|||||||
```
|
```
|
||||||
#define DRV_GREETING *sequence name or number*
|
#define DRV_GREETING *sequence name or number*
|
||||||
```
|
```
|
||||||
If haptic feedback is enabled, the keyboard will vibrate to a specific sqeuence during startup. That can be selected using the following define:
|
If haptic feedback is enabled, the keyboard will vibrate to a specific sequence during startup. That can be selected using the following define:
|
||||||
|
|
||||||
```
|
```
|
||||||
#define DRV_MODE_DEFAULT *sequence name or number*
|
#define DRV_MODE_DEFAULT *sequence name or number*
|
||||||
@ -191,9 +191,6 @@ With the entry of `#define NO_HAPTIC_MOD` in config.h, the following keys will n
|
|||||||
* `TT()` layer tap toggle keys, when held to activate a layer. However when tapped `TAPPING_TOGGLE` times to permanently toggle the layer, on the last tap haptic feedback is still triggered.
|
* `TT()` layer tap toggle keys, when held to activate a layer. However when tapped `TAPPING_TOGGLE` times to permanently toggle the layer, on the last tap haptic feedback is still triggered.
|
||||||
* `MT()` mod tap keys, when held to keep a usual modifier key pressed. However when tapped, and the key is quickly released, and sends a keycode, haptic feedback is still triggered. See also [Mod-Tap](mod_tap.md).
|
* `MT()` mod tap keys, when held to keep a usual modifier key pressed. However when tapped, and the key is quickly released, and sends a keycode, haptic feedback is still triggered. See also [Mod-Tap](mod_tap.md).
|
||||||
|
|
||||||
### NO_HAPTIC_FN
|
|
||||||
With the entry of `#define NO_HAPTIC_FN` in config.h, deprecated `fn_actions` type function keys will not trigger a feedback.
|
|
||||||
|
|
||||||
### NO_HAPTIC_ALPHA
|
### NO_HAPTIC_ALPHA
|
||||||
With the entry of `#define NO_HAPTIC_ALPHA` in config.h, none of the alpha keys (A ... Z) will trigger a feedback.
|
With the entry of `#define NO_HAPTIC_ALPHA` in config.h, none of the alpha keys (A ... Z) will trigger a feedback.
|
||||||
|
|
||||||
|
@ -19,4 +19,5 @@ First, enable Key Lock by setting `KEY_LOCK_ENABLE = yes` in your `rules.mk`. Th
|
|||||||
Key Lock is only able to hold standard action keys and [One Shot modifier](one_shot_keys.md) 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](one_shot_keys.md) 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. The Key Lock can be cancelled by calling the `cancel_key_lock()` function.
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ void matrix_scan_user(void) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
As you can see, you have a few function. You can use `SEQ_ONE_KEY` for single-key sequences (Leader followed by just one key), and `SEQ_TWO_KEYS`, `SEQ_THREE_KEYS` up to `SEQ_FIVE_KEYS` for longer sequences.
|
As you can see, you have a few functions. You can use `SEQ_ONE_KEY` for single-key sequences (Leader followed by just one key), and `SEQ_TWO_KEYS`, `SEQ_THREE_KEYS` up to `SEQ_FIVE_KEYS` for longer sequences.
|
||||||
|
|
||||||
Each of these accepts one or more keycodes as arguments. This is an important point: You can use keycodes from **any layer on your keyboard**. That layer would need to be active for the leader macro to fire, obviously.
|
Each of these accepts one or more keycodes as arguments. This is an important point: You can use keycodes from **any layer on your keyboard**. That layer would need to be active for the leader macro to fire, obviously.
|
||||||
|
|
||||||
@ -74,9 +74,9 @@ SEQ_THREE_KEYS(KC_C, KC_C, KC_C) {
|
|||||||
|
|
||||||
## Infinite Leader key timeout
|
## Infinite Leader key timeout
|
||||||
|
|
||||||
Sometimes your leader key is not on a comfortable places as the rest of keys on your sequence. Imagine that your leader key is one of your outer top right keys, you may need to reposition your hand just to reach your leader key.
|
Sometimes your leader key is not on a comfortable place as the rest of keys on your sequence. Imagine that your leader key is one of your outer top right keys, you may need to reposition your hand just to reach your leader key.
|
||||||
This can make typing the entire sequence on time hard even if you are able to type most of the sequence fast. For example, if your sequence is `Leader + asd` typing `asd` fast is very easy once you have your hands in your home row. However starting the sequence in time after moving your hand out of the home row to reach the leader key and back is not.
|
This can make typing the entire sequence on time hard even if you are able to type most of the sequence fast. For example, if your sequence is `Leader + asd` typing `asd` fast is very easy once you have your hands in your home row. However starting the sequence in time after moving your hand out of the home row to reach the leader key and back is not.
|
||||||
To remove the stress this situation produces to your hands you can enable an infinite timeout just for the leader key. This mean that, after you hit the leader key you will have an infinite amount of time to start the rest of the sequence, allowing you to proper position your hands on the best position to type the rest of the sequence comfortably.
|
To remove the stress this situation produces to your hands you can enable an infinite timeout just for the leader key. This means that after you hit the leader key you will have an infinite amount of time to start the rest of the sequence, allowing you to proper position your hands on the best position to type the rest of the sequence comfortably.
|
||||||
This infinite timeout only affects the leader key, so in our previous example of `Leader + asd` you will have an infinite amount of time between `Leader` and `a`, but once you start the sequence the timeout you have configured (global or per key) will work normally.
|
This infinite timeout only affects the leader key, so in our previous example of `Leader + asd` you will have an infinite amount of time between `Leader` and `a`, but once you start the sequence the timeout you have configured (global or per key) will work normally.
|
||||||
This way you can configure a very short `LEADER_TIMEOUT` but still have plenty of time to position your hands.
|
This way you can configure a very short `LEADER_TIMEOUT` but still have plenty of time to position your hands.
|
||||||
|
|
||||||
@ -89,7 +89,7 @@ In order to enable this, place this in your `config.h`:
|
|||||||
|
|
||||||
By default, the Leader Key feature will filter the keycode out of [`Mod-Tap`](mod_tap.md) and [`Layer Tap`](feature_layers.md#switching-and-toggling-layers) functions when checking for the Leader sequences. That means if you're using `LT(3, KC_A)`, it will pick this up as `KC_A` for the sequence, rather than `LT(3, KC_A)`, giving a more expected behavior for newer users.
|
By default, the Leader Key feature will filter the keycode out of [`Mod-Tap`](mod_tap.md) and [`Layer Tap`](feature_layers.md#switching-and-toggling-layers) functions when checking for the Leader sequences. That means if you're using `LT(3, KC_A)`, it will pick this up as `KC_A` for the sequence, rather than `LT(3, KC_A)`, giving a more expected behavior for newer users.
|
||||||
|
|
||||||
While, this may be fine for most, if you want to specify the whole keycode (eg, `LT(3, KC_A)` from the example above) in the sequence, you can enable this by added `#define LEADER_KEY_STRICT_KEY_PROCESSING` to your `config.h` file. This will then disable the filtering, and you'll need to specify the whole keycode.
|
While, this may be fine for most, if you want to specify the whole keycode (eg, `LT(3, KC_A)` from the example above) in the sequence, you can enable this by adding `#define LEADER_KEY_STRICT_KEY_PROCESSING` to your `config.h` file. This will then disable the filtering, and you'll need to specify the whole keycode.
|
||||||
|
|
||||||
## Customization
|
## Customization
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# LED Indicators
|
# LED Indicators
|
||||||
|
|
||||||
?> This feature requires additional configuration to work on both halves of a split keyboard see [Data sync options](feature_split_keyboard.md#data-sync-options)
|
?> LED indicators on split keyboards will require state information synced to the slave half (e.g. `#define SPLIT_LED_STATE_ENABLE`). See [data sync options](feature_split_keyboard.md#data-sync-options) for more details.
|
||||||
|
|
||||||
QMK provides methods to read 5 of the LEDs defined in the HID spec:
|
QMK provides methods to read 5 of the LEDs defined in the HID spec:
|
||||||
|
|
||||||
|
@ -67,6 +67,109 @@ const is31_led PROGMEM g_is31_leds[DRIVER_LED_TOTAL] = {
|
|||||||
|
|
||||||
Where `Cx_y` is the location of the LED in the matrix defined by [the datasheet](https://www.issi.com/WW/pdf/31FL3731.pdf) and the header file `drivers/led/issi/is31fl3731-simple.h`. The `driver` is the index of the driver you defined in your `config.h` (`0`, `1`, `2`, or `3` ).
|
Where `Cx_y` is the location of the LED in the matrix defined by [the datasheet](https://www.issi.com/WW/pdf/31FL3731.pdf) and the header file `drivers/led/issi/is31fl3731-simple.h`. The `driver` is the index of the driver you defined in your `config.h` (`0`, `1`, `2`, or `3` ).
|
||||||
|
|
||||||
|
---
|
||||||
|
### IS31FLCOMMON :id=is31flcommon
|
||||||
|
|
||||||
|
There is basic support for addressable LED matrix lighting with a selection of I2C ISSI Lumissil LED controllers through a shared common driver. To enable it, add this to your `rules.mk`:
|
||||||
|
|
||||||
|
```makefile
|
||||||
|
LED_MATRIX_ENABLE = yes
|
||||||
|
LED_MATRIX_DRIVER = <driver name>
|
||||||
|
```
|
||||||
|
|
||||||
|
Where `<driver name>` is the applicable LED driver chip as below
|
||||||
|
|
||||||
|
| Driver Name | Data Sheet | Capability |
|
||||||
|
|-------------|------------|------------|
|
||||||
|
| `IS31FL3742A` | [datasheet](https://www.lumissil.com/assets/pdf/core/IS31FL3742A_DS.pdf) | 180 LED, 30x6 Matrix |
|
||||||
|
| `ISSIFL3743A` | [datasheet](https://www.lumissil.com/assets/pdf/core/IS31FL3743A_DS.pdf) | 198 LED, 18x11 Matrix |
|
||||||
|
| `IS31FL3745` | [datasheet](https://www.lumissil.com/assets/pdf/core/IS31FL3745_DS.pdf) | 144 LED, 18x8 Matrix |
|
||||||
|
| `IS31FL3746A` | [datasheet](https://www.lumissil.com/assets/pdf/core/IS31FL3746A_DS.pdf) | 72 LED, 18x4 Matrix |
|
||||||
|
|
||||||
|
You can use between 1 and 4 IC's. Do not specify `DRIVER_ADDR_<N>` define for IC's if not present on your keyboard. The `DRIVER_ADDR_1` default assumes that all Address pins on the controller have been connected to GND. Drivers that have SYNC functionality have the default settings to disable if 1 driver. If more than 1 drivers then `DRIVER_ADDR_1` will be set to Master and the remaiing ones set to Slave.
|
||||||
|
|
||||||
|
Configure the hardware via your `config.h`:
|
||||||
|
|
||||||
|
| Variable | Description | Default |
|
||||||
|
|----------|-------------|---------|
|
||||||
|
| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
|
||||||
|
| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
|
||||||
|
| `DRIVER_COUNT` | (Required) How many LED driver IC's are present | |
|
||||||
|
| `DRIVER_LED_TOTAL` | (Required) How many LED lights are present across all drivers | |
|
||||||
|
| `DRIVER_ADDR_1` | (Optional) Address for the first LED driver | |
|
||||||
|
| `DRIVER_ADDR_<N>` | (Required) Address for the additional LED drivers | |
|
||||||
|
| `ISSI_SSR_<N>` | (Optional) Configuration for the Spread Spectrum Register | |
|
||||||
|
| `ISSI_CONFIGURATION` | (Optional) Configuration for the Configuration Register | |
|
||||||
|
| `ISSI_GLOBALCURRENT` | (Optional) Configuration for the Global Current Register | 0xFF |
|
||||||
|
| `ISSI_PULLDOWNUP` | (Optional) Configuration for the Pull Up & Pull Down Register | |
|
||||||
|
| `ISSI_TEMP` | (Optional) Configuration for the Tempature Register | |
|
||||||
|
| `ISSI_PWM_ENABLE` | (Optional) Configuration for the PWM Enable Register | |
|
||||||
|
| `ISSI_PWM_SET` | (Optional) Configuration for the PWM Setting Register | |
|
||||||
|
| `ISSI_SCAL_LED ` | (Optional) Configuration for the LEDs Scaling Registers | 0xFF |
|
||||||
|
| `ISSI_MANUAL_SCALING` | (Optional) If you wish to configure the Scaling Registers manually | |
|
||||||
|
|
||||||
|
|
||||||
|
Defaults
|
||||||
|
|
||||||
|
| Variable | IS31FL3742A | IS31FL3743A | IS31FL3745 | IS31FL3746 |
|
||||||
|
|----------|-------------|-------------|------------|------------|
|
||||||
|
| `DRIVER_ADDR_1` | 0b0110000 | 0b0100000 | 0b0100000 | 0b1100000 |
|
||||||
|
| `ISSI_SSR_1` | 0x00 | 0x00 / 0x60 | 0x00 / 0xC0 | 0x00 |
|
||||||
|
| `ISSI_SSR_<2-4>` | 0x00 | 0x40 | 0x80 | 0x00 |
|
||||||
|
| `ISSI_CONFIGURATION` | 0x31 | 0x01 | 0x31 | 0x01 |
|
||||||
|
| `ISSI_PULLDOWNUP` | 0x55 | 0x33 | 0x33 | 0x33 |
|
||||||
|
| `ISSI_TEMP` | N/A | 0x00 | 0x00 | 0x00 |
|
||||||
|
| `ISSI_PWM_ENABLE` | N/A | N/A | N/A | 0x00 |
|
||||||
|
| `ISSI_PWM_SET` | 0x00 | N/A | N/A | 0x00 |
|
||||||
|
|
||||||
|
Here is an example using 2 drivers.
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define DRIVER_ADDR_2 0b0100001
|
||||||
|
|
||||||
|
#define DRIVER_COUNT 2
|
||||||
|
#define DRIVER_1_LED_TOTAL 66
|
||||||
|
#define DRIVER_2_LED_TOTAL 42
|
||||||
|
#define DRIVER_LED_TOTAL (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
|
||||||
|
```
|
||||||
|
!> Note the parentheses, this is so when `DRIVER_LED_TOTAL` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`.
|
||||||
|
|
||||||
|
Currently only 4 drivers are supported, but it would be trivial to support for more. Note that using a combination of different drivers is not supported. All drivers must be of the same model.
|
||||||
|
|
||||||
|
Define these arrays listing all the LEDs in your `<keyboard>.c`:
|
||||||
|
|
||||||
|
```c
|
||||||
|
const is31_led __flash g_is31_leds[DRIVER_LED_TOTAL] = {
|
||||||
|
/* Refer to IS31 manual for these locations
|
||||||
|
* driver
|
||||||
|
* | LED address
|
||||||
|
* | | */
|
||||||
|
{ 0, CS1_SW1 },
|
||||||
|
{ 0, CS2_SW1 },
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Where `CSx_SWx` is the location of the LED in the matrix defined by the datasheet. The `driver` is the index of the driver you defined in your `config.h` (`0`, `1`, `2`, or `3` for now).
|
||||||
|
|
||||||
|
`ISSI_MANUAL_SCALING` is used to override the Scaling for individual LED's. By default they will be set as per `ISSI_SCAL_LED`. In `config.h` set how many LED's you want to manually set scaling for.
|
||||||
|
Eg `#define ISSI_MANUAL_SCALING 3`
|
||||||
|
|
||||||
|
Then Define the array listing all the LEDs you want to override in your `<keyboard>.c`:
|
||||||
|
|
||||||
|
```c
|
||||||
|
const is31_led __flash g_is31_scaling[ISSI_MANUAL_SCALING] = {
|
||||||
|
* LED Index
|
||||||
|
* | Scaling
|
||||||
|
* | | */
|
||||||
|
{5, 120},
|
||||||
|
{9, 120},
|
||||||
|
....
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Where LED Index is the position of the LED in the `g_is31_leds` array. The `scaling` value between 0 and 255 to be written to the Scaling Register.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Common Configuration :id=common-configuration
|
## Common Configuration :id=common-configuration
|
||||||
@ -333,7 +436,7 @@ Where `28` is an unused index from `eeconfig.h`.
|
|||||||
If you want to set custom indicators, such as an LED for Caps Lock, or layer indication, you can use the `led_matrix_indicators_kb` or `led_matrix_indicators_user` function for that:
|
If you want to set custom indicators, such as an LED for Caps Lock, or layer indication, you can use the `led_matrix_indicators_kb` or `led_matrix_indicators_user` function for that:
|
||||||
```c
|
```c
|
||||||
void led_matrix_indicators_kb(void) {
|
void led_matrix_indicators_kb(void) {
|
||||||
led_matrix_set_color(index, value);
|
led_matrix_set_value(index, value);
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -40,13 +40,13 @@ You can define up to 32 macros in a `keymap.json` file, as used by [Configurator
|
|||||||
|
|
||||||
### Selecting Your Host Keyboard Layout
|
### Selecting Your Host Keyboard Layout
|
||||||
|
|
||||||
If you type in a language other than English, or use a non-QWERTY layout like Colemak, Dvorak, or Workman, you may have set your computer's input language to match this layout. This presents a challenge when creating macros- you may need to type different keys to get the same letters! To address this you can add the `host_language` key to your keymap.json, like so:
|
If you type in a language other than English, or use a non-QWERTY layout like Colemak, Dvorak, or Workman, you may have set your computer's input language to match this layout. This presents a challenge when creating macros - you may need to type different keys to get the same letters! To address this you can add the `host_language` key to your `keymap.json`, like so:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"keyboard": "handwired/my_macropad",
|
"keyboard": "handwired/my_macropad",
|
||||||
"keymap": "my_keymap",
|
"keymap": "my_keymap",
|
||||||
"host_layout": "dvorak",
|
"host_language": "dvorak",
|
||||||
"macros": [
|
"macros": [
|
||||||
["Hello, World!"]
|
["Hello, World!"]
|
||||||
],
|
],
|
||||||
@ -75,7 +75,7 @@ The current list of available languages is:
|
|||||||
|
|
||||||
### Macro Basics
|
### Macro Basics
|
||||||
|
|
||||||
Each macro is an array consisting of strings and objects (dictionaries.) Strings are typed to your computer while objects allow you to control how your macro is typed out.
|
Each macro is an array consisting of strings and objects (dictionaries). Strings are typed to your computer while objects allow you to control how your macro is typed out.
|
||||||
|
|
||||||
#### Object Format
|
#### Object Format
|
||||||
|
|
||||||
@ -144,6 +144,8 @@ If yes, we send the string `"QMK is the best thing ever!"` to the computer via t
|
|||||||
We return `true` to indicate to the caller that the key press we just processed should continue to be processed as normal (as we didn't replace or alter the functionality).
|
We return `true` to indicate to the caller that the key press we just processed should continue to be processed as normal (as we didn't replace or alter the functionality).
|
||||||
Finally, we define the keymap so that the first button activates our macro and the second button is just an escape button.
|
Finally, we define the keymap so that the first button activates our macro and the second button is just an escape button.
|
||||||
|
|
||||||
|
?>It is recommended to use the SAFE_RANGE macro as per [Customizing Functionality](custom_quantum_functions.md).
|
||||||
|
|
||||||
You might want to add more than one macro.
|
You might want to add more than one macro.
|
||||||
You can do that by adding another keycode and adding another case to the switch statement, like so:
|
You can do that by adding another keycode and adding another case to the switch statement, like so:
|
||||||
|
|
||||||
@ -191,6 +193,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
?> An enumerated list of custom keycodes (`enum custom_keycodes`) must be declared before `keymaps[]` array, `process_record_user()` and any other function that use the list for the compiler to recognise it.
|
||||||
|
|
||||||
#### Advanced Macros
|
#### Advanced Macros
|
||||||
|
|
||||||
In addition to the `process_record_user()` function, is the `post_process_record_user()` function. This runs after `process_record` and can be used to do things after a keystroke has been sent. This is useful if you want to have a key pressed before and released after a normal key, for instance.
|
In addition to the `process_record_user()` function, is the `post_process_record_user()` function. This runs after `process_record` and can be used to do things after a keystroke has been sent. This is useful if you want to have a key pressed before and released after a normal key, for instance.
|
||||||
|
@ -56,13 +56,13 @@ This is the default mode. You can adjust the cursor and scrolling acceleration u
|
|||||||
|
|
||||||
|Define |Default|Description |
|
|Define |Default|Description |
|
||||||
|----------------------------|-------|---------------------------------------------------------|
|
|----------------------------|-------|---------------------------------------------------------|
|
||||||
|`MOUSEKEY_DELAY` |300 |Delay between pressing a movement key and cursor movement|
|
|`MOUSEKEY_DELAY` |10 |Delay between pressing a movement key and cursor movement|
|
||||||
|`MOUSEKEY_INTERVAL` |50 |Time between cursor movements in milliseconds |
|
|`MOUSEKEY_INTERVAL` |20 |Time between cursor movements in milliseconds |
|
||||||
|`MOUSEKEY_MOVE_DELTA` |5 |Step size |
|
|`MOUSEKEY_MOVE_DELTA` |8 |Step size |
|
||||||
|`MOUSEKEY_MAX_SPEED` |10 |Maximum cursor speed at which acceleration stops |
|
|`MOUSEKEY_MAX_SPEED` |10 |Maximum cursor speed at which acceleration stops |
|
||||||
|`MOUSEKEY_TIME_TO_MAX` |20 |Time until maximum cursor speed is reached |
|
|`MOUSEKEY_TIME_TO_MAX` |30 |Time until maximum cursor speed is reached |
|
||||||
|`MOUSEKEY_WHEEL_DELAY` |300 |Delay between pressing a wheel key and wheel movement |
|
|`MOUSEKEY_WHEEL_DELAY` |10 |Delay between pressing a wheel key and wheel movement |
|
||||||
|`MOUSEKEY_WHEEL_INTERVAL` |100 |Time between wheel movements |
|
|`MOUSEKEY_WHEEL_INTERVAL` |80 |Time between wheel movements |
|
||||||
|`MOUSEKEY_WHEEL_MAX_SPEED` |8 |Maximum number of scroll steps per scroll action |
|
|`MOUSEKEY_WHEEL_MAX_SPEED` |8 |Maximum number of scroll steps per scroll action |
|
||||||
|`MOUSEKEY_WHEEL_TIME_TO_MAX`|40 |Time until maximum scroll speed is reached |
|
|`MOUSEKEY_WHEEL_TIME_TO_MAX`|40 |Time until maximum scroll speed is reached |
|
||||||
|
|
||||||
@ -82,9 +82,9 @@ This is an extension of the accelerated mode. The kinetic mode uses a quadratic
|
|||||||
|Define |Default |Description |
|
|Define |Default |Description |
|
||||||
|--------------------------------------|---------|---------------------------------------------------------------|
|
|--------------------------------------|---------|---------------------------------------------------------------|
|
||||||
|`MK_KINETIC_SPEED` |undefined|Enable kinetic mode |
|
|`MK_KINETIC_SPEED` |undefined|Enable kinetic mode |
|
||||||
|`MOUSEKEY_DELAY` |8 |Delay between pressing a movement key and cursor movement |
|
|`MOUSEKEY_DELAY` |5 |Delay between pressing a movement key and cursor movement |
|
||||||
|`MOUSEKEY_INTERVAL` |8 |Time between cursor movements in milliseconds |
|
|`MOUSEKEY_INTERVAL` |10 |Time between cursor movements in milliseconds |
|
||||||
|`MOUSEKEY_MOVE_DELTA` |25 |Step size for accelerating from initial to base speed |
|
|`MOUSEKEY_MOVE_DELTA` |5 |Step size for accelerating from initial to base speed |
|
||||||
|`MOUSEKEY_INITIAL_SPEED` |100 |Initial speed of the cursor in pixel per second |
|
|`MOUSEKEY_INITIAL_SPEED` |100 |Initial speed of the cursor in pixel per second |
|
||||||
|`MOUSEKEY_BASE_SPEED` |1000 |Maximum cursor speed at which acceleration stops |
|
|`MOUSEKEY_BASE_SPEED` |1000 |Maximum cursor speed at which acceleration stops |
|
||||||
|`MOUSEKEY_DECELERATED_SPEED` |400 |Decelerated cursor speed |
|
|`MOUSEKEY_DECELERATED_SPEED` |400 |Decelerated cursor speed |
|
||||||
@ -161,7 +161,7 @@ small and detailed movements of the cursor.
|
|||||||
* **KC_ACL2:** This acceleration sets your cursor to the maximum (computer defined) speed. This is
|
* **KC_ACL2:** This acceleration sets your cursor to the maximum (computer defined) speed. This is
|
||||||
useful for moving the cursor large distances without much accuracy.
|
useful for moving the cursor large distances without much accuracy.
|
||||||
|
|
||||||
To use constant speed mode, you must at least define `MK_COMBINED` in your keymap’s `config.h` file:
|
To use combined speed mode, you must at least define `MK_COMBINED` in your keymap’s `config.h` file:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
#define MK_COMBINED
|
#define MK_COMBINED
|
||||||
|
@ -84,6 +84,8 @@ static void render_logo(void) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
?> The default font file is located at `drivers/oled/glcdfont.c` and its location can be overwritten with the `OLED_FONT_H` configuration option. Font file content can be edited with external tools such as [Helix Font Editor](https://helixfonteditor.netlify.app/) and [Logo Editor](https://joric.github.io/qle/).
|
||||||
|
|
||||||
## Buffer Read Example
|
## Buffer Read Example
|
||||||
For some purposes, you may need to read the current state of the OLED display
|
For some purposes, you may need to read the current state of the OLED display
|
||||||
buffer. The `oled_read_raw` function can be used to safely read bytes from the
|
buffer. The `oled_read_raw` function can be used to safely read bytes from the
|
||||||
@ -162,7 +164,7 @@ These configuration options should be placed in `config.h`. Example:
|
|||||||
|`OLED_FONT_END` |`223` |The ending character index for custom fonts |
|
|`OLED_FONT_END` |`223` |The ending character 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_TIMEOUT` |`60000` |Turns off the OLED screen after 60000ms of keyboard inactivity. Helps reduce OLED Burn-in. Set to 0 to disable. |
|
|`OLED_TIMEOUT` |`60000` |Turns off the OLED screen after 60000ms of screen update inactivity. Helps reduce OLED Burn-in. Set to 0 to disable. |
|
||||||
|`OLED_FADE_OUT` |*Not defined* |Enables fade out animation. Use together with `OLED_TIMEOUT`. |
|
|`OLED_FADE_OUT` |*Not defined* |Enables fade out animation. Use together with `OLED_TIMEOUT`. |
|
||||||
|`OLED_FADE_OUT_INTERVAL` |`0` |The speed of fade out animation, from 0 to 15. Larger values are slower. |
|
|`OLED_FADE_OUT_INTERVAL` |`0` |The speed of fade out animation, from 0 to 15. Larger values are slower. |
|
||||||
|`OLED_SCROLL_TIMEOUT` |`0` |Scrolls the OLED screen after 0ms of OLED inactivity. Helps reduce OLED Burn-in. Set to 0 to disable. |
|
|`OLED_SCROLL_TIMEOUT` |`0` |Scrolls the OLED screen after 0ms of OLED inactivity. Helps reduce OLED Burn-in. Set to 0 to disable. |
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Pointing Device is a generic name for a feature intended to be generic: moving the system pointer around. There are certainly other options for it - like mousekeys - but this aims to be easily modifiable and hardware driven. You can implement custom keys to control functionality, or you can gather information from other peripherals and insert it directly here - let QMK handle the processing for you.
|
Pointing Device is a generic name for a feature intended to be generic: moving the system pointer around. There are certainly other options for it - like mousekeys - but this aims to be easily modifiable and hardware driven. You can implement custom keys to control functionality, or you can gather information from other peripherals and insert it directly here - let QMK handle the processing for you.
|
||||||
|
|
||||||
To enable Pointing Device, uncomment the following line in your rules.mk:
|
To enable Pointing Device, add the following line in your rules.mk and specify one of the driver options below.
|
||||||
|
|
||||||
```make
|
```make
|
||||||
POINTING_DEVICE_ENABLE = yes
|
POINTING_DEVICE_ENABLE = yes
|
||||||
@ -30,7 +30,7 @@ The ADNS 5050 sensor uses a serial type protocol for communication, and requires
|
|||||||
|
|
||||||
The CPI range is 125-1375, in increments of 125. Defaults to 500 CPI.
|
The CPI range is 125-1375, in increments of 125. Defaults to 500 CPI.
|
||||||
|
|
||||||
### ADSN 9800 Sensor
|
### ADNS 9800 Sensor
|
||||||
|
|
||||||
To use the ADNS 9800 sensor, add this to your `rules.mk`
|
To use the ADNS 9800 sensor, add this to your `rules.mk`
|
||||||
|
|
||||||
@ -41,7 +41,7 @@ POINTING_DEVICE_DRIVER = adns9800
|
|||||||
The ADNS 9800 is an SPI driven optical sensor, that uses laser output for surface tracking.
|
The ADNS 9800 is an SPI driven optical sensor, that uses laser output for surface tracking.
|
||||||
|
|
||||||
| Setting | Description | Default |
|
| Setting | Description | Default |
|
||||||
|------------------------|------------------------------------------------------------------------|---------------|
|
|--------------------------------|------------------------------------------------------------------------|---------------|
|
||||||
|`ADNS9800_CLOCK_SPEED` | (Optional) Sets the clock speed that the sensor runs at. | `2000000` |
|
|`ADNS9800_CLOCK_SPEED` | (Optional) Sets the clock speed that the sensor runs at. | `2000000` |
|
||||||
|`ADNS9800_SPI_LSBFIRST` | (Optional) Sets the Least/Most Significant Byte First setting for SPI. | `false` |
|
|`ADNS9800_SPI_LSBFIRST` | (Optional) Sets the Least/Most Significant Byte First setting for SPI. | `false` |
|
||||||
|`ADNS9800_SPI_MODE` | (Optional) Sets the SPI Mode for the sensor. | `3` |
|
|`ADNS9800_SPI_MODE` | (Optional) Sets the SPI Mode for the sensor. | `3` |
|
||||||
@ -69,7 +69,7 @@ The Analog Joystick is an analog (ADC) driven sensor. There are a variety of jo
|
|||||||
|`ANALOG_JOYSTICK_AXIS_MAX` | (Optional) Sets the upper range to be considered movement. | `1023` |
|
|`ANALOG_JOYSTICK_AXIS_MAX` | (Optional) Sets the upper range to be considered movement. | `1023` |
|
||||||
|`ANALOG_JOYSTICK_SPEED_REGULATOR` | (Optional) The divisor used to slow down movement. (lower makes it faster) | `20` |
|
|`ANALOG_JOYSTICK_SPEED_REGULATOR` | (Optional) The divisor used to slow down movement. (lower makes it faster) | `20` |
|
||||||
|`ANALOG_JOYSTICK_READ_INTERVAL` | (Optional) The interval in milliseconds between reads. | `10` |
|
|`ANALOG_JOYSTICK_READ_INTERVAL` | (Optional) The interval in milliseconds between reads. | `10` |
|
||||||
|`ANALOG_JOYSTICK_SPEED_MAX` | (Optional) The maxiumum value used for motion. | `2` |
|
|`ANALOG_JOYSTICK_SPEED_MAX` | (Optional) The maximum value used for motion. | `2` |
|
||||||
|`ANALOG_JOYSTICK_CLICK_PIN` | (Optional) The pin wired up to the press switch of the analog stick. | _not defined_ |
|
|`ANALOG_JOYSTICK_CLICK_PIN` | (Optional) The pin wired up to the press switch of the analog stick. | _not defined_ |
|
||||||
|
|
||||||
|
|
||||||
@ -127,8 +127,7 @@ The Pimoroni Trackball module is a I2C based breakout board with an RGB enable t
|
|||||||
| Setting | Description | Default |
|
| Setting | Description | Default |
|
||||||
|-------------------------------------|------------------------------------------------------------------------------------|---------|
|
|-------------------------------------|------------------------------------------------------------------------------------|---------|
|
||||||
|`PIMORONI_TRACKBALL_ADDRESS` | (Required) Sets the I2C Address for the Pimoroni Trackball. | `0x0A` |
|
|`PIMORONI_TRACKBALL_ADDRESS` | (Required) Sets the I2C Address for the Pimoroni Trackball. | `0x0A` |
|
||||||
|`PIMORONI_TRACKBALL_TIMEOUT` | (Optional) The timeout for i2c communication with the trackpad in milliseconds. | `100` |
|
|`PIMORONI_TRACKBALL_TIMEOUT` | (Optional) The timeout for i2c communication with the trackball in milliseconds. | `100` |
|
||||||
|`PIMORONI_TRACKBALL_INTERVAL_MS` | (Optional) The update/read interval for the sensor in milliseconds. | `8` |
|
|
||||||
|`PIMORONI_TRACKBALL_SCALE` | (Optional) The multiplier used to generate reports from the sensor. | `5` |
|
|`PIMORONI_TRACKBALL_SCALE` | (Optional) The multiplier used to generate reports from the sensor. | `5` |
|
||||||
|`PIMORONI_TRACKBALL_DEBOUNCE_CYCLES` | (Optional) The number of scan cycles used for debouncing on the ball press. | `20` |
|
|`PIMORONI_TRACKBALL_DEBOUNCE_CYCLES` | (Optional) The number of scan cycles used for debouncing on the ball press. | `20` |
|
||||||
|`PIMORONI_TRACKBALL_ERROR_COUNT` | (Optional) Specifies the number of read/write errors until the sensor is disabled. | `10` |
|
|`PIMORONI_TRACKBALL_ERROR_COUNT` | (Optional) Specifies the number of read/write errors until the sensor is disabled. | `10` |
|
||||||
@ -151,14 +150,44 @@ The PMW 3360 is an SPI driven optical sensor, that uses a built in IR LED for su
|
|||||||
|`PMW3360_SPI_MODE` | (Optional) Sets the SPI Mode for the sensor. | `3` |
|
|`PMW3360_SPI_MODE` | (Optional) Sets the SPI Mode for the sensor. | `3` |
|
||||||
|`PMW3360_SPI_DIVISOR` | (Optional) Sets the SPI Divisor used for SPI communication. | _varies_ |
|
|`PMW3360_SPI_DIVISOR` | (Optional) Sets the SPI Divisor used for SPI communication. | _varies_ |
|
||||||
|`PMW3360_LIFTOFF_DISTANCE` | (Optional) Sets the lift off distance at run time | `0x02` |
|
|`PMW3360_LIFTOFF_DISTANCE` | (Optional) Sets the lift off distance at run time | `0x02` |
|
||||||
|`ROTATIONAL_TRANSFORM_ANGLE` | (Optional) Allows for the sensor data to be rotated +/- 30 degrees directly in the sensor. | `0` |
|
|`ROTATIONAL_TRANSFORM_ANGLE` | (Optional) Allows for the sensor data to be rotated +/- 127 degrees directly in the sensor.| `0` |
|
||||||
|
|`PMW3360_FIRMWARE_UPLOAD_FAST` | (Optional) Skips the 15us wait between firmware blocks. | _not defined_ |
|
||||||
|
|
||||||
The CPI range is 100-12000, in increments of 100. Defaults to 1600 CPI.
|
The CPI range is 100-12000, in increments of 100. Defaults to 1600 CPI.
|
||||||
|
|
||||||
|
### PMW 3389 Sensor
|
||||||
|
|
||||||
|
To use the PMW 3389 sensor, add this to your `rules.mk`
|
||||||
|
|
||||||
|
```make
|
||||||
|
POINTING_DEVICE_DRIVER = pmw3389
|
||||||
|
```
|
||||||
|
|
||||||
|
The PMW 3389 is an SPI driven optical sensor, that uses a built in IR LED for surface tracking.
|
||||||
|
|
||||||
|
| Setting | Description | Default |
|
||||||
|
|---------------------------------|--------------------------------------------------------------------------------------------|---------------|
|
||||||
|
|`PMW3389_CS_PIN` | (Required) Sets the Cable Select pin connected to the sensor. | _not defined_ |
|
||||||
|
|`PMW3389_CLOCK_SPEED` | (Optional) Sets the clock speed that the sensor runs at. | `2000000` |
|
||||||
|
|`PMW3389_SPI_LSBFIRST` | (Optional) Sets the Least/Most Significant Byte First setting for SPI. | `false` |
|
||||||
|
|`PMW3389_SPI_MODE` | (Optional) Sets the SPI Mode for the sensor. | `3` |
|
||||||
|
|`PMW3389_SPI_DIVISOR` | (Optional) Sets the SPI Divisor used for SPI communication. | _varies_ |
|
||||||
|
|`PMW3389_LIFTOFF_DISTANCE` | (Optional) Sets the lift off distance at run time | `0x02` |
|
||||||
|
|`ROTATIONAL_TRANSFORM_ANGLE` | (Optional) Allows for the sensor data to be rotated +/- 30 degrees directly in the sensor. | `0` |
|
||||||
|
|`PMW3389_FIRMWARE_UPLOAD_FAST` | (Optional) Skips the 15us wait between firmware blocks. | _not defined_ |
|
||||||
|
|
||||||
|
The CPI range is 50-16000, in increments of 50. Defaults to 2000 CPI.
|
||||||
|
|
||||||
|
|
||||||
### Custom Driver
|
### Custom Driver
|
||||||
|
|
||||||
If you have a sensor type that isn't supported here, you can manually implement it, by adding these functions (with the correct implementation for your device):
|
If you have a sensor type that isn't supported above, a custom option is available by adding the following to your `rules.mk`
|
||||||
|
|
||||||
|
```make
|
||||||
|
POINTING_DEVICE_DRIVER = custom
|
||||||
|
```
|
||||||
|
|
||||||
|
Using the custom driver will require implementing the following functions:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
void pointing_device_driver_init(void) {}
|
void pointing_device_driver_init(void) {}
|
||||||
@ -172,13 +201,34 @@ void pointing_device_driver_set_cpi(uint16_t cpi) {}
|
|||||||
## Common Configuration
|
## Common Configuration
|
||||||
|
|
||||||
| Setting | Description | Default |
|
| Setting | Description | Default |
|
||||||
|-------------------------------|-----------------------------------------------------------------------|---------------|
|
|----------------------------------|-----------------------------------------------------------------------|-------------------|
|
||||||
|`POINTING_DEVICE_ROTATION_90` | (Optional) Rotates the X and Y data by 90 degrees. | _not defined_ |
|
|`POINTING_DEVICE_ROTATION_90` | (Optional) Rotates the X and Y data by 90 degrees. | _not defined_ |
|
||||||
|`POINTING_DEVICE_ROTATION_180` | (Optional) Rotates the X and Y data by 180 degrees. | _not defined_ |
|
|`POINTING_DEVICE_ROTATION_180` | (Optional) Rotates the X and Y data by 180 degrees. | _not defined_ |
|
||||||
|`POINTING_DEVICE_ROTATION_270` | (Optional) Rotates the X and Y data by 270 degrees. | _not defined_ |
|
|`POINTING_DEVICE_ROTATION_270` | (Optional) Rotates the X and Y data by 270 degrees. | _not defined_ |
|
||||||
|`POINTING_DEVICE_INVERT_X` | (Optional) Inverts the X axis report. | _not defined_ |
|
|`POINTING_DEVICE_INVERT_X` | (Optional) Inverts the X axis report. | _not defined_ |
|
||||||
|`POINTING_DEVICE_INVERT_Y` | (Optional) Inverts the Y axis report. | _not defined_ |
|
|`POINTING_DEVICE_INVERT_Y` | (Optional) Inverts the Y axis report. | _not defined_ |
|
||||||
|`POINTING_DEVICE_MOTION_PIN` | (Optional) If supported, will only read from sensor if pin is active. | _not defined_ |
|
|`POINTING_DEVICE_MOTION_PIN` | (Optional) If supported, will only read from sensor if pin is active. | _not defined_ |
|
||||||
|
|`POINTING_DEVICE_TASK_THROTTLE_MS` | (Optional) Limits the frequency that the sensor is polled for motion. | _not defined_ |
|
||||||
|
|
||||||
|
!> When using `SPLIT_POINTING_ENABLE` the `POINTING_DEVICE_MOTION_PIN` functionality is not supported and `POINTING_DEVICE_TASK_THROTTLE_MS` will default to `1`. Increasing this value will increase transport performance at the cost of possible mouse responsiveness.
|
||||||
|
|
||||||
|
|
||||||
|
## Split Keyboard Configuration
|
||||||
|
|
||||||
|
The following configuration options are only available when using `SPLIT_POINTING_ENABLE` see [data sync options](feature_split_keyboard.md?id=data-sync-options). The rotation and invert `*_RIGHT` options are only used with `POINTING_DEVICE_COMBINED`. If using `POINTING_DEVICE_LEFT` or `POINTING_DEVICE_RIGHT` use the common configuration above to configure your pointing device.
|
||||||
|
|
||||||
|
| Setting | Description | Default |
|
||||||
|
|----------------------------------------|-----------------------------------------------------------------------|---------------|
|
||||||
|
|`POINTING_DEVICE_LEFT` | Pointing device on the left side (Required - pick one only) | _not defined_ |
|
||||||
|
|`POINTING_DEVICE_RIGHT` | Pointing device on the right side (Required - pick one only) | _not defined_ |
|
||||||
|
|`POINTING_DEVICE_COMBINED` | Pointing device on both sides (Required - pick one only) | _not defined_ |
|
||||||
|
|`POINTING_DEVICE_ROTATION_90_RIGHT` | (Optional) Rotates the X and Y data by 90 degrees. | _not defined_ |
|
||||||
|
|`POINTING_DEVICE_ROTATION_180_RIGHT` | (Optional) Rotates the X and Y data by 180 degrees. | _not defined_ |
|
||||||
|
|`POINTING_DEVICE_ROTATION_270_RIGHT` | (Optional) Rotates the X and Y data by 270 degrees. | _not defined_ |
|
||||||
|
|`POINTING_DEVICE_INVERT_X_RIGHT` | (Optional) Inverts the X axis report. | _not defined_ |
|
||||||
|
|`POINTING_DEVICE_INVERT_Y_RIGHT` | (Optional) Inverts the Y axis report. | _not defined_ |
|
||||||
|
|
||||||
|
!> If there is a `_RIGHT` configuration option or callback, the [common configuration](feature_pointing_device.md?id=common-configuration) option will work for the left. For correct left/right detection you should setup a [handedness option](feature_split_keyboard?id=setting-handedness), `EE_HANDS` is usually a good option for an existing board that doesn't do handedness by hardware.
|
||||||
|
|
||||||
|
|
||||||
## Callbacks and Functions
|
## Callbacks and Functions
|
||||||
@ -188,7 +238,7 @@ void pointing_device_driver_set_cpi(uint16_t cpi) {}
|
|||||||
| `pointing_device_init_kb(void)` | Callback to allow for keyboard level initialization. Useful for additional hardware sensors. |
|
| `pointing_device_init_kb(void)` | Callback to allow for keyboard level initialization. Useful for additional hardware sensors. |
|
||||||
| `pointing_device_init_user(void)` | Callback to allow for user level initialization. Useful for additional hardware sensors. |
|
| `pointing_device_init_user(void)` | Callback to allow for user level initialization. Useful for additional hardware sensors. |
|
||||||
| `pointing_device_task_kb(mouse_report)` | Callback that sends sensor data, so keyboard code can intercept and modify the data. Returns a mouse report. |
|
| `pointing_device_task_kb(mouse_report)` | Callback that sends sensor data, so keyboard code can intercept and modify the data. Returns a mouse report. |
|
||||||
| `pointing_device_task_user(mouse_report)` | Callback that sends sensor data, so user coe can intercept and modify the data. Returns a mouse report. |
|
| `pointing_device_task_user(mouse_report)` | Callback that sends sensor data, so user code can intercept and modify the data. Returns a mouse report. |
|
||||||
| `pointing_device_handle_buttons(buttons, pressed, button)` | Callback to handle hardware button presses. Returns a `uint8_t`. |
|
| `pointing_device_handle_buttons(buttons, pressed, button)` | Callback to handle hardware button presses. Returns a `uint8_t`. |
|
||||||
| `pointing_device_get_cpi(void)` | Gets the current CPI/DPI setting from the sensor, if supported. |
|
| `pointing_device_get_cpi(void)` | Gets the current CPI/DPI setting from the sensor, if supported. |
|
||||||
| `pointing_device_set_cpi(uint16_t)` | Sets the CPI/DPI, if supported. |
|
| `pointing_device_set_cpi(uint16_t)` | Sets the CPI/DPI, if supported. |
|
||||||
@ -196,6 +246,21 @@ void pointing_device_driver_set_cpi(uint16_t cpi) {}
|
|||||||
| `pointing_device_set_report(mouse_report)` | Sets the mouse report to the assigned `mouse_report_t` data structured passed to the function. |
|
| `pointing_device_set_report(mouse_report)` | Sets the mouse report to the assigned `mouse_report_t` data structured passed to the function. |
|
||||||
| `pointing_device_send(void)` | Sends the current mouse report to the host system. Function can be replaced. |
|
| `pointing_device_send(void)` | Sends the current mouse report to the host system. Function can be replaced. |
|
||||||
| `has_mouse_report_changed(old, new)` | Compares the old and new `mouse_report_t` data and returns true only if it has changed. |
|
| `has_mouse_report_changed(old, new)` | Compares the old and new `mouse_report_t` data and returns true only if it has changed. |
|
||||||
|
| `pointing_device_adjust_by_defines(mouse_report)` | Applies rotations and invert configurations to a raw mouse report. |
|
||||||
|
|
||||||
|
|
||||||
|
## Split Keyboard Callbacks and Functions
|
||||||
|
|
||||||
|
The combined functions below are only available when using `SPLIT_POINTING_ENABLE` and `POINTING_DEVICE_COMBINED`. The 2 callbacks `pointing_device_task_combined_*` replace the single sided equivalents above. See the [combined pointing devices example](feature_pointing_device.md?id=combined-pointing-devices)
|
||||||
|
|
||||||
|
| Function | Description |
|
||||||
|
|-----------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------|
|
||||||
|
| `pointing_device_set_shared_report(mouse_report)` | Sets the shared mouse report to the assigned `mouse_report_t` data structured passed to the function. |
|
||||||
|
| `pointing_device_set_cpi_on_side(bool, uint16_t)` | Sets the CPI/DPI of one side, if supported. Passing `true` will set the left and `false` the right` |
|
||||||
|
| `pointing_device_combine_reports(left_report, right_report)` | Returns a combined mouse_report of left_report and right_report (as a `mouse_report_t` data structure) |
|
||||||
|
| `pointing_device_task_combined_kb(left_report, right_report)` | Callback, so keyboard code can intercept and modify the data. Returns a combined mouse report. |
|
||||||
|
| `pointing_device_task_combined_user(left_report, right_report)` | Callback, so user code can intercept and modify. Returns a combined mouse report using `pointing_device_combine_reports` |
|
||||||
|
| `pointing_device_adjust_by_defines_right(mouse_report)` | Applies right side rotations and invert configurations to a raw mouse report. |
|
||||||
|
|
||||||
|
|
||||||
# Manipulating Mouse Reports
|
# Manipulating Mouse Reports
|
||||||
@ -220,9 +285,11 @@ Additionally, by default, `pointing_device_send()` will only send a report when
|
|||||||
|
|
||||||
Also, you use the `has_mouse_report_changed(new, old)` function to check to see if the report has changed.
|
Also, you use the `has_mouse_report_changed(new, old)` function to check to see if the report has changed.
|
||||||
|
|
||||||
## Example
|
## Examples
|
||||||
|
|
||||||
In the following example, a custom key is used to click the mouse and scroll 127 units vertically and horizontally, then undo all of that when released - because that's a totally useful function. Listen, this is an example:
|
### Custom Mouse Keycode
|
||||||
|
|
||||||
|
In this example, a custom key is used to click the mouse and scroll 127 units vertically and horizontally, then undo all of that when released - because that's a totally useful function.
|
||||||
|
|
||||||
```c
|
```c
|
||||||
case MS_SPECIAL:
|
case MS_SPECIAL:
|
||||||
@ -242,3 +309,92 @@ case MS_SPECIAL:
|
|||||||
```
|
```
|
||||||
|
|
||||||
Recall that the mouse report is set to zero (except the buttons) whenever it is sent, so the scrolling would only occur once in each case.
|
Recall that the mouse report is set to zero (except the buttons) whenever it is sent, so the scrolling would only occur once in each case.
|
||||||
|
|
||||||
|
### Drag Scroll or Mouse Scroll
|
||||||
|
|
||||||
|
A very common implementation is to use the mouse movement to scroll instead of moving the cursor on the system. This uses the `pointing_device_task_user` callback to intercept and modify the mouse report before it's sent to the host system.
|
||||||
|
|
||||||
|
```c
|
||||||
|
enum custom_keycodes {
|
||||||
|
DRAG_SCROLL = SAFE_RANGE,
|
||||||
|
};
|
||||||
|
|
||||||
|
bool set_scrolling = false;
|
||||||
|
|
||||||
|
report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) {
|
||||||
|
if (set_scrolling) {
|
||||||
|
mouse_report.h = mouse_report.x;
|
||||||
|
mouse_report.v = mouse_report.y;
|
||||||
|
mouse_report.x = mouse_report.y = 0
|
||||||
|
}
|
||||||
|
return mouse_report;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
if (keycode == DRAG_SCROLL && record->event.pressed) {
|
||||||
|
set_scrolling = !set_scrolling;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This allows you to toggle between scrolling and cursor movement by pressing the DRAG_SCROLL key.
|
||||||
|
|
||||||
|
## Split Examples
|
||||||
|
|
||||||
|
The following examples make use the `SPLIT_POINTING_ENABLE` functionality and show how to manipulate the mouse report for a scrolling mode.
|
||||||
|
|
||||||
|
### Single Pointing Device
|
||||||
|
|
||||||
|
The following example will work with either `POINTING_DEVICE_LEFT` or `POINTING_DEVICE_RIGHT` and enables scrolling mode while on a particular layer.
|
||||||
|
|
||||||
|
```c
|
||||||
|
|
||||||
|
static bool scrolling_mode = false;
|
||||||
|
|
||||||
|
layer_state_t layer_state_set_user(layer_state_t state) {
|
||||||
|
switch (get_highest_layer(state)) {
|
||||||
|
case _RAISE: // If we're on the _RAISE layer enable scrolling mode
|
||||||
|
scrolling_mode = true;
|
||||||
|
pointing_device_set_cpi(2000);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (scrolling_mode) { // check if we were scrolling before and set disable if so
|
||||||
|
scrolling_mode = false;
|
||||||
|
pointing_device_set_cpi(8000);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) {
|
||||||
|
if (scrolling_mode) {
|
||||||
|
mouse_report.h = mouse_report.x;
|
||||||
|
mouse_report.v = mouse_report.y;
|
||||||
|
mouse_report.x = 0;
|
||||||
|
mouse_report.y = 0;
|
||||||
|
}
|
||||||
|
return mouse_report;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Combined Pointing Devices
|
||||||
|
|
||||||
|
The following example requires `POINTING_DEVICE_COMBINED` and sets the left side pointing device to scroll only.
|
||||||
|
|
||||||
|
```c
|
||||||
|
void keyboard_post_init_user(void) {
|
||||||
|
pointing_device_set_cpi_on_side(true, 1000); //Set cpi on left side to a low value for slower scrolling.
|
||||||
|
pointing_device_set_cpi_on_side(false, 8000); //Set cpi on right side to a reasonable value for mousing.
|
||||||
|
}
|
||||||
|
|
||||||
|
report_mouse_t pointing_device_task_combined_user(report_mouse_t left_report, report_mouse_t right_report) {
|
||||||
|
left_report.h = left_report.x;
|
||||||
|
left_report.v = left_report.y;
|
||||||
|
left_report.x = 0;
|
||||||
|
left_report.y = 0;
|
||||||
|
return pointing_device_combine_reports(left_report, right_report);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
=======
|
||||||
|
@ -232,6 +232,115 @@ const is31_led PROGMEM g_is31_leds[DRIVER_LED_TOTAL] = {
|
|||||||
|
|
||||||
Where `X_Y` is the location of the LED in the matrix defined by [the datasheet](https://www.issi.com/WW/pdf/31FL3737.pdf) and the header file `drivers/led/issi/is31fl3737.h`. The `driver` is the index of the driver you defined in your `config.h` (Only `0`, `1` for now).
|
Where `X_Y` is the location of the LED in the matrix defined by [the datasheet](https://www.issi.com/WW/pdf/31FL3737.pdf) and the header file `drivers/led/issi/is31fl3737.h`. The `driver` is the index of the driver you defined in your `config.h` (Only `0`, `1` for now).
|
||||||
|
|
||||||
|
---
|
||||||
|
### IS31FLCOMMON :id=is31flcommon
|
||||||
|
|
||||||
|
There is basic support for addressable RGB matrix lighting with a selection of I2C ISSI Lumissil RGB controllers through a shared common driver. To enable it, add this to your `rules.mk`:
|
||||||
|
|
||||||
|
```makefile
|
||||||
|
RGB_MATRIX_ENABLE = yes
|
||||||
|
RGB_MATRIX_DRIVER = <driver name>
|
||||||
|
```
|
||||||
|
|
||||||
|
Where `<driver name>` is the applicable LED driver chip as below
|
||||||
|
|
||||||
|
| Driver Name | Data Sheet | Capability |
|
||||||
|
|-------------|------------|------------|
|
||||||
|
| `IS31FL3742A` | [datasheet](https://www.lumissil.com/assets/pdf/core/IS31FL3742A_DS.pdf) | 60 RGB, 30x6 Matrix |
|
||||||
|
| `ISSIFL3743A` | [datasheet](https://www.lumissil.com/assets/pdf/core/IS31FL3743A_DS.pdf) | 66 RGB, 18x11 Matrix |
|
||||||
|
| `IS31FL3745` | [datasheet](https://www.lumissil.com/assets/pdf/core/IS31FL3745_DS.pdf) | 48 RGB, 18x8 Matrix |
|
||||||
|
| `IS31FL3746A` | [datasheet](https://www.lumissil.com/assets/pdf/core/IS31FL3746A_DS.pdf) | 24 RGB, 18x4 Matrix |
|
||||||
|
|
||||||
|
You can use between 1 and 4 IC's. Do not specify `DRIVER_ADDR_<N>` define for IC's if not present on your keyboard. The `DRIVER_ADDR_1` default assumes that all Address pins on the controller have been connected to GND. Drivers that have SYNC functionality have the default settings to disable if 1 driver. If more than 1 drivers then `DRIVER_ADDR_1` will be set to Master and the remaining ones set to Slave.
|
||||||
|
|
||||||
|
Configure the hardware via your `config.h`:
|
||||||
|
|
||||||
|
| Variable | Description | Default |
|
||||||
|
|----------|-------------|---------|
|
||||||
|
| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
|
||||||
|
| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
|
||||||
|
| `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | |
|
||||||
|
| `DRIVER_LED_TOTAL` | (Required) How many RGB lights are present across all drivers | |
|
||||||
|
| `DRIVER_ADDR_1` | (Optional) Address for the first RGB driver | |
|
||||||
|
| `DRIVER_ADDR_<N>` | (Required) Address for the additional RGB drivers | |
|
||||||
|
| `ISSI_SSR_<N>` | (Optional) Configuration for the Spread Spectrum Register | |
|
||||||
|
| `ISSI_CONFIGURATION` | (Optional) Configuration for the Configuration Register | |
|
||||||
|
| `ISSI_GLOBALCURRENT` | (Optional) Configuration for the Global Current Register | 0xFF |
|
||||||
|
| `ISSI_PULLDOWNUP` | (Optional) Configuration for the Pull Up & Pull Down Register | |
|
||||||
|
| `ISSI_TEMP` | (Optional) Configuration for the Tempature Register | |
|
||||||
|
| `ISSI_PWM_ENABLE` | (Optional) Configuration for the PWM Enable Register | |
|
||||||
|
| `ISSI_PWM_SET` | (Optional) Configuration for the PWM Setting Register | |
|
||||||
|
| `ISSI_SCAL_RED` | (Optional) Configuration for the RED LEDs in Scaling Registers | 0xFF |
|
||||||
|
| `ISSI_SCAL_BLUE` | (Optional) Configuration for the BLUE LEDs in Scaling Registers | 0xFF |
|
||||||
|
| `ISSI_SCAL_GREEN` | (Optional) Configuration for the GREEN LEDs in Scaling Registers | 0xFF |
|
||||||
|
| `ISSI_MANUAL_SCALING` | (Optional) If you wish to configure the Scaling Registers manually | |
|
||||||
|
|
||||||
|
|
||||||
|
Defaults
|
||||||
|
|
||||||
|
| Variable | IS31FL3742A | IS31FL3743A | IS31FL3745 | IS31FL3746 |
|
||||||
|
|----------|-------------|-------------|------------|------------|
|
||||||
|
| `DRIVER_ADDR_1` | 0b0110000 | 0b0100000 | 0b0100000 | 0b1100000 |
|
||||||
|
| `ISSI_SSR_1` | 0x00 | 0x00 / 0x60 | 0x00 / 0xC0 | 0x00 |
|
||||||
|
| `ISSI_SSR_<2-4>` | 0x00 | 0x40 | 0x80 | 0x00 |
|
||||||
|
| `ISSI_CONFIGURATION` | 0x31 | 0x01 | 0x31 | 0x01 |
|
||||||
|
| `ISSI_PULLDOWNUP` | 0x55 | 0x33 | 0x33 | 0x33 |
|
||||||
|
| `ISSI_TEMP` | N/A | 0x00 | 0x00 | 0x00 |
|
||||||
|
| `ISSI_PWM_ENABLE` | N/A | N/A | N/A | 0x00 |
|
||||||
|
| `ISSI_PWM_SET` | 0x00 | N/A | N/A | 0x00 |
|
||||||
|
|
||||||
|
Here is an example using 2 drivers.
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define DRIVER_ADDR_2 0b0100001
|
||||||
|
|
||||||
|
#define DRIVER_COUNT 2
|
||||||
|
#define DRIVER_1_LED_TOTAL 66
|
||||||
|
#define DRIVER_2_LED_TOTAL 42
|
||||||
|
#define DRIVER_LED_TOTAL (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
|
||||||
|
```
|
||||||
|
|
||||||
|
!> Note the parentheses, this is so when `DRIVER_LED_TOTAL` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`.
|
||||||
|
|
||||||
|
Currently only 4 drivers are supported, but it would be trivial to support for more. Note that using a combination of different drivers is not supported. All drivers must be of the same model.
|
||||||
|
|
||||||
|
Define these arrays listing all the LEDs in your `<keyboard>.c`:
|
||||||
|
|
||||||
|
```c
|
||||||
|
const is31_led __flash g_is31_leds[DRIVER_LED_TOTAL] = {
|
||||||
|
/* Refer to IS31 manual for these locations
|
||||||
|
* driver
|
||||||
|
* | R location
|
||||||
|
* | | G location
|
||||||
|
* | | | B location
|
||||||
|
* | | | | */
|
||||||
|
{0, CS1_SW1, CS2_SW1, CS3_SW1},
|
||||||
|
....
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Where `CSx_SWx` is the location of the LED in the matrix defined by the datasheet. The `driver` is the index of the driver you defined in your `config.h` (`0`, `1`, `2`, or `3` for now).
|
||||||
|
|
||||||
|
`ISSI_MANUAL_SCALING` is used to override the Scaling for individual LED's. By default they will be set as per `ISSI_SCAL_<colour>`. In `config.h` set how many LED's you want to manually set scaling for.
|
||||||
|
Eg `#define ISSI_MANUAL_SCALING 3`
|
||||||
|
|
||||||
|
Then Define the array listing all the LEDs you want to override in your `<keyboard>.c`:
|
||||||
|
|
||||||
|
```c
|
||||||
|
const is31_led __flash g_is31_scaling[ISSI_MANUAL_SCALING] = {
|
||||||
|
* LED Index
|
||||||
|
* | R scaling
|
||||||
|
* | | G scaling
|
||||||
|
* | | | B scaling
|
||||||
|
* | | | | */
|
||||||
|
{5, 120, 155, 167},
|
||||||
|
{9, 120, 155, 167},
|
||||||
|
....
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Where LED Index is the position of the LED in the `g_is31_leds` array. The `scaling` value between 0 and 255 to be written to the Scaling Register.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### WS2812 :id=ws2812
|
### WS2812 :id=ws2812
|
||||||
@ -252,6 +361,8 @@ Configure the hardware via your `config.h`:
|
|||||||
#define DRIVER_LED_TOTAL 70
|
#define DRIVER_LED_TOTAL 70
|
||||||
```
|
```
|
||||||
|
|
||||||
|
?> There are additional configuration options for ARM controllers that offer increased performance over the default bitbang driver. Please see [WS2812 Driver](ws2812_driver.md) for more information.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### APA102 :id=apa102
|
### APA102 :id=apa102
|
||||||
@ -415,7 +526,10 @@ All RGB keycodes are currently shared with the RGBLIGHT system:
|
|||||||
|
|
||||||
* `RGB_MODE_*` keycodes will generally work, but not all of the modes are currently mapped to the correct effects for the RGB Matrix system.
|
* `RGB_MODE_*` keycodes will generally work, but not all of the modes are currently mapped to the correct effects for the RGB Matrix system.
|
||||||
|
|
||||||
`RGB_MODE_PLAIN`, `RGB_MODE_BREATHE`, `RGB_MODE_RAINBOW`, and `RGB_MATRIX_SWIRL` are the only ones that are mapped properly. The rest don't have a direct equivalent, and are not mapped.
|
`RGB_MODE_PLAIN`, `RGB_MODE_BREATHE`, `RGB_MODE_RAINBOW`, and `RGB_MODE_SWIRL` are the only ones that are mapped properly. The rest don't have a direct equivalent, and are not mapped.
|
||||||
|
|
||||||
|
?> `RGB_*` keycodes cannot be used with functions like `tap_code16(RGB_HUD)` as they're not USB HID keycodes. If you wish to replicate similar behaviour in custom code within your firmware (e.g. inside `encoder_update_user()` or `process_record_user()`), the equivalent [RGB functions](#functions) should be used instead.
|
||||||
|
|
||||||
|
|
||||||
!> By default, if you have both the [RGB Light](feature_rgblight.md) and the RGB Matrix feature enabled, these keycodes will work for both features, at the same time. You can disable the keycode functionality by defining the `*_DISABLE_KEYCODES` option for the specific feature.
|
!> By default, if you have both the [RGB Light](feature_rgblight.md) and the RGB Matrix feature enabled, these keycodes will work for both features, at the same time. You can disable the keycode functionality by defining the `*_DISABLE_KEYCODES` option for the specific feature.
|
||||||
|
|
||||||
@ -454,6 +568,7 @@ enum rgb_matrix_effects {
|
|||||||
RGB_MATRIX_HUE_PENDULUM, // Hue shifts up a slight ammount in a wave to the right, then back to the left
|
RGB_MATRIX_HUE_PENDULUM, // Hue shifts up a slight ammount in a wave to the right, then back to the left
|
||||||
RGB_MATRIX_HUE_WAVE, // Hue shifts up a slight ammount and then back down in a wave to the right
|
RGB_MATRIX_HUE_WAVE, // Hue shifts up a slight ammount and then back down in a wave to the right
|
||||||
RGB_MATRIX_PIXEL_FRACTAL, // Single hue fractal filled keys pulsing horizontally out to edges
|
RGB_MATRIX_PIXEL_FRACTAL, // Single hue fractal filled keys pulsing horizontally out to edges
|
||||||
|
RGB_MATRIX_PIXEL_FLOW, // Pulsing RGB flow along LED wiring with random hues
|
||||||
RGB_MATRIX_PIXEL_RAIN, // Randomly light keys with random hues
|
RGB_MATRIX_PIXEL_RAIN, // Randomly light keys with random hues
|
||||||
#if define(RGB_MATRIX_FRAMEBUFFER_EFFECTS)
|
#if define(RGB_MATRIX_FRAMEBUFFER_EFFECTS)
|
||||||
RGB_MATRIX_TYPING_HEATMAP, // How hot is your WPM!
|
RGB_MATRIX_TYPING_HEATMAP, // How hot is your WPM!
|
||||||
@ -509,6 +624,7 @@ You can enable a single effect by defining `ENABLE_[EFFECT_NAME]` in your `confi
|
|||||||
|`#define ENABLE_RGB_MATRIX_HUE_PENDULUM` |Enables `RGB_MATRIX_HUE_PENDULUM` |
|
|`#define ENABLE_RGB_MATRIX_HUE_PENDULUM` |Enables `RGB_MATRIX_HUE_PENDULUM` |
|
||||||
|`#define ENABLE_RGB_MATRIX_HUE_WAVE` |Enables `RGB_MATRIX_HUE_WAVE ` |
|
|`#define ENABLE_RGB_MATRIX_HUE_WAVE` |Enables `RGB_MATRIX_HUE_WAVE ` |
|
||||||
|`#define ENABLE_RGB_MATRIX_PIXEL_FRACTAL` |Enables `RGB_MATRIX_PIXEL_FRACTAL` |
|
|`#define ENABLE_RGB_MATRIX_PIXEL_FRACTAL` |Enables `RGB_MATRIX_PIXEL_FRACTAL` |
|
||||||
|
|`#define ENABLE_RGB_MATRIX_PIXEL_FLOW` |Enables `RGB_MATRIX_PIXEL_FLOW` |
|
||||||
|`#define ENABLE_RGB_MATRIX_PIXEL_RAIN` |Enables `RGB_MATRIX_PIXEL_RAIN` |
|
|`#define ENABLE_RGB_MATRIX_PIXEL_RAIN` |Enables `RGB_MATRIX_PIXEL_RAIN` |
|
||||||
|
|
||||||
?> These modes don't require any additional defines.
|
?> These modes don't require any additional defines.
|
||||||
@ -554,12 +670,9 @@ In order to change the delay of temperature decrease define
|
|||||||
|
|
||||||
## Custom RGB Matrix Effects :id=custom-rgb-matrix-effects
|
## Custom RGB Matrix Effects :id=custom-rgb-matrix-effects
|
||||||
|
|
||||||
By setting `RGB_MATRIX_CUSTOM_USER` (and/or `RGB_MATRIX_CUSTOM_KB`) in `rules.mk`, new effects can be defined directly from userspace, without having to edit any QMK core files.
|
By setting `RGB_MATRIX_CUSTOM_USER = yes` in `rules.mk`, new effects can be defined directly from your keymap or userspace, without having to edit any QMK core files. To declare new effects, create a `rgb_matrix_user.inc` file in the user keymap directory or userspace folder.
|
||||||
|
|
||||||
To declare new effects, create a new `rgb_matrix_user/kb.inc` that looks something like this:
|
?> Hardware maintainers who want to limit custom effects to a specific keyboard can create a `rgb_matrix_kb.inc` file in the root of the keyboard directory, and add `RGB_MATRIX_CUSTOM_KB = yes` to the keyboard level `rules.mk`.
|
||||||
|
|
||||||
`rgb_matrix_user.inc` should go in the root of the keymap directory.
|
|
||||||
`rgb_matrix_kb.inc` should go in the root of the keyboard directory.
|
|
||||||
|
|
||||||
To use custom effects in your code, simply prepend `RGB_MATRIX_CUSTOM_` to the effect name specified in `RGB_MATRIX_EFFECT()`. For example, an effect declared as `RGB_MATRIX_EFFECT(my_cool_effect)` would be referenced with:
|
To use custom effects in your code, simply prepend `RGB_MATRIX_CUSTOM_` to the effect name specified in `RGB_MATRIX_EFFECT()`. For example, an effect declared as `RGB_MATRIX_EFFECT(my_cool_effect)` would be referenced with:
|
||||||
|
|
||||||
@ -707,6 +820,7 @@ Where `28` is an unused index from `eeconfig.h`.
|
|||||||
|`rgb_matrix_decrease_speed_noeeprom()` |Decrease the speed of the animations (not written to EEPROM) |
|
|`rgb_matrix_decrease_speed_noeeprom()` |Decrease the speed of the animations (not written to EEPROM) |
|
||||||
|`rgb_matrix_set_speed(speed)` |Set the speed of the animations to the given value where `speed` is between 0 and 255 |
|
|`rgb_matrix_set_speed(speed)` |Set the speed of the animations to the given value where `speed` is between 0 and 255 |
|
||||||
|`rgb_matrix_set_speed_noeeprom(speed)` |Set the speed of the animations to the given value where `speed` is between 0 and 255 (not written to EEPROM) |
|
|`rgb_matrix_set_speed_noeeprom(speed)` |Set the speed of the animations to the given value where `speed` is between 0 and 255 (not written to EEPROM) |
|
||||||
|
|`rgb_matrix_reload_from_eeprom()` |Reload the effect configuration (enabled, mode and color) from EEPROM |
|
||||||
|
|
||||||
### Change Color :id=change-color
|
### Change Color :id=change-color
|
||||||
|Function |Description |
|
|Function |Description |
|
||||||
@ -790,6 +904,28 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Layer indicator with only configured keys:
|
||||||
|
```c
|
||||||
|
void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
|
||||||
|
if (get_highest_layer(layer_state) > 0) {
|
||||||
|
uint8_t layer = get_highest_layer(layer_state);
|
||||||
|
|
||||||
|
for (uint8_t row = 0; row < MATRIX_ROWS; ++row) {
|
||||||
|
for (uint8_t col = 0; col < MATRIX_COLS; ++col) {
|
||||||
|
uint8_t index = g_led_config.matrix_co[row][col];
|
||||||
|
|
||||||
|
if (index >= led_min && index <= led_max && index != NO_LED &&
|
||||||
|
keymap_key_to_keycode(layer, (keypos_t){col,row}) > KC_TRNS) {
|
||||||
|
rgb_matrix_set_color(index, RGB_GREEN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
?> Split keyboards will require layer state data syncing with `#define SPLIT_LAYER_STATE_ENABLE`. See [Data Sync Options](feature_split_keyboard?id=data-sync-options) for more details.
|
||||||
|
|
||||||
#### Examples :id=indicator-examples
|
#### Examples :id=indicator-examples
|
||||||
|
|
||||||
This example sets the modifiers to be a specific color based on the layer state. You can use a switch case here, instead, if you would like. This uses HSV and then converts to RGB, because this allows the brightness to be limited (important when using the WS2812 driver).
|
This example sets the modifiers to be a specific color based on the layer state. You can use a switch case here, instead, if you would like. This uses HSV and then converts to RGB, because this allows the brightness to be limited (important when using the WS2812 driver).
|
||||||
@ -829,6 +965,8 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
!> RGB indicators on split keyboards will require state information synced to the slave half (e.g. `#define SPLIT_LAYER_STATE_ENABLE`). See [data sync options](feature_split_keyboard.md#data-sync-options) for more details.
|
||||||
|
|
||||||
#### Indicators without RGB Matrix Effect
|
#### Indicators without RGB Matrix Effect
|
||||||
|
|
||||||
If you want to just use RGB indicators without RGB matrix effect, it is not possible to disable the latter because toggling RGB off will disable everything. You can workaround it with solid effect and colors off using this init function:
|
If you want to just use RGB indicators without RGB matrix effect, it is not possible to disable the latter because toggling RGB off will disable everything. You can workaround it with solid effect and colors off using this init function:
|
||||||
|
@ -22,6 +22,8 @@ On keyboards with onboard RGB LEDs, it is usually enabled by default. If it is n
|
|||||||
RGBLIGHT_ENABLE = yes
|
RGBLIGHT_ENABLE = yes
|
||||||
```
|
```
|
||||||
|
|
||||||
|
?> There are additional configuration options for ARM controllers that offer increased performance over the default WS2812 bitbang driver. Please see [WS2812 Driver](ws2812_driver.md) for more information.
|
||||||
|
|
||||||
For APA102 LEDs, add the following to your `rules.mk`:
|
For APA102 LEDs, add the following to your `rules.mk`:
|
||||||
|
|
||||||
```make
|
```make
|
||||||
@ -76,9 +78,11 @@ Changing the **Value** sets the overall brightness.<br>
|
|||||||
|`RGB_MODE_RGBTEST` |`RGB_M_T` |Red, Green, Blue test animation mode |
|
|`RGB_MODE_RGBTEST` |`RGB_M_T` |Red, Green, Blue test animation mode |
|
||||||
|`RGB_MODE_TWINKLE` |`RGB_M_TW`|Twinkle animation mode |
|
|`RGB_MODE_TWINKLE` |`RGB_M_TW`|Twinkle animation mode |
|
||||||
|
|
||||||
!> By default, if you have both the RGB Light and the [RGB Matrix](feature_rgb_matrix.md) feature enabled, these keycodes will work for both features, at the same time. You can disable the keycode functionality by defining the `*_DISABLE_KEYCODES` option for the specific feature.
|
?> `RGB_*` keycodes cannot be used with functions like `tap_code16(RGB_HUI)` as they're not USB HID keycodes. If you wish to replicate similar behaviour in custom code within your firmware (e.g. inside `encoder_update_user()` or `process_record_user()`), the equivalent [RGB functions](#functions) should be used instead.
|
||||||
|
|
||||||
|
|
||||||
|
!> By default, if you have both the RGB Light and the [RGB Matrix](feature_rgb_matrix.md) feature enabled, these keycodes will work for both features, at the same time. You can disable the keycode functionality by defining the `*_DISABLE_KEYCODES` option for the specific feature.
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
Your RGB lighting can be configured by placing these `#define`s in your `config.h`:
|
Your RGB lighting can be configured by placing these `#define`s in your `config.h`:
|
||||||
@ -202,7 +206,7 @@ const uint8_t RGBLED_GRADIENT_RANGES[] PROGMEM = {255, 170, 127, 85, 64};
|
|||||||
|
|
||||||
## Lighting Layers
|
## Lighting Layers
|
||||||
|
|
||||||
?> **Note:** Lighting Layers is an RGB Light feature, it will not work for RGB Matrix. See [RGB Matrix Indicators](feature_rgb_matrix.md?indicators) for details on how to do so.
|
?> **Note:** Lighting Layers is an RGB Light feature, it will not work for RGB Matrix. See [RGB Matrix Indicators](feature_rgb_matrix.md#indicators) for details on how to do so.
|
||||||
|
|
||||||
By including `#define RGBLIGHT_LAYERS` in your `config.h` file you can enable lighting layers. These make
|
By including `#define RGBLIGHT_LAYERS` in your `config.h` file you can enable lighting layers. These make
|
||||||
it easy to use your underglow LEDs as status indicators to show which keyboard layer is currently active, or the state of caps lock, all without disrupting any animations. [Here's a video](https://youtu.be/uLGE1epbmdY) showing an example of what you can do.
|
it easy to use your underglow LEDs as status indicators to show which keyboard layer is currently active, or the state of caps lock, all without disrupting any animations. [Here's a video](https://youtu.be/uLGE1epbmdY) showing an example of what you can do.
|
||||||
@ -322,6 +326,8 @@ void post_process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|||||||
```
|
```
|
||||||
would turn the layer 0 (or 1) on and off again three times when `DEBUG` is pressed.
|
would turn the layer 0 (or 1) on and off again three times when `DEBUG` is pressed.
|
||||||
|
|
||||||
|
!> Lighting layers on split keyboards will require layer state synced to the slave half (e.g. `#define SPLIT_LAYER_STATE_ENABLE`). See [data sync options](feature_split_keyboard.md#data-sync-options) for more details.
|
||||||
|
|
||||||
### Overriding RGB Lighting on/off status
|
### Overriding RGB Lighting on/off status
|
||||||
|
|
||||||
Normally lighting layers are not shown when RGB Lighting is disabled (e.g. with `RGB_TOG` keycode). If you would like lighting layers to work even when the RGB Lighting is otherwise off, add `#define RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF` to your `config.h`.
|
Normally lighting layers are not shown when RGB Lighting is disabled (e.g. with `RGB_TOG` keycode). If you would like lighting layers to work even when the RGB Lighting is otherwise off, add `#define RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF` to your `config.h`.
|
||||||
@ -344,7 +350,7 @@ If you need to change your RGB lighting in code, for example in a macro to chang
|
|||||||
### Low level Functions
|
### Low level Functions
|
||||||
|Function |Description |
|
|Function |Description |
|
||||||
|--------------------------------------------|-------------------------------------------|
|
|--------------------------------------------|-------------------------------------------|
|
||||||
|`rgblight_set()` |Flash out led buffers to LEDs |
|
|`rgblight_set()` |Flush out led buffers to LEDs |
|
||||||
|`rgblight_set_clipping_range(pos, num)` |Set clipping Range. see [Clipping Range](#clipping-range) |
|
|`rgblight_set_clipping_range(pos, num)` |Set clipping Range. see [Clipping Range](#clipping-range) |
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
@ -130,14 +130,17 @@ To enable this method, add the following to your `config.h` file:
|
|||||||
#define EE_HANDS
|
#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:
|
Next, you will have to flash the EEPROM files once for the correct hand to the controller on each halve. You can do this manually with the following bootloader targets while flashing the firmware:
|
||||||
|
|
||||||
* `:avrdude-split-left`
|
* AVR controllers with the Caterina bootloader (e.g. Pro Micro):
|
||||||
* `:avrdude-split-right`
|
* `:avrdude-split-left`
|
||||||
* `:dfu-split-left`
|
* `:avrdude-split-right`
|
||||||
* `:dfu-split-right`
|
* AVR controllers with the stock Amtel DFU or DFU compatible bootloader (e.g. Elite-C):
|
||||||
* `:dfu-util-split-left`
|
* `:dfu-split-left`
|
||||||
* `:dfu-util-split-right`
|
* `:dfu-split-right`
|
||||||
|
* ARM controllers with a DFU compatible bootloader (e.g. Proton-C):
|
||||||
|
* `:dfu-util-split-left`
|
||||||
|
* `:dfu-util-split-right`
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
@ -145,6 +148,10 @@ Example:
|
|||||||
make crkbd:default:avrdude-split-left
|
make crkbd:default:avrdude-split-left
|
||||||
```
|
```
|
||||||
|
|
||||||
|
?> ARM controllers using `dfu-util` will require an EEPROM reset after setting handedness. This can be done using the `EEP_RST` keycode or [Bootmagic Lite](feature_bootmagic.md). Controllers using emulated EEPROM will always require handedness parameter when flashing the firmware.
|
||||||
|
|
||||||
|
?> [QMK Toolbox]() can also be used to flash EEPROM handedness files. Place the controller in bootloader mode and select menu option Tools -> EEPROM -> Set Left/Right Hand
|
||||||
|
|
||||||
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.
|
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).
|
You can find the `EEPROM` files in the QMK firmware repo, [here](https://github.com/qmk/qmk_firmware/tree/master/quantum/split_common).
|
||||||
@ -266,6 +273,14 @@ This enables transmitting the current OLED on/off status to the slave side of th
|
|||||||
|
|
||||||
This enables transmitting the current ST7565 on/off status to the slave side of the split keyboard. The purpose of this feature is to support state (on/off state only) syncing.
|
This enables transmitting the current ST7565 on/off status to the slave side of the split keyboard. The purpose of this feature is to support state (on/off state only) syncing.
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define SPLIT_POINTING_ENABLE
|
||||||
|
```
|
||||||
|
|
||||||
|
This enables transmitting the pointing device status to the master side of the split keyboard. The purpose of this feature is to enable use pointing devices on the slave side.
|
||||||
|
|
||||||
|
!> There is additional required configuration for `SPLIT_POINTING_ENABLE` outlined in the [pointing device documentation](feature_pointing_device.md?id=split-keyboard-configuration).
|
||||||
|
|
||||||
### Custom data sync between sides :id=custom-data-sync
|
### Custom data sync between sides :id=custom-data-sync
|
||||||
|
|
||||||
QMK's split transport allows for arbitrary data transactions at both the keyboard and user levels. This is modelled on a remote procedure call, with the master invoking a function on the slave side, with the ability to send data from master to slave, process it slave side, and send data back from slave to master.
|
QMK's split transport allows for arbitrary data transactions at both the keyboard and user levels. This is modelled on a remote procedure call, with the master invoking a function on the slave side, with the ability to send data from master to slave, process it slave side, and send data back from slave to master.
|
||||||
|
@ -10,7 +10,7 @@ With this feature one can specify keys that behave differently, based on the amo
|
|||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
Optionally, you might want to set a custom `TAPPING_TERM` time by adding something like this in you `config.h`:
|
Optionally, you might want to set a custom `TAPPING_TERM` time by adding something like this in your `config.h` file:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
#define TAPPING_TERM 175
|
#define TAPPING_TERM 175
|
||||||
@ -243,7 +243,7 @@ Now, at the bottom of your `keymap.c` file, you'll need to add the following:
|
|||||||
*
|
*
|
||||||
* How to figure out tap dance state: interrupted and pressed.
|
* How to figure out tap dance state: interrupted and pressed.
|
||||||
*
|
*
|
||||||
* Interrupted: If the state of a dance dance is "interrupted", that means that another key has been hit
|
* Interrupted: If the state of a dance is "interrupted", that means that another key has been hit
|
||||||
* under the tapping term. This is typically indicitive that you are trying to "tap" the key.
|
* under the tapping term. This is typically indicitive that you are trying to "tap" the key.
|
||||||
*
|
*
|
||||||
* Pressed: Whether or not the key is still being pressed. If this value is true, that means the tapping term
|
* Pressed: Whether or not the key is still being pressed. If this value is true, that means the tapping term
|
||||||
|
@ -16,7 +16,7 @@ For split keyboards using soft serial, the computed WPM score will be available
|
|||||||
| `WPM_ALLOW_COUNT_REGRESSION` | _Not defined_ | If defined allows the WPM to be decreased when hitting Delete or Backspace |
|
| `WPM_ALLOW_COUNT_REGRESSION` | _Not defined_ | If defined allows the WPM to be decreased when hitting Delete or Backspace |
|
||||||
| `WPM_UNFILTERED` | _Not defined_ | If undefined (the default), WPM values will be smoothed to avoid sudden changes in value |
|
| `WPM_UNFILTERED` | _Not defined_ | If undefined (the default), WPM values will be smoothed to avoid sudden changes in value |
|
||||||
| `WPM_SAMPLE_SECONDS` | `5` | This defines how many seconds of typing to average, when calculating WPM |
|
| `WPM_SAMPLE_SECONDS` | `5` | This defines how many seconds of typing to average, when calculating WPM |
|
||||||
| `WPM_SAMPLE_PERIODS` | `50` | This defines how many sampling periods to use when calculating WPM |
|
| `WPM_SAMPLE_PERIODS` | `25` | This defines how many sampling periods to use when calculating WPM |
|
||||||
| `WPM_LAUNCH_CONTROL` | _Not defined_ | If defined, WPM values will be calculated using partial buffers when typing begins |
|
| `WPM_LAUNCH_CONTROL` | _Not defined_ | If defined, WPM values will be calculated using partial buffers when typing begins |
|
||||||
|
|
||||||
'WPM_UNFILTERED' is potentially useful if you're filtering data in some other way (and also because it reduces the code required for the WPM feature), or if reducing measurement latency to a minimum is important for you.
|
'WPM_UNFILTERED' is potentially useful if you're filtering data in some other way (and also because it reduces the code required for the WPM feature), or if reducing measurement latency to a minimum is important for you.
|
||||||
|
24
docs/flash_driver.md
Normal file
24
docs/flash_driver.md
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
# FLASH Driver Configuration :id=flash-driver-configuration
|
||||||
|
|
||||||
|
The FLASH driver can be swapped out depending on the needs of the keyboard, or whether extra hardware is present.
|
||||||
|
|
||||||
|
Driver | Description
|
||||||
|
-----------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
`FLASH_DRIVER = spi` | Supports writing to almost all NOR Flash chips. See the driver section below.
|
||||||
|
|
||||||
|
|
||||||
|
## SPI FLASH Driver Configuration :id=spi-flash-driver-configuration
|
||||||
|
|
||||||
|
Currently QMK supports almost all NOR Flash chips over SPI. As such, requires a working spi_master driver configuration. You can override the driver configuration via your config.h:
|
||||||
|
|
||||||
|
`config.h` override | Description | Default Value
|
||||||
|
-----------------------------------------------|--------------------------------------------------------------------------------------|-----------------
|
||||||
|
`#define EXTERNAL_FLASH_SPI_SLAVE_SELECT_PIN` | SPI Slave select pin in order to inform that the FLASH is currently being addressed | _none_
|
||||||
|
`#define EXTERNAL_FLASH_SPI_CLOCK_DIVISOR` | Clock divisor used to divide the peripheral clock to derive the SPI frequency | `8`
|
||||||
|
`#define EXTERNAL_FLASH_PAGE_SIZE` | The Page size of the FLASH in bytes, as specified in the datasheet | `256`
|
||||||
|
`#define EXTERNAL_FLASH_SECTOR_SIZE` | The sector size of the FLASH in bytes, as specified in the datasheet | `(4 * 1024)`
|
||||||
|
`#define EXTERNAL_FLASH_BLOCK_SIZE` | The block size of the FLASH in bytes, as specified in the datasheet | `(64 * 1024)`
|
||||||
|
`#define EXTERNAL_FLASH_SIZE` | The total size of the FLASH in bytes, as specified in the datasheet | `(512 * 1024)`
|
||||||
|
`#define EXTERNAL_FLASH_ADDRESS_SIZE` | The Flash address size in bytes, as specified in datasheet | `3`
|
||||||
|
|
||||||
|
!> All the above default configurations are based on MX25L4006E NOR Flash.
|
@ -25,6 +25,11 @@ Compatible flashers:
|
|||||||
|
|
||||||
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI)
|
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI)
|
||||||
* [dfu-programmer](https://github.com/dfu-programmer/dfu-programmer) / `:dfu` target in QMK (recommended command line)
|
* [dfu-programmer](https://github.com/dfu-programmer/dfu-programmer) / `:dfu` target in QMK (recommended command line)
|
||||||
|
```
|
||||||
|
dfu-programmer <mcu> erase --force
|
||||||
|
dfu-programmer <mcu> flash --force <filename>
|
||||||
|
dfu-programmer <mcu> reset
|
||||||
|
```
|
||||||
|
|
||||||
Flashing sequence:
|
Flashing sequence:
|
||||||
|
|
||||||
@ -73,8 +78,11 @@ BOOTLOADER = caterina
|
|||||||
Compatible flashers:
|
Compatible flashers:
|
||||||
|
|
||||||
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI)
|
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI)
|
||||||
* [avrdude](https://www.nongnu.org/avrdude/) with the `avr109` programmer / `:avrdude` target in QMK (recommended command line)
|
|
||||||
* [AVRDUDESS](https://github.com/zkemble/AVRDUDESS)
|
* [AVRDUDESS](https://github.com/zkemble/AVRDUDESS)
|
||||||
|
* [avrdude](https://www.nongnu.org/avrdude/) with the `avr109` programmer / `:avrdude` target in QMK (recommended command line)
|
||||||
|
```
|
||||||
|
avrdude -p <mcu> -c avr109 -P <serialport> -U flash:w:<filename>:i
|
||||||
|
```
|
||||||
|
|
||||||
Flashing sequence:
|
Flashing sequence:
|
||||||
|
|
||||||
@ -106,8 +114,11 @@ BOOTLOADER = halfkay
|
|||||||
Compatible flashers:
|
Compatible flashers:
|
||||||
|
|
||||||
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI)
|
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI)
|
||||||
* [Teensy Loader Command Line](https://www.pjrc.com/teensy/loader_cli.html) / `:teensy` target in QMK (recommended command line)
|
|
||||||
* [Teensy Loader](https://www.pjrc.com/teensy/loader.html)
|
* [Teensy Loader](https://www.pjrc.com/teensy/loader.html)
|
||||||
|
* [Teensy Loader Command Line](https://www.pjrc.com/teensy/loader_cli.html) / `:teensy` target in QMK (recommended command line)
|
||||||
|
```
|
||||||
|
teensy_loader_cli -v -mmcu=<mcu> <filename>
|
||||||
|
```
|
||||||
|
|
||||||
Flashing sequence:
|
Flashing sequence:
|
||||||
|
|
||||||
@ -133,8 +144,11 @@ BOOTLOADER = usbasploader
|
|||||||
Compatible flashers:
|
Compatible flashers:
|
||||||
|
|
||||||
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI)
|
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI)
|
||||||
* [avrdude](https://www.nongnu.org/avrdude/) with the `usbasp` programmer / `:usbasp` target in QMK (recommended command line)
|
|
||||||
* [AVRDUDESS](https://github.com/zkemble/AVRDUDESS)
|
* [AVRDUDESS](https://github.com/zkemble/AVRDUDESS)
|
||||||
|
* [avrdude](https://www.nongnu.org/avrdude/) with the `usbasp` programmer / `:usbasp` target in QMK (recommended command line)
|
||||||
|
```
|
||||||
|
avrdude -p <mcu> -c usbasp -U flash:w:<filename>:i
|
||||||
|
```
|
||||||
|
|
||||||
Flashing sequence:
|
Flashing sequence:
|
||||||
|
|
||||||
@ -159,8 +173,11 @@ BOOTLOADER = bootloadhid
|
|||||||
Compatible flashers:
|
Compatible flashers:
|
||||||
|
|
||||||
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI)
|
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI)
|
||||||
* [bootloadHID CLI](https://www.obdev.at/products/vusb/bootloadhid.html) / `:bootloadhid` target in QMK (recommended command line)
|
|
||||||
* [HIDBootFlash](http://vusb.wikidot.com/project:hidbootflash)
|
* [HIDBootFlash](http://vusb.wikidot.com/project:hidbootflash)
|
||||||
|
* [bootloadHID CLI](https://www.obdev.at/products/vusb/bootloadhid.html) / `:bootloadhid` target in QMK (recommended command line)
|
||||||
|
```
|
||||||
|
bootloadHID -r <filename>
|
||||||
|
```
|
||||||
|
|
||||||
Flashing sequence:
|
Flashing sequence:
|
||||||
|
|
||||||
@ -232,6 +249,9 @@ Compatible flashers:
|
|||||||
|
|
||||||
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI)
|
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI)
|
||||||
* [dfu-util](https://dfu-util.sourceforge.net/) / `:dfu-util` target in QMK (recommended command line)
|
* [dfu-util](https://dfu-util.sourceforge.net/) / `:dfu-util` target in QMK (recommended command line)
|
||||||
|
```
|
||||||
|
dfu-util -a 0 -d 0483:DF11 -s 0x8000000:leave -D <filename>
|
||||||
|
```
|
||||||
|
|
||||||
Flashing sequence:
|
Flashing sequence:
|
||||||
|
|
||||||
@ -265,6 +285,9 @@ Compatible flashers:
|
|||||||
|
|
||||||
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI)
|
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI)
|
||||||
* [dfu-util](https://dfu-util.sourceforge.net/) / `:dfu-util` target in QMK (recommended command line)
|
* [dfu-util](https://dfu-util.sourceforge.net/) / `:dfu-util` target in QMK (recommended command line)
|
||||||
|
```
|
||||||
|
dfu-util -a 2 -d 1EAF:0003 -D <filename>
|
||||||
|
```
|
||||||
|
|
||||||
Flashing sequence:
|
Flashing sequence:
|
||||||
|
|
||||||
@ -286,6 +309,9 @@ Compatible flashers:
|
|||||||
|
|
||||||
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI)
|
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI)
|
||||||
* [dfu-util](https://dfu-util.sourceforge.net/) / `:dfu-util` target in QMK (recommended command line)
|
* [dfu-util](https://dfu-util.sourceforge.net/) / `:dfu-util` target in QMK (recommended command line)
|
||||||
|
```
|
||||||
|
dfu-util -a 0 -d 1C11:B007 -D <filename>
|
||||||
|
```
|
||||||
|
|
||||||
Flashing sequence:
|
Flashing sequence:
|
||||||
|
|
||||||
|
@ -1,52 +0,0 @@
|
|||||||
# 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
|
|
@ -1,31 +0,0 @@
|
|||||||
# Quantum Mechanical Keyboard Firmware
|
|
||||||
|
|
||||||
[![Version courante](https://img.shields.io/github/tag/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/tags)
|
|
||||||
[![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](https://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](https://olkb.com), le clavier [ErgoDox EZ](https://www.ergodox-ez.com), et pour les [produits Clueboard](https://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](fr-fr/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](fr-fr/features.md) à explorer, et [une documentation](https://docs.qmk.fm) très abondante que vous pourrez parcourir. La plupart des fonctionnalités vous permettrons de modifier vos [dispositions](fr-fr/keymap.md) (keymaps) et de changer [les codes de caractères](fr-fr/keycodes.md) (keycodes).
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user