diff --git a/Makefile b/Makefile index 0dd77d403e..45e47c0037 100644 --- a/Makefile +++ b/Makefile @@ -578,7 +578,7 @@ lib/%: git-submodule: git submodule sync --recursive - git submodule update --init --recursive + git submodule update --init --recursive --progress ifdef SKIP_VERSION SKIP_GIT := yes diff --git a/build_keyboard.mk b/build_keyboard.mk index b25712385c..a73741bb3e 100644 --- a/build_keyboard.mk +++ b/build_keyboard.mk @@ -1,3 +1,9 @@ +# 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 @@ -6,26 +12,15 @@ endif include common.mk -# 5/4/3/2/1 -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)) - +# 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) +# For split boards we need to set a master half. MASTER ?= left ifdef master MASTER = $(master) @@ -39,35 +34,58 @@ $(error MASTER does not have a valid value(left/right)) endif 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)/rules.mk)","") +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)","") - KEYBOARD_PATHS += $(KEYBOARD_PATH_4) include $(KEYBOARD_PATH_4)/rules.mk endif ifneq ("$(wildcard $(KEYBOARD_PATH_3)/rules.mk)","") - KEYBOARD_PATHS += $(KEYBOARD_PATH_3) include $(KEYBOARD_PATH_3)/rules.mk endif ifneq ("$(wildcard $(KEYBOARD_PATH_2)/rules.mk)","") - KEYBOARD_PATHS += $(KEYBOARD_PATH_2) include $(KEYBOARD_PATH_2)/rules.mk endif ifneq ("$(wildcard $(KEYBOARD_PATH_1)/rules.mk)","") - KEYBOARD_PATHS += $(KEYBOARD_PATH_1) include $(KEYBOARD_PATH_1)/rules.mk endif +# Find all the C source files to be compiled in subfolders. KEYBOARD_SRC := KEYBOARD_C_1 := $(KEYBOARD_PATH_1)/$(KEYBOARD_FOLDER_1).c @@ -95,6 +113,15 @@ endif OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE) +# 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 +# ifneq ("$(wildcard $(KEYBOARD_PATH_1)/$(KEYBOARD_FOLDER_1).h)","") QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_1).h endif @@ -111,13 +138,18 @@ ifneq ("$(wildcard $(KEYBOARD_PATH_5)/$(KEYBOARD_FOLDER_5).h)","") QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_5).h endif -# We can assume a ChibiOS target When MCU_FAMILY is defined , since it's not used for LUFA +# 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 - FIRMWARE_FORMAT=bin + FIRMWARE_FORMAT?=bin PLATFORM=CHIBIOS +else ifdef ARM_ATSAM + PLATFORM=ARM_ATSAM + FIRMWARE_FORMAT=bin else PLATFORM=AVR - FIRMWARE_FORMAT=hex + FIRMWARE_FORMAT?=hex endif ifeq ($(PLATFORM),CHIBIOS) @@ -148,6 +180,7 @@ ifeq ($(PLATFORM),CHIBIOS) endif 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 @@ -203,7 +236,7 @@ else # this state should never be reached endif -# User space stuff +# Userspace setup and definitions ifeq ("$(USER_NAME)","") USER_NAME := $(KEYMAP) endif @@ -256,6 +289,11 @@ endif include $(TMK_PATH)/avr.mk endif +ifeq ($(PLATFORM),ARM_ATSAM) + include $(TMK_PATH)/arm_atsam.mk + include $(TMK_PATH)/protocol/arm_atsam.mk +endif + ifeq ($(PLATFORM),CHIBIOS) include $(TMK_PATH)/protocol/chibios.mk endif @@ -283,11 +321,6 @@ $(KEYBOARD_OUTPUT)_CONFIG := $(PROJECT_CONFIG) # Default target. all: build check-size - -# Change the build target to build a HEX file or a library. build: elf cpfirmware -#build: elf hex eep lss sym -#build: lib - include $(TMK_PATH)/rules.mk diff --git a/common_features.mk b/common_features.mk index b78f04d2a8..c637582d45 100644 --- a/common_features.mk +++ b/common_features.mk @@ -61,8 +61,8 @@ endif ifeq ($(strip $(STENO_ENABLE)), yes) OPT_DEFS += -DSTENO_ENABLE - VIRTSER_ENABLE := yes - SRC += $(QUANTUM_DIR)/process_keycode/process_steno.c + VIRTSER_ENABLE := yes + SRC += $(QUANTUM_DIR)/process_keycode/process_steno.c endif ifeq ($(strip $(VIRTSER_ENABLE)), yes) @@ -75,9 +75,9 @@ ifeq ($(strip $(FAUXCLICKY_ENABLE)), yes) endif ifeq ($(strip $(POINTING_DEVICE_ENABLE)), yes) - OPT_DEFS += -DPOINTING_DEVICE_ENABLE - OPT_DEFS += -DMOUSE_ENABLE - SRC += $(QUANTUM_DIR)/pointing_device.c + OPT_DEFS += -DPOINTING_DEVICE_ENABLE + OPT_DEFS += -DMOUSE_ENABLE + SRC += $(QUANTUM_DIR)/pointing_device.c endif ifeq ($(strip $(UCIS_ENABLE)), yes) @@ -110,12 +110,14 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes) ifeq ($(strip $(RGBLIGHT_CUSTOM_DRIVER)), yes) OPT_DEFS += -DRGBLIGHT_CUSTOM_DRIVER else - SRC += ws2812.c + SRC += ws2812.c endif endif ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes) OPT_DEFS += -DRGB_MATRIX_ENABLE + OPT_DEFS += -DIS31FL3731 + COMMON_VPATH += $(DRIVER_PATH)/issi SRC += is31fl3731.c SRC += i2c_master.c SRC += $(QUANTUM_DIR)/color.c @@ -123,6 +125,28 @@ ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes) CIE1931_CURVE = yes endif +ifeq ($(strip $(RGB_MATRIX_ENABLE)), IS31FL3731) + OPT_DEFS += -DRGB_MATRIX_ENABLE + OPT_DEFS += -DIS31FL3731 + COMMON_VPATH += $(DRIVER_PATH)/issi + SRC += is31fl3731.c + SRC += i2c_master.c + SRC += $(QUANTUM_DIR)/color.c + SRC += $(QUANTUM_DIR)/rgb_matrix.c + CIE1931_CURVE = yes +endif + +ifeq ($(strip $(RGB_MATRIX_ENABLE)), IS31FL3733) + OPT_DEFS += -DRGB_MATRIX_ENABLE + OPT_DEFS += -DIS31FL3733 + COMMON_VPATH += $(DRIVER_PATH)/issi + SRC += is31fl3733.c + SRC += i2c_master.c + SRC += $(QUANTUM_DIR)/color.c + SRC += $(QUANTUM_DIR)/rgb_matrix.c + CIE1931_CURVE = yes +endif + ifeq ($(strip $(TAP_DANCE_ENABLE)), yes) OPT_DEFS += -DTAP_DANCE_ENABLE SRC += $(QUANTUM_DIR)/process_keycode/process_tap_dance.c @@ -169,7 +193,7 @@ ifeq ($(strip $(BACKLIGHT_ENABLE)), yes) ifeq ($(strip $(VISUALIZER_ENABLE)), yes) CIE1931_CURVE = yes endif - ifeq ($(strip $(BACKLIGHT_CUSTOM_DRIVER)), yes) + ifeq ($(strip $(BACKLIGHT_CUSTOM_DRIVER)), yes) OPT_DEFS += -DBACKLIGHT_CUSTOM_DRIVER endif endif @@ -200,7 +224,12 @@ endif ifeq ($(strip $(HD44780_ENABLE)), yes) SRC += drivers/avr/hd44780.c - OPT_DEFS += -DHD44780_ENABLE + OPT_DEFS += -DHD44780_ENABLE +endif + +ifeq ($(strip $(DYNAMIC_KEYMAP_ENABLE)), yes) + OPT_DEFS += -DDYNAMIC_KEYMAP_ENABLE + SRC += $(QUANTUM_DIR)/dynamic_keymap.c endif QUANTUM_SRC:= \ diff --git a/docs/_sidebar.md b/docs/_sidebar.md index 6c56bb2e51..a35014dd8c 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -1,36 +1,51 @@ -* [Getting Started](README.md) - * [QMK Introduction](getting_started_introduction.md) - * [Install Build Tools](getting_started_build_tools.md) - * Alternative: [Vagrant Guide](getting_started_vagrant.md) - * [Build/Compile Instructions](getting_started_make_guide.md) - * [Flashing Firmware](flashing.md) - * [Contributing to QMK](contributing.md) - * [How to Use Github](getting_started_github.md) - * [Getting Help](getting_started_getting_help.md) - * [Complete Newbs Guide](newbs.md) * [Getting Started](newbs_getting_started.md) * [Building Your First Firmware](newbs_building_firmware.md) * [Flashing Firmware](newbs_flashing.md) * [Testing and Debugging](newbs_testing_debugging.md) +* [QMK Basics](README.md) + * [QMK Introduction](getting_started_introduction.md) + * [Contributing to QMK](contributing.md) + * [How to Use Github](getting_started_github.md) + * [Getting Help](getting_started_getting_help.md) + * [FAQ](faq.md) * [General FAQ](faq_general.md) * [Build/Compile QMK](faq_build.md) * [Debugging/Troubleshooting QMK](faq_debug.md) * [Keymap](faq_keymap.md) +* Detailed Guides + * [Install Build Tools](getting_started_build_tools.md) + * [Vagrant Guide](getting_started_vagrant.md) + * [Build/Compile Instructions](getting_started_make_guide.md) + * [Flashing Firmware](flashing.md) + * [Customizing Functionality](custom_quantum_functions.md) + * [Keymap Overview](keymap.md) + * [Hardware](hardware.md) - * [Keyboard Guidelines](hardware_keyboard_guidelines.md) * [AVR Processors](hardware_avr.md) - * ARM Processors (TBD) * [Drivers](hardware_drivers.md) +* Reference + * [Keyboard Guidelines](hardware_keyboard_guidelines.md) + * [Config Options](config_options.md) + * [Keycodes](keycodes.md) + * [Documentation Best Practices](documentation_best_practices.md) + * [Documentation Templates](documentation_templates.md) + * [Glossary](reference_glossary.md) + * [Unit Testing](unit_testing.md) + * [Useful Functions](ref_functions.md) + * [Features](features.md) + * [Basic Keycodes](keycodes_basic.md) + * [Quantum Keycodes](quantum_keycodes.md) * [Advanced Keycodes](feature_advanced_keycodes.md) * [Audio](feature_audio.md) * [Auto Shift](feature_auto_shift.md) * [Backlight](feature_backlight.md) + * [Bluetooth](feature_bluetooth.md) * [Bootmagic](feature_bootmagic.md) * [Command](feature_command.md) * [Dynamic Macros](feature_dynamic_macros.md) @@ -40,6 +55,7 @@ * [Leader Key](feature_leader_key.md) * [Macros](feature_macros.md) * [Mouse Keys](feature_mouse_keys.md) + * [One Shot Keys](feature_advanced_keycodes.md#one-shot-keys) * [Pointing Device](feature_pointing_device.md) * [PS/2 Mouse](feature_ps2_mouse.md) * [RGB Lighting](feature_rgblight.md) @@ -53,36 +69,8 @@ * [Thermal Printer](feature_thermal_printer.md) * [Unicode](feature_unicode.md) * [Userspace](feature_userspace.md) - -* [Keycodes](keycodes.md) - * [Basic](keycodes_basic.md) - * [Quantum](quantum_keycodes.md) - * [Audio](feature_audio.md#audio-keycodes) - * [Backlight](feature_backlight.md#backlight-keycodes) - * [Bluetooth](feature_bluetooth.md#bluetooth-keycodes) - * [Bootmagic](feature_bootmagic.md#bootmagic-keycodes) - * [Layer Switching](feature_advanced_keycodes.md#switching-and-toggling-layers) - * [Mod+Key](feature_advanced_keycodes.md#modifier-keys) - * [Mod Tap](feature_advanced_keycodes.md#mod-tap) - * [Mouse Keys](feature_mouse_keys.md#mapping-mouse-actions-to-keyboard-keys) - * [One Shot Keys](feature_advanced_keycodes.md#one-shot-keys) - * [RGB Light](feature_rgblight.md#rgblight-keycodes) - * [RGB Matrix](feature_rgb_matrix.md#keycodes) - * [Shifted Keys](feature_advanced_keycodes.md#shifted-keycodes) - * [Stenography](feature_stenography.md#keycode-reference) - * [Swap Hands](feature_swap_hands.md#swap-keycodes) - * [Thermal Printer](feature_thermal_printer.md#thermal-printer-keycodes) * [US ANSI Shifted Keys](keycodes_us_ansi_shifted.md) -* Reference - * [Config Options](config_options.md) - * [Customizing Functionality](custom_quantum_functions.md) - * [Documentation Best Practices](documentation_best_practices.md) - * [Documentation Templates](documentation_templates.md) - * [Glossary](reference_glossary.md) - * [Keymap Overview](keymap.md) - * [Unit Testing](unit_testing.md) - * For Makers and Modders * [Hand Wiring Guide](hand_wire.md) * [ISP Flashing Guide](isp_flashing_guide.md) diff --git a/docs/_summary.md b/docs/_summary.md index 6c56bb2e51..a35014dd8c 100644 --- a/docs/_summary.md +++ b/docs/_summary.md @@ -1,36 +1,51 @@ -* [Getting Started](README.md) - * [QMK Introduction](getting_started_introduction.md) - * [Install Build Tools](getting_started_build_tools.md) - * Alternative: [Vagrant Guide](getting_started_vagrant.md) - * [Build/Compile Instructions](getting_started_make_guide.md) - * [Flashing Firmware](flashing.md) - * [Contributing to QMK](contributing.md) - * [How to Use Github](getting_started_github.md) - * [Getting Help](getting_started_getting_help.md) - * [Complete Newbs Guide](newbs.md) * [Getting Started](newbs_getting_started.md) * [Building Your First Firmware](newbs_building_firmware.md) * [Flashing Firmware](newbs_flashing.md) * [Testing and Debugging](newbs_testing_debugging.md) +* [QMK Basics](README.md) + * [QMK Introduction](getting_started_introduction.md) + * [Contributing to QMK](contributing.md) + * [How to Use Github](getting_started_github.md) + * [Getting Help](getting_started_getting_help.md) + * [FAQ](faq.md) * [General FAQ](faq_general.md) * [Build/Compile QMK](faq_build.md) * [Debugging/Troubleshooting QMK](faq_debug.md) * [Keymap](faq_keymap.md) +* Detailed Guides + * [Install Build Tools](getting_started_build_tools.md) + * [Vagrant Guide](getting_started_vagrant.md) + * [Build/Compile Instructions](getting_started_make_guide.md) + * [Flashing Firmware](flashing.md) + * [Customizing Functionality](custom_quantum_functions.md) + * [Keymap Overview](keymap.md) + * [Hardware](hardware.md) - * [Keyboard Guidelines](hardware_keyboard_guidelines.md) * [AVR Processors](hardware_avr.md) - * ARM Processors (TBD) * [Drivers](hardware_drivers.md) +* Reference + * [Keyboard Guidelines](hardware_keyboard_guidelines.md) + * [Config Options](config_options.md) + * [Keycodes](keycodes.md) + * [Documentation Best Practices](documentation_best_practices.md) + * [Documentation Templates](documentation_templates.md) + * [Glossary](reference_glossary.md) + * [Unit Testing](unit_testing.md) + * [Useful Functions](ref_functions.md) + * [Features](features.md) + * [Basic Keycodes](keycodes_basic.md) + * [Quantum Keycodes](quantum_keycodes.md) * [Advanced Keycodes](feature_advanced_keycodes.md) * [Audio](feature_audio.md) * [Auto Shift](feature_auto_shift.md) * [Backlight](feature_backlight.md) + * [Bluetooth](feature_bluetooth.md) * [Bootmagic](feature_bootmagic.md) * [Command](feature_command.md) * [Dynamic Macros](feature_dynamic_macros.md) @@ -40,6 +55,7 @@ * [Leader Key](feature_leader_key.md) * [Macros](feature_macros.md) * [Mouse Keys](feature_mouse_keys.md) + * [One Shot Keys](feature_advanced_keycodes.md#one-shot-keys) * [Pointing Device](feature_pointing_device.md) * [PS/2 Mouse](feature_ps2_mouse.md) * [RGB Lighting](feature_rgblight.md) @@ -53,36 +69,8 @@ * [Thermal Printer](feature_thermal_printer.md) * [Unicode](feature_unicode.md) * [Userspace](feature_userspace.md) - -* [Keycodes](keycodes.md) - * [Basic](keycodes_basic.md) - * [Quantum](quantum_keycodes.md) - * [Audio](feature_audio.md#audio-keycodes) - * [Backlight](feature_backlight.md#backlight-keycodes) - * [Bluetooth](feature_bluetooth.md#bluetooth-keycodes) - * [Bootmagic](feature_bootmagic.md#bootmagic-keycodes) - * [Layer Switching](feature_advanced_keycodes.md#switching-and-toggling-layers) - * [Mod+Key](feature_advanced_keycodes.md#modifier-keys) - * [Mod Tap](feature_advanced_keycodes.md#mod-tap) - * [Mouse Keys](feature_mouse_keys.md#mapping-mouse-actions-to-keyboard-keys) - * [One Shot Keys](feature_advanced_keycodes.md#one-shot-keys) - * [RGB Light](feature_rgblight.md#rgblight-keycodes) - * [RGB Matrix](feature_rgb_matrix.md#keycodes) - * [Shifted Keys](feature_advanced_keycodes.md#shifted-keycodes) - * [Stenography](feature_stenography.md#keycode-reference) - * [Swap Hands](feature_swap_hands.md#swap-keycodes) - * [Thermal Printer](feature_thermal_printer.md#thermal-printer-keycodes) * [US ANSI Shifted Keys](keycodes_us_ansi_shifted.md) -* Reference - * [Config Options](config_options.md) - * [Customizing Functionality](custom_quantum_functions.md) - * [Documentation Best Practices](documentation_best_practices.md) - * [Documentation Templates](documentation_templates.md) - * [Glossary](reference_glossary.md) - * [Keymap Overview](keymap.md) - * [Unit Testing](unit_testing.md) - * For Makers and Modders * [Hand Wiring Guide](hand_wire.md) * [ISP Flashing Guide](isp_flashing_guide.md) diff --git a/docs/becoming_a_qmk_collaborator.md b/docs/becoming_a_qmk_collaborator.md index 3cac63c97b..16ae0d569e 100644 --- a/docs/becoming_a_qmk_collaborator.md +++ b/docs/becoming_a_qmk_collaborator.md @@ -1,7 +1,9 @@ -A QMK collaborator is a keyboard maker/designer that is interested in helping QMK grow and fully support their keyboard(s), and encouraging their users/customers to submit features, ideas, and keymaps. We're always looking to add more keyboards and collaborators, but we ask that they fulfill these requirements: +# Becoming a QMK Collaborator -* **Have a PCB available for sale** - unfortunately there's just too much variation and complications with handwired keyboards. -* **Maintain the your keyboard's directory** - this may just require an initial setup to get your keyboard working, but it could also include accommodating changes made to QMK's core. -* **Approve and merge your keyboard's keymap pull requests** - we like to encourage users to contribute their keymaps for others to see and work from when creating their own. +A QMK collaborator is a keyboard maker or designer that is interested in helping QMK grow and fully support their keyboard(s), and encouraging their users and customers to submit features, ideas, and keymaps. We're always looking to add more keyboards and collaborators, but we ask that they fulfill these requirements: + +* **Have a PCB available for sale.** Unfortunately there's just too much variation and complications with handwired keyboards. +* **Maintain your keyboard in QMK.** This may just require an initial setup to get your keyboard working, but it could also include accommodating changes made to QMK's core that might break or render any custom code redundant. +* **Approve and merge keymap pull requests for your keyboard.** We like to encourage users to contribute their keymaps for others to see and work from when creating their own. If you feel you meet these requirements, shoot us an email at hello@qmk.fm with an introduction and some links to your keyboard! diff --git a/docs/config_options.md b/docs/config_options.md index afc29fae9c..eaaa59872c 100644 --- a/docs/config_options.md +++ b/docs/config_options.md @@ -199,6 +199,8 @@ This is a [make](https://www.gnu.org/software/make/manual/make.html) file that i * `DEFAULT_FOLDER` * Used to specify a default folder when a keyboard has more than one sub-folder. +* `FIRMWARE_FORMAT` + * Defines which format (bin, hex) is copied to the root `qmk_firmware` folder after building. * `SRC` * Used to add files to the compilation/linking list. * `LAYOUTS` @@ -246,3 +248,7 @@ Use these to enable or disable building certain features. The more you have enab * Enable Bluetooth with the Adafruit EZ-Key HID * `SPLIT_KEYBOARD` * Enables split keyboard support (dual MCU like the let's split and bakingpy's boards) and includes all necessary files located at quantum/split_common +* `WAIT_FOR_USB` + * Forces the keyboard to wait for a USB connection to be established before it starts up +* `NO_USB_STARTUP_CHECK` + * Disables usb suspend check after keyboard startup. Usually the keyboard waits for the host to wake it up before any tasks are performed. This is useful for split keyboards as one half will not get a wakeup call but must send commands to the master. diff --git a/docs/faq_keymap.md b/docs/faq_keymap.md index 447b892262..07d74d6cf3 100644 --- a/docs/faq_keymap.md +++ b/docs/faq_keymap.md @@ -11,8 +11,8 @@ Keycodes are actually defined in [common/keycode.h](https://github.com/qmk/qmk_f There are 3 standard keyboard layouts in use around the world- ANSI, ISO, and JIS. North America primarily uses ANSI, Europe and Africa primarily use ISO, and Japan uses JIS. Regions not mentioned typically use either ANSI or ISO. The keycodes corresponding to these layouts are shown here: - -![Keyboard Layout Image](https://i.imgur.com/45m4mRf.png) + +![Keyboard Layout Image](https://i.imgur.com/gvlNUpQ.png) ## Some Of My Keys Are Swapped Or Not Working @@ -34,12 +34,11 @@ See [issue #168](https://github.com/tmk/tmk_keyboard/issues/168) and * http://en.wikipedia.org/wiki/Magic_SysRq_key * http://en.wikipedia.org/wiki/System_request -## Power Key Doesn't Work -Use `KC_PWR` instead of `KC_POWER` or vice versa. -* `KC_PWR` works with Windows and Linux, not with OSX. -* `KC_POWER` works with OSX and Linux, not with Windows. +## Power Keys Aren't Working -More info: http://geekhack.org/index.php?topic=14290.msg1327264#msg1327264 +Somewhat confusingly, there are two "Power" keycodes in QMK: `KC_POWER` in the Keyboard/Keypad HID usage page, and `KC_SYSTEM_POWER` (or `KC_PWR`) in the Consumer page. + +The former is only recognized on macOS, while the latter, `KC_SLEP` and `KC_WAKE` are supported by all three major operating systems, so it is recommended to use those instead. Under Windows, these keys take effect immediately, however on macOS they must be held down until a dialog appears. ## One Shot Modifier Solves my personal 'the' problem. I often got 'the' or 'THe' wrongly instead of 'The'. One Shot Shift mitigates this for me. diff --git a/docs/feature_advanced_keycodes.md b/docs/feature_advanced_keycodes.md index 493a99fd73..5f30359e0d 100644 --- a/docs/feature_advanced_keycodes.md +++ b/docs/feature_advanced_keycodes.md @@ -1,6 +1,6 @@ # Advanced Keycodes -Your keymap can include keycodes that are more advanced than normal, for example shifted keys. This page documents the functions that are available to you. +Your keymap can include keycodes that are more advanced than normal, for example keys that switch layers or send modifiers when held, but send regular keycodes when tapped. This page documents the functions that are available to you. ### Assigning Custom Names @@ -13,9 +13,11 @@ People often define custom names using `#define`. For example: This will allow you to use `FN_CAPS` and `ALT_TAB` in your `KEYMAP()`, keeping it more readable. -### Limits of These Aliases +### Caveats -Currently, the keycodes able to used with these functions are limited to the [Basic Keycodes](keycodes_basic.md), meaning you can't use keycodes like `KC_TILD`, or anything greater than 0xFF. For a full list of the keycodes able to be used see [Basic Keycodes](keycodes_basic.md). +Currently, `LT()` and `MT()` are limited to the [Basic Keycode set](keycodes_basic.md), meaning you can't use keycodes like `LCTL()`, `KC_TILD`, or anything greater than `0xFF`. Modifiers specified as part of a Layer Tap or Mod Tap's keycode will be ignored. + +Additionally, if at least one right-handed modifier is specified in a Mod Tap or Layer Tap, it will cause all modifiers specified to become right-handed, so it is not possible to mix and match the two. # Switching and Toggling Layers @@ -55,85 +57,73 @@ Sometimes, you might want to switch between layers in a macro or as part of a ta # Modifier Keys -These functions allow you to combine a mod with a keycode. When pressed the keydown for the mod will be sent first, and then *kc* will be sent. When released the keyup for *kc* will be sent and then the mod will be sent. - -* `LSFT(kc)` or `S(kc)` - applies left Shift to *kc* (keycode) -* `RSFT(kc)` - applies right Shift to *kc* -* `LCTL(kc)` - applies left Control to *kc* -* `RCTL(kc)` - applies right Control to *kc* -* `LALT(kc)` - applies left Alt to *kc* -* `RALT(kc)` - applies right Alt to *kc* -* `LGUI(kc)` - applies left GUI (command/win) to *kc* -* `RGUI(kc)` - applies right GUI (command/win) to *kc* -* `HYPR(kc)` - applies Hyper (all modifiers) to *kc* -* `MEH(kc)` - applies Meh (all modifiers except Win/Cmd) to *kc* -* `LCAG(kc)` - applies CtrlAltGui to *kc* - -You can also chain these, like this: - - LALT(LCTL(KC_DEL)) -- this makes a key that sends Alt, Control, and Delete in a single keypress. - -# Shifted Keycodes - -The following shortcuts automatically add `LSFT()` to keycodes to get commonly used symbols. - -|Key |Aliases |Description | -|------------------------|------------------|-------------------| -|`KC_TILDE` |`KC_TILD` |`~` | -|`KC_EXCLAIM` |`KC_EXLM` |`!` | -|`KC_AT` | |`@` | -|`KC_HASH` | |`#` | -|`KC_DOLLAR` |`KC_DLR` |`$` | -|`KC_PERCENT` |`KC_PERC` |`%` | -|`KC_CIRCUMFLEX` |`KC_CIRC` |`^` | -|`KC_AMPERSAND` |`KC_AMPR` |`&` | -|`KC_ASTERISK` |`KC_ASTR` |`*` | -|`KC_LEFT_PAREN` |`KC_LPRN` |`(` | -|`KC_RIGHT_PAREN` |`KC_RPRN` |`)` | -|`KC_UNDERSCORE` |`KC_UNDS` |`_` | -|`KC_PLUS` | |`+` | -|`KC_LEFT_CURLY_BRACE` |`KC_LCBR` |`{` | -|`KC_RIGHT_CURLY_BRACE` |`KC_RCBR` |`}` | -|`KC_PIPE` | ||| -|`KC_COLON` |`KC_COLN` |`:` | -|`KC_DOUBLE_QUOTE` |`KC_DQT`/`KC_DQUO`|`"` | -|`KC_LEFT_ANGLE_BRACKET` |`KC_LT`/`KC_LABK` |`<` | -|`KC_RIGHT_ANGLE_BRACKET`|`KC_GT`/`KC_RABK` |`>` | -|`KC_QUESTION` |`KC_QUES` |`?` | - -# Mod Tap - -`MT(mod, kc)` - is *mod* (modifier key - MOD_LCTL, MOD_LSFT) when held, and *kc* when tapped. In other words, you can have a key that sends Esc (or the letter O or whatever) when you tap it, but works as a Control key or a Shift key when you hold it down. - -These are the values you can use for the `mod` in `MT()` and `OSM()`: - - * MOD_LCTL - * MOD_LSFT - * MOD_LALT - * MOD_LGUI - * MOD_RCTL - * MOD_RSFT - * MOD_RALT - * MOD_RGUI - * MOD_HYPR - * MOD_MEH - -These can also be combined like `MOD_LCTL | MOD_LSFT` e.g. `MT(MOD_LCTL | MOD_LSFT, KC_ESC)` which would activate Control and Shift when held, and send Escape when tapped. - -We've added shortcuts to make common modifier/tap (mod-tap) mappings more compact: - - * `CTL_T(kc)` - is LCTL when held and *kc* when tapped - * `SFT_T(kc)` - is LSFT when held and *kc* when tapped - * `ALT_T(kc)` - is LALT when held and *kc* when tapped - * `ALGR_T(kc)` - is AltGr when held and *kc* when tapped - * `GUI_T(kc)` - is LGUI when held and *kc* when tapped - * `ALL_T(kc)` - is Hyper (all mods) when held and *kc* when tapped. To read more about what you can do with a Hyper key, see [this blog post by Brett Terpstra](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/) - * `LCAG_T(kc)` - is CtrlAltGui when held and *kc* when tapped - * `MEH_T(kc)` - is like Hyper, but not as cool -- does not include the Cmd/Win key, so just sends Alt+Ctrl+Shift. - -?> Due to the way that keycodes are structured, any modifiers specified as part of `kc`, such as `LCTL()` or `KC_LPRN`, will only activate when held instead of tapped. - -?> Additionally, if there is at least one right-handed modifier, any other modifiers in a chain of functions will turn into their right-handed equivalents, so it is not possible to "mix and match" the two. +These allow you to combine a modifier with a keycode. When pressed, the keydown event for the modifier, then `kc` will be sent. On release, the keyup event for `kc`, then the modifier will be sent. + +|Key |Aliases |Description | +|----------|----------------------|----------------------------------------------------| +|`LCTL(kc)`| |Hold Left Control and press `kc` | +|`LSFT(kc)`|`S(kc)` |Hold Left Shift and press `kc` | +|`LALT(kc)`| |Hold Left Alt and press `kc` | +|`LGUI(kc)`|`LCMD(kc)`, `LWIN(kc)`|Hold Left GUI and press `kc` | +|`RCTL(kc)`| |Hold Right Control and press `kc` | +|`RSFT(kc)`| |Hold Right Shift and press `kc` | +|`RALT(kc)`| |Hold Right Alt and press `kc` | +|`RGUI(kc)`|`RCMD(kc)`, `LWIN(kc)`|Hold Right GUI and press `kc` | +|`HYPR(kc)`| |Hold Left Control, Shift, Alt and GUI and press `kc`| +|`MEH(kc)` | |Hold Left Control, Shift and Alt and press `kc` | +|`LCAG(kc)`| |Hold Left Control, Alt and GUI and press `kc` | +|`ALTG(kc)`| |Hold Right Control and Alt and press `kc` | +|`SGUI(kc)`|`SCMD(kc)`, `SWIN(kc)`|Hold Left Shift and GUI and press `kc` | +|`LCA(kc)` | |Hold Left Control and Alt and press `kc` | + +You can also chain them, for example `LCTL(LALT(KC_DEL))` makes a key that sends Control+Alt+Delete with a single keypress. + +# Mod-Tap + +The Mod-Tap key `MT(mod, kc)` acts like a modifier when held, and a regular keycode when tapped. In other words, you can have a key that sends Escape when you tap it, but functions as a Control or Shift key when you hold it down. + +The modifiers this keycode and `OSM()` accept are prefixed with `MOD_`, not `KC_`: + +|Modifier |Description | +|----------|----------------------------------------| +|`MOD_LCTL`|Left Control | +|`MOD_LSFT`|Left Shift | +|`MOD_LALT`|Left Alt | +|`MOD_LGUI`|Left GUI (Windows/Command/Meta key) | +|`MOD_RCTL`|Right Control | +|`MOD_RSFT`|Right Shift | +|`MOD_RALT`|Right Alt | +|`MOD_RGUI`|Right GUI (Windows/Command/Meta key) | +|`MOD_HYPR`|Hyper (Left Control, Shift, Alt and GUI)| +|`MOD_MEH` |Meh (Left Control, Shift, and Alt) | + +You can combine these by ORing them together like so: + +```c +MT(MOD_LCTL | MOD_LSFT, KC_ESC) +``` + +This key would activate Left Control and Left Shift when held, and send Escape when tapped. + +For convenience, QMK includes some Mod-Tap shortcuts to make common combinations more compact in your keymap: + +|Key |Aliases |Description | +|------------|---------------------------------------|-------------------------------------------------------| +|`LCTL_T(kc)`|`CTL_T(kc)` |Left Control when held, `kc` when tapped | +|`RCTL_T(kc)`| |Right Control when held, `kc` when tapped | +|`LSFT_T(kc)`|`SFT_T(kc)` |Left Shift when held, `kc` when tapped | +|`RSFT_T(kc)`| |Right Shift when held, `kc` when tapped | +|`LALT_T(kc)`|`ALT_T(kc)` |Left Alt when held, `kc` when tapped | +|`RALT_T(kc)`|`ALGR_T(kc)` |Right Alt when held, `kc` when tapped | +|`LGUI_T(kc)`|`LCMD_T(kc)`, `RWIN_T(kc)`, `GUI_T(kc)`|Left GUI when held, `kc` when tapped | +|`RGUI_T(kc)`|`RCMD_T(kc)`, `RWIN_T(kc)` |Right GUI when held, `kc` when tapped | +|`C_S_T(kc)` | |Left Control and Shift when held, `kc` when tapped | +|`MEH_T(kc)` | |Left Control, Shift and Alt when held, `kc` when tapped| +|`LCAG_T(kc)`| |Left Control, Alt and GUI when held, `kc` when tapped | +|`RCAG_T(kc)`| |Right Control, Alt and GUI when held, `kc` when tapped | +|`ALL_T(kc)` | |Left Control, Shift, Alt and GUI when held, `kc` when tapped - more info [here](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)| +|`SGUI_T(kc)`|`SCMD_T(kc)`, `SWIN_T(kc)` |Left Shift and GUI when held, `kc` when tapped | +|`LCA_T(kc)` | |Left Control and Alt when held, `kc` when tapped | # One Shot Keys diff --git a/docs/feature_backlight.md b/docs/feature_backlight.md index 6140e6a0ab..8f883e08fb 100644 --- a/docs/feature_backlight.md +++ b/docs/feature_backlight.md @@ -51,3 +51,22 @@ In this way `OCRxx` essentially controls the duty cycle of the LEDs, and thus th The breathing effect is achieved by registering an interrupt handler for `TIMER1_OVF_vect` that is called whenever the counter resets, roughly 244 times per second. In this handler, the value of an incrementing counter is mapped onto a precomputed brightness curve. To turn off breathing, the interrupt handler is simply disabled, and the brightness reset to the level stored in EEPROM. + +## Backlight Functions + +|Function |Description | +|----------|----------------------------------------------------------| +|`backlight_toggle()` |Turn the backlight on or off | +|`backlight_step()` |Cycle through backlight levels | +|`backlight_increase()` |Increase the backlight level | +|`backlight_decrease()` |Decrease the backlight level | +|`backlight_level(x)` |Sets the backlight level to specified level | +|`get_backlight_level()`|Toggle backlight breathing | + +### Backlight Breathing Functions + +|Function |Description | +|----------|----------------------------------------------------------| +|`breathing_toggle()` |Turn the backlight breathing on or off | +|`breathing_enable()` |Turns on backlight breathing | +|`breathing_disable()` |Turns off backlight breathing | diff --git a/docs/feature_layouts.md b/docs/feature_layouts.md index bfae920440..1ee8b5e35c 100644 --- a/docs/feature_layouts.md +++ b/docs/feature_layouts.md @@ -53,6 +53,8 @@ but the `LAYOUT_` variable must be defined in `.h` as well. ## Tips for Making Layouts Keyboard-Agnostic +### Includes + Instead of using `#include "planck.h"`, you can use this line to include whatever `.h` (`.h` should not be included here) file that is being compiled: #include QMK_KEYBOARD_H @@ -72,3 +74,7 @@ For example: ``` Note that the names are lowercase and match the folder/file names for the keyboard/revision exactly. + +### Keymaps + +In order to support both split and non-split keyboards with the same layout, you need to use the keyboard agnostic `LAYOUT_` macro in your keymap. For instance, in order for a Let's Split and Planck to share the same layout file, you need to use `LAYOUT_ortho_4x12` instead of `LAYOUT_planck_grid` or just `{}` for a C array. diff --git a/docs/feature_rgb_matrix.md b/docs/feature_rgb_matrix.md index cb7aa666cf..4f827f8dc9 100644 --- a/docs/feature_rgb_matrix.md +++ b/docs/feature_rgb_matrix.md @@ -1,8 +1,12 @@ # RGB Matrix Lighting +## Driver configuration + +### IS31FL3731 + There is basic support for addressable RGB matrix lighting with the I2C IS31FL3731 RGB controller. To enable it, add this to your `rules.mk`: - RGB_MATRIX_ENABLE = yes + RGB_MATRIX_ENABLE = IS31FL3731 Configure the hardware via your `config.h`: @@ -36,7 +40,51 @@ Define these arrays listing all the LEDs in your `.c`: .... } -Where `Cx_y` is the location of the LED in the matrix defined by [the datasheet](http://www.issi.com/WW/pdf/31FL3731.pdf). The `driver` is the index of the driver you defined in your `config.h` (`0` or `1` right now). +Where `Cx_y` is the location of the LED in the matrix defined by [the datasheet](http://www.issi.com/WW/pdf/31FL3731.pdf) and the header file `drivers/issi/is31fl3731.h`. The `driver` is the index of the driver you defined in your `config.h` (`0` or `1` right now). + +### IS31FL3733 + +There is basic support for addressable RGB matrix lighting with the I2C IS31FL3733 RGB controller. To enable it, add this to your `rules.mk`: + + RGB_MATRIX_ENABLE = IS31FL3733 + +Configure the hardware via your `config.h`: + + // This is a 7-bit address, that gets left-shifted and bit 0 + // set to 0 for write, 1 for read (as per I2C protocol) + // The address will vary depending on your wiring: + // 00 <-> GND + // 01 <-> SCL + // 10 <-> SDA + // 11 <-> VCC + // ADDR1 represents A1:A0 of the 7-bit address. + // ADDR2 represents A3:A2 of the 7-bit address. + // The result is: 0b101(ADDR2)(ADDR1) + #define DRIVER_ADDR_1 0b1010000 + #define DRIVER_ADDR_2 0b1010000 // this is here for compliancy reasons. + + #define DRIVER_COUNT 1 + #define DRIVER_1_LED_TOTAL 64 + #define DRIVER_LED_TOTAL DRIVER_1_LED_TOTAL + +Currently only a single drivers is supported, but it would be trivial to support all 4 combinations. For now define `DRIVER_ADDR_2` as `DRIVER_ADDR_1` + +Define these arrays listing all the LEDs in your `.c`: + + const is31_led g_is31_leds[DRIVER_LED_TOTAL] = { + /* Refer to IS31 manual for these locations + * driver + * | R location + * | | G location + * | | | B location + * | | | | */ + {0, B_1, A_1, C_1}, + .... + } + +Where `X_Y` is the location of the LED in the matrix defined by [the datasheet](http://www.issi.com/WW/pdf/31FL3733.pdf) and the header file `drivers/issi/is31fl3733.h`. The `driver` is the index of the driver you defined in your `config.h` (Only `0` right now). + +From this point forward the configuration is the same for all the drivers. const rgb_led g_rgb_leds[DRIVER_LED_TOTAL] = { /* {row | col << 4} @@ -80,7 +128,7 @@ All RGB keycodes are currently shared with the RGBLIGHT system: These are the effects that are currently available: enum rgb_matrix_effects { - RGB_MATRIX_SOLID_COLOR = 1, + RGB_MATRIX_SOLID_COLOR = 1, RGB_MATRIX_ALPHAS_MODS, RGB_MATRIX_DUAL_BEACON, RGB_MATRIX_GRADIENT_UP_DOWN, @@ -93,7 +141,7 @@ These are the effects that are currently available: RGB_MATRIX_RAINBOW_MOVING_CHEVRON, RGB_MATRIX_JELLYBEAN_RAINDROPS, #ifdef RGB_MATRIX_KEYPRESSES - RGB_MATRIX_SOLID_REACTIVE, + RGB_MATRIX_SOLID_REACTIVE, RGB_MATRIX_SPLASH, RGB_MATRIX_MULTISPLASH, RGB_MATRIX_SOLID_SPLASH, @@ -107,7 +155,7 @@ These are the effects that are currently available: Custom layer effects can be done by defining this in your `.c`: void rgb_matrix_indicators_kb(void) { - // rgb_matrix_set_color(index, red, green, blue); + rgb_matrix_set_color(index, red, green, blue); } A similar function works in the keymap as `rgb_matrix_indicators_user`. diff --git a/docs/feature_rgblight.md b/docs/feature_rgblight.md index e0918d11bd..925dca724b 100644 --- a/docs/feature_rgblight.md +++ b/docs/feature_rgblight.md @@ -1,131 +1,46 @@ # RGB Lighting -If you've installed addressable RGB lights on your keyboard you can control them with QMK. Currently we support the following addressable LEDs on Atmel AVR processors: +QMK has the ability to control RGB LEDs attached to your keyboard. This is commonly called *underglow*, due to the LEDs often being mounted on the bottom of the keyboard, producing a nice diffused effect when combined with a translucent case. -* WS2811 and variants (WS2812, WS2812B, WS2812C, etc) -* SK6812RGBW - -Some keyboards come with RGB LEDs pre-installed. Others have to have LEDs installed after the fact. See below for information on modifying your keyboard. - -## Selecting Colors - -QMK uses Hue, Saturation, and Value to set color rather than using RGB. You can use the color wheel below to see how this works. Changing the Hue will cycle around the circle. Saturation will affect the intensity of the color, which you can see as you move from the inner part to the outer part of the wheel. Value sets the overall brightness. - -HSV Color Wheel - -If you would like to learn more about HSV you can start with the [Wikipedia article](https://en.wikipedia.org/wiki/HSL_and_HSV). +![Planck with RGB Underglow](https://raw.githubusercontent.com/qmk/qmk_firmware/3774a7fcdab5544fc787f4c200be05fcd417e31f/keyboards/planck/keymaps/yang/planck-with-rgb-underglow.jpg) -## Configuration +Some keyboards come with RGB LEDs preinstalled. Others must have them installed after the fact. See the [Hardware Modification](#hardware-modification) section for information on adding RGB lighting to your keyboard. -Before RGB Lighting can be used you have to enable it in `rules.mk`: +Currently QMK supports the following addressable LEDs on AVR microcontrollers (however, the white LED in RGBW variants is not supported): - RGBLIGHT_ENABLE = yes + * WS2811, WS2812, WS2812B, WS2812C, etc. + * SK6812, SK6812MINI, SK6805 -You can configure the behavior of the RGB lighting by defining values inside `config.h`. +These LEDs are called "addressable" because instead of using a wire per color, each LED contains a small microchip that understands a special protocol sent over a single wire. The chip passes on the remaining data to the next LED, allowing them to be chained together. In this way, you can easily control the color of the individual LEDs. -### Required Configuration +## Usage -At minimum you have to define the pin your LED strip is connected to and the number of LEDs connected. +On keyboards with onboard RGB LEDs, it is usually enabled by default. If it is not working for you, check that your `rules.mk` includes the following: -```c -#define RGB_DI_PIN D7 // The pin the LED strip is connected to -#define RGBLED_NUM 14 // Number of LEDs in your strip +```make +RGBLIGHT_ENABLE = yes ``` -### Optional Configuration - -You can change the behavior of the RGB Lighting by setting these configuration values. Use `#define