@ -0,0 +1,18 @@ | |||
name: Automatic Approve | |||
on: | |||
schedule: | |||
- cron: "*/5 * * * *" | |||
jobs: | |||
automatic_approve: | |||
runs-on: ubuntu-latest | |||
if: github.repository == 'qmk/qmk_firmware' | |||
steps: | |||
- uses: mheap/automatic-approve-action@v1 | |||
with: | |||
token: ${{ secrets.QMK_BOT_TOKEN }} | |||
workflows: "format.yml,lint.yml,unit_test.yml" | |||
dangerous_files: "lib/python/,Makefile,paths.mk,builddefs/" |
@ -0,0 +1,35 @@ | |||
name: Update feature branches after develop merge | |||
on: | |||
push: | |||
branches: | |||
- develop | |||
jobs: | |||
feature_branch_update: | |||
runs-on: ubuntu-latest | |||
if: github.repository == 'qmk/qmk_firmware' | |||
strategy: | |||
matrix: | |||
branch: | |||
- xap | |||
steps: | |||
- uses: actions/checkout@v2 | |||
with: | |||
token: ${{ secrets.QMK_BOT_TOKEN }} | |||
fetch-depth: 0 | |||
- name: Checkout branch | |||
run: | | |||
git fetch origin develop ${{ matrix.branch }} | |||
git checkout ${{ matrix.branch }} | |||
- name: Update branch from develop | |||
run: | | |||
git config --global user.name "QMK Bot" | |||
git config --global user.email "hello@qmk.fm" | |||
git merge origin/develop | |||
git push origin ${{ matrix.branch }} |
@ -1,51 +0,0 @@ | |||
name: PR Lint Format | |||
on: | |||
pull_request: | |||
paths: | |||
- 'drivers/**' | |||
- 'lib/arm_atsam/**' | |||
- 'lib/lib8tion/**' | |||
- 'lib/python/**' | |||
- 'platforms/**' | |||
- 'quantum/**' | |||
- 'tests/**' | |||
- 'tmk_core/**' | |||
jobs: | |||
lint: | |||
runs-on: ubuntu-latest | |||
container: qmkfm/qmk_cli | |||
steps: | |||
- name: Install dependencies | |||
run: | | |||
apt-get update && apt-get install -y dos2unix | |||
- uses: actions/checkout@v2 | |||
with: | |||
fetch-depth: 0 | |||
- uses: trilom/file-changes-action@v1.2.4 | |||
id: file_changes | |||
with: | |||
output: ' ' | |||
fileOutput: ' ' | |||
- name: Run qmk formatters | |||
shell: 'bash {0}' | |||
run: | | |||
cat ~/files_added.txt ~/files_modified.txt > ~/files_changed.txt | |||
qmk format-c --core-only $(< ~/files_changed.txt) || true | |||
qmk format-python $(< ~/files_changed.txt) || true | |||
qmk format-text $(< ~/files_changed.txt) || true | |||
- name: Fail when formatting required | |||
run: | | |||
git diff | |||
for file in $(git diff --name-only); do | |||
echo "File '${file}' Requires Formatting" | |||
echo "::error file=${file}::Requires Formatting" | |||
done | |||
test -z "$(git diff --name-only)" |
@ -0,0 +1,51 @@ | |||
name: PR Lint Format | |||
on: | |||
pull_request: | |||
paths: | |||
- 'drivers/**' | |||
- 'lib/arm_atsam/**' | |||
- 'lib/lib8tion/**' | |||
- 'lib/python/**' | |||
- 'platforms/**' | |||
- 'quantum/**' | |||
- 'tests/**' | |||
- 'tmk_core/**' | |||
jobs: | |||
lint: | |||
runs-on: ubuntu-latest | |||
container: qmkfm/qmk_cli | |||
steps: | |||
- uses: actions/checkout@v2 | |||
with: | |||
fetch-depth: 0 | |||
- name: Install dependencies | |||
run: | | |||
pip3 install -r requirements-dev.txt | |||
- uses: trilom/file-changes-action@v1.2.4 | |||
id: file_changes | |||
with: | |||
output: ' ' | |||
fileOutput: ' ' | |||
- name: Run qmk formatters | |||
shell: 'bash {0}' | |||
run: | | |||
cat ~/files_added.txt ~/files_modified.txt > ~/files_changed.txt | |||
qmk format-c --core-only $(< ~/files_changed.txt) || true | |||
qmk format-python $(< ~/files_changed.txt) || true | |||
qmk format-text $(< ~/files_changed.txt) || true | |||
- name: Fail when formatting required | |||
run: | | |||
git diff | |||
for file in $(git diff --name-only); do | |||
echo "File '${file}' Requires Formatting" | |||
echo "::error file=${file}::Requires Formatting" | |||
done | |||
test -z "$(git diff --name-only)" |
@ -1,49 +0,0 @@ | |||
name: Lint Format | |||
on: | |||
push: | |||
branches: | |||
- master | |||
- develop | |||
jobs: | |||
lint: | |||
runs-on: ubuntu-latest | |||
container: qmkfm/qmk_cli | |||
steps: | |||
- name: Install dependencies | |||
run: | | |||
apt-get update && apt-get install -y dos2unix | |||
- uses: actions/checkout@v2 | |||
with: | |||
fetch-depth: 0 | |||
- name: Run qmk formatters | |||
shell: 'bash {0}' | |||
run: | | |||
qmk format-c -a | |||
qmk format-python -a | |||
qmk format-text -a | |||
git diff | |||
- uses: rlespinasse/github-slug-action@v3.x | |||
- name: Become QMK Bot | |||
run: | | |||
git config user.name 'QMK Bot' | |||
git config user.email 'hello@qmk.fm' | |||
- name: Create Pull Request | |||
uses: peter-evans/create-pull-request@v3 | |||
if: ${{ github.repository == 'qmk/qmk_firmware'}} | |||
with: | |||
token: ${{ secrets.QMK_BOT_TOKEN }} | |||
delete-branch: true | |||
branch: bugfix/format_${{ env.GITHUB_REF_SLUG }} | |||
author: QMK Bot <hello@qmk.fm> | |||
committer: QMK Bot <hello@qmk.fm> | |||
commit-message: Format code according to conventions | |||
title: '[CI] Format code according to conventions' |
@ -0,0 +1,49 @@ | |||
name: Lint Format | |||
on: | |||
push: | |||
branches: | |||
- master | |||
- develop | |||
jobs: | |||
lint: | |||
runs-on: ubuntu-latest | |||
container: qmkfm/qmk_cli | |||
steps: | |||
- uses: actions/checkout@v2 | |||
with: | |||
fetch-depth: 0 | |||
- name: Install dependencies | |||
run: | | |||
pip3 install -r requirements-dev.txt | |||
- name: Run qmk formatters | |||
shell: 'bash {0}' | |||
run: | | |||
qmk format-c -a | |||
qmk format-python -a | |||
qmk format-text -a | |||
git diff | |||
- uses: rlespinasse/github-slug-action@v3.x | |||
- name: Become QMK Bot | |||
run: | | |||
git config user.name 'QMK Bot' | |||
git config user.email 'hello@qmk.fm' | |||
- name: Create Pull Request | |||
uses: peter-evans/create-pull-request@v3 | |||
if: ${{ github.repository == 'qmk/qmk_firmware'}} | |||
with: | |||
token: ${{ secrets.QMK_BOT_TOKEN }} | |||
delete-branch: true | |||
branch: bugfix/format_${{ env.GITHUB_REF_SLUG }} | |||
author: QMK Bot <hello@qmk.fm> | |||
committer: QMK Bot <hello@qmk.fm> | |||
commit-message: Format code according to conventions | |||
title: '[CI] Format code according to conventions' |
@ -1 +0,0 @@ | |||
theme: jekyll-theme-cayman |
@ -1,36 +0,0 @@ | |||
# Copyright 2017 Fred Sundvik | |||
# | |||
# This program is free software: you can redistribute it and/or modify | |||
# it under the terms of the GNU General Public License as published by | |||
# the Free Software Foundation, either version 2 of the License, or | |||
# (at your option) any later version. | |||
# | |||
# This program is distributed in the hope that it will be useful, | |||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
# GNU General Public License for more details. | |||
# | |||
# You should have received a copy of the GNU General Public License | |||
# along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
$(TEST)_INC := \ | |||
tests\test_common\common_config.h | |||
$(TEST)_SRC := \ | |||
$(TMK_COMMON_SRC) \ | |||
$(QUANTUM_SRC) \ | |||
$(SRC) \ | |||
tests/test_common/keymap.c \ | |||
tests/test_common/matrix.c \ | |||
tests/test_common/test_driver.cpp \ | |||
tests/test_common/keyboard_report_util.cpp \ | |||
tests/test_common/test_fixture.cpp \ | |||
tests/test_common/test_keymap_key.cpp \ | |||
tests/test_common/test_logger.cpp \ | |||
$(patsubst $(ROOTDIR)/%,%,$(wildcard $(TEST_PATH)/*.cpp)) | |||
$(TEST)_DEFS := $(TMK_COMMON_DEFS) $(OPT_DEFS) | |||
$(TEST)_CONFIG := $(TEST_PATH)/config.h | |||
VPATH += $(TOP_DIR)/tests/test_common |
@ -1,470 +0,0 @@ | |||
# Determine what keyboard we are building and setup the build environment. | |||
# | |||
# We support folders up to 5 levels deep below `keyboards/`. This file is | |||
# responsible for determining which folder is being used and doing the | |||
# corresponding environment setup. | |||
ifndef VERBOSE | |||
.SILENT: | |||
endif | |||
.DEFAULT_GOAL := all | |||
include paths.mk | |||
include $(BUILDDEFS_PATH)/message.mk | |||
# Set the qmk cli to use | |||
QMK_BIN ?= qmk | |||
# Set the filename for the final firmware binary | |||
KEYBOARD_FILESAFE := $(subst /,_,$(KEYBOARD)) | |||
TARGET ?= $(KEYBOARD_FILESAFE)_$(KEYMAP) | |||
KEYBOARD_OUTPUT := $(BUILD_DIR)/obj_$(KEYBOARD_FILESAFE) | |||
# Force expansion | |||
TARGET := $(TARGET) | |||
ifneq ($(FORCE_LAYOUT),) | |||
TARGET := $(TARGET)_$(FORCE_LAYOUT) | |||
endif | |||
# Object files and generated keymap directory | |||
# To put object files in current directory, use a dot (.), do NOT make | |||
# this an empty or blank macro! | |||
KEYMAP_OUTPUT := $(BUILD_DIR)/obj_$(TARGET) | |||
ifdef SKIP_VERSION | |||
OPT_DEFS += -DSKIP_VERSION | |||
endif | |||
# Generate the version.h file | |||
ifdef SKIP_VERSION | |||
VERSION_H_FLAGS := --skip-all | |||
endif | |||
ifdef SKIP_GIT | |||
VERSION_H_FLAGS := --skip-git | |||
endif | |||
# Determine which subfolders exist. | |||
KEYBOARD_FOLDER_PATH_1 := $(KEYBOARD) | |||
KEYBOARD_FOLDER_PATH_2 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_1))) | |||
KEYBOARD_FOLDER_PATH_3 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_2))) | |||
KEYBOARD_FOLDER_PATH_4 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_3))) | |||
KEYBOARD_FOLDER_PATH_5 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_4))) | |||
KEYBOARD_FOLDER_1 := $(notdir $(KEYBOARD_FOLDER_PATH_1)) | |||
KEYBOARD_FOLDER_2 := $(notdir $(KEYBOARD_FOLDER_PATH_2)) | |||
KEYBOARD_FOLDER_3 := $(notdir $(KEYBOARD_FOLDER_PATH_3)) | |||
KEYBOARD_FOLDER_4 := $(notdir $(KEYBOARD_FOLDER_PATH_4)) | |||
KEYBOARD_FOLDER_5 := $(notdir $(KEYBOARD_FOLDER_PATH_5)) | |||
KEYBOARD_PATHS := | |||
KEYBOARD_PATH_1 := keyboards/$(KEYBOARD_FOLDER_PATH_1) | |||
KEYBOARD_PATH_2 := keyboards/$(KEYBOARD_FOLDER_PATH_2) | |||
KEYBOARD_PATH_3 := keyboards/$(KEYBOARD_FOLDER_PATH_3) | |||
KEYBOARD_PATH_4 := keyboards/$(KEYBOARD_FOLDER_PATH_4) | |||
KEYBOARD_PATH_5 := keyboards/$(KEYBOARD_FOLDER_PATH_5) | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/)","") | |||
KEYBOARD_PATHS += $(KEYBOARD_PATH_5) | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/)","") | |||
KEYBOARD_PATHS += $(KEYBOARD_PATH_4) | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/)","") | |||
KEYBOARD_PATHS += $(KEYBOARD_PATH_3) | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/)","") | |||
KEYBOARD_PATHS += $(KEYBOARD_PATH_2) | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/)","") | |||
KEYBOARD_PATHS += $(KEYBOARD_PATH_1) | |||
endif | |||
# Pull in rules.mk files from all our subfolders | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/rules.mk)","") | |||
include $(KEYBOARD_PATH_5)/rules.mk | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/rules.mk)","") | |||
include $(KEYBOARD_PATH_4)/rules.mk | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/rules.mk)","") | |||
include $(KEYBOARD_PATH_3)/rules.mk | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/rules.mk)","") | |||
include $(KEYBOARD_PATH_2)/rules.mk | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/rules.mk)","") | |||
include $(KEYBOARD_PATH_1)/rules.mk | |||
endif | |||
MAIN_KEYMAP_PATH_1 := $(KEYBOARD_PATH_1)/keymaps/$(KEYMAP) | |||
MAIN_KEYMAP_PATH_2 := $(KEYBOARD_PATH_2)/keymaps/$(KEYMAP) | |||
MAIN_KEYMAP_PATH_3 := $(KEYBOARD_PATH_3)/keymaps/$(KEYMAP) | |||
MAIN_KEYMAP_PATH_4 := $(KEYBOARD_PATH_4)/keymaps/$(KEYMAP) | |||
MAIN_KEYMAP_PATH_5 := $(KEYBOARD_PATH_5)/keymaps/$(KEYMAP) | |||
# Pull in rules from info.json | |||
INFO_RULES_MK = $(shell $(QMK_BIN) generate-rules-mk --quiet --escape --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/info_rules.mk) | |||
include $(INFO_RULES_MK) | |||
# Check for keymap.json first, so we can regenerate keymap.c | |||
include build_json.mk | |||
# Pull in keymap level rules.mk | |||
ifeq ("$(wildcard $(KEYMAP_PATH))", "") | |||
# Look through the possible keymap folders until we find a matching keymap.c | |||
ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_5)/keymap.c)","") | |||
-include $(MAIN_KEYMAP_PATH_5)/rules.mk | |||
KEYMAP_C := $(MAIN_KEYMAP_PATH_5)/keymap.c | |||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_5) | |||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_4)/keymap.c)","") | |||
-include $(MAIN_KEYMAP_PATH_4)/rules.mk | |||
KEYMAP_C := $(MAIN_KEYMAP_PATH_4)/keymap.c | |||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_4) | |||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_3)/keymap.c)","") | |||
-include $(MAIN_KEYMAP_PATH_3)/rules.mk | |||
KEYMAP_C := $(MAIN_KEYMAP_PATH_3)/keymap.c | |||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_3) | |||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_2)/keymap.c)","") | |||
-include $(MAIN_KEYMAP_PATH_2)/rules.mk | |||
KEYMAP_C := $(MAIN_KEYMAP_PATH_2)/keymap.c | |||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_2) | |||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_1)/keymap.c)","") | |||
-include $(MAIN_KEYMAP_PATH_1)/rules.mk | |||
KEYMAP_C := $(MAIN_KEYMAP_PATH_1)/keymap.c | |||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_1) | |||
else ifneq ($(LAYOUTS),) | |||
# If we haven't found a keymap yet fall back to community layouts | |||
include build_layout.mk | |||
else | |||
$(error Could not find keymap) | |||
# this state should never be reached | |||
endif | |||
endif | |||
# Have we found a keymap.json? | |||
ifneq ("$(wildcard $(KEYMAP_JSON))", "") | |||
KEYMAP_C := $(KEYMAP_OUTPUT)/src/keymap.c | |||
KEYMAP_H := $(KEYMAP_OUTPUT)/src/config.h | |||
# Load the keymap-level rules.mk if exists | |||
-include $(KEYMAP_PATH)/rules.mk | |||
# Load any rules.mk content from keymap.json | |||
INFO_RULES_MK = $(shell $(QMK_BIN) generate-rules-mk --quiet --escape --keyboard $(KEYBOARD) --keymap $(KEYMAP) --output $(KEYMAP_OUTPUT)/src/rules.mk) | |||
include $(INFO_RULES_MK) | |||
# Add rules to generate the keymap files - indentation here is important | |||
$(KEYMAP_OUTPUT)/src/keymap.c: $(KEYMAP_JSON) | |||
$(QMK_BIN) json2c --quiet --output $(KEYMAP_C) $(KEYMAP_JSON) | |||
$(KEYMAP_OUTPUT)/src/config.h: $(KEYMAP_JSON) | |||
$(QMK_BIN) generate-config-h --quiet --keyboard $(KEYBOARD) --keymap $(KEYMAP) --output $(KEYMAP_H) | |||
generated-files: $(KEYMAP_OUTPUT)/src/config.h $(KEYMAP_OUTPUT)/src/keymap.c | |||
endif | |||
generated-files: $(KEYMAP_OUTPUT)/src/version.h | |||
$(KEYMAP_OUTPUT)/src/version.h: | |||
[ -d $(KEYMAP_OUTPUT)/src ] || mkdir -p $(KEYMAP_OUTPUT)/src | |||
$(QMK_BIN) generate-version-h $(VERSION_H_FLAGS) -q -o $(KEYMAP_OUTPUT)/src/version.h | |||
ifeq ($(strip $(CTPC)), yes) | |||
CONVERT_TO_PROTON_C=yes | |||
endif | |||
ifeq ($(strip $(CONVERT_TO_PROTON_C)), yes) | |||
include platforms/chibios/boards/QMK_PROTON_C/convert_to_proton_c.mk | |||
endif | |||
include $(BUILDDEFS_PATH)/mcu_selection.mk | |||
# Find all the C source files to be compiled in subfolders. | |||
KEYBOARD_SRC := | |||
KEYBOARD_C_1 := $(KEYBOARD_PATH_1)/$(KEYBOARD_FOLDER_1).c | |||
KEYBOARD_C_2 := $(KEYBOARD_PATH_2)/$(KEYBOARD_FOLDER_2).c | |||
KEYBOARD_C_3 := $(KEYBOARD_PATH_3)/$(KEYBOARD_FOLDER_3).c | |||
KEYBOARD_C_4 := $(KEYBOARD_PATH_4)/$(KEYBOARD_FOLDER_4).c | |||
KEYBOARD_C_5 := $(KEYBOARD_PATH_5)/$(KEYBOARD_FOLDER_5).c | |||
ifneq ("$(wildcard $(KEYBOARD_C_5))","") | |||
KEYBOARD_SRC += $(KEYBOARD_C_5) | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_C_4))","") | |||
KEYBOARD_SRC += $(KEYBOARD_C_4) | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_C_3))","") | |||
KEYBOARD_SRC += $(KEYBOARD_C_3) | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_C_2))","") | |||
KEYBOARD_SRC += $(KEYBOARD_C_2) | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_C_1))","") | |||
KEYBOARD_SRC += $(KEYBOARD_C_1) | |||
endif | |||
# Generate KEYBOARD_name_subname for all levels of the keyboard folder | |||
KEYBOARD_FILESAFE_1 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_1))) | |||
KEYBOARD_FILESAFE_2 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_2))) | |||
KEYBOARD_FILESAFE_3 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_3))) | |||
KEYBOARD_FILESAFE_4 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_4))) | |||
KEYBOARD_FILESAFE_5 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_5))) | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/)","") | |||
OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_5) | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/)","") | |||
OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_4) | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/)","") | |||
OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_3) | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/)","") | |||
OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_2) | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/)","") | |||
OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_1) | |||
endif | |||
# Setup the define for QMK_KEYBOARD_H. This is used inside of keymaps so | |||
# that the same keymap may be used on multiple keyboards. | |||
# | |||
# We grab the most top-level include file that we can. That file should | |||
# use #ifdef statements to include all the neccesary subfolder includes, | |||
# as described here: | |||
# | |||
# https://docs.qmk.fm/#/feature_layouts?id=tips-for-making-layouts-keyboard-agnostic | |||
# | |||
QMK_KEYBOARD_H = $(KEYBOARD_OUTPUT)/src/default_keyboard.h | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/$(KEYBOARD_FOLDER_1).h)","") | |||
QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_1).h | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/$(KEYBOARD_FOLDER_2).h)","") | |||
QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_2).h | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/$(KEYBOARD_FOLDER_3).h)","") | |||
QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_3).h | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/$(KEYBOARD_FOLDER_4).h)","") | |||
QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_4).h | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/$(KEYBOARD_FOLDER_5).h)","") | |||
QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_5).h | |||
endif | |||
# Determine and set parameters based on the keyboard's processor family. | |||
# We can assume a ChibiOS target When MCU_FAMILY is defined since it's | |||
# not used for LUFA | |||
ifdef MCU_FAMILY | |||
PLATFORM=CHIBIOS | |||
PLATFORM_KEY=chibios | |||
FIRMWARE_FORMAT?=bin | |||
OPT_DEFS += -DMCU_$(MCU_FAMILY) | |||
else ifdef ARM_ATSAM | |||
PLATFORM=ARM_ATSAM | |||
PLATFORM_KEY=arm_atsam | |||
FIRMWARE_FORMAT=bin | |||
else | |||
PLATFORM=AVR | |||
PLATFORM_KEY=avr | |||
FIRMWARE_FORMAT?=hex | |||
endif | |||
# Find all of the config.h files and add them to our CONFIG_H define. | |||
CONFIG_H := | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/config.h)","") | |||
CONFIG_H += $(KEYBOARD_PATH_5)/config.h | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/config.h)","") | |||
CONFIG_H += $(KEYBOARD_PATH_4)/config.h | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/config.h)","") | |||
CONFIG_H += $(KEYBOARD_PATH_3)/config.h | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/config.h)","") | |||
CONFIG_H += $(KEYBOARD_PATH_2)/config.h | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/config.h)","") | |||
CONFIG_H += $(KEYBOARD_PATH_1)/config.h | |||
endif | |||
POST_CONFIG_H := | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/post_config.h)","") | |||
POST_CONFIG_H += $(KEYBOARD_PATH_1)/post_config.h | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/post_config.h)","") | |||
POST_CONFIG_H += $(KEYBOARD_PATH_2)/post_config.h | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/post_config.h)","") | |||
POST_CONFIG_H += $(KEYBOARD_PATH_3)/post_config.h | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/post_config.h)","") | |||
POST_CONFIG_H += $(KEYBOARD_PATH_4)/post_config.h | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/post_config.h)","") | |||
POST_CONFIG_H += $(KEYBOARD_PATH_5)/post_config.h | |||
endif | |||
# Pull in stuff from info.json | |||
INFO_JSON_FILES := | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/info.json)","") | |||
INFO_JSON_FILES += $(KEYBOARD_PATH_1)/info.json | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/info.json)","") | |||
INFO_JSON_FILES += $(KEYBOARD_PATH_2)/info.json | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/info.json)","") | |||
INFO_JSON_FILES += $(KEYBOARD_PATH_3)/info.json | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/info.json)","") | |||
INFO_JSON_FILES += $(KEYBOARD_PATH_4)/info.json | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/info.json)","") | |||
INFO_JSON_FILES += $(KEYBOARD_PATH_5)/info.json | |||
endif | |||
CONFIG_H += $(KEYBOARD_OUTPUT)/src/info_config.h $(KEYBOARD_OUTPUT)/src/layouts.h | |||
$(KEYBOARD_OUTPUT)/src/info_config.h: $(INFO_JSON_FILES) | |||
$(QMK_BIN) generate-config-h --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/info_config.h | |||
$(KEYBOARD_OUTPUT)/src/default_keyboard.h: $(INFO_JSON_FILES) | |||
$(QMK_BIN) generate-keyboard-h --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/default_keyboard.h | |||
$(KEYBOARD_OUTPUT)/src/layouts.h: $(INFO_JSON_FILES) | |||
$(QMK_BIN) generate-layouts --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/layouts.h | |||
generated-files: $(KEYBOARD_OUTPUT)/src/info_config.h $(KEYBOARD_OUTPUT)/src/default_keyboard.h $(KEYBOARD_OUTPUT)/src/layouts.h | |||
.INTERMEDIATE : generated-files | |||
# Userspace setup and definitions | |||
ifeq ("$(USER_NAME)","") | |||
USER_NAME := $(KEYMAP) | |||
endif | |||
USER_PATH := users/$(USER_NAME) | |||
# Pull in user level rules.mk | |||
-include $(USER_PATH)/rules.mk | |||
ifneq ("$(wildcard $(USER_PATH)/config.h)","") | |||
CONFIG_H += $(USER_PATH)/config.h | |||
endif | |||
ifneq ("$(wildcard $(USER_PATH)/post_config.h)","") | |||
POST_CONFIG_H += $(USER_PATH)/post_config.h | |||
endif | |||
# Disable features that a keyboard doesn't support | |||
-include $(BUILDDEFS_PATH)/disable_features.mk | |||
# Pull in post_rules.mk files from all our subfolders | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/post_rules.mk)","") | |||
include $(KEYBOARD_PATH_1)/post_rules.mk | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/post_rules.mk)","") | |||
include $(KEYBOARD_PATH_2)/post_rules.mk | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/post_rules.mk)","") | |||
include $(KEYBOARD_PATH_3)/post_rules.mk | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/post_rules.mk)","") | |||
include $(KEYBOARD_PATH_4)/post_rules.mk | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/post_rules.mk)","") | |||
include $(KEYBOARD_PATH_5)/post_rules.mk | |||
endif | |||
ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","") | |||
CONFIG_H += $(KEYMAP_PATH)/config.h | |||
endif | |||
ifneq ("$(KEYMAP_H)","") | |||
CONFIG_H += $(KEYMAP_H) | |||
endif | |||
# project specific files | |||
SRC += \ | |||
$(KEYBOARD_SRC) \ | |||
$(KEYMAP_C) \ | |||
$(QUANTUM_SRC) \ | |||
$(QUANTUM_DIR)/main.c \ | |||
# Optimize size but this may cause error "relocation truncated to fit" | |||
#EXTRALDFLAGS = -Wl,--relax | |||
# Search Path | |||
VPATH += $(KEYMAP_PATH) | |||
VPATH += $(USER_PATH) | |||
VPATH += $(KEYBOARD_PATHS) | |||
VPATH += $(COMMON_VPATH) | |||
VPATH += $(KEYMAP_OUTPUT)/src | |||
include common_features.mk | |||
include $(BUILDDEFS_PATH)/generic_features.mk | |||
include $(TMK_PATH)/protocol.mk | |||
include $(PLATFORM_PATH)/common.mk | |||
include $(BUILDDEFS_PATH)/bootloader.mk | |||
SRC += $(patsubst %.c,%.clib,$(LIB_SRC)) | |||
SRC += $(patsubst %.c,%.clib,$(QUANTUM_LIB_SRC)) | |||
SRC += $(TMK_COMMON_SRC) | |||
OPT_DEFS += $(TMK_COMMON_DEFS) | |||
EXTRALDFLAGS += $(TMK_COMMON_LDFLAGS) | |||
SKIP_COMPILE := no | |||
ifneq ($(REQUIRE_PLATFORM_KEY),) | |||
ifneq ($(REQUIRE_PLATFORM_KEY),$(PLATFORM_KEY)) | |||
SKIP_COMPILE := yes | |||
endif | |||
endif | |||
include $(PLATFORM_PATH)/$(PLATFORM_KEY)/platform.mk | |||
-include $(PLATFORM_PATH)/$(PLATFORM_KEY)/flash.mk | |||
ifneq ($(strip $(PROTOCOL)),) | |||
include $(TMK_PATH)/protocol/$(strip $(shell echo $(PROTOCOL) | tr '[:upper:]' '[:lower:]')).mk | |||
else | |||
include $(TMK_PATH)/protocol/$(PLATFORM_KEY).mk | |||
endif | |||
# TODO: remove this bodge? | |||
PROJECT_DEFS := $(OPT_DEFS) | |||
PROJECT_INC := $(VPATH) $(EXTRAINCDIRS) $(KEYBOARD_PATHS) | |||
PROJECT_CONFIG := $(CONFIG_H) | |||
CONFIG_H += $(POST_CONFIG_H) | |||
ALL_CONFIGS := $(PROJECT_CONFIG) $(CONFIG_H) | |||
OUTPUTS := $(KEYMAP_OUTPUT) $(KEYBOARD_OUTPUT) | |||
$(KEYMAP_OUTPUT)_SRC := $(SRC) | |||
$(KEYMAP_OUTPUT)_DEFS := $(OPT_DEFS) \ | |||
-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\" | |||
$(KEYMAP_OUTPUT)_INC := $(VPATH) $(EXTRAINCDIRS) | |||
$(KEYMAP_OUTPUT)_CONFIG := $(CONFIG_H) | |||
$(KEYBOARD_OUTPUT)_SRC := $(PLATFORM_SRC) | |||
$(KEYBOARD_OUTPUT)_DEFS := $(PROJECT_DEFS) | |||
$(KEYBOARD_OUTPUT)_INC := $(PROJECT_INC) | |||
$(KEYBOARD_OUTPUT)_CONFIG := $(PROJECT_CONFIG) | |||
# Default target. | |||
ifeq ($(SKIP_COMPILE),no) | |||
all: build check-size | |||
else | |||
all: | |||
echo "skipped" >&2 | |||
endif | |||
build: elf cpfirmware | |||
check-size: build | |||
check-md5: build | |||
objs-size: build | |||
include $(BUILDDEFS_PATH)/show_options.mk | |||
include $(TMK_PATH)/rules.mk | |||
# Ensure we have generated files available for each of the objects | |||
define GEN_FILES | |||
$1: generated-files | |||
endef | |||
$(foreach O,$(OBJ),$(eval $(call GEN_FILES,$(patsubst %.a,%.o,$(O))))) |
@ -1,32 +0,0 @@ | |||
LAYOUTS_PATH := layouts | |||
LAYOUTS_REPOS := $(patsubst %/,%,$(sort $(dir $(wildcard $(LAYOUTS_PATH)/*/)))) | |||
define SEARCH_LAYOUTS_REPO | |||
LAYOUT_KEYMAP_PATH := $$(LAYOUTS_REPO)/$$(LAYOUT)/$$(KEYMAP) | |||
LAYOUT_KEYMAP_JSON := $$(LAYOUT_KEYMAP_PATH)/keymap.json | |||
LAYOUT_KEYMAP_C := $$(LAYOUT_KEYMAP_PATH)/keymap.c | |||
ifneq ("$$(wildcard $$(LAYOUT_KEYMAP_JSON))","") | |||
-include $$(LAYOUT_KEYMAP_PATH)/rules.mk | |||
KEYMAP_JSON := $$(LAYOUT_KEYMAP_JSON) | |||
KEYMAP_PATH := $$(LAYOUT_KEYMAP_PATH) | |||
else ifneq ("$$(wildcard $$(LAYOUT_KEYMAP_C))","") | |||
-include $$(LAYOUT_KEYMAP_PATH)/rules.mk | |||
KEYMAP_C := $$(LAYOUT_KEYMAP_C) | |||
KEYMAP_PATH := $$(LAYOUT_KEYMAP_PATH) | |||
endif | |||
endef | |||
define SEARCH_LAYOUTS | |||
$$(foreach LAYOUTS_REPO,$$(LAYOUTS_REPOS),$$(eval $$(call SEARCH_LAYOUTS_REPO))) | |||
endef | |||
ifneq ($(FORCE_LAYOUT),) | |||
ifneq (,$(findstring $(FORCE_LAYOUT),$(LAYOUTS))) | |||
$(info Forcing layout: $(FORCE_LAYOUT)) | |||
LAYOUTS := $(FORCE_LAYOUT) | |||
else | |||
$(error Forced layout does not exist) | |||
endif | |||
endif | |||
$(foreach LAYOUT,$(LAYOUTS),$(eval $(call SEARCH_LAYOUTS))) |
@ -1,84 +0,0 @@ | |||
ifndef VERBOSE | |||
.SILENT: | |||
endif | |||
.DEFAULT_GOAL := all | |||
include paths.mk | |||
include $(BUILDDEFS_PATH)/message.mk | |||
TARGET=test/$(TEST) | |||
GTEST_OUTPUT = $(BUILD_DIR)/gtest | |||
TEST_OBJ = $(BUILD_DIR)/test_obj | |||
OUTPUTS := $(TEST_OBJ)/$(TEST) $(GTEST_OUTPUT) | |||
GTEST_INC := \ | |||
$(LIB_PATH)/googletest/googletest/include \ | |||
$(LIB_PATH)/googletest/googlemock/include | |||
GTEST_INTERNAL_INC := \ | |||
$(LIB_PATH)/googletest/googletest \ | |||
$(LIB_PATH)/googletest/googlemock | |||
$(GTEST_OUTPUT)_SRC := \ | |||
googletest/src/gtest-all.cc\ | |||
googlemock/src/gmock-all.cc | |||
$(GTEST_OUTPUT)_DEFS := | |||
$(GTEST_OUTPUT)_INC := $(GTEST_INC) $(GTEST_INTERNAL_INC) | |||
LDFLAGS += -lstdc++ -lpthread -shared-libgcc | |||
CREATE_MAP := no | |||
VPATH += \ | |||
$(LIB_PATH)/googletest \ | |||
$(LIB_PATH)/googlemock \ | |||
$(LIB_PATH)/printf | |||
all: elf | |||
VPATH += $(COMMON_VPATH) | |||
PLATFORM:=TEST | |||
PLATFORM_KEY:=test | |||
BOOTLOADER_TYPE:=none | |||
ifeq ($(strip $(DEBUG)), 1) | |||
CONSOLE_ENABLE = yes | |||
endif | |||
ifneq ($(filter $(FULL_TESTS),$(TEST)),) | |||
include tests/test_common/build.mk | |||
include $(TEST_PATH)/test.mk | |||
endif | |||
include common_features.mk | |||
include $(BUILDDEFS_PATH)/generic_features.mk | |||
include $(PLATFORM_PATH)/common.mk | |||
include $(TMK_PATH)/protocol.mk | |||
include $(QUANTUM_PATH)/debounce/tests/rules.mk | |||
include $(QUANTUM_PATH)/encoder/tests/rules.mk | |||
include $(QUANTUM_PATH)/sequencer/tests/rules.mk | |||
include $(PLATFORM_PATH)/test/rules.mk | |||
ifneq ($(filter $(FULL_TESTS),$(TEST)),) | |||
include build_full_test.mk | |||
endif | |||
$(TEST)_SRC += \ | |||
tests/test_common/main.c \ | |||
$(LIB_PATH)/printf/printf.c \ | |||
$(QUANTUM_PATH)/logging/print.c | |||
$(TEST_OBJ)/$(TEST)_SRC := $($(TEST)_SRC) | |||
$(TEST_OBJ)/$(TEST)_INC := $($(TEST)_INC) $(VPATH) $(GTEST_INC) | |||
$(TEST_OBJ)/$(TEST)_DEFS := $($(TEST)_DEFS) | |||
$(TEST_OBJ)/$(TEST)_CONFIG := $($(TEST)_CONFIG) | |||
include $(PLATFORM_PATH)/$(PLATFORM_KEY)/platform.mk | |||
include $(TMK_PATH)/rules.mk | |||
$(shell mkdir -p $(BUILD_DIR)/test 2>/dev/null) | |||
$(shell mkdir -p $(TEST_OBJ) 2>/dev/null) |
@ -0,0 +1,36 @@ | |||
# Copyright 2017 Fred Sundvik | |||
# | |||
# This program is free software: you can redistribute it and/or modify | |||
# it under the terms of the GNU General Public License as published by | |||
# the Free Software Foundation, either version 2 of the License, or | |||
# (at your option) any later version. | |||
# | |||
# This program is distributed in the hope that it will be useful, | |||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
# GNU General Public License for more details. | |||
# | |||
# You should have received a copy of the GNU General Public License | |||
# along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
$(TEST)_INC := \ | |||
tests/test_common/common_config.h | |||
$(TEST)_SRC := \ | |||
$(TMK_COMMON_SRC) \ | |||
$(QUANTUM_SRC) \ | |||
$(SRC) \ | |||
tests/test_common/keymap.c \ | |||
tests/test_common/matrix.c \ | |||
tests/test_common/test_driver.cpp \ | |||
tests/test_common/keyboard_report_util.cpp \ | |||
tests/test_common/test_fixture.cpp \ | |||
tests/test_common/test_keymap_key.cpp \ | |||
tests/test_common/test_logger.cpp \ | |||
$(patsubst $(ROOTDIR)/%,%,$(wildcard $(TEST_PATH)/*.cpp)) | |||
$(TEST)_DEFS := $(TMK_COMMON_DEFS) $(OPT_DEFS) | |||
$(TEST)_CONFIG := $(TEST_PATH)/config.h | |||
VPATH += $(TOP_DIR)/tests/test_common |
@ -0,0 +1,473 @@ | |||
# Determine what keyboard we are building and setup the build environment. | |||
# | |||
# We support folders up to 5 levels deep below `keyboards/`. This file is | |||
# responsible for determining which folder is being used and doing the | |||
# corresponding environment setup. | |||
ifndef VERBOSE | |||
.SILENT: | |||
endif | |||
.DEFAULT_GOAL := all | |||
include paths.mk | |||
include $(BUILDDEFS_PATH)/message.mk | |||
# Set the qmk cli to use | |||
QMK_BIN ?= qmk | |||
# Set the filename for the final firmware binary | |||
KEYBOARD_FILESAFE := $(subst /,_,$(KEYBOARD)) | |||
TARGET ?= $(KEYBOARD_FILESAFE)_$(KEYMAP) | |||
KEYBOARD_OUTPUT := $(BUILD_DIR)/obj_$(KEYBOARD_FILESAFE) | |||
# Force expansion | |||
TARGET := $(TARGET) | |||
ifneq ($(FORCE_LAYOUT),) | |||
TARGET := $(TARGET)_$(FORCE_LAYOUT) | |||
endif | |||
# Object files and generated keymap directory | |||
# To put object files in current directory, use a dot (.), do NOT make | |||
# this an empty or blank macro! | |||
KEYMAP_OUTPUT := $(BUILD_DIR)/obj_$(TARGET) | |||
ifdef SKIP_VERSION | |||
OPT_DEFS += -DSKIP_VERSION | |||
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) | |||
# Determine which subfolders exist. | |||
KEYBOARD_FOLDER_PATH_1 := $(KEYBOARD) | |||
KEYBOARD_FOLDER_PATH_2 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_1))) | |||
KEYBOARD_FOLDER_PATH_3 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_2))) | |||
KEYBOARD_FOLDER_PATH_4 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_3))) | |||
KEYBOARD_FOLDER_PATH_5 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_4))) | |||
KEYBOARD_FOLDER_1 := $(notdir $(KEYBOARD_FOLDER_PATH_1)) | |||
KEYBOARD_FOLDER_2 := $(notdir $(KEYBOARD_FOLDER_PATH_2)) | |||
KEYBOARD_FOLDER_3 := $(notdir $(KEYBOARD_FOLDER_PATH_3)) | |||
KEYBOARD_FOLDER_4 := $(notdir $(KEYBOARD_FOLDER_PATH_4)) | |||
KEYBOARD_FOLDER_5 := $(notdir $(KEYBOARD_FOLDER_PATH_5)) | |||
KEYBOARD_PATHS := | |||
KEYBOARD_PATH_1 := keyboards/$(KEYBOARD_FOLDER_PATH_1) | |||
KEYBOARD_PATH_2 := keyboards/$(KEYBOARD_FOLDER_PATH_2) | |||
KEYBOARD_PATH_3 := keyboards/$(KEYBOARD_FOLDER_PATH_3) | |||
KEYBOARD_PATH_4 := keyboards/$(KEYBOARD_FOLDER_PATH_4) | |||
KEYBOARD_PATH_5 := keyboards/$(KEYBOARD_FOLDER_PATH_5) | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/)","") | |||
KEYBOARD_PATHS += $(KEYBOARD_PATH_5) | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/)","") | |||
KEYBOARD_PATHS += $(KEYBOARD_PATH_4) | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/)","") | |||
KEYBOARD_PATHS += $(KEYBOARD_PATH_3) | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/)","") | |||
KEYBOARD_PATHS += $(KEYBOARD_PATH_2) | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/)","") | |||
KEYBOARD_PATHS += $(KEYBOARD_PATH_1) | |||
endif | |||
# Pull in rules.mk files from all our subfolders | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/rules.mk)","") | |||
include $(KEYBOARD_PATH_5)/rules.mk | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/rules.mk)","") | |||
include $(KEYBOARD_PATH_4)/rules.mk | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/rules.mk)","") | |||
include $(KEYBOARD_PATH_3)/rules.mk | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/rules.mk)","") | |||
include $(KEYBOARD_PATH_2)/rules.mk | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/rules.mk)","") | |||
include $(KEYBOARD_PATH_1)/rules.mk | |||
endif | |||
MAIN_KEYMAP_PATH_1 := $(KEYBOARD_PATH_1)/keymaps/$(KEYMAP) | |||
MAIN_KEYMAP_PATH_2 := $(KEYBOARD_PATH_2)/keymaps/$(KEYMAP) | |||
MAIN_KEYMAP_PATH_3 := $(KEYBOARD_PATH_3)/keymaps/$(KEYMAP) | |||
MAIN_KEYMAP_PATH_4 := $(KEYBOARD_PATH_4)/keymaps/$(KEYMAP) | |||
MAIN_KEYMAP_PATH_5 := $(KEYBOARD_PATH_5)/keymaps/$(KEYMAP) | |||
# Pull in rules from info.json | |||
INFO_RULES_MK = $(shell $(QMK_BIN) generate-rules-mk --quiet --escape --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/info_rules.mk) | |||
include $(INFO_RULES_MK) | |||
# Check for keymap.json first, so we can regenerate keymap.c | |||
include $(BUILDDEFS_PATH)/build_json.mk | |||
# Pull in keymap level rules.mk | |||
ifeq ("$(wildcard $(KEYMAP_PATH))", "") | |||
# Look through the possible keymap folders until we find a matching keymap.c | |||
ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_5)/keymap.c)","") | |||
-include $(MAIN_KEYMAP_PATH_5)/rules.mk | |||
KEYMAP_C := $(MAIN_KEYMAP_PATH_5)/keymap.c | |||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_5) | |||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_4)/keymap.c)","") | |||
-include $(MAIN_KEYMAP_PATH_4)/rules.mk | |||
KEYMAP_C := $(MAIN_KEYMAP_PATH_4)/keymap.c | |||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_4) | |||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_3)/keymap.c)","") | |||
-include $(MAIN_KEYMAP_PATH_3)/rules.mk | |||
KEYMAP_C := $(MAIN_KEYMAP_PATH_3)/keymap.c | |||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_3) | |||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_2)/keymap.c)","") | |||
-include $(MAIN_KEYMAP_PATH_2)/rules.mk | |||
KEYMAP_C := $(MAIN_KEYMAP_PATH_2)/keymap.c | |||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_2) | |||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_1)/keymap.c)","") | |||
-include $(MAIN_KEYMAP_PATH_1)/rules.mk | |||
KEYMAP_C := $(MAIN_KEYMAP_PATH_1)/keymap.c | |||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_1) | |||
else ifneq ($(LAYOUTS),) | |||
# If we haven't found a keymap yet fall back to community layouts | |||
include $(BUILDDEFS_PATH)/build_layout.mk | |||
else | |||
$(call CATASTROPHIC_ERROR,Invalid keymap,Could not find keymap) | |||
# this state should never be reached | |||
endif | |||
endif | |||
# Have we found a keymap.json? | |||
ifneq ("$(wildcard $(KEYMAP_JSON))", "") | |||
KEYMAP_C := $(KEYMAP_OUTPUT)/src/keymap.c | |||
KEYMAP_H := $(KEYMAP_OUTPUT)/src/config.h | |||
# Load the keymap-level rules.mk if exists | |||
-include $(KEYMAP_PATH)/rules.mk | |||
# Load any rules.mk content from keymap.json | |||
INFO_RULES_MK = $(shell $(QMK_BIN) generate-rules-mk --quiet --escape --keyboard $(KEYBOARD) --keymap $(KEYMAP) --output $(KEYMAP_OUTPUT)/src/rules.mk) | |||
include $(INFO_RULES_MK) | |||
# Add rules to generate the keymap files - indentation here is important | |||
$(KEYMAP_OUTPUT)/src/keymap.c: $(KEYMAP_JSON) | |||
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD) | |||
$(eval CMD=$(QMK_BIN) json2c --quiet --output $(KEYMAP_C) $(KEYMAP_JSON)) | |||
@$(BUILD_CMD) | |||
$(KEYMAP_OUTPUT)/src/config.h: $(KEYMAP_JSON) | |||
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD) | |||
$(eval CMD=$(QMK_BIN) generate-config-h --quiet --keyboard $(KEYBOARD) --keymap $(KEYMAP) --output $(KEYMAP_H)) | |||
@$(BUILD_CMD) | |||
generated-files: $(KEYMAP_OUTPUT)/src/config.h $(KEYMAP_OUTPUT)/src/keymap.c | |||
endif | |||
include $(BUILDDEFS_PATH)/converters.mk | |||
include $(BUILDDEFS_PATH)/mcu_selection.mk | |||
# Find all the C source files to be compiled in subfolders. | |||
KEYBOARD_SRC := | |||
KEYBOARD_C_1 := $(KEYBOARD_PATH_1)/$(KEYBOARD_FOLDER_1).c | |||
KEYBOARD_C_2 := $(KEYBOARD_PATH_2)/$(KEYBOARD_FOLDER_2).c | |||
KEYBOARD_C_3 := $(KEYBOARD_PATH_3)/$(KEYBOARD_FOLDER_3).c | |||
KEYBOARD_C_4 := $(KEYBOARD_PATH_4)/$(KEYBOARD_FOLDER_4).c | |||
KEYBOARD_C_5 := $(KEYBOARD_PATH_5)/$(KEYBOARD_FOLDER_5).c | |||
ifneq ("$(wildcard $(KEYBOARD_C_5))","") | |||
KEYBOARD_SRC += $(KEYBOARD_C_5) | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_C_4))","") | |||
KEYBOARD_SRC += $(KEYBOARD_C_4) | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_C_3))","") | |||
KEYBOARD_SRC += $(KEYBOARD_C_3) | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_C_2))","") | |||
KEYBOARD_SRC += $(KEYBOARD_C_2) | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_C_1))","") | |||
KEYBOARD_SRC += $(KEYBOARD_C_1) | |||
endif | |||
# Generate KEYBOARD_name_subname for all levels of the keyboard folder | |||
KEYBOARD_FILESAFE_1 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_1))) | |||
KEYBOARD_FILESAFE_2 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_2))) | |||
KEYBOARD_FILESAFE_3 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_3))) | |||
KEYBOARD_FILESAFE_4 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_4))) | |||
KEYBOARD_FILESAFE_5 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_5))) | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/)","") | |||
OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_5) | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/)","") | |||
OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_4) | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/)","") | |||
OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_3) | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/)","") | |||
OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_2) | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/)","") | |||
OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_1) | |||
endif | |||
# Setup the define for QMK_KEYBOARD_H. This is used inside of keymaps so | |||
# that the same keymap may be used on multiple keyboards. | |||
# | |||
# We grab the most top-level include file that we can. That file should | |||
# use #ifdef statements to include all the neccesary subfolder includes, | |||
# as described here: | |||
# | |||
# https://docs.qmk.fm/#/feature_layouts?id=tips-for-making-layouts-keyboard-agnostic | |||
# | |||
QMK_KEYBOARD_H = $(KEYBOARD_OUTPUT)/src/default_keyboard.h | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/$(KEYBOARD_FOLDER_1).h)","") | |||
QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_1).h | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/$(KEYBOARD_FOLDER_2).h)","") | |||
QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_2).h | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/$(KEYBOARD_FOLDER_3).h)","") | |||
QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_3).h | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/$(KEYBOARD_FOLDER_4).h)","") | |||
QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_4).h | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/$(KEYBOARD_FOLDER_5).h)","") | |||
QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_5).h | |||
endif | |||
# Determine and set parameters based on the keyboard's processor family. | |||
# We can assume a ChibiOS target When MCU_FAMILY is defined since it's | |||
# not used for LUFA | |||
ifdef MCU_FAMILY | |||
PLATFORM=CHIBIOS | |||
PLATFORM_KEY=chibios | |||
FIRMWARE_FORMAT?=bin | |||
OPT_DEFS += -DMCU_$(MCU_FAMILY) | |||
else ifdef ARM_ATSAM | |||
PLATFORM=ARM_ATSAM | |||
PLATFORM_KEY=arm_atsam | |||
FIRMWARE_FORMAT=bin | |||
else | |||
PLATFORM=AVR | |||
PLATFORM_KEY=avr | |||
FIRMWARE_FORMAT?=hex | |||
endif | |||
# Find all of the config.h files and add them to our CONFIG_H define. | |||
CONFIG_H := | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/config.h)","") | |||
CONFIG_H += $(KEYBOARD_PATH_5)/config.h | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/config.h)","") | |||
CONFIG_H += $(KEYBOARD_PATH_4)/config.h | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/config.h)","") | |||
CONFIG_H += $(KEYBOARD_PATH_3)/config.h | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/config.h)","") | |||
CONFIG_H += $(KEYBOARD_PATH_2)/config.h | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/config.h)","") | |||
CONFIG_H += $(KEYBOARD_PATH_1)/config.h | |||
endif | |||
POST_CONFIG_H := | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/post_config.h)","") | |||
POST_CONFIG_H += $(KEYBOARD_PATH_1)/post_config.h | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/post_config.h)","") | |||
POST_CONFIG_H += $(KEYBOARD_PATH_2)/post_config.h | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/post_config.h)","") | |||
POST_CONFIG_H += $(KEYBOARD_PATH_3)/post_config.h | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/post_config.h)","") | |||
POST_CONFIG_H += $(KEYBOARD_PATH_4)/post_config.h | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/post_config.h)","") | |||
POST_CONFIG_H += $(KEYBOARD_PATH_5)/post_config.h | |||
endif | |||
# Pull in stuff from info.json | |||
INFO_JSON_FILES := | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/info.json)","") | |||
INFO_JSON_FILES += $(KEYBOARD_PATH_1)/info.json | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/info.json)","") | |||
INFO_JSON_FILES += $(KEYBOARD_PATH_2)/info.json | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/info.json)","") | |||
INFO_JSON_FILES += $(KEYBOARD_PATH_3)/info.json | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/info.json)","") | |||
INFO_JSON_FILES += $(KEYBOARD_PATH_4)/info.json | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/info.json)","") | |||
INFO_JSON_FILES += $(KEYBOARD_PATH_5)/info.json | |||
endif | |||
CONFIG_H += $(KEYBOARD_OUTPUT)/src/info_config.h $(KEYBOARD_OUTPUT)/src/layouts.h | |||
$(KEYBOARD_OUTPUT)/src/info_config.h: $(INFO_JSON_FILES) | |||
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD) | |||
$(eval CMD=$(QMK_BIN) generate-config-h --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/info_config.h) | |||
@$(BUILD_CMD) | |||
$(KEYBOARD_OUTPUT)/src/default_keyboard.h: $(INFO_JSON_FILES) | |||
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD) | |||
$(eval CMD=$(QMK_BIN) generate-keyboard-h --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/default_keyboard.h) | |||
@$(BUILD_CMD) | |||
$(KEYBOARD_OUTPUT)/src/layouts.h: $(INFO_JSON_FILES) | |||
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD) | |||
$(eval CMD=$(QMK_BIN) generate-layouts --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/layouts.h) | |||
@$(BUILD_CMD) | |||
generated-files: $(KEYBOARD_OUTPUT)/src/info_config.h $(KEYBOARD_OUTPUT)/src/default_keyboard.h $(KEYBOARD_OUTPUT)/src/layouts.h | |||
.INTERMEDIATE : generated-files | |||
# Userspace setup and definitions | |||
ifeq ("$(USER_NAME)","") | |||
USER_NAME := $(KEYMAP) | |||
endif | |||
USER_PATH := users/$(USER_NAME) | |||
# Pull in user level rules.mk | |||
-include $(USER_PATH)/rules.mk | |||
ifneq ("$(wildcard $(USER_PATH)/config.h)","") | |||
CONFIG_H += $(USER_PATH)/config.h | |||
endif | |||
ifneq ("$(wildcard $(USER_PATH)/post_config.h)","") | |||
POST_CONFIG_H += $(USER_PATH)/post_config.h | |||
endif | |||
# Disable features that a keyboard doesn't support | |||
-include $(BUILDDEFS_PATH)/disable_features.mk | |||
# Pull in post_rules.mk files from all our subfolders | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/post_rules.mk)","") | |||
include $(KEYBOARD_PATH_1)/post_rules.mk | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/post_rules.mk)","") | |||
include $(KEYBOARD_PATH_2)/post_rules.mk | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/post_rules.mk)","") | |||
include $(KEYBOARD_PATH_3)/post_rules.mk | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/post_rules.mk)","") | |||
include $(KEYBOARD_PATH_4)/post_rules.mk | |||
endif | |||
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/post_rules.mk)","") | |||
include $(KEYBOARD_PATH_5)/post_rules.mk | |||
endif | |||
ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","") | |||
CONFIG_H += $(KEYMAP_PATH)/config.h | |||
endif | |||
ifneq ("$(KEYMAP_H)","") | |||
CONFIG_H += $(KEYMAP_H) | |||
endif | |||
# project specific files | |||
SRC += \ | |||
$(KEYBOARD_SRC) \ | |||
$(KEYMAP_C) \ | |||
$(QUANTUM_SRC) \ | |||
$(QUANTUM_DIR)/main.c \ | |||
# Optimize size but this may cause error "relocation truncated to fit" | |||
#EXTRALDFLAGS = -Wl,--relax | |||
# Search Path | |||
VPATH += $(KEYMAP_PATH) | |||
VPATH += $(USER_PATH) | |||
VPATH += $(KEYBOARD_PATHS) | |||
VPATH += $(COMMON_VPATH) | |||
VPATH += $(KEYBOARD_OUTPUT)/src | |||
VPATH += $(KEYMAP_OUTPUT)/src | |||
include $(BUILDDEFS_PATH)/common_features.mk | |||
include $(BUILDDEFS_PATH)/generic_features.mk | |||
include $(TMK_PATH)/protocol.mk | |||
include $(PLATFORM_PATH)/common.mk | |||
include $(BUILDDEFS_PATH)/bootloader.mk | |||
SRC += $(patsubst %.c,%.clib,$(LIB_SRC)) | |||
SRC += $(patsubst %.c,%.clib,$(QUANTUM_LIB_SRC)) | |||
SRC += $(TMK_COMMON_SRC) | |||
OPT_DEFS += $(TMK_COMMON_DEFS) | |||
EXTRALDFLAGS += $(TMK_COMMON_LDFLAGS) | |||
SKIP_COMPILE := no | |||
ifneq ($(REQUIRE_PLATFORM_KEY),) | |||
ifneq ($(REQUIRE_PLATFORM_KEY),$(PLATFORM_KEY)) | |||
SKIP_COMPILE := yes | |||
endif | |||
endif | |||
include $(PLATFORM_PATH)/$(PLATFORM_KEY)/platform.mk | |||
-include $(PLATFORM_PATH)/$(PLATFORM_KEY)/flash.mk | |||
ifneq ($(strip $(PROTOCOL)),) | |||
include $(TMK_PATH)/protocol/$(strip $(shell echo $(PROTOCOL) | tr '[:upper:]' '[:lower:]')).mk | |||
else | |||
include $(TMK_PATH)/protocol/$(PLATFORM_KEY).mk | |||
endif | |||
# TODO: remove this bodge? | |||
PROJECT_DEFS := $(OPT_DEFS) | |||
PROJECT_INC := $(VPATH) $(EXTRAINCDIRS) $(KEYBOARD_PATHS) | |||
PROJECT_CONFIG := $(CONFIG_H) | |||
CONFIG_H += $(POST_CONFIG_H) | |||
ALL_CONFIGS := $(PROJECT_CONFIG) $(CONFIG_H) | |||
OUTPUTS := $(KEYMAP_OUTPUT) $(KEYBOARD_OUTPUT) | |||
$(KEYMAP_OUTPUT)_SRC := $(SRC) | |||
$(KEYMAP_OUTPUT)_DEFS := $(OPT_DEFS) \ | |||
-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\" | |||
$(KEYMAP_OUTPUT)_INC := $(VPATH) $(EXTRAINCDIRS) | |||
$(KEYMAP_OUTPUT)_CONFIG := $(CONFIG_H) | |||
$(KEYBOARD_OUTPUT)_SRC := $(PLATFORM_SRC) | |||
$(KEYBOARD_OUTPUT)_DEFS := $(PROJECT_DEFS) | |||
$(KEYBOARD_OUTPUT)_INC := $(PROJECT_INC) | |||
$(KEYBOARD_OUTPUT)_CONFIG := $(PROJECT_CONFIG) | |||
# Default target. | |||
ifeq ($(SKIP_COMPILE),no) | |||
all: build check-size | |||
else | |||
all: | |||
echo "skipped" >&2 | |||
endif | |||
build: elf cpfirmware | |||
check-size: build | |||
check-md5: build | |||
objs-size: build | |||
include $(BUILDDEFS_PATH)/show_options.mk | |||
include $(BUILDDEFS_PATH)/common_rules.mk | |||
# Ensure we have generated files available for each of the objects | |||
define GEN_FILES | |||
$1: generated-files | |||
endef | |||
$(foreach O,$(OBJ),$(eval $(call GEN_FILES,$(patsubst %.a,%.o,$(O))))) |
@ -0,0 +1,32 @@ | |||
LAYOUTS_PATH := layouts | |||
LAYOUTS_REPOS := $(patsubst %/,%,$(sort $(dir $(wildcard $(LAYOUTS_PATH)/*/)))) | |||
define SEARCH_LAYOUTS_REPO | |||
LAYOUT_KEYMAP_PATH := $$(LAYOUTS_REPO)/$$(LAYOUT)/$$(KEYMAP) | |||
LAYOUT_KEYMAP_JSON := $$(LAYOUT_KEYMAP_PATH)/keymap.json | |||
LAYOUT_KEYMAP_C := $$(LAYOUT_KEYMAP_PATH)/keymap.c | |||
ifneq ("$$(wildcard $$(LAYOUT_KEYMAP_JSON))","") | |||
-include $$(LAYOUT_KEYMAP_PATH)/rules.mk | |||
KEYMAP_JSON := $$(LAYOUT_KEYMAP_JSON) | |||
KEYMAP_PATH := $$(LAYOUT_KEYMAP_PATH) | |||
else ifneq ("$$(wildcard $$(LAYOUT_KEYMAP_C))","") | |||
-include $$(LAYOUT_KEYMAP_PATH)/rules.mk | |||
KEYMAP_C := $$(LAYOUT_KEYMAP_C) | |||
KEYMAP_PATH := $$(LAYOUT_KEYMAP_PATH) | |||
endif | |||
endef | |||
define SEARCH_LAYOUTS | |||
$$(foreach LAYOUTS_REPO,$$(LAYOUTS_REPOS),$$(eval $$(call SEARCH_LAYOUTS_REPO))) | |||
endef | |||
ifneq ($(FORCE_LAYOUT),) | |||
ifneq (,$(findstring $(FORCE_LAYOUT),$(LAYOUTS))) | |||
$(info Forcing layout: $(FORCE_LAYOUT)) | |||
LAYOUTS := $(FORCE_LAYOUT) | |||
else | |||
$(call CATASTROPHIC_ERROR,Invalid layout,Forced layout does not exist) | |||
endif | |||
endif | |||
$(foreach LAYOUT,$(LAYOUTS),$(eval $(call SEARCH_LAYOUTS))) |
@ -0,0 +1,86 @@ | |||
ifndef VERBOSE | |||
.SILENT: | |||
endif | |||
.DEFAULT_GOAL := all | |||
OPT = g | |||
include paths.mk | |||
include $(BUILDDEFS_PATH)/message.mk | |||
TARGET=test/$(TEST) | |||
GTEST_OUTPUT = $(BUILD_DIR)/gtest | |||
TEST_OBJ = $(BUILD_DIR)/test_obj | |||
OUTPUTS := $(TEST_OBJ)/$(TEST) $(GTEST_OUTPUT) | |||
GTEST_INC := \ | |||
$(LIB_PATH)/googletest/googletest/include \ | |||
$(LIB_PATH)/googletest/googlemock/include | |||
GTEST_INTERNAL_INC := \ | |||
$(LIB_PATH)/googletest/googletest \ | |||
$(LIB_PATH)/googletest/googlemock | |||
$(GTEST_OUTPUT)_SRC := \ | |||
googletest/src/gtest-all.cc\ | |||
googlemock/src/gmock-all.cc | |||
$(GTEST_OUTPUT)_DEFS := | |||
$(GTEST_OUTPUT)_INC := $(GTEST_INC) $(GTEST_INTERNAL_INC) | |||
LDFLAGS += -lstdc++ -lpthread -shared-libgcc | |||
CREATE_MAP := no | |||
VPATH += \ | |||
$(LIB_PATH)/googletest \ | |||
$(LIB_PATH)/googlemock \ | |||
$(LIB_PATH)/printf | |||
all: elf | |||
VPATH += $(COMMON_VPATH) | |||
PLATFORM:=TEST | |||
PLATFORM_KEY:=test | |||
BOOTLOADER_TYPE:=none | |||
ifeq ($(strip $(DEBUG)), 1) | |||
CONSOLE_ENABLE = yes | |||
endif | |||
ifneq ($(filter $(FULL_TESTS),$(TEST)),) | |||
include tests/test_common/build.mk | |||
include $(TEST_PATH)/test.mk | |||
endif | |||
include $(BUILDDEFS_PATH)/common_features.mk | |||
include $(BUILDDEFS_PATH)/generic_features.mk | |||
include $(PLATFORM_PATH)/common.mk | |||
include $(TMK_PATH)/protocol.mk | |||
include $(QUANTUM_PATH)/debounce/tests/rules.mk | |||
include $(QUANTUM_PATH)/encoder/tests/rules.mk | |||
include $(QUANTUM_PATH)/sequencer/tests/rules.mk | |||
include $(PLATFORM_PATH)/test/rules.mk | |||
ifneq ($(filter $(FULL_TESTS),$(TEST)),) | |||
include $(BUILDDEFS_PATH)/build_full_test.mk | |||
endif | |||
$(TEST)_SRC += \ | |||
tests/test_common/main.c \ | |||
$(LIB_PATH)/printf/printf.c \ | |||
$(QUANTUM_PATH)/logging/print.c | |||
$(TEST_OBJ)/$(TEST)_SRC := $($(TEST)_SRC) | |||
$(TEST_OBJ)/$(TEST)_INC := $($(TEST)_INC) $(VPATH) $(GTEST_INC) | |||
$(TEST_OBJ)/$(TEST)_DEFS := $($(TEST)_DEFS) | |||
$(TEST_OBJ)/$(TEST)_CONFIG := $($(TEST)_CONFIG) | |||
include $(PLATFORM_PATH)/$(PLATFORM_KEY)/platform.mk | |||
include $(BUILDDEFS_PATH)/common_rules.mk | |||
$(shell mkdir -p $(BUILD_DIR)/test 2>/dev/null) | |||
$(shell mkdir -p $(TEST_OBJ) 2>/dev/null) |
@ -0,0 +1,823 @@ | |||
# Copyright 2017 Fred Sundvik | |||
# | |||
# This program is free software: you can redistribute it and/or modify | |||
# it under the terms of the GNU General Public License as published by | |||
# the Free Software Foundation, either version 2 of the License, or | |||
# (at your option) any later version. | |||
# | |||
# This program is distributed in the hope that it will be useful, | |||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
# GNU General Public License for more details. | |||
# | |||
# You should have received a copy of the GNU General Public License | |||
# along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
QUANTUM_SRC += \ | |||
$(QUANTUM_DIR)/quantum.c \ | |||
$(QUANTUM_DIR)/send_string.c \ | |||
$(QUANTUM_DIR)/bitwise.c \ | |||
$(QUANTUM_DIR)/led.c \ | |||
$(QUANTUM_DIR)/action.c \ | |||
$(QUANTUM_DIR)/action_layer.c \ | |||
$(QUANTUM_DIR)/action_tapping.c \ | |||
$(QUANTUM_DIR)/action_util.c \ | |||
$(QUANTUM_DIR)/eeconfig.c \ | |||
$(QUANTUM_DIR)/keyboard.c \ | |||
$(QUANTUM_DIR)/keymap_common.c \ | |||
$(QUANTUM_DIR)/keycode_config.c \ | |||
$(QUANTUM_DIR)/sync_timer.c \ | |||
$(QUANTUM_DIR)/logging/debug.c \ | |||
$(QUANTUM_DIR)/logging/sendchar.c \ | |||
VPATH += $(QUANTUM_DIR)/logging | |||
# Fall back to lib/printf if there is no platform provided print | |||
ifeq ("$(wildcard $(PLATFORM_PATH)/$(PLATFORM_KEY)/printf.mk)","") | |||
include $(QUANTUM_PATH)/logging/print.mk | |||
else | |||
include $(PLATFORM_PATH)/$(PLATFORM_KEY)/printf.mk | |||
endif | |||
ifeq ($(strip $(DEBUG_MATRIX_SCAN_RATE_ENABLE)), yes) | |||
OPT_DEFS += -DDEBUG_MATRIX_SCAN_RATE | |||
CONSOLE_ENABLE = yes | |||
else ifeq ($(strip $(DEBUG_MATRIX_SCAN_RATE_ENABLE)), api) | |||
OPT_DEFS += -DDEBUG_MATRIX_SCAN_RATE | |||
endif | |||
AUDIO_ENABLE ?= no | |||
ifeq ($(strip $(AUDIO_ENABLE)), yes) | |||
ifeq ($(PLATFORM),CHIBIOS) | |||
AUDIO_DRIVER ?= dac_basic | |||
ifeq ($(strip $(AUDIO_DRIVER)), dac_basic) | |||
OPT_DEFS += -DAUDIO_DRIVER_DAC | |||
else ifeq ($(strip $(AUDIO_DRIVER)), dac_additive) | |||
OPT_DEFS += -DAUDIO_DRIVER_DAC | |||
## stm32f2 and above have a usable DAC unit, f1 do not, and need to use pwm instead | |||
else ifeq ($(strip $(AUDIO_DRIVER)), pwm_software) | |||
OPT_DEFS += -DAUDIO_DRIVER_PWM | |||
else ifeq ($(strip $(AUDIO_DRIVER)), pwm_hardware) | |||
OPT_DEFS += -DAUDIO_DRIVER_PWM | |||
endif | |||
else | |||
# fallback for all other platforms is pwm | |||
AUDIO_DRIVER ?= pwm_hardware | |||
OPT_DEFS += -DAUDIO_DRIVER_PWM | |||
endif | |||
OPT_DEFS += -DAUDIO_ENABLE | |||
MUSIC_ENABLE = yes | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_audio.c | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_clicky.c | |||
SRC += $(QUANTUM_DIR)/audio/audio.c ## common audio code, hardware agnostic | |||
SRC += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/audio_$(strip $(AUDIO_DRIVER)).c | |||
SRC += $(QUANTUM_DIR)/audio/voices.c | |||
SRC += $(QUANTUM_DIR)/audio/luts.c | |||
endif | |||
ifeq ($(strip $(SEQUENCER_ENABLE)), yes) | |||
OPT_DEFS += -DSEQUENCER_ENABLE | |||
MUSIC_ENABLE = yes | |||
SRC += $(QUANTUM_DIR)/sequencer/sequencer.c | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_sequencer.c | |||
endif | |||
ifeq ($(strip $(MIDI_ENABLE)), yes) | |||
OPT_DEFS += -DMIDI_ENABLE | |||
MUSIC_ENABLE = yes | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_midi.c | |||
endif | |||
MUSIC_ENABLE ?= no | |||
ifeq ($(MUSIC_ENABLE), yes) | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_music.c | |||
endif | |||
ifeq ($(strip $(STENO_ENABLE)), yes) | |||
OPT_DEFS += -DSTENO_ENABLE | |||
VIRTSER_ENABLE ?= yes | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_steno.c | |||
endif | |||
ifeq ($(strip $(VIRTSER_ENABLE)), yes) | |||
OPT_DEFS += -DVIRTSER_ENABLE | |||
endif | |||
ifeq ($(strip $(MOUSEKEY_ENABLE)), yes) | |||
OPT_DEFS += -DMOUSEKEY_ENABLE | |||
MOUSE_ENABLE := yes | |||
SRC += $(QUANTUM_DIR)/mousekey.c | |||
endif | |||
VALID_POINTING_DEVICE_DRIVER_TYPES := adns5050 adns9800 analog_joystick cirque_pinnacle_i2c cirque_pinnacle_spi pmw3360 pmw3389 pimoroni_trackball custom | |||
ifeq ($(strip $(POINTING_DEVICE_ENABLE)), yes) | |||
ifeq ($(filter $(POINTING_DEVICE_DRIVER),$(VALID_POINTING_DEVICE_DRIVER_TYPES)),) | |||
$(call CATASTROPHIC_ERROR,Invalid POINTING_DEVICE_DRIVER,POINTING_DEVICE_DRIVER="$(POINTING_DEVICE_DRIVER)" is not a valid pointing device type) | |||
else | |||
OPT_DEFS += -DPOINTING_DEVICE_ENABLE | |||
MOUSE_ENABLE := yes | |||
SRC += $(QUANTUM_DIR)/pointing_device.c | |||
SRC += $(QUANTUM_DIR)/pointing_device_drivers.c | |||
ifneq ($(strip $(POINTING_DEVICE_DRIVER)), custom) | |||
SRC += drivers/sensors/$(strip $(POINTING_DEVICE_DRIVER)).c | |||
OPT_DEFS += -DPOINTING_DEVICE_DRIVER_$(strip $(shell echo $(POINTING_DEVICE_DRIVER) | tr '[:lower:]' '[:upper:]')) | |||
endif | |||
OPT_DEFS += -DPOINTING_DEVICE_DRIVER_$(strip $(POINTING_DEVICE_DRIVER)) | |||
ifeq ($(strip $(POINTING_DEVICE_DRIVER)), adns9800) | |||
OPT_DEFS += -DSTM32_SPI -DHAL_USE_SPI=TRUE | |||
QUANTUM_LIB_SRC += spi_master.c | |||
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), analog_joystick) | |||
OPT_DEFS += -DSTM32_ADC -DHAL_USE_ADC=TRUE | |||
LIB_SRC += analog.c | |||
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), cirque_pinnacle_i2c) | |||
OPT_DEFS += -DSTM32_I2C -DHAL_USE_I2C=TRUE | |||
SRC += drivers/sensors/cirque_pinnacle.c | |||
QUANTUM_LIB_SRC += i2c_master.c | |||
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), cirque_pinnacle_spi) | |||
OPT_DEFS += -DSTM32_SPI -DHAL_USE_SPI=TRUE | |||
SRC += drivers/sensors/cirque_pinnacle.c | |||
QUANTUM_LIB_SRC += spi_master.c | |||
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), pimoroni_trackball) | |||
OPT_DEFS += -DSTM32_SPI -DHAL_USE_I2C=TRUE | |||
QUANTUM_LIB_SRC += i2c_master.c | |||
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), pmw3360) | |||
OPT_DEFS += -DSTM32_SPI -DHAL_USE_SPI=TRUE | |||
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 | |||
QUANTUM_PAINTER_ENABLE ?= no | |||
ifeq ($(strip $(QUANTUM_PAINTER_ENABLE)), yes) | |||
include $(QUANTUM_DIR)/painter/rules.mk | |||
endif | |||
VALID_EEPROM_DRIVER_TYPES := vendor custom transient i2c spi | |||
EEPROM_DRIVER ?= vendor | |||
ifeq ($(filter $(EEPROM_DRIVER),$(VALID_EEPROM_DRIVER_TYPES)),) | |||
$(call CATASTROPHIC_ERROR,Invalid EEPROM_DRIVER,EEPROM_DRIVER="$(EEPROM_DRIVER)" is not a valid EEPROM driver) | |||
else | |||
OPT_DEFS += -DEEPROM_ENABLE | |||
ifeq ($(strip $(EEPROM_DRIVER)), custom) | |||
# Custom EEPROM implementation -- only needs to implement init/erase/read_block/write_block | |||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_CUSTOM | |||
COMMON_VPATH += $(DRIVER_PATH)/eeprom | |||
SRC += eeprom_driver.c | |||
else ifeq ($(strip $(EEPROM_DRIVER)), i2c) | |||
# External I2C EEPROM implementation | |||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_I2C | |||
COMMON_VPATH += $(DRIVER_PATH)/eeprom | |||
QUANTUM_LIB_SRC += i2c_master.c | |||
SRC += eeprom_driver.c eeprom_i2c.c | |||
else ifeq ($(strip $(EEPROM_DRIVER)), spi) | |||
# External SPI EEPROM implementation | |||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_SPI | |||
COMMON_VPATH += $(DRIVER_PATH)/eeprom | |||
QUANTUM_LIB_SRC += spi_master.c | |||
SRC += eeprom_driver.c eeprom_spi.c | |||
else ifeq ($(strip $(EEPROM_DRIVER)), transient) | |||
# Transient EEPROM implementation -- no data storage but provides runtime area for it | |||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT | |||
COMMON_VPATH += $(DRIVER_PATH)/eeprom | |||
SRC += eeprom_driver.c eeprom_transient.c | |||
else ifeq ($(strip $(EEPROM_DRIVER)), vendor) | |||
# Vendor-implemented EEPROM | |||
OPT_DEFS += -DEEPROM_VENDOR | |||
ifeq ($(PLATFORM),AVR) | |||
# Automatically provided by avr-libc, nothing required | |||
else ifeq ($(PLATFORM),CHIBIOS) | |||
ifneq ($(filter STM32F3xx_% STM32F1xx_% %_STM32F401xC %_STM32F401xE %_STM32F405xG %_STM32F411xE %_STM32F072xB %_STM32F042x6 %_GD32VF103xB %_GD32VF103x8, $(MCU_SERIES)_$(MCU_LDSCRIPT)),) | |||
# Emulated EEPROM | |||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_STM32_FLASH_EMULATED | |||
COMMON_VPATH += $(DRIVER_PATH)/eeprom | |||
SRC += eeprom_driver.c | |||
SRC += $(PLATFORM_COMMON_DIR)/eeprom_stm32.c | |||
SRC += $(PLATFORM_COMMON_DIR)/flash_stm32.c | |||
else ifneq ($(filter $(MCU_SERIES),STM32L0xx STM32L1xx),) | |||
# True EEPROM on STM32L0xx, L1xx | |||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_STM32_L0_L1 | |||
COMMON_VPATH += $(DRIVER_PATH)/eeprom | |||
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/eeprom | |||
SRC += eeprom_driver.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 | |||
# Fall back to transient, i.e. non-persistent | |||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT | |||
COMMON_VPATH += $(DRIVER_PATH)/eeprom | |||
SRC += eeprom_driver.c eeprom_transient.c | |||
endif | |||
else ifeq ($(PLATFORM),ARM_ATSAM) | |||
# arm_atsam EEPROM | |||
OPT_DEFS += -DEEPROM_SAMD | |||
SRC += $(PLATFORM_COMMON_DIR)/eeprom_samd.c | |||
else ifeq ($(PLATFORM),TEST) | |||
# Test harness "EEPROM" | |||
OPT_DEFS += -DEEPROM_TEST_HARNESS | |||
SRC += $(PLATFORM_COMMON_DIR)/eeprom.c | |||
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 | |||
VALID_RGBLIGHT_TYPES := WS2812 APA102 custom | |||
ifeq ($(strip $(RGBLIGHT_CUSTOM_DRIVER)), yes) | |||
RGBLIGHT_DRIVER ?= custom | |||
endif | |||
ifeq ($(strip $(RGBLIGHT_ENABLE)), yes) | |||
RGBLIGHT_DRIVER ?= WS2812 | |||
ifeq ($(filter $(RGBLIGHT_DRIVER),$(VALID_RGBLIGHT_TYPES)),) | |||
$(call CATASTROPHIC_ERROR,Invalid RGBLIGHT_DRIVER,RGBLIGHT_DRIVER="$(RGBLIGHT_DRIVER)" is not a valid RGB type) | |||
else | |||
COMMON_VPATH += $(QUANTUM_DIR)/rgblight | |||
POST_CONFIG_H += $(QUANTUM_DIR)/rgblight/rgblight_post_config.h | |||
OPT_DEFS += -DRGBLIGHT_ENABLE | |||
SRC += $(QUANTUM_DIR)/color.c | |||
SRC += $(QUANTUM_DIR)/rgblight/rgblight.c | |||
CIE1931_CURVE := yes | |||
RGB_KEYCODES_ENABLE := yes | |||
endif | |||
ifeq ($(strip $(RGBLIGHT_DRIVER)), WS2812) | |||
WS2812_DRIVER_REQUIRED := yes | |||
endif | |||
ifeq ($(strip $(RGBLIGHT_DRIVER)), APA102) | |||
APA102_DRIVER_REQUIRED := yes | |||
endif | |||
ifeq ($(strip $(RGBLIGHT_DRIVER)), custom) | |||
OPT_DEFS += -DRGBLIGHT_CUSTOM_DRIVER | |||
endif | |||
endif | |||
LED_MATRIX_ENABLE ?= no | |||
VALID_LED_MATRIX_TYPES := IS31FL3731 IS31FL3742A IS31FL3743A IS31FL3745 IS31FL3746A custom | |||
# TODO: IS31FL3733 IS31FL3737 IS31FL3741 | |||
ifeq ($(strip $(LED_MATRIX_ENABLE)), yes) | |||
ifeq ($(filter $(LED_MATRIX_DRIVER),$(VALID_LED_MATRIX_TYPES)),) | |||
$(call CATASTROPHIC_ERROR,Invalid LED_MATRIX_DRIVER,LED_MATRIX_DRIVER="$(LED_MATRIX_DRIVER)" is not a valid matrix type) | |||
endif | |||
OPT_DEFS += -DLED_MATRIX_ENABLE | |||
ifneq (,$(filter $(MCU), atmega16u2 atmega32u2 at90usb162)) | |||
# ATmegaxxU2 does not have hardware MUL instruction - lib8tion must be told to use software multiplication routines | |||
OPT_DEFS += -DLIB8_ATTINY | |||
endif | |||
COMMON_VPATH += $(QUANTUM_DIR)/led_matrix | |||
COMMON_VPATH += $(QUANTUM_DIR)/led_matrix/animations | |||
COMMON_VPATH += $(QUANTUM_DIR)/led_matrix/animations/runners | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_backlight.c | |||
SRC += $(QUANTUM_DIR)/led_matrix/led_matrix.c | |||
SRC += $(QUANTUM_DIR)/led_matrix/led_matrix_drivers.c | |||
SRC += $(LIB_PATH)/lib8tion/lib8tion.c | |||
CIE1931_CURVE := yes | |||
ifeq ($(strip $(LED_MATRIX_DRIVER)), IS31FL3731) | |||
OPT_DEFS += -DIS31FL3731 -DSTM32_I2C -DHAL_USE_I2C=TRUE | |||
COMMON_VPATH += $(DRIVER_PATH)/led/issi | |||
SRC += is31fl3731-simple.c | |||
QUANTUM_LIB_SRC += i2c_master.c | |||
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 | |||
RGB_MATRIX_ENABLE ?= no | |||
VALID_RGB_MATRIX_TYPES := AW20216 IS31FL3731 IS31FL3733 IS31FL3737 IS31FL3741 IS31FL3742A IS31FL3743A IS31FL3745 IS31FL3746A CKLED2001 WS2812 custom | |||
ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes) | |||
ifeq ($(filter $(RGB_MATRIX_DRIVER),$(VALID_RGB_MATRIX_TYPES)),) | |||
$(call CATASTROPHIC_ERROR,Invalid RGB_MATRIX_DRIVER,RGB_MATRIX_DRIVER="$(RGB_MATRIX_DRIVER)" is not a valid matrix type) | |||
endif | |||
OPT_DEFS += -DRGB_MATRIX_ENABLE | |||
ifneq (,$(filter $(MCU), atmega16u2 atmega32u2 at90usb162)) | |||
# ATmegaxxU2 does not have hardware MUL instruction - lib8tion must be told to use software multiplication routines | |||
OPT_DEFS += -DLIB8_ATTINY | |||
endif | |||
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix | |||
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix/animations | |||
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix/animations/runners | |||
SRC += $(QUANTUM_DIR)/color.c | |||
SRC += $(QUANTUM_DIR)/rgb_matrix/rgb_matrix.c | |||
SRC += $(QUANTUM_DIR)/rgb_matrix/rgb_matrix_drivers.c | |||
SRC += $(LIB_PATH)/lib8tion/lib8tion.c | |||
CIE1931_CURVE := yes | |||
RGB_KEYCODES_ENABLE := yes | |||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), AW20216) | |||
OPT_DEFS += -DAW20216 -DSTM32_SPI -DHAL_USE_SPI=TRUE | |||
COMMON_VPATH += $(DRIVER_PATH)/led | |||
SRC += aw20216.c | |||
QUANTUM_LIB_SRC += spi_master.c | |||
endif | |||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), IS31FL3731) | |||
OPT_DEFS += -DIS31FL3731 -DSTM32_I2C -DHAL_USE_I2C=TRUE | |||
COMMON_VPATH += $(DRIVER_PATH)/led/issi | |||
SRC += is31fl3731.c | |||
QUANTUM_LIB_SRC += i2c_master.c | |||
endif | |||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), IS31FL3733) | |||
OPT_DEFS += -DIS31FL3733 -DSTM32_I2C -DHAL_USE_I2C=TRUE | |||
COMMON_VPATH += $(DRIVER_PATH)/led/issi | |||
SRC += is31fl3733.c | |||
QUANTUM_LIB_SRC += i2c_master.c | |||
endif | |||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), IS31FL3737) | |||
OPT_DEFS += -DIS31FL3737 -DSTM32_I2C -DHAL_USE_I2C=TRUE | |||
COMMON_VPATH += $(DRIVER_PATH)/led/issi | |||
SRC += is31fl3737.c | |||
QUANTUM_LIB_SRC += i2c_master.c | |||
endif | |||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), IS31FL3741) | |||
OPT_DEFS += -DIS31FL3741 -DSTM32_I2C -DHAL_USE_I2C=TRUE | |||
COMMON_VPATH += $(DRIVER_PATH)/led/issi | |||
SRC += is31fl3741.c | |||
QUANTUM_LIB_SRC += i2c_master.c | |||
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) | |||
OPT_DEFS += -DCKLED2001 -DSTM32_I2C -DHAL_USE_I2C=TRUE | |||
COMMON_VPATH += $(DRIVER_PATH)/led | |||
SRC += ckled2001.c | |||
QUANTUM_LIB_SRC += i2c_master.c | |||
endif | |||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), WS2812) | |||
OPT_DEFS += -DWS2812 | |||
WS2812_DRIVER_REQUIRED := yes | |||
endif | |||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), APA102) | |||
OPT_DEFS += -DAPA102 | |||
APA102_DRIVER_REQUIRED := yes | |||
endif | |||
ifeq ($(strip $(RGB_MATRIX_CUSTOM_KB)), yes) | |||
OPT_DEFS += -DRGB_MATRIX_CUSTOM_KB | |||
endif | |||
ifeq ($(strip $(RGB_MATRIX_CUSTOM_USER)), yes) | |||
OPT_DEFS += -DRGB_MATRIX_CUSTOM_USER | |||
endif | |||
endif | |||
ifeq ($(strip $(RGB_KEYCODES_ENABLE)), yes) | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_rgb.c | |||
endif | |||
ifeq ($(strip $(PRINTING_ENABLE)), yes) | |||
OPT_DEFS += -DPRINTING_ENABLE | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_printer.c | |||
QUANTUM_LIB_SRC += uart.c | |||
endif | |||
VARIABLE_TRACE ?= no | |||
ifneq ($(strip $(VARIABLE_TRACE)),no) | |||
SRC += $(QUANTUM_DIR)/variable_trace.c | |||
OPT_DEFS += -DNUM_TRACED_VARIABLES=$(strip $(VARIABLE_TRACE)) | |||
ifneq ($(strip $(MAX_VARIABLE_TRACE_SIZE)),) | |||
OPT_DEFS += -DMAX_VARIABLE_TRACE_SIZE=$(strip $(MAX_VARIABLE_TRACE_SIZE)) | |||
endif | |||
endif | |||
ifeq ($(strip $(SLEEP_LED_ENABLE)), yes) | |||
SRC += $(PLATFORM_COMMON_DIR)/sleep_led.c | |||
OPT_DEFS += -DSLEEP_LED_ENABLE | |||
NO_SUSPEND_POWER_DOWN := yes | |||
endif | |||
VALID_BACKLIGHT_TYPES := pwm timer software custom | |||
BACKLIGHT_ENABLE ?= no | |||
ifeq ($(strip $(CONVERT_TO_PROTON_C)), yes) | |||
BACKLIGHT_DRIVER ?= software | |||
else | |||
BACKLIGHT_DRIVER ?= pwm | |||
endif | |||
ifeq ($(strip $(BACKLIGHT_ENABLE)), yes) | |||
ifeq ($(filter $(BACKLIGHT_DRIVER),$(VALID_BACKLIGHT_TYPES)),) | |||
$(call CATASTROPHIC_ERROR,Invalid BACKLIGHT_DRIVER,BACKLIGHT_DRIVER="$(BACKLIGHT_DRIVER)" is not a valid backlight type) | |||
endif | |||
COMMON_VPATH += $(QUANTUM_DIR)/backlight | |||
SRC += $(QUANTUM_DIR)/backlight/backlight.c | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_backlight.c | |||
OPT_DEFS += -DBACKLIGHT_ENABLE | |||
ifeq ($(strip $(BACKLIGHT_DRIVER)), custom) | |||
OPT_DEFS += -DBACKLIGHT_CUSTOM_DRIVER | |||
else | |||
SRC += $(QUANTUM_DIR)/backlight/backlight_driver_common.c | |||
ifeq ($(strip $(BACKLIGHT_DRIVER)), pwm) | |||
SRC += $(QUANTUM_DIR)/backlight/backlight_$(PLATFORM_KEY).c | |||
else | |||
SRC += $(QUANTUM_DIR)/backlight/backlight_$(strip $(BACKLIGHT_DRIVER)).c | |||
endif | |||
endif | |||
endif | |||
VALID_WS2812_DRIVER_TYPES := bitbang pwm spi i2c | |||
WS2812_DRIVER ?= bitbang | |||
ifeq ($(strip $(WS2812_DRIVER_REQUIRED)), yes) | |||
ifeq ($(filter $(WS2812_DRIVER),$(VALID_WS2812_DRIVER_TYPES)),) | |||
$(call CATASTROPHIC_ERROR,Invalid WS2812_DRIVER,WS2812_DRIVER="$(WS2812_DRIVER)" is not a valid WS2812 driver) | |||
endif | |||
OPT_DEFS += -DWS2812_DRIVER_$(strip $(shell echo $(WS2812_DRIVER) | tr '[:lower:]' '[:upper:]')) | |||
ifeq ($(strip $(WS2812_DRIVER)), bitbang) | |||
SRC += ws2812.c | |||
else | |||
SRC += ws2812_$(strip $(WS2812_DRIVER)).c | |||
ifeq ($(strip $(PLATFORM)), CHIBIOS) | |||
ifeq ($(strip $(WS2812_DRIVER)), pwm) | |||
OPT_DEFS += -DSTM32_DMA_REQUIRED=TRUE | |||
endif | |||
endif | |||
endif | |||
# add extra deps | |||
ifeq ($(strip $(WS2812_DRIVER)), i2c) | |||
QUANTUM_LIB_SRC += i2c_master.c | |||
endif | |||
endif | |||
ifeq ($(strip $(APA102_DRIVER_REQUIRED)), yes) | |||
COMMON_VPATH += $(DRIVER_PATH)/led | |||
SRC += apa102.c | |||
endif | |||
ifeq ($(strip $(CIE1931_CURVE)), yes) | |||
OPT_DEFS += -DUSE_CIE1931_CURVE | |||
LED_TABLES := yes | |||
endif | |||
ifeq ($(strip $(LED_TABLES)), yes) | |||
SRC += $(QUANTUM_DIR)/led_tables.c | |||
endif | |||
ifeq ($(strip $(TERMINAL_ENABLE)), yes) | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_terminal.c | |||
OPT_DEFS += -DTERMINAL_ENABLE | |||
OPT_DEFS += -DUSER_PRINT | |||
endif | |||
ifeq ($(strip $(VIA_ENABLE)), yes) | |||
DYNAMIC_KEYMAP_ENABLE := yes | |||
RAW_ENABLE := yes | |||
BOOTMAGIC_ENABLE := yes | |||
SRC += $(QUANTUM_DIR)/via.c | |||
OPT_DEFS += -DVIA_ENABLE | |||
endif | |||
VALID_MAGIC_TYPES := yes | |||
BOOTMAGIC_ENABLE ?= no | |||
ifneq ($(strip $(BOOTMAGIC_ENABLE)), no) | |||
ifeq ($(filter $(BOOTMAGIC_ENABLE),$(VALID_MAGIC_TYPES)),) | |||
$(call CATASTROPHIC_ERROR,Invalid BOOTMAGIC_ENABLE,BOOTMAGIC_ENABLE="$(BOOTMAGIC_ENABLE)" is not a valid type of magic) | |||
endif | |||
ifneq ($(strip $(BOOTMAGIC_ENABLE)), no) | |||
OPT_DEFS += -DBOOTMAGIC_LITE | |||
QUANTUM_SRC += $(QUANTUM_DIR)/bootmagic/bootmagic_lite.c | |||
endif | |||
endif | |||
COMMON_VPATH += $(QUANTUM_DIR)/bootmagic | |||
QUANTUM_SRC += $(QUANTUM_DIR)/bootmagic/magic.c | |||
VALID_CUSTOM_MATRIX_TYPES:= yes lite no | |||
CUSTOM_MATRIX ?= no | |||
ifneq ($(strip $(CUSTOM_MATRIX)), yes) | |||
ifeq ($(filter $(CUSTOM_MATRIX),$(VALID_CUSTOM_MATRIX_TYPES)),) | |||
$(call CATASTROPHIC_ERROR,Invalid CUSTOM_MATRIX,CUSTOM_MATRIX="$(CUSTOM_MATRIX)" is not a valid custom matrix type) | |||
endif | |||
# Include common stuff for all non custom matrix users | |||
QUANTUM_SRC += $(QUANTUM_DIR)/matrix_common.c | |||
# if 'lite' then skip the actual matrix implementation | |||
ifneq ($(strip $(CUSTOM_MATRIX)), lite) | |||
# Include the standard or split matrix code if needed | |||
QUANTUM_SRC += $(QUANTUM_DIR)/matrix.c | |||
endif | |||
endif | |||
# Debounce Modules. Set DEBOUNCE_TYPE=custom if including one manually. | |||
DEBOUNCE_TYPE ?= sym_defer_g | |||
ifneq ($(strip $(DEBOUNCE_TYPE)), custom) | |||
QUANTUM_SRC += $(QUANTUM_DIR)/debounce/$(strip $(DEBOUNCE_TYPE)).c | |||
endif | |||
ifeq ($(strip $(SPLIT_KEYBOARD)), yes) | |||
POST_CONFIG_H += $(QUANTUM_DIR)/split_common/post_config.h | |||
OPT_DEFS += -DSPLIT_KEYBOARD | |||
CRC_ENABLE := yes | |||
# Include files used by all split keyboards | |||
QUANTUM_SRC += $(QUANTUM_DIR)/split_common/split_util.c | |||
# Determine which (if any) transport files are required | |||
ifneq ($(strip $(SPLIT_TRANSPORT)), custom) | |||
QUANTUM_SRC += $(QUANTUM_DIR)/split_common/transport.c \ | |||
$(QUANTUM_DIR)/split_common/transactions.c | |||
OPT_DEFS += -DSPLIT_COMMON_TRANSACTIONS | |||
# Functions added via QUANTUM_LIB_SRC are only included in the final binary if they're called. | |||
# Unused functions are pruned away, which is why we can add multiple drivers here without bloat. | |||
ifeq ($(PLATFORM),AVR) | |||
ifneq ($(NO_I2C),yes) | |||
QUANTUM_LIB_SRC += i2c_master.c \ | |||
i2c_slave.c | |||
endif | |||
endif | |||
SERIAL_DRIVER ?= bitbang | |||
OPT_DEFS += -DSERIAL_DRIVER_$(strip $(shell echo $(SERIAL_DRIVER) | tr '[:lower:]' '[:upper:]')) | |||
ifeq ($(strip $(SERIAL_DRIVER)), bitbang) | |||
QUANTUM_LIB_SRC += serial.c | |||
else | |||
QUANTUM_LIB_SRC += serial_$(strip $(SERIAL_DRIVER)).c | |||
endif | |||
endif | |||
COMMON_VPATH += $(QUANTUM_PATH)/split_common | |||
endif | |||
ifeq ($(strip $(CRC_ENABLE)), yes) | |||
OPT_DEFS += -DCRC_ENABLE | |||
SRC += crc.c | |||
endif | |||
ifeq ($(strip $(HAPTIC_ENABLE)),yes) | |||
COMMON_VPATH += $(DRIVER_PATH)/haptic | |||
ifneq ($(filter DRV2605L, $(HAPTIC_DRIVER)), ) | |||
SRC += DRV2605L.c | |||
QUANTUM_LIB_SRC += i2c_master.c | |||
OPT_DEFS += -DDRV2605L | |||
endif | |||
ifneq ($(filter SOLENOID, $(HAPTIC_DRIVER)), ) | |||
SRC += solenoid.c | |||
OPT_DEFS += -DSOLENOID_ENABLE | |||
endif | |||
endif | |||
ifeq ($(strip $(HD44780_ENABLE)), yes) | |||
OPT_DEFS += -DHD44780_ENABLE | |||
COMMON_VPATH += $(DRIVER_PATH)/lcd | |||
SRC += hd44780.c | |||
endif | |||
VALID_OLED_DRIVER_TYPES := SSD1306 custom | |||
OLED_DRIVER ?= SSD1306 | |||
ifeq ($(strip $(OLED_ENABLE)), yes) | |||
ifeq ($(filter $(OLED_DRIVER),$(VALID_OLED_DRIVER_TYPES)),) | |||
$(call CATASTROPHIC_ERROR,Invalid OLED_DRIVER,OLED_DRIVER="$(OLED_DRIVER)" is not a valid OLED driver) | |||
else | |||
OPT_DEFS += -DOLED_ENABLE | |||
COMMON_VPATH += $(DRIVER_PATH)/oled | |||
OPT_DEFS += -DOLED_DRIVER_$(strip $(shell echo $(OLED_DRIVER) | tr '[:lower:]' '[:upper:]')) | |||
ifeq ($(strip $(OLED_DRIVER)), SSD1306) | |||
SRC += ssd1306_sh1106.c | |||
QUANTUM_LIB_SRC += i2c_master.c | |||
endif | |||
endif | |||
endif | |||
ifeq ($(strip $(ST7565_ENABLE)), yes) | |||
OPT_DEFS += -DST7565_ENABLE | |||
COMMON_VPATH += $(DRIVER_PATH)/oled # For glcdfont.h | |||
COMMON_VPATH += $(DRIVER_PATH)/lcd | |||
QUANTUM_LIB_SRC += spi_master.c | |||
SRC += st7565.c | |||
endif | |||
ifeq ($(strip $(UCIS_ENABLE)), yes) | |||
OPT_DEFS += -DUCIS_ENABLE | |||
UNICODE_COMMON := yes | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_ucis.c | |||
endif | |||
ifeq ($(strip $(UNICODEMAP_ENABLE)), yes) | |||
OPT_DEFS += -DUNICODEMAP_ENABLE | |||
UNICODE_COMMON := yes | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_unicodemap.c | |||
endif | |||
ifeq ($(strip $(UNICODE_ENABLE)), yes) | |||
OPT_DEFS += -DUNICODE_ENABLE | |||
UNICODE_COMMON := yes | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_unicode.c | |||
endif | |||
ifeq ($(strip $(UNICODE_COMMON)), yes) | |||
OPT_DEFS += -DUNICODE_COMMON_ENABLE | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_unicode_common.c \ | |||
$(QUANTUM_DIR)/utf8.c | |||
endif | |||
MAGIC_ENABLE ?= yes | |||
ifeq ($(strip $(MAGIC_ENABLE)), yes) | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_magic.c | |||
OPT_DEFS += -DMAGIC_KEYCODE_ENABLE | |||
endif | |||
ifeq ($(strip $(AUTO_SHIFT_ENABLE)), yes) | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_auto_shift.c | |||
OPT_DEFS += -DAUTO_SHIFT_ENABLE | |||
ifeq ($(strip $(AUTO_SHIFT_MODIFIERS)), yes) | |||
OPT_DEFS += -DAUTO_SHIFT_MODIFIERS | |||
endif | |||
endif | |||
ifeq ($(strip $(PS2_MOUSE_ENABLE)), yes) | |||
PS2_ENABLE := yes | |||
SRC += ps2_mouse.c | |||
OPT_DEFS += -DPS2_MOUSE_ENABLE | |||
OPT_DEFS += -DMOUSE_ENABLE | |||
endif | |||
ifeq ($(strip $(PS2_USE_BUSYWAIT)), yes) | |||
PS2_ENABLE := yes | |||
SRC += ps2_busywait.c | |||
SRC += ps2_io.c | |||
OPT_DEFS += -DPS2_USE_BUSYWAIT | |||
endif | |||
ifeq ($(strip $(PS2_USE_INT)), yes) | |||
PS2_ENABLE := yes | |||
SRC += ps2_interrupt.c | |||
SRC += ps2_io.c | |||
OPT_DEFS += -DPS2_USE_INT | |||
endif | |||
ifeq ($(strip $(PS2_USE_USART)), yes) | |||
PS2_ENABLE := yes | |||
SRC += ps2_usart.c | |||
SRC += ps2_io.c | |||
OPT_DEFS += -DPS2_USE_USART | |||
endif | |||
ifeq ($(strip $(PS2_ENABLE)), yes) | |||
COMMON_VPATH += $(DRIVER_PATH)/ps2 | |||
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/ps2 | |||
OPT_DEFS += -DPS2_ENABLE | |||
endif | |||
JOYSTICK_ENABLE ?= no | |||
VALID_JOYSTICK_TYPES := analog digital | |||
JOYSTICK_DRIVER ?= analog | |||
ifeq ($(strip $(JOYSTICK_ENABLE)), yes) | |||
ifeq ($(filter $(JOYSTICK_DRIVER),$(VALID_JOYSTICK_TYPES)),) | |||
$(call CATASTROPHIC_ERROR,Invalid JOYSTICK_DRIVER,JOYSTICK_DRIVER="$(JOYSTICK_DRIVER)" is not a valid joystick driver) | |||
endif | |||
OPT_DEFS += -DJOYSTICK_ENABLE | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_joystick.c | |||
SRC += $(QUANTUM_DIR)/joystick.c | |||
ifeq ($(strip $(JOYSTICK_DRIVER)), analog) | |||
OPT_DEFS += -DANALOG_JOYSTICK_ENABLE | |||
SRC += analog.c | |||
endif | |||
ifeq ($(strip $(JOYSTICK_DRIVER)), digital) | |||
OPT_DEFS += -DDIGITAL_JOYSTICK_ENABLE | |||
endif | |||
endif | |||
USBPD_ENABLE ?= no | |||
VALID_USBPD_DRIVER_TYPES = custom vendor | |||
USBPD_DRIVER ?= vendor | |||
ifeq ($(strip $(USBPD_ENABLE)), yes) | |||
ifeq ($(filter $(strip $(USBPD_DRIVER)),$(VALID_USBPD_DRIVER_TYPES)),) | |||
$(call CATASTROPHIC_ERROR,Invalid USBPD_DRIVER,USBPD_DRIVER="$(USBPD_DRIVER)" is not a valid USBPD driver) | |||
else | |||
OPT_DEFS += -DUSBPD_ENABLE | |||
ifeq ($(strip $(USBPD_DRIVER)), vendor) | |||
# Vendor-specific implementations | |||
OPT_DEFS += -DUSBPD_VENDOR | |||
ifeq ($(strip $(MCU_SERIES)), STM32G4xx) | |||
OPT_DEFS += -DUSBPD_STM32G4 | |||
SRC += usbpd_stm32g4.c | |||
else | |||
$(call CATASTROPHIC_ERROR,Invalid USBPD_DRIVER,There is no vendor-provided USBPD driver available) | |||
endif | |||
else ifeq ($(strip $(USBPD_DRIVER)), custom) | |||
OPT_DEFS += -DUSBPD_CUSTOM | |||
# Board designers can add their own driver to $(SRC) | |||
endif | |||
endif | |||
endif | |||
BLUETOOTH_ENABLE ?= no | |||
VALID_BLUETOOTH_DRIVER_TYPES := BluefruitLE RN42 custom | |||
ifeq ($(strip $(BLUETOOTH_ENABLE)), yes) | |||
ifeq ($(filter $(strip $(BLUETOOTH_DRIVER)),$(VALID_BLUETOOTH_DRIVER_TYPES)),) | |||
$(call CATASTROPHIC_ERROR,Invalid BLUETOOTH_DRIVER,BLUETOOTH_DRIVER="$(BLUETOOTH_DRIVER)" is not a valid Bluetooth driver type) | |||
endif | |||
OPT_DEFS += -DBLUETOOTH_ENABLE | |||
NO_USB_STARTUP_CHECK := yes | |||
COMMON_VPATH += $(DRIVER_PATH)/bluetooth | |||
SRC += outputselect.c | |||
ifeq ($(strip $(BLUETOOTH_DRIVER)), BluefruitLE) | |||
OPT_DEFS += -DBLUETOOTH_BLUEFRUIT_LE | |||
SRC += analog.c | |||
SRC += $(DRIVER_PATH)/bluetooth/bluefruit_le.cpp | |||
QUANTUM_LIB_SRC += spi_master.c | |||
endif | |||
ifeq ($(strip $(BLUETOOTH_DRIVER)), RN42) | |||
OPT_DEFS += -DBLUETOOTH_RN42 | |||
SRC += $(DRIVER_PATH)/bluetooth/rn42.c | |||
QUANTUM_LIB_SRC += uart.c | |||
endif | |||
endif |
@ -0,0 +1,523 @@ | |||
# 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 --output $(BUILD_DIR)/$(TARGET).uf2 --convert --family $(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; | |||
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 |
@ -0,0 +1,37 @@ | |||
# Note for new boards -- CTPC and CONVERT_TO_PROTON_C are deprecated terms | |||
# and should not be replicated for new boards. These will be removed from | |||
# documentation as well as existing keymaps in due course. | |||
ifeq ($(strip $(CTPC)), yes) | |||
CONVERT_TO_PROTON_C=yes | |||
endif | |||
ifeq ($(strip $(CONVERT_TO_PROTON_C)), yes) | |||
CONVERT_TO=proton_c | |||
cpfirmware: ctpc_warning | |||
.INTERMEDIATE: ctpc_warning | |||
ctpc_warning: elf | |||
$(info @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@) | |||
$(info The `CONVERT_TO_PROTON_C` and `CTPC` options are soon to be deprecated.) | |||
$(info Boards should be changed to use `CONVERT_TO=proton_c` instead.) | |||
$(info @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@) | |||
endif | |||
# TODO: opt in rather than assume everything uses a pro micro | |||
PIN_COMPATIBLE ?= promicro | |||
ifneq ($(CONVERT_TO),) | |||
# glob to search each platfrorm and/or check for valid converter | |||
CONVERTER := $(wildcard $(PLATFORM_PATH)/*/converters/$(PIN_COMPATIBLE)_to_$(CONVERT_TO)/) | |||
ifeq ($(CONVERTER),) | |||
$(call CATASTROPHIC_ERROR,Converting from '$(PIN_COMPATIBLE)' to '$(CONVERT_TO)' not possible!) | |||
endif | |||
TARGET := $(TARGET)_$(CONVERT_TO) | |||
# Configure any defaults | |||
OPT_DEFS += -DCONVERT_TO_$(strip $(shell echo $(CONVERT_TO) | tr '[:lower:]' '[:upper:]')) | |||
OPT_DEFS += -DCONVERTER_ENABLED | |||
VPATH += $(CONVERTER) | |||
# Finally run any converter specific logic | |||
include $(CONVERTER)/converter.mk | |||
endif |
@ -0,0 +1,20 @@ | |||
TEST_LIST = $(sort $(patsubst %/test.mk,%, $(shell find $(ROOT_DIR)tests -type f -name test.mk))) | |||
FULL_TESTS := $(notdir $(TEST_LIST)) | |||
include $(QUANTUM_PATH)/debounce/tests/testlist.mk | |||
include $(QUANTUM_PATH)/encoder/tests/testlist.mk | |||
include $(QUANTUM_PATH)/sequencer/tests/testlist.mk | |||
include $(PLATFORM_PATH)/test/testlist.mk | |||
define VALIDATE_TEST_LIST | |||
ifneq ($1,) | |||
ifeq ($$(findstring -,$1),-) | |||
$$(call CATASTROPHIC_ERROR,Invalid test name,Test names can't contain '-', but '$1' does.) | |||
else | |||
$$(eval $$(call VALIDATE_TEST_LIST,$$(firstword $2),$$(wordlist 2,9999,$2))) | |||
endif | |||
endif | |||
endef | |||
$(eval $(call VALIDATE_TEST_LIST,$(firstword $(TEST_LIST)),$(wordlist 2,9999,$(TEST_LIST)))) |
@ -1,745 +0,0 @@ | |||
# Copyright 2017 Fred Sundvik | |||
# | |||
# This program is free software: you can redistribute it and/or modify | |||
# it under the terms of the GNU General Public License as published by | |||
# the Free Software Foundation, either version 2 of the License, or | |||
# (at your option) any later version. | |||
# | |||
# This program is distributed in the hope that it will be useful, | |||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
# GNU General Public License for more details. | |||
# | |||
# You should have received a copy of the GNU General Public License | |||
# along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
QUANTUM_SRC += \ | |||
$(QUANTUM_DIR)/quantum.c \ | |||
$(QUANTUM_DIR)/send_string.c \ | |||
$(QUANTUM_DIR)/bitwise.c \ | |||
$(QUANTUM_DIR)/led.c \ | |||
$(QUANTUM_DIR)/action.c \ | |||
$(QUANTUM_DIR)/action_layer.c \ | |||
$(QUANTUM_DIR)/action_tapping.c \ | |||
$(QUANTUM_DIR)/action_util.c \ | |||
$(QUANTUM_DIR)/eeconfig.c \ | |||
$(QUANTUM_DIR)/keyboard.c \ | |||
$(QUANTUM_DIR)/keymap_common.c \ | |||
$(QUANTUM_DIR)/keycode_config.c \ | |||
$(QUANTUM_DIR)/sync_timer.c \ | |||
$(QUANTUM_DIR)/logging/debug.c \ | |||
$(QUANTUM_DIR)/logging/sendchar.c \ | |||
VPATH += $(QUANTUM_DIR)/logging | |||
# Fall back to lib/printf if there is no platform provided print | |||
ifeq ("$(wildcard $(PLATFORM_PATH)/$(PLATFORM_KEY)/printf.mk)","") | |||
include $(QUANTUM_PATH)/logging/print.mk | |||
else | |||
include $(PLATFORM_PATH)/$(PLATFORM_KEY)/printf.mk | |||
endif | |||
ifeq ($(strip $(DEBUG_MATRIX_SCAN_RATE_ENABLE)), yes) | |||
OPT_DEFS += -DDEBUG_MATRIX_SCAN_RATE | |||
CONSOLE_ENABLE = yes | |||
else ifeq ($(strip $(DEBUG_MATRIX_SCAN_RATE_ENABLE)), api) | |||
OPT_DEFS += -DDEBUG_MATRIX_SCAN_RATE | |||
endif | |||
AUDIO_ENABLE ?= no | |||
ifeq ($(strip $(AUDIO_ENABLE)), yes) | |||
ifeq ($(PLATFORM),CHIBIOS) | |||
AUDIO_DRIVER ?= dac_basic | |||
ifeq ($(strip $(AUDIO_DRIVER)), dac_basic) | |||
OPT_DEFS += -DAUDIO_DRIVER_DAC | |||
else ifeq ($(strip $(AUDIO_DRIVER)), dac_additive) | |||
OPT_DEFS += -DAUDIO_DRIVER_DAC | |||
## stm32f2 and above have a usable DAC unit, f1 do not, and need to use pwm instead | |||
else ifeq ($(strip $(AUDIO_DRIVER)), pwm_software) | |||
OPT_DEFS += -DAUDIO_DRIVER_PWM | |||
else ifeq ($(strip $(AUDIO_DRIVER)), pwm_hardware) | |||
OPT_DEFS += -DAUDIO_DRIVER_PWM | |||
endif | |||
else | |||
# fallback for all other platforms is pwm | |||
AUDIO_DRIVER ?= pwm_hardware | |||
OPT_DEFS += -DAUDIO_DRIVER_PWM | |||
endif | |||
OPT_DEFS += -DAUDIO_ENABLE | |||
MUSIC_ENABLE = yes | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_audio.c | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_clicky.c | |||
SRC += $(QUANTUM_DIR)/audio/audio.c ## common audio code, hardware agnostic | |||
SRC += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/audio_$(strip $(AUDIO_DRIVER)).c | |||
SRC += $(QUANTUM_DIR)/audio/voices.c | |||
SRC += $(QUANTUM_DIR)/audio/luts.c | |||
endif | |||
ifeq ($(strip $(SEQUENCER_ENABLE)), yes) | |||
OPT_DEFS += -DSEQUENCER_ENABLE | |||
MUSIC_ENABLE = yes | |||
SRC += $(QUANTUM_DIR)/sequencer/sequencer.c | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_sequencer.c | |||
endif | |||
ifeq ($(strip $(MIDI_ENABLE)), yes) | |||
OPT_DEFS += -DMIDI_ENABLE | |||
MUSIC_ENABLE = yes | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_midi.c | |||
endif | |||
MUSIC_ENABLE ?= no | |||
ifeq ($(MUSIC_ENABLE), yes) | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_music.c | |||
endif | |||
ifeq ($(strip $(STENO_ENABLE)), yes) | |||
OPT_DEFS += -DSTENO_ENABLE | |||
VIRTSER_ENABLE ?= yes | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_steno.c | |||
endif | |||
ifeq ($(strip $(VIRTSER_ENABLE)), yes) | |||
OPT_DEFS += -DVIRTSER_ENABLE | |||
endif | |||
ifeq ($(strip $(MOUSEKEY_ENABLE)), yes) | |||
OPT_DEFS += -DMOUSEKEY_ENABLE | |||
MOUSE_ENABLE := yes | |||
SRC += $(QUANTUM_DIR)/mousekey.c | |||
endif | |||
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 ($(filter $(POINTING_DEVICE_DRIVER),$(VALID_POINTING_DEVICE_DRIVER_TYPES)),) | |||
$(error POINTING_DEVICE_DRIVER="$(POINTING_DEVICE_DRIVER)" is not a valid pointing device type) | |||
else | |||
OPT_DEFS += -DPOINTING_DEVICE_ENABLE | |||
MOUSE_ENABLE := yes | |||
SRC += $(QUANTUM_DIR)/pointing_device.c | |||
SRC += $(QUANTUM_DIR)/pointing_device_drivers.c | |||
ifneq ($(strip $(POINTING_DEVICE_DRIVER)), custom) | |||
SRC += drivers/sensors/$(strip $(POINTING_DEVICE_DRIVER)).c | |||
OPT_DEFS += -DPOINTING_DEVICE_DRIVER_$(strip $(shell echo $(POINTING_DEVICE_DRIVER) | tr '[:lower:]' '[:upper:]')) | |||
endif | |||
OPT_DEFS += -DPOINTING_DEVICE_DRIVER_$(strip $(POINTING_DEVICE_DRIVER)) | |||
ifeq ($(strip $(POINTING_DEVICE_DRIVER)), adns9800) | |||
OPT_DEFS += -DSTM32_SPI -DHAL_USE_SPI=TRUE | |||
QUANTUM_LIB_SRC += spi_master.c | |||
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), analog_joystick) | |||
OPT_DEFS += -DSTM32_ADC -DHAL_USE_ADC=TRUE | |||
LIB_SRC += analog.c | |||
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), cirque_pinnacle_i2c) | |||
OPT_DEFS += -DSTM32_I2C -DHAL_USE_I2C=TRUE | |||
SRC += drivers/sensors/cirque_pinnacle.c | |||
QUANTUM_LIB_SRC += i2c_master.c | |||
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), cirque_pinnacle_spi) | |||
OPT_DEFS += -DSTM32_SPI -DHAL_USE_SPI=TRUE | |||
SRC += drivers/sensors/cirque_pinnacle.c | |||
QUANTUM_LIB_SRC += spi_master.c | |||
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), pimoroni_trackball) | |||
OPT_DEFS += -DSTM32_SPI -DHAL_USE_I2C=TRUE | |||
QUANTUM_LIB_SRC += i2c_master.c | |||
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), pmw3360) | |||
OPT_DEFS += -DSTM32_SPI -DHAL_USE_SPI=TRUE | |||
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 | |||
VALID_EEPROM_DRIVER_TYPES := vendor custom transient i2c spi | |||
EEPROM_DRIVER ?= vendor | |||
ifeq ($(filter $(EEPROM_DRIVER),$(VALID_EEPROM_DRIVER_TYPES)),) | |||
$(error EEPROM_DRIVER="$(EEPROM_DRIVER)" is not a valid EEPROM driver) | |||
else | |||
OPT_DEFS += -DEEPROM_ENABLE | |||
ifeq ($(strip $(EEPROM_DRIVER)), custom) | |||
# Custom EEPROM implementation -- only needs to implement init/erase/read_block/write_block | |||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_CUSTOM | |||
COMMON_VPATH += $(DRIVER_PATH)/eeprom | |||
SRC += eeprom_driver.c | |||
else ifeq ($(strip $(EEPROM_DRIVER)), i2c) | |||
# External I2C EEPROM implementation | |||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_I2C | |||
COMMON_VPATH += $(DRIVER_PATH)/eeprom | |||
QUANTUM_LIB_SRC += i2c_master.c | |||
SRC += eeprom_driver.c eeprom_i2c.c | |||
else ifeq ($(strip $(EEPROM_DRIVER)), spi) | |||
# External SPI EEPROM implementation | |||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_SPI | |||
COMMON_VPATH += $(DRIVER_PATH)/eeprom | |||
QUANTUM_LIB_SRC += spi_master.c | |||
SRC += eeprom_driver.c eeprom_spi.c | |||
else ifeq ($(strip $(EEPROM_DRIVER)), transient) | |||
# Transient EEPROM implementation -- no data storage but provides runtime area for it | |||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT | |||
COMMON_VPATH += $(DRIVER_PATH)/eeprom | |||
SRC += eeprom_driver.c eeprom_transient.c | |||
else ifeq ($(strip $(EEPROM_DRIVER)), vendor) | |||
# Vendor-implemented EEPROM | |||
OPT_DEFS += -DEEPROM_VENDOR | |||
ifeq ($(PLATFORM),AVR) | |||
# Automatically provided by avr-libc, nothing required | |||
else ifeq ($(PLATFORM),CHIBIOS) | |||
ifneq ($(filter STM32F3xx_% STM32F1xx_% %_STM32F401xC %_STM32F401xE %_STM32F405xG %_STM32F411xE %_STM32F072xB %_STM32F042x6 %_GD32VF103xB %_GD32VF103x8, $(MCU_SERIES)_$(MCU_LDSCRIPT)),) | |||
# Emulated EEPROM | |||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_STM32_FLASH_EMULATED | |||
COMMON_VPATH += $(DRIVER_PATH)/eeprom | |||
SRC += eeprom_driver.c | |||
SRC += $(PLATFORM_COMMON_DIR)/eeprom_stm32.c | |||
SRC += $(PLATFORM_COMMON_DIR)/flash_stm32.c | |||
else ifneq ($(filter $(MCU_SERIES),STM32L0xx STM32L1xx),) | |||
# True EEPROM on STM32L0xx, L1xx | |||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_STM32_L0_L1 | |||
COMMON_VPATH += $(DRIVER_PATH)/eeprom | |||
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/eeprom | |||
SRC += eeprom_driver.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 | |||
# Fall back to transient, i.e. non-persistent | |||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT | |||
COMMON_VPATH += $(DRIVER_PATH)/eeprom | |||
SRC += eeprom_driver.c eeprom_transient.c | |||
endif | |||
else ifeq ($(PLATFORM),ARM_ATSAM) | |||
# arm_atsam EEPROM | |||
OPT_DEFS += -DEEPROM_SAMD | |||
SRC += $(PLATFORM_COMMON_DIR)/eeprom_samd.c | |||
else ifeq ($(PLATFORM),TEST) | |||
# Test harness "EEPROM" | |||
OPT_DEFS += -DEEPROM_TEST_HARNESS | |||
SRC += $(PLATFORM_COMMON_DIR)/eeprom.c | |||
endif | |||
endif | |||
endif | |||
RGBLIGHT_ENABLE ?= no | |||
VALID_RGBLIGHT_TYPES := WS2812 APA102 custom | |||
ifeq ($(strip $(RGBLIGHT_CUSTOM_DRIVER)), yes) | |||
RGBLIGHT_DRIVER ?= custom | |||
endif | |||
ifeq ($(strip $(RGBLIGHT_ENABLE)), yes) | |||
RGBLIGHT_DRIVER ?= WS2812 | |||
ifeq ($(filter $(RGBLIGHT_DRIVER),$(VALID_RGBLIGHT_TYPES)),) | |||
$(error RGBLIGHT_DRIVER="$(RGBLIGHT_DRIVER)" is not a valid RGB type) | |||
else | |||
COMMON_VPATH += $(QUANTUM_DIR)/rgblight | |||
POST_CONFIG_H += $(QUANTUM_DIR)/rgblight/rgblight_post_config.h | |||
OPT_DEFS += -DRGBLIGHT_ENABLE | |||
SRC += $(QUANTUM_DIR)/color.c | |||
SRC += $(QUANTUM_DIR)/rgblight/rgblight.c | |||
CIE1931_CURVE := yes | |||
RGB_KEYCODES_ENABLE := yes | |||
endif | |||
ifeq ($(strip $(RGBLIGHT_DRIVER)), WS2812) | |||
WS2812_DRIVER_REQUIRED := yes | |||
endif | |||
ifeq ($(strip $(RGBLIGHT_DRIVER)), APA102) | |||
APA102_DRIVER_REQUIRED := yes | |||
endif | |||
ifeq ($(strip $(RGBLIGHT_DRIVER)), custom) | |||
OPT_DEFS += -DRGBLIGHT_CUSTOM_DRIVER | |||
endif | |||
endif | |||
LED_MATRIX_ENABLE ?= no | |||
VALID_LED_MATRIX_TYPES := IS31FL3731 custom | |||
# TODO: IS31FL3733 IS31FL3737 IS31FL3741 | |||
ifeq ($(strip $(LED_MATRIX_ENABLE)), yes) | |||
ifeq ($(filter $(LED_MATRIX_DRIVER),$(VALID_LED_MATRIX_TYPES)),) | |||
$(error "$(LED_MATRIX_DRIVER)" is not a valid matrix type) | |||
endif | |||
OPT_DEFS += -DLED_MATRIX_ENABLE | |||
ifneq (,$(filter $(MCU), atmega16u2 atmega32u2 at90usb162)) | |||
# ATmegaxxU2 does not have hardware MUL instruction - lib8tion must be told to use software multiplication routines | |||
OPT_DEFS += -DLIB8_ATTINY | |||
endif | |||
COMMON_VPATH += $(QUANTUM_DIR)/led_matrix | |||
COMMON_VPATH += $(QUANTUM_DIR)/led_matrix/animations | |||
COMMON_VPATH += $(QUANTUM_DIR)/led_matrix/animations/runners | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_backlight.c | |||
SRC += $(QUANTUM_DIR)/led_matrix/led_matrix.c | |||
SRC += $(QUANTUM_DIR)/led_matrix/led_matrix_drivers.c | |||
SRC += $(LIB_PATH)/lib8tion/lib8tion.c | |||
CIE1931_CURVE := yes | |||
ifeq ($(strip $(LED_MATRIX_DRIVER)), IS31FL3731) | |||
OPT_DEFS += -DIS31FL3731 -DSTM32_I2C -DHAL_USE_I2C=TRUE | |||
COMMON_VPATH += $(DRIVER_PATH)/led/issi | |||
SRC += is31fl3731-simple.c | |||
QUANTUM_LIB_SRC += i2c_master.c | |||
endif | |||
endif | |||
RGB_MATRIX_ENABLE ?= no | |||
VALID_RGB_MATRIX_TYPES := AW20216 IS31FL3731 IS31FL3733 IS31FL3737 IS31FL3741 CKLED2001 WS2812 custom | |||
ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes) | |||
ifeq ($(filter $(RGB_MATRIX_DRIVER),$(VALID_RGB_MATRIX_TYPES)),) | |||
$(error "$(RGB_MATRIX_DRIVER)" is not a valid matrix type) | |||
endif | |||
OPT_DEFS += -DRGB_MATRIX_ENABLE | |||
ifneq (,$(filter $(MCU), atmega16u2 atmega32u2 at90usb162)) | |||
# ATmegaxxU2 does not have hardware MUL instruction - lib8tion must be told to use software multiplication routines | |||
OPT_DEFS += -DLIB8_ATTINY | |||
endif | |||
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix | |||
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix/animations | |||
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix/animations/runners | |||
SRC += $(QUANTUM_DIR)/color.c | |||
SRC += $(QUANTUM_DIR)/rgb_matrix/rgb_matrix.c | |||
SRC += $(QUANTUM_DIR)/rgb_matrix/rgb_matrix_drivers.c | |||
SRC += $(LIB_PATH)/lib8tion/lib8tion.c | |||
CIE1931_CURVE := yes | |||
RGB_KEYCODES_ENABLE := yes | |||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), AW20216) | |||
OPT_DEFS += -DAW20216 -DSTM32_SPI -DHAL_USE_SPI=TRUE | |||
COMMON_VPATH += $(DRIVER_PATH)/led | |||
SRC += aw20216.c | |||
QUANTUM_LIB_SRC += spi_master.c | |||
endif | |||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), IS31FL3731) | |||
OPT_DEFS += -DIS31FL3731 -DSTM32_I2C -DHAL_USE_I2C=TRUE | |||
COMMON_VPATH += $(DRIVER_PATH)/led/issi | |||
SRC += is31fl3731.c | |||
QUANTUM_LIB_SRC += i2c_master.c | |||
endif | |||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), IS31FL3733) | |||
OPT_DEFS += -DIS31FL3733 -DSTM32_I2C -DHAL_USE_I2C=TRUE | |||
COMMON_VPATH += $(DRIVER_PATH)/led/issi | |||
SRC += is31fl3733.c | |||
QUANTUM_LIB_SRC += i2c_master.c | |||
endif | |||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), IS31FL3737) | |||
OPT_DEFS += -DIS31FL3737 -DSTM32_I2C -DHAL_USE_I2C=TRUE | |||
COMMON_VPATH += $(DRIVER_PATH)/led/issi | |||
SRC += is31fl3737.c | |||
QUANTUM_LIB_SRC += i2c_master.c | |||
endif | |||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), IS31FL3741) | |||
OPT_DEFS += -DIS31FL3741 -DSTM32_I2C -DHAL_USE_I2C=TRUE | |||
COMMON_VPATH += $(DRIVER_PATH)/led/issi | |||
SRC += is31fl3741.c | |||
QUANTUM_LIB_SRC += i2c_master.c | |||
endif | |||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), CKLED2001) | |||
OPT_DEFS += -DCKLED2001 -DSTM32_I2C -DHAL_USE_I2C=TRUE | |||
COMMON_VPATH += $(DRIVER_PATH)/led | |||
SRC += ckled2001.c | |||
QUANTUM_LIB_SRC += i2c_master.c | |||
endif | |||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), WS2812) | |||
OPT_DEFS += -DWS2812 | |||
WS2812_DRIVER_REQUIRED := yes | |||
endif | |||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), APA102) | |||
OPT_DEFS += -DAPA102 | |||
APA102_DRIVER_REQUIRED := yes | |||
endif | |||
ifeq ($(strip $(RGB_MATRIX_CUSTOM_KB)), yes) | |||
OPT_DEFS += -DRGB_MATRIX_CUSTOM_KB | |||
endif | |||
ifeq ($(strip $(RGB_MATRIX_CUSTOM_USER)), yes) | |||
OPT_DEFS += -DRGB_MATRIX_CUSTOM_USER | |||
endif | |||
endif | |||
ifeq ($(strip $(RGB_KEYCODES_ENABLE)), yes) | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_rgb.c | |||
endif | |||
ifeq ($(strip $(PRINTING_ENABLE)), yes) | |||
OPT_DEFS += -DPRINTING_ENABLE | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_printer.c | |||
QUANTUM_LIB_SRC += uart.c | |||
endif | |||
VARIABLE_TRACE ?= no | |||
ifneq ($(strip $(VARIABLE_TRACE)),no) | |||
SRC += $(QUANTUM_DIR)/variable_trace.c | |||
OPT_DEFS += -DNUM_TRACED_VARIABLES=$(strip $(VARIABLE_TRACE)) | |||
ifneq ($(strip $(MAX_VARIABLE_TRACE_SIZE)),) | |||
OPT_DEFS += -DMAX_VARIABLE_TRACE_SIZE=$(strip $(MAX_VARIABLE_TRACE_SIZE)) | |||
endif | |||
endif | |||
ifeq ($(strip $(SLEEP_LED_ENABLE)), yes) | |||
SRC += $(PLATFORM_COMMON_DIR)/sleep_led.c | |||
OPT_DEFS += -DSLEEP_LED_ENABLE | |||
NO_SUSPEND_POWER_DOWN := yes | |||
endif | |||
VALID_BACKLIGHT_TYPES := pwm timer software custom | |||
BACKLIGHT_ENABLE ?= no | |||
ifeq ($(strip $(CONVERT_TO_PROTON_C)), yes) | |||
BACKLIGHT_DRIVER ?= software | |||
else | |||
BACKLIGHT_DRIVER ?= pwm | |||
endif | |||
ifeq ($(strip $(BACKLIGHT_ENABLE)), yes) | |||
ifeq ($(filter $(BACKLIGHT_DRIVER),$(VALID_BACKLIGHT_TYPES)),) | |||
$(error BACKLIGHT_DRIVER="$(BACKLIGHT_DRIVER)" is not a valid backlight type) | |||
endif | |||
COMMON_VPATH += $(QUANTUM_DIR)/backlight | |||
SRC += $(QUANTUM_DIR)/backlight/backlight.c | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_backlight.c | |||
OPT_DEFS += -DBACKLIGHT_ENABLE | |||
ifeq ($(strip $(BACKLIGHT_DRIVER)), custom) | |||
OPT_DEFS += -DBACKLIGHT_CUSTOM_DRIVER | |||
else | |||
SRC += $(QUANTUM_DIR)/backlight/backlight_driver_common.c | |||
ifeq ($(strip $(BACKLIGHT_DRIVER)), pwm) | |||
SRC += $(QUANTUM_DIR)/backlight/backlight_$(PLATFORM_KEY).c | |||
else | |||
SRC += $(QUANTUM_DIR)/backlight/backlight_$(strip $(BACKLIGHT_DRIVER)).c | |||
endif | |||
endif | |||
endif | |||
VALID_WS2812_DRIVER_TYPES := bitbang pwm spi i2c | |||
WS2812_DRIVER ?= bitbang | |||
ifeq ($(strip $(WS2812_DRIVER_REQUIRED)), yes) | |||
ifeq ($(filter $(WS2812_DRIVER),$(VALID_WS2812_DRIVER_TYPES)),) | |||
$(error WS2812_DRIVER="$(WS2812_DRIVER)" is not a valid WS2812 driver) | |||
endif | |||
OPT_DEFS += -DWS2812_DRIVER_$(strip $(shell echo $(WS2812_DRIVER) | tr '[:lower:]' '[:upper:]')) | |||
ifeq ($(strip $(WS2812_DRIVER)), bitbang) | |||
SRC += ws2812.c | |||
else | |||
SRC += ws2812_$(strip $(WS2812_DRIVER)).c | |||
ifeq ($(strip $(PLATFORM)), CHIBIOS) | |||
ifeq ($(strip $(WS2812_DRIVER)), pwm) | |||
OPT_DEFS += -DSTM32_DMA_REQUIRED=TRUE | |||
endif | |||
endif | |||
endif | |||
# add extra deps | |||
ifeq ($(strip $(WS2812_DRIVER)), i2c) | |||
QUANTUM_LIB_SRC += i2c_master.c | |||
endif | |||
endif | |||
ifeq ($(strip $(APA102_DRIVER_REQUIRED)), yes) | |||
COMMON_VPATH += $(DRIVER_PATH)/led | |||
SRC += apa102.c | |||
endif | |||
ifeq ($(strip $(CIE1931_CURVE)), yes) | |||
OPT_DEFS += -DUSE_CIE1931_CURVE | |||
LED_TABLES := yes | |||
endif | |||
ifeq ($(strip $(LED_TABLES)), yes) | |||
SRC += $(QUANTUM_DIR)/led_tables.c | |||
endif | |||
ifeq ($(strip $(TERMINAL_ENABLE)), yes) | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_terminal.c | |||
OPT_DEFS += -DTERMINAL_ENABLE | |||
OPT_DEFS += -DUSER_PRINT | |||
endif | |||
ifeq ($(strip $(VIA_ENABLE)), yes) | |||
DYNAMIC_KEYMAP_ENABLE := yes | |||
RAW_ENABLE := yes | |||
BOOTMAGIC_ENABLE := yes | |||
SRC += $(QUANTUM_DIR)/via.c | |||
OPT_DEFS += -DVIA_ENABLE | |||
endif | |||
VALID_MAGIC_TYPES := yes | |||
BOOTMAGIC_ENABLE ?= no | |||
ifneq ($(strip $(BOOTMAGIC_ENABLE)), no) | |||
ifeq ($(filter $(BOOTMAGIC_ENABLE),$(VALID_MAGIC_TYPES)),) | |||
$(error BOOTMAGIC_ENABLE="$(BOOTMAGIC_ENABLE)" is not a valid type of magic) | |||
endif | |||
ifneq ($(strip $(BOOTMAGIC_ENABLE)), no) | |||
OPT_DEFS += -DBOOTMAGIC_LITE | |||
QUANTUM_SRC += $(QUANTUM_DIR)/bootmagic/bootmagic_lite.c | |||
endif | |||
endif | |||
COMMON_VPATH += $(QUANTUM_DIR)/bootmagic | |||
QUANTUM_SRC += $(QUANTUM_DIR)/bootmagic/magic.c | |||
VALID_CUSTOM_MATRIX_TYPES:= yes lite no | |||
CUSTOM_MATRIX ?= no | |||
ifneq ($(strip $(CUSTOM_MATRIX)), yes) | |||
ifeq ($(filter $(CUSTOM_MATRIX),$(VALID_CUSTOM_MATRIX_TYPES)),) | |||
$(error CUSTOM_MATRIX="$(CUSTOM_MATRIX)" is not a valid custom matrix type) | |||
endif | |||
# Include common stuff for all non custom matrix users | |||
QUANTUM_SRC += $(QUANTUM_DIR)/matrix_common.c | |||
# if 'lite' then skip the actual matrix implementation | |||
ifneq ($(strip $(CUSTOM_MATRIX)), lite) | |||
# Include the standard or split matrix code if needed | |||
QUANTUM_SRC += $(QUANTUM_DIR)/matrix.c | |||
endif | |||
endif | |||
# Debounce Modules. Set DEBOUNCE_TYPE=custom if including one manually. | |||
DEBOUNCE_TYPE ?= sym_defer_g | |||
ifneq ($(strip $(DEBOUNCE_TYPE)), custom) | |||
QUANTUM_SRC += $(QUANTUM_DIR)/debounce/$(strip $(DEBOUNCE_TYPE)).c | |||
endif | |||
ifeq ($(strip $(SPLIT_KEYBOARD)), yes) | |||
POST_CONFIG_H += $(QUANTUM_DIR)/split_common/post_config.h | |||
OPT_DEFS += -DSPLIT_KEYBOARD | |||
CRC_ENABLE := yes | |||
# Include files used by all split keyboards | |||
QUANTUM_SRC += $(QUANTUM_DIR)/split_common/split_util.c | |||
# Determine which (if any) transport files are required | |||
ifneq ($(strip $(SPLIT_TRANSPORT)), custom) | |||
QUANTUM_SRC += $(QUANTUM_DIR)/split_common/transport.c \ | |||
$(QUANTUM_DIR)/split_common/transactions.c | |||
OPT_DEFS += -DSPLIT_COMMON_TRANSACTIONS | |||
# Functions added via QUANTUM_LIB_SRC are only included in the final binary if they're called. | |||
# Unused functions are pruned away, which is why we can add multiple drivers here without bloat. | |||
ifeq ($(PLATFORM),AVR) | |||
ifneq ($(NO_I2C),yes) | |||
QUANTUM_LIB_SRC += i2c_master.c \ | |||
i2c_slave.c | |||
endif | |||
endif | |||
SERIAL_DRIVER ?= bitbang | |||
OPT_DEFS += -DSERIAL_DRIVER_$(strip $(shell echo $(SERIAL_DRIVER) | tr '[:lower:]' '[:upper:]')) | |||
ifeq ($(strip $(SERIAL_DRIVER)), bitbang) | |||
QUANTUM_LIB_SRC += serial.c | |||
else | |||
QUANTUM_LIB_SRC += serial_$(strip $(SERIAL_DRIVER)).c | |||
endif | |||
endif | |||
COMMON_VPATH += $(QUANTUM_PATH)/split_common | |||
endif | |||
ifeq ($(strip $(CRC_ENABLE)), yes) | |||
OPT_DEFS += -DCRC_ENABLE | |||
SRC += crc.c | |||
endif | |||
ifeq ($(strip $(HAPTIC_ENABLE)),yes) | |||
COMMON_VPATH += $(DRIVER_PATH)/haptic | |||
ifneq ($(filter DRV2605L, $(HAPTIC_DRIVER)), ) | |||
SRC += DRV2605L.c | |||
QUANTUM_LIB_SRC += i2c_master.c | |||
OPT_DEFS += -DDRV2605L | |||
endif | |||
ifneq ($(filter SOLENOID, $(HAPTIC_DRIVER)), ) | |||
SRC += solenoid.c | |||
OPT_DEFS += -DSOLENOID_ENABLE | |||
endif | |||
endif | |||
ifeq ($(strip $(HD44780_ENABLE)), yes) | |||
SRC += platforms/avr/drivers/hd44780.c | |||
OPT_DEFS += -DHD44780_ENABLE | |||
endif | |||
VALID_OLED_DRIVER_TYPES := SSD1306 custom | |||
OLED_DRIVER ?= SSD1306 | |||
ifeq ($(strip $(OLED_ENABLE)), yes) | |||
ifeq ($(filter $(OLED_DRIVER),$(VALID_OLED_DRIVER_TYPES)),) | |||
$(error OLED_DRIVER="$(OLED_DRIVER)" is not a valid OLED driver) | |||
else | |||
OPT_DEFS += -DOLED_ENABLE | |||
COMMON_VPATH += $(DRIVER_PATH)/oled | |||
OPT_DEFS += -DOLED_DRIVER_$(strip $(shell echo $(OLED_DRIVER) | tr '[:lower:]' '[:upper:]')) | |||
ifeq ($(strip $(OLED_DRIVER)), SSD1306) | |||
SRC += ssd1306_sh1106.c | |||
QUANTUM_LIB_SRC += i2c_master.c | |||
endif | |||
endif | |||
endif | |||
ifeq ($(strip $(ST7565_ENABLE)), yes) | |||
OPT_DEFS += -DST7565_ENABLE | |||
COMMON_VPATH += $(DRIVER_PATH)/oled # For glcdfont.h | |||
COMMON_VPATH += $(DRIVER_PATH)/lcd | |||
QUANTUM_LIB_SRC += spi_master.c | |||
SRC += st7565.c | |||
endif | |||
ifeq ($(strip $(UCIS_ENABLE)), yes) | |||
OPT_DEFS += -DUCIS_ENABLE | |||
UNICODE_COMMON := yes | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_ucis.c | |||
endif | |||
ifeq ($(strip $(UNICODEMAP_ENABLE)), yes) | |||
OPT_DEFS += -DUNICODEMAP_ENABLE | |||
UNICODE_COMMON := yes | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_unicodemap.c | |||
endif | |||
ifeq ($(strip $(UNICODE_ENABLE)), yes) | |||
OPT_DEFS += -DUNICODE_ENABLE | |||
UNICODE_COMMON := yes | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_unicode.c | |||
endif | |||
ifeq ($(strip $(UNICODE_COMMON)), yes) | |||
OPT_DEFS += -DUNICODE_COMMON_ENABLE | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_unicode_common.c | |||
endif | |||
MAGIC_ENABLE ?= yes | |||
ifeq ($(strip $(MAGIC_ENABLE)), yes) | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_magic.c | |||
OPT_DEFS += -DMAGIC_KEYCODE_ENABLE | |||
endif | |||
ifeq ($(strip $(AUTO_SHIFT_ENABLE)), yes) | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_auto_shift.c | |||
OPT_DEFS += -DAUTO_SHIFT_ENABLE | |||
ifeq ($(strip $(AUTO_SHIFT_MODIFIERS)), yes) | |||
OPT_DEFS += -DAUTO_SHIFT_MODIFIERS | |||
endif | |||
endif | |||
ifeq ($(strip $(PS2_MOUSE_ENABLE)), yes) | |||
PS2_ENABLE := yes | |||
SRC += ps2_mouse.c | |||
OPT_DEFS += -DPS2_MOUSE_ENABLE | |||
OPT_DEFS += -DMOUSE_ENABLE | |||
endif | |||
ifeq ($(strip $(PS2_USE_BUSYWAIT)), yes) | |||
PS2_ENABLE := yes | |||
SRC += ps2_busywait.c | |||
SRC += ps2_io_avr.c | |||
OPT_DEFS += -DPS2_USE_BUSYWAIT | |||
endif | |||
ifeq ($(strip $(PS2_USE_INT)), yes) | |||
PS2_ENABLE := yes | |||
SRC += ps2_interrupt.c | |||
SRC += ps2_io.c | |||
OPT_DEFS += -DPS2_USE_INT | |||
endif | |||
ifeq ($(strip $(PS2_USE_USART)), yes) | |||
PS2_ENABLE := yes | |||
SRC += ps2_usart.c | |||
SRC += ps2_io.c | |||
OPT_DEFS += -DPS2_USE_USART | |||
endif | |||
ifeq ($(strip $(PS2_ENABLE)), yes) | |||
COMMON_VPATH += $(DRIVER_PATH)/ps2 | |||
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/ps2 | |||
OPT_DEFS += -DPS2_ENABLE | |||
endif | |||
JOYSTICK_ENABLE ?= no | |||
VALID_JOYSTICK_TYPES := analog digital | |||
JOYSTICK_DRIVER ?= analog | |||
ifeq ($(strip $(JOYSTICK_ENABLE)), yes) | |||
ifeq ($(filter $(JOYSTICK_DRIVER),$(VALID_JOYSTICK_TYPES)),) | |||
$(error "$(JOYSTICK_DRIVER)" is not a valid joystick driver) | |||
endif | |||
OPT_DEFS += -DJOYSTICK_ENABLE | |||
SRC += $(QUANTUM_DIR)/process_keycode/process_joystick.c | |||
SRC += $(QUANTUM_DIR)/joystick.c | |||
ifeq ($(strip $(JOYSTICK_DRIVER)), analog) | |||
OPT_DEFS += -DANALOG_JOYSTICK_ENABLE | |||
SRC += analog.c | |||
endif | |||
ifeq ($(strip $(JOYSTICK_DRIVER)), digital) | |||
OPT_DEFS += -DDIGITAL_JOYSTICK_ENABLE | |||
endif | |||
endif | |||
USBPD_ENABLE ?= no | |||
VALID_USBPD_DRIVER_TYPES = custom vendor | |||
USBPD_DRIVER ?= vendor | |||
ifeq ($(strip $(USBPD_ENABLE)), yes) | |||
ifeq ($(filter $(strip $(USBPD_DRIVER)),$(VALID_USBPD_DRIVER_TYPES)),) | |||
$(error USBPD_DRIVER="$(USBPD_DRIVER)" is not a valid USBPD driver) | |||
else | |||
OPT_DEFS += -DUSBPD_ENABLE | |||
ifeq ($(strip $(USBPD_DRIVER)), vendor) | |||
# Vendor-specific implementations | |||
OPT_DEFS += -DUSBPD_VENDOR | |||
ifeq ($(strip $(MCU_SERIES)), STM32G4xx) | |||
OPT_DEFS += -DUSBPD_STM32G4 | |||
SRC += usbpd_stm32g4.c | |||
else | |||
$(error There is no vendor-provided USBPD driver available) | |||
endif | |||
else ifeq ($(strip $(USBPD_DRIVER)), custom) | |||
OPT_DEFS += -DUSBPD_CUSTOM | |||
# Board designers can add their own driver to $(SRC) | |||
endif | |||
endif | |||
endif | |||
BLUETOOTH_ENABLE ?= no | |||
VALID_BLUETOOTH_DRIVER_TYPES := BluefruitLE RN42 custom | |||
ifeq ($(strip $(BLUETOOTH_ENABLE)), yes) | |||
ifeq ($(filter $(strip $(BLUETOOTH_DRIVER)),$(VALID_BLUETOOTH_DRIVER_TYPES)),) | |||
$(error "$(BLUETOOTH_DRIVER)" is not a valid Bluetooth driver type) | |||
endif | |||
OPT_DEFS += -DBLUETOOTH_ENABLE | |||
NO_USB_STARTUP_CHECK := yes | |||
COMMON_VPATH += $(DRIVER_PATH)/bluetooth | |||
SRC += outputselect.c | |||
ifeq ($(strip $(BLUETOOTH_DRIVER)), BluefruitLE) | |||
OPT_DEFS += -DBLUETOOTH_BLUEFRUIT_LE | |||
SRC += analog.c | |||
SRC += $(DRIVER_PATH)/bluetooth/bluefruit_le.cpp | |||
QUANTUM_LIB_SRC += spi_master.c | |||
endif | |||
ifeq ($(strip $(BLUETOOTH_DRIVER)), RN42) | |||
OPT_DEFS += -DBLUETOOTH_RN42 | |||
SRC += $(DRIVER_PATH)/bluetooth/rn42.c | |||
QUANTUM_LIB_SRC += uart.c | |||
endif | |||
endif |
@ -0,0 +1,35 @@ | |||
{ | |||
"development_board": { | |||
"promicro": { | |||
"processor": "atmega32u4", | |||
"bootloader": "caterina", | |||
"pin_compatible": "promicro" | |||
}, | |||
"elite_c": { | |||
"processor": "atmega32u4", | |||
"bootloader": "atmel-dfu", | |||
"pin_compatible": "promicro" | |||
}, | |||
"proton_c": { | |||
"processor": "STM32F303", | |||
"bootloader": "stm32-dfu", | |||
"board": "QMK_PROTON_C", | |||
"pin_compatible": "promicro" | |||
}, | |||
"bluepill": { | |||
"processor": "STM32F103", | |||
"bootloader": "stm32duino", | |||
"board": "STM32_F103_STM32DUINO" | |||
}, | |||
"blackpill_f401": { | |||
"processor": "STM32F401", | |||
"bootloader": "stm32-dfu", | |||
"board": "BLACKPILL_STM32_F401" | |||
}, | |||
"blackpill_f411": { | |||
"processor": "STM32F411", | |||
"bootloader": "stm32-dfu", | |||
"board": "BLACKPILL_STM32_F411" | |||
} | |||
} | |||
} |
@ -1,134 +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 | |||
/* 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 |
@ -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 |
@ -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 | |||
} | |||
} |
@ -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 |
@ -0,0 +1 @@ | |||
# This file intentionally left blank |
@ -1,124 +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 | |||
/* 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 |
@ -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,13 +0,0 @@ | |||
### Split Common core now supports 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. | |||
This feature can be enabled with `#define SPLIT_POINTING_ENABLE` and one of the following options: | |||
| Setting | Description | | |||
|---------------------------|------------------------------------| | |||
|`POINTING_DEVICE_LEFT` | Pointing device on the left side | | |||
|`POINTING_DEVICE_RIGHT` | Pointing device on the right side | | |||
|`POINTING_DEVICE_COMBINED` | Pointing device on both sides | | |||
See the [Pointing Device](../feature_pointing_device.md) documentation for further configuration options. |
@ -1,57 +1,298 @@ | |||
# HD44780 LCD Displays | |||
This is an integration of Peter Fleury's LCD library. This page will explain the basics. [For in depth documentation visit his page.](http://www.peterfleury.epizy.com/doxygen/avr-gcc-libraries/group__pfleury__lcd.html) | |||
You can enable support for HD44780 Displays by setting the `HD44780_ENABLE` flag in your keyboards `rules.mk` to yes. | |||
## Configuration | |||
You will need to configure the pins used by your display, and its number of lines and columns in your keyboard's `config.h`. | |||
Uncomment the section labled HD44780 and change the parameters as needed. | |||
```` | |||
/* | |||
* HD44780 LCD Display Configuration | |||
*/ | |||
#define LCD_LINES 2 //< number of visible lines of the display | |||
#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display | |||
#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode | |||
#if LCD_IO_MODE | |||
#define LCD_PORT PORTB //< port for the LCD lines | |||
#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 | |||
#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 | |||
#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 | |||
#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 | |||
#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 | |||
#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 | |||
#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 | |||
#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 | |||
#define LCD_RS_PORT LCD_PORT //< port for RS line | |||
#define LCD_RS_PIN 3 //< pin for RS line | |||
#define LCD_RW_PORT LCD_PORT //< port for RW line | |||
#define LCD_RW_PIN 2 //< pin for RW line | |||
#define LCD_E_PORT LCD_PORT //< port for Enable line | |||
#define LCD_E_PIN 1 //< pin for Enable line | |||
#endif | |||
```` | |||
Should you need to configure other properties you can copy them from `quantum/hd44780.h` and set them in your `config.h` | |||
# HD44780 LCD Driver | |||
## Supported Hardware | |||
LCD modules using [HD44780U](https://www.sparkfun.com/datasheets/LCD/HD44780.pdf) IC or equivalent, communicating in 4-bit mode. | |||
|Module|Size |Notes | | |||
|------|--------------|---------------------------------| | |||
|1602A |16x2, 5x8 dots| | | |||
|2004A |20x4, 5x8 dots|Untested, not currently supported| | |||
To run these modules at 3.3V, an additional MAX660 voltage converter IC must be soldered on, along with two 10µF capacitors. See [this page](https://www.codrey.com/electronic-circuits/hack-your-16x2-lcd/) for more details. | |||
## Usage | |||
To initialize your display, call `lcd_init()` with one of these parameters: | |||
```` | |||
LCD_DISP_OFF : display off | |||
LCD_DISP_ON : display on, cursor off | |||
LCD_DISP_ON_CURSOR : display on, cursor on | |||
LCD_DISP_ON_CURSOR_BLINK : display on, cursor on flashing | |||
```` | |||
This is best done in your keyboards `matrix_init_kb` or your keymaps `matrix_init_user`. | |||
It is advised to clear the display before use. | |||
To do so call `lcd_clrscr()`. | |||
Add the following to your `rules.mk`: | |||
```make | |||
HD44780_ENABLE = yes | |||
``` | |||
## Basic Configuration | |||
Add the following to your `config.h`: | |||
|Define |Default |Description | | |||
|-----------------------|--------------|-----------------------------------------------------------------------------------------------------| | |||
|`HD44780_DATA_PINS` |*Not defined* |(Required) An array of four GPIO pins connected to the display's D4-D7 pins, eg. `{ B1, B3, B2, B6 }`| | |||
|`HD44780_RS_PIN` |*Not defined* |(Required) The GPIO connected to the display's RS pin | | |||
|`HD44780_RW_PIN` |*Not defined* |(Required) The GPIO connected to the display's RW pin | | |||
|`HD44780_E_PIN` |*Not defined* |(Required) The GPIO connected to the display's E pin | | |||
|`HD44780_DISPLAY_COLS` |`16` |The number of visible characters on a single line of the display | | |||
|`HD44780_DISPLAY_LINES`|`2` |The number of visible lines on the display | | |||
|`HD44780_WRAP_LINES` |*Not defined* |If defined, input characters will wrap to the next line | | |||
## Examples | |||
### Hello World | |||
Add the following to your `keymap.c`: | |||
```c | |||
void keyboard_post_init_user(void) { | |||
hd44780_init(true, true); // Show blinking cursor | |||
hd44780_puts_P(PSTR("Hello, world!\n")); | |||
} | |||
``` | |||
### Custom Character Definition | |||
Up to eight custom characters can be defined. This data is stored in the Character Generator RAM (CGRAM), and is not persistent across power cycles. | |||
This example defines the QMK Psi as the first custom character. The first 16 positions in the character set are reserved for the eight custom characters duplicated. | |||
``` | |||
Byte | 16 8 4 2 1 | |||
1 | x x x ■ □ ■ □ ■ | |||
2 | x x x ■ □ ■ □ ■ | |||
3 | x x x ■ □ ■ □ ■ | |||
4 | x x x □ ■ ■ ■ □ | |||
5 | x x x □ □ ■ □ □ | |||
6 | x x x □ □ ■ □ □ | |||
7 | x x x □ □ ■ □ □ | |||
8 | x x x □ □ □ □ □ | |||
``` | |||
```c | |||
const uint8_t PROGMEM psi[8] = { 0x15, 0x15, 0x15, 0x0E, 0x04, 0x04, 0x04, 0x00 }; | |||
void keyboard_post_init_user(void) { | |||
hd44780_init(false, false); | |||
hd44780_define_char_P(0, psi); | |||
// Cursor is incremented while defining characters so must be reset | |||
hd44780_home(); | |||
// 0x08 to avoid null terminator | |||
hd44780_puts_P(PSTR("\x08 QMK Firmware")); | |||
} | |||
``` | |||
## API | |||
### `void hd44780_init(bool cursor, bool blink)` | |||
Initialize the display. | |||
This function should be called only once, before any of the other functions can be called. | |||
#### Arguments | |||
- `bool cursor` | |||
Whether to show the cursor. | |||
- `bool blink` | |||
Whether to blink the cursor, if shown. | |||
--- | |||
### `void hd44780_clear(void)` | |||
Clear the display. | |||
This function is called on init. | |||
--- | |||
### `void hd44780_home(void)` | |||
Move the cursor to the home position. | |||
This function is called on init. | |||
--- | |||
### `void hd44780_on(bool cursor, bool blink)` | |||
Turn the display on, and/or set the cursor properties. | |||
This function is called on init. | |||
#### Arguments | |||
- `bool cursor` | |||
Whether to show the cursor. | |||
- `bool blink` | |||
Whether to blink the cursor, if shown. | |||
--- | |||
### `void hd44780_off(void)` | |||
Turn the display off. | |||
--- | |||
### `void hd44780_set_cursor(uint8_t col, uint8_t line)` | |||
Move the cursor to the specified position on the display. | |||
#### Arguments | |||
- `uint8_t col` | |||
The column number to move to, from 0 to 15 on 16x2 displays. | |||
- `bool line` | |||
The line number to move to, either 0 or 1 on 16x2 displays. | |||
--- | |||
### `void hd44780_putc(char c)` | |||
Print a character to the display. The newline character `\n` will move the cursor to the start of the next line. | |||
The exact character shown may depend on the ROM code of your particular display - refer to the datasheet for the full character set. | |||
#### Arguments | |||
- `char c` | |||
The character to print. | |||
--- | |||
### `void hd44780_puts(const char *s)` | |||
Print a string of characters to the display. | |||
#### Arguments | |||
- `const char *s` | |||
The string to print. | |||
--- | |||
### `void hd44780_puts_P(const char *s)` | |||
Print a string of characters from PROGMEM to the display. | |||
On ARM devices, this function is simply an alias of `hd44780_puts()`. | |||
#### Arguments | |||
- `const char *s` | |||
The PROGMEM string to print (ie. `PSTR("Hello")`). | |||
--- | |||
### `void hd44780_define_char(uint8_t index, uint8_t *data)` | |||
Define a custom character. | |||
#### Arguments | |||
- `uint8_t index` | |||
The index of the custom character to define, from 0 to 7. | |||
- `uint8_t *data` | |||
An array of 8 bytes containing the 5-bit row data of the character, where the first byte is the topmost row, and the least significant bit of each byte is the rightmost column. | |||
--- | |||
### `void hd44780_define_char_P(uint8_t index, const uint8_t *data)` | |||
Define a custom character from PROGMEM. | |||
On ARM devices, this function is simply an alias of `hd44780_define_char()`. | |||
#### Arguments | |||
- `uint8_t index` | |||
The index of the custom character to define, from 0 to 7. | |||
- `const uint8_t *data` | |||
A PROGMEM array of 8 bytes containing the 5-bit row data of the character, where the first byte is the topmost row, and the least significant bit of each byte is the rightmost column. | |||
--- | |||
### `bool hd44780_busy(void)` | |||
Indicates whether the display is currently processing, and cannot accept instructions. | |||
#### Return Value | |||
`true` if the display is busy. | |||
--- | |||
### `void hd44780_write(uint8_t data, bool isData)` | |||
Write a byte to the display. | |||
#### Arguments | |||
- `uint8_t data` | |||
The byte to send to the display. | |||
- `bool isData` | |||
Whether the byte is an instruction or character data. | |||
--- | |||
### `uint8_t hd44780_read(bool isData)` | |||
Read a byte from the display. | |||
#### Arguments | |||
- `bool isData` | |||
Whether to read the current cursor position, or the character at the cursor. | |||
#### Return Value | |||
If `isData` is `true`, the returned byte will be the character at the current DDRAM address. Otherwise, it will be the current DDRAM address and the busy flag. | |||
--- | |||
### `void hd44780_command(uint8_t command)` | |||
Send a command to the display. Refer to the datasheet and `hd44780.h` for the valid commands and defines. | |||
This function waits for the display to clear the busy flag before sending the command. | |||
#### Arguments | |||
- `uint8_t command` | |||
The command to send. | |||
--- | |||
### `void hd44780_data(uint8_t data)` | |||
Send a byte of data to the display. | |||
This function waits for the display to clear the busy flag before sending the data. | |||
#### Arguments | |||
- `uint8_t data` | |||
The byte of data to send. | |||
--- | |||
### `void hd44780_set_cgram_address(uint8_t address)` | |||
Set the CGRAM address. | |||
This function is used when defining custom characters. | |||
#### Arguments | |||
- `uint8_t address` | |||
The CGRAM address to move to, from `0x00` to `0x3F`. | |||
--- | |||
### `void hd44780_set_ddram_address(uint8_t address)` | |||
Set the DDRAM address. | |||
This function is used when printing characters to the display, and setting the cursor. | |||
To now print something to your Display you first call `lcd_gotoxy(column, line)`. To go to the start of the first line you would call `lcd_gotoxy(0, 0)` and then print a string with `lcd_puts("example string")`. | |||
#### Arguments | |||
There are more methods available to control the display. [For in depth documentation please visit the linked page.](http://www.peterfleury.epizy.com/doxygen/avr-gcc-libraries/group__pfleury__lcd.html) | |||
- `uint8_t address` | |||
The DDRAM address to move to, from `0x00` to `0x7F`. |
@ -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. |
@ -1,182 +0,0 @@ | |||
# Keyboards with AVR Processors | |||
This page describes the support for for AVR processors in QMK. AVR processors include the atmega32u4, atmega32u2, at90usb1286, and other processors from Atmel Corporation. AVR processors are 8-bit MCUs that are designed to be easy to work with. The most common AVR processors in keyboards have on-board USB and plenty of GPIO for supporting large keyboard matrices. They are the most popular MCU for use in keyboards today. | |||
If you have not yet you should read the [Keyboard Guidelines](hardware_keyboard_guidelines.md) to get a sense of how keyboards fit into QMK. | |||
## Adding Your AVR Keyboard to QMK | |||
QMK has a number of features to simplify working with AVR keyboards. For most keyboards you don't have to write a single line of code. To get started, run `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. | |||
``` | |||
This will create all the files needed to support your new keyboard, and populate the settings with default values. Now you just need to customize it for your keyboard. | |||
## `readme.md` | |||
This is where you'll describe your keyboard. Please follow the [Keyboard Readme Template](documentation_templates.md#keyboard-readmemd-template) when writing your `readme.md`. You're encouraged to place an image at the top of your `readme.md`, please use an external service such as [Imgur](https://imgur.com) to host the images. | |||
## `<keyboard>.c` | |||
This is where all the custom logic for your keyboard goes. Many keyboards do not need to put anything at all in here. You can learn more about writing custom logic in [Custom Quantum Functions](custom_quantum_functions.md). | |||
## `<keyboard>.h` | |||
This is the file you define your [Layout Macro(s)](feature_layouts.md) in. At minimum you should have a `#define LAYOUT` for your keyboard that looks something like this: | |||
```c | |||
#define LAYOUT( \ | |||
k00, k01, k02, \ | |||
k10, k11 \ | |||
) { \ | |||
{ k00, k01, k02 }, \ | |||
{ k10, KC_NO, k11 }, \ | |||
} | |||
``` | |||
The first half of the `LAYOUT` pre-processor macro defines the physical arrangement of keys. The second half of the macro defines the matrix the switches are connected to. This allows you to have a physical arrangement of keys that differs from the wiring matrix. | |||
Each of the `k__` variables needs to be unique, and typically they follow the format `k<row><col>`. | |||
The physical matrix (the second half) must have a number of rows equaling `MATRIX_ROWS`, and each row must have exactly `MATRIX_COLS` elements in it. If you do not have this many physical keys you can use `KC_NO` to fill in the blank spots. | |||
## `config.h` | |||
The `config.h` file is where you configure the hardware and feature set for your keyboard. There are a lot of options that can be placed in that file, too many to list there. For a complete overview of available options see the [Config Options](config_options.md) page. | |||
### Hardware Configuration | |||
At the top of the `config.h` you'll find USB related settings. These control how your keyboard appears to the Operating System. If you don't have a good reason to change you should leave the `VENDOR_ID` as `0xFEED`. For the `PRODUCT_ID` you should pick a number that is not yet in use. | |||
Do change the `MANUFACTURER` and `PRODUCT` lines to accurately reflect your keyboard. | |||
```c | |||
#define VENDOR_ID 0xFEED | |||
#define PRODUCT_ID 0x6060 | |||
#define DEVICE_VER 0x0001 | |||
#define MANUFACTURER You | |||
#define PRODUCT my_awesome_keyboard | |||
``` | |||
?> Windows and macOS will display the `MANUFACTURER` and `PRODUCT` in the list of USB devices. `lsusb` on Linux instead prefers the values in the list maintained by the [USB ID Repository](http://www.linux-usb.org/usb-ids.html). By default, it will only use `MANUFACTURER` and `PRODUCT` if the list does not contain that `VENDOR_ID` / `PRODUCT_ID`. `sudo lsusb -v` will show the values reported by the device, and they are also present in kernel logs after plugging it in. | |||
### Keyboard Matrix Configuration | |||
The next section of the `config.h` file deals with your keyboard's matrix. The first thing you should set is the matrix's size. This is usually, but not always, the same number of rows and columns as the physical key arrangement. | |||
```c | |||
#define MATRIX_ROWS 2 | |||
#define MATRIX_COLS 3 | |||
``` | |||
Once you've defined the size of your matrix you need to define which pins on your MCU are connected to rows and columns. To do so simply specify the names of those pins: | |||
```c | |||
#define MATRIX_ROW_PINS { D0, D5 } | |||
#define MATRIX_COL_PINS { F1, F0, B0 } | |||
#define UNUSED_PINS | |||
``` | |||
The number of `MATRIX_ROW_PINS` entries must be the same as the number you assigned to `MATRIX_ROWS`, and likewise for `MATRIX_COL_PINS` and `MATRIX_COLS`. You do not have to specify `UNUSED_PINS`, but you can if you want to document what pins are open. | |||
Finally, you can specify the direction your diodes point. This can be `COL2ROW` or `ROW2COL`. | |||
```c | |||
#define DIODE_DIRECTION COL2ROW | |||
``` | |||
#### Direct Pin Matrix | |||
To configure a keyboard where each switch is connected to a separate pin and ground instead of sharing row and column pins, use `DIRECT_PINS`. The mapping defines the pins of each switch in rows and columns, from left to right. Must conform to the sizes within `MATRIX_ROWS` and `MATRIX_COLS`, use `NO_PIN` to fill in blank spaces. Overrides the behaviour of `DIODE_DIRECTION`, `MATRIX_ROW_PINS` and `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 | |||
``` | |||
### Backlight Configuration | |||
QMK supports backlighting on most GPIO pins. A select few of these can be driven by the MCU in hardware. For more details see the [Backlight Documentation](feature_backlight.md). | |||
```c | |||
#define BACKLIGHT_PIN B7 | |||
#define BACKLIGHT_LEVELS 3 | |||
#define BACKLIGHT_BREATHING | |||
#define BREATHING_PERIOD 6 | |||
``` | |||
### Other Configuration Options | |||
There are a lot of features that can be configured or tuned in `config.h`. You should see the [Config Options](config_options.md) page for more details. | |||
## `rules.mk` | |||
You use the `rules.mk` file to tell QMK what files to build and what features to enable. If you are building around an atmega32u4 you can largely leave these defaults alone. If you are using another MCU you may have to tweak some parameters. | |||
### MCU Options | |||
These options tell the build system what CPU to build for. Be very careful if you change any of these settings, you can render your keyboard inoperable. | |||
```make | |||
MCU = atmega32u4 | |||
F_CPU = 16000000 | |||
ARCH = AVR8 | |||
F_USB = $(F_CPU) | |||
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT | |||
``` | |||
### Bootloaders | |||
The bootloader is a special section of your MCU that allows you to upgrade the code stored on the MCU. Think of it like a Rescue Partition for your keyboard. | |||
#### Teensy Bootloader Example | |||
```make | |||
BOOTLOADER = halfkay | |||
``` | |||
#### Atmel DFU Loader Example | |||
```make | |||
BOOTLOADER = atmel-dfu | |||
``` | |||
#### Pro Micro Bootloader Example | |||
```make | |||
BOOTLOADER = caterina | |||
``` | |||
### Build Options | |||
There are a number of features that can be turned on or off in `rules.mk`. See the [Config Options](config_options.md#feature-options) page for a detailed list and description. |